From dd6a75670c9fac2d6f1ee92e488309397290e3cb Mon Sep 17 00:00:00 2001 From: Brett Spaulding Date: Sun, 4 Aug 2024 15:10:07 -0400 Subject: [PATCH] [WIP] Start the total refactor --- .gitignore | 11 +- database/album.json | 5 - docker-compose.yml | 126 +- .../01dc1df46675b3a4cc4149dfff3a2bad485d141e | Bin 174213 -> 0 bytes .../02610867f561bbd07db3f2393e4bce269c12a7db | Bin 39232 -> 0 bytes .../0d9321a102d93f4288e4e8da225feff516afb35f | Bin 17953 -> 0 bytes .../167b5bdae701ba598f2a1e0862596f9bd570a914 | Bin 39232 -> 0 bytes .../1a15fc1e2e17a098e09e94664a0f1bdde3182994 | Bin 16237 -> 0 bytes .../1d1525455687037b510e9c58c6aac1aec3a01bb9 | Bin 39232 -> 0 bytes .../2103bf6ec1f2008c8a43a60cff2968cd4e067cb7 | Bin 39232 -> 0 bytes .../215516c5761dae0017f7ffe74d08fd09ab14cd7e | Bin 19976 -> 0 bytes .../2f8366f1a3158fda017099693211fe24730ec5f4 | Bin 23182 -> 0 bytes .../43cfc7d35115bc141f5cbaffdf95600136b78f0a | Bin 15092 -> 0 bytes .../4a330de9b563091132d58918ba898576dac97583 | Bin 185796 -> 0 bytes .../52710b6543b5e778467426e38dd117843da128d8 | Bin 17953 -> 0 bytes .../5f1e942acb89b3456ab644ce17150d71800f8139 | Bin 39232 -> 0 bytes .../60feabfb3ad5b0a71eaff6b364aacd17f3510295 | Bin 39232 -> 0 bytes .../689e94d05db5d6dd42acd6e667870927d8387d78 | Bin 197228 -> 0 bytes .../6a4663184a296bd9902cd68e08e138db6c280dc4 | Bin 39232 -> 0 bytes .../738e414f3ee2cc537b7ca8bfa6e95757065adc63 | Bin 15092 -> 0 bytes .../75e0eb2d3c3d10e88e04ddd9011d3d104cfd1be7 | Bin 170641 -> 0 bytes .../805161f6790c00faffaf61a522492d0de18ed62c | Bin 45166 -> 0 bytes .../8241ab6f33f4e74fb99efb813f6767519a31cc40 | Bin 174213 -> 0 bytes .../87f94b422331baa1d81e0d277b699ad46cf11187 | Bin 23182 -> 0 bytes .../88c7004eded52ac85da6e662bef03244701bde06 | Bin 39232 -> 0 bytes .../952f4586139ba03d8a59f932964e4362ece6a481 | Bin 39232 -> 0 bytes .../9995206040bbb762c38a79be73cb06fe00ce1cf1 | Bin 39232 -> 0 bytes .../9b15c7269d5b068386dab8cf8ad34c50930fee8b | Bin 11512 -> 0 bytes .../9e9a48cc36949efbec7067be051c93d88b8eee51 | Bin 25778 -> 0 bytes .../b16257a8253cb16c1a30a54acee4e0394d8a60be | Bin 16237 -> 0 bytes .../b9c8abd62d15bac48b738e9cd98bcc4c847bd90f | Bin 25778 -> 0 bytes .../c9ca1e99a28e93e9b5f952430017c833ebbca732 | Bin 16757 -> 0 bytes .../ce5ec4ddaa6f903a901ac6d5b2d8421f5b3457bf | Bin 26153 -> 0 bytes .../cf8bd7a4a7d89237642713e87c96e9e0b510552f | Bin 19976 -> 0 bytes .../d17d22b6ccf5639901cdec7323faa049771cab6a | Bin 16114 -> 0 bytes .../d3d51bac720faefa0d4d005287aefcbbecc70352 | Bin 45166 -> 0 bytes .../d44fd9cd59e53482be9cb5c9dee952669bec2d07 | Bin 197228 -> 0 bytes .../d5c3d9464ccb4f69981bd652b4386355ea887969 | Bin 170641 -> 0 bytes .../db60bf5ca1bcd80704c3b358da175e24a9501cb4 | Bin 16114 -> 0 bytes .../e7288cdadb7fe821f89e96399cc180e222525161 | Bin 26153 -> 0 bytes .../f180b48373bcafa1deff21859159692d83025431 | Bin 185796 -> 0 bytes .../f985ed095bf95de987c9138ea012ce4d0d9f5481 | Bin 16757 -> 0 bytes .../fd26b9a68e5b68c1c302bc6622c560dedd6a27c4 | Bin 11512 -> 0 bytes navidrome/navidrome.db | Bin 10895360 -> 0 bytes nginx/conf/default.conf | 20 + nginx/dockerfiles/nginx.dockerfile | 18 + php/dockerfiles/php.dockerfile | 34 + php/dockerfiles/php.root.dockerfile | 22 + python/.gitignore | 10 + __init__.py => python/__init__.py | 0 app.py => python/app.py | 3 - python/bin/Activate.ps1 | 247 + python/bin/activate | 69 + python/bin/activate.csh | 26 + python/bin/activate.fish | 69 + python/bin/flask | 8 + python/bin/mid3cp | 8 + python/bin/mid3iconv | 8 + python/bin/mid3v2 | 8 + python/bin/moggsplit | 8 + python/bin/mutagen-inspect | 8 + python/bin/mutagen-pony | 8 + python/bin/normalizer | 8 + python/bin/pip | 8 + python/bin/pip3 | 8 + python/bin/pip3.10 | 8 + python/bin/pysondb | 8 + python/bin/python | 1 + python/bin/python3 | 1 + python/bin/python3.10 | 1 + python/bin/tldextract | 8 + python/bin/yt-dlp | 8 + const.py => python/const.py | 0 database.py => python/database.py | 0 python/database/album.json | 12 + Dockerfile => python/dockerfiles/Dockerfile | 20 +- .../drivers}/geckodriver-0.33.0/.cargo/config | 0 .../drivers}/geckodriver-0.33.0/CHANGES.md | 0 .../geckodriver-0.33.0/CONTRIBUTING.md | 0 .../drivers}/geckodriver-0.33.0/Cargo.lock | 0 .../drivers}/geckodriver-0.33.0/Cargo.toml | 0 .../geckodriver-0.33.0/ISSUE_TEMPLATE.md | 0 .../drivers}/geckodriver-0.33.0/LICENSE | 0 .../drivers}/geckodriver-0.33.0/README.md | 0 .../drivers}/geckodriver-0.33.0/build.rs | 0 .../dist/geckodriver-v0.33.0-linux32.tar.gz | Bin .../dist/geckodriver-v0.33.0-linux64.tar.gz | Bin .../dist/geckodriver-v0.33.0-macos.tar.gz | Bin .../dist/geckodriver-v0.33.0-win32.zip | Bin .../geckodriver-0.33.0/dist/geckodriver.exe | Bin .../drivers}/geckodriver-0.33.0/doc/ARM.md | 0 .../drivers}/geckodriver-0.33.0/doc/Bugs.md | 0 .../geckodriver-0.33.0/doc/Building.md | 0 .../geckodriver-0.33.0/doc/Capabilities.md | 0 .../geckodriver-0.33.0/doc/CrashReports.md | 0 .../drivers}/geckodriver-0.33.0/doc/Flags.md | 0 .../geckodriver-0.33.0/doc/Notarization.md | 0 .../geckodriver-0.33.0/doc/Patches.md | 0 .../geckodriver-0.33.0/doc/Profiles.md | 0 .../geckodriver-0.33.0/doc/Releasing.md | 0 .../geckodriver-0.33.0/doc/Support.md | 0 .../geckodriver-0.33.0/doc/Testing.md | 0 .../geckodriver-0.33.0/doc/TraceLogs.md | 0 .../drivers}/geckodriver-0.33.0/doc/Usage.md | 0 .../drivers}/geckodriver-0.33.0/doc/index.rst | 0 .../geckodriver-0.33.0/marionette/Cargo.toml | 0 .../marionette/src/common.rs | 0 .../marionette/src/error.rs | 0 .../geckodriver-0.33.0/marionette/src/lib.rs | 0 .../marionette/src/marionette.rs | 0 .../marionette/src/message.rs | 0 .../marionette/src/result.rs | 0 .../geckodriver-0.33.0/marionette/src/test.rs | 0 .../marionette/src/webdriver.rs | 0 .../geckodriver-0.33.0/src/android.rs | 0 .../geckodriver-0.33.0/src/browser.rs | 0 .../drivers}/geckodriver-0.33.0/src/build.rs | 0 .../geckodriver-0.33.0/src/capabilities.rs | 0 .../geckodriver-0.33.0/src/command.rs | 0 .../geckodriver-0.33.0/src/logging.rs | 0 .../drivers}/geckodriver-0.33.0/src/main.rs | 0 .../geckodriver-0.33.0/src/marionette.rs | 0 .../drivers}/geckodriver-0.33.0/src/prefs.rs | 0 .../drivers}/geckodriver-0.33.0/src/test.rs | 0 .../geckodriver-0.33.0/src/tests/profile.zip | Bin .../geckodriver-install.sh | 0 .../APScheduler-3.10.1.dist-info/INSTALLER | 0 .../APScheduler-3.10.1.dist-info/LICENSE.txt | 0 .../APScheduler-3.10.1.dist-info/METADATA | 0 .../APScheduler-3.10.1.dist-info/RECORD | 84 + .../APScheduler-3.10.1.dist-info/REQUESTED | 0 .../APScheduler-3.10.1.dist-info/WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 .../Brotli-1.0.9.dist-info/INSTALLER | 0 .../Brotli-1.0.9.dist-info/LICENSE | 0 .../Brotli-1.0.9.dist-info/METADATA | 37 + .../Brotli-1.0.9.dist-info/RECORD | 10 + .../Brotli-1.0.9.dist-info/REQUESTED | 0 .../Brotli-1.0.9.dist-info/WHEEL | 8 + .../Brotli-1.0.9.dist-info/top_level.txt | 0 .../site-packages/Cryptodome/Cipher/AES.py | 0 .../site-packages/Cryptodome/Cipher/AES.pyi | 0 .../site-packages/Cryptodome/Cipher/ARC2.py | 0 .../site-packages/Cryptodome/Cipher/ARC2.pyi | 0 .../site-packages/Cryptodome/Cipher/ARC4.py | 0 .../site-packages/Cryptodome/Cipher/ARC4.pyi | 0 .../Cryptodome/Cipher/Blowfish.py | 0 .../Cryptodome/Cipher/Blowfish.pyi | 0 .../site-packages/Cryptodome/Cipher/CAST.py | 0 .../site-packages/Cryptodome/Cipher/CAST.pyi | 0 .../Cryptodome/Cipher/ChaCha20.py | 0 .../Cryptodome/Cipher/ChaCha20.pyi | 0 .../Cryptodome/Cipher/ChaCha20_Poly1305.py | 0 .../Cryptodome/Cipher/ChaCha20_Poly1305.pyi | 0 .../site-packages/Cryptodome/Cipher/DES.py | 0 .../site-packages/Cryptodome/Cipher/DES.pyi | 0 .../site-packages/Cryptodome/Cipher/DES3.py | 0 .../site-packages/Cryptodome/Cipher/DES3.pyi | 0 .../Cryptodome/Cipher/PKCS1_OAEP.py | 0 .../Cryptodome/Cipher/PKCS1_OAEP.pyi | 0 .../Cryptodome/Cipher/PKCS1_v1_5.py | 0 .../Cryptodome/Cipher/PKCS1_v1_5.pyi | 0 .../Cryptodome/Cipher/Salsa20.py | 0 .../Cryptodome/Cipher/Salsa20.pyi | 0 .../Cryptodome/Cipher/_ARC4.abi3.so | Bin .../Cryptodome/Cipher/_EKSBlowfish.py | 0 .../Cryptodome/Cipher/_EKSBlowfish.pyi | 0 .../Cryptodome/Cipher/_Salsa20.abi3.so | Bin .../Cryptodome/Cipher/__init__.py | 0 .../Cryptodome/Cipher/__init__.pyi | 0 .../Cryptodome/Cipher/_chacha20.abi3.so | Bin .../Cryptodome/Cipher/_mode_cbc.py | 0 .../Cryptodome/Cipher/_mode_cbc.pyi | 0 .../Cryptodome/Cipher/_mode_ccm.py | 0 .../Cryptodome/Cipher/_mode_ccm.pyi | 0 .../Cryptodome/Cipher/_mode_cfb.py | 0 .../Cryptodome/Cipher/_mode_cfb.pyi | 0 .../Cryptodome/Cipher/_mode_ctr.py | 0 .../Cryptodome/Cipher/_mode_ctr.pyi | 0 .../Cryptodome/Cipher/_mode_eax.py | 0 .../Cryptodome/Cipher/_mode_eax.pyi | 0 .../Cryptodome/Cipher/_mode_ecb.py | 0 .../Cryptodome/Cipher/_mode_ecb.pyi | 0 .../Cryptodome/Cipher/_mode_gcm.py | 0 .../Cryptodome/Cipher/_mode_gcm.pyi | 0 .../Cryptodome/Cipher/_mode_ocb.py | 0 .../Cryptodome/Cipher/_mode_ocb.pyi | 0 .../Cryptodome/Cipher/_mode_ofb.py | 0 .../Cryptodome/Cipher/_mode_ofb.pyi | 0 .../Cryptodome/Cipher/_mode_openpgp.py | 0 .../Cryptodome/Cipher/_mode_openpgp.pyi | 0 .../Cryptodome/Cipher/_mode_siv.py | 0 .../Cryptodome/Cipher/_mode_siv.pyi | 0 .../Cryptodome/Cipher/_pkcs1_decode.abi3.so | Bin .../Cryptodome/Cipher/_raw_aes.abi3.so | Bin .../Cryptodome/Cipher/_raw_aesni.abi3.so | Bin .../Cryptodome/Cipher/_raw_arc2.abi3.so | Bin .../Cryptodome/Cipher/_raw_blowfish.abi3.so | Bin .../Cryptodome/Cipher/_raw_cast.abi3.so | Bin .../Cryptodome/Cipher/_raw_cbc.abi3.so | Bin .../Cryptodome/Cipher/_raw_cfb.abi3.so | Bin .../Cryptodome/Cipher/_raw_ctr.abi3.so | Bin .../Cryptodome/Cipher/_raw_des.abi3.so | Bin .../Cryptodome/Cipher/_raw_des3.abi3.so | Bin .../Cryptodome/Cipher/_raw_ecb.abi3.so | Bin .../Cipher/_raw_eksblowfish.abi3.so | Bin .../Cryptodome/Cipher/_raw_ocb.abi3.so | Bin .../Cryptodome/Cipher/_raw_ofb.abi3.so | Bin .../site-packages/Cryptodome/Hash/BLAKE2b.py | 0 .../site-packages/Cryptodome/Hash/BLAKE2b.pyi | 0 .../site-packages/Cryptodome/Hash/BLAKE2s.py | 0 .../site-packages/Cryptodome/Hash/BLAKE2s.pyi | 0 .../site-packages/Cryptodome/Hash/CMAC.py | 0 .../site-packages/Cryptodome/Hash/CMAC.pyi | 0 .../site-packages/Cryptodome/Hash/HMAC.py | 0 .../site-packages/Cryptodome/Hash/HMAC.pyi | 0 .../site-packages/Cryptodome/Hash/KMAC128.py | 0 .../site-packages/Cryptodome/Hash/KMAC128.pyi | 0 .../site-packages/Cryptodome/Hash/KMAC256.py | 0 .../site-packages/Cryptodome/Hash/KMAC256.pyi | 0 .../Cryptodome/Hash/KangarooTwelve.py | 0 .../Cryptodome/Hash/KangarooTwelve.pyi | 0 .../site-packages/Cryptodome/Hash/MD2.py | 0 .../site-packages/Cryptodome/Hash/MD2.pyi | 0 .../site-packages/Cryptodome/Hash/MD4.py | 0 .../site-packages/Cryptodome/Hash/MD4.pyi | 0 .../site-packages/Cryptodome/Hash/MD5.py | 0 .../site-packages/Cryptodome/Hash/MD5.pyi | 0 .../site-packages/Cryptodome/Hash/Poly1305.py | 0 .../Cryptodome/Hash/Poly1305.pyi | 0 .../site-packages/Cryptodome/Hash/RIPEMD.py | 0 .../site-packages/Cryptodome/Hash/RIPEMD.pyi | 0 .../Cryptodome/Hash/RIPEMD160.py | 0 .../Cryptodome/Hash/RIPEMD160.pyi | 0 .../site-packages/Cryptodome/Hash/SHA.py | 0 .../site-packages/Cryptodome/Hash/SHA.pyi | 0 .../site-packages/Cryptodome/Hash/SHA1.py | 0 .../site-packages/Cryptodome/Hash/SHA1.pyi | 0 .../site-packages/Cryptodome/Hash/SHA224.py | 0 .../site-packages/Cryptodome/Hash/SHA224.pyi | 0 .../site-packages/Cryptodome/Hash/SHA256.py | 0 .../site-packages/Cryptodome/Hash/SHA256.pyi | 0 .../site-packages/Cryptodome/Hash/SHA384.py | 0 .../site-packages/Cryptodome/Hash/SHA384.pyi | 0 .../site-packages/Cryptodome/Hash/SHA3_224.py | 0 .../Cryptodome/Hash/SHA3_224.pyi | 0 .../site-packages/Cryptodome/Hash/SHA3_256.py | 0 .../Cryptodome/Hash/SHA3_256.pyi | 0 .../site-packages/Cryptodome/Hash/SHA3_384.py | 0 .../Cryptodome/Hash/SHA3_384.pyi | 0 .../site-packages/Cryptodome/Hash/SHA3_512.py | 0 .../Cryptodome/Hash/SHA3_512.pyi | 0 .../site-packages/Cryptodome/Hash/SHA512.py | 0 .../site-packages/Cryptodome/Hash/SHA512.pyi | 0 .../site-packages/Cryptodome/Hash/SHAKE128.py | 0 .../Cryptodome/Hash/SHAKE128.pyi | 0 .../site-packages/Cryptodome/Hash/SHAKE256.py | 0 .../Cryptodome/Hash/SHAKE256.pyi | 0 .../Cryptodome/Hash/TupleHash128.py | 0 .../Cryptodome/Hash/TupleHash128.pyi | 0 .../Cryptodome/Hash/TupleHash256.py | 0 .../Cryptodome/Hash/TupleHash256.pyi | 0 .../Cryptodome/Hash/_BLAKE2b.abi3.so | Bin .../Cryptodome/Hash/_BLAKE2s.abi3.so | Bin .../Cryptodome/Hash/_MD2.abi3.so | Bin .../Cryptodome/Hash/_MD4.abi3.so | Bin .../Cryptodome/Hash/_MD5.abi3.so | Bin .../Cryptodome/Hash/_RIPEMD160.abi3.so | Bin .../Cryptodome/Hash/_SHA1.abi3.so | Bin .../Cryptodome/Hash/_SHA224.abi3.so | Bin .../Cryptodome/Hash/_SHA256.abi3.so | Bin .../Cryptodome/Hash/_SHA384.abi3.so | Bin .../Cryptodome/Hash/_SHA512.abi3.so | Bin .../site-packages/Cryptodome/Hash/__init__.py | 0 .../Cryptodome/Hash/__init__.pyi | 0 .../Cryptodome/Hash/_ghash_clmul.abi3.so | Bin .../Cryptodome/Hash/_ghash_portable.abi3.so | Bin .../Cryptodome/Hash/_keccak.abi3.so | Bin .../Cryptodome/Hash/_poly1305.abi3.so | Bin .../Cryptodome/Hash/cSHAKE128.py | 0 .../Cryptodome/Hash/cSHAKE128.pyi | 0 .../Cryptodome/Hash/cSHAKE256.py | 0 .../Cryptodome/Hash/cSHAKE256.pyi | 0 .../site-packages/Cryptodome/Hash/keccak.py | 0 .../site-packages/Cryptodome/Hash/keccak.pyi | 0 .../site-packages/Cryptodome/IO/PEM.py | 0 .../site-packages/Cryptodome/IO/PEM.pyi | 0 .../site-packages/Cryptodome/IO/PKCS8.py | 0 .../site-packages/Cryptodome/IO/PKCS8.pyi | 0 .../site-packages/Cryptodome/IO/_PBES.py | 0 .../site-packages/Cryptodome/IO/_PBES.pyi | 0 .../site-packages/Cryptodome/IO/__init__.py | 0 .../site-packages/Cryptodome/Math/Numbers.py | 0 .../site-packages/Cryptodome/Math/Numbers.pyi | 0 .../Cryptodome/Math/Primality.py | 0 .../Cryptodome/Math/Primality.pyi | 0 .../Cryptodome/Math/_IntegerBase.py | 0 .../Cryptodome/Math/_IntegerBase.pyi | 0 .../Cryptodome/Math/_IntegerCustom.py | 0 .../Cryptodome/Math/_IntegerCustom.pyi | 0 .../Cryptodome/Math/_IntegerGMP.py | 0 .../Cryptodome/Math/_IntegerGMP.pyi | 0 .../Cryptodome/Math/_IntegerNative.py | 0 .../Cryptodome/Math/_IntegerNative.pyi | 0 .../site-packages/Cryptodome/Math/__init__.py | 0 .../Cryptodome/Math/_modexp.abi3.so | Bin .../site-packages/Cryptodome/Protocol/KDF.py | 0 .../site-packages/Cryptodome/Protocol/KDF.pyi | 0 .../Cryptodome/Protocol/SecretSharing.py | 0 .../Cryptodome/Protocol/SecretSharing.pyi | 0 .../Cryptodome/Protocol/__init__.py | 0 .../Cryptodome/Protocol/__init__.pyi | 0 .../Cryptodome/Protocol/_scrypt.abi3.so | Bin .../site-packages/Cryptodome/PublicKey/DSA.py | 0 .../Cryptodome/PublicKey/DSA.pyi | 0 .../site-packages/Cryptodome/PublicKey/ECC.py | 0 .../Cryptodome/PublicKey/ECC.pyi | 0 .../Cryptodome/PublicKey/ElGamal.py | 0 .../Cryptodome/PublicKey/ElGamal.pyi | 0 .../site-packages/Cryptodome/PublicKey/RSA.py | 0 .../Cryptodome/PublicKey/RSA.pyi | 0 .../Cryptodome/PublicKey/__init__.py | 0 .../Cryptodome/PublicKey/__init__.pyi | 0 .../Cryptodome/PublicKey/_ec_ws.abi3.so | Bin .../Cryptodome/PublicKey/_ed25519.abi3.so | Bin .../Cryptodome/PublicKey/_ed448.abi3.so | Bin .../Cryptodome/PublicKey/_openssh.py | 0 .../Cryptodome/PublicKey/_openssh.pyi | 0 .../Cryptodome/PublicKey/_x25519.abi3.so | Bin .../Cryptodome/Random/__init__.py | 0 .../Cryptodome/Random/__init__.pyi | 0 .../site-packages/Cryptodome/Random/random.py | 0 .../Cryptodome/Random/random.pyi | 0 .../Cryptodome/SelfTest/Cipher/__init__.py | 0 .../Cryptodome/SelfTest/Cipher/common.py | 0 .../Cryptodome/SelfTest/Cipher/test_AES.py | 0 .../Cryptodome/SelfTest/Cipher/test_ARC2.py | 0 .../Cryptodome/SelfTest/Cipher/test_ARC4.py | 0 .../SelfTest/Cipher/test_Blowfish.py | 0 .../Cryptodome/SelfTest/Cipher/test_CAST.py | 0 .../Cryptodome/SelfTest/Cipher/test_CBC.py | 0 .../Cryptodome/SelfTest/Cipher/test_CCM.py | 0 .../Cryptodome/SelfTest/Cipher/test_CFB.py | 0 .../Cryptodome/SelfTest/Cipher/test_CTR.py | 0 .../SelfTest/Cipher/test_ChaCha20.py | 0 .../SelfTest/Cipher/test_ChaCha20_Poly1305.py | 0 .../Cryptodome/SelfTest/Cipher/test_DES.py | 0 .../Cryptodome/SelfTest/Cipher/test_DES3.py | 0 .../Cryptodome/SelfTest/Cipher/test_EAX.py | 0 .../Cryptodome/SelfTest/Cipher/test_GCM.py | 0 .../Cryptodome/SelfTest/Cipher/test_OCB.py | 0 .../Cryptodome/SelfTest/Cipher/test_OFB.py | 0 .../SelfTest/Cipher/test_OpenPGP.py | 0 .../Cryptodome/SelfTest/Cipher/test_SIV.py | 0 .../SelfTest/Cipher/test_Salsa20.py | 0 .../SelfTest/Cipher/test_pkcs1_15.py | 0 .../SelfTest/Cipher/test_pkcs1_oaep.py | 0 .../Cryptodome/SelfTest/Hash/__init__.py | 0 .../Cryptodome/SelfTest/Hash/common.py | 0 .../Cryptodome/SelfTest/Hash/test_BLAKE2.py | 0 .../Cryptodome/SelfTest/Hash/test_CMAC.py | 0 .../Cryptodome/SelfTest/Hash/test_HMAC.py | 0 .../Cryptodome/SelfTest/Hash/test_KMAC.py | 0 .../SelfTest/Hash/test_KangarooTwelve.py | 0 .../Cryptodome/SelfTest/Hash/test_MD2.py | 0 .../Cryptodome/SelfTest/Hash/test_MD4.py | 0 .../Cryptodome/SelfTest/Hash/test_MD5.py | 0 .../Cryptodome/SelfTest/Hash/test_Poly1305.py | 0 .../SelfTest/Hash/test_RIPEMD160.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA1.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA224.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA256.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA384.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA3_224.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA3_256.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA3_384.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA3_512.py | 0 .../Cryptodome/SelfTest/Hash/test_SHA512.py | 0 .../Cryptodome/SelfTest/Hash/test_SHAKE.py | 0 .../SelfTest/Hash/test_TupleHash.py | 0 .../Cryptodome/SelfTest/Hash/test_cSHAKE.py | 0 .../Cryptodome/SelfTest/Hash/test_keccak.py | 0 .../Cryptodome/SelfTest/IO/__init__.py | 0 .../Cryptodome/SelfTest/IO/test_PBES.py | 0 .../Cryptodome/SelfTest/IO/test_PKCS8.py | 0 .../Cryptodome/SelfTest/Math/__init__.py | 0 .../Cryptodome/SelfTest/Math/test_Numbers.py | 0 .../SelfTest/Math/test_Primality.py | 0 .../Cryptodome/SelfTest/Math/test_modexp.py | 0 .../Cryptodome/SelfTest/Protocol/__init__.py | 0 .../Cryptodome/SelfTest/Protocol/test_KDF.py | 0 .../SelfTest/Protocol/test_SecretSharing.py | 0 .../SelfTest/Protocol/test_rfc1751.py | 0 .../Cryptodome/SelfTest/PublicKey/__init__.py | 0 .../Cryptodome/SelfTest/PublicKey/test_DSA.py | 0 .../SelfTest/PublicKey/test_ECC_25519.py | 0 .../SelfTest/PublicKey/test_ECC_448.py | 0 .../SelfTest/PublicKey/test_ECC_NIST.py | 0 .../SelfTest/PublicKey/test_ElGamal.py | 0 .../Cryptodome/SelfTest/PublicKey/test_RSA.py | 0 .../SelfTest/PublicKey/test_import_DSA.py | 0 .../SelfTest/PublicKey/test_import_ECC.py | 0 .../SelfTest/PublicKey/test_import_RSA.py | 0 .../Cryptodome/SelfTest/Random/__init__.py | 0 .../Cryptodome/SelfTest/Random/test_random.py | 0 .../Cryptodome/SelfTest/Signature/__init__.py | 0 .../Cryptodome/SelfTest/Signature/test_dss.py | 0 .../SelfTest/Signature/test_eddsa.py | 0 .../SelfTest/Signature/test_pkcs1_15.py | 0 .../Cryptodome/SelfTest/Signature/test_pss.py | 0 .../Cryptodome/SelfTest/Util/__init__.py | 0 .../Cryptodome/SelfTest/Util/test_Counter.py | 0 .../Cryptodome/SelfTest/Util/test_Padding.py | 0 .../Cryptodome/SelfTest/Util/test_asn1.py | 0 .../Cryptodome/SelfTest/Util/test_number.py | 0 .../Cryptodome/SelfTest/Util/test_rfc1751.py | 0 .../Cryptodome/SelfTest/Util/test_strxor.py | 0 .../Cryptodome/SelfTest/__init__.py | 0 .../Cryptodome/SelfTest/__main__.py | 0 .../Cryptodome/SelfTest/loader.py | 0 .../Cryptodome/SelfTest/st_common.py | 0 .../site-packages/Cryptodome/Signature/DSS.py | 0 .../Cryptodome/Signature/DSS.pyi | 0 .../Cryptodome/Signature/PKCS1_PSS.py | 0 .../Cryptodome/Signature/PKCS1_PSS.pyi | 0 .../Cryptodome/Signature/PKCS1_v1_5.py | 0 .../Cryptodome/Signature/PKCS1_v1_5.pyi | 0 .../Cryptodome/Signature/__init__.py | 0 .../Cryptodome/Signature/eddsa.py | 0 .../Cryptodome/Signature/eddsa.pyi | 0 .../Cryptodome/Signature/pkcs1_15.py | 0 .../Cryptodome/Signature/pkcs1_15.pyi | 0 .../site-packages/Cryptodome/Signature/pss.py | 0 .../Cryptodome/Signature/pss.pyi | 0 .../site-packages/Cryptodome/Util/Counter.py | 0 .../site-packages/Cryptodome/Util/Counter.pyi | 0 .../site-packages/Cryptodome/Util/Padding.py | 0 .../site-packages/Cryptodome/Util/Padding.pyi | 0 .../site-packages/Cryptodome/Util/RFC1751.py | 0 .../site-packages/Cryptodome/Util/RFC1751.pyi | 0 .../site-packages/Cryptodome/Util/__init__.py | 0 .../Cryptodome/Util/_cpu_features.py | 0 .../Cryptodome/Util/_cpu_features.pyi | 0 .../Cryptodome/Util/_cpuid_c.abi3.so | Bin .../Cryptodome/Util/_file_system.py | 0 .../Cryptodome/Util/_file_system.pyi | 0 .../site-packages/Cryptodome/Util/_raw_api.py | 0 .../Cryptodome/Util/_raw_api.pyi | 0 .../Cryptodome/Util/_strxor.abi3.so | Bin .../site-packages/Cryptodome/Util/asn1.py | 0 .../site-packages/Cryptodome/Util/asn1.pyi | 0 .../site-packages/Cryptodome/Util/number.py | 0 .../site-packages/Cryptodome/Util/number.pyi | 0 .../Cryptodome/Util/py3compat.py | 0 .../Cryptodome/Util/py3compat.pyi | 0 .../site-packages/Cryptodome/Util/strxor.py | 0 .../site-packages/Cryptodome/Util/strxor.pyi | 0 .../site-packages/Cryptodome/__init__.py | 0 .../site-packages/Cryptodome/__init__.pyi | 0 .../site-packages/Cryptodome/py.typed | 0 .../Flask-2.2.5.dist-info/INSTALLER | 0 .../Flask-2.2.5.dist-info/LICENSE.rst | 0 .../Flask-2.2.5.dist-info/METADATA | 0 .../Flask-2.2.5.dist-info/RECORD | 54 + .../Flask-2.2.5.dist-info/REQUESTED | 0 .../site-packages/Flask-2.2.5.dist-info/WHEEL | 0 .../Flask-2.2.5.dist-info/entry_points.txt | 0 .../Flask-2.2.5.dist-info/top_level.txt | 0 .../Jinja2-3.1.2.dist-info/INSTALLER | 0 .../Jinja2-3.1.2.dist-info/LICENSE.rst | 0 .../Jinja2-3.1.2.dist-info/METADATA | 0 .../Jinja2-3.1.2.dist-info/RECORD | 59 + .../Jinja2-3.1.2.dist-info/REQUESTED | 0 .../Jinja2-3.1.2.dist-info/WHEEL | 0 .../Jinja2-3.1.2.dist-info/entry_points.txt | 0 .../Jinja2-3.1.2.dist-info/top_level.txt | 0 .../MarkupSafe-2.1.3.dist-info/INSTALLER | 0 .../MarkupSafe-2.1.3.dist-info/LICENSE.rst | 0 .../MarkupSafe-2.1.3.dist-info/METADATA | 0 .../MarkupSafe-2.1.3.dist-info/RECORD | 15 + .../MarkupSafe-2.1.3.dist-info/REQUESTED | 0 .../MarkupSafe-2.1.3.dist-info/WHEEL | 6 + .../MarkupSafe-2.1.3.dist-info/top_level.txt | 0 .../Werkzeug-2.2.3.dist-info/INSTALLER | 0 .../Werkzeug-2.2.3.dist-info/LICENSE.rst | 0 .../Werkzeug-2.2.3.dist-info/METADATA | 0 .../Werkzeug-2.2.3.dist-info/RECORD | 99 + .../Werkzeug-2.2.3.dist-info/REQUESTED | 0 .../Werkzeug-2.2.3.dist-info/WHEEL | 0 .../Werkzeug-2.2.3.dist-info/top_level.txt | 0 .../_brotli.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 6726712 bytes .../site-packages/_distutils_hack/__init__.py | 132 + .../site-packages/_distutils_hack/override.py | 0 .../site-packages/apscheduler/__init__.py | 0 .../site-packages/apscheduler/events.py | 0 .../apscheduler/executors/__init__.py | 0 .../apscheduler/executors/asyncio.py | 0 .../apscheduler/executors/base.py | 0 .../apscheduler/executors/base_py3.py | 0 .../apscheduler/executors/debug.py | 0 .../apscheduler/executors/gevent.py | 0 .../apscheduler/executors/pool.py | 0 .../apscheduler/executors/tornado.py | 0 .../apscheduler/executors/twisted.py | 0 .../site-packages/apscheduler/job.py | 0 .../apscheduler/jobstores/__init__.py | 0 .../apscheduler/jobstores/base.py | 0 .../apscheduler/jobstores/memory.py | 0 .../apscheduler/jobstores/mongodb.py | 0 .../apscheduler/jobstores/redis.py | 0 .../apscheduler/jobstores/rethinkdb.py | 0 .../apscheduler/jobstores/sqlalchemy.py | 0 .../apscheduler/jobstores/zookeeper.py | 0 .../apscheduler/schedulers/__init__.py | 0 .../apscheduler/schedulers/asyncio.py | 0 .../apscheduler/schedulers/background.py | 0 .../apscheduler/schedulers/base.py | 0 .../apscheduler/schedulers/blocking.py | 0 .../apscheduler/schedulers/gevent.py | 0 .../apscheduler/schedulers/qt.py | 0 .../apscheduler/schedulers/tornado.py | 0 .../apscheduler/schedulers/twisted.py | 0 .../apscheduler/triggers/__init__.py | 0 .../apscheduler/triggers/base.py | 0 .../apscheduler/triggers/combining.py | 0 .../apscheduler/triggers/cron/__init__.py | 0 .../apscheduler/triggers/cron/expressions.py | 0 .../apscheduler/triggers/cron/fields.py | 0 .../apscheduler/triggers/date.py | 0 .../apscheduler/triggers/interval.py | 0 .../site-packages/apscheduler/util.py | 0 .../async_timeout-4.0.2.dist-info/INSTALLER | 0 .../async_timeout-4.0.2.dist-info/LICENSE | 0 .../async_timeout-4.0.2.dist-info/METADATA | 0 .../async_timeout-4.0.2.dist-info/RECORD | 11 + .../async_timeout-4.0.2.dist-info/REQUESTED | 0 .../async_timeout-4.0.2.dist-info/WHEEL | 0 .../top_level.txt | 0 .../async_timeout-4.0.2.dist-info/zip-safe | 0 .../site-packages/async_timeout/__init__.py | 0 .../site-packages/async_timeout/py.typed | 0 .../beautifulsoup4-4.12.2.dist-info/INSTALLER | 0 .../beautifulsoup4-4.12.2.dist-info/METADATA | 0 .../beautifulsoup4-4.12.2.dist-info/RECORD | 72 + .../beautifulsoup4-4.12.2.dist-info/REQUESTED | 0 .../beautifulsoup4-4.12.2.dist-info/WHEEL | 0 .../licenses/AUTHORS | 0 .../licenses/LICENSE | 0 .../lib/python3.10}/site-packages/brotli.py | 0 .../bs4-0.0.1.dist-info}/INSTALLER | 0 .../bs4-0.0.1.dist-info/METADATA | 24 + .../site-packages/bs4-0.0.1.dist-info/RECORD | 6 + .../bs4-0.0.1.dist-info}/REQUESTED | 0 .../site-packages/bs4-0.0.1.dist-info}/WHEEL | 0 .../bs4-0.0.1.dist-info}/top_level.txt | 0 .../python3.10}/site-packages/bs4/__init__.py | 0 .../site-packages/bs4/builder/__init__.py | 0 .../site-packages/bs4/builder/_html5lib.py | 0 .../site-packages/bs4/builder/_htmlparser.py | 0 .../site-packages/bs4/builder/_lxml.py | 0 .../lib/python3.10}/site-packages/bs4/css.py | 0 .../python3.10}/site-packages/bs4/dammit.py | 0 .../python3.10}/site-packages/bs4/diagnose.py | 0 .../python3.10}/site-packages/bs4/element.py | 0 .../site-packages/bs4/formatter.py | 0 .../site-packages/bs4/tests/__init__.py | 0 ...mized-bs4_fuzzer-4818336571064320.testcase | 0 ...mized-bs4_fuzzer-4999465949331456.testcase | 0 ...mized-bs4_fuzzer-5167584867909632.testcase | Bin ...mized-bs4_fuzzer-5703933063462912.testcase | 0 ...mized-bs4_fuzzer-5843991618256896.testcase | 0 ...mized-bs4_fuzzer-5984173902397440.testcase | Bin ...mized-bs4_fuzzer-6124268085182464.testcase | 0 ...mized-bs4_fuzzer-6241471367348224.testcase | 0 ...mized-bs4_fuzzer-6450958476902400.testcase | Bin ...mized-bs4_fuzzer-6600557255327744.testcase | Bin ...0c8ed8bcd0785b67000fcd5dea1d33f08.testcase | Bin .../site-packages/bs4/tests/test_builder.py | 0 .../bs4/tests/test_builder_registry.py | 0 .../site-packages/bs4/tests/test_css.py | 0 .../site-packages/bs4/tests/test_dammit.py | 0 .../site-packages/bs4/tests/test_docs.py | 0 .../site-packages/bs4/tests/test_element.py | 0 .../site-packages/bs4/tests/test_formatter.py | 0 .../site-packages/bs4/tests/test_fuzz.py | 0 .../site-packages/bs4/tests/test_html5lib.py | 0 .../bs4/tests/test_htmlparser.py | 0 .../site-packages/bs4/tests/test_lxml.py | 0 .../bs4/tests/test_navigablestring.py | 0 .../bs4/tests/test_pageelement.py | 0 .../site-packages/bs4/tests/test_soup.py | 0 .../site-packages/bs4/tests/test_tag.py | 0 .../site-packages/bs4/tests/test_tree.py | 0 .../certifi-2023.5.7.dist-info}/INSTALLER | 0 .../certifi-2023.5.7.dist-info/LICENSE | 0 .../certifi-2023.5.7.dist-info/METADATA | 0 .../certifi-2023.5.7.dist-info/RECORD | 15 + .../certifi-2023.5.7.dist-info}/REQUESTED | 0 .../certifi-2023.5.7.dist-info/WHEEL | 0 .../certifi-2023.5.7.dist-info/top_level.txt | 0 .../site-packages/certifi/__init__.py | 0 .../site-packages/certifi/__main__.py | 0 .../site-packages/certifi/cacert.pem | 0 .../python3.10}/site-packages/certifi/core.py | 0 .../site-packages/certifi/py.typed | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 0 .../charset_normalizer-3.1.0.dist-info/RECORD | 36 + .../REQUESTED | 0 .../charset_normalizer-3.1.0.dist-info/WHEEL | 6 + .../entry_points.txt | 0 .../top_level.txt | 0 .../charset_normalizer/__init__.py | 0 .../site-packages/charset_normalizer/api.py | 0 .../charset_normalizer/assets/__init__.py | 0 .../site-packages/charset_normalizer/cd.py | 0 .../charset_normalizer/cli/__init__.py | 0 .../charset_normalizer/cli/normalizer.py | 0 .../charset_normalizer/constant.py | 0 .../charset_normalizer/legacy.py | 0 .../md.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 17496 bytes .../site-packages/charset_normalizer/md.py | 0 .../md__mypyc.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 424312 bytes .../charset_normalizer/models.py | 0 .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 0 .../charset_normalizer/version.py | 0 .../click-8.1.3.dist-info}/INSTALLER | 0 .../click-8.1.3.dist-info/LICENSE.rst | 0 .../click-8.1.3.dist-info/METADATA | 0 .../click-8.1.3.dist-info/RECORD | 40 + .../click-8.1.3.dist-info}/REQUESTED | 0 .../click-8.1.3.dist-info}/WHEEL | 0 .../click-8.1.3.dist-info/top_level.txt | 0 .../site-packages/click/__init__.py | 0 .../site-packages/click/_compat.py | 0 .../site-packages/click/_termui_impl.py | 0 .../site-packages/click/_textwrap.py | 0 .../site-packages/click/_winconsole.py | 0 .../python3.10}/site-packages/click/core.py | 0 .../site-packages/click/decorators.py | 0 .../site-packages/click/exceptions.py | 0 .../site-packages/click/formatting.py | 0 .../site-packages/click/globals.py | 0 .../python3.10}/site-packages/click/parser.py | 0 .../python3.10}/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 0 .../python3.10}/site-packages/click/termui.py | 0 .../site-packages/click/testing.py | 0 .../python3.10}/site-packages/click/types.py | 0 .../python3.10}/site-packages/click/utils.py | 0 .../site-packages/distutils-precedence.pth | 1 + .../filelock-3.12.2.dist-info}/INSTALLER | 0 .../filelock-3.12.2.dist-info/METADATA | 0 .../filelock-3.12.2.dist-info/RECORD | 23 + .../filelock-3.12.2.dist-info}/REQUESTED | 0 .../filelock-3.12.2.dist-info/WHEEL | 0 .../licenses/LICENSE | 0 .../site-packages/filelock/__init__.py | 0 .../site-packages/filelock/_api.py | 0 .../site-packages/filelock/_error.py | 0 .../site-packages/filelock/_soft.py | 0 .../site-packages/filelock/_unix.py | 0 .../site-packages/filelock/_util.py | 0 .../site-packages/filelock/_windows.py | 0 .../site-packages/filelock/py.typed | 0 .../site-packages/filelock/version.py | 0 .../site-packages/flask/__init__.py | 0 .../site-packages/flask/__main__.py | 0 .../python3.10}/site-packages/flask/app.py | 0 .../site-packages/flask/blueprints.py | 0 .../python3.10}/site-packages/flask/cli.py | 0 .../python3.10}/site-packages/flask/config.py | 0 .../python3.10}/site-packages/flask/ctx.py | 0 .../site-packages/flask/debughelpers.py | 0 .../site-packages/flask/globals.py | 0 .../site-packages/flask/helpers.py | 0 .../site-packages/flask/json/__init__.py | 0 .../site-packages/flask/json/provider.py | 0 .../site-packages/flask/json/tag.py | 0 .../site-packages/flask/logging.py | 0 .../python3.10}/site-packages/flask/py.typed | 0 .../site-packages/flask/scaffold.py | 0 .../site-packages/flask/sessions.py | 0 .../site-packages/flask/signals.py | 0 .../site-packages/flask/templating.py | 0 .../site-packages/flask/testing.py | 0 .../python3.10}/site-packages/flask/typing.py | 0 .../python3.10}/site-packages/flask/views.py | 0 .../site-packages/flask/wrappers.py | 0 .../idna-3.4.dist-info}/INSTALLER | 0 .../idna-3.4.dist-info/LICENSE.md | 0 .../site-packages/idna-3.4.dist-info/METADATA | 0 .../site-packages/idna-3.4.dist-info/RECORD | 23 + .../idna-3.4.dist-info}/REQUESTED | 0 .../site-packages/idna-3.4.dist-info/WHEEL | 0 .../site-packages/idna/__init__.py | 0 .../python3.10}/site-packages/idna/codec.py | 0 .../python3.10}/site-packages/idna/compat.py | 0 .../python3.10}/site-packages/idna/core.py | 0 .../site-packages/idna/idnadata.py | 0 .../site-packages/idna/intranges.py | 0 .../site-packages/idna/package_data.py | 0 .../python3.10}/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 0 .../importlib_metadata-6.6.0.dist-info/RECORD | 26 + .../REQUESTED | 0 .../importlib_metadata-6.6.0.dist-info/WHEEL | 0 .../top_level.txt | 0 .../importlib_metadata/__init__.py | 0 .../importlib_metadata/_adapters.py | 0 .../importlib_metadata/_collections.py | 0 .../importlib_metadata/_compat.py | 0 .../importlib_metadata/_functools.py | 0 .../importlib_metadata/_itertools.py | 0 .../site-packages/importlib_metadata/_meta.py | 0 .../importlib_metadata/_py39compat.py | 0 .../site-packages/importlib_metadata/_text.py | 0 .../site-packages/importlib_metadata/py.typed | 0 .../itsdangerous-2.1.2.dist-info}/INSTALLER | 0 .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 0 .../itsdangerous-2.1.2.dist-info/METADATA | 0 .../itsdangerous-2.1.2.dist-info/RECORD | 24 + .../itsdangerous-2.1.2.dist-info}/REQUESTED | 0 .../itsdangerous-2.1.2.dist-info}/WHEEL | 0 .../top_level.txt | 0 .../site-packages/itsdangerous/__init__.py | 0 .../site-packages/itsdangerous/_json.py | 0 .../site-packages/itsdangerous/encoding.py | 0 .../site-packages/itsdangerous/exc.py | 0 .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 0 .../site-packages/itsdangerous/signer.py | 0 .../site-packages/itsdangerous/timed.py | 0 .../site-packages/itsdangerous/url_safe.py | 0 .../site-packages/jinja2/__init__.py | 0 .../site-packages/jinja2/_identifier.py | 0 .../site-packages/jinja2/async_utils.py | 0 .../site-packages/jinja2/bccache.py | 0 .../site-packages/jinja2/compiler.py | 0 .../site-packages/jinja2/constants.py | 0 .../python3.10}/site-packages/jinja2/debug.py | 0 .../site-packages/jinja2/defaults.py | 0 .../site-packages/jinja2/environment.py | 0 .../site-packages/jinja2/exceptions.py | 0 .../python3.10}/site-packages/jinja2/ext.py | 0 .../site-packages/jinja2/filters.py | 0 .../site-packages/jinja2/idtracking.py | 0 .../python3.10}/site-packages/jinja2/lexer.py | 0 .../site-packages/jinja2/loaders.py | 0 .../python3.10}/site-packages/jinja2/meta.py | 0 .../site-packages/jinja2/nativetypes.py | 0 .../python3.10}/site-packages/jinja2/nodes.py | 0 .../site-packages/jinja2/optimizer.py | 0 .../site-packages/jinja2/parser.py | 0 .../python3.10}/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 0 .../site-packages/jinja2/sandbox.py | 0 .../python3.10}/site-packages/jinja2/tests.py | 0 .../python3.10}/site-packages/jinja2/utils.py | 0 .../site-packages/jinja2/visitor.py | 0 .../site-packages/markupsafe/__init__.py | 0 .../site-packages/markupsafe/_native.py | 0 .../site-packages/markupsafe/_speedups.c | 0 .../_speedups.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 44240 bytes .../site-packages/markupsafe/_speedups.pyi | 0 .../site-packages/markupsafe/py.typed | 0 .../mutagen-1.46.0.dist-info/COPYING | 0 .../mutagen-1.46.0.dist-info}/INSTALLER | 0 .../mutagen-1.46.0.dist-info/METADATA | 0 .../mutagen-1.46.0.dist-info/RECORD | 135 + .../mutagen-1.46.0.dist-info}/REQUESTED | 0 .../mutagen-1.46.0.dist-info}/WHEEL | 0 .../mutagen-1.46.0.dist-info/entry_points.txt | 0 .../mutagen-1.46.0.dist-info/top_level.txt | 0 .../site-packages/mutagen/__init__.py | 0 .../site-packages/mutagen/_constants.py | 0 .../site-packages/mutagen/_file.py | 0 .../python3.10}/site-packages/mutagen/_iff.py | 0 .../site-packages/mutagen/_riff.py | 0 .../site-packages/mutagen/_tags.py | 0 .../site-packages/mutagen/_tools/__init__.py | 0 .../site-packages/mutagen/_tools/_util.py | 0 .../site-packages/mutagen/_tools/mid3cp.py | 0 .../site-packages/mutagen/_tools/mid3iconv.py | 0 .../site-packages/mutagen/_tools/mid3v2.py | 0 .../site-packages/mutagen/_tools/moggsplit.py | 0 .../mutagen/_tools/mutagen_inspect.py | 0 .../mutagen/_tools/mutagen_pony.py | 0 .../site-packages/mutagen/_util.py | 0 .../site-packages/mutagen/_vorbis.py | 0 .../python3.10}/site-packages/mutagen/aac.py | 0 .../python3.10}/site-packages/mutagen/ac3.py | 0 .../python3.10}/site-packages/mutagen/aiff.py | 0 .../site-packages/mutagen/apev2.py | 0 .../site-packages/mutagen/asf/__init__.py | 0 .../site-packages/mutagen/asf/_attrs.py | 0 .../site-packages/mutagen/asf/_objects.py | 0 .../site-packages/mutagen/asf/_util.py | 0 .../site-packages/mutagen/dsdiff.py | 0 .../python3.10}/site-packages/mutagen/dsf.py | 0 .../site-packages/mutagen/easyid3.py | 0 .../site-packages/mutagen/easymp4.py | 0 .../python3.10}/site-packages/mutagen/flac.py | 0 .../site-packages/mutagen/id3/__init__.py | 0 .../site-packages/mutagen/id3/_file.py | 0 .../site-packages/mutagen/id3/_frames.py | 0 .../site-packages/mutagen/id3/_id3v1.py | 0 .../site-packages/mutagen/id3/_specs.py | 0 .../site-packages/mutagen/id3/_tags.py | 0 .../site-packages/mutagen/id3/_util.py | 0 .../python3.10}/site-packages/mutagen/m4a.py | 0 .../site-packages/mutagen/monkeysaudio.py | 0 .../site-packages/mutagen/mp3/__init__.py | 0 .../site-packages/mutagen/mp3/_util.py | 0 .../site-packages/mutagen/mp4/__init__.py | 0 .../site-packages/mutagen/mp4/_as_entry.py | 0 .../site-packages/mutagen/mp4/_atom.py | 0 .../site-packages/mutagen/mp4/_util.py | 0 .../site-packages/mutagen/musepack.py | 0 .../python3.10}/site-packages/mutagen/ogg.py | 0 .../site-packages/mutagen/oggflac.py | 0 .../site-packages/mutagen/oggopus.py | 0 .../site-packages/mutagen/oggspeex.py | 0 .../site-packages/mutagen/oggtheora.py | 0 .../site-packages/mutagen/oggvorbis.py | 0 .../site-packages/mutagen/optimfrog.py | 0 .../site-packages/mutagen/py.typed | 0 .../python3.10}/site-packages/mutagen/smf.py | 0 .../python3.10}/site-packages/mutagen/tak.py | 0 .../site-packages/mutagen/trueaudio.py | 0 .../python3.10}/site-packages/mutagen/wave.py | 0 .../site-packages/mutagen/wavpack.py | 0 .../pip-22.0.2.dist-info}/INSTALLER | 0 .../pip-22.0.2.dist-info}/LICENSE.txt | 0 .../pip-22.0.2.dist-info/METADATA | 92 + .../site-packages/pip-22.0.2.dist-info/RECORD | 1037 + .../pip-22.0.2.dist-info}/REQUESTED | 0 .../site-packages/pip-22.0.2.dist-info/WHEEL | 5 + .../pip-22.0.2.dist-info/entry_points.txt | 5 + .../pip-22.0.2.dist-info}/top_level.txt | 0 .../python3.10/site-packages/pip/__init__.py | 13 + .../python3.10}/site-packages/pip/__main__.py | 0 .../site-packages/pip/_internal/__init__.py | 0 .../site-packages/pip/_internal/build_env.py | 296 + .../site-packages/pip/_internal/cache.py | 264 + .../pip/_internal/cli/__init__.py | 0 .../pip/_internal/cli/autocompletion.py | 0 .../pip/_internal/cli/base_command.py | 220 + .../pip/_internal/cli/cmdoptions.py | 1018 + .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 0 .../pip/_internal/cli/main_parser.py | 87 + .../site-packages/pip/_internal/cli/parser.py | 292 + .../pip/_internal/cli/progress_bars.py | 321 + .../pip/_internal/cli/req_command.py | 506 + .../pip/_internal/cli/spinners.py | 157 + .../pip/_internal/cli/status_codes.py | 0 .../pip/_internal/commands/__init__.py | 127 + .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 0 .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 266 + .../pip/_internal/commands/debug.py | 202 + .../pip/_internal/commands/download.py | 140 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 0 .../pip/_internal/commands/help.py | 0 .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/install.py | 771 + .../pip/_internal/commands/list.py | 363 + .../pip/_internal/commands/search.py | 0 .../pip/_internal/commands/show.py | 178 + .../pip/_internal/commands/uninstall.py | 105 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 366 + .../pip/_internal/distributions/__init__.py | 0 .../pip/_internal/distributions/base.py | 36 + .../pip/_internal/distributions/installed.py | 20 + .../pip/_internal/distributions/sdist.py | 127 + .../pip/_internal/distributions/wheel.py | 31 + .../site-packages/pip/_internal/exceptions.py | 658 + .../pip/_internal/index/__init__.py | 0 .../pip/_internal/index/collector.py | 648 + .../pip/_internal/index/package_finder.py | 1004 + .../pip/_internal/index/sources.py | 0 .../pip/_internal/locations/__init__.py | 520 + .../pip/_internal/locations/_distutils.py | 169 + .../pip/_internal/locations/_sysconfig.py | 219 + .../pip/_internal/locations/base.py | 52 + .../site-packages/pip/_internal/main.py | 0 .../pip/_internal/metadata/__init__.py | 62 + .../pip/_internal/metadata/base.py | 546 + .../pip/_internal/metadata/pkg_resources.py | 256 + .../pip/_internal/models/__init__.py | 0 .../pip/_internal/models/candidate.py | 0 .../pip/_internal/models/direct_url.py | 220 + .../pip/_internal/models/format_control.py | 0 .../pip/_internal/models/index.py | 0 .../pip/_internal/models/link.py | 288 + .../pip/_internal/models/scheme.py | 0 .../pip/_internal/models/search_scope.py | 129 + .../pip/_internal/models/selection_prefs.py | 0 .../pip/_internal/models/target_python.py | 0 .../pip/_internal/models/wheel.py | 89 + .../pip/_internal/network/__init__.py | 0 .../pip/_internal/network/auth.py | 0 .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 185 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 454 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 0 .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../_internal/operations/build/metadata.py | 0 .../operations/build/metadata_editable.py | 0 .../operations/build/metadata_legacy.py | 0 .../pip/_internal/operations/build/wheel.py | 0 .../operations/build/wheel_editable.py | 0 .../operations/build/wheel_legacy.py | 0 .../pip/_internal/operations/check.py | 0 .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 0 .../operations/install/editable_legacy.py | 0 .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 + .../pip/_internal/operations/prepare.py | 642 + .../site-packages/pip/_internal/pyproject.py | 168 + .../pip/_internal/req/__init__.py | 94 + .../pip/_internal/req/constructors.py | 490 + .../pip/_internal/req/req_file.py | 536 + .../pip/_internal/req/req_install.py | 858 + .../pip/_internal/req/req_set.py | 189 + .../pip/_internal/req/req_tracker.py | 124 + .../pip/_internal/req/req_uninstall.py | 633 + .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 0 .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 467 + .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 0 .../resolution/resolvelib/candidates.py | 547 + .../resolution/resolvelib/factory.py | 739 + .../resolution/resolvelib/found_candidates.py | 0 .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 0 .../resolution/resolvelib/requirements.py | 0 .../resolution/resolvelib/resolver.py | 292 + .../pip/_internal/self_outdated_check.py | 189 + .../pip/_internal/utils/__init__.py | 0 .../site-packages/pip/_internal/utils/_log.py | 0 .../pip/_internal/utils/appdirs.py | 0 .../pip/_internal/utils/compat.py | 0 .../pip/_internal/utils/compatibility_tags.py | 0 .../pip/_internal/utils/datetime.py | 0 .../pip/_internal/utils/deprecation.py | 0 .../pip/_internal/utils/direct_url_helpers.py | 0 .../pip/_internal/utils/distutils_args.py | 42 + .../pip/_internal/utils/egg_link.py | 0 .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 27 + .../pip/_internal/utils/filesystem.py | 182 + .../pip/_internal/utils/filetypes.py | 0 .../pip/_internal/utils/glibc.py | 0 .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 0 .../pip/_internal/utils/logging.py | 343 + .../site-packages/pip/_internal/utils/misc.py | 653 + .../pip/_internal/utils/models.py | 0 .../pip/_internal/utils/packaging.py | 0 .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 258 + .../site-packages/pip/_internal/utils/urls.py | 0 .../pip/_internal/utils/virtualenv.py | 0 .../pip/_internal/utils/wheel.py | 0 .../pip/_internal/vcs/__init__.py | 0 .../site-packages/pip/_internal/vcs/bazaar.py | 101 + .../site-packages/pip/_internal/vcs/git.py | 0 .../pip/_internal/vcs/mercurial.py | 0 .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 0 .../pip/_internal/wheel_builder.py | 377 + .../site-packages/pip/_vendor/__init__.py | 111 + .../pip/_vendor/cachecontrol/__init__.py | 18 + .../pip/_vendor/cachecontrol/_cmd.py | 0 .../pip/_vendor/cachecontrol/adapter.py | 0 .../pip/_vendor/cachecontrol/cache.py | 43 + .../_vendor/cachecontrol/caches/__init__.py | 6 + .../_vendor/cachecontrol/caches/file_cache.py | 150 + .../cachecontrol/caches/redis_cache.py | 37 + .../pip/_vendor/cachecontrol/compat.py | 0 .../pip/_vendor/cachecontrol/controller.py | 415 + .../pip/_vendor/cachecontrol/filewrapper.py | 0 .../pip/_vendor/cachecontrol/heuristics.py | 0 .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 0 .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 0 .../pip/_vendor/certifi/cacert.pem | 4362 +++++ .../site-packages/pip/_vendor/certifi/core.py | 76 + .../pip/_vendor/chardet/__init__.py | 83 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 107 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../pip/_vendor/chardet/cli/chardetect.py | 84 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 36 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 +++++ .../pip/_vendor/chardet/langgreekmodel.py | 4398 +++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4383 +++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4650 +++++ .../pip/_vendor/chardet/langrussianmodel.py | 5718 ++++++ .../pip/_vendor/chardet/langthaimodel.py | 4383 +++++ .../pip/_vendor/chardet/langturkishmodel.py | 4383 +++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/metadata}/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 310 + .../pip/_vendor/chardet/sbcharsetprober.py | 145 + .../pip/_vendor/chardet/sbcsgroupprober.py | 83 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/ansi.py | 0 .../pip/_vendor/colorama/ansitowin32.py | 258 + .../pip/_vendor/colorama/initialise.py | 0 .../pip/_vendor/colorama/win32.py | 0 .../pip/_vendor/colorama/winterm.py | 0 .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/compat.py | 0 .../pip/_vendor/distlib/database.py | 1345 ++ .../pip/_vendor/distlib/index.py | 509 + .../pip/_vendor/distlib/locators.py | 1300 ++ .../pip/_vendor/distlib/manifest.py | 0 .../pip/_vendor/distlib/markers.py | 0 .../pip/_vendor/distlib/metadata.py | 1058 ++ .../pip/_vendor/distlib/resources.py | 0 .../pip/_vendor/distlib/scripts.py | 429 + .../site-packages/pip/_vendor/distlib/util.py | 0 .../pip/_vendor/distlib/version.py | 0 .../pip/_vendor/distlib/wheel.py | 1053 + .../site-packages/pip/_vendor/distro.py | 1386 ++ .../pip/_vendor/html5lib/__init__.py | 35 + .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_inputstream.py | 918 + .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++ .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/constants.py | 2946 +++ .../pip/_vendor/html5lib/filters}/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 916 + .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2795 +++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 343 + .../html5lib/treebuilders/etree_lxml.py | 392 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../html5lib/treewalkers/etree_lxml.py | 215 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 0 .../site-packages/pip/_vendor/idna/codec.py | 0 .../site-packages/pip/_vendor/idna/compat.py | 0 .../site-packages/pip/_vendor/idna/core.py | 397 + .../pip/_vendor/idna/idnadata.py | 2137 +++ .../pip/_vendor/idna/intranges.py | 0 .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8512 +++++++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 0 .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1012 + .../pip/_vendor/packaging/__about__.py | 0 .../pip/_vendor/packaging/__init__.py | 0 .../pip/_vendor/packaging/_manylinux.py | 0 .../pip/_vendor/packaging/_musllinux.py | 0 .../pip/_vendor/packaging/_structures.py | 0 .../pip/_vendor/packaging/markers.py | 0 .../pip/_vendor/packaging/requirements.py | 0 .../pip/_vendor/packaging/specifiers.py | 0 .../pip/_vendor/packaging/tags.py | 0 .../pip/_vendor/packaging/utils.py | 0 .../pip}/_vendor/packaging/version.py | 0 .../pip/_vendor/pep517/__init__.py | 6 + .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 51 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 171 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../_vendor/pep517/in_process/_in_process.py | 363 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 375 + .../pip/_vendor/pkg_resources/__init__.py | 0 .../pip/_vendor/pkg_resources/py31compat.py | 0 .../pip/_vendor/platformdirs/__init__.py | 331 + .../pip/_vendor/platformdirs/__main__.py | 0 .../pip/_vendor/platformdirs/android.py | 119 + .../pip/_vendor/platformdirs/api.py | 0 .../pip/_vendor/platformdirs/macos.py | 0 .../pip/_vendor/platformdirs/unix.py | 0 .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 0 .../pip/_vendor/progress/__init__.py | 189 + .../site-packages/pip/_vendor/progress/bar.py | 93 + .../pip/_vendor/progress/colors.py | 79 + .../pip/_vendor/progress/counter.py | 47 + .../pip/_vendor/progress/spinner.py | 45 + .../pip/_vendor/pygments/__init__.py | 83 + .../pip/_vendor/pygments/__main__.py | 17 + .../pip/_vendor/pygments/cmdline.py | 663 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 937 + .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 153 + .../_vendor/pygments/formatters/_mapping.py | 84 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 168 + .../pip/_vendor/pygments/formatters/html.py | 983 + .../pip/_vendor/pygments/formatters/img.py | 641 + .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 511 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 879 + .../pip/_vendor/pygments/lexers/__init__.py | 341 + .../pip/_vendor/pygments/lexers/_mapping.py | 580 + .../pip/_vendor/pygments/lexers/python.py | 1188 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 69 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 93 + .../pip/_vendor/pygments/token.py | 212 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 328 + .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 0 .../pip/_vendor/pyparsing/core.py | 5789 ++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 593 + .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1069 ++ .../pip/_vendor/pyparsing/results.py | 760 + .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 332 + .../pip/_vendor/pyparsing/util.py | 0 .../pip/_vendor/requests/__init__.py | 154 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 159 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 77 + .../pip/_vendor/requests/cookies.py | 549 + .../pip/_vendor/requests/exceptions.py | 133 + .../pip/_vendor/requests/help.py | 132 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 973 + .../pip/_vendor/requests/packages.py | 0 .../pip/_vendor/requests/sessions.py | 771 + .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 1060 ++ .../pip/_vendor/resolvelib/__init__.py | 0 .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 0 .../pip/_vendor/resolvelib/providers.py | 0 .../pip/_vendor/resolvelib/reporters.py | 0 .../pip/_vendor/resolvelib/resolvers.py | 0 .../pip/_vendor/resolvelib/structs.py | 0 .../pip/_vendor/rich/__init__.py | 172 + .../pip/_vendor/rich/__main__.py | 280 + .../pip/_vendor/rich/_cell_widths.py | 0 .../pip/_vendor/rich/_emoji_codes.py | 0 .../pip/_vendor/rich/_emoji_replace.py | 0 .../pip/_vendor/rich/_extension.py | 0 .../pip/_vendor/rich/_inspect.py | 210 + .../pip/_vendor/rich/_log_render.py | 0 .../site-packages/pip/_vendor/rich/_loop.py | 0 .../pip/_vendor/rich/_lru_cache.py | 34 + .../pip/_vendor/rich/_palettes.py | 0 .../site-packages/pip/_vendor/rich/_pick.py | 0 .../site-packages/pip/_vendor/rich/_ratio.py | 0 .../pip/_vendor/rich/_spinners.py | 848 + .../site-packages/pip/_vendor/rich/_stack.py | 0 .../site-packages/pip/_vendor/rich/_timer.py | 0 .../pip/_vendor/rich/_windows.py | 72 + .../site-packages/pip/_vendor/rich/_wrap.py | 55 + .../site-packages/pip/_vendor/rich/abc.py | 0 .../site-packages/pip/_vendor/rich/align.py | 312 + .../site-packages/pip/_vendor/rich/ansi.py | 228 + .../site-packages/pip/_vendor/rich/bar.py | 0 .../site-packages/pip/_vendor/rich/box.py | 483 + .../site-packages/pip/_vendor/rich/cells.py | 147 + .../site-packages/pip/_vendor/rich/color.py | 581 + .../pip/_vendor/rich/color_triplet.py | 0 .../site-packages/pip/_vendor/rich/columns.py | 0 .../site-packages/pip/_vendor/rich/console.py | 2211 +++ .../pip/_vendor/rich/constrain.py | 0 .../pip/_vendor/rich/containers.py | 0 .../site-packages/pip/_vendor/rich/control.py | 175 + .../pip/_vendor/rich/default_styles.py | 183 + .../pip/_vendor/rich/diagnose.py | 6 + .../site-packages/pip/_vendor/rich/emoji.py | 0 .../site-packages/pip/_vendor/rich/errors.py | 0 .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 147 + .../site-packages/pip/_vendor/rich/json.py | 0 .../site-packages/pip/_vendor/rich/jupyter.py | 92 + .../site-packages/pip/_vendor/rich/layout.py | 444 + .../site-packages/pip/_vendor/rich/live.py | 365 + .../pip/_vendor/rich/live_render.py | 0 .../site-packages/pip/_vendor/rich/logging.py | 268 + .../site-packages/pip/_vendor/rich/markup.py | 244 + .../site-packages/pip/_vendor/rich/measure.py | 149 + .../site-packages/pip/_vendor/rich/padding.py | 0 .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 0 .../site-packages/pip/_vendor/rich/panel.py | 250 + .../site-packages/pip/_vendor/rich/pretty.py | 903 + .../pip/_vendor/rich/progress.py | 1036 + .../pip/_vendor/rich/progress_bar.py | 216 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 0 .../site-packages/pip/_vendor/rich/repr.py | 151 + .../site-packages/pip/_vendor/rich/rule.py | 115 + .../site-packages/pip/_vendor/rich/scope.py | 0 .../site-packages/pip/_vendor/rich/screen.py | 0 .../site-packages/pip/_vendor/rich/segment.py | 720 + .../site-packages/pip/_vendor/rich/spinner.py | 134 + .../site-packages/pip/_vendor/rich/status.py | 0 .../site-packages/pip/_vendor/rich/style.py | 785 + .../site-packages/pip/_vendor/rich/styled.py | 0 .../site-packages/pip/_vendor/rich/syntax.py | 735 + .../site-packages/pip/_vendor/rich/table.py | 968 + .../pip/_vendor/rich/tabulate.py | 51 + .../pip/_vendor/rich/terminal_theme.py | 55 + .../site-packages/pip/_vendor/rich/text.py | 1282 ++ .../site-packages/pip/_vendor/rich/theme.py | 0 .../site-packages/pip/_vendor/rich/themes.py | 0 .../pip/_vendor/rich/traceback.py | 678 + .../site-packages/pip/_vendor/rich/tree.py | 249 + .../site-packages/pip/_vendor/six.py | 0 .../pip/_vendor/tenacity/__init__.py | 517 + .../pip/_vendor/tenacity/_asyncio.py | 0 .../pip/_vendor/tenacity/_utils.py | 0 .../pip/_vendor/tenacity/after.py | 0 .../pip/_vendor/tenacity/before.py | 0 .../pip/_vendor/tenacity/before_sleep.py | 0 .../site-packages/pip/_vendor/tenacity/nap.py | 0 .../pip/_vendor/tenacity/retry.py | 213 + .../pip/_vendor/tenacity/stop.py | 0 .../pip/_vendor/tenacity/tornadoweb.py | 0 .../pip/_vendor/tenacity/wait.py | 191 + .../pip/_vendor/tomli/__init__.py | 6 + .../pip/_vendor/tomli/_parser.py | 703 + .../site-packages/pip/_vendor/tomli/_re.py | 83 + .../pip}/_vendor/typing_extensions.py | 0 .../pip/_vendor}/urllib3/__init__.py | 0 .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 569 + .../pip/_vendor/urllib3/connectionpool.py | 1113 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 0 .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 0 .../contrib/_securetransport/low_level.py | 0 .../pip/_vendor/urllib3/contrib/appengine.py | 0 .../pip/_vendor/urllib3/contrib/ntlmpool.py | 0 .../pip/_vendor/urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 + .../pip/_vendor/urllib3/contrib/socks.py | 0 .../pip/_vendor/urllib3/exceptions.py | 0 .../pip/_vendor/urllib3/fields.py | 0 .../pip/_vendor/urllib3/filepost.py | 0 .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 0 .../pip/_vendor/urllib3/packages/six.py | 1077 ++ .../pip/_vendor/urllib3/poolmanager.py | 539 + .../pip/_vendor/urllib3/request.py | 0 .../pip/_vendor}/urllib3/response.py | 0 .../pip/_vendor/urllib3/util/__init__.py | 0 .../pip/_vendor/urllib3/util/connection.py | 0 .../pip/_vendor/urllib3/util/proxy.py | 0 .../pip/_vendor/urllib3/util/queue.py | 0 .../pip/_vendor}/urllib3/util/request.py | 0 .../pip/_vendor/urllib3/util/response.py | 0 .../pip/_vendor/urllib3/util/retry.py | 620 + .../pip/_vendor/urllib3/util/ssl_.py | 0 .../urllib3/util/ssl_match_hostname.py | 161 + .../pip/_vendor/urllib3/util/ssltransport.py | 0 .../pip/_vendor/urllib3/util/timeout.py | 0 .../pip/_vendor/urllib3/util/url.py | 432 + .../pip/_vendor}/urllib3/util/wait.py | 0 .../site-packages/pip/_vendor/vendor.txt | 25 + .../pip/_vendor/webencodings/__init__.py | 0 .../pip/_vendor/webencodings/labels.py | 0 .../pip/_vendor/webencodings/mklabels.py | 0 .../pip/_vendor/webencodings/tests.py | 0 .../_vendor/webencodings/x_user_defined.py | 0 .../python3.10}/site-packages/pip/py.typed | 0 .../site-packages/pkg_resources/__init__.py | 3303 ++++ .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 0 .../_vendor/packaging/_manylinux.py | 0 .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../_vendor/packaging/markers.py | 0 .../_vendor/packaging/requirements.py | 0 .../_vendor/packaging/specifiers.py | 828 + .../pkg_resources/_vendor/packaging/tags.py | 484 + .../pkg_resources/_vendor/packaging/utils.py | 0 .../_vendor/packaging/version.py | 0 .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++ .../pkg_resources/extern/__init__.py | 73 + .../data/my-test-package-source/setup.py | 6 + .../AUTHORS.rst | 0 .../pycryptodomex-3.18.0.dist-info}/INSTALLER | 0 .../LICENSE.rst | 0 .../pycryptodomex-3.18.0.dist-info/METADATA | 0 .../pycryptodomex-3.18.0.dist-info/RECORD | 513 + .../pycryptodomex-3.18.0.dist-info}/REQUESTED | 0 .../pycryptodomex-3.18.0.dist-info/WHEEL | 0 .../top_level.txt | 0 .../site-packages/pysondb/__init__.py | 0 .../site-packages/pysondb/__main__.py | 0 .../python3.10}/site-packages/pysondb/cli.py | 0 .../python3.10}/site-packages/pysondb/db.py | 0 .../site-packages/pysondb/db_types.py | 0 .../site-packages/pysondb/errors.py | 0 .../site-packages/pysondb/utils.py | 0 .../pysondb_v2-2.0.0.dist-info}/INSTALLER | 0 .../pysondb_v2-2.0.0.dist-info/LICENSE | 0 .../pysondb_v2-2.0.0.dist-info/METADATA | 0 .../pysondb_v2-2.0.0.dist-info/RECORD | 23 + .../pysondb_v2-2.0.0.dist-info}/REQUESTED | 0 .../pysondb_v2-2.0.0.dist-info/WHEEL | 0 .../entry_points.txt | 0 .../pysondb_v2-2.0.0.dist-info/top_level.txt | 0 .../pytz-2024.1.dist-info}/INSTALLER | 0 .../pytz-2024.1.dist-info}/LICENSE.txt | 0 .../pytz-2024.1.dist-info/METADATA | 649 + .../pytz-2024.1.dist-info/RECORD | 622 + .../site-packages/pytz-2024.1.dist-info/WHEEL | 6 + .../pytz-2024.1.dist-info}/top_level.txt | 0 .../pytz-2024.1.dist-info}/zip-safe | 0 .../python3.10/site-packages/pytz/__init__.py | 1555 ++ .../site-packages/pytz/exceptions.py | 0 .../python3.10}/site-packages/pytz/lazy.py | 0 .../site-packages/pytz/reference.py | 0 .../python3.10}/site-packages/pytz/tzfile.py | 0 .../python3.10/site-packages/pytz/tzinfo.py | 580 + .../pytz/zoneinfo/Africa/Abidjan | Bin .../site-packages/pytz/zoneinfo/Africa/Accra | Bin .../pytz/zoneinfo/Africa/Addis_Ababa | Bin .../pytz/zoneinfo/Africa/Algiers | Bin .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin .../pytz/zoneinfo/Africa/Blantyre | Bin .../pytz/zoneinfo/Africa/Brazzaville | Bin .../pytz/zoneinfo/Africa/Bujumbura | Bin .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin .../pytz/zoneinfo/Africa/Casablanca | Bin .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin .../pytz/zoneinfo/Africa/Conakry | Bin .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin .../pytz/zoneinfo/Africa/Djibouti | Bin .../site-packages/pytz/zoneinfo/Africa/Douala | Bin .../pytz/zoneinfo/Africa/El_Aaiun | Bin .../pytz/zoneinfo/Africa/Freetown | Bin .../pytz/zoneinfo/Africa/Gaborone | Bin .../site-packages/pytz/zoneinfo/Africa/Harare | Bin .../pytz/zoneinfo/Africa/Johannesburg | Bin .../site-packages/pytz/zoneinfo/Africa/Juba | Bin .../pytz/zoneinfo/Africa/Kampala | Bin .../pytz/zoneinfo/Africa/Khartoum | Bin .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin .../pytz/zoneinfo/Africa/Kinshasa | Bin .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin .../pytz/zoneinfo/Africa/Libreville | Bin .../site-packages/pytz/zoneinfo/Africa/Lome | Bin .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin .../pytz/zoneinfo/Africa/Lubumbashi | Bin .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin .../pytz/zoneinfo/Africa/Mbabane | Bin .../pytz/zoneinfo/Africa/Mogadishu | Bin .../pytz/zoneinfo/Africa/Monrovia | Bin .../pytz/zoneinfo/Africa/Nairobi | Bin .../pytz/zoneinfo/Africa/Ndjamena | Bin .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin .../pytz/zoneinfo/Africa/Nouakchott | Bin .../pytz/zoneinfo/Africa/Ouagadougou | Bin .../pytz/zoneinfo/Africa/Porto-Novo | Bin .../pytz/zoneinfo/Africa/Sao_Tome | Bin .../pytz/zoneinfo/Africa/Timbuktu | Bin .../pytz/zoneinfo/Africa/Tripoli | Bin .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin .../pytz/zoneinfo/Africa/Windhoek | Bin .../site-packages/pytz/zoneinfo/America/Adak | Bin .../pytz/zoneinfo/America/Anchorage | Bin .../pytz/zoneinfo/America/Anguilla | Bin .../pytz/zoneinfo/America/Antigua | Bin .../pytz/zoneinfo/America/Araguaina | Bin .../zoneinfo/America/Argentina/Buenos_Aires | Bin .../pytz/zoneinfo/America/Argentina/Catamarca | Bin .../zoneinfo/America/Argentina/ComodRivadavia | Bin .../pytz/zoneinfo/America/Argentina/Cordoba | Bin .../pytz/zoneinfo/America/Argentina/Jujuy | Bin .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin .../pytz/zoneinfo/America/Argentina/Mendoza | Bin .../zoneinfo/America/Argentina/Rio_Gallegos | Bin .../pytz/zoneinfo/America/Argentina/Salta | Bin .../pytz/zoneinfo/America/Argentina/San_Juan | Bin .../pytz/zoneinfo/America/Argentina/San_Luis | Bin .../pytz/zoneinfo/America/Argentina/Tucuman | Bin .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin .../site-packages/pytz/zoneinfo/America/Aruba | Bin .../pytz/zoneinfo/America/Asuncion | Bin .../pytz/zoneinfo/America/Atikokan | Bin .../site-packages/pytz/zoneinfo/America/Atka | Bin .../site-packages/pytz/zoneinfo/America/Bahia | Bin .../pytz/zoneinfo/America/Bahia_Banderas | Bin .../pytz/zoneinfo/America/Barbados | Bin .../site-packages/pytz/zoneinfo/America/Belem | Bin .../pytz/zoneinfo/America/Belize | Bin .../pytz/zoneinfo/America/Blanc-Sablon | Bin .../pytz/zoneinfo/America/Boa_Vista | Bin .../pytz/zoneinfo/America/Bogota | Bin .../site-packages/pytz/zoneinfo/America/Boise | Bin .../pytz/zoneinfo/America/Buenos_Aires | Bin .../pytz/zoneinfo/America/Cambridge_Bay | Bin .../pytz/zoneinfo/America/Campo_Grande | Bin .../pytz/zoneinfo/America/Cancun | Bin .../pytz/zoneinfo/America/Caracas | Bin .../pytz/zoneinfo/America/Catamarca | Bin .../pytz/zoneinfo/America/Cayenne | Bin .../pytz/zoneinfo/America/Cayman | Bin .../pytz/zoneinfo/America/Chicago | Bin .../pytz/zoneinfo/America/Chihuahua | Bin .../pytz/zoneinfo/America/Ciudad_Juarez | Bin .../pytz/zoneinfo/America/Coral_Harbour | Bin .../pytz/zoneinfo/America/Cordoba | Bin .../pytz/zoneinfo/America/Costa_Rica | Bin .../pytz/zoneinfo/America/Creston | Bin .../pytz/zoneinfo/America/Cuiaba | Bin .../pytz/zoneinfo/America/Curacao | Bin .../pytz/zoneinfo/America/Danmarkshavn | Bin .../pytz/zoneinfo/America/Dawson | Bin .../pytz/zoneinfo/America/Dawson_Creek | Bin .../pytz/zoneinfo/America/Denver | Bin .../pytz/zoneinfo/America/Detroit | Bin .../pytz/zoneinfo/America/Dominica | Bin .../pytz/zoneinfo/America/Edmonton | Bin .../pytz/zoneinfo/America/Eirunepe | Bin .../pytz/zoneinfo/America/El_Salvador | Bin .../pytz/zoneinfo/America/Ensenada | Bin .../pytz/zoneinfo/America/Fort_Nelson | Bin .../pytz/zoneinfo/America/Fort_Wayne | Bin .../pytz/zoneinfo/America/Fortaleza | Bin .../pytz/zoneinfo/America/Glace_Bay | Bin .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1889 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin .../pytz/zoneinfo/America/Grand_Turk | Bin .../pytz/zoneinfo/America/Grenada | Bin .../pytz/zoneinfo/America/Guadeloupe | Bin .../pytz/zoneinfo/America/Guatemala | Bin .../pytz/zoneinfo/America/Guayaquil | Bin .../pytz/zoneinfo/America/Guyana | Bin .../pytz/zoneinfo/America/Halifax | Bin .../pytz/zoneinfo/America/Havana | Bin .../pytz/zoneinfo/America/Hermosillo | Bin .../zoneinfo/America/Indiana/Indianapolis | Bin .../pytz/zoneinfo/America/Indiana/Knox | Bin .../pytz/zoneinfo/America/Indiana/Marengo | Bin .../pytz/zoneinfo/America/Indiana/Petersburg | Bin .../pytz/zoneinfo/America/Indiana/Tell_City | Bin .../pytz/zoneinfo/America/Indiana/Vevay | Bin .../pytz/zoneinfo/America/Indiana/Vincennes | Bin .../pytz/zoneinfo/America/Indiana/Winamac | Bin .../pytz/zoneinfo/America/Indianapolis | Bin .../pytz/zoneinfo/America/Inuvik | Bin .../pytz/zoneinfo/America/Iqaluit | Bin .../pytz/zoneinfo/America/Jamaica | Bin .../site-packages/pytz/zoneinfo/America/Jujuy | Bin .../pytz/zoneinfo/America/Juneau | Bin .../pytz/zoneinfo/America/Kentucky/Louisville | Bin .../pytz/zoneinfo/America/Kentucky/Monticello | Bin .../pytz/zoneinfo/America/Knox_IN | Bin .../pytz/zoneinfo/America/Kralendijk | Bin .../pytz/zoneinfo/America/La_Paz | Bin .../site-packages/pytz/zoneinfo/America/Lima | Bin .../pytz/zoneinfo/America/Los_Angeles | Bin .../pytz/zoneinfo/America/Louisville | Bin .../pytz/zoneinfo/America/Lower_Princes | Bin .../pytz/zoneinfo/America/Maceio | Bin .../pytz/zoneinfo/America/Managua | Bin .../pytz/zoneinfo/America/Manaus | Bin .../pytz/zoneinfo/America/Marigot | Bin .../pytz/zoneinfo/America/Martinique | Bin .../pytz/zoneinfo/America/Matamoros | Bin .../pytz/zoneinfo/America/Mazatlan | Bin .../pytz/zoneinfo/America/Mendoza | Bin .../pytz/zoneinfo/America/Menominee | Bin .../pytz/zoneinfo/America/Merida | Bin .../pytz/zoneinfo/America/Metlakatla | Bin .../pytz/zoneinfo/America/Mexico_City | Bin .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1652 bytes .../pytz/zoneinfo/America/Moncton | Bin .../pytz/zoneinfo/America/Monterrey | Bin .../pytz/zoneinfo/America/Montevideo | Bin .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Montserrat | Bin .../pytz/zoneinfo/America/Nassau | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/New_York | Bin .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 3494 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin .../pytz/zoneinfo/America/Noronha | Bin .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin .../pytz/zoneinfo/America/North_Dakota/Center | Bin .../zoneinfo/America/North_Dakota/New_Salem | Bin .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 0 -> 1889 bytes .../pytz/zoneinfo/America/Ojinaga | Bin .../pytz/zoneinfo/America/Panama | Bin .../pytz/zoneinfo/America/Pangnirtung | Bin .../pytz/zoneinfo/America/Paramaribo | Bin .../pytz/zoneinfo/America/Phoenix | Bin .../pytz/zoneinfo/America/Port-au-Prince | Bin .../pytz/zoneinfo/America/Port_of_Spain | Bin .../pytz/zoneinfo/America/Porto_Acre | Bin .../pytz/zoneinfo/America/Porto_Velho | Bin .../pytz/zoneinfo/America/Puerto_Rico | Bin .../pytz/zoneinfo/America/Punta_Arenas | Bin .../pytz/zoneinfo/America/Rainy_River | Bin .../pytz/zoneinfo/America/Rankin_Inlet | Bin .../pytz/zoneinfo/America/Recife | Bin .../pytz/zoneinfo/America/Regina | Bin .../pytz/zoneinfo/America/Resolute | Bin .../pytz/zoneinfo/America/Rio_Branco | Bin .../pytz/zoneinfo/America/Rosario | Bin .../pytz/zoneinfo/America/Santa_Isabel | Bin .../pytz/zoneinfo/America/Santarem | Bin .../pytz/zoneinfo/America/Santiago | Bin .../pytz/zoneinfo/America/Santo_Domingo | Bin .../pytz/zoneinfo/America/Sao_Paulo | Bin .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1935 bytes .../pytz/zoneinfo/America/Shiprock | Bin .../site-packages/pytz/zoneinfo/America/Sitka | Bin .../pytz/zoneinfo/America/St_Barthelemy | Bin .../pytz/zoneinfo/America/St_Johns | Bin .../pytz/zoneinfo/America/St_Kitts | Bin .../pytz/zoneinfo/America/St_Lucia | Bin .../pytz/zoneinfo/America/St_Thomas | Bin .../pytz/zoneinfo/America/St_Vincent | Bin .../pytz/zoneinfo/America/Swift_Current | Bin .../pytz/zoneinfo/America/Tegucigalpa | Bin .../site-packages/pytz/zoneinfo/America/Thule | Bin .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tijuana | Bin .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tortola | Bin .../pytz/zoneinfo/America/Vancouver | Bin .../pytz/zoneinfo/America/Virgin | Bin .../pytz/zoneinfo/America/Whitehorse | Bin .../pytz/zoneinfo/America/Winnipeg | Bin .../pytz/zoneinfo/America/Yakutat | Bin .../pytz/zoneinfo/America/Yellowknife | Bin .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 423 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin .../pytz/zoneinfo/Antarctica/Macquarie | Bin .../pytz/zoneinfo/Antarctica/Mawson | Bin .../pytz/zoneinfo/Antarctica/McMurdo | Bin .../pytz/zoneinfo/Antarctica/Palmer | Bin .../pytz/zoneinfo/Antarctica/Rothera | Bin .../pytz/zoneinfo/Antarctica/South_Pole | Bin .../pytz/zoneinfo/Antarctica/Syowa | Bin .../pytz/zoneinfo/Antarctica/Troll | Bin .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 213 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin .../site-packages/pytz/zoneinfo/Asia/Aden | Bin .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin .../pytz/zoneinfo/Asia/Ashkhabad | Bin .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin .../site-packages/pytz/zoneinfo/Asia/Baku | Bin .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin .../site-packages/pytz/zoneinfo/Asia/Chita | Bin .../pytz/zoneinfo/Asia/Choibalsan | Bin .../pytz/zoneinfo/Asia/Chongqing | Bin .../pytz/zoneinfo/Asia/Chungking | Bin .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin .../site-packages/pytz/zoneinfo/Asia/Dili | Bin .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin .../pytz/zoneinfo/Asia/Famagusta | Bin .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 3844 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 3872 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 337 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin .../pytz/zoneinfo/Asia/Jerusalem | Bin .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin .../pytz/zoneinfo/Asia/Kamchatka | Bin .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin .../pytz/zoneinfo/Asia/Kathmandu | Bin .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin .../site-packages/pytz/zoneinfo/Asia/Macao | Bin .../site-packages/pytz/zoneinfo/Asia/Macau | Bin .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin .../site-packages/pytz/zoneinfo/Asia/Manila | Bin .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin .../pytz/zoneinfo/Asia/Novokuznetsk | Bin .../pytz/zoneinfo/Asia/Novosibirsk | Bin .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin .../site-packages/pytz/zoneinfo/Asia/Oral | Bin .../pytz/zoneinfo/Asia/Phnom_Penh | Bin .../pytz/zoneinfo/Asia/Pontianak | Bin .../pytz/zoneinfo/Asia/Pyongyang | Bin .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 0 -> 1025 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 337 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin .../pytz/zoneinfo/Asia/Samarkand | Bin .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin .../pytz/zoneinfo/Asia/Singapore | Bin .../pytz/zoneinfo/Asia/Srednekolymsk | Bin .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin .../pytz/zoneinfo/Asia/Ulan_Bator | Bin .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin .../pytz/zoneinfo/Asia/Vientiane | Bin .../pytz/zoneinfo/Asia/Vladivostok | Bin .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin .../pytz/zoneinfo/Asia/Yekaterinburg | Bin .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin .../pytz/zoneinfo/Atlantic/Azores | Bin .../pytz/zoneinfo/Atlantic/Bermuda | Bin .../pytz/zoneinfo/Atlantic/Canary | Bin .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin .../pytz/zoneinfo/Atlantic/Faeroe | Bin .../pytz/zoneinfo/Atlantic/Faroe | Bin .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin .../pytz/zoneinfo/Atlantic/Madeira | Bin .../pytz/zoneinfo/Atlantic/Reykjavik | Bin .../pytz/zoneinfo/Atlantic/South_Georgia | Bin .../pytz/zoneinfo/Atlantic/St_Helena | Bin .../pytz/zoneinfo/Atlantic/Stanley | Bin .../site-packages/pytz/zoneinfo/Australia/ACT | Bin .../pytz/zoneinfo/Australia/Adelaide | Bin .../pytz/zoneinfo/Australia/Brisbane | Bin .../pytz/zoneinfo/Australia/Broken_Hill | Bin .../pytz/zoneinfo/Australia/Canberra | Bin .../pytz/zoneinfo/Australia/Currie | Bin .../pytz/zoneinfo/Australia/Darwin | Bin .../pytz/zoneinfo/Australia/Eucla | Bin .../pytz/zoneinfo/Australia/Hobart | Bin .../site-packages/pytz/zoneinfo/Australia/LHI | Bin .../pytz/zoneinfo/Australia/Lindeman | Bin .../pytz/zoneinfo/Australia/Lord_Howe | Bin .../pytz/zoneinfo/Australia/Melbourne | Bin .../site-packages/pytz/zoneinfo/Australia/NSW | Bin .../pytz/zoneinfo/Australia/North | Bin .../pytz/zoneinfo/Australia/Perth | Bin .../pytz/zoneinfo/Australia/Queensland | Bin .../pytz/zoneinfo/Australia/South | Bin .../pytz/zoneinfo/Australia/Sydney | Bin .../pytz/zoneinfo/Australia/Tasmania | Bin .../pytz/zoneinfo/Australia/Victoria | Bin .../pytz/zoneinfo/Australia/West | Bin .../pytz/zoneinfo/Australia/Yancowinna | Bin .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin .../pytz/zoneinfo/Brazil/DeNoronha | Bin .../site-packages/pytz/zoneinfo/Brazil/East | Bin .../site-packages/pytz/zoneinfo/Brazil/West | Bin .../site-packages/pytz/zoneinfo/CET | Bin .../site-packages/pytz/zoneinfo/CST6CDT | Bin .../pytz/zoneinfo/Canada/Atlantic | Bin .../pytz/zoneinfo/Canada/Central | Bin .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3494 bytes .../pytz/zoneinfo/Canada/Mountain | Bin .../pytz/zoneinfo/Canada/Newfoundland | Bin .../pytz/zoneinfo/Canada/Pacific | Bin .../pytz/zoneinfo/Canada/Saskatchewan | Bin .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin .../pytz/zoneinfo/Chile/Continental | Bin .../pytz/zoneinfo/Chile/EasterIsland | Bin .../site-packages/pytz/zoneinfo/Cuba | Bin .../site-packages/pytz/zoneinfo/EET | Bin .../site-packages/pytz/zoneinfo/EST | Bin .../site-packages/pytz/zoneinfo/EST5EDT | Bin .../site-packages/pytz/zoneinfo/Egypt | Bin .../site-packages/pytz/zoneinfo/Eire | Bin .../site-packages/pytz/zoneinfo/Etc/GMT | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin .../site-packages/pytz/zoneinfo/Etc/UCT | Bin .../site-packages/pytz/zoneinfo/Etc/UTC | Bin .../site-packages/pytz/zoneinfo/Etc/Universal | Bin .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin .../pytz/zoneinfo/Europe/Amsterdam | Bin .../pytz/zoneinfo/Europe/Andorra | Bin .../pytz/zoneinfo/Europe/Astrakhan | Bin .../site-packages/pytz/zoneinfo/Europe/Athens | Bin .../pytz/zoneinfo/Europe/Belfast | Bin .../pytz/zoneinfo/Europe/Belgrade | Bin .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin .../pytz/zoneinfo/Europe/Bratislava | Bin .../pytz/zoneinfo/Europe/Brussels | Bin .../pytz/zoneinfo/Europe/Bucharest | Bin .../pytz/zoneinfo/Europe/Budapest | Bin .../pytz/zoneinfo/Europe/Busingen | Bin .../pytz/zoneinfo/Europe/Chisinau | Bin .../pytz/zoneinfo/Europe/Copenhagen | Bin .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin .../pytz/zoneinfo/Europe/Gibraltar | Bin .../pytz/zoneinfo/Europe/Guernsey | Bin .../pytz/zoneinfo/Europe/Helsinki | Bin .../pytz/zoneinfo/Europe/Isle_of_Man | Bin .../pytz/zoneinfo/Europe/Istanbul | Bin .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin .../pytz/zoneinfo/Europe/Kaliningrad | Bin .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin .../pytz/zoneinfo/Europe/Ljubljana | Bin .../site-packages/pytz/zoneinfo/Europe/London | Bin .../pytz/zoneinfo/Europe/Luxembourg | Bin .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin .../site-packages/pytz/zoneinfo/Europe/Malta | Bin .../pytz/zoneinfo/Europe/Mariehamn | Bin .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin .../pytz/zoneinfo/Europe/Nicosia | Bin .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin .../site-packages/pytz/zoneinfo/Europe/Paris | Bin .../pytz/zoneinfo/Europe/Podgorica | Bin .../site-packages/pytz/zoneinfo/Europe/Prague | Bin .../site-packages/pytz/zoneinfo/Europe/Riga | Bin .../site-packages/pytz/zoneinfo/Europe/Rome | Bin .../site-packages/pytz/zoneinfo/Europe/Samara | Bin .../pytz/zoneinfo/Europe/San_Marino | Bin .../pytz/zoneinfo/Europe/Sarajevo | Bin .../pytz/zoneinfo/Europe/Saratov | Bin .../pytz/zoneinfo/Europe/Simferopol | Bin .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin .../pytz/zoneinfo/Europe/Stockholm | Bin .../pytz/zoneinfo/Europe/Tallinn | Bin .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin .../pytz/zoneinfo/Europe/Tiraspol | Bin .../pytz/zoneinfo/Europe/Ulyanovsk | Bin .../pytz/zoneinfo/Europe/Uzhgorod | Bin .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin .../pytz/zoneinfo/Europe/Vatican | Bin .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin .../pytz/zoneinfo/Europe/Vilnius | Bin .../pytz/zoneinfo/Europe/Volgograd | Bin .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin .../pytz/zoneinfo/Europe/Zaporozhye | Bin .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin .../site-packages/pytz/zoneinfo/Factory | Bin .../site-packages/pytz/zoneinfo/GB | Bin .../site-packages/pytz/zoneinfo/GB-Eire | Bin .../site-packages/pytz/zoneinfo/GMT | Bin .../site-packages/pytz/zoneinfo/GMT+0 | Bin .../site-packages/pytz/zoneinfo/GMT-0 | Bin .../site-packages/pytz/zoneinfo/GMT0 | Bin .../site-packages/pytz/zoneinfo/Greenwich | Bin .../site-packages/pytz/zoneinfo/HST | Bin .../site-packages/pytz/zoneinfo/Hongkong | Bin .../site-packages/pytz/zoneinfo/Iceland | Bin .../pytz/zoneinfo/Indian/Antananarivo | Bin .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin .../pytz/zoneinfo/Indian/Christmas | Bin .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin .../pytz/zoneinfo/Indian/Kerguelen | Bin .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin .../pytz/zoneinfo/Indian/Maldives | Bin .../pytz/zoneinfo/Indian/Mauritius | Bin .../pytz/zoneinfo/Indian/Mayotte | Bin .../pytz/zoneinfo/Indian/Reunion | Bin .../site-packages/pytz/zoneinfo/Iran | Bin .../site-packages/pytz/zoneinfo/Israel | Bin .../site-packages/pytz/zoneinfo/Jamaica | Bin .../site-packages/pytz/zoneinfo/Japan | Bin .../site-packages/pytz/zoneinfo/Kwajalein | Bin .../site-packages/pytz/zoneinfo/Libya | Bin .../site-packages/pytz/zoneinfo/MET | Bin .../site-packages/pytz/zoneinfo/MST | Bin .../site-packages/pytz/zoneinfo/MST7MDT | Bin .../pytz/zoneinfo/Mexico/BajaNorte | Bin .../pytz/zoneinfo/Mexico/BajaSur | Bin .../pytz/zoneinfo/Mexico/General | Bin .../site-packages/pytz/zoneinfo/NZ | Bin .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin .../site-packages/pytz/zoneinfo/Navajo | Bin .../site-packages/pytz/zoneinfo/PRC | Bin .../site-packages/pytz/zoneinfo/PST8PDT | Bin .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin .../pytz/zoneinfo/Pacific/Auckland | Bin .../pytz/zoneinfo/Pacific/Bougainville | Bin .../pytz/zoneinfo/Pacific/Chatham | Bin .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin .../pytz/zoneinfo/Pacific/Easter | Bin .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin .../pytz/zoneinfo/Pacific/Enderbury | Bin .../pytz/zoneinfo/Pacific/Fakaofo | Bin .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin .../pytz/zoneinfo/Pacific/Funafuti | Bin .../pytz/zoneinfo/Pacific/Galapagos | Bin .../pytz/zoneinfo/Pacific/Gambier | Bin .../pytz/zoneinfo/Pacific/Guadalcanal | Bin .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin .../pytz/zoneinfo/Pacific/Honolulu | Bin .../pytz/zoneinfo/Pacific/Johnston | Bin .../pytz/zoneinfo/Pacific/Kanton | Bin .../pytz/zoneinfo/Pacific/Kiritimati | Bin .../pytz/zoneinfo/Pacific/Kosrae | Bin .../pytz/zoneinfo/Pacific/Kwajalein | Bin .../pytz/zoneinfo/Pacific/Majuro | Bin .../pytz/zoneinfo/Pacific/Marquesas | Bin .../pytz/zoneinfo/Pacific/Midway | Bin .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin .../pytz/zoneinfo/Pacific/Norfolk | Bin .../pytz/zoneinfo/Pacific/Noumea | Bin .../pytz/zoneinfo/Pacific/Pago_Pago | Bin .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin .../pytz/zoneinfo/Pacific/Pitcairn | Bin .../pytz/zoneinfo/Pacific/Pohnpei | Bin .../pytz/zoneinfo/Pacific/Ponape | Bin .../pytz/zoneinfo/Pacific/Port_Moresby | Bin .../pytz/zoneinfo/Pacific/Rarotonga | Bin .../pytz/zoneinfo/Pacific/Saipan | Bin .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin .../pytz/zoneinfo/Pacific/Tahiti | Bin .../pytz/zoneinfo/Pacific/Tarawa | Bin .../pytz/zoneinfo/Pacific/Tongatapu | Bin .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin .../pytz/zoneinfo/Pacific/Wallis | Bin .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin .../site-packages/pytz/zoneinfo/Poland | Bin .../site-packages/pytz/zoneinfo/Portugal | Bin .../site-packages/pytz/zoneinfo/ROC | Bin .../site-packages/pytz/zoneinfo/ROK | Bin .../site-packages/pytz/zoneinfo/Singapore | Bin .../site-packages/pytz/zoneinfo/Turkey | Bin .../site-packages/pytz/zoneinfo/UCT | Bin .../site-packages/pytz/zoneinfo/US/Alaska | Bin .../site-packages/pytz/zoneinfo/US/Aleutian | Bin .../site-packages/pytz/zoneinfo/US/Arizona | Bin .../site-packages/pytz/zoneinfo/US/Central | Bin .../pytz/zoneinfo/US/East-Indiana | Bin .../site-packages/pytz/zoneinfo/US/Eastern | Bin .../site-packages/pytz/zoneinfo/US/Hawaii | Bin .../pytz/zoneinfo/US/Indiana-Starke | Bin .../site-packages/pytz/zoneinfo/US/Michigan | Bin .../site-packages/pytz/zoneinfo/US/Mountain | Bin .../site-packages/pytz/zoneinfo/US/Pacific | Bin .../site-packages/pytz/zoneinfo/US/Samoa | Bin .../site-packages/pytz/zoneinfo/UTC | Bin .../site-packages/pytz/zoneinfo/Universal | Bin .../site-packages/pytz/zoneinfo/W-SU | Bin .../site-packages/pytz/zoneinfo/WET | Bin .../site-packages/pytz/zoneinfo/Zulu | Bin .../site-packages/pytz/zoneinfo/iso3166.tab | 279 + .../site-packages/pytz/zoneinfo/leapseconds | 79 + .../site-packages/pytz/zoneinfo/tzdata.zi | 4294 +++++ .../site-packages/pytz/zoneinfo/zone.tab | 448 + .../site-packages/pytz/zoneinfo/zone1970.tab | 375 + .../site-packages/pytz/zoneinfo/zonenow.tab | 303 + .../redis-4.5.5.dist-info}/INSTALLER | 0 .../redis-4.5.5.dist-info/LICENSE | 0 .../redis-4.5.5.dist-info/METADATA | 0 .../redis-4.5.5.dist-info/RECORD | 133 + .../redis-4.5.5.dist-info}/REQUESTED | 0 .../site-packages/redis-4.5.5.dist-info/WHEEL | 0 .../redis-4.5.5.dist-info/top_level.txt | 0 .../site-packages/redis/__init__.py | 0 .../site-packages/redis/asyncio/__init__.py | 0 .../site-packages/redis/asyncio/client.py | 0 .../site-packages/redis/asyncio/cluster.py | 0 .../site-packages/redis/asyncio/connection.py | 0 .../site-packages/redis/asyncio/lock.py | 0 .../site-packages/redis/asyncio/parser.py | 0 .../site-packages/redis/asyncio/retry.py | 0 .../site-packages/redis/asyncio/sentinel.py | 0 .../site-packages/redis/asyncio/utils.py | 0 .../site-packages/redis/backoff.py | 0 .../python3.10}/site-packages/redis/client.py | 0 .../site-packages/redis/cluster.py | 0 .../site-packages/redis/commands/__init__.py | 0 .../redis/commands/bf/__init__.py | 0 .../redis/commands/bf/commands.py | 0 .../site-packages/redis/commands/bf/info.py | 0 .../site-packages/redis/commands/cluster.py | 0 .../site-packages/redis/commands/core.py | 0 .../redis/commands/graph/__init__.py | 0 .../redis/commands/graph/commands.py | 0 .../redis/commands/graph/edge.py | 0 .../redis/commands/graph/exceptions.py | 0 .../redis/commands/graph/execution_plan.py | 0 .../redis/commands/graph/node.py | 0 .../redis/commands/graph/path.py | 0 .../redis/commands/graph/query_result.py | 0 .../site-packages/redis/commands/helpers.py | 0 .../redis/commands/json/__init__.py | 0 .../redis/commands/json/_util.py | 0 .../redis/commands/json/commands.py | 0 .../redis/commands/json/decoders.py | 0 .../site-packages/redis/commands/json/path.py | 0 .../site-packages/redis/commands/parser.py | 0 .../redis/commands/redismodules.py | 0 .../redis/commands/search/__init__.py | 0 .../redis/commands/search/_util.py | 0 .../redis/commands/search/aggregation.py | 0 .../redis/commands/search/commands.py | 0 .../redis/commands/search/document.py | 0 .../redis/commands/search/field.py | 0 .../redis/commands/search/indexDefinition.py | 0 .../redis/commands/search/query.py | 0 .../redis/commands/search/querystring.py | 0 .../redis/commands/search/reducers.py | 0 .../redis/commands/search/result.py | 0 .../redis/commands/search/suggestion.py | 0 .../site-packages/redis/commands/sentinel.py | 0 .../redis/commands/timeseries/__init__.py | 0 .../redis/commands/timeseries/commands.py | 0 .../redis/commands/timeseries/info.py | 0 .../redis/commands/timeseries/utils.py | 0 .../python3.10}/site-packages/redis/compat.py | 0 .../site-packages/redis/connection.py | 0 .../python3.10}/site-packages/redis/crc.py | 0 .../site-packages/redis/credentials.py | 0 .../site-packages/redis/exceptions.py | 0 .../python3.10}/site-packages/redis/lock.py | 0 .../python3.10}/site-packages/redis/ocsp.py | 0 .../python3.10}/site-packages/redis/retry.py | 0 .../site-packages/redis/sentinel.py | 0 .../python3.10}/site-packages/redis/typing.py | 0 .../python3.10}/site-packages/redis/utils.py | 0 .../requests-2.31.0.dist-info}/INSTALLER | 0 .../requests-2.31.0.dist-info/LICENSE | 0 .../requests-2.31.0.dist-info/METADATA | 0 .../requests-2.31.0.dist-info/RECORD | 43 + .../requests-2.31.0.dist-info}/REQUESTED | 0 .../requests-2.31.0.dist-info/WHEEL | 0 .../requests-2.31.0.dist-info/top_level.txt | 0 .../site-packages/requests/__init__.py | 0 .../site-packages/requests/__version__.py | 0 .../site-packages/requests/_internal_utils.py | 0 .../site-packages/requests/adapters.py | 0 .../python3.10}/site-packages/requests/api.py | 0 .../site-packages}/requests/auth.py | 0 .../site-packages/requests/certs.py | 0 .../site-packages/requests/compat.py | 0 .../site-packages}/requests/cookies.py | 0 .../site-packages/requests/exceptions.py | 0 .../site-packages/requests/help.py | 0 .../site-packages}/requests/hooks.py | 0 .../site-packages/requests/models.py | 0 .../site-packages/requests/packages.py | 0 .../site-packages/requests/sessions.py | 0 .../site-packages}/requests/status_codes.py | 0 .../site-packages}/requests/structures.py | 0 .../site-packages/requests/utils.py | 0 .../requests_file-1.5.1.dist-info}/INSTALLER | 0 .../requests_file-1.5.1.dist-info/LICENSE | 0 .../requests_file-1.5.1.dist-info/METADATA | 0 .../requests_file-1.5.1.dist-info/RECORD | 9 + .../requests_file-1.5.1.dist-info}/REQUESTED | 0 .../requests_file-1.5.1.dist-info}/WHEEL | 0 .../top_level.txt | 0 .../site-packages/requests_file.py | 0 .../schedule-1.2.0.dist-info/AUTHORS.rst | 0 .../schedule-1.2.0.dist-info}/INSTALLER | 0 .../schedule-1.2.0.dist-info/LICENSE.txt | 0 .../schedule-1.2.0.dist-info/METADATA | 0 .../schedule-1.2.0.dist-info/RECORD | 11 + .../schedule-1.2.0.dist-info}/REQUESTED | 0 .../schedule-1.2.0.dist-info/WHEEL | 0 .../schedule-1.2.0.dist-info/top_level.txt | 0 .../site-packages/schedule/__init__.py | 0 .../site-packages/schedule/py.typed | 0 .../selenium-3.14.1.dist-info/DESCRIPTION.rst | 0 .../selenium-3.14.1.dist-info}/INSTALLER | 0 .../selenium-3.14.1.dist-info/METADATA | 0 .../selenium-3.14.1.dist-info/RECORD | 184 + .../selenium-3.14.1.dist-info}/REQUESTED | 0 .../selenium-3.14.1.dist-info/WHEEL | 0 .../selenium-3.14.1.dist-info/metadata.json | 0 .../selenium-3.14.1.dist-info/top_level.txt | 0 .../site-packages/selenium/__init__.py | 0 .../site-packages/selenium/common/__init__.py | 0 .../selenium/common/exceptions.py | 0 .../selenium/webdriver/__init__.py | 0 .../selenium/webdriver/android/__init__.py | 0 .../selenium/webdriver/android/webdriver.py | 0 .../selenium/webdriver/blackberry/__init__.py | 0 .../webdriver/blackberry/webdriver.py | 0 .../selenium/webdriver/chrome/__init__.py | 0 .../selenium/webdriver/chrome/options.py | 0 .../webdriver/chrome/remote_connection.py | 0 .../selenium/webdriver/chrome/service.py | 0 .../selenium/webdriver/chrome/webdriver.py | 0 .../selenium/webdriver/common/__init__.py | 0 .../webdriver/common/action_chains.py | 0 .../webdriver/common/actions/__init__.py | 0 .../common/actions/action_builder.py | 0 .../webdriver/common/actions/input_device.py | 0 .../webdriver/common/actions/interaction.py | 0 .../webdriver/common/actions/key_actions.py | 0 .../webdriver/common/actions/key_input.py | 0 .../webdriver/common/actions/mouse_button.py | 0 .../common/actions/pointer_actions.py | 0 .../webdriver/common/actions/pointer_input.py | 0 .../selenium/webdriver/common/alert.py | 0 .../selenium/webdriver/common/by.py | 0 .../webdriver/common/desired_capabilities.py | 0 .../webdriver/common/html5/__init__.py | 0 .../common/html5/application_cache.py | 0 .../selenium/webdriver/common/keys.py | 0 .../selenium/webdriver/common/proxy.py | 0 .../selenium/webdriver/common/service.py | 0 .../webdriver/common/touch_actions.py | 0 .../selenium/webdriver/common/utils.py | 0 .../selenium/webdriver/edge/__init__.py | 0 .../selenium/webdriver/edge/options.py | 0 .../selenium/webdriver/edge/service.py | 0 .../selenium/webdriver/edge/webdriver.py | 0 .../selenium/webdriver/firefox/__init__.py | 0 .../firefox/amd64/x_ignore_nofocus.so | Bin .../webdriver/firefox/extension_connection.py | 0 .../webdriver/firefox/firefox_binary.py | 0 .../webdriver/firefox/firefox_profile.py | 0 .../selenium/webdriver/firefox/options.py | 0 .../webdriver/firefox/remote_connection.py | 0 .../selenium/webdriver/firefox/service.py | 0 .../selenium/webdriver/firefox/webdriver.py | 0 .../selenium/webdriver/firefox/webdriver.xpi | Bin .../webdriver/firefox/webdriver_prefs.json | 0 .../selenium/webdriver/firefox/webelement.py | 0 .../webdriver/firefox/x86/x_ignore_nofocus.so | Bin .../selenium/webdriver/ie/__init__.py | 0 .../selenium/webdriver/ie/options.py | 0 .../selenium/webdriver/ie/service.py | 0 .../selenium/webdriver/ie/webdriver.py | 0 .../selenium/webdriver/opera/__init__.py | 0 .../selenium/webdriver/opera/options.py | 0 .../selenium/webdriver/opera/webdriver.py | 0 .../selenium/webdriver/phantomjs/__init__.py | 0 .../selenium/webdriver/phantomjs/service.py | 0 .../selenium/webdriver/phantomjs/webdriver.py | 0 .../selenium/webdriver/remote/__init__.py | 0 .../selenium/webdriver/remote/command.py | 0 .../selenium/webdriver/remote/errorhandler.py | 0 .../webdriver/remote/file_detector.py | 0 .../selenium/webdriver/remote/getAttribute.js | 0 .../selenium/webdriver/remote/isDisplayed.js | 0 .../selenium/webdriver/remote/mobile.py | 0 .../webdriver/remote/remote_connection.py | 0 .../selenium/webdriver/remote/switch_to.py | 0 .../selenium/webdriver/remote/utils.py | 0 .../selenium/webdriver/remote/webdriver.py | 0 .../selenium/webdriver/remote/webelement.py | 0 .../selenium/webdriver/safari/__init__.py | 0 .../selenium/webdriver/safari/permissions.py | 0 .../webdriver/safari/remote_connection.py | 0 .../selenium/webdriver/safari/service.py | 0 .../selenium/webdriver/safari/webdriver.py | 0 .../selenium/webdriver/support/__init__.py | 0 .../support/abstract_event_listener.py | 0 .../selenium/webdriver/support/color.py | 0 .../support/event_firing_webdriver.py | 0 .../selenium/webdriver/support/events.py | 0 .../webdriver/support/expected_conditions.py | 0 .../selenium/webdriver/support/select.py | 0 .../selenium/webdriver/support/ui.py | 0 .../selenium/webdriver/support/wait.py | 0 .../selenium/webdriver/webkitgtk/__init__.py | 0 .../selenium/webdriver/webkitgtk/options.py | 0 .../selenium/webdriver/webkitgtk/service.py | 0 .../selenium/webdriver/webkitgtk/webdriver.py | 0 .../INSTALLER | 0 .../selenium_requests-1.3.dist-info/LICENSE | 21 + .../selenium_requests-1.3.dist-info/METADATA | 88 + .../selenium_requests-1.3.dist-info/RECORD | 11 + .../REQUESTED | 0 .../selenium_requests-1.3.dist-info/WHEEL | 5 + .../top_level.txt | 0 .../seleniumrequests/__init__.py | 0 .../site-packages/seleniumrequests/request.py | 0 .../setuptools-59.6.0.dist-info}/INSTALLER | 0 .../setuptools-59.6.0.dist-info}/LICENSE | 0 .../setuptools-59.6.0.dist-info/METADATA | 124 + .../setuptools-59.6.0.dist-info/RECORD | 298 + .../setuptools-59.6.0.dist-info}/REQUESTED | 0 .../setuptools-59.6.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-59.6.0.dist-info/top_level.txt | 4 + .../site-packages/setuptools/__init__.py | 242 + .../setuptools/_deprecation_warning.py | 0 .../setuptools/_distutils/__init__.py | 24 + .../setuptools/_distutils/_msvccompiler.py | 561 + .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1123 ++ .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 + .../_distutils/command/bdist_rpm.py | 579 + .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 755 + .../setuptools/_distutils/command/build_py.py | 392 + .../_distutils/command/build_scripts.py | 152 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 721 + .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 84 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 249 + .../setuptools/_distutils/cygwinccompiler.py | 425 + .../setuptools/_distutils/debug.py | 0 .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 ++ .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 355 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 + .../setuptools/_distutils/msvccompiler.py | 643 + .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 106 + .../setuptools/_distutils/sysconfig.py | 601 + .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 325 + .../setuptools/_distutils/util.py | 548 + .../setuptools/_distutils/version.py | 363 + .../setuptools/_distutils/versionpredicate.py | 169 + .../site-packages/setuptools/_imp.py | 0 .../setuptools/_vendor}/__init__.py | 0 .../_vendor/more_itertools/__init__.py | 0 .../setuptools/_vendor/more_itertools/more.py | 3825 ++++ .../_vendor/more_itertools/recipes.py | 0 .../setuptools/_vendor/ordered_set.py | 0 .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 0 .../_vendor/packaging/_manylinux.py | 0 .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 67 + .../setuptools/_vendor/packaging/markers.py | 0 .../_vendor/packaging/requirements.py | 0 .../_vendor/packaging/specifiers.py | 828 + .../setuptools/_vendor/packaging/tags.py | 484 + .../setuptools/_vendor/packaging/utils.py | 0 .../setuptools}/_vendor/packaging/version.py | 0 .../setuptools/_vendor/pyparsing.py | 5742 ++++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 290 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 137216 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../site-packages/setuptools/command/alias.py | 0 .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 0 .../setuptools/command/build_clib.py | 0 .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 242 + .../setuptools/command/develop.py | 0 .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2354 +++ .../setuptools/command/egg_info.py | 755 + .../setuptools/command/install.py | 132 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 148 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 0 .../setuptools/command/py36compat.py | 0 .../setuptools/command/register.py | 0 .../setuptools/command/rotate.py | 0 .../setuptools/command/saveopts.py | 0 .../site-packages/setuptools/command/sdist.py | 196 + .../setuptools/command/setopt.py | 0 .../site-packages/setuptools/command/test.py | 252 + .../setuptools/command/upload.py | 0 .../setuptools/command/upload_docs.py | 202 + .../site-packages/setuptools/config.py | 751 + .../site-packages/setuptools/dep_util.py | 0 .../site-packages/setuptools/depends.py | 0 .../site-packages/setuptools/dist.py | 1156 ++ .../site-packages/setuptools/errors.py | 40 + .../site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../site-packages/setuptools/glob.py | 0 .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 137728 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 0 .../site-packages/setuptools/launch.py | 0 .../site-packages/setuptools/monkey.py | 177 + .../site-packages/setuptools/msvc.py | 1805 ++ .../site-packages/setuptools/namespaces.py | 0 .../site-packages/setuptools/package_index.py | 1127 ++ .../site-packages/setuptools/py34compat.py | 0 .../site-packages/setuptools/sandbox.py | 0 .../setuptools/script (dev).tmpl | 0 .../site-packages/setuptools/script.tmpl | 0 .../site-packages/setuptools/unicode_utils.py | 0 .../site-packages/setuptools/version.py | 0 .../site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../six-1.16.0.dist-info}/INSTALLER | 0 .../six-1.16.0.dist-info/LICENSE | 0 .../six-1.16.0.dist-info/METADATA | 0 .../site-packages/six-1.16.0.dist-info/RECORD | 9 + .../six-1.16.0.dist-info}/REQUESTED | 0 .../site-packages/six-1.16.0.dist-info/WHEEL | 0 .../six-1.16.0.dist-info/top_level.txt | 0 .../lib/python3.10}/site-packages/six.py | 0 .../soupsieve-2.4.1.dist-info}/INSTALLER | 0 .../soupsieve-2.4.1.dist-info/METADATA | 0 .../soupsieve-2.4.1.dist-info/RECORD | 21 + .../soupsieve-2.4.1.dist-info}/REQUESTED | 0 .../soupsieve-2.4.1.dist-info/WHEEL | 0 .../licenses/LICENSE.md | 0 .../site-packages/soupsieve/__init__.py | 0 .../site-packages/soupsieve/__meta__.py | 0 .../site-packages/soupsieve/css_match.py | 0 .../site-packages/soupsieve/css_parser.py | 0 .../site-packages/soupsieve/css_types.py | 0 .../site-packages/soupsieve/pretty.py | 0 .../site-packages/soupsieve/py.typed | 0 .../site-packages/soupsieve/util.py | 0 .../tldextract-3.4.4.dist-info}/INSTALLER | 0 .../tldextract-3.4.4.dist-info/LICENSE | 0 .../tldextract-3.4.4.dist-info/METADATA | 0 .../tldextract-3.4.4.dist-info/RECORD | 27 + .../tldextract-3.4.4.dist-info}/REQUESTED | 0 .../tldextract-3.4.4.dist-info/WHEEL | 0 .../entry_points.txt | 0 .../tldextract-3.4.4.dist-info/top_level.txt | 0 .../tldextract/.tld_set_snapshot | 0 .../site-packages/tldextract/__init__.py | 0 .../site-packages/tldextract/__main__.py | 0 .../site-packages/tldextract/_version.py | 0 .../site-packages/tldextract/cache.py | 0 .../site-packages/tldextract/cli.py | 0 .../site-packages/tldextract/py.typed | 0 .../site-packages/tldextract/remote.py | 0 .../site-packages/tldextract/suffix_list.py | 0 .../site-packages/tldextract/tldextract.py | 0 .../INSTALLER | 0 .../typing_extensions-4.6.3.dist-info/LICENSE | 0 .../METADATA | 0 .../typing_extensions-4.6.3.dist-info/RECORD | 8 + .../REQUESTED | 0 .../typing_extensions-4.6.3.dist-info/WHEEL | 0 .../site-packages/typing_extensions.py | 0 .../tzlocal-5.2.dist-info}/INSTALLER | 0 .../tzlocal-5.2.dist-info}/LICENSE.txt | 0 .../tzlocal-5.2.dist-info/METADATA | 248 + .../tzlocal-5.2.dist-info/RECORD | 17 + .../site-packages/tzlocal-5.2.dist-info/WHEEL | 5 + .../tzlocal-5.2.dist-info}/top_level.txt | 0 .../site-packages/tzlocal/__init__.py | 19 + .../site-packages/tzlocal}/py.typed | 0 .../python3.10/site-packages/tzlocal/unix.py | 231 + .../python3.10/site-packages/tzlocal/utils.py | 112 + .../python3.10/site-packages/tzlocal/win32.py | 147 + .../site-packages/tzlocal/windows_tz.py | 736 + .../urllib3-1.26.2.dist-info}/INSTALLER | 0 .../urllib3-1.26.2.dist-info/LICENSE.txt | 0 .../urllib3-1.26.2.dist-info/METADATA | 0 .../urllib3-1.26.2.dist-info/RECORD | 85 + .../urllib3-1.26.2.dist-info}/REQUESTED | 0 .../urllib3-1.26.2.dist-info/WHEEL | 0 .../urllib3-1.26.2.dist-info/top_level.txt | 0 .../site-packages/urllib3/__init__.py | 85 + .../site-packages}/urllib3/_collections.py | 0 .../site-packages/urllib3/_version.py | 0 .../site-packages/urllib3/connection.py | 0 .../site-packages/urllib3/connectionpool.py | 0 .../urllib3/contrib}/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 0 .../contrib/_securetransport}/__init__.py | 0 .../contrib/_securetransport/bindings.py | 0 .../contrib/_securetransport/low_level.py | 0 .../urllib3/contrib/appengine.py | 0 .../site-packages/urllib3/contrib/ntlmpool.py | 0 .../urllib3/contrib/pyopenssl.py | 0 .../urllib3/contrib/securetransport.py | 0 .../site-packages/urllib3/contrib/socks.py | 0 .../site-packages/urllib3/exceptions.py | 0 .../site-packages/urllib3/fields.py | 0 .../site-packages/urllib3/filepost.py | 0 .../urllib3/packages/__init__.py | 0 .../urllib3/packages/backports}/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 0 .../site-packages/urllib3/packages/six.py | 0 .../packages/ssl_match_hostname/__init__.py | 0 .../ssl_match_hostname/_implementation.py | 0 .../site-packages/urllib3/poolmanager.py | 0 .../site-packages/urllib3/request.py | 0 .../site-packages/urllib3/response.py | 821 + .../site-packages/urllib3/util/__init__.py | 0 .../site-packages/urllib3/util/connection.py | 0 .../site-packages/urllib3/util/proxy.py | 0 .../site-packages/urllib3/util/queue.py | 0 .../site-packages/urllib3/util/request.py | 143 + .../site-packages/urllib3/util/response.py | 0 .../site-packages/urllib3/util/retry.py | 0 .../site-packages/urllib3/util/ssl_.py | 0 .../urllib3/util/ssltransport.py | 0 .../site-packages/urllib3/util/timeout.py | 0 .../site-packages/urllib3/util/url.py | 0 .../site-packages/urllib3/util/wait.py | 153 + .../websockets-11.0.3.dist-info}/INSTALLER | 0 .../websockets-11.0.3.dist-info/LICENSE | 0 .../websockets-11.0.3.dist-info/METADATA | 0 .../websockets-11.0.3.dist-info/RECORD | 88 + .../websockets-11.0.3.dist-info}/REQUESTED | 0 .../websockets-11.0.3.dist-info/WHEEL | 8 + .../websockets-11.0.3.dist-info/top_level.txt | 0 .../site-packages/websockets/__init__.py | 0 .../site-packages/websockets/__main__.py | 0 .../site-packages/websockets/auth.py | 0 .../site-packages/websockets/client.py | 0 .../site-packages/websockets/connection.py | 0 .../websockets/datastructures.py | 0 .../site-packages/websockets/exceptions.py | 0 .../websockets/extensions/__init__.py | 0 .../websockets/extensions/base.py | 0 .../extensions/permessage_deflate.py | 0 .../site-packages/websockets/frames.py | 0 .../site-packages/websockets/headers.py | 0 .../site-packages/websockets/http.py | 0 .../site-packages/websockets/http11.py | 0 .../site-packages/websockets/imports.py | 0 .../websockets/legacy}/__init__.py | 0 .../websockets/legacy/async_timeout.py | 0 .../site-packages/websockets/legacy/auth.py | 0 .../site-packages/websockets/legacy/client.py | 0 .../websockets/legacy/compatibility.py | 0 .../websockets/legacy/framing.py | 0 .../websockets/legacy/handshake.py | 0 .../site-packages/websockets/legacy/http.py | 0 .../websockets/legacy/protocol.py | 0 .../site-packages/websockets/legacy/server.py | 0 .../site-packages/websockets/protocol.py | 0 .../site-packages/websockets}/py.typed | 0 .../site-packages/websockets/server.py | 0 .../site-packages/websockets/speedups.c | 0 .../speedups.cpython-310-x86_64-linux-gnu.so | Bin 0 -> 33736 bytes .../site-packages/websockets/streams.py | 0 .../websockets/sync}/__init__.py | 0 .../site-packages/websockets/sync/client.py | 0 .../websockets/sync/compatibility.py | 0 .../websockets/sync/connection.py | 0 .../site-packages/websockets/sync/messages.py | 0 .../site-packages/websockets/sync/server.py | 0 .../site-packages/websockets/sync/utils.py | 0 .../site-packages/websockets/typing.py | 0 .../site-packages/websockets/uri.py | 0 .../site-packages/websockets/utils.py | 0 .../site-packages/websockets/version.py | 0 .../site-packages/werkzeug/__init__.py | 0 .../site-packages/werkzeug/_internal.py | 0 .../site-packages/werkzeug/_reloader.py | 0 .../site-packages/werkzeug/datastructures.py | 0 .../site-packages/werkzeug/datastructures.pyi | 0 .../site-packages/werkzeug/debug/__init__.py | 0 .../site-packages/werkzeug/debug/console.py | 0 .../site-packages/werkzeug/debug/repr.py | 0 .../werkzeug/debug/shared/ICON_LICENSE.md | 0 .../werkzeug/debug/shared/console.png | Bin .../werkzeug/debug/shared/debugger.js | 0 .../werkzeug/debug/shared/less.png | Bin .../werkzeug/debug/shared/more.png | Bin .../werkzeug/debug/shared/style.css | 0 .../site-packages/werkzeug/debug/tbtools.py | 0 .../site-packages/werkzeug/exceptions.py | 0 .../site-packages/werkzeug/formparser.py | 0 .../site-packages/werkzeug/http.py | 0 .../site-packages/werkzeug/local.py | 0 .../werkzeug/middleware/__init__.py | 0 .../werkzeug/middleware/dispatcher.py | 0 .../werkzeug/middleware/http_proxy.py | 0 .../site-packages/werkzeug/middleware/lint.py | 0 .../werkzeug/middleware/profiler.py | 0 .../werkzeug/middleware/proxy_fix.py | 0 .../werkzeug/middleware/shared_data.py | 0 .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 0 .../werkzeug/routing/converters.py | 0 .../werkzeug/routing/exceptions.py | 0 .../site-packages/werkzeug/routing/map.py | 0 .../site-packages/werkzeug/routing/matcher.py | 0 .../site-packages/werkzeug/routing/rules.py | 0 .../werkzeug/sansio}/__init__.py | 0 .../site-packages/werkzeug/sansio/http.py | 0 .../werkzeug/sansio/multipart.py | 0 .../site-packages/werkzeug/sansio/request.py | 0 .../site-packages/werkzeug/sansio/response.py | 0 .../site-packages/werkzeug/sansio/utils.py | 0 .../site-packages/werkzeug/security.py | 0 .../site-packages/werkzeug/serving.py | 0 .../site-packages/werkzeug/test.py | 0 .../site-packages/werkzeug/testapp.py | 0 .../site-packages/werkzeug/urls.py | 0 .../site-packages/werkzeug/user_agent.py | 0 .../site-packages/werkzeug/utils.py | 0 .../werkzeug/wrappers/__init__.py | 0 .../werkzeug/wrappers/request.py | 0 .../werkzeug/wrappers/response.py | 0 .../site-packages/werkzeug/wsgi.py | 0 .../wget-3.2.dist-info}/INSTALLER | 0 .../site-packages/wget-3.2.dist-info/METADATA | 128 + .../site-packages/wget-3.2.dist-info/RECORD | 8 + .../wget-3.2.dist-info}/REQUESTED | 0 .../site-packages/wget-3.2.dist-info/WHEEL | 5 + .../wget-3.2.dist-info}/top_level.txt | 0 .../lib/python3.10}/site-packages/wget.py | 0 .../yt_dlp-2023.10.13.dist-info}/AUTHORS | 0 .../yt_dlp-2023.10.13.dist-info/INSTALLER | 0 .../yt_dlp-2023.10.13.dist-info}/LICENSE | 0 .../yt_dlp-2023.10.13.dist-info/METADATA | 2316 +++ .../yt_dlp-2023.10.13.dist-info/RECORD | 2309 +++ .../yt_dlp-2023.10.13.dist-info/REQUESTED | 0 .../yt_dlp-2023.10.13.dist-info/WHEEL | 6 + .../entry_points.txt | 0 .../top_level.txt | 0 .../site-packages/yt_dlp/YoutubeDL.py | 4272 +++++ .../site-packages/yt_dlp/__init__.py | 1032 + .../site-packages/yt_dlp/__main__.py | 0 .../yt_dlp/__pyinstaller/__init__.py | 0 .../yt_dlp/__pyinstaller/hook-yt_dlp.py | 32 + .../python3.10}/site-packages/yt_dlp/aes.py | 0 .../python3.10}/site-packages/yt_dlp/cache.py | 0 .../site-packages/yt_dlp/casefold.py | 5 + .../site-packages/yt_dlp/compat/__init__.py | 79 + .../yt_dlp/compat/_deprecated.py | 23 + .../site-packages/yt_dlp/compat/_legacy.py | 108 + .../yt_dlp/compat/compat_utils.py | 83 + .../site-packages/yt_dlp/compat/functools.py | 0 .../site-packages/yt_dlp/compat/imghdr.py | 0 .../site-packages/yt_dlp/compat/shutil.py | 0 .../site-packages/yt_dlp/compat/types.py | 13 + .../yt_dlp/compat/urllib/__init__.py | 10 + .../yt_dlp/compat/urllib/request.py | 40 + .../site-packages/yt_dlp/cookies.py | 1324 ++ .../yt_dlp/dependencies/Cryptodome.py | 38 + .../yt_dlp/dependencies/__init__.py | 85 + .../yt_dlp/downloader/__init__.py | 131 + .../site-packages/yt_dlp/downloader/common.py | 486 + .../site-packages/yt_dlp/downloader/dash.py | 0 .../yt_dlp/downloader/external.py | 664 + .../site-packages/yt_dlp/downloader/f4m.py | 427 + .../site-packages/yt_dlp/downloader/fc2.py | 0 .../yt_dlp/downloader/fragment.py | 527 + .../site-packages/yt_dlp/downloader/hls.py | 375 + .../site-packages/yt_dlp/downloader/http.py | 378 + .../site-packages/yt_dlp/downloader/ism.py | 283 + .../site-packages/yt_dlp/downloader/mhtml.py | 0 .../yt_dlp/downloader/niconico.py | 146 + .../site-packages/yt_dlp/downloader/rtmp.py | 0 .../site-packages/yt_dlp/downloader/rtsp.py | 0 .../yt_dlp/downloader/websocket.py | 0 .../yt_dlp/downloader/youtube_live_chat.py | 228 + .../yt_dlp/extractor/__init__.py | 0 .../yt_dlp/extractor/_extractors.py | 2574 +++ .../site-packages/yt_dlp/extractor/abc.py | 409 + .../site-packages/yt_dlp/extractor/abcnews.py | 0 .../site-packages/yt_dlp/extractor/abcotvs.py | 0 .../site-packages/yt_dlp/extractor/abematv.py | 475 + .../yt_dlp/extractor/academicearth.py | 0 .../site-packages/yt_dlp/extractor/acast.py | 143 + .../site-packages/yt_dlp/extractor/acfun.py | 0 .../site-packages/yt_dlp/extractor/adn.py | 257 + .../yt_dlp/extractor/adobeconnect.py | 0 .../yt_dlp/extractor/adobepass.py | 1778 ++ .../site-packages/yt_dlp/extractor/adobetv.py | 0 .../yt_dlp/extractor/adultswim.py | 199 + .../yt_dlp/extractor/aenetworks.py | 350 + .../site-packages/yt_dlp/extractor/aeonco.py | 74 + .../yt_dlp/extractor/afreecatv.py | 484 + .../site-packages/yt_dlp/extractor/agora.py | 0 .../yt_dlp/extractor/airmozilla.py | 0 .../site-packages/yt_dlp/extractor/airtv.py | 0 .../site-packages/yt_dlp/extractor/aitube.py | 0 .../yt_dlp/extractor/aliexpress.py | 0 .../yt_dlp/extractor/aljazeera.py | 0 .../yt_dlp/extractor/allocine.py | 0 .../yt_dlp/extractor/alphaporno.py | 0 .../yt_dlp/extractor/alsace20tv.py | 0 .../site-packages/yt_dlp/extractor/alura.py | 0 .../site-packages/yt_dlp/extractor/amara.py | 0 .../site-packages/yt_dlp/extractor/amazon.py | 0 .../yt_dlp/extractor/amazonminitv.py | 294 + .../yt_dlp/extractor/amcnetworks.py | 147 + .../yt_dlp/extractor/americastestkitchen.py | 0 .../site-packages/yt_dlp/extractor/amp.py | 101 + .../yt_dlp/extractor/anchorfm.py | 0 .../site-packages/yt_dlp/extractor/angel.py | 0 .../site-packages/yt_dlp/extractor/antenna.py | 143 + .../site-packages/yt_dlp/extractor/anvato.py | 404 + .../site-packages/yt_dlp/extractor/aol.py | 0 .../site-packages/yt_dlp/extractor/apa.py | 0 .../site-packages/yt_dlp/extractor/aparat.py | 0 .../yt_dlp/extractor/appleconnect.py | 0 .../yt_dlp/extractor/applepodcasts.py | 0 .../yt_dlp/extractor/appletrailers.py | 0 .../yt_dlp/extractor/archiveorg.py | 948 + .../yt_dlp/extractor/arcpublishing.py | 0 .../site-packages/yt_dlp/extractor/ard.py | 673 + .../site-packages/yt_dlp/extractor/arkena.py | 0 .../site-packages/yt_dlp/extractor/arnes.py | 0 .../site-packages/yt_dlp/extractor/arte.py | 317 + .../yt_dlp/extractor/atresplayer.py | 104 + .../yt_dlp/extractor/atscaleconf.py | 0 .../yt_dlp/extractor/atttechchannel.py | 0 .../site-packages/yt_dlp/extractor/atvat.py | 0 .../yt_dlp/extractor/audimedia.py | 0 .../yt_dlp/extractor/audioboom.py | 0 .../yt_dlp/extractor/audiodraft.py | 0 .../yt_dlp/extractor/audiomack.py | 0 .../site-packages/yt_dlp/extractor/audius.py | 0 .../site-packages/yt_dlp/extractor/awaan.py | 0 .../site-packages/yt_dlp/extractor/aws.py | 75 + .../site-packages/yt_dlp/extractor/axs.py | 87 + .../yt_dlp/extractor/azmedien.py | 0 .../site-packages/yt_dlp/extractor/baidu.py | 0 .../site-packages/yt_dlp/extractor/banbye.py | 168 + .../yt_dlp/extractor/bandaichannel.py | 0 .../yt_dlp/extractor/bandcamp.py | 0 .../yt_dlp/extractor/bannedvideo.py | 0 .../site-packages/yt_dlp/extractor/bbc.py | 1651 ++ .../yt_dlp/extractor/beatbump.py | 0 .../yt_dlp/extractor/beatport.py | 0 .../site-packages/yt_dlp/extractor/beeg.py | 0 .../yt_dlp/extractor/behindkink.py | 0 .../yt_dlp/extractor/bellmedia.py | 0 .../yt_dlp/extractor/berufetv.py | 0 .../site-packages/yt_dlp/extractor/bet.py | 0 .../site-packages/yt_dlp/extractor/bfi.py | 0 .../site-packages/yt_dlp/extractor/bfmtv.py | 0 .../site-packages/yt_dlp/extractor/bibeltv.py | 197 + .../site-packages/yt_dlp/extractor/bigflix.py | 0 .../site-packages/yt_dlp/extractor/bigo.py | 0 .../site-packages/yt_dlp/extractor/bild.py | 63 + .../yt_dlp/extractor/bilibili.py | 1747 ++ .../yt_dlp/extractor/biobiochiletv.py | 0 .../site-packages/yt_dlp/extractor/biqle.py | 0 .../yt_dlp/extractor/bitchute.py | 236 + .../site-packages/yt_dlp/extractor/bitwave.py | 0 .../yt_dlp/extractor/blackboardcollaborate.py | 0 .../yt_dlp/extractor/bleacherreport.py | 0 .../site-packages/yt_dlp/extractor/blerp.py | 0 .../site-packages/yt_dlp/extractor/blogger.py | 0 .../yt_dlp/extractor/bloomberg.py | 0 .../site-packages/yt_dlp/extractor/bokecc.py | 0 .../yt_dlp/extractor/bongacams.py | 0 .../yt_dlp/extractor/bostonglobe.py | 0 .../site-packages/yt_dlp/extractor/box.py | 0 .../site-packages/yt_dlp/extractor/boxcast.py | 0 .../site-packages/yt_dlp/extractor/bpb.py | 170 + .../site-packages/yt_dlp/extractor/br.py | 0 .../yt_dlp/extractor/brainpop.py | 318 + .../site-packages/yt_dlp/extractor/bravotv.py | 189 + .../yt_dlp/extractor/breakcom.py | 0 .../yt_dlp/extractor/breitbart.py | 34 + .../yt_dlp/extractor/brightcove.py | 952 + .../yt_dlp/extractor/brilliantpala.py | 127 + .../yt_dlp/extractor/bundesliga.py | 0 .../yt_dlp/extractor/businessinsider.py | 0 .../yt_dlp/extractor/buzzfeed.py | 0 .../site-packages/yt_dlp/extractor/byutv.py | 0 .../site-packages/yt_dlp/extractor/c56.py | 0 .../site-packages/yt_dlp/extractor/cableav.py | 0 .../site-packages/yt_dlp/extractor/callin.py | 0 .../yt_dlp/extractor/caltrans.py | 0 .../site-packages/yt_dlp/extractor/cam4.py | 0 .../site-packages/yt_dlp/extractor/camdemy.py | 0 .../site-packages/yt_dlp/extractor/camfm.py | 85 + .../yt_dlp/extractor/cammodels.py | 0 .../site-packages/yt_dlp/extractor/camsoda.py | 0 .../yt_dlp/extractor/camtasia.py | 0 .../yt_dlp/extractor/camwithher.py | 0 .../site-packages/yt_dlp/extractor/canal1.py | 39 + .../yt_dlp/extractor/canalalpha.py | 0 .../site-packages/yt_dlp/extractor/canalc2.py | 0 .../yt_dlp/extractor/canalplus.py | 110 + .../yt_dlp/extractor/caracoltv.py | 136 + .../yt_dlp/extractor/carambatv.py | 0 .../yt_dlp/extractor/cartoonnetwork.py | 0 .../site-packages/yt_dlp/extractor/cbc.py | 633 + .../site-packages/yt_dlp/extractor/cbs.py | 279 + .../yt_dlp/extractor/cbsinteractive.py | 0 .../site-packages/yt_dlp/extractor/cbsnews.py | 443 + .../yt_dlp/extractor/cbssports.py | 0 .../site-packages/yt_dlp/extractor/ccc.py | 115 + .../site-packages/yt_dlp/extractor/ccma.py | 0 .../site-packages/yt_dlp/extractor/cctv.py | 0 .../site-packages/yt_dlp/extractor/cda.py | 0 .../yt_dlp/extractor/cellebrite.py | 0 .../yt_dlp/extractor/ceskatelevize.py | 289 + .../site-packages/yt_dlp/extractor/cgtn.py | 0 .../yt_dlp/extractor/channel9.py | 0 .../yt_dlp/extractor/charlierose.py | 0 .../yt_dlp/extractor/chaturbate.py | 0 .../yt_dlp/extractor/chilloutzone.py | 123 + .../yt_dlp/extractor/chingari.py | 0 .../site-packages/yt_dlp/extractor/chirbit.py | 0 .../yt_dlp/extractor/cinchcast.py | 0 .../site-packages/yt_dlp/extractor/cinemax.py | 0 .../yt_dlp/extractor/cinetecamilano.py | 61 + .../yt_dlp/extractor/cineverse.py | 136 + .../yt_dlp/extractor/ciscolive.py | 0 .../yt_dlp/extractor/ciscowebex.py | 106 + .../site-packages/yt_dlp/extractor/cjsw.py | 0 .../yt_dlp/extractor/clipchamp.py | 61 + .../yt_dlp/extractor/cliphunter.py | 0 .../site-packages/yt_dlp/extractor/clippit.py | 0 .../site-packages/yt_dlp/extractor/cliprs.py | 0 .../yt_dlp/extractor/clipsyndicate.py | 0 .../yt_dlp/extractor/closertotruth.py | 0 .../yt_dlp/extractor/cloudflarestream.py | 0 .../site-packages/yt_dlp/extractor/cloudy.py | 0 .../site-packages/yt_dlp/extractor/clubic.py | 0 .../site-packages/yt_dlp/extractor/clyp.py | 0 .../site-packages/yt_dlp/extractor/cmt.py | 0 .../site-packages/yt_dlp/extractor/cnbc.py | 68 + .../site-packages/yt_dlp/extractor/cnn.py | 0 .../yt_dlp/extractor/comedycentral.py | 55 + .../site-packages/yt_dlp/extractor/common.py | 3882 ++++ .../yt_dlp/extractor/commonmistakes.py | 0 .../yt_dlp/extractor/commonprotocols.py | 0 .../yt_dlp/extractor/condenast.py | 0 .../site-packages/yt_dlp/extractor/contv.py | 0 .../site-packages/yt_dlp/extractor/corus.py | 154 + .../site-packages/yt_dlp/extractor/coub.py | 0 .../site-packages/yt_dlp/extractor/cozytv.py | 0 .../site-packages/yt_dlp/extractor/cpac.py | 0 .../site-packages/yt_dlp/extractor/cracked.py | 0 .../site-packages/yt_dlp/extractor/crackle.py | 243 + .../site-packages/yt_dlp/extractor/craftsy.py | 68 + .../yt_dlp/extractor/crooksandliars.py | 0 .../yt_dlp/extractor/crowdbunker.py | 0 .../site-packages/yt_dlp/extractor/crtvg.py | 34 + .../yt_dlp/extractor/crunchyroll.py | 650 + .../site-packages/yt_dlp/extractor/cspan.py | 0 .../site-packages/yt_dlp/extractor/ctsnews.py | 0 .../site-packages/yt_dlp/extractor/ctv.py | 0 .../site-packages/yt_dlp/extractor/ctvnews.py | 0 .../yt_dlp/extractor/cultureunplugged.py | 65 + .../yt_dlp/extractor/curiositystream.py | 0 .../site-packages/yt_dlp/extractor/cwtv.py | 0 .../site-packages/yt_dlp/extractor/cybrary.py | 144 + .../site-packages/yt_dlp/extractor/dacast.py | 158 + .../site-packages/yt_dlp/extractor/daftsex.py | 150 + .../yt_dlp/extractor/dailymail.py | 0 .../yt_dlp/extractor/dailymotion.py | 412 + .../yt_dlp/extractor/dailywire.py | 0 .../site-packages/yt_dlp/extractor/damtomo.py | 0 .../site-packages/yt_dlp/extractor/daum.py | 0 .../site-packages/yt_dlp/extractor/daystar.py | 0 .../site-packages/yt_dlp/extractor/dbtv.py | 0 .../site-packages/yt_dlp/extractor/dctp.py | 0 .../site-packages/yt_dlp/extractor/deezer.py | 0 .../site-packages/yt_dlp/extractor/defense.py | 0 .../yt_dlp/extractor/democracynow.py | 0 .../site-packages/yt_dlp/extractor/detik.py | 0 .../site-packages/yt_dlp/extractor/deuxm.py | 0 .../site-packages/yt_dlp/extractor/dfb.py | 0 .../site-packages/yt_dlp/extractor/dhm.py | 0 .../site-packages/yt_dlp/extractor/digg.py | 0 .../yt_dlp/extractor/digitalconcerthall.py | 150 + .../yt_dlp/extractor/digiteka.py | 0 .../site-packages/yt_dlp/extractor/discogs.py | 35 + .../yt_dlp/extractor/discovery.py | 115 + .../yt_dlp/extractor/discoverygo.py | 0 .../site-packages/yt_dlp/extractor/disney.py | 0 .../site-packages/yt_dlp/extractor/dispeak.py | 0 .../site-packages/yt_dlp/extractor/dlf.py | 192 + .../site-packages/yt_dlp/extractor/dlive.py | 0 .../site-packages/yt_dlp/extractor/dotsub.py | 0 .../site-packages/yt_dlp/extractor/douyutv.py | 306 + .../site-packages/yt_dlp/extractor/dplay.py | 1059 ++ .../yt_dlp/extractor/drbonanza.py | 0 .../site-packages/yt_dlp/extractor/dreisat.py | 0 .../site-packages/yt_dlp/extractor/drooble.py | 0 .../site-packages/yt_dlp/extractor/dropbox.py | 90 + .../site-packages/yt_dlp/extractor/dropout.py | 224 + .../site-packages/yt_dlp/extractor/drtuber.py | 0 .../site-packages/yt_dlp/extractor/drtv.py | 490 + .../site-packages/yt_dlp/extractor/dtube.py | 0 .../site-packages/yt_dlp/extractor/duboku.py | 0 .../site-packages/yt_dlp/extractor/dumpert.py | 111 + .../site-packages/yt_dlp/extractor/dvtv.py | 0 .../site-packages/yt_dlp/extractor/dw.py | 0 .../yt_dlp/extractor/eagleplatform.py | 215 + .../yt_dlp/extractor/ebaumsworld.py | 0 .../site-packages/yt_dlp/extractor/ebay.py | 0 .../site-packages/yt_dlp/extractor/echomsk.py | 0 .../site-packages/yt_dlp/extractor/egghead.py | 0 .../site-packages/yt_dlp/extractor/ehow.py | 0 .../yt_dlp/extractor/eighttracks.py | 0 .../yt_dlp/extractor/einthusan.py | 0 .../site-packages/yt_dlp/extractor/eitb.py | 79 + .../yt_dlp/extractor/elevensports.py | 59 + .../yt_dlp/extractor/ellentube.py | 0 .../site-packages/yt_dlp/extractor/elonet.py | 0 .../site-packages/yt_dlp/extractor/elpais.py | 0 .../site-packages/yt_dlp/extractor/embedly.py | 0 .../yt_dlp/extractor/engadget.py | 0 .../site-packages/yt_dlp/extractor/epicon.py | 0 .../site-packages/yt_dlp/extractor/eplus.py | 96 + .../site-packages/yt_dlp/extractor/epoch.py | 0 .../site-packages/yt_dlp/extractor/eporner.py | 126 + .../site-packages/yt_dlp/extractor/erocast.py | 63 + .../yt_dlp/extractor/eroprofile.py | 0 .../site-packages/yt_dlp/extractor/ertgr.py | 0 .../yt_dlp/extractor/escapist.py | 0 .../site-packages/yt_dlp/extractor/espn.py | 0 .../site-packages/yt_dlp/extractor/esri.py | 0 .../site-packages/yt_dlp/extractor/ettutv.py | 60 + .../site-packages/yt_dlp/extractor/europa.py | 173 + .../yt_dlp/extractor/europeantour.py | 0 .../yt_dlp/extractor/eurosport.py | 123 + .../yt_dlp/extractor/euscreen.py | 0 .../site-packages/yt_dlp/extractor/expotv.py | 0 .../yt_dlp/extractor/expressen.py | 96 + .../yt_dlp/extractor/extractors.py | 0 .../yt_dlp/extractor/extremetube.py | 0 .../site-packages/yt_dlp/extractor/eyedotv.py | 0 .../yt_dlp/extractor/facebook.py | 848 + .../site-packages/yt_dlp/extractor/fancode.py | 0 .../site-packages/yt_dlp/extractor/faz.py | 0 .../site-packages/yt_dlp/extractor/fc2.py | 288 + .../site-packages/yt_dlp/extractor/fczenit.py | 0 .../site-packages/yt_dlp/extractor/fifa.py | 83 + .../yt_dlp/extractor/filmmodu.py | 69 + .../site-packages/yt_dlp/extractor/filmon.py | 171 + .../site-packages/yt_dlp/extractor/filmweb.py | 0 .../site-packages/yt_dlp/extractor/firsttv.py | 0 .../site-packages/yt_dlp/extractor/fivetv.py | 0 .../site-packages/yt_dlp/extractor/flickr.py | 0 .../yt_dlp/extractor/folketinget.py | 0 .../yt_dlp/extractor/footyroom.py | 0 .../yt_dlp/extractor/formula1.py | 0 .../yt_dlp/extractor/fourtube.py | 0 .../yt_dlp/extractor/fourzerostudio.py | 0 .../site-packages/yt_dlp/extractor/fox.py | 177 + .../site-packages/yt_dlp/extractor/fox9.py | 0 .../site-packages/yt_dlp/extractor/foxgay.py | 0 .../site-packages/yt_dlp/extractor/foxnews.py | 185 + .../yt_dlp/extractor/foxsports.py | 52 + .../site-packages/yt_dlp/extractor/fptplay.py | 0 .../yt_dlp/extractor/franceinter.py | 0 .../yt_dlp/extractor/francetv.py | 0 .../yt_dlp/extractor/freesound.py | 0 .../yt_dlp/extractor/freespeech.py | 0 .../site-packages/yt_dlp/extractor/freetv.py | 0 .../yt_dlp/extractor/frontendmasters.py | 0 .../site-packages/yt_dlp/extractor/fujitv.py | 71 + .../yt_dlp/extractor/funimation.py | 349 + .../site-packages/yt_dlp/extractor/funk.py | 0 .../yt_dlp/extractor/funker530.py | 80 + .../site-packages/yt_dlp/extractor/fusion.py | 0 .../site-packages/yt_dlp/extractor/fuyintv.py | 0 .../site-packages/yt_dlp/extractor/gab.py | 0 .../site-packages/yt_dlp/extractor/gaia.py | 0 .../yt_dlp/extractor/gameinformer.py | 0 .../yt_dlp/extractor/gamejolt.py | 0 .../yt_dlp/extractor/gamespot.py | 0 .../yt_dlp/extractor/gamestar.py | 0 .../yt_dlp/extractor/gaskrank.py | 0 .../site-packages/yt_dlp/extractor/gazeta.py | 0 .../yt_dlp/extractor/gdcvault.py | 213 + .../yt_dlp/extractor/gedidigital.py | 0 .../site-packages/yt_dlp/extractor/generic.py | 2894 +++ .../yt_dlp/extractor/genericembeds.py | 0 .../site-packages/yt_dlp/extractor/genius.py | 145 + .../site-packages/yt_dlp/extractor/gettr.py | 0 .../site-packages/yt_dlp/extractor/gfycat.py | 0 .../yt_dlp/extractor/giantbomb.py | 0 .../site-packages/yt_dlp/extractor/giga.py | 0 .../site-packages/yt_dlp/extractor/gigya.py | 0 .../site-packages/yt_dlp/extractor/glide.py | 0 .../yt_dlp/extractor/globalplayer.py | 254 + .../site-packages/yt_dlp/extractor/globo.py | 246 + .../site-packages/yt_dlp/extractor/glomex.py | 0 .../yt_dlp/extractor/gmanetwork.py | 83 + .../site-packages/yt_dlp/extractor/go.py | 0 .../site-packages/yt_dlp/extractor/godtube.py | 0 .../site-packages/yt_dlp/extractor/gofile.py | 106 + .../site-packages/yt_dlp/extractor/golem.py | 0 .../yt_dlp/extractor/goodgame.py | 0 .../yt_dlp/extractor/googledrive.py | 337 + .../yt_dlp/extractor/googlepodcasts.py | 0 .../yt_dlp/extractor/googlesearch.py | 0 .../site-packages/yt_dlp/extractor/goplay.py | 394 + .../site-packages/yt_dlp/extractor/gopro.py | 0 .../site-packages/yt_dlp/extractor/goshgay.py | 0 .../yt_dlp/extractor/gotostage.py | 0 .../yt_dlp/extractor/gputechconf.py | 0 .../site-packages/yt_dlp/extractor/gronkh.py | 120 + .../site-packages/yt_dlp/extractor/groupon.py | 0 .../yt_dlp/extractor/harpodeon.py | 0 .../site-packages/yt_dlp/extractor/hbo.py | 0 .../yt_dlp/extractor/hearthisat.py | 0 .../site-packages/yt_dlp/extractor/heise.py | 0 .../yt_dlp/extractor/hellporno.py | 0 .../yt_dlp/extractor/helsinki.py | 0 .../site-packages/yt_dlp/extractor/hgtv.py | 0 .../site-packages/yt_dlp/extractor/hidive.py | 119 + .../yt_dlp/extractor/historicfilms.py | 0 .../site-packages/yt_dlp/extractor/hitbox.py | 0 .../yt_dlp/extractor/hitrecord.py | 0 .../site-packages/yt_dlp/extractor/hketv.py | 187 + .../yt_dlp/extractor/hollywoodreporter.py | 72 + .../site-packages/yt_dlp/extractor/holodex.py | 0 .../yt_dlp/extractor/hotnewhiphop.py | 60 + .../site-packages/yt_dlp/extractor/hotstar.py | 468 + .../site-packages/yt_dlp/extractor/howcast.py | 0 .../yt_dlp/extractor/howstuffworks.py | 0 .../site-packages/yt_dlp/extractor/hrefli.py | 15 + .../yt_dlp/extractor/hrfensehen.py | 0 .../site-packages/yt_dlp/extractor/hrti.py | 200 + .../site-packages/yt_dlp/extractor/hse.py | 0 .../site-packages/yt_dlp/extractor/huajiao.py | 0 .../yt_dlp/extractor/huffpost.py | 0 .../site-packages/yt_dlp/extractor/hungama.py | 202 + .../site-packages/yt_dlp/extractor/huya.py | 0 .../site-packages/yt_dlp/extractor/hypem.py | 0 .../yt_dlp/extractor/hypergryph.py | 0 .../site-packages/yt_dlp/extractor/hytale.py | 0 .../site-packages/yt_dlp/extractor/icareus.py | 0 .../yt_dlp/extractor/ichinanalive.py | 0 .../yt_dlp/extractor/idolplus.py | 115 + .../site-packages/yt_dlp/extractor/ign.py | 399 + .../site-packages/yt_dlp/extractor/iheart.py | 0 .../yt_dlp/extractor/iltalehti.py | 0 .../site-packages/yt_dlp/extractor/imdb.py | 0 .../yt_dlp/extractor/imggaming.py | 126 + .../site-packages/yt_dlp/extractor/imgur.py | 0 .../site-packages/yt_dlp/extractor/ina.py | 0 .../site-packages/yt_dlp/extractor/inc.py | 0 .../yt_dlp/extractor/indavideo.py | 115 + .../site-packages/yt_dlp/extractor/infoq.py | 0 .../yt_dlp/extractor/instagram.py | 730 + .../yt_dlp/extractor/internazionale.py | 0 .../yt_dlp/extractor/internetvideoarchive.py | 0 .../site-packages/yt_dlp/extractor/iprima.py | 280 + .../site-packages/yt_dlp/extractor/iqiyi.py | 766 + .../yt_dlp/extractor/islamchannel.py | 0 .../yt_dlp/extractor/israelnationalnews.py | 0 .../site-packages/yt_dlp/extractor/itprotv.py | 139 + .../site-packages/yt_dlp/extractor/itv.py | 0 .../site-packages/yt_dlp/extractor/ivi.py | 0 .../site-packages/yt_dlp/extractor/ivideon.py | 0 .../site-packages/yt_dlp/extractor/iwara.py | 298 + .../site-packages/yt_dlp/extractor/ixigua.py | 0 .../yt_dlp/extractor/izlesene.py | 0 .../site-packages/yt_dlp/extractor/jable.py | 103 + .../site-packages/yt_dlp/extractor/jamendo.py | 0 .../yt_dlp/extractor/japandiet.py | 0 .../yt_dlp/extractor/jeuxvideo.py | 0 .../site-packages/yt_dlp/extractor/jixie.py | 0 .../site-packages/yt_dlp/extractor/joj.py | 0 .../site-packages/yt_dlp/extractor/jove.py | 0 .../site-packages/yt_dlp/extractor/jstream.py | 73 + .../site-packages/yt_dlp/extractor/jtbc.py | 156 + .../yt_dlp/extractor/jwplatform.py | 90 + .../site-packages/yt_dlp/extractor/kakao.py | 152 + .../site-packages/yt_dlp/extractor/kaltura.py | 0 .../site-packages/yt_dlp/extractor/kanal2.py | 0 .../yt_dlp/extractor/kankanews.py | 0 .../yt_dlp/extractor/karaoketv.py | 0 .../yt_dlp/extractor/karrierevideos.py | 0 .../yt_dlp/extractor/keezmovies.py | 0 .../yt_dlp/extractor/kelbyone.py | 0 .../yt_dlp/extractor/khanacademy.py | 0 .../site-packages/yt_dlp/extractor/kick.py | 126 + .../site-packages/yt_dlp/extractor/kicker.py | 0 .../yt_dlp/extractor/kickstarter.py | 0 .../site-packages/yt_dlp/extractor/kinja.py | 0 .../yt_dlp/extractor/kinopoisk.py | 0 .../yt_dlp/extractor/kommunetv.py | 31 + .../site-packages/yt_dlp/extractor/kompas.py | 0 .../yt_dlp/extractor/konserthusetplay.py | 0 .../site-packages/yt_dlp/extractor/koo.py | 0 .../yt_dlp/extractor/krasview.py | 0 .../site-packages/yt_dlp/extractor/kth.py | 0 .../site-packages/yt_dlp/extractor/ku6.py | 0 .../site-packages/yt_dlp/extractor/kusi.py | 0 .../site-packages/yt_dlp/extractor/kuwo.py | 346 + .../site-packages/yt_dlp/extractor/la7.py | 234 + .../yt_dlp/extractor/laola1tv.py | 0 .../site-packages/yt_dlp/extractor/lastfm.py | 129 + .../yt_dlp/extractor/lazy_extractors.py | 15845 ++++++++++++++++ .../site-packages/yt_dlp/extractor/lbry.py | 430 + .../site-packages/yt_dlp/extractor/lci.py | 0 .../site-packages/yt_dlp/extractor/lcp.py | 0 .../yt_dlp/extractor/lecture2go.py | 0 .../yt_dlp/extractor/lecturio.py | 235 + .../site-packages/yt_dlp/extractor/leeco.py | 0 .../yt_dlp/extractor/lefigaro.py | 0 .../site-packages/yt_dlp/extractor/lego.py | 141 + .../site-packages/yt_dlp/extractor/lemonde.py | 0 .../site-packages/yt_dlp/extractor/lenta.py | 0 .../yt_dlp/extractor/libraryofcongress.py | 0 .../site-packages/yt_dlp/extractor/libsyn.py | 0 .../yt_dlp/extractor/lifenews.py | 0 .../site-packages/yt_dlp/extractor/likee.py | 0 .../yt_dlp/extractor/limelight.py | 358 + .../yt_dlp/extractor/linkedin.py | 0 .../yt_dlp/extractor/linuxacademy.py | 238 + .../yt_dlp/extractor/liputan6.py | 0 .../yt_dlp/extractor/listennotes.py | 0 .../site-packages/yt_dlp/extractor/litv.py | 138 + .../yt_dlp/extractor/livejournal.py | 0 .../yt_dlp/extractor/livestream.py | 388 + .../yt_dlp/extractor/livestreamfails.py | 0 .../site-packages/yt_dlp/extractor/lnkgo.py | 0 .../yt_dlp/extractor/localnews8.py | 0 .../yt_dlp/extractor/lovehomeporn.py | 0 .../site-packages/yt_dlp/extractor/lrt.py | 0 .../site-packages/yt_dlp/extractor/lumni.py | 0 .../site-packages/yt_dlp/extractor/lynda.py | 0 .../site-packages/yt_dlp/extractor/m6.py | 0 .../yt_dlp/extractor/magellantv.py | 50 + .../yt_dlp/extractor/magentamusik360.py | 0 .../site-packages/yt_dlp/extractor/mailru.py | 338 + .../yt_dlp/extractor/mainstreaming.py | 210 + .../site-packages/yt_dlp/extractor/malltv.py | 0 .../yt_dlp/extractor/mangomolo.py | 0 .../site-packages/yt_dlp/extractor/manoto.py | 0 .../yt_dlp/extractor/manyvids.py | 0 .../site-packages/yt_dlp/extractor/maoritv.py | 0 .../site-packages/yt_dlp/extractor/markiza.py | 0 .../yt_dlp/extractor/massengeschmacktv.py | 72 + .../site-packages/yt_dlp/extractor/masters.py | 0 .../site-packages/yt_dlp/extractor/matchtv.py | 0 .../site-packages/yt_dlp/extractor/mbn.py | 89 + .../site-packages/yt_dlp/extractor/mdr.py | 0 .../site-packages/yt_dlp/extractor/medaltv.py | 162 + .../yt_dlp/extractor/mediaite.py | 104 + .../yt_dlp/extractor/mediaklikk.py | 156 + .../yt_dlp/extractor/medialaan.py | 0 .../yt_dlp/extractor/mediaset.py | 318 + .../yt_dlp/extractor/mediasite.py | 411 + .../yt_dlp/extractor/mediastream.py | 212 + .../yt_dlp/extractor/mediaworksnz.py | 0 .../site-packages/yt_dlp/extractor/medici.py | 0 .../yt_dlp/extractor/megaphone.py | 0 .../yt_dlp/extractor/megatvcom.py | 164 + .../site-packages/yt_dlp/extractor/meipai.py | 0 .../yt_dlp/extractor/melonvod.py | 0 .../site-packages/yt_dlp/extractor/meta.py | 0 .../yt_dlp/extractor/metacafe.py | 0 .../yt_dlp/extractor/metacritic.py | 0 .../site-packages/yt_dlp/extractor/mgoon.py | 0 .../site-packages/yt_dlp/extractor/mgtv.py | 165 + .../site-packages/yt_dlp/extractor/miaopai.py | 0 .../yt_dlp/extractor/microsoftembed.py | 0 .../yt_dlp/extractor/microsoftstream.py | 0 .../extractor/microsoftvirtualacademy.py | 0 .../site-packages/yt_dlp/extractor/mildom.py | 0 .../site-packages/yt_dlp/extractor/minds.py | 193 + .../yt_dlp/extractor/ministrygrid.py | 0 .../site-packages/yt_dlp/extractor/minoto.py | 0 .../site-packages/yt_dlp/extractor/miomio.py | 134 + .../yt_dlp/extractor/mirrativ.py | 0 .../yt_dlp/extractor/mirrorcouk.py | 0 .../site-packages/yt_dlp/extractor/mit.py | 0 .../site-packages/yt_dlp/extractor/mitele.py | 0 .../site-packages/yt_dlp/extractor/mixch.py | 0 .../yt_dlp/extractor/mixcloud.py | 379 + .../site-packages/yt_dlp/extractor/mlb.py | 0 .../yt_dlp/extractor/mlssoccer.py | 0 .../site-packages/yt_dlp/extractor/mnet.py | 0 .../site-packages/yt_dlp/extractor/mocha.py | 64 + .../yt_dlp/extractor/moevideo.py | 0 .../site-packages/yt_dlp/extractor/mofosex.py | 0 .../yt_dlp/extractor/mojvideo.py | 0 .../yt_dlp/extractor/monstercat.py | 79 + .../yt_dlp/extractor/morningstar.py | 0 .../yt_dlp/extractor/motherless.py | 272 + .../yt_dlp/extractor/motorsport.py | 0 .../yt_dlp/extractor/movieclips.py | 47 + .../yt_dlp/extractor/moviepilot.py | 0 .../site-packages/yt_dlp/extractor/moview.py | 0 .../yt_dlp/extractor/moviezine.py | 0 .../yt_dlp/extractor/movingimage.py | 0 .../site-packages/yt_dlp/extractor/msn.py | 0 .../site-packages/yt_dlp/extractor/mtv.py | 652 + .../yt_dlp/extractor/muenchentv.py | 0 .../yt_dlp/extractor/murrtube.py | 0 .../site-packages/yt_dlp/extractor/museai.py | 112 + .../yt_dlp/extractor/musescore.py | 0 .../yt_dlp/extractor/musicdex.py | 0 .../site-packages/yt_dlp/extractor/mwave.py | 0 .../yt_dlp/extractor/mxplayer.py | 0 .../yt_dlp/extractor/mychannels.py | 0 .../site-packages/yt_dlp/extractor/myspace.py | 0 .../site-packages/yt_dlp/extractor/myspass.py | 0 .../site-packages/yt_dlp/extractor/myvi.py | 0 .../yt_dlp/extractor/myvideoge.py | 0 .../yt_dlp/extractor/myvidster.py | 0 .../site-packages/yt_dlp/extractor/mzaalo.py | 95 + .../site-packages/yt_dlp/extractor/n1.py | 163 + .../site-packages/yt_dlp/extractor/nate.py | 0 .../yt_dlp/extractor/nationalgeographic.py | 83 + .../site-packages/yt_dlp/extractor/naver.py | 397 + .../site-packages/yt_dlp/extractor/nba.py | 0 .../site-packages/yt_dlp/extractor/nbc.py | 844 + .../site-packages/yt_dlp/extractor/ndr.py | 0 .../site-packages/yt_dlp/extractor/ndtv.py | 0 .../site-packages/yt_dlp/extractor/nebula.py | 281 + .../yt_dlp/extractor/nekohacker.py | 217 + .../yt_dlp/extractor/nerdcubed.py | 0 .../yt_dlp/extractor/neteasemusic.py | 597 + .../yt_dlp/extractor/netverse.py | 281 + .../yt_dlp/extractor/netzkino.py | 0 .../yt_dlp/extractor/newgrounds.py | 0 .../yt_dlp/extractor/newspicks.py | 0 .../yt_dlp/extractor/newstube.py | 0 .../site-packages/yt_dlp/extractor/newsy.py | 0 .../yt_dlp/extractor/nextmedia.py | 0 .../site-packages/yt_dlp/extractor/nexx.py | 0 .../site-packages/yt_dlp/extractor/nfb.py | 0 .../yt_dlp/extractor/nfhsnetwork.py | 0 .../site-packages/yt_dlp/extractor/nfl.py | 373 + .../site-packages/yt_dlp/extractor/nhk.py | 619 + .../site-packages/yt_dlp/extractor/nhl.py | 0 .../site-packages/yt_dlp/extractor/nick.py | 0 .../yt_dlp/extractor/niconico.py | 1058 ++ .../yt_dlp/extractor/niconicochannelplus.py | 426 + .../yt_dlp/extractor/ninecninemedia.py | 0 .../site-packages/yt_dlp/extractor/ninegag.py | 0 .../site-packages/yt_dlp/extractor/ninenow.py | 122 + .../yt_dlp/extractor/nintendo.py | 0 .../site-packages/yt_dlp/extractor/nitter.py | 360 + .../yt_dlp/extractor/njpwworld.py | 82 + .../yt_dlp/extractor/nobelprize.py | 0 .../site-packages/yt_dlp/extractor/noice.py | 0 .../yt_dlp/extractor/nonktube.py | 0 .../yt_dlp/extractor/noodlemagazine.py | 80 + .../site-packages/yt_dlp/extractor/noovo.py | 0 .../yt_dlp/extractor/normalboots.py | 0 .../site-packages/yt_dlp/extractor/nosnl.py | 0 .../yt_dlp/extractor/nosvideo.py | 72 + .../site-packages/yt_dlp/extractor/nova.py | 296 + .../yt_dlp/extractor/novaplay.py | 69 + .../site-packages/yt_dlp/extractor/nowness.py | 142 + .../site-packages/yt_dlp/extractor/noz.py | 0 .../site-packages/yt_dlp/extractor/npo.py | 0 .../site-packages/yt_dlp/extractor/npr.py | 0 .../site-packages/yt_dlp/extractor/nrk.py | 875 + .../site-packages/yt_dlp/extractor/nrl.py | 0 .../site-packages/yt_dlp/extractor/ntvcojp.py | 0 .../site-packages/yt_dlp/extractor/ntvde.py | 0 .../site-packages/yt_dlp/extractor/ntvru.py | 0 .../yt_dlp/extractor/nubilesporn.py | 99 + .../site-packages/yt_dlp/extractor/nuevo.py | 0 .../site-packages/yt_dlp/extractor/nuvid.py | 0 .../site-packages/yt_dlp/extractor/nytimes.py | 0 .../yt_dlp/extractor/nzherald.py | 0 .../yt_dlp/extractor/nzonscreen.py | 0 .../site-packages/yt_dlp/extractor/nzz.py | 0 .../site-packages/yt_dlp/extractor/odatv.py | 0 .../yt_dlp/extractor/odkmedia.py | 105 + .../yt_dlp/extractor/odnoklassniki.py | 464 + .../site-packages/yt_dlp/extractor/oftv.py | 54 + .../yt_dlp/extractor/oktoberfesttv.py | 0 .../yt_dlp/extractor/olympics.py | 0 .../site-packages/yt_dlp/extractor/on24.py | 0 .../site-packages/yt_dlp/extractor/once.py | 0 .../yt_dlp/extractor/ondemandkorea.py | 0 .../yt_dlp/extractor/onefootball.py | 0 .../yt_dlp/extractor/onenewsnz.py | 0 .../yt_dlp/extractor/oneplace.py | 0 .../site-packages/yt_dlp/extractor/onet.py | 0 .../yt_dlp/extractor/onionstudios.py | 0 .../site-packages/yt_dlp/extractor/ooyala.py | 0 .../yt_dlp/extractor/opencast.py | 183 + .../yt_dlp/extractor/openload.py | 0 .../site-packages/yt_dlp/extractor/openrec.py | 0 .../site-packages/yt_dlp/extractor/ora.py | 0 .../site-packages/yt_dlp/extractor/orf.py | 526 + .../yt_dlp/extractor/outsidetv.py | 0 .../yt_dlp/extractor/owncloud.py | 80 + .../yt_dlp/extractor/packtpub.py | 155 + .../yt_dlp/extractor/palcomp3.py | 0 .../yt_dlp/extractor/pandoratv.py | 0 .../site-packages/yt_dlp/extractor/panopto.py | 600 + .../yt_dlp/extractor/paramountplus.py | 0 .../site-packages/yt_dlp/extractor/parler.py | 91 + .../yt_dlp/extractor/parlview.py | 0 .../site-packages/yt_dlp/extractor/patreon.py | 454 + .../site-packages/yt_dlp/extractor/pbs.py | 757 + .../yt_dlp/extractor/pearvideo.py | 0 .../yt_dlp/extractor/peekvids.py | 190 + .../yt_dlp/extractor/peertube.py | 0 .../site-packages/yt_dlp/extractor/peertv.py | 0 .../site-packages/yt_dlp/extractor/peloton.py | 215 + .../site-packages/yt_dlp/extractor/people.py | 0 .../yt_dlp/extractor/performgroup.py | 0 .../yt_dlp/extractor/periscope.py | 0 .../site-packages/yt_dlp/extractor/pgatour.py | 47 + .../yt_dlp/extractor/philharmoniedeparis.py | 0 .../site-packages/yt_dlp/extractor/phoenix.py | 0 .../yt_dlp/extractor/photobucket.py | 0 .../site-packages/yt_dlp/extractor/piapro.py | 118 + .../yt_dlp/extractor/piaulizaportal.py | 70 + .../site-packages/yt_dlp/extractor/picarto.py | 152 + .../site-packages/yt_dlp/extractor/piksel.py | 174 + .../yt_dlp/extractor/pinkbike.py | 0 .../yt_dlp/extractor/pinterest.py | 0 .../yt_dlp/extractor/pixivsketch.py | 0 .../yt_dlp/extractor/pladform.py | 136 + .../yt_dlp/extractor/planetmarathi.py | 0 .../site-packages/yt_dlp/extractor/platzi.py | 213 + .../site-packages/yt_dlp/extractor/playfm.py | 0 .../yt_dlp/extractor/playplustv.py | 100 + .../site-packages/yt_dlp/extractor/plays.py | 0 .../yt_dlp/extractor/playstuff.py | 0 .../yt_dlp/extractor/playsuisse.py | 187 + .../yt_dlp/extractor/playtvak.py | 0 .../site-packages/yt_dlp/extractor/playvid.py | 0 .../yt_dlp/extractor/playwire.py | 0 .../yt_dlp/extractor/pluralsight.py | 0 .../site-packages/yt_dlp/extractor/plutotv.py | 0 .../yt_dlp/extractor/podbayfm.py | 0 .../yt_dlp/extractor/podchaser.py | 0 .../yt_dlp/extractor/podomatic.py | 0 .../site-packages/yt_dlp/extractor/pokemon.py | 0 .../site-packages/yt_dlp/extractor/pokergo.py | 0 .../yt_dlp/extractor/polsatgo.py | 0 .../yt_dlp/extractor/polskieradio.py | 610 + .../yt_dlp/extractor/popcorntimes.py | 0 .../yt_dlp/extractor/popcorntv.py | 0 .../site-packages/yt_dlp/extractor/porn91.py | 0 .../site-packages/yt_dlp/extractor/pornbox.py | 113 + .../site-packages/yt_dlp/extractor/porncom.py | 0 .../site-packages/yt_dlp/extractor/pornez.py | 60 + .../yt_dlp/extractor/pornflip.py | 0 .../site-packages/yt_dlp/extractor/pornhd.py | 0 .../site-packages/yt_dlp/extractor/pornhub.py | 825 + .../yt_dlp/extractor/pornotube.py | 0 .../yt_dlp/extractor/pornovoisines.py | 0 .../site-packages/yt_dlp/extractor/pornoxo.py | 0 .../yt_dlp/extractor/pr0gramm.py | 155 + .../yt_dlp/extractor/prankcast.py | 0 .../yt_dlp/extractor/premiershiprugby.py | 0 .../site-packages/yt_dlp/extractor/presstv.py | 0 .../yt_dlp/extractor/projectveritas.py | 0 .../yt_dlp/extractor/prosiebensat1.py | 0 .../site-packages/yt_dlp/extractor/prx.py | 0 .../site-packages/yt_dlp/extractor/puhutv.py | 233 + .../site-packages/yt_dlp/extractor/puls4.py | 0 .../site-packages/yt_dlp/extractor/pyvideo.py | 0 .../site-packages/yt_dlp/extractor/qdance.py | 150 + .../yt_dlp/extractor/qingting.py | 0 .../site-packages/yt_dlp/extractor/qqmusic.py | 0 .../site-packages/yt_dlp/extractor/r7.py | 0 .../site-packages/yt_dlp/extractor/radiko.py | 252 + .../yt_dlp/extractor/radiobremen.py | 0 .../yt_dlp/extractor/radiocanada.py | 165 + .../site-packages/yt_dlp/extractor/radiode.py | 0 .../yt_dlp/extractor/radiofrance.py | 473 + .../yt_dlp/extractor/radiojavan.py | 0 .../yt_dlp/extractor/radiokapital.py | 0 .../yt_dlp/extractor/radiozet.py | 0 .../site-packages/yt_dlp/extractor/radlive.py | 0 .../site-packages/yt_dlp/extractor/rai.py | 783 + .../yt_dlp/extractor/raywenderlich.py | 0 .../site-packages/yt_dlp/extractor/rbgtum.py | 142 + .../yt_dlp/extractor/rbmaradio.py | 0 .../site-packages/yt_dlp/extractor/rcs.py | 372 + .../site-packages/yt_dlp/extractor/rcti.py | 373 + .../site-packages/yt_dlp/extractor/rds.py | 0 .../yt_dlp/extractor/recurbate.py | 42 + .../site-packages/yt_dlp/extractor/redbee.py | 0 .../yt_dlp/extractor/redbulltv.py | 224 + .../site-packages/yt_dlp/extractor/reddit.py | 353 + .../site-packages/yt_dlp/extractor/redgifs.py | 260 + .../site-packages/yt_dlp/extractor/redtube.py | 0 .../site-packages/yt_dlp/extractor/regiotv.py | 55 + .../site-packages/yt_dlp/extractor/rentv.py | 0 .../site-packages/yt_dlp/extractor/restudy.py | 0 .../site-packages/yt_dlp/extractor/reuters.py | 0 .../yt_dlp/extractor/reverbnation.py | 0 .../yt_dlp/extractor/rheinmaintv.py | 94 + .../site-packages/yt_dlp/extractor/rice.py | 0 .../yt_dlp/extractor/rmcdecouverte.py | 0 .../yt_dlp/extractor/rockstargames.py | 0 .../site-packages/yt_dlp/extractor/rokfin.py | 456 + .../yt_dlp/extractor/roosterteeth.py | 211 + .../yt_dlp/extractor/rottentomatoes.py | 80 + .../site-packages/yt_dlp/extractor/rozhlas.py | 343 + .../site-packages/yt_dlp/extractor/rte.py | 162 + .../site-packages/yt_dlp/extractor/rtl2.py | 0 .../site-packages/yt_dlp/extractor/rtlnl.py | 0 .../site-packages/yt_dlp/extractor/rtnews.py | 0 .../site-packages/yt_dlp/extractor/rtp.py | 0 .../site-packages/yt_dlp/extractor/rtrfm.py | 0 .../site-packages/yt_dlp/extractor/rts.py | 231 + .../yt_dlp/extractor/rtvcplay.py | 285 + .../site-packages/yt_dlp/extractor/rtve.py | 0 .../site-packages/yt_dlp/extractor/rtvnh.py | 0 .../site-packages/yt_dlp/extractor/rtvs.py | 0 .../site-packages/yt_dlp/extractor/rtvslo.py | 166 + .../site-packages/yt_dlp/extractor/ruhd.py | 0 .../yt_dlp/extractor/rule34video.py | 65 + .../site-packages/yt_dlp/extractor/rumble.py | 391 + .../site-packages/yt_dlp/extractor/rutube.py | 0 .../site-packages/yt_dlp/extractor/rutv.py | 0 .../site-packages/yt_dlp/extractor/ruutu.py | 0 .../site-packages/yt_dlp/extractor/ruv.py | 0 .../site-packages/yt_dlp/extractor/s4c.py | 103 + .../site-packages/yt_dlp/extractor/safari.py | 259 + .../yt_dlp/extractor/saitosan.py | 0 .../yt_dlp/extractor/samplefocus.py | 0 .../site-packages/yt_dlp/extractor/sapo.py | 0 .../yt_dlp/extractor/savefrom.py | 0 .../site-packages/yt_dlp/extractor/sbs.py | 158 + .../site-packages/yt_dlp/extractor/screen9.py | 0 .../yt_dlp/extractor/screencast.py | 0 .../yt_dlp/extractor/screencastify.py | 0 .../yt_dlp/extractor/screencastomatic.py | 0 .../yt_dlp/extractor/scrippsnetworks.py | 153 + .../yt_dlp/extractor/scrolller.py | 0 .../site-packages/yt_dlp/extractor/scte.py | 0 .../site-packages/yt_dlp/extractor/seeker.py | 0 .../yt_dlp/extractor/senalcolombia.py | 31 + .../yt_dlp/extractor/senategov.py | 0 .../yt_dlp/extractor/sendtonews.py | 0 .../site-packages/yt_dlp/extractor/servus.py | 0 .../yt_dlp/extractor/sevenplus.py | 132 + .../site-packages/yt_dlp/extractor/sexu.py | 0 .../yt_dlp/extractor/seznamzpravy.py | 0 .../site-packages/yt_dlp/extractor/shahid.py | 217 + .../site-packages/yt_dlp/extractor/shared.py | 0 .../yt_dlp/extractor/sharevideos.py | 0 .../yt_dlp/extractor/shemaroome.py | 102 + .../yt_dlp/extractor/showroomlive.py | 0 .../site-packages/yt_dlp/extractor/sibnet.py | 0 .../yt_dlp/extractor/simplecast.py | 0 .../site-packages/yt_dlp/extractor/sina.py | 109 + .../site-packages/yt_dlp/extractor/sixplay.py | 122 + .../site-packages/yt_dlp/extractor/skeb.py | 0 .../site-packages/yt_dlp/extractor/sky.py | 0 .../site-packages/yt_dlp/extractor/skyit.py | 0 .../yt_dlp/extractor/skylinewebcams.py | 0 .../yt_dlp/extractor/skynewsarabia.py | 0 .../yt_dlp/extractor/skynewsau.py | 0 .../yt_dlp/extractor/slideshare.py | 0 .../yt_dlp/extractor/slideslive.py | 567 + .../yt_dlp/extractor/slutload.py | 0 .../site-packages/yt_dlp/extractor/smotrim.py | 0 .../site-packages/yt_dlp/extractor/snotr.py | 0 .../site-packages/yt_dlp/extractor/sohu.py | 293 + .../site-packages/yt_dlp/extractor/sonyliv.py | 220 + .../yt_dlp/extractor/soundcloud.py | 948 + .../yt_dlp/extractor/soundgasm.py | 0 .../yt_dlp/extractor/southpark.py | 0 .../yt_dlp/extractor/sovietscloset.py | 207 + .../yt_dlp/extractor/spankbang.py | 0 .../yt_dlp/extractor/spankwire.py | 0 .../site-packages/yt_dlp/extractor/spiegel.py | 0 .../site-packages/yt_dlp/extractor/spike.py | 0 .../site-packages/yt_dlp/extractor/sport5.py | 0 .../yt_dlp/extractor/sportbox.py | 0 .../yt_dlp/extractor/sportdeutschland.py | 0 .../site-packages/yt_dlp/extractor/spotify.py | 0 .../yt_dlp/extractor/spreaker.py | 0 .../yt_dlp/extractor/springboardplatform.py | 0 .../site-packages/yt_dlp/extractor/sprout.py | 0 .../site-packages/yt_dlp/extractor/srgssr.py | 0 .../yt_dlp/extractor/srmediathek.py | 0 .../yt_dlp/extractor/stacommu.py | 148 + .../yt_dlp/extractor/stageplus.py | 515 + .../yt_dlp/extractor/stanfordoc.py | 0 .../yt_dlp/extractor/startrek.py | 0 .../site-packages/yt_dlp/extractor/startv.py | 0 .../site-packages/yt_dlp/extractor/steam.py | 0 .../yt_dlp/extractor/stitcher.py | 0 .../yt_dlp/extractor/storyfire.py | 0 .../yt_dlp/extractor/streamable.py | 0 .../yt_dlp/extractor/streamcloud.py | 0 .../yt_dlp/extractor/streamcz.py | 0 .../yt_dlp/extractor/streamff.py | 0 .../yt_dlp/extractor/streetvoice.py | 0 .../yt_dlp/extractor/stretchinternet.py | 0 .../yt_dlp/extractor/stripchat.py | 66 + .../site-packages/yt_dlp/extractor/stv.py | 0 .../yt_dlp/extractor/substack.py | 108 + .../yt_dlp/extractor/sunporno.py | 0 .../yt_dlp/extractor/sverigesradio.py | 149 + .../site-packages/yt_dlp/extractor/svt.py | 452 + .../yt_dlp/extractor/swearnet.py | 0 .../yt_dlp/extractor/swrmediathek.py | 0 .../site-packages/yt_dlp/extractor/syfy.py | 57 + .../site-packages/yt_dlp/extractor/syvdk.py | 0 .../site-packages/yt_dlp/extractor/sztvhu.py | 0 .../yt_dlp/extractor/tagesschau.py | 163 + .../site-packages/yt_dlp/extractor/tass.py | 0 .../site-packages/yt_dlp/extractor/tbs.py | 0 .../site-packages/yt_dlp/extractor/tbsjp.py | 152 + .../yt_dlp/extractor/tdslifeway.py | 0 .../yt_dlp/extractor/teachable.py | 295 + .../yt_dlp/extractor/teachertube.py | 0 .../yt_dlp/extractor/teachingchannel.py | 0 .../yt_dlp/extractor/teamcoco.py | 280 + .../yt_dlp/extractor/teamtreehouse.py | 0 .../yt_dlp/extractor/techtalks.py | 0 .../site-packages/yt_dlp/extractor/ted.py | 0 .../site-packages/yt_dlp/extractor/tele13.py | 0 .../site-packages/yt_dlp/extractor/tele5.py | 0 .../yt_dlp/extractor/telebruxelles.py | 0 .../yt_dlp/extractor/telecaribe.py | 91 + .../yt_dlp/extractor/telecinco.py | 0 .../yt_dlp/extractor/telegraaf.py | 0 .../yt_dlp/extractor/telegram.py | 0 .../site-packages/yt_dlp/extractor/telemb.py | 0 .../yt_dlp/extractor/telemundo.py | 50 + .../yt_dlp/extractor/telequebec.py | 0 .../yt_dlp/extractor/teletask.py | 0 .../yt_dlp/extractor/telewebion.py | 0 .../site-packages/yt_dlp/extractor/tempo.py | 0 .../site-packages/yt_dlp/extractor/tencent.py | 490 + .../yt_dlp/extractor/tennistv.py | 155 + .../site-packages/yt_dlp/extractor/tenplay.py | 169 + .../site-packages/yt_dlp/extractor/testurl.py | 50 + .../site-packages/yt_dlp/extractor/tf1.py | 101 + .../site-packages/yt_dlp/extractor/tfo.py | 48 + .../yt_dlp/extractor/theholetv.py | 0 .../yt_dlp/extractor/theintercept.py | 0 .../yt_dlp/extractor/theplatform.py | 417 + .../site-packages/yt_dlp/extractor/thestar.py | 0 .../site-packages/yt_dlp/extractor/thesun.py | 43 + .../yt_dlp/extractor/theweatherchannel.py | 99 + .../yt_dlp/extractor/thisamericanlife.py | 0 .../site-packages/yt_dlp/extractor/thisav.py | 0 .../yt_dlp/extractor/thisoldhouse.py | 55 + .../site-packages/yt_dlp/extractor/thisvid.py | 0 .../yt_dlp/extractor/threeqsdn.py | 156 + .../yt_dlp/extractor/threespeak.py | 0 .../site-packages/yt_dlp/extractor/tiktok.py | 1289 ++ .../site-packages/yt_dlp/extractor/tinypic.py | 0 .../site-packages/yt_dlp/extractor/tmz.py | 193 + .../site-packages/yt_dlp/extractor/tnaflix.py | 0 .../site-packages/yt_dlp/extractor/toggle.py | 0 .../site-packages/yt_dlp/extractor/toggo.py | 0 .../yt_dlp/extractor/tokentube.py | 0 .../site-packages/yt_dlp/extractor/tonline.py | 0 .../yt_dlp/extractor/toongoggles.py | 0 .../site-packages/yt_dlp/extractor/toutv.py | 87 + .../site-packages/yt_dlp/extractor/toypics.py | 0 .../yt_dlp/extractor/traileraddict.py | 0 .../site-packages/yt_dlp/extractor/triller.py | 329 + .../yt_dlp/extractor/trilulilu.py | 0 .../site-packages/yt_dlp/extractor/trovo.py | 0 .../yt_dlp/extractor/trtcocuk.py | 0 .../site-packages/yt_dlp/extractor/trueid.py | 136 + .../site-packages/yt_dlp/extractor/trunews.py | 0 .../site-packages/yt_dlp/extractor/truth.py | 0 .../site-packages/yt_dlp/extractor/trutv.py | 0 .../site-packages/yt_dlp/extractor/tube8.py | 0 .../yt_dlp/extractor/tubetugraz.py | 252 + .../site-packages/yt_dlp/extractor/tubitv.py | 168 + .../site-packages/yt_dlp/extractor/tumblr.py | 387 + .../site-packages/yt_dlp/extractor/tunein.py | 234 + .../site-packages/yt_dlp/extractor/tunepk.py | 0 .../site-packages/yt_dlp/extractor/turbo.py | 0 .../site-packages/yt_dlp/extractor/turner.py | 0 .../site-packages/yt_dlp/extractor/tv2.py | 322 + .../site-packages/yt_dlp/extractor/tv24ua.py | 0 .../site-packages/yt_dlp/extractor/tv2dk.py | 0 .../site-packages/yt_dlp/extractor/tv2hu.py | 0 .../site-packages/yt_dlp/extractor/tv4.py | 149 + .../yt_dlp/extractor/tv5mondeplus.py | 181 + .../site-packages/yt_dlp/extractor/tv5unis.py | 0 .../site-packages/yt_dlp/extractor/tva.py | 0 .../yt_dlp/extractor/tvanouvelles.py | 0 .../site-packages/yt_dlp/extractor/tvc.py | 0 .../site-packages/yt_dlp/extractor/tver.py | 0 .../site-packages/yt_dlp/extractor/tvigle.py | 0 .../yt_dlp/extractor/tviplayer.py | 0 .../site-packages/yt_dlp/extractor/tvland.py | 0 .../site-packages/yt_dlp/extractor/tvn24.py | 0 .../site-packages/yt_dlp/extractor/tvnet.py | 0 .../site-packages/yt_dlp/extractor/tvnoe.py | 0 .../site-packages/yt_dlp/extractor/tvnow.py | 0 .../yt_dlp/extractor/tvopengr.py | 0 .../site-packages/yt_dlp/extractor/tvp.py | 629 + .../site-packages/yt_dlp/extractor/tvplay.py | 306 + .../yt_dlp/extractor/tvplayer.py | 80 + .../yt_dlp/extractor/tweakers.py | 0 .../yt_dlp/extractor/twentyfourvideo.py | 0 .../yt_dlp/extractor/twentymin.py | 0 .../yt_dlp/extractor/twentythreevideo.py | 0 .../yt_dlp/extractor/twitcasting.py | 306 + .../site-packages/yt_dlp/extractor/twitch.py | 1224 ++ .../site-packages/yt_dlp/extractor/twitter.py | 1757 ++ .../site-packages/yt_dlp/extractor/txxx.py | 0 .../site-packages/yt_dlp/extractor/udemy.py | 474 + .../site-packages/yt_dlp/extractor/udn.py | 0 .../site-packages/yt_dlp/extractor/ufctv.py | 0 .../yt_dlp/extractor/ukcolumn.py | 0 .../yt_dlp/extractor/uktvplay.py | 0 .../site-packages/yt_dlp/extractor/umg.py | 0 .../site-packages/yt_dlp/extractor/unistra.py | 0 .../site-packages/yt_dlp/extractor/unity.py | 0 .../yt_dlp/extractor/unscripted.py | 0 .../yt_dlp/extractor/unsupported.py | 177 + .../site-packages/yt_dlp/extractor/uol.py | 0 .../site-packages/yt_dlp/extractor/uplynk.py | 0 .../site-packages/yt_dlp/extractor/urort.py | 0 .../site-packages/yt_dlp/extractor/urplay.py | 164 + .../yt_dlp/extractor/usanetwork.py | 0 .../yt_dlp/extractor/usatoday.py | 0 .../site-packages/yt_dlp/extractor/ustream.py | 0 .../site-packages/yt_dlp/extractor/ustudio.py | 0 .../site-packages/yt_dlp/extractor/utreon.py | 81 + .../yt_dlp/extractor/varzesh3.py | 0 .../site-packages/yt_dlp/extractor/vbox7.py | 0 .../site-packages/yt_dlp/extractor/veehd.py | 0 .../site-packages/yt_dlp/extractor/veo.py | 0 .../site-packages/yt_dlp/extractor/veoh.py | 0 .../site-packages/yt_dlp/extractor/vesti.py | 0 .../site-packages/yt_dlp/extractor/vevo.py | 353 + .../site-packages/yt_dlp/extractor/vgtv.py | 0 .../site-packages/yt_dlp/extractor/vh1.py | 0 .../site-packages/yt_dlp/extractor/vice.py | 319 + .../site-packages/yt_dlp/extractor/vidbit.py | 0 .../site-packages/yt_dlp/extractor/viddler.py | 0 .../site-packages/yt_dlp/extractor/videa.py | 188 + .../yt_dlp/extractor/videocampus_sachsen.py | 253 + .../yt_dlp/extractor/videodetective.py | 0 .../yt_dlp/extractor/videofyme.py | 0 .../yt_dlp/extractor/videoken.py | 0 .../yt_dlp/extractor/videomore.py | 0 .../yt_dlp/extractor/videopress.py | 0 .../site-packages/yt_dlp/extractor/vidio.py | 0 .../site-packages/yt_dlp/extractor/vidlii.py | 154 + .../yt_dlp/extractor/viewlift.py | 336 + .../site-packages/yt_dlp/extractor/viidea.py | 199 + .../site-packages/yt_dlp/extractor/viki.py | 0 .../site-packages/yt_dlp/extractor/vimeo.py | 1447 ++ .../site-packages/yt_dlp/extractor/vimm.py | 0 .../site-packages/yt_dlp/extractor/vimple.py | 0 .../site-packages/yt_dlp/extractor/vine.py | 0 .../site-packages/yt_dlp/extractor/viqeo.py | 0 .../site-packages/yt_dlp/extractor/viu.py | 0 .../site-packages/yt_dlp/extractor/vk.py | 842 + .../site-packages/yt_dlp/extractor/vocaroo.py | 63 + .../yt_dlp/extractor/vodlocker.py | 73 + .../site-packages/yt_dlp/extractor/vodpl.py | 0 .../yt_dlp/extractor/vodplatform.py | 0 .../yt_dlp/extractor/voicerepublic.py | 0 .../site-packages/yt_dlp/extractor/voicy.py | 0 .../site-packages/yt_dlp/extractor/volejtv.py | 0 .../site-packages/yt_dlp/extractor/voot.py | 210 + .../yt_dlp/extractor/voxmedia.py | 0 .../site-packages/yt_dlp/extractor/vrak.py | 0 .../site-packages/yt_dlp/extractor/vrt.py | 427 + .../site-packages/yt_dlp/extractor/vrv.py | 269 + .../site-packages/yt_dlp/extractor/vshare.py | 57 + .../site-packages/yt_dlp/extractor/vtm.py | 0 .../site-packages/yt_dlp/extractor/vuclip.py | 0 .../site-packages/yt_dlp/extractor/vupload.py | 0 .../site-packages/yt_dlp/extractor/vvvvid.py | 0 .../yt_dlp/extractor/vyborymos.py | 0 .../site-packages/yt_dlp/extractor/vzaar.py | 0 .../site-packages/yt_dlp/extractor/wakanim.py | 0 .../site-packages/yt_dlp/extractor/walla.py | 0 .../site-packages/yt_dlp/extractor/wasdtv.py | 0 .../yt_dlp/extractor/washingtonpost.py | 0 .../site-packages/yt_dlp/extractor/wat.py | 119 + .../yt_dlp/extractor/watchbox.py | 0 .../yt_dlp/extractor/watchindianporn.py | 0 .../site-packages/yt_dlp/extractor/wdr.py | 385 + .../yt_dlp/extractor/webcamerapl.py | 0 .../yt_dlp/extractor/webcaster.py | 0 .../yt_dlp/extractor/webofstories.py | 0 .../site-packages/yt_dlp/extractor/weibo.py | 241 + .../site-packages/yt_dlp/extractor/weiqitv.py | 0 .../site-packages/yt_dlp/extractor/weverse.py | 608 + .../site-packages/yt_dlp/extractor/wevidi.py | 108 + .../site-packages/yt_dlp/extractor/weyyak.py | 86 + .../yt_dlp/extractor/whowatch.py | 0 .../site-packages/yt_dlp/extractor/whyp.py | 50 + .../yt_dlp/extractor/wikimedia.py | 0 .../site-packages/yt_dlp/extractor/willow.py | 0 .../yt_dlp/extractor/wimbledon.py | 61 + .../site-packages/yt_dlp/extractor/wimtv.py | 150 + .../site-packages/yt_dlp/extractor/wistia.py | 394 + .../yt_dlp/extractor/wordpress.py | 0 .../yt_dlp/extractor/worldstarhiphop.py | 0 .../site-packages/yt_dlp/extractor/wppilot.py | 0 .../yt_dlp/extractor/wrestleuniverse.py | 304 + .../site-packages/yt_dlp/extractor/wsj.py | 0 .../site-packages/yt_dlp/extractor/wwe.py | 0 .../site-packages/yt_dlp/extractor/wykop.py | 268 + .../site-packages/yt_dlp/extractor/xanimu.py | 0 .../site-packages/yt_dlp/extractor/xbef.py | 0 .../yt_dlp/extractor/xboxclips.py | 0 .../yt_dlp/extractor/xfileshare.py | 0 .../yt_dlp/extractor/xhamster.py | 465 + .../yt_dlp/extractor/ximalaya.py | 167 + .../yt_dlp/extractor/xinpianchang.py | 0 .../site-packages/yt_dlp/extractor/xminus.py | 0 .../site-packages/yt_dlp/extractor/xnxx.py | 0 .../site-packages/yt_dlp/extractor/xstream.py | 0 .../site-packages/yt_dlp/extractor/xtube.py | 214 + .../site-packages/yt_dlp/extractor/xuite.py | 0 .../site-packages/yt_dlp/extractor/xvideos.py | 0 .../yt_dlp/extractor/xxxymovies.py | 0 .../site-packages/yt_dlp/extractor/yahoo.py | 430 + .../yt_dlp/extractor/yandexdisk.py | 0 .../yt_dlp/extractor/yandexmusic.py | 0 .../yt_dlp/extractor/yandexvideo.py | 0 .../yt_dlp/extractor/yapfiles.py | 0 .../site-packages/yt_dlp/extractor/yappy.py | 127 + .../yt_dlp/extractor/yesjapan.py | 56 + .../yt_dlp/extractor/yinyuetai.py | 0 .../yt_dlp/extractor/yle_areena.py | 0 .../site-packages/yt_dlp/extractor/ynet.py | 0 .../site-packages/yt_dlp/extractor/youjizz.py | 0 .../site-packages/yt_dlp/extractor/youku.py | 290 + .../site-packages/yt_dlp/extractor/younow.py | 0 .../site-packages/yt_dlp/extractor/youporn.py | 198 + .../yt_dlp/extractor/yourporn.py | 0 .../yt_dlp/extractor/yourupload.py | 0 .../site-packages/yt_dlp/extractor/youtube.py | 7346 +++++++ .../site-packages/yt_dlp/extractor/zaiko.py | 139 + .../site-packages/yt_dlp/extractor/zapiks.py | 0 .../site-packages/yt_dlp/extractor/zattoo.py | 865 + .../site-packages/yt_dlp/extractor/zdf.py | 442 + .../site-packages/yt_dlp/extractor/zee5.py | 270 + .../site-packages/yt_dlp/extractor/zeenews.py | 0 .../site-packages/yt_dlp/extractor/zhihu.py | 0 .../site-packages/yt_dlp/extractor/zingmp3.py | 426 + .../site-packages/yt_dlp/extractor/zoom.py | 136 + .../site-packages/yt_dlp/extractor/zype.py | 135 + .../site-packages/yt_dlp/jsinterp.py | 853 + .../site-packages/yt_dlp/minicurses.py | 0 .../yt_dlp/networking/__init__.py | 13 + .../yt_dlp/networking/_helper.py | 265 + .../yt_dlp/networking/_urllib.py | 436 + .../site-packages/yt_dlp/networking/common.py | 564 + .../yt_dlp/networking/exceptions.py | 217 + .../site-packages/yt_dlp/options.py | 1913 ++ .../site-packages/yt_dlp/plugins.py | 0 .../yt_dlp/postprocessor/__init__.py | 0 .../yt_dlp/postprocessor/common.py | 215 + .../yt_dlp/postprocessor/embedthumbnail.py | 227 + .../yt_dlp/postprocessor/exec.py | 41 + .../yt_dlp/postprocessor/ffmpeg.py | 1190 ++ .../yt_dlp/postprocessor/metadataparser.py | 0 .../yt_dlp/postprocessor/modify_chapters.py | 336 + .../postprocessor/movefilesafterdownload.py | 0 .../yt_dlp/postprocessor/sponskrub.py | 0 .../yt_dlp/postprocessor/sponsorblock.py | 0 .../yt_dlp/postprocessor/xattrpp.py | 0 .../python3.10/site-packages/yt_dlp/socks.py | 274 + .../python3.10/site-packages/yt_dlp/update.py | 464 + .../site-packages/yt_dlp/utils/__init__.py | 10 + .../site-packages/yt_dlp/utils/_deprecated.py | 39 + .../site-packages/yt_dlp/utils/_legacy.py | 242 + .../site-packages/yt_dlp/utils/_utils.py | 5502 ++++++ .../site-packages/yt_dlp/utils/networking.py | 163 + .../site-packages/yt_dlp/utils/progress.py | 109 + .../site-packages/yt_dlp/utils/traversal.py | 254 + .../site-packages/yt_dlp/version.py | 11 + .../site-packages/yt_dlp/webvtt.py | 0 .../zipp-3.15.0.dist-info/INSTALLER | 1 + .../zipp-3.15.0.dist-info/LICENSE | 0 .../zipp-3.15.0.dist-info/METADATA | 0 .../zipp-3.15.0.dist-info/RECORD | 11 + .../zipp-3.15.0.dist-info/REQUESTED | 0 .../zipp-3.15.0.dist-info}/WHEEL | 0 .../zipp-3.15.0.dist-info/top_level.txt | 0 .../site-packages/zipp/__init__.py | 0 .../site-packages/zipp/py310compat.py | 0 .../APScheduler-3.10.1.dist-info/INSTALLER | 1 + .../APScheduler-3.10.1.dist-info/LICENSE.txt | 19 + .../APScheduler-3.10.1.dist-info/METADATA | 138 + .../APScheduler-3.10.1.dist-info/RECORD | 0 .../APScheduler-3.10.1.dist-info/REQUESTED | 0 .../APScheduler-3.10.1.dist-info}/WHEEL | 0 .../entry_points.txt | 23 + .../top_level.txt | 1 + .../Brotli-1.0.9.dist-info/INSTALLER | 1 + .../Brotli-1.0.9.dist-info/LICENSE | 19 + .../Brotli-1.0.9.dist-info/METADATA | 0 .../Brotli-1.0.9.dist-info/RECORD | 0 .../Brotli-1.0.9.dist-info/REQUESTED | 0 .../Brotli-1.0.9.dist-info/WHEEL | 0 .../Brotli-1.0.9.dist-info/top_level.txt | 2 + .../site-packages/Cryptodome/Cipher/AES.py | 234 + .../site-packages/Cryptodome/Cipher/AES.pyi | 154 + .../site-packages/Cryptodome/Cipher/ARC2.py | 175 + .../site-packages/Cryptodome/Cipher/ARC2.pyi | 33 + .../site-packages/Cryptodome/Cipher/ARC4.py | 136 + .../site-packages/Cryptodome/Cipher/ARC4.pyi | 14 + .../Cryptodome/Cipher/Blowfish.py | 159 + .../Cryptodome/Cipher/Blowfish.pyi | 33 + .../site-packages/Cryptodome/Cipher/CAST.py | 159 + .../site-packages/Cryptodome/Cipher/CAST.pyi | 33 + .../Cryptodome/Cipher/ChaCha20.py | 287 + .../Cryptodome/Cipher/ChaCha20.pyi | 23 + .../Cryptodome/Cipher/ChaCha20_Poly1305.py | 336 + .../Cryptodome/Cipher/ChaCha20_Poly1305.pyi | 26 + .../site-packages/Cryptodome/Cipher/DES.py | 158 + .../site-packages/Cryptodome/Cipher/DES.pyi | 33 + .../site-packages/Cryptodome/Cipher/DES3.py | 187 + .../site-packages/Cryptodome/Cipher/DES3.pyi | 35 + .../Cryptodome/Cipher/PKCS1_OAEP.py | 239 + .../Cryptodome/Cipher/PKCS1_OAEP.pyi | 35 + .../Cryptodome/Cipher/PKCS1_v1_5.py | 217 + .../Cryptodome/Cipher/PKCS1_v1_5.pyi | 20 + .../Cryptodome/Cipher/Salsa20.py | 167 + .../Cryptodome/Cipher/Salsa20.pyi | 24 + .../Cryptodome/Cipher/_ARC4.abi3.so | Bin 0 -> 21016 bytes .../Cryptodome/Cipher/_EKSBlowfish.py | 131 + .../Cryptodome/Cipher/_EKSBlowfish.pyi | 15 + .../Cryptodome/Cipher/_Salsa20.abi3.so | Bin 0 -> 27016 bytes .../Cryptodome/Cipher/__init__.py | 79 + .../Cryptodome/Cipher/__init__.pyi | 0 .../Cryptodome/Cipher/_chacha20.abi3.so | Bin 0 -> 30624 bytes .../Cryptodome/Cipher/_mode_cbc.py | 293 + .../Cryptodome/Cipher/_mode_cbc.pyi | 25 + .../Cryptodome/Cipher/_mode_ccm.py | 650 + .../Cryptodome/Cipher/_mode_ccm.pyi | 47 + .../Cryptodome/Cipher/_mode_cfb.py | 293 + .../Cryptodome/Cipher/_mode_cfb.pyi | 26 + .../Cryptodome/Cipher/_mode_ctr.py | 393 + .../Cryptodome/Cipher/_mode_ctr.pyi | 27 + .../Cryptodome/Cipher/_mode_eax.py | 408 + .../Cryptodome/Cipher/_mode_eax.pyi | 45 + .../Cryptodome/Cipher/_mode_ecb.py | 220 + .../Cryptodome/Cipher/_mode_ecb.pyi | 19 + .../Cryptodome/Cipher/_mode_gcm.py | 620 + .../Cryptodome/Cipher/_mode_gcm.pyi | 45 + .../Cryptodome/Cipher/_mode_ocb.py | 532 + .../Cryptodome/Cipher/_mode_ocb.pyi | 36 + .../Cryptodome/Cipher/_mode_ofb.py | 282 + .../Cryptodome/Cipher/_mode_ofb.pyi | 25 + .../Cryptodome/Cipher/_mode_openpgp.py | 206 + .../Cryptodome/Cipher/_mode_openpgp.pyi | 20 + .../Cryptodome/Cipher/_mode_siv.py | 392 + .../Cryptodome/Cipher/_mode_siv.pyi | 38 + .../Cryptodome/Cipher/_pkcs1_decode.abi3.so | Bin 0 -> 35688 bytes .../Cryptodome/Cipher/_raw_aes.abi3.so | Bin 0 -> 106808 bytes .../Cryptodome/Cipher/_raw_aesni.abi3.so | Bin 0 -> 106384 bytes .../Cryptodome/Cipher/_raw_arc2.abi3.so | Bin 0 -> 46464 bytes .../Cryptodome/Cipher/_raw_blowfish.abi3.so | Bin 0 -> 78640 bytes .../Cryptodome/Cipher/_raw_cast.abi3.so | Bin 0 -> 57408 bytes .../Cryptodome/Cipher/_raw_cbc.abi3.so | Bin 0 -> 23000 bytes .../Cryptodome/Cipher/_raw_cfb.abi3.so | Bin 0 -> 26864 bytes .../Cryptodome/Cipher/_raw_ctr.abi3.so | Bin 0 -> 31336 bytes .../Cryptodome/Cipher/_raw_des.abi3.so | Bin 0 -> 71560 bytes .../Cryptodome/Cipher/_raw_des3.abi3.so | Bin 0 -> 72520 bytes .../Cryptodome/Cipher/_raw_ecb.abi3.so | Bin 0 -> 19016 bytes .../Cipher/_raw_eksblowfish.abi3.so | Bin 0 -> 181192 bytes .../Cryptodome/Cipher/_raw_ocb.abi3.so | Bin 0 -> 45856 bytes .../Cryptodome/Cipher/_raw_ofb.abi3.so | Bin 0 -> 22128 bytes .../site-packages/Cryptodome/Hash/BLAKE2b.py | 247 + .../site-packages/Cryptodome/Hash/BLAKE2b.pyi | 32 + .../site-packages/Cryptodome/Hash/BLAKE2s.py | 247 + .../site-packages/Cryptodome/Hash/BLAKE2s.pyi | 26 + .../site-packages/Cryptodome/Hash/CMAC.py | 302 + .../site-packages/Cryptodome/Hash/CMAC.pyi | 30 + .../site-packages/Cryptodome/Hash/HMAC.py | 213 + .../site-packages/Cryptodome/Hash/HMAC.pyi | 25 + .../site-packages/Cryptodome/Hash/KMAC128.py | 179 + .../site-packages/Cryptodome/Hash/KMAC128.pyi | 33 + .../site-packages/Cryptodome/Hash/KMAC256.py | 74 + .../site-packages/Cryptodome/Hash/KMAC256.pyi | 10 + .../Cryptodome/Hash/KangarooTwelve.py | 262 + .../Cryptodome/Hash/KangarooTwelve.pyi | 16 + .../site-packages/Cryptodome/Hash/MD2.py | 166 + .../site-packages/Cryptodome/Hash/MD2.pyi | 19 + .../site-packages/Cryptodome/Hash/MD4.py | 185 + .../site-packages/Cryptodome/Hash/MD4.pyi | 19 + .../site-packages/Cryptodome/Hash/MD5.py | 184 + .../site-packages/Cryptodome/Hash/MD5.pyi | 19 + .../site-packages/Cryptodome/Hash/Poly1305.py | 217 + .../Cryptodome/Hash/Poly1305.pyi | 24 + .../site-packages/Cryptodome/Hash/RIPEMD.py | 26 + .../site-packages/Cryptodome/Hash/RIPEMD.pyi | 3 + .../Cryptodome/Hash/RIPEMD160.py | 169 + .../Cryptodome/Hash/RIPEMD160.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA.py | 24 + .../site-packages/Cryptodome/Hash/SHA.pyi | 4 + .../site-packages/Cryptodome/Hash/SHA1.py | 185 + .../site-packages/Cryptodome/Hash/SHA1.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA224.py | 186 + .../site-packages/Cryptodome/Hash/SHA224.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA256.py | 185 + .../site-packages/Cryptodome/Hash/SHA256.pyi | 18 + .../site-packages/Cryptodome/Hash/SHA384.py | 186 + .../site-packages/Cryptodome/Hash/SHA384.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_224.py | 174 + .../Cryptodome/Hash/SHA3_224.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_256.py | 174 + .../Cryptodome/Hash/SHA3_256.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_384.py | 179 + .../Cryptodome/Hash/SHA3_384.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_512.py | 174 + .../Cryptodome/Hash/SHA3_512.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA512.py | 204 + .../site-packages/Cryptodome/Hash/SHA512.pyi | 22 + .../site-packages/Cryptodome/Hash/SHAKE128.py | 129 + .../Cryptodome/Hash/SHAKE128.pyi | 13 + .../site-packages/Cryptodome/Hash/SHAKE256.py | 130 + .../Cryptodome/Hash/SHAKE256.pyi | 13 + .../Cryptodome/Hash/TupleHash128.py | 138 + .../Cryptodome/Hash/TupleHash128.pyi | 22 + .../Cryptodome/Hash/TupleHash256.py | 73 + .../Cryptodome/Hash/TupleHash256.pyi | 5 + .../Cryptodome/Hash/_BLAKE2b.abi3.so | Bin 0 -> 27424 bytes .../Cryptodome/Hash/_BLAKE2s.abi3.so | Bin 0 -> 26952 bytes .../Cryptodome/Hash/_MD2.abi3.so | Bin 0 -> 23136 bytes .../Cryptodome/Hash/_MD4.abi3.so | Bin 0 -> 27192 bytes .../Cryptodome/Hash/_MD5.abi3.so | Bin 0 -> 32008 bytes .../Cryptodome/Hash/_RIPEMD160.abi3.so | Bin 0 -> 60728 bytes .../Cryptodome/Hash/_SHA1.abi3.so | Bin 0 -> 72064 bytes .../Cryptodome/Hash/_SHA224.abi3.so | Bin 0 -> 45768 bytes .../Cryptodome/Hash/_SHA256.abi3.so | Bin 0 -> 45832 bytes .../Cryptodome/Hash/_SHA384.abi3.so | Bin 0 -> 54160 bytes .../Cryptodome/Hash/_SHA512.abi3.so | Bin 0 -> 54200 bytes .../site-packages/Cryptodome/Hash/__init__.py | 24 + .../Cryptodome/Hash/__init__.pyi | 0 .../Cryptodome/Hash/_ghash_clmul.abi3.so | Bin 0 -> 58376 bytes .../Cryptodome/Hash/_ghash_portable.abi3.so | Bin 0 -> 25024 bytes .../Cryptodome/Hash/_keccak.abi3.so | Bin 0 -> 41632 bytes .../Cryptodome/Hash/_poly1305.abi3.so | Bin 0 -> 33424 bytes .../Cryptodome/Hash/cSHAKE128.py | 187 + .../Cryptodome/Hash/cSHAKE128.pyi | 14 + .../Cryptodome/Hash/cSHAKE256.py | 56 + .../Cryptodome/Hash/cSHAKE256.pyi | 8 + .../site-packages/Cryptodome/Hash/keccak.py | 181 + .../site-packages/Cryptodome/Hash/keccak.pyi | 23 + .../site-packages/Cryptodome/IO/PEM.py | 189 + .../site-packages/Cryptodome/IO/PEM.pyi | 10 + .../site-packages/Cryptodome/IO/PKCS8.py | 239 + .../site-packages/Cryptodome/IO/PKCS8.pyi | 14 + .../site-packages/Cryptodome/IO/_PBES.py | 435 + .../site-packages/Cryptodome/IO/_PBES.pyi | 19 + .../site-packages/Cryptodome/IO/__init__.py | 31 + .../site-packages/Cryptodome/Math/Numbers.py | 42 + .../site-packages/Cryptodome/Math/Numbers.pyi | 2 + .../Cryptodome/Math/Primality.py | 369 + .../Cryptodome/Math/Primality.pyi | 18 + .../Cryptodome/Math/_IntegerBase.py | 392 + .../Cryptodome/Math/_IntegerBase.pyi | 63 + .../Cryptodome/Math/_IntegerCustom.py | 118 + .../Cryptodome/Math/_IntegerCustom.pyi | 8 + .../Cryptodome/Math/_IntegerGMP.py | 762 + .../Cryptodome/Math/_IntegerGMP.pyi | 3 + .../Cryptodome/Math/_IntegerNative.py | 370 + .../Cryptodome/Math/_IntegerNative.pyi | 3 + .../Cryptodome/Math}/__init__.py | 0 .../Cryptodome/Math/_modexp.abi3.so | Bin 0 -> 207672 bytes .../site-packages/Cryptodome/Protocol/KDF.py | 642 + .../site-packages/Cryptodome/Protocol/KDF.pyi | 40 + .../Cryptodome/Protocol/SecretSharing.py | 278 + .../Cryptodome/Protocol/SecretSharing.pyi | 22 + .../Cryptodome/Protocol/__init__.py | 31 + .../Cryptodome/Protocol/__init__.pyi | 1 + .../Cryptodome/Protocol/_scrypt.abi3.so | Bin 0 -> 26176 bytes .../site-packages/Cryptodome/PublicKey/DSA.py | 682 + .../Cryptodome/PublicKey/DSA.pyi | 31 + .../site-packages/Cryptodome/PublicKey/ECC.py | 1800 ++ .../Cryptodome/PublicKey/ECC.pyi | 66 + .../Cryptodome/PublicKey/ElGamal.py | 286 + .../Cryptodome/PublicKey/ElGamal.pyi | 18 + .../site-packages/Cryptodome/PublicKey/RSA.py | 833 + .../Cryptodome/PublicKey/RSA.pyi | 61 + .../Cryptodome/PublicKey/__init__.py | 94 + .../Cryptodome/PublicKey/__init__.pyi | 0 .../Cryptodome/PublicKey/_ec_ws.abi3.so | Bin 0 -> 960512 bytes .../Cryptodome/PublicKey/_ed25519.abi3.so | Bin 0 -> 220504 bytes .../Cryptodome/PublicKey/_ed448.abi3.so | Bin 0 -> 250552 bytes .../Cryptodome/PublicKey/_openssh.py | 135 + .../Cryptodome/PublicKey/_openssh.pyi | 7 + .../Cryptodome/PublicKey/_x25519.abi3.so | Bin 0 -> 79432 bytes .../Cryptodome/Random/__init__.py | 57 + .../Cryptodome/Random/__init__.pyi | 19 + .../site-packages/Cryptodome/Random/random.py | 138 + .../Cryptodome/Random/random.pyi | 22 + .../Cryptodome/SelfTest/Cipher/__init__.py | 60 + .../Cryptodome/SelfTest/Cipher/common.py | 510 + .../Cryptodome/SelfTest/Cipher/test_AES.py | 1351 ++ .../Cryptodome/SelfTest/Cipher/test_ARC2.py | 167 + .../Cryptodome/SelfTest/Cipher/test_ARC4.py | 471 + .../SelfTest/Cipher/test_Blowfish.py | 160 + .../Cryptodome/SelfTest/Cipher/test_CAST.py | 101 + .../Cryptodome/SelfTest/Cipher/test_CBC.py | 556 + .../Cryptodome/SelfTest/Cipher/test_CCM.py | 936 + .../Cryptodome/SelfTest/Cipher/test_CFB.py | 411 + .../Cryptodome/SelfTest/Cipher/test_CTR.py | 472 + .../SelfTest/Cipher/test_ChaCha20.py | 529 + .../SelfTest/Cipher/test_ChaCha20_Poly1305.py | 776 + .../Cryptodome/SelfTest/Cipher/test_DES.py | 374 + .../Cryptodome/SelfTest/Cipher/test_DES3.py | 195 + .../Cryptodome/SelfTest/Cipher/test_EAX.py | 773 + .../Cryptodome/SelfTest/Cipher/test_GCM.py | 951 + .../Cryptodome/SelfTest/Cipher/test_OCB.py | 845 + .../Cryptodome/SelfTest/Cipher/test_OFB.py | 238 + .../SelfTest/Cipher/test_OpenPGP.py | 218 + .../Cryptodome/SelfTest/Cipher/test_SIV.py | 552 + .../SelfTest/Cipher/test_Salsa20.py | 367 + .../SelfTest/Cipher/test_pkcs1_15.py | 283 + .../SelfTest/Cipher/test_pkcs1_oaep.py | 506 + .../Cryptodome/SelfTest/Hash/__init__.py | 61 + .../Cryptodome/SelfTest/Hash/common.py | 290 + .../Cryptodome/SelfTest/Hash/test_BLAKE2.py | 482 + .../Cryptodome/SelfTest/Hash/test_CMAC.py | 448 + .../Cryptodome/SelfTest/Hash/test_HMAC.py | 548 + .../Cryptodome/SelfTest/Hash/test_KMAC.py | 346 + .../SelfTest/Hash/test_KangarooTwelve.py | 324 + .../Cryptodome/SelfTest/Hash/test_MD2.py | 62 + .../Cryptodome/SelfTest/Hash/test_MD4.py | 64 + .../Cryptodome/SelfTest/Hash/test_MD5.py | 94 + .../Cryptodome/SelfTest/Hash/test_Poly1305.py | 542 + .../SelfTest/Hash/test_RIPEMD160.py | 71 + .../Cryptodome/SelfTest/Hash/test_SHA1.py | 84 + .../Cryptodome/SelfTest/Hash/test_SHA224.py | 63 + .../Cryptodome/SelfTest/Hash/test_SHA256.py | 94 + .../Cryptodome/SelfTest/Hash/test_SHA384.py | 61 + .../Cryptodome/SelfTest/Hash/test_SHA3_224.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA3_256.py | 80 + .../Cryptodome/SelfTest/Hash/test_SHA3_384.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA3_512.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA512.py | 140 + .../Cryptodome/SelfTest/Hash/test_SHAKE.py | 143 + .../SelfTest/Hash/test_TupleHash.py | 286 + .../Cryptodome/SelfTest/Hash/test_cSHAKE.py | 178 + .../Cryptodome/SelfTest/Hash/test_keccak.py | 250 + .../Cryptodome/SelfTest/IO/__init__.py | 47 + .../Cryptodome/SelfTest/IO/test_PBES.py | 93 + .../Cryptodome/SelfTest/IO/test_PKCS8.py | 425 + .../Cryptodome/SelfTest/Math/__init__.py | 49 + .../Cryptodome/SelfTest/Math/test_Numbers.py | 797 + .../SelfTest/Math/test_Primality.py | 118 + .../Cryptodome/SelfTest/Math/test_modexp.py | 201 + .../Cryptodome/SelfTest/Protocol/__init__.py | 44 + .../Cryptodome/SelfTest/Protocol/test_KDF.py | 807 + .../SelfTest/Protocol/test_SecretSharing.py | 267 + .../SelfTest/Protocol/test_rfc1751.py | 62 + .../Cryptodome/SelfTest/PublicKey/__init__.py | 53 + .../Cryptodome/SelfTest/PublicKey/test_DSA.py | 247 + .../SelfTest/PublicKey/test_ECC_25519.py | 333 + .../SelfTest/PublicKey/test_ECC_448.py | 333 + .../SelfTest/PublicKey/test_ECC_NIST.py | 1425 ++ .../SelfTest/PublicKey/test_ElGamal.py | 217 + .../Cryptodome/SelfTest/PublicKey/test_RSA.py | 320 + .../SelfTest/PublicKey/test_import_DSA.py | 554 + .../SelfTest/PublicKey/test_import_ECC.py | 2653 +++ .../SelfTest/PublicKey/test_import_RSA.py | 590 + .../Cryptodome/SelfTest/Random/__init__.py | 39 + .../Cryptodome/SelfTest/Random/test_random.py | 167 + .../Cryptodome/SelfTest/Signature/__init__.py | 41 + .../Cryptodome/SelfTest/Signature/test_dss.py | 1369 ++ .../SelfTest/Signature/test_eddsa.py | 578 + .../SelfTest/Signature/test_pkcs1_15.py | 348 + .../Cryptodome/SelfTest/Signature/test_pss.py | 377 + .../Cryptodome/SelfTest/Util/__init__.py | 46 + .../Cryptodome/SelfTest/Util/test_Counter.py | 67 + .../Cryptodome/SelfTest/Util/test_Padding.py | 154 + .../Cryptodome/SelfTest/Util/test_asn1.py | 851 + .../Cryptodome/SelfTest/Util/test_number.py | 192 + .../Cryptodome/SelfTest/Util/test_rfc1751.py | 38 + .../Cryptodome/SelfTest/Util/test_strxor.py | 280 + .../Cryptodome/SelfTest/__init__.py | 97 + .../Cryptodome/SelfTest/__main__.py | 38 + .../Cryptodome/SelfTest/loader.py | 235 + .../Cryptodome/SelfTest/st_common.py | 55 + .../site-packages/Cryptodome/Signature/DSS.py | 403 + .../Cryptodome/Signature/DSS.pyi | 27 + .../Cryptodome/Signature/PKCS1_PSS.py | 55 + .../Cryptodome/Signature/PKCS1_PSS.pyi | 28 + .../Cryptodome/Signature/PKCS1_v1_5.py | 53 + .../Cryptodome/Signature/PKCS1_v1_5.pyi | 16 + .../Cryptodome/Signature/__init__.py | 36 + .../Cryptodome/Signature/eddsa.py | 343 + .../Cryptodome/Signature/eddsa.pyi | 21 + .../Cryptodome/Signature/pkcs1_15.py | 222 + .../Cryptodome/Signature/pkcs1_15.pyi | 17 + .../site-packages/Cryptodome/Signature/pss.py | 386 + .../Cryptodome/Signature/pss.pyi | 30 + .../site-packages/Cryptodome/Util/Counter.py | 77 + .../site-packages/Cryptodome/Util/Counter.pyi | 5 + .../site-packages/Cryptodome/Util/Padding.py | 108 + .../site-packages/Cryptodome/Util/Padding.pyi | 6 + .../site-packages/Cryptodome/Util/RFC1751.py | 386 + .../site-packages/Cryptodome/Util/RFC1751.pyi | 7 + .../site-packages/Cryptodome/Util/__init__.py | 41 + .../Cryptodome/Util/_cpu_features.py | 46 + .../Cryptodome/Util/_cpu_features.pyi | 2 + .../Cryptodome/Util/_cpuid_c.abi3.so | Bin 0 -> 19304 bytes .../Cryptodome/Util/_file_system.py | 54 + .../Cryptodome/Util/_file_system.pyi | 4 + .../site-packages/Cryptodome/Util/_raw_api.py | 319 + .../Cryptodome/Util/_raw_api.pyi | 27 + .../Cryptodome/Util/_strxor.abi3.so | Bin 0 -> 20376 bytes .../site-packages/Cryptodome/Util/asn1.py | 1064 ++ .../site-packages/Cryptodome/Util/asn1.pyi | 80 + .../site-packages/Cryptodome/Util/number.py | 1525 ++ .../site-packages/Cryptodome/Util/number.pyi | 19 + .../Cryptodome/Util/py3compat.py | 174 + .../Cryptodome/Util/py3compat.pyi | 33 + .../site-packages/Cryptodome/Util/strxor.py | 146 + .../site-packages/Cryptodome/Util/strxor.pyi | 6 + .../site-packages/Cryptodome/__init__.py | 6 + .../site-packages/Cryptodome/__init__.pyi | 4 + .../site-packages/Cryptodome/py.typed | 0 .../Flask-2.2.5.dist-info/INSTALLER | 1 + .../Flask-2.2.5.dist-info/LICENSE.rst | 28 + .../Flask-2.2.5.dist-info/METADATA | 123 + .../Flask-2.2.5.dist-info/RECORD | 0 .../Flask-2.2.5.dist-info/REQUESTED | 0 .../Flask-2.2.5.dist-info}/WHEEL | 0 .../Flask-2.2.5.dist-info/entry_points.txt | 2 + .../Flask-2.2.5.dist-info/top_level.txt | 1 + .../Jinja2-3.1.2.dist-info/INSTALLER | 1 + .../Jinja2-3.1.2.dist-info/LICENSE.rst | 28 + .../Jinja2-3.1.2.dist-info/METADATA | 113 + .../Jinja2-3.1.2.dist-info/RECORD | 0 .../Jinja2-3.1.2.dist-info/REQUESTED | 0 .../Jinja2-3.1.2.dist-info/WHEEL | 5 + .../Jinja2-3.1.2.dist-info/entry_points.txt | 2 + .../Jinja2-3.1.2.dist-info/top_level.txt | 1 + .../MarkupSafe-2.1.3.dist-info/INSTALLER | 1 + .../MarkupSafe-2.1.3.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.1.3.dist-info/METADATA | 93 + .../MarkupSafe-2.1.3.dist-info/RECORD | 0 .../MarkupSafe-2.1.3.dist-info/REQUESTED | 0 .../MarkupSafe-2.1.3.dist-info/WHEEL | 0 .../MarkupSafe-2.1.3.dist-info/top_level.txt | 1 + .../Werkzeug-2.2.3.dist-info/INSTALLER | 1 + .../Werkzeug-2.2.3.dist-info/LICENSE.rst | 28 + .../Werkzeug-2.2.3.dist-info/METADATA | 126 + .../Werkzeug-2.2.3.dist-info/RECORD | 0 .../Werkzeug-2.2.3.dist-info/REQUESTED | 0 .../Werkzeug-2.2.3.dist-info}/WHEEL | 0 .../Werkzeug-2.2.3.dist-info/top_level.txt | 1 + .../_brotli.cpython-311-x86_64-linux-gnu.so | Bin .../site-packages/_distutils_hack/__init__.py | 0 .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/apscheduler/__init__.py | 10 + .../site-packages/apscheduler/events.py | 94 + .../apscheduler/executors}/__init__.py | 0 .../apscheduler/executors/asyncio.py | 52 + .../apscheduler/executors/base.py | 146 + .../apscheduler/executors/base_py3.py | 43 + .../apscheduler/executors/debug.py | 20 + .../apscheduler/executors/gevent.py | 30 + .../apscheduler/executors/pool.py | 71 + .../apscheduler/executors/tornado.py | 54 + .../apscheduler/executors/twisted.py | 25 + .../site-packages/apscheduler/job.py | 302 + .../apscheduler/jobstores/__init__.py | 0 .../apscheduler/jobstores/base.py | 143 + .../apscheduler/jobstores/memory.py | 108 + .../apscheduler/jobstores/mongodb.py | 141 + .../apscheduler/jobstores/redis.py | 150 + .../apscheduler/jobstores/rethinkdb.py | 155 + .../apscheduler/jobstores/sqlalchemy.py | 161 + .../apscheduler/jobstores/zookeeper.py | 178 + .../apscheduler/schedulers/__init__.py | 12 + .../apscheduler/schedulers/asyncio.py | 66 + .../apscheduler/schedulers/background.py | 43 + .../apscheduler/schedulers/base.py | 1026 + .../apscheduler/schedulers/blocking.py | 35 + .../apscheduler/schedulers/gevent.py | 35 + .../apscheduler/schedulers/qt.py | 50 + .../apscheduler/schedulers/tornado.py | 63 + .../apscheduler/schedulers/twisted.py | 62 + .../apscheduler/triggers/__init__.py | 0 .../apscheduler/triggers/base.py | 37 + .../apscheduler/triggers/combining.py | 95 + .../apscheduler/triggers/cron/__init__.py | 239 + .../apscheduler/triggers/cron/expressions.py | 251 + .../apscheduler/triggers/cron/fields.py | 111 + .../apscheduler/triggers/date.py | 51 + .../apscheduler/triggers/interval.py | 108 + .../site-packages/apscheduler/util.py | 430 + .../async_timeout-4.0.2.dist-info/INSTALLER | 1 + .../async_timeout-4.0.2.dist-info/LICENSE | 13 + .../async_timeout-4.0.2.dist-info/METADATA | 133 + .../async_timeout-4.0.2.dist-info/RECORD | 0 .../async_timeout-4.0.2.dist-info/REQUESTED | 0 .../async_timeout-4.0.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../async_timeout-4.0.2.dist-info}/zip-safe | 0 .../site-packages/async_timeout/__init__.py | 247 + .../site-packages/async_timeout/py.typed | 1 + .../beautifulsoup4-4.12.2.dist-info/INSTALLER | 1 + .../beautifulsoup4-4.12.2.dist-info/METADATA | 116 + .../beautifulsoup4-4.12.2.dist-info/RECORD | 0 .../beautifulsoup4-4.12.2.dist-info/REQUESTED | 0 .../beautifulsoup4-4.12.2.dist-info/WHEEL | 4 + .../licenses/AUTHORS | 49 + .../licenses/LICENSE | 31 + python/lib/python3.11/site-packages/brotli.py | 56 + .../bs4-0.0.1-py3.11.egg-info/PKG-INFO | 0 .../bs4-0.0.1-py3.11.egg-info/SOURCES.txt | 0 .../dependency_links.txt | 0 .../installed-files.txt | 0 .../bs4-0.0.1-py3.11.egg-info/requires.txt | 0 .../bs4-0.0.1-py3.11.egg-info/top_level.txt | 0 .../python3.11/site-packages/bs4/__init__.py | 840 + .../site-packages/bs4/builder/__init__.py | 631 + .../site-packages/bs4/builder/_html5lib.py | 479 + .../site-packages/bs4/builder/_htmlparser.py | 387 + .../site-packages/bs4/builder/_lxml.py | 386 + .../lib/python3.11/site-packages/bs4/css.py | 280 + .../python3.11/site-packages/bs4/dammit.py | 1095 ++ .../python3.11/site-packages/bs4/diagnose.py | 233 + .../python3.11/site-packages/bs4/element.py | 2430 +++ .../python3.11/site-packages/bs4/formatter.py | 185 + .../site-packages/bs4/tests/__init__.py | 1177 ++ ...mized-bs4_fuzzer-4818336571064320.testcase | 1 + ...mized-bs4_fuzzer-4999465949331456.testcase | 1 + ...mized-bs4_fuzzer-5167584867909632.testcase | Bin 0 -> 19469 bytes ...mized-bs4_fuzzer-5703933063462912.testcase | 2 + ...mized-bs4_fuzzer-5843991618256896.testcase | 1 + ...mized-bs4_fuzzer-5984173902397440.testcase | Bin 0 -> 51495 bytes ...mized-bs4_fuzzer-6124268085182464.testcase | 1 + ...mized-bs4_fuzzer-6241471367348224.testcase | 1 + ...mized-bs4_fuzzer-6450958476902400.testcase | Bin 0 -> 3546 bytes ...mized-bs4_fuzzer-6600557255327744.testcase | Bin 0 -> 124 bytes ...0c8ed8bcd0785b67000fcd5dea1d33f08.testcase | Bin 0 -> 2607 bytes .../site-packages/bs4/tests/test_builder.py | 29 + .../bs4/tests/test_builder_registry.py | 137 + .../site-packages/bs4/tests/test_css.py | 487 + .../site-packages/bs4/tests/test_dammit.py | 370 + .../site-packages/bs4/tests/test_docs.py | 38 + .../site-packages/bs4/tests/test_element.py | 74 + .../site-packages/bs4/tests/test_formatter.py | 113 + .../site-packages/bs4/tests/test_fuzz.py | 91 + .../site-packages/bs4/tests/test_html5lib.py | 224 + .../bs4/tests/test_htmlparser.py | 148 + .../site-packages/bs4/tests/test_lxml.py | 203 + .../bs4/tests/test_navigablestring.py | 144 + .../bs4/tests/test_pageelement.py | 378 + .../site-packages/bs4/tests/test_soup.py | 504 + .../site-packages/bs4/tests/test_tag.py | 221 + .../site-packages/bs4/tests/test_tree.py | 1304 ++ .../certifi-2023.5.7.dist-info/INSTALLER | 1 + .../certifi-2023.5.7.dist-info/LICENSE | 21 + .../certifi-2023.5.7.dist-info/METADATA | 69 + .../certifi-2023.5.7.dist-info/RECORD | 0 .../certifi-2023.5.7.dist-info/REQUESTED | 0 .../certifi-2023.5.7.dist-info/WHEEL | 5 + .../certifi-2023.5.7.dist-info/top_level.txt | 1 + .../site-packages}/certifi/__init__.py | 0 .../site-packages/certifi/__main__.py | 12 + .../site-packages}/certifi/cacert.pem | 0 .../python3.11/site-packages/certifi/core.py | 108 + .../python3.11/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 616 + .../charset_normalizer-3.1.0.dist-info/RECORD | 0 .../REQUESTED | 0 .../charset_normalizer-3.1.0.dist-info/WHEEL | 0 .../entry_points.txt | 2 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 45 + .../site-packages/charset_normalizer/api.py | 554 + .../charset_normalizer/assets/__init__.py | 1440 ++ .../site-packages/charset_normalizer/cd.py | 390 + .../charset_normalizer/cli/__init__.py | 0 .../charset_normalizer/cli/normalizer.py | 296 + .../charset_normalizer/constant.py | 495 + .../charset_normalizer/legacy.py | 54 + .../md.cpython-311-x86_64-linux-gnu.so | Bin .../site-packages/charset_normalizer/md.py | 571 + .../md__mypyc.cpython-311-x86_64-linux-gnu.so | Bin .../charset_normalizer/models.py | 337 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 + .../charset_normalizer/version.py | 6 + .../click-8.1.3.dist-info/INSTALLER | 1 + .../click-8.1.3.dist-info/LICENSE.rst | 28 + .../click-8.1.3.dist-info/METADATA | 111 + .../click-8.1.3.dist-info/RECORD | 0 .../click-8.1.3.dist-info/REQUESTED | 0 .../site-packages/click-8.1.3.dist-info/WHEEL | 5 + .../click-8.1.3.dist-info/top_level.txt | 1 + .../site-packages/click/__init__.py | 73 + .../python3.11/site-packages/click/_compat.py | 626 + .../site-packages/click/_termui_impl.py | 717 + .../site-packages/click/_textwrap.py | 49 + .../site-packages/click/_winconsole.py | 279 + .../python3.11/site-packages/click/core.py | 2998 +++ .../site-packages/click/decorators.py | 497 + .../site-packages/click/exceptions.py | 287 + .../site-packages/click/formatting.py | 301 + .../python3.11/site-packages/click/globals.py | 68 + .../python3.11/site-packages/click/parser.py | 529 + .../python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 580 + .../python3.11/site-packages/click/termui.py | 787 + .../python3.11/site-packages/click/testing.py | 479 + .../python3.11/site-packages/click/types.py | 1073 ++ .../python3.11/site-packages/click/utils.py | 580 + .../site-packages/distutils-precedence.pth | 0 .../filelock-3.12.2.dist-info/INSTALLER | 1 + .../filelock-3.12.2.dist-info/METADATA | 55 + .../filelock-3.12.2.dist-info/RECORD | 0 .../filelock-3.12.2.dist-info/REQUESTED | 0 .../filelock-3.12.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 24 + .../site-packages/filelock/__init__.py | 51 + .../python3.11/site-packages/filelock/_api.py | 281 + .../site-packages/filelock/_error.py | 30 + .../site-packages/filelock/_soft.py | 46 + .../site-packages/filelock/_unix.py | 63 + .../site-packages/filelock/_util.py | 37 + .../site-packages/filelock/_windows.py | 64 + .../site-packages/filelock/py.typed | 0 .../site-packages/filelock/version.py | 4 + .../site-packages/flask/__init__.py | 71 + .../site-packages/flask/__main__.py | 3 + .../lib/python3.11/site-packages/flask/app.py | 2552 +++ .../site-packages/flask/blueprints.py | 712 + .../lib/python3.11/site-packages/flask/cli.py | 1054 + .../python3.11/site-packages/flask/config.py | 338 + .../lib/python3.11/site-packages/flask/ctx.py | 438 + .../site-packages/flask/debughelpers.py | 158 + .../python3.11/site-packages/flask/globals.py | 107 + .../python3.11/site-packages/flask/helpers.py | 705 + .../site-packages/flask/json/__init__.py | 342 + .../site-packages/flask/json/provider.py | 310 + .../site-packages/flask/json/tag.py | 312 + .../python3.11/site-packages/flask/logging.py | 74 + .../python3.11/site-packages/flask/py.typed | 0 .../site-packages/flask/scaffold.py | 936 + .../site-packages/flask/sessions.py | 421 + .../python3.11/site-packages/flask/signals.py | 56 + .../site-packages/flask/templating.py | 212 + .../python3.11/site-packages/flask/testing.py | 301 + .../python3.11/site-packages/flask/typing.py | 80 + .../python3.11/site-packages/flask/views.py | 188 + .../site-packages/flask/wrappers.py | 171 + .../idna-3.4.dist-info/INSTALLER | 1 + .../idna-3.4.dist-info/LICENSE.md | 29 + .../site-packages/idna-3.4.dist-info/METADATA | 242 + .../site-packages/idna-3.4.dist-info/RECORD | 0 .../idna-3.4.dist-info/REQUESTED | 0 .../site-packages/idna-3.4.dist-info/WHEEL | 4 + .../site-packages}/idna/__init__.py | 0 .../python3.11/site-packages}/idna/codec.py | 0 .../python3.11/site-packages}/idna/compat.py | 0 .../python3.11/site-packages}/idna/core.py | 0 .../site-packages}/idna/idnadata.py | 0 .../site-packages}/idna/intranges.py | 0 .../site-packages}/idna/package_data.py | 0 .../python3.11/site-packages/idna/py.typed | 0 .../site-packages}/idna/uts46data.py | 0 .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 135 + .../importlib_metadata-6.6.0.dist-info/RECORD | 0 .../REQUESTED | 0 .../importlib_metadata-6.6.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../importlib_metadata/__init__.py | 987 + .../importlib_metadata/_adapters.py | 90 + .../importlib_metadata/_collections.py | 0 .../importlib_metadata/_compat.py | 82 + .../importlib_metadata/_functools.py | 0 .../importlib_metadata/_itertools.py | 0 .../site-packages/importlib_metadata/_meta.py | 63 + .../importlib_metadata/_py39compat.py | 35 + .../importlib_metadata/_text.py | 0 .../site-packages/importlib_metadata/py.typed | 0 .../itsdangerous-2.1.2.dist-info/INSTALLER | 1 + .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.1.2.dist-info/METADATA | 97 + .../itsdangerous-2.1.2.dist-info/RECORD | 0 .../itsdangerous-2.1.2.dist-info/REQUESTED | 0 .../itsdangerous-2.1.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 19 + .../site-packages/itsdangerous/_json.py | 16 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 107 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../site-packages/itsdangerous/signer.py | 257 + .../site-packages/itsdangerous/timed.py | 234 + .../site-packages/itsdangerous/url_safe.py | 80 + .../site-packages/jinja2/__init__.py | 37 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 84 + .../site-packages/jinja2/bccache.py | 406 + .../site-packages/jinja2/compiler.py | 1957 ++ .../site-packages/jinja2/constants.py | 20 + .../python3.11/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1667 ++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.11/site-packages/jinja2/ext.py | 859 + .../site-packages/jinja2/filters.py | 1840 ++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.11/site-packages/jinja2/lexer.py | 866 + .../site-packages/jinja2/loaders.py | 661 + .../python3.11/site-packages/jinja2/meta.py | 111 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.11/site-packages/jinja2/nodes.py | 1204 ++ .../site-packages/jinja2/optimizer.py | 47 + .../python3.11/site-packages/jinja2/parser.py | 1032 + .../python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1053 + .../site-packages/jinja2/sandbox.py | 428 + .../python3.11/site-packages/jinja2/tests.py | 255 + .../python3.11/site-packages/jinja2/utils.py | 755 + .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 304 + .../site-packages/markupsafe/_native.py | 63 + .../site-packages/markupsafe/_speedups.c | 320 + .../_speedups.cpython-311-x86_64-linux-gnu.so | Bin .../site-packages/markupsafe/_speedups.pyi | 9 + .../site-packages/markupsafe/py.typed | 0 .../mutagen-1.46.0.dist-info/COPYING | 339 + .../mutagen-1.46.0.dist-info/INSTALLER | 1 + .../mutagen-1.46.0.dist-info/METADATA | 43 + .../mutagen-1.46.0.dist-info/RECORD | 0 .../mutagen-1.46.0.dist-info/REQUESTED | 0 .../mutagen-1.46.0.dist-info/WHEEL | 5 + .../mutagen-1.46.0.dist-info/entry_points.txt | 8 + .../mutagen-1.46.0.dist-info/top_level.txt | 1 + .../site-packages/mutagen/__init__.py | 43 + .../site-packages/mutagen/_constants.py | 203 + .../python3.11/site-packages/mutagen/_file.py | 302 + .../python3.11/site-packages/mutagen/_iff.py | 386 + .../python3.11/site-packages/mutagen/_riff.py | 69 + .../python3.11/site-packages/mutagen/_tags.py | 145 + .../site-packages/mutagen/_tools/__init__.py | 6 + .../site-packages/mutagen/_tools/_util.py | 89 + .../site-packages/mutagen/_tools/mid3cp.py | 134 + .../site-packages/mutagen/_tools/mid3iconv.py | 168 + .../site-packages/mutagen/_tools/mid3v2.py | 484 + .../site-packages/mutagen/_tools/moggsplit.py | 74 + .../mutagen/_tools/mutagen_inspect.py | 43 + .../mutagen/_tools/mutagen_pony.py | 113 + .../python3.11/site-packages/mutagen/_util.py | 1040 + .../site-packages/mutagen/_vorbis.py | 307 + .../python3.11/site-packages/mutagen/aac.py | 423 + .../python3.11/site-packages/mutagen/ac3.py | 329 + .../python3.11/site-packages/mutagen/aiff.py | 244 + .../python3.11/site-packages/mutagen/apev2.py | 725 + .../site-packages/mutagen/asf/__init__.py | 331 + .../site-packages/mutagen/asf/_attrs.py | 428 + .../site-packages/mutagen/asf/_objects.py | 468 + .../site-packages/mutagen/asf/_util.py | 315 + .../site-packages/mutagen/dsdiff.py | 266 + .../python3.11/site-packages/mutagen/dsf.py | 357 + .../site-packages/mutagen/easyid3.py | 558 + .../site-packages/mutagen/easymp4.py | 287 + .../python3.11/site-packages/mutagen/flac.py | 941 + .../site-packages/mutagen/id3/__init__.py | 95 + .../site-packages/mutagen/id3/_file.py | 420 + .../site-packages/mutagen/id3/_frames.py | 2139 +++ .../site-packages/mutagen/id3/_id3v1.py | 217 + .../site-packages/mutagen/id3/_specs.py | 889 + .../site-packages/mutagen/id3/_tags.py | 629 + .../site-packages/mutagen/id3/_util.py | 170 + .../python3.11/site-packages/mutagen/m4a.py | 102 + .../site-packages/mutagen/monkeysaudio.py | 100 + .../site-packages/mutagen/mp3/__init__.py | 481 + .../site-packages/mutagen/mp3/_util.py | 526 + .../site-packages/mutagen/mp4/__init__.py | 1272 ++ .../site-packages/mutagen/mp4/_as_entry.py | 546 + .../site-packages/mutagen/mp4/_atom.py | 191 + .../site-packages/mutagen/mp4/_util.py | 21 + .../site-packages/mutagen/musepack.py | 292 + .../python3.11/site-packages/mutagen/ogg.py | 593 + .../site-packages/mutagen/oggflac.py | 181 + .../site-packages/mutagen/oggopus.py | 183 + .../site-packages/mutagen/oggspeex.py | 175 + .../site-packages/mutagen/oggtheora.py | 181 + .../site-packages/mutagen/oggvorbis.py | 193 + .../site-packages/mutagen/optimfrog.py | 107 + .../python3.11/site-packages/mutagen/py.typed | 0 .../python3.11/site-packages/mutagen/smf.py | 214 + .../python3.11/site-packages/mutagen/tak.py | 237 + .../site-packages/mutagen/trueaudio.py | 100 + .../python3.11/site-packages/mutagen/wave.py | 209 + .../site-packages/mutagen/wavpack.py | 140 + .../pip-22.3.1.dist-info/INSTALLER | 1 + .../pip-22.3.1.dist-info}/LICENSE.txt | 0 .../pip-22.3.1.dist-info/METADATA | 0 .../site-packages/pip-22.3.1.dist-info/RECORD | 0 .../pip-22.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-22.3.1.dist-info/WHEEL | 5 + .../pip-22.3.1.dist-info/entry_points.txt | 0 .../pip-22.3.1.dist-info/top_level.txt | 1 + .../python3.11/site-packages/pip/__init__.py | 0 .../python3.11/site-packages/pip/__main__.py | 31 + .../site-packages/pip/__pip-runner__.py | 0 .../site-packages/pip/_internal/__init__.py | 0 .../site-packages/pip/_internal/build_env.py | 0 .../site-packages/pip/_internal/cache.py | 0 .../pip/_internal/cli/__init__.py | 0 .../pip/_internal/cli/autocompletion.py | 0 .../pip/_internal/cli/base_command.py | 0 .../pip/_internal/cli/cmdoptions.py | 0 .../pip/_internal/cli/command_context.py | 0 .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 0 .../site-packages/pip/_internal/cli/parser.py | 0 .../pip/_internal/cli/progress_bars.py | 0 .../pip/_internal/cli/req_command.py | 0 .../pip/_internal/cli/spinners.py | 0 .../pip/_internal/cli/status_codes.py | 0 .../pip/_internal/commands/__init__.py | 0 .../pip/_internal/commands/cache.py | 0 .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 0 .../pip/_internal/commands/configuration.py | 0 .../pip/_internal/commands/debug.py | 0 .../pip/_internal/commands/download.py | 0 .../pip/_internal/commands/freeze.py | 0 .../pip/_internal/commands/hash.py | 0 .../pip/_internal/commands/help.py | 0 .../pip/_internal/commands/index.py | 0 .../pip/_internal/commands/inspect.py | 0 .../pip/_internal/commands/install.py | 0 .../pip/_internal/commands/list.py | 0 .../pip/_internal/commands/search.py | 0 .../pip/_internal/commands/show.py | 0 .../pip/_internal/commands/uninstall.py | 0 .../pip/_internal/commands/wheel.py | 0 .../pip/_internal/configuration.py | 0 .../pip/_internal/distributions/__init__.py | 0 .../pip/_internal/distributions/base.py | 0 .../pip/_internal/distributions/installed.py | 0 .../pip/_internal/distributions/sdist.py | 0 .../pip/_internal/distributions/wheel.py | 0 .../site-packages/pip/_internal/exceptions.py | 0 .../pip/_internal/index/__init__.py | 0 .../pip/_internal/index/collector.py | 0 .../pip/_internal/index/package_finder.py | 0 .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 0 .../pip/_internal/locations/_distutils.py | 0 .../pip/_internal/locations/_sysconfig.py | 0 .../pip/_internal/locations/base.py | 0 .../site-packages/pip/_internal/main.py | 0 .../pip/_internal/metadata/__init__.py | 0 .../pip/_internal/metadata/_json.py | 0 .../pip/_internal/metadata/base.py | 0 .../_internal/metadata/importlib/__init__.py | 0 .../_internal/metadata/importlib/_compat.py | 0 .../_internal/metadata/importlib/_dists.py | 0 .../pip/_internal/metadata/importlib/_envs.py | 0 .../pip/_internal/metadata/pkg_resources.py | 0 .../pip/_internal/models/__init__.py | 0 .../pip/_internal/models/candidate.py | 0 .../pip/_internal/models/direct_url.py | 0 .../pip/_internal/models/format_control.py | 0 .../pip/_internal/models/index.py | 0 .../_internal/models/installation_report.py | 0 .../pip/_internal/models/link.py | 0 .../pip/_internal/models/scheme.py | 0 .../pip/_internal/models/search_scope.py | 0 .../pip/_internal/models/selection_prefs.py | 0 .../pip/_internal/models/target_python.py | 0 .../pip/_internal/models/wheel.py | 0 .../pip/_internal/network/__init__.py | 0 .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 0 .../pip/_internal/network/download.py | 0 .../pip/_internal/network/lazy_wheel.py | 0 .../pip/_internal/network/session.py | 0 .../pip/_internal/network/utils.py | 0 .../pip/_internal/network/xmlrpc.py | 0 .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../operations/build/build_tracker.py | 0 .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 0 .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 0 .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 0 .../_internal/operations/install/__init__.py | 0 .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 0 .../pip/_internal/operations/install/wheel.py | 0 .../pip/_internal/operations/prepare.py | 0 .../site-packages/pip/_internal/pyproject.py | 0 .../pip/_internal/req/__init__.py | 0 .../pip/_internal/req/constructors.py | 0 .../pip/_internal/req/req_file.py | 0 .../pip/_internal/req/req_install.py | 0 .../pip/_internal/req/req_set.py | 0 .../pip/_internal/req/req_uninstall.py | 0 .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 0 .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 0 .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 0 .../resolution/resolvelib/candidates.py | 0 .../resolution/resolvelib/factory.py | 0 .../resolution/resolvelib/found_candidates.py | 0 .../resolution/resolvelib/provider.py | 0 .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 0 .../pip/_internal/self_outdated_check.py | 0 .../pip/_internal/utils/__init__.py | 0 .../site-packages/pip/_internal/utils/_log.py | 0 .../pip/_internal/utils/appdirs.py | 0 .../pip/_internal/utils/compat.py | 0 .../pip/_internal/utils/compatibility_tags.py | 0 .../pip/_internal/utils/datetime.py | 0 .../pip/_internal/utils/deprecation.py | 0 .../pip/_internal/utils/direct_url_helpers.py | 0 .../pip/_internal/utils/distutils_args.py | 0 .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 0 .../pip/_internal/utils/entrypoints.py | 0 .../pip/_internal/utils/filesystem.py | 0 .../pip/_internal/utils/filetypes.py | 0 .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 0 .../_internal/utils/inject_securetransport.py | 0 .../pip/_internal/utils/logging.py | 0 .../site-packages/pip/_internal/utils/misc.py | 0 .../pip/_internal/utils/models.py | 0 .../pip/_internal/utils/packaging.py | 0 .../pip/_internal/utils/setuptools_build.py | 0 .../pip/_internal/utils/subprocess.py | 0 .../pip/_internal/utils/temp_dir.py | 0 .../pip/_internal/utils/unpacking.py | 0 .../site-packages/pip/_internal/utils/urls.py | 0 .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 0 .../pip/_internal/vcs/__init__.py | 0 .../site-packages/pip/_internal/vcs/bazaar.py | 0 .../site-packages/pip/_internal/vcs/git.py | 0 .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 0 .../pip/_internal/vcs/versioncontrol.py | 0 .../pip/_internal/wheel_builder.py | 0 .../site-packages/pip/_vendor/__init__.py | 0 .../pip/_vendor/cachecontrol/__init__.py | 0 .../pip/_vendor/cachecontrol/_cmd.py | 0 .../pip/_vendor/cachecontrol/adapter.py | 0 .../pip/_vendor/cachecontrol/cache.py | 0 .../_vendor/cachecontrol/caches/__init__.py | 0 .../_vendor/cachecontrol/caches/file_cache.py | 0 .../cachecontrol/caches/redis_cache.py | 0 .../pip/_vendor/cachecontrol/compat.py | 0 .../pip/_vendor/cachecontrol/controller.py | 0 .../pip/_vendor/cachecontrol/filewrapper.py | 0 .../pip/_vendor/cachecontrol/heuristics.py | 0 .../pip/_vendor/cachecontrol/serialize.py | 0 .../pip/_vendor/cachecontrol/wrapper.py | 0 .../pip/_vendor/certifi/__init__.py | 0 .../pip/_vendor/certifi/__main__.py | 0 .../site-packages/pip/_vendor/certifi/core.py | 0 .../pip/_vendor/chardet/__init__.py | 0 .../pip/_vendor/chardet/big5freq.py | 0 .../pip/_vendor/chardet/big5prober.py | 0 .../pip/_vendor/chardet/chardistribution.py | 0 .../pip/_vendor/chardet/charsetgroupprober.py | 0 .../pip/_vendor/chardet/charsetprober.py | 0 .../pip/_vendor/chardet/cli/__init__.py | 0 .../pip/_vendor/chardet/cli/chardetect.py | 0 .../pip/_vendor/chardet/codingstatemachine.py | 0 .../pip/_vendor/chardet/cp949prober.py | 0 .../pip/_vendor/chardet/enums.py | 0 .../pip/_vendor/chardet/escprober.py | 0 .../pip/_vendor/chardet/escsm.py | 0 .../pip/_vendor/chardet/eucjpprober.py | 0 .../pip/_vendor/chardet/euckrfreq.py | 0 .../pip/_vendor/chardet/euckrprober.py | 0 .../pip/_vendor/chardet/euctwfreq.py | 0 .../pip/_vendor/chardet/euctwprober.py | 0 .../pip/_vendor/chardet/gb2312freq.py | 0 .../pip/_vendor/chardet/gb2312prober.py | 0 .../pip/_vendor/chardet/hebrewprober.py | 0 .../pip/_vendor/chardet/jisfreq.py | 0 .../pip/_vendor/chardet/johabfreq.py | 0 .../pip/_vendor/chardet/johabprober.py | 0 .../pip/_vendor/chardet/jpcntx.py | 0 .../pip/_vendor/chardet/langbulgarianmodel.py | 0 .../pip/_vendor/chardet/langgreekmodel.py | 0 .../pip/_vendor/chardet/langhebrewmodel.py | 0 .../pip/_vendor/chardet/langhungarianmodel.py | 0 .../pip/_vendor/chardet/langrussianmodel.py | 0 .../pip/_vendor/chardet/langthaimodel.py | 0 .../pip/_vendor/chardet/langturkishmodel.py | 0 .../pip/_vendor/chardet/latin1prober.py | 0 .../pip/_vendor/chardet/mbcharsetprober.py | 0 .../pip/_vendor/chardet/mbcsgroupprober.py | 0 .../pip/_vendor/chardet/mbcssm.py | 0 .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 0 .../pip/_vendor/chardet/sbcharsetprober.py | 0 .../pip/_vendor/chardet/sbcsgroupprober.py | 0 .../pip/_vendor/chardet/sjisprober.py | 0 .../pip/_vendor/chardet/universaldetector.py | 0 .../pip/_vendor/chardet/utf1632prober.py | 0 .../pip/_vendor/chardet/utf8prober.py | 0 .../pip/_vendor/chardet/version.py | 0 .../pip/_vendor/colorama/__init__.py | 0 .../pip/_vendor/colorama/ansi.py | 0 .../pip/_vendor/colorama/ansitowin32.py | 0 .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 0 .../pip/_vendor/distlib/compat.py | 0 .../pip/_vendor/distlib/database.py | 0 .../pip/_vendor/distlib/index.py | 0 .../pip/_vendor/distlib/locators.py | 0 .../pip/_vendor/distlib/manifest.py | 0 .../pip/_vendor/distlib/markers.py | 0 .../pip/_vendor/distlib/metadata.py | 0 .../pip/_vendor/distlib/resources.py | 0 .../pip/_vendor/distlib/scripts.py | 0 .../site-packages/pip/_vendor/distlib/util.py | 0 .../pip/_vendor/distlib/version.py | 0 .../pip/_vendor/distlib/wheel.py | 0 .../pip/_vendor/distro/__init__.py | 0 .../pip/_vendor/distro/__main__.py | 0 .../pip/_vendor/distro/distro.py | 0 .../pip/_vendor/idna/__init__.py | 44 + .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 0 .../pip/_vendor/idna/idnadata.py | 0 .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 0 .../pip/_vendor/idna/uts46data.py | 0 .../pip/_vendor/msgpack/__init__.py | 0 .../pip/_vendor/msgpack/exceptions.py | 0 .../site-packages/pip/_vendor/msgpack/ext.py | 0 .../pip/_vendor/msgpack/fallback.py | 0 .../pip}/_vendor/packaging/__about__.py | 0 .../pip/_vendor/packaging/__init__.py | 0 .../pip/_vendor/packaging/_manylinux.py | 0 .../pip}/_vendor/packaging/_musllinux.py | 0 .../pip}/_vendor/packaging/_structures.py | 0 .../pip/_vendor/packaging/markers.py | 0 .../pip/_vendor/packaging/requirements.py | 0 .../pip}/_vendor/packaging/specifiers.py | 0 .../pip}/_vendor/packaging/tags.py | 0 .../pip/_vendor/packaging/utils.py | 0 .../pip/_vendor/packaging/version.py | 0 .../pip/_vendor/pep517/__init__.py | 0 .../pip/_vendor/pep517/_compat.py | 0 .../site-packages/pip/_vendor/pep517/build.py | 0 .../site-packages/pip/_vendor/pep517/check.py | 0 .../pip/_vendor/pep517/colorlog.py | 0 .../pip/_vendor/pep517/dirtools.py | 0 .../pip/_vendor/pep517/envbuild.py | 0 .../pip/_vendor/pep517/in_process/__init__.py | 0 .../_vendor/pep517/in_process/_in_process.py | 0 .../site-packages/pip/_vendor/pep517/meta.py | 0 .../pip/_vendor/pep517/wrappers.py | 0 .../pip/_vendor/pkg_resources/__init__.py | 3296 ++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 0 .../pip/_vendor/platformdirs/__main__.py | 46 + .../pip/_vendor/platformdirs/android.py | 0 .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 0 .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/pygments/__init__.py | 0 .../pip/_vendor/pygments/__main__.py | 0 .../pip/_vendor/pygments/cmdline.py | 0 .../pip/_vendor/pygments/console.py | 0 .../pip/_vendor/pygments/filter.py | 0 .../pip/_vendor/pygments/filters/__init__.py | 0 .../pip/_vendor/pygments/formatter.py | 0 .../_vendor/pygments/formatters/__init__.py | 0 .../_vendor/pygments/formatters/_mapping.py | 0 .../pip/_vendor/pygments/formatters/bbcode.py | 0 .../pip/_vendor/pygments/formatters/groff.py | 0 .../pip/_vendor/pygments/formatters/html.py | 0 .../pip/_vendor/pygments/formatters/img.py | 0 .../pip/_vendor/pygments/formatters/irc.py | 0 .../pip/_vendor/pygments/formatters/latex.py | 0 .../pip/_vendor/pygments/formatters/other.py | 0 .../pygments/formatters/pangomarkup.py | 0 .../pip/_vendor/pygments/formatters/rtf.py | 0 .../pip/_vendor/pygments/formatters/svg.py | 0 .../_vendor/pygments/formatters/terminal.py | 0 .../pygments/formatters/terminal256.py | 0 .../pip/_vendor/pygments/lexer.py | 0 .../pip/_vendor/pygments/lexers/__init__.py | 0 .../pip/_vendor/pygments/lexers/_mapping.py | 0 .../pip/_vendor/pygments/lexers/python.py | 0 .../pip/_vendor/pygments/modeline.py | 0 .../pip/_vendor/pygments/plugin.py | 0 .../pip/_vendor/pygments/regexopt.py | 0 .../pip/_vendor/pygments/scanner.py | 0 .../pip/_vendor/pygments/sphinxext.py | 0 .../pip/_vendor/pygments/style.py | 0 .../pip/_vendor/pygments/styles/__init__.py | 0 .../pip/_vendor/pygments/token.py | 0 .../pip/_vendor/pygments/unistring.py | 0 .../pip/_vendor/pygments/util.py | 0 .../pip/_vendor/pyparsing/__init__.py | 0 .../pip/_vendor/pyparsing/actions.py | 0 .../pip}/_vendor/pyparsing/common.py | 0 .../pip/_vendor/pyparsing/core.py | 0 .../pip/_vendor/pyparsing/diagram/__init__.py | 0 .../pip/_vendor/pyparsing/exceptions.py | 0 .../pip/_vendor/pyparsing/helpers.py | 0 .../pip/_vendor/pyparsing/results.py | 0 .../pip/_vendor/pyparsing/testing.py | 0 .../pip/_vendor/pyparsing/unicode.py | 0 .../pip}/_vendor/pyparsing/util.py | 0 .../pip/_vendor/requests/__init__.py | 0 .../pip/_vendor/requests/__version__.py | 0 .../pip/_vendor/requests/_internal_utils.py | 0 .../pip/_vendor/requests/adapters.py | 0 .../site-packages/pip/_vendor/requests/api.py | 0 .../pip/_vendor}/requests/auth.py | 0 .../pip/_vendor/requests/certs.py | 0 .../pip/_vendor/requests/compat.py | 0 .../pip/_vendor}/requests/cookies.py | 0 .../pip/_vendor/requests/exceptions.py | 0 .../pip/_vendor/requests/help.py | 0 .../pip/_vendor}/requests/hooks.py | 0 .../pip/_vendor/requests/models.py | 0 .../pip/_vendor/requests/packages.py | 0 .../pip/_vendor/requests/sessions.py | 0 .../pip/_vendor}/requests/status_codes.py | 0 .../pip/_vendor}/requests/structures.py | 0 .../pip/_vendor/requests/utils.py | 0 .../pip/_vendor/resolvelib/__init__.py | 26 + .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 0 .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 0 .../pip/_vendor/rich/__main__.py | 0 .../pip/_vendor/rich/_cell_widths.py | 0 .../pip/_vendor/rich/_emoji_codes.py | 0 .../pip/_vendor/rich/_emoji_replace.py | 0 .../pip/_vendor/rich/_export_format.py | 0 .../pip/_vendor/rich/_extension.py | 0 .../pip/_vendor/rich/_inspect.py | 0 .../pip/_vendor/rich/_log_render.py | 0 .../site-packages/pip/_vendor/rich/_loop.py | 0 .../pip/_vendor/rich/_palettes.py | 0 .../site-packages/pip/_vendor/rich/_pick.py | 0 .../site-packages/pip/_vendor/rich/_ratio.py | 0 .../pip/_vendor/rich/_spinners.py | 0 .../site-packages/pip/_vendor/rich/_stack.py | 0 .../site-packages/pip/_vendor/rich/_timer.py | 0 .../pip/_vendor/rich/_win32_console.py | 0 .../pip/_vendor/rich/_windows.py | 0 .../pip/_vendor/rich/_windows_renderer.py | 0 .../site-packages/pip/_vendor/rich/_wrap.py | 0 .../site-packages/pip/_vendor/rich/abc.py | 0 .../site-packages/pip/_vendor/rich/align.py | 0 .../site-packages/pip/_vendor/rich/ansi.py | 0 .../site-packages/pip/_vendor/rich/bar.py | 0 .../site-packages/pip/_vendor/rich/box.py | 0 .../site-packages/pip/_vendor/rich/cells.py | 0 .../site-packages/pip/_vendor/rich/color.py | 0 .../pip/_vendor/rich/color_triplet.py | 0 .../site-packages/pip/_vendor/rich/columns.py | 0 .../site-packages/pip/_vendor/rich/console.py | 0 .../pip/_vendor/rich/constrain.py | 0 .../pip/_vendor/rich/containers.py | 0 .../site-packages/pip/_vendor/rich/control.py | 0 .../pip/_vendor/rich/default_styles.py | 0 .../pip/_vendor/rich/diagnose.py | 0 .../site-packages/pip/_vendor/rich/emoji.py | 0 .../site-packages/pip/_vendor/rich/errors.py | 0 .../pip/_vendor/rich/file_proxy.py | 0 .../pip/_vendor/rich/filesize.py | 0 .../pip/_vendor/rich/highlighter.py | 0 .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 0 .../site-packages/pip/_vendor/rich/layout.py | 0 .../site-packages/pip/_vendor/rich/live.py | 0 .../pip/_vendor/rich/live_render.py | 0 .../site-packages/pip/_vendor/rich/logging.py | 0 .../site-packages/pip/_vendor/rich/markup.py | 0 .../site-packages/pip/_vendor/rich/measure.py | 0 .../site-packages/pip/_vendor/rich/padding.py | 0 .../site-packages/pip/_vendor/rich/pager.py | 0 .../site-packages/pip/_vendor/rich/palette.py | 0 .../site-packages/pip/_vendor/rich/panel.py | 0 .../site-packages/pip/_vendor/rich/pretty.py | 0 .../pip/_vendor/rich/progress.py | 0 .../pip/_vendor/rich/progress_bar.py | 0 .../site-packages/pip/_vendor/rich/prompt.py | 0 .../pip/_vendor/rich/protocol.py | 0 .../site-packages/pip/_vendor/rich/region.py | 0 .../site-packages/pip/_vendor/rich/repr.py | 0 .../site-packages/pip/_vendor/rich/rule.py | 0 .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 0 .../site-packages/pip/_vendor/rich/segment.py | 0 .../site-packages/pip/_vendor/rich/spinner.py | 0 .../site-packages/pip/_vendor/rich/status.py | 0 .../site-packages/pip/_vendor/rich/style.py | 0 .../site-packages/pip/_vendor/rich/styled.py | 0 .../site-packages/pip/_vendor/rich/syntax.py | 0 .../site-packages/pip/_vendor/rich/table.py | 0 .../pip/_vendor/rich/terminal_theme.py | 0 .../site-packages/pip/_vendor/rich/text.py | 0 .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 0 .../pip/_vendor/rich/traceback.py | 0 .../site-packages/pip/_vendor/rich/tree.py | 0 .../site-packages/pip/_vendor/six.py | 0 .../pip/_vendor/tenacity/__init__.py | 0 .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 0 .../pip/_vendor/tenacity/retry.py | 0 .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 0 .../pip/_vendor/tomli/__init__.py | 0 .../pip/_vendor/tomli/_parser.py | 0 .../site-packages/pip/_vendor/tomli/_re.py | 0 .../site-packages/pip/_vendor/tomli/_types.py | 0 .../pip/_vendor/typing_extensions.py | 0 .../pip/_vendor/urllib3/__init__.py | 0 .../pip/_vendor}/urllib3/_collections.py | 0 .../pip/_vendor/urllib3/_version.py | 0 .../pip/_vendor/urllib3/connection.py | 0 .../pip/_vendor/urllib3/connectionpool.py | 0 .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 0 .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 0 .../contrib/_securetransport/low_level.py | 0 .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 0 .../urllib3/contrib/securetransport.py | 0 .../pip/_vendor/urllib3/contrib/socks.py | 0 .../pip/_vendor/urllib3/exceptions.py | 0 .../pip/_vendor/urllib3/fields.py | 0 .../pip/_vendor/urllib3/filepost.py | 0 .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 0 .../pip/_vendor/urllib3/packages/six.py | 0 .../pip/_vendor/urllib3/poolmanager.py | 0 .../pip/_vendor/urllib3/request.py | 0 .../pip/_vendor/urllib3/response.py | 0 .../pip/_vendor/urllib3/util/__init__.py | 0 .../pip/_vendor/urllib3/util/connection.py | 0 .../pip/_vendor/urllib3/util/proxy.py | 0 .../pip/_vendor/urllib3/util/queue.py | 0 .../pip/_vendor/urllib3/util/request.py | 0 .../pip/_vendor/urllib3/util/response.py | 0 .../pip/_vendor/urllib3/util/retry.py | 0 .../pip/_vendor/urllib3/util/ssl_.py | 0 .../urllib3/util/ssl_match_hostname.py | 0 .../pip/_vendor/urllib3/util/ssltransport.py | 0 .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 0 .../pip/_vendor/urllib3/util/wait.py | 0 .../site-packages/pip/_vendor/vendor.txt | 0 .../pip/_vendor/webencodings/__init__.py | 0 .../pip/_vendor/webencodings/labels.py | 0 .../pip/_vendor/webencodings/mklabels.py | 0 .../pip/_vendor/webencodings/tests.py | 0 .../_vendor/webencodings/x_user_defined.py | 0 .../python3.11}/site-packages/pip/py.typed | 0 .../site-packages/pkg_resources/__init__.py | 0 .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 0 .../_vendor/importlib_resources/__init__.py | 0 .../_vendor/importlib_resources/_adapters.py | 0 .../_vendor/importlib_resources/_common.py | 0 .../_vendor/importlib_resources/_compat.py | 0 .../_vendor/importlib_resources/_itertools.py | 0 .../_vendor/importlib_resources/_legacy.py | 0 .../_vendor/importlib_resources/abc.py | 0 .../_vendor/importlib_resources/readers.py | 0 .../_vendor/importlib_resources/simple.py | 0 .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../pkg_resources/_vendor/jaraco/context.py | 0 .../pkg_resources/_vendor/jaraco/functools.py | 0 .../_vendor/jaraco/text/__init__.py | 0 .../_vendor/more_itertools/__init__.py | 0 .../_vendor/more_itertools/more.py | 0 .../_vendor/more_itertools/recipes.py | 0 .../_vendor/packaging/__about__.py | 0 .../_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 0 .../_vendor/packaging/_structures.py | 0 .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 0 .../pkg_resources}/_vendor/packaging/tags.py | 0 .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 0 .../_vendor/pyparsing/actions.py | 0 .../_vendor/pyparsing/common.py | 0 .../pkg_resources/_vendor/pyparsing/core.py | 0 .../_vendor/pyparsing/diagram/__init__.py | 0 .../_vendor/pyparsing/exceptions.py | 0 .../_vendor/pyparsing/helpers.py | 0 .../_vendor/pyparsing/results.py | 0 .../_vendor/pyparsing/testing.py | 0 .../_vendor/pyparsing/unicode.py | 0 .../pkg_resources}/_vendor/pyparsing/util.py | 0 .../pkg_resources/_vendor/zipp.py | 0 .../pkg_resources/extern/__init__.py | 0 .../AUTHORS.rst | 51 + .../pycryptodomex-3.18.0.dist-info/INSTALLER | 1 + .../LICENSE.rst | 61 + .../pycryptodomex-3.18.0.dist-info/METADATA | 88 + .../pycryptodomex-3.18.0.dist-info/RECORD | 0 .../pycryptodomex-3.18.0.dist-info/REQUESTED | 0 .../pycryptodomex-3.18.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/pysondb/__init__.py | 1 + .../site-packages/pysondb/__main__.py | 0 .../python3.11/site-packages/pysondb/cli.py | 107 + .../python3.11/site-packages/pysondb/db.py | 306 + .../site-packages/pysondb/db_types.py | 35 + .../site-packages/pysondb/errors.py | 24 + .../python3.11/site-packages/pysondb/utils.py | 91 + .../pysondb_v2-2.0.0.dist-info/INSTALLER | 1 + .../pysondb_v2-2.0.0.dist-info/LICENSE | 21 + .../pysondb_v2-2.0.0.dist-info/METADATA | 362 + .../pysondb_v2-2.0.0.dist-info/RECORD | 0 .../pysondb_v2-2.0.0.dist-info/REQUESTED | 0 .../pysondb_v2-2.0.0.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../pysondb_v2-2.0.0.dist-info/top_level.txt | 1 + .../pytz-2023.3.dist-info/INSTALLER | 1 + .../pytz-2023.3.dist-info/LICENSE.txt | 19 + .../pytz-2023.3.dist-info/METADATA | 0 .../pytz-2023.3.dist-info/RECORD | 0 .../pytz-2023.3.dist-info}/WHEEL | 0 .../pytz-2023.3.dist-info/top_level.txt | 1 + .../pytz-2023.3.dist-info/zip-safe | 1 + .../python3.11/site-packages/pytz/__init__.py | 0 .../site-packages/pytz/exceptions.py | 59 + .../lib/python3.11/site-packages/pytz/lazy.py | 172 + .../site-packages/pytz/reference.py | 140 + .../python3.11/site-packages/pytz/tzfile.py | 133 + .../python3.11/site-packages/pytz/tzinfo.py | 0 .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 735 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 2399 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 2429 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2052 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 2295 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 246 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 679 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 679 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 208 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 254 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 689 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 955 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2371 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 870 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1088 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1090 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1062 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 2030 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1010 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1152 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 436 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 618 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 232 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2410 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2254 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 834 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 250 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 184 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3592 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1102 bytes .../pytz/zoneinfo/America/Ciudad_Juarez | Bin 0 -> 1538 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 316 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1402 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 698 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2460 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2230 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2332 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 642 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2240 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes .../pytz/zoneinfo/America/Godthab | Bin .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3210 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1834 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 280 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2416 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 456 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1738 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1920 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1700 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1710 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1794 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 2074 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2353 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2368 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 218 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 392 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2852 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 730 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 430 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 590 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1418 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1128 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2274 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1004 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1423 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1222 bytes .../pytz/zoneinfo/America/Miquelon | Bin .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3154 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1496 bytes .../pytz/zoneinfo/America/Montreal | Bin .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Nassau | Bin .../pytz/zoneinfo/America/New_York | Bin 0 -> 3552 bytes .../pytz/zoneinfo/America/Nipigon | Bin .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2367 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2396 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2396 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2396 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1524 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1434 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 588 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2515 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 458 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2329 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3655 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 252 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1502 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Toronto | Bin .../pytz/zoneinfo/America/Tortola | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2892 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2305 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 283 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 172 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 2260 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 185 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1404 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 150 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 151 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1148 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1433 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1174 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 997 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 605 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 605 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 977 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1213 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2154 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 935 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 1873 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 213 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 577 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2028 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 221 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 194 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1152 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 379 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 151 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1257 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 285 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1193 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 328 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1151 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 991 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 353 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 237 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1011 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1188 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 563 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 401 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 577 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1021 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 877 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1238 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1137 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3498 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2396 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1897 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 256 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3503 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 150 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1200 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2229 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 456 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2358 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 475 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2190 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2229 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 702 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 1430 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 590 bytes .../site-packages/pytz/zoneinfo/CET | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2868 bytes .../pytz/zoneinfo/Canada/Eastern | Bin .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3655 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2892 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 1614 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2515 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2416 bytes .../site-packages/pytz/zoneinfo/EET | Bin 0 -> 1908 bytes .../site-packages/pytz/zoneinfo/EST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 2399 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3492 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 114 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1742 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1151 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2262 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2301 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2184 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2368 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3492 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3068 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1900 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1493 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1185 bytes .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3497 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2933 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2614 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2620 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1900 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1307 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2962 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1535 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2962 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2301 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2198 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1201 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2641 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1169 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1469 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2077 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2148 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1253 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2200 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2162 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 0 -> 116 bytes .../python3.11/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/HST | Bin 0 -> 115 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 148 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 151 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 227 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 302 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/MET | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/MST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2374 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1128 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1222 bytes .../python3.11/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2437 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/PRC | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 598 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 254 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 524 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 186 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 564 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 150 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 494 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 337 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 302 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 159 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 238 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 189 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 866 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 290 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 188 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 589 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 494 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 175 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 151 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3497 bytes .../site-packages/pytz/zoneinfo/ROC | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/ROK | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2371 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 360 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3592 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1682 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3552 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 329 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2230 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2852 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1535 bytes .../site-packages/pytz/zoneinfo/WET | Bin 0 -> 1905 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 0 .../site-packages/pytz/zoneinfo/leapseconds | 0 .../site-packages/pytz/zoneinfo/tzdata.zi | 0 .../site-packages/pytz/zoneinfo/zone.tab | 0 .../site-packages/pytz/zoneinfo/zone1970.tab | 0 .../redis-4.5.5.dist-info/INSTALLER | 1 + .../redis-4.5.5.dist-info/LICENSE | 21 + .../redis-4.5.5.dist-info/METADATA | 189 + .../redis-4.5.5.dist-info/RECORD | 0 .../redis-4.5.5.dist-info/REQUESTED | 0 .../site-packages/redis-4.5.5.dist-info/WHEEL | 5 + .../redis-4.5.5.dist-info/top_level.txt | 1 + .../site-packages/redis/__init__.py | 91 + .../site-packages/redis/asyncio/__init__.py | 64 + .../site-packages/redis/asyncio/client.py | 1420 ++ .../site-packages/redis/asyncio/cluster.py | 1593 ++ .../site-packages/redis/asyncio/connection.py | 1671 ++ .../site-packages/redis/asyncio/lock.py | 313 + .../site-packages/redis/asyncio/parser.py | 94 + .../site-packages/redis/asyncio/retry.py | 67 + .../site-packages/redis/asyncio/sentinel.py | 372 + .../site-packages/redis/asyncio/utils.py | 28 + .../python3.11/site-packages/redis/backoff.py | 114 + .../python3.11/site-packages/redis/client.py | 2142 +++ .../python3.11/site-packages/redis/cluster.py | 2355 +++ .../site-packages/redis/commands/__init__.py | 20 + .../redis/commands/bf/__init__.py | 210 + .../redis/commands/bf/commands.py | 545 + .../site-packages/redis/commands/bf/info.py | 87 + .../site-packages/redis/commands/cluster.py | 914 + .../site-packages/redis/commands/core.py | 6074 ++++++ .../redis/commands/graph/__init__.py | 255 + .../redis/commands/graph/commands.py | 313 + .../redis/commands/graph/edge.py | 91 + .../redis/commands/graph/exceptions.py | 3 + .../redis/commands/graph/execution_plan.py | 211 + .../redis/commands/graph/node.py | 88 + .../redis/commands/graph/path.py | 78 + .../redis/commands/graph/query_result.py | 573 + .../site-packages/redis/commands/helpers.py | 158 + .../redis/commands/json/__init__.py | 133 + .../redis/commands/json/_util.py | 3 + .../redis/commands/json/commands.py | 390 + .../redis/commands/json/decoders.py | 60 + .../site-packages/redis/commands/json/path.py | 16 + .../site-packages/redis/commands/parser.py | 166 + .../redis/commands/redismodules.py | 103 + .../redis/commands/search/__init__.py | 171 + .../redis/commands/search/_util.py | 7 + .../redis/commands/search/aggregation.py | 368 + .../redis/commands/search/commands.py | 1096 ++ .../redis/commands/search/document.py | 17 + .../redis/commands/search/field.py | 169 + .../redis/commands/search/indexDefinition.py | 79 + .../redis/commands/search/query.py | 342 + .../redis/commands/search/querystring.py | 317 + .../redis/commands/search/reducers.py | 178 + .../redis/commands/search/result.py | 73 + .../redis/commands/search/suggestion.py | 51 + .../site-packages/redis/commands/sentinel.py | 99 + .../redis/commands/timeseries/__init__.py | 98 + .../redis/commands/timeseries/commands.py | 896 + .../redis/commands/timeseries/info.py | 82 + .../redis/commands/timeseries/utils.py | 44 + .../python3.11/site-packages/redis/compat.py | 9 + .../site-packages/redis/connection.py | 1704 ++ .../lib/python3.11/site-packages/redis/crc.py | 23 + .../site-packages/redis/credentials.py | 26 + .../site-packages/redis/exceptions.py | 205 + .../python3.11/site-packages/redis/lock.py | 308 + .../python3.11/site-packages/redis/ocsp.py | 308 + .../python3.11/site-packages/redis/retry.py | 54 + .../site-packages/redis/sentinel.py | 344 + .../python3.11/site-packages/redis/typing.py | 54 + .../python3.11/site-packages/redis/utils.py | 112 + .../requests-2.31.0.dist-info/INSTALLER | 1 + .../requests-2.31.0.dist-info/LICENSE | 175 + .../requests-2.31.0.dist-info/METADATA | 122 + .../requests-2.31.0.dist-info/RECORD | 0 .../requests-2.31.0.dist-info/REQUESTED | 0 .../requests-2.31.0.dist-info/WHEEL | 5 + .../requests-2.31.0.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 180 + .../site-packages}/requests/__version__.py | 0 .../requests/_internal_utils.py | 0 .../site-packages/requests/adapters.py | 538 + .../python3.11/site-packages}/requests/api.py | 0 .../site-packages}/requests/auth.py | 0 .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 79 + .../site-packages}/requests/cookies.py | 0 .../site-packages/requests/exceptions.py | 141 + .../python3.11/site-packages/requests/help.py | 134 + .../site-packages}/requests/hooks.py | 0 .../site-packages/requests/models.py | 1034 + .../site-packages/requests/packages.py | 28 + .../site-packages}/requests/sessions.py | 0 .../site-packages}/requests/status_codes.py | 0 .../site-packages}/requests/structures.py | 0 .../site-packages/requests/utils.py | 1094 ++ .../requests_file-1.5.1.dist-info/INSTALLER | 1 + .../requests_file-1.5.1.dist-info/LICENSE | 13 + .../requests_file-1.5.1.dist-info/METADATA | 21 + .../requests_file-1.5.1.dist-info/RECORD | 0 .../requests_file-1.5.1.dist-info/REQUESTED | 0 .../requests_file-1.5.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../python3.11/site-packages/requests_file.py | 117 + .../schedule-1.2.0.dist-info/AUTHORS.rst | 44 + .../schedule-1.2.0.dist-info/INSTALLER | 1 + .../schedule-1.2.0.dist-info/LICENSE.txt | 21 + .../schedule-1.2.0.dist-info/METADATA | 97 + .../schedule-1.2.0.dist-info/RECORD | 0 .../schedule-1.2.0.dist-info/REQUESTED | 0 .../schedule-1.2.0.dist-info/WHEEL | 6 + .../schedule-1.2.0.dist-info/top_level.txt | 1 + .../site-packages/schedule/__init__.py | 881 + .../site-packages/schedule/py.typed | 0 .../selenium-3.14.1.dist-info/DESCRIPTION.rst | 147 + .../selenium-3.14.1.dist-info/INSTALLER | 1 + .../selenium-3.14.1.dist-info/METADATA | 172 + .../selenium-3.14.1.dist-info/RECORD | 0 .../selenium-3.14.1.dist-info/REQUESTED | 0 .../selenium-3.14.1.dist-info/WHEEL | 6 + .../selenium-3.14.1.dist-info/metadata.json | 1 + .../selenium-3.14.1.dist-info/top_level.txt | 1 + .../site-packages/selenium/__init__.py | 19 + .../site-packages/selenium/common/__init__.py | 18 + .../selenium/common/exceptions.py | 327 + .../selenium/webdriver/__init__.py | 39 + .../selenium/webdriver/android/__init__.py | 16 + .../selenium/webdriver/android/webdriver.py | 42 + .../selenium/webdriver/blackberry/__init__.py | 16 + .../webdriver/blackberry/webdriver.py | 116 + .../selenium/webdriver/chrome/__init__.py | 16 + .../selenium/webdriver/chrome/options.py | 211 + .../webdriver/chrome/remote_connection.py | 28 + .../selenium/webdriver/chrome/service.py | 45 + .../selenium/webdriver/chrome/webdriver.py | 161 + .../selenium/webdriver/common/__init__.py | 16 + .../webdriver/common/action_chains.py | 363 + .../webdriver/common/actions/__init__.py | 16 + .../common/actions/action_builder.py | 85 + .../webdriver/common/actions/input_device.py | 43 + .../webdriver/common/actions/interaction.py | 50 + .../webdriver/common/actions/key_actions.py | 50 + .../webdriver/common/actions/key_input.py | 51 + .../webdriver/common/actions/mouse_button.py | 5 + .../common/actions/pointer_actions.py | 100 + .../webdriver/common/actions/pointer_input.py | 63 + .../selenium/webdriver/common/alert.py | 105 + .../selenium/webdriver/common/by.py | 35 + .../webdriver/common/desired_capabilities.py | 128 + .../webdriver/common/html5/__init__.py | 16 + .../common/html5/application_cache.py | 48 + .../selenium/webdriver/common/keys.py | 96 + .../selenium/webdriver/common/proxy.py | 334 + .../selenium/webdriver/common/service.py | 178 + .../webdriver/common/touch_actions.py | 192 + .../selenium/webdriver/common/utils.py | 152 + .../selenium/webdriver/edge/__init__.py | 16 + .../selenium/webdriver/edge/options.py | 54 + .../selenium/webdriver/edge/service.py | 57 + .../selenium/webdriver/edge/webdriver.py | 71 + .../selenium/webdriver/firefox/__init__.py | 16 + .../firefox/amd64/x_ignore_nofocus.so | Bin 0 -> 41552 bytes .../webdriver/firefox/extension_connection.py | 84 + .../webdriver/firefox/firefox_binary.py | 217 + .../webdriver/firefox/firefox_profile.py | 384 + .../selenium/webdriver/firefox/options.py | 189 + .../webdriver/firefox/remote_connection.py | 34 + .../selenium/webdriver/firefox/service.py | 54 + .../selenium/webdriver/firefox/webdriver.py | 276 + .../selenium/webdriver/firefox/webdriver.xpi | Bin 0 -> 716051 bytes .../webdriver/firefox/webdriver_prefs.json | 69 + .../selenium/webdriver/firefox/webelement.py | 49 + .../webdriver/firefox/x86/x_ignore_nofocus.so | Bin 0 -> 30887 bytes .../selenium/webdriver/ie/__init__.py | 16 + .../selenium/webdriver/ie/options.py | 351 + .../selenium/webdriver/ie/service.py | 50 + .../selenium/webdriver/ie/webdriver.py | 105 + .../selenium/webdriver/opera/__init__.py | 16 + .../selenium/webdriver/opera/options.py | 115 + .../selenium/webdriver/opera/webdriver.py | 83 + .../selenium/webdriver/phantomjs/__init__.py | 16 + .../selenium/webdriver/phantomjs/service.py | 68 + .../selenium/webdriver/phantomjs/webdriver.py | 80 + .../selenium/webdriver/remote/__init__.py | 16 + .../selenium/webdriver/remote/command.py | 174 + .../selenium/webdriver/remote/errorhandler.py | 245 + .../webdriver/remote/file_detector.py | 58 + .../selenium/webdriver/remote/getAttribute.js | 8 + .../selenium/webdriver/remote/isDisplayed.js | 101 + .../selenium/webdriver/remote/mobile.py | 85 + .../webdriver/remote/remote_connection.py | 443 + .../selenium/webdriver/remote/switch_to.py | 134 + .../selenium/webdriver/remote/utils.py | 90 + .../selenium/webdriver/remote/webdriver.py | 1262 ++ .../selenium/webdriver/remote/webelement.py | 708 + .../selenium/webdriver/safari/__init__.py | 16 + .../selenium/webdriver/safari/permissions.py | 28 + .../webdriver/safari/remote_connection.py | 27 + .../selenium/webdriver/safari/service.py | 60 + .../selenium/webdriver/safari/webdriver.py | 112 + .../selenium/webdriver/support/__init__.py | 16 + .../support/abstract_event_listener.py | 79 + .../selenium/webdriver/support/color.py | 310 + .../support/event_firing_webdriver.py | 322 + .../selenium/webdriver/support/events.py | 19 + .../webdriver/support/expected_conditions.py | 422 + .../selenium/webdriver/support/select.py | 241 + .../selenium/webdriver/support/ui.py | 19 + .../selenium/webdriver/support/wait.py | 96 + .../selenium/webdriver/webkitgtk/__init__.py | 16 + .../selenium/webdriver/webkitgtk/options.py | 107 + .../selenium/webdriver/webkitgtk/service.py | 42 + .../selenium/webdriver/webkitgtk/webdriver.py | 74 + .../PKG-INFO | 0 .../SOURCES.txt | 0 .../dependency_links.txt | 1 + .../installed-files.txt | 0 .../not-zip-safe | 0 .../requires.txt | 0 .../top_level.txt | 1 + .../seleniumrequests/__init__.py | 35 + .../site-packages/seleniumrequests/request.py | 242 + .../setuptools-65.5.1.dist-info/INSTALLER | 1 + .../setuptools-65.5.1.dist-info/LICENSE | 19 + .../setuptools-65.5.1.dist-info/METADATA | 0 .../setuptools-65.5.1.dist-info/RECORD | 0 .../setuptools-65.5.1.dist-info/REQUESTED | 0 .../setuptools-65.5.1.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../setuptools-65.5.1.dist-info/top_level.txt | 0 .../site-packages/setuptools/__init__.py | 0 .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 0 .../setuptools/_distutils/_collections.py | 0 .../setuptools/_distutils/_functools.py | 0 .../setuptools/_distutils/_macos_compat.py | 0 .../setuptools/_distutils/_msvccompiler.py | 0 .../setuptools/_distutils/archive_util.py | 0 .../setuptools/_distutils/bcppcompiler.py | 0 .../setuptools/_distutils/ccompiler.py | 0 .../setuptools/_distutils/cmd.py | 0 .../setuptools/_distutils/command/__init__.py | 0 .../_distutils/command/_framework_compat.py | 0 .../setuptools/_distutils/command/bdist.py | 0 .../_distutils/command/bdist_dumb.py | 0 .../_distutils/command/bdist_rpm.py | 0 .../setuptools/_distutils/command/build.py | 0 .../_distutils/command/build_clib.py | 0 .../_distutils/command/build_ext.py | 0 .../setuptools/_distutils/command/build_py.py | 0 .../_distutils/command/build_scripts.py | 0 .../setuptools/_distutils/command/check.py | 0 .../setuptools/_distutils/command/clean.py | 0 .../setuptools/_distutils/command/config.py | 0 .../setuptools/_distutils/command/install.py | 0 .../_distutils/command/install_data.py | 0 .../_distutils/command/install_egg_info.py | 0 .../_distutils/command/install_headers.py | 0 .../_distutils/command/install_lib.py | 0 .../_distutils/command/install_scripts.py | 0 .../_distutils/command/py37compat.py | 0 .../setuptools/_distutils/command/register.py | 0 .../setuptools/_distutils/command/sdist.py | 0 .../setuptools/_distutils/command/upload.py | 0 .../setuptools/_distutils/config.py | 0 .../setuptools/_distutils/core.py | 0 .../setuptools/_distutils/cygwinccompiler.py | 0 .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 0 .../setuptools/_distutils/dir_util.py | 0 .../setuptools/_distutils/dist.py | 0 .../setuptools/_distutils/errors.py | 0 .../setuptools/_distutils/extension.py | 0 .../setuptools/_distutils/fancy_getopt.py | 0 .../setuptools/_distutils/file_util.py | 0 .../setuptools/_distutils/filelist.py | 0 .../setuptools/_distutils/log.py | 0 .../setuptools/_distutils/msvc9compiler.py | 0 .../setuptools/_distutils/msvccompiler.py | 0 .../setuptools/_distutils/py38compat.py | 0 .../setuptools/_distutils/py39compat.py | 0 .../setuptools/_distutils/spawn.py | 0 .../setuptools/_distutils/sysconfig.py | 0 .../setuptools/_distutils/text_file.py | 0 .../setuptools/_distutils/unixccompiler.py | 0 .../setuptools/_distutils/util.py | 0 .../setuptools/_distutils/version.py | 0 .../setuptools/_distutils/versionpredicate.py | 0 .../site-packages/setuptools/_entry_points.py | 0 .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 0 .../site-packages/setuptools/_itertools.py | 0 .../site-packages/setuptools/_path.py | 0 .../site-packages/setuptools/_reqs.py | 0 .../setuptools/_vendor/__init__.py | 0 .../_vendor/importlib_metadata/__init__.py | 0 .../_vendor/importlib_metadata/_adapters.py | 0 .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 0 .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 0 .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 0 .../_vendor/importlib_resources/_adapters.py | 0 .../_vendor/importlib_resources/_common.py | 0 .../_vendor/importlib_resources/_compat.py | 0 .../_vendor/importlib_resources/_itertools.py | 0 .../_vendor/importlib_resources/_legacy.py | 0 .../_vendor/importlib_resources/abc.py | 0 .../_vendor/importlib_resources/readers.py | 0 .../_vendor/importlib_resources/simple.py | 0 .../setuptools/_vendor/jaraco/__init__.py | 0 .../setuptools/_vendor/jaraco/context.py | 0 .../setuptools/_vendor/jaraco/functools.py | 0 .../_vendor/jaraco/text/__init__.py | 0 .../_vendor/more_itertools/__init__.py | 4 + .../setuptools/_vendor/more_itertools/more.py | 0 .../_vendor/more_itertools/recipes.py | 620 + .../setuptools/_vendor/ordered_set.py | 488 + .../_vendor/packaging/__about__.py | 0 .../setuptools/_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 0 .../_vendor/packaging/_structures.py | 0 .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 0 .../setuptools}/_vendor/packaging/tags.py | 0 .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 0 .../setuptools/_vendor/pyparsing/actions.py | 0 .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 0 .../_vendor/pyparsing/diagram/__init__.py | 0 .../_vendor/pyparsing/exceptions.py | 0 .../setuptools/_vendor/pyparsing/helpers.py | 0 .../setuptools/_vendor/pyparsing/results.py | 0 .../setuptools/_vendor/pyparsing/testing.py | 0 .../setuptools/_vendor/pyparsing/unicode.py | 0 .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 0 .../setuptools/_vendor/tomli/_parser.py | 0 .../setuptools/_vendor/tomli/_re.py | 0 .../setuptools/_vendor/tomli/_types.py | 0 .../setuptools/_vendor/typing_extensions.py | 2296 +++ .../site-packages/setuptools/_vendor/zipp.py | 0 .../site-packages/setuptools/archive_util.py | 0 .../site-packages/setuptools/build_meta.py | 0 .../setuptools/command/__init__.py | 0 .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 0 .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 0 .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 0 .../setuptools/command/build_py.py | 0 .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 0 .../setuptools/command/easy_install.py | 0 .../setuptools/command/editable_wheel.py | 0 .../setuptools/command/egg_info.py | 0 .../setuptools/command/install.py | 0 .../setuptools/command/install_egg_info.py | 0 .../setuptools/command/install_lib.py | 0 .../setuptools/command/install_scripts.py | 0 .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 0 .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 0 .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 0 .../setuptools/config/__init__.py | 0 .../setuptools/config/_apply_pyprojecttoml.py | 0 .../config/_validate_pyproject/__init__.py | 0 .../_validate_pyproject/error_reporting.py | 0 .../_validate_pyproject/extra_validations.py | 0 .../fastjsonschema_exceptions.py | 0 .../fastjsonschema_validations.py | 0 .../config/_validate_pyproject/formats.py | 0 .../site-packages/setuptools/config/expand.py | 0 .../setuptools/config/pyprojecttoml.py | 0 .../setuptools/config/setupcfg.py | 0 .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 0 .../site-packages/setuptools/dist.py | 0 .../site-packages/setuptools/errors.py | 0 .../site-packages/setuptools/extension.py | 0 .../setuptools/extern/__init__.py | 0 .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 0 .../site-packages/setuptools/monkey.py | 0 .../site-packages/setuptools/msvc.py | 0 .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 0 .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 0 .../setuptools/windows_support.py | 0 .../six-1.16.0.dist-info/INSTALLER | 1 + .../six-1.16.0.dist-info/LICENSE | 18 + .../six-1.16.0.dist-info/METADATA | 49 + .../site-packages/six-1.16.0.dist-info/RECORD | 0 .../six-1.16.0.dist-info/REQUESTED | 0 .../site-packages/six-1.16.0.dist-info/WHEEL | 6 + .../six-1.16.0.dist-info/top_level.txt | 1 + python/lib/python3.11/site-packages/six.py | 998 + .../soupsieve-2.4.1.dist-info/INSTALLER | 1 + .../soupsieve-2.4.1.dist-info/METADATA | 116 + .../soupsieve-2.4.1.dist-info/RECORD | 0 .../soupsieve-2.4.1.dist-info/REQUESTED | 0 .../soupsieve-2.4.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 21 + .../site-packages/soupsieve/__init__.py | 169 + .../site-packages/soupsieve/__meta__.py | 197 + .../site-packages/soupsieve/css_match.py | 1590 ++ .../site-packages/soupsieve/css_parser.py | 1296 ++ .../site-packages/soupsieve/css_types.py | 408 + .../site-packages/soupsieve/pretty.py | 138 + .../site-packages/soupsieve/py.typed | 0 .../site-packages/soupsieve/util.py | 117 + .../tldextract-3.4.4.dist-info/INSTALLER | 1 + .../tldextract-3.4.4.dist-info/LICENSE | 29 + .../tldextract-3.4.4.dist-info/METADATA | 52 + .../tldextract-3.4.4.dist-info/RECORD | 0 .../tldextract-3.4.4.dist-info/REQUESTED | 0 .../tldextract-3.4.4.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../tldextract-3.4.4.dist-info/top_level.txt | 1 + .../tldextract/.tld_set_snapshot | 13756 ++++++++++++++ .../site-packages/tldextract/__init__.py | 12 + .../site-packages/tldextract/__main__.py | 7 + .../site-packages/tldextract/_version.py | 4 + .../site-packages/tldextract/cache.py | 250 + .../site-packages/tldextract/cli.py | 91 + .../site-packages/tldextract/py.typed | 0 .../site-packages/tldextract/remote.py | 61 + .../site-packages/tldextract/suffix_list.py | 101 + .../site-packages/tldextract/tldextract.py | 453 + .../INSTALLER | 1 + .../typing_extensions-4.6.3.dist-info/LICENSE | 279 + .../METADATA | 64 + .../typing_extensions-4.6.3.dist-info/RECORD | 0 .../REQUESTED | 0 .../typing_extensions-4.6.3.dist-info/WHEEL | 4 + .../site-packages/typing_extensions.py | 2869 +++ .../tzlocal-5.0.1.dist-info/INSTALLER | 1 + .../tzlocal-5.0.1.dist-info/LICENSE.txt | 19 + .../tzlocal-5.0.1.dist-info/METADATA | 0 .../tzlocal-5.0.1.dist-info/RECORD | 0 .../tzlocal-5.0.1.dist-info/WHEEL | 5 + .../tzlocal-5.0.1.dist-info/top_level.txt | 1 + .../tzlocal-5.0.1.dist-info/zip-safe | 1 + .../site-packages/tzlocal/__init__.py | 0 .../python3.11/site-packages/tzlocal/unix.py | 0 .../python3.11/site-packages/tzlocal/utils.py | 0 .../python3.11/site-packages/tzlocal/win32.py | 0 .../site-packages/tzlocal/windows_tz.py | 0 .../urllib3-1.26.2.dist-info/INSTALLER | 1 + .../urllib3-1.26.2.dist-info/LICENSE.txt | 21 + .../urllib3-1.26.2.dist-info/METADATA | 1349 ++ .../urllib3-1.26.2.dist-info/RECORD | 0 .../urllib3-1.26.2.dist-info/REQUESTED | 0 .../urllib3-1.26.2.dist-info/WHEEL | 6 + .../urllib3-1.26.2.dist-info/top_level.txt | 1 + .../site-packages/urllib3/__init__.py | 85 + .../site-packages}/urllib3/_collections.py | 0 .../site-packages/urllib3/_version.py | 2 + .../site-packages/urllib3/connection.py | 535 + .../site-packages/urllib3/connectionpool.py | 1067 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 396 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 121 + .../urllib3/contrib/pyopenssl.py | 509 + .../urllib3/contrib/securetransport.py | 920 + .../site-packages/urllib3/contrib/socks.py | 216 + .../site-packages/urllib3/exceptions.py | 313 + .../site-packages/urllib3/fields.py | 274 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../site-packages/urllib3/packages/six.py | 1021 + .../packages/ssl_match_hostname/__init__.py | 22 + .../ssl_match_hostname/_implementation.py | 160 + .../site-packages/urllib3/poolmanager.py | 536 + .../site-packages/urllib3/request.py | 170 + .../site-packages/urllib3/response.py | 821 + .../site-packages/urllib3/util/__init__.py | 49 + .../site-packages/urllib3/util/connection.py | 150 + .../site-packages/urllib3/util/proxy.py | 56 + .../site-packages/urllib3/util/queue.py | 22 + .../site-packages/urllib3/util/request.py | 143 + .../site-packages/urllib3/util/response.py | 107 + .../site-packages/urllib3/util/retry.py | 601 + .../site-packages/urllib3/util/ssl_.py | 474 + .../urllib3/util/ssltransport.py | 221 + .../site-packages/urllib3/util/timeout.py | 268 + .../site-packages/urllib3/util/url.py | 430 + .../site-packages/urllib3/util/wait.py | 153 + .../websockets-11.0.3.dist-info/INSTALLER | 1 + .../websockets-11.0.3.dist-info/LICENSE | 24 + .../websockets-11.0.3.dist-info/METADATA | 176 + .../websockets-11.0.3.dist-info/RECORD | 0 .../websockets-11.0.3.dist-info/REQUESTED | 0 .../websockets-11.0.3.dist-info/WHEEL | 0 .../websockets-11.0.3.dist-info/top_level.txt | 1 + .../site-packages/websockets/__init__.py | 114 + .../site-packages/websockets/__main__.py | 159 + .../site-packages/websockets/auth.py | 4 + .../site-packages/websockets/client.py | 358 + .../site-packages/websockets/connection.py | 13 + .../websockets/datastructures.py | 200 + .../site-packages/websockets/exceptions.py | 403 + .../websockets/extensions/__init__.py | 4 + .../websockets/extensions/base.py | 133 + .../extensions/permessage_deflate.py | 660 + .../site-packages/websockets/frames.py | 449 + .../site-packages/websockets/headers.py | 587 + .../site-packages/websockets/http.py | 30 + .../site-packages/websockets/http11.py | 364 + .../site-packages/websockets/imports.py | 99 + .../websockets/legacy/__init__.py | 0 .../websockets/legacy/async_timeout.py | 265 + .../site-packages/websockets/legacy/auth.py | 184 + .../site-packages/websockets/legacy/client.py | 713 + .../websockets/legacy/compatibility.py | 33 + .../websockets/legacy/framing.py | 176 + .../websockets/legacy/handshake.py | 165 + .../site-packages/websockets/legacy/http.py | 201 + .../websockets/legacy/protocol.py | 1642 ++ .../site-packages/websockets/legacy/server.py | 1196 ++ .../site-packages/websockets/protocol.py | 707 + .../site-packages/websockets/py.typed | 0 .../site-packages/websockets/server.py | 575 + .../site-packages/websockets/speedups.c | 223 + .../speedups.cpython-311-x86_64-linux-gnu.so | Bin .../site-packages/websockets/streams.py | 151 + .../site-packages/websockets/sync/__init__.py | 0 .../site-packages/websockets/sync/client.py | 328 + .../websockets/sync/compatibility.py | 21 + .../websockets/sync/connection.py | 764 + .../site-packages/websockets/sync/messages.py | 281 + .../site-packages/websockets/sync/server.py | 529 + .../site-packages/websockets/sync/utils.py | 46 + .../site-packages/websockets/typing.py | 60 + .../site-packages/websockets/uri.py | 108 + .../site-packages/websockets/utils.py | 51 + .../site-packages/websockets/version.py | 78 + .../site-packages/werkzeug/__init__.py | 6 + .../site-packages/werkzeug/_internal.py | 553 + .../site-packages/werkzeug/_reloader.py | 446 + .../site-packages/werkzeug/datastructures.py | 3040 +++ .../site-packages/werkzeug/datastructures.pyi | 921 + .../site-packages/werkzeug/debug/__init__.py | 533 + .../site-packages/werkzeug/debug/console.py | 222 + .../site-packages/werkzeug/debug/repr.py | 285 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 359 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 435 + .../site-packages/werkzeug/exceptions.py | 884 + .../site-packages/werkzeug/formparser.py | 465 + .../python3.11/site-packages/werkzeug/http.py | 1327 ++ .../site-packages/werkzeug/local.py | 648 + .../werkzeug/middleware/__init__.py | 22 + .../werkzeug/middleware/dispatcher.py | 78 + .../werkzeug/middleware/http_proxy.py | 230 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 139 + .../werkzeug/middleware/proxy_fix.py | 187 + .../werkzeug/middleware/shared_data.py | 280 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 + .../werkzeug/routing/converters.py | 257 + .../werkzeug/routing/exceptions.py | 146 + .../site-packages/werkzeug/routing/map.py | 944 + .../site-packages/werkzeug/routing/matcher.py | 192 + .../site-packages/werkzeug/routing/rules.py | 904 + .../site-packages/werkzeug/sansio/__init__.py | 0 .../site-packages/werkzeug/sansio/http.py | 136 + .../werkzeug/sansio/multipart.py | 287 + .../site-packages/werkzeug/sansio/request.py | 547 + .../site-packages/werkzeug/sansio/response.py | 704 + .../site-packages/werkzeug/sansio/utils.py | 165 + .../site-packages/werkzeug/security.py | 140 + .../site-packages/werkzeug/serving.py | 1069 ++ .../python3.11/site-packages/werkzeug/test.py | 1338 ++ .../site-packages/werkzeug/testapp.py | 241 + .../python3.11/site-packages/werkzeug/urls.py | 1067 ++ .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 706 + .../werkzeug/wrappers/__init__.py | 3 + .../werkzeug/wrappers/request.py | 634 + .../werkzeug/wrappers/response.py | 885 + .../python3.11/site-packages/werkzeug/wsgi.py | 1058 ++ .../wget-3.2-py3.11.egg-info/PKG-INFO | 0 .../wget-3.2-py3.11.egg-info/SOURCES.txt | 0 .../dependency_links.txt | 1 + .../installed-files.txt | 0 .../wget-3.2-py3.11.egg-info/top_level.txt | 1 + python/lib/python3.11/site-packages/wget.py | 628 + .../yt_dlp-2023.3.4.dist-info/AUTHORS | 0 .../yt_dlp-2023.3.4.dist-info/INSTALLER | 1 + .../yt_dlp-2023.3.4.dist-info/LICENSE | 24 + .../yt_dlp-2023.3.4.dist-info/METADATA | 0 .../yt_dlp-2023.3.4.dist-info/RECORD | 0 .../yt_dlp-2023.3.4.dist-info/REQUESTED | 0 .../yt_dlp-2023.3.4.dist-info/WHEEL | 0 .../entry_points.txt | 5 + .../yt_dlp-2023.3.4.dist-info/top_level.txt | 1 + .../site-packages/yt_dlp/YoutubeDL.py | 0 .../site-packages/yt_dlp/__init__.py | 0 .../site-packages/yt_dlp/__main__.py | 17 + .../yt_dlp/__pyinstaller/__init__.py | 5 + .../yt_dlp/__pyinstaller/hook-yt_dlp.py | 0 .../python3.11/site-packages/yt_dlp/aes.py | 567 + .../python3.11/site-packages/yt_dlp/cache.py | 91 + .../site-packages/yt_dlp/compat/__init__.py | 0 .../yt_dlp/compat/_deprecated.py | 0 .../site-packages/yt_dlp/compat/_legacy.py | 0 .../yt_dlp/compat/compat_utils.py | 0 .../site-packages/yt_dlp/compat/functools.py | 26 + .../site-packages/yt_dlp/compat/imghdr.py | 16 + .../site-packages/yt_dlp/compat/shutil.py | 30 + .../site-packages/yt_dlp/cookies.py | 0 .../yt_dlp/dependencies/Cryptodome.py | 0 .../yt_dlp/dependencies/__init__.py | 0 .../yt_dlp/downloader/__init__.py | 0 .../site-packages/yt_dlp/downloader/common.py | 0 .../site-packages/yt_dlp/downloader/dash.py | 87 + .../yt_dlp/downloader/external.py | 0 .../site-packages/yt_dlp/downloader/f4m.py | 0 .../site-packages/yt_dlp/downloader/fc2.py | 46 + .../yt_dlp/downloader/fragment.py | 0 .../site-packages/yt_dlp/downloader/hls.py | 0 .../site-packages/yt_dlp/downloader/http.py | 0 .../site-packages/yt_dlp/downloader/ism.py | 0 .../site-packages/yt_dlp/downloader/mhtml.py | 189 + .../yt_dlp/downloader/niconico.py | 0 .../site-packages/yt_dlp/downloader/rtmp.py | 213 + .../site-packages/yt_dlp/downloader/rtsp.py | 42 + .../yt_dlp/downloader/websocket.py | 53 + .../yt_dlp/downloader/youtube_live_chat.py | 0 .../yt_dlp/extractor/__init__.py | 42 + .../yt_dlp/extractor/_extractors.py | 0 .../site-packages/yt_dlp/extractor/abc.py | 0 .../site-packages/yt_dlp/extractor/abcnews.py | 153 + .../site-packages/yt_dlp/extractor/abcotvs.py | 130 + .../site-packages/yt_dlp/extractor/abematv.py | 0 .../yt_dlp/extractor/academicearth.py | 39 + .../site-packages/yt_dlp/extractor/acast.py | 0 .../site-packages/yt_dlp/extractor/acfun.py | 199 + .../site-packages/yt_dlp/extractor/adn.py | 0 .../yt_dlp/extractor/adobeconnect.py | 34 + .../yt_dlp/extractor/adobepass.py | 0 .../site-packages/yt_dlp/extractor/adobetv.py | 286 + .../yt_dlp/extractor/adultswim.py | 0 .../yt_dlp/extractor/aenetworks.py | 0 .../site-packages/yt_dlp/extractor/aeonco.py | 0 .../yt_dlp/extractor/afreecatv.py | 0 .../site-packages/yt_dlp/extractor/agora.py | 251 + .../yt_dlp/extractor/airmozilla.py | 63 + .../site-packages/yt_dlp/extractor/airtv.py | 96 + .../site-packages/yt_dlp/extractor/aitube.py | 60 + .../yt_dlp/extractor/aliexpress.py | 50 + .../yt_dlp/extractor/aljazeera.py | 83 + .../yt_dlp/extractor/allocine.py | 125 + .../yt_dlp/extractor/alphaporno.py | 75 + .../yt_dlp/extractor/alsace20tv.py | 83 + .../site-packages/yt_dlp/extractor/alura.py | 167 + .../site-packages/yt_dlp/extractor/amara.py | 100 + .../site-packages/yt_dlp/extractor/amazon.py | 170 + .../yt_dlp/extractor/amazonminitv.py | 0 .../yt_dlp/extractor/amcnetworks.py | 0 .../yt_dlp/extractor/americastestkitchen.py | 215 + .../site-packages/yt_dlp/extractor/amp.py | 0 .../yt_dlp/extractor/anchorfm.py | 98 + .../site-packages/yt_dlp/extractor/angel.py | 56 + .../yt_dlp/extractor/ant1newsgr.py | 0 .../site-packages/yt_dlp/extractor/anvato.py | 0 .../site-packages/yt_dlp/extractor/aol.py | 132 + .../site-packages/yt_dlp/extractor/apa.py | 82 + .../site-packages/yt_dlp/extractor/aparat.py | 88 + .../yt_dlp/extractor/appleconnect.py | 50 + .../yt_dlp/extractor/applepodcasts.py | 85 + .../yt_dlp/extractor/appletrailers.py | 278 + .../yt_dlp/extractor/archiveorg.py | 0 .../yt_dlp/extractor/arcpublishing.py | 164 + .../site-packages/yt_dlp/extractor/ard.py | 0 .../site-packages/yt_dlp/extractor/arkena.py | 150 + .../site-packages/yt_dlp/extractor/arnes.py | 98 + .../site-packages/yt_dlp/extractor/arte.py | 0 .../yt_dlp/extractor/asiancrush.py | 0 .../yt_dlp/extractor/atresplayer.py | 0 .../yt_dlp/extractor/atscaleconf.py | 34 + .../yt_dlp/extractor/atttechchannel.py | 53 + .../site-packages/yt_dlp/extractor/atvat.py | 108 + .../yt_dlp/extractor/audimedia.py | 89 + .../yt_dlp/extractor/audioboom.py | 57 + .../yt_dlp/extractor/audiodraft.py | 93 + .../yt_dlp/extractor/audiomack.py | 147 + .../site-packages/yt_dlp/extractor/audius.py | 271 + .../site-packages/yt_dlp/extractor/awaan.py | 184 + .../site-packages/yt_dlp/extractor/aws.py | 0 .../yt_dlp/extractor/azmedien.py | 66 + .../site-packages/yt_dlp/extractor/baidu.py | 51 + .../site-packages/yt_dlp/extractor/banbye.py | 0 .../yt_dlp/extractor/bandaichannel.py | 33 + .../yt_dlp/extractor/bandcamp.py | 485 + .../yt_dlp/extractor/bannedvideo.py | 155 + .../site-packages/yt_dlp/extractor/bbc.py | 0 .../yt_dlp/extractor/beatbump.py | 101 + .../yt_dlp/extractor/beatport.py | 97 + .../site-packages/yt_dlp/extractor/beeg.py | 89 + .../yt_dlp/extractor/behindkink.py | 41 + .../yt_dlp/extractor/bellmedia.py | 91 + .../yt_dlp/extractor/berufetv.py | 70 + .../site-packages/yt_dlp/extractor/bet.py | 80 + .../site-packages/yt_dlp/extractor/bfi.py | 34 + .../site-packages/yt_dlp/extractor/bfmtv.py | 117 + .../site-packages/yt_dlp/extractor/bibeltv.py | 0 .../site-packages/yt_dlp/extractor/bigflix.py | 73 + .../site-packages/yt_dlp/extractor/bigo.py | 56 + .../site-packages/yt_dlp/extractor/bild.py | 0 .../yt_dlp/extractor/bilibili.py | 0 .../yt_dlp/extractor/biobiochiletv.py | 83 + .../site-packages/yt_dlp/extractor/biqle.py | 110 + .../yt_dlp/extractor/bitchute.py | 0 .../site-packages/yt_dlp/extractor/bitwave.py | 58 + .../yt_dlp/extractor/blackboardcollaborate.py | 63 + .../yt_dlp/extractor/bleacherreport.py | 109 + .../site-packages/yt_dlp/extractor/blerp.py | 167 + .../site-packages/yt_dlp/extractor/blogger.py | 45 + .../yt_dlp/extractor/bloomberg.py | 77 + .../site-packages/yt_dlp/extractor/bokecc.py | 53 + .../yt_dlp/extractor/bongacams.py | 70 + .../site-packages/yt_dlp/extractor/booyah.py | 0 .../yt_dlp/extractor/bostonglobe.py | 69 + .../site-packages/yt_dlp/extractor/box.py | 92 + .../site-packages/yt_dlp/extractor/boxcast.py | 102 + .../site-packages/yt_dlp/extractor/bpb.py | 0 .../site-packages/yt_dlp/extractor/br.py | 308 + .../site-packages/yt_dlp/extractor/bravotv.py | 0 .../yt_dlp/extractor/breakcom.py | 86 + .../yt_dlp/extractor/breitbart.py | 0 .../yt_dlp/extractor/brightcove.py | 0 .../yt_dlp/extractor/bundesliga.py | 34 + .../yt_dlp/extractor/businessinsider.py | 45 + .../yt_dlp/extractor/buzzfeed.py | 95 + .../site-packages/yt_dlp/extractor/byutv.py | 118 + .../site-packages/yt_dlp/extractor/c56.py | 59 + .../site-packages/yt_dlp/extractor/cableav.py | 32 + .../site-packages/yt_dlp/extractor/callin.py | 155 + .../yt_dlp/extractor/caltrans.py | 37 + .../site-packages/yt_dlp/extractor/cam4.py | 31 + .../site-packages/yt_dlp/extractor/camdemy.py | 158 + .../yt_dlp/extractor/cammodels.py | 77 + .../site-packages/yt_dlp/extractor/camsoda.py | 57 + .../yt_dlp/extractor/camtasia.py | 71 + .../yt_dlp/extractor/camwithher.py | 87 + .../yt_dlp/extractor/canalalpha.py | 94 + .../site-packages/yt_dlp/extractor/canalc2.py | 68 + .../yt_dlp/extractor/canalplus.py | 0 .../site-packages/yt_dlp/extractor/canvas.py | 0 .../yt_dlp/extractor/carambatv.py | 105 + .../yt_dlp/extractor/cartoonnetwork.py | 59 + .../site-packages/yt_dlp/extractor/cbc.py | 0 .../site-packages/yt_dlp/extractor/cbs.py | 0 .../yt_dlp/extractor/cbsinteractive.py | 98 + .../yt_dlp/extractor/cbslocal.py | 0 .../site-packages/yt_dlp/extractor/cbsnews.py | 0 .../yt_dlp/extractor/cbssports.py | 108 + .../site-packages/yt_dlp/extractor/ccc.py | 0 .../site-packages/yt_dlp/extractor/ccma.py | 141 + .../site-packages/yt_dlp/extractor/cctv.py | 187 + .../site-packages/yt_dlp/extractor/cda.py | 338 + .../yt_dlp/extractor/cellebrite.py | 63 + .../yt_dlp/extractor/ceskatelevize.py | 0 .../site-packages/yt_dlp/extractor/cgtn.py | 61 + .../yt_dlp/extractor/channel9.py | 252 + .../yt_dlp/extractor/charlierose.py | 50 + .../yt_dlp/extractor/chaturbate.py | 106 + .../yt_dlp/extractor/chilloutzone.py | 0 .../yt_dlp/extractor/chingari.py | 207 + .../site-packages/yt_dlp/extractor/chirbit.py | 88 + .../yt_dlp/extractor/cinchcast.py | 56 + .../site-packages/yt_dlp/extractor/cinemax.py | 24 + .../yt_dlp/extractor/cinetecamilano.py | 0 .../yt_dlp/extractor/ciscolive.py | 145 + .../yt_dlp/extractor/ciscowebex.py | 0 .../site-packages/yt_dlp/extractor/cjsw.py | 67 + .../yt_dlp/extractor/cliphunter.py | 76 + .../site-packages/yt_dlp/extractor/clippit.py | 70 + .../site-packages/yt_dlp/extractor/cliprs.py | 30 + .../yt_dlp/extractor/clipsyndicate.py | 52 + .../yt_dlp/extractor/closertotruth.py | 88 + .../yt_dlp/extractor/cloudflarestream.py | 60 + .../site-packages/yt_dlp/extractor/cloudy.py | 57 + .../site-packages/yt_dlp/extractor/clubic.py | 52 + .../site-packages/yt_dlp/extractor/clyp.py | 99 + .../site-packages/yt_dlp/extractor/cmt.py | 54 + .../site-packages/yt_dlp/extractor/cnbc.py | 0 .../site-packages/yt_dlp/extractor/cnn.py | 198 + .../yt_dlp/extractor/comedycentral.py | 0 .../site-packages/yt_dlp/extractor/common.py | 0 .../yt_dlp/extractor/commonmistakes.py | 42 + .../yt_dlp/extractor/commonprotocols.py | 70 + .../yt_dlp/extractor/condenast.py | 250 + .../site-packages/yt_dlp/extractor/contv.py | 113 + .../site-packages/yt_dlp/extractor/corus.py | 0 .../site-packages/yt_dlp/extractor/coub.py | 136 + .../site-packages/yt_dlp/extractor/cozytv.py | 37 + .../site-packages/yt_dlp/extractor/cpac.py | 136 + .../site-packages/yt_dlp/extractor/cracked.py | 88 + .../site-packages/yt_dlp/extractor/crackle.py | 0 .../site-packages/yt_dlp/extractor/craftsy.py | 0 .../yt_dlp/extractor/crooksandliars.py | 59 + .../yt_dlp/extractor/crowdbunker.py | 109 + .../yt_dlp/extractor/crunchyroll.py | 0 .../site-packages/yt_dlp/extractor/cspan.py | 286 + .../site-packages/yt_dlp/extractor/ctsnews.py | 84 + .../site-packages/yt_dlp/extractor/ctv.py | 49 + .../site-packages/yt_dlp/extractor/ctvnews.py | 70 + .../yt_dlp/extractor/cultureunplugged.py | 0 .../yt_dlp/extractor/curiositystream.py | 203 + .../site-packages/yt_dlp/extractor/cwtv.py | 95 + .../site-packages/yt_dlp/extractor/cybrary.py | 0 .../site-packages/yt_dlp/extractor/daftsex.py | 0 .../yt_dlp/extractor/dailymail.py | 73 + .../yt_dlp/extractor/dailymotion.py | 0 .../yt_dlp/extractor/dailywire.py | 113 + .../site-packages/yt_dlp/extractor/damtomo.py | 109 + .../site-packages/yt_dlp/extractor/daum.py | 258 + .../site-packages/yt_dlp/extractor/daystar.py | 47 + .../site-packages/yt_dlp/extractor/dbtv.py | 47 + .../site-packages/yt_dlp/extractor/dctp.py | 102 + .../site-packages/yt_dlp/extractor/deezer.py | 142 + .../site-packages/yt_dlp/extractor/defense.py | 37 + .../yt_dlp/extractor/democracynow.py | 91 + .../site-packages/yt_dlp/extractor/detik.py | 159 + .../site-packages/yt_dlp/extractor/deuxm.py | 76 + .../site-packages/yt_dlp/extractor/dfb.py | 52 + .../site-packages/yt_dlp/extractor/dhm.py | 57 + .../site-packages/yt_dlp/extractor/digg.py | 54 + .../yt_dlp/extractor/digitalconcerthall.py | 0 .../yt_dlp/extractor/digiteka.py | 98 + .../yt_dlp/extractor/discovery.py | 0 .../yt_dlp/extractor/discoverygo.py | 172 + .../site-packages/yt_dlp/extractor/disney.py | 160 + .../site-packages/yt_dlp/extractor/dispeak.py | 127 + .../site-packages/yt_dlp/extractor/dlive.py | 92 + .../site-packages/yt_dlp/extractor/dotsub.py | 81 + .../site-packages/yt_dlp/extractor/douyutv.py | 0 .../site-packages/yt_dlp/extractor/dplay.py | 0 .../yt_dlp/extractor/drbonanza.py | 54 + .../site-packages/yt_dlp/extractor/dreisat.py | 41 + .../site-packages/yt_dlp/extractor/drooble.py | 113 + .../site-packages/yt_dlp/extractor/dropbox.py | 0 .../site-packages/yt_dlp/extractor/dropout.py | 0 .../site-packages/yt_dlp/extractor/drtuber.py | 104 + .../site-packages/yt_dlp/extractor/drtv.py | 0 .../site-packages/yt_dlp/extractor/dtube.py | 79 + .../site-packages/yt_dlp/extractor/duboku.py | 241 + .../site-packages/yt_dlp/extractor/dumpert.py | 0 .../site-packages/yt_dlp/extractor/dvtv.py | 177 + .../site-packages/yt_dlp/extractor/dw.py | 106 + .../yt_dlp/extractor/eagleplatform.py | 0 .../yt_dlp/extractor/ebaumsworld.py | 31 + .../site-packages/yt_dlp/extractor/ebay.py | 36 + .../site-packages/yt_dlp/extractor/echomsk.py | 43 + .../site-packages/yt_dlp/extractor/egghead.py | 134 + .../site-packages/yt_dlp/extractor/ehow.py | 36 + .../yt_dlp/extractor/eighttracks.py | 161 + .../yt_dlp/extractor/einthusan.py | 105 + .../site-packages/yt_dlp/extractor/eitb.py | 0 .../yt_dlp/extractor/ellentube.py | 130 + .../site-packages/yt_dlp/extractor/elonet.py | 64 + .../site-packages/yt_dlp/extractor/elpais.py | 92 + .../site-packages/yt_dlp/extractor/embedly.py | 109 + .../yt_dlp/extractor/engadget.py | 15 + .../site-packages/yt_dlp/extractor/epicon.py | 115 + .../site-packages/yt_dlp/extractor/epoch.py | 55 + .../site-packages/yt_dlp/extractor/eporner.py | 0 .../yt_dlp/extractor/eroprofile.py | 122 + .../site-packages/yt_dlp/extractor/ertgr.py | 302 + .../yt_dlp/extractor/escapist.py | 108 + .../site-packages/yt_dlp/extractor/espn.py | 421 + .../site-packages/yt_dlp/extractor/esri.py | 70 + .../site-packages/yt_dlp/extractor/europa.py | 0 .../yt_dlp/extractor/europeantour.py | 34 + .../yt_dlp/extractor/eurosport.py | 0 .../yt_dlp/extractor/euscreen.py | 60 + .../site-packages/yt_dlp/extractor/expotv.py | 74 + .../yt_dlp/extractor/expressen.py | 0 .../yt_dlp/extractor/extractors.py | 28 + .../yt_dlp/extractor/extremetube.py | 48 + .../site-packages/yt_dlp/extractor/eyedotv.py | 61 + .../yt_dlp/extractor/facebook.py | 0 .../site-packages/yt_dlp/extractor/fancode.py | 179 + .../site-packages/yt_dlp/extractor/faz.py | 89 + .../site-packages/yt_dlp/extractor/fc2.py | 0 .../site-packages/yt_dlp/extractor/fczenit.py | 51 + .../site-packages/yt_dlp/extractor/fifa.py | 0 .../yt_dlp/extractor/filmmodu.py | 0 .../site-packages/yt_dlp/extractor/filmon.py | 0 .../site-packages/yt_dlp/extractor/filmweb.py | 38 + .../site-packages/yt_dlp/extractor/firsttv.py | 152 + .../site-packages/yt_dlp/extractor/fivetv.py | 85 + .../site-packages/yt_dlp/extractor/flickr.py | 114 + .../yt_dlp/extractor/folketinget.py | 73 + .../yt_dlp/extractor/footyroom.py | 53 + .../yt_dlp/extractor/formula1.py | 24 + .../yt_dlp/extractor/fourtube.py | 306 + .../yt_dlp/extractor/fourzerostudio.py | 106 + .../site-packages/yt_dlp/extractor/fox.py | 0 .../site-packages/yt_dlp/extractor/fox9.py | 38 + .../site-packages/yt_dlp/extractor/foxgay.py | 58 + .../site-packages/yt_dlp/extractor/foxnews.py | 0 .../yt_dlp/extractor/foxsports.py | 0 .../site-packages/yt_dlp/extractor/fptplay.py | 117 + .../yt_dlp/extractor/franceinter.py | 56 + .../yt_dlp/extractor/francetv.py | 385 + .../yt_dlp/extractor/freesound.py | 77 + .../yt_dlp/extractor/freespeech.py | 29 + .../site-packages/yt_dlp/extractor/freetv.py | 139 + .../yt_dlp/extractor/frontendmasters.py | 252 + .../site-packages/yt_dlp/extractor/fujitv.py | 0 .../yt_dlp/extractor/funimation.py | 0 .../site-packages/yt_dlp/extractor/funk.py | 44 + .../site-packages/yt_dlp/extractor/fusion.py | 81 + .../site-packages/yt_dlp/extractor/fuyintv.py | 30 + .../site-packages/yt_dlp/extractor/gab.py | 141 + .../site-packages/yt_dlp/extractor/gaia.py | 122 + .../yt_dlp/extractor/gameinformer.py | 46 + .../yt_dlp/extractor/gamejolt.py | 540 + .../yt_dlp/extractor/gamespot.py | 75 + .../yt_dlp/extractor/gamestar.py | 60 + .../yt_dlp/extractor/gaskrank.py | 97 + .../site-packages/yt_dlp/extractor/gazeta.py | 43 + .../yt_dlp/extractor/gdcvault.py | 0 .../yt_dlp/extractor/gedidigital.py | 198 + .../site-packages/yt_dlp/extractor/generic.py | 0 .../yt_dlp/extractor/genericembeds.py | 114 + .../site-packages/yt_dlp/extractor/genius.py | 0 .../site-packages/yt_dlp/extractor/gettr.py | 206 + .../site-packages/yt_dlp/extractor/gfycat.py | 145 + .../yt_dlp/extractor/giantbomb.py | 85 + .../site-packages/yt_dlp/extractor/giga.py | 93 + .../site-packages/yt_dlp/extractor/gigya.py | 20 + .../site-packages/yt_dlp/extractor/glide.py | 38 + .../site-packages/yt_dlp/extractor/globo.py | 0 .../site-packages/yt_dlp/extractor/glomex.py | 216 + .../site-packages/yt_dlp/extractor/go.py | 333 + .../site-packages/yt_dlp/extractor/godtube.py | 54 + .../site-packages/yt_dlp/extractor/gofile.py | 0 .../site-packages/yt_dlp/extractor/golem.py | 68 + .../yt_dlp/extractor/goodgame.py | 57 + .../yt_dlp/extractor/googledrive.py | 0 .../yt_dlp/extractor/googlepodcasts.py | 84 + .../yt_dlp/extractor/googlesearch.py | 38 + .../site-packages/yt_dlp/extractor/goplay.py | 0 .../site-packages/yt_dlp/extractor/gopro.py | 105 + .../site-packages/yt_dlp/extractor/goshgay.py | 48 + .../yt_dlp/extractor/gotostage.py | 70 + .../yt_dlp/extractor/gputechconf.py | 32 + .../site-packages/yt_dlp/extractor/gronkh.py | 0 .../site-packages/yt_dlp/extractor/groupon.py | 65 + .../yt_dlp/extractor/harpodeon.py | 70 + .../site-packages/yt_dlp/extractor/hbo.py | 171 + .../yt_dlp/extractor/hearthisat.py | 96 + .../site-packages/yt_dlp/extractor/heise.py | 207 + .../yt_dlp/extractor/hellporno.py | 72 + .../yt_dlp/extractor/helsinki.py | 38 + .../yt_dlp/extractor/hentaistigma.py | 0 .../site-packages/yt_dlp/extractor/hgtv.py | 37 + .../site-packages/yt_dlp/extractor/hidive.py | 0 .../yt_dlp/extractor/historicfilms.py | 45 + .../site-packages/yt_dlp/extractor/hitbox.py | 209 + .../yt_dlp/extractor/hitrecord.py | 66 + .../site-packages/yt_dlp/extractor/hketv.py | 0 .../site-packages/yt_dlp/extractor/holodex.py | 100 + .../yt_dlp/extractor/hotnewhiphop.py | 0 .../site-packages/yt_dlp/extractor/hotstar.py | 0 .../site-packages/yt_dlp/extractor/howcast.py | 41 + .../yt_dlp/extractor/howstuffworks.py | 86 + .../yt_dlp/extractor/hrfensehen.py | 90 + .../site-packages/yt_dlp/extractor/hrti.py | 0 .../site-packages/yt_dlp/extractor/hse.py | 93 + .../site-packages/yt_dlp/extractor/huajiao.py | 53 + .../yt_dlp/extractor/huffpost.py | 90 + .../site-packages/yt_dlp/extractor/hungama.py | 0 .../site-packages/yt_dlp/extractor/huya.py | 134 + .../site-packages/yt_dlp/extractor/hypem.py | 47 + .../yt_dlp/extractor/hypergryph.py | 32 + .../site-packages/yt_dlp/extractor/hytale.py | 58 + .../site-packages/yt_dlp/extractor/icareus.py | 179 + .../yt_dlp/extractor/ichinanalive.py | 160 + .../site-packages/yt_dlp/extractor/ign.py | 0 .../site-packages/yt_dlp/extractor/iheart.py | 94 + .../yt_dlp/extractor/iltalehti.py | 51 + .../site-packages/yt_dlp/extractor/imdb.py | 144 + .../yt_dlp/extractor/imggaming.py | 0 .../site-packages/yt_dlp/extractor/imgur.py | 150 + .../site-packages/yt_dlp/extractor/ina.py | 84 + .../site-packages/yt_dlp/extractor/inc.py | 57 + .../yt_dlp/extractor/indavideo.py | 0 .../site-packages/yt_dlp/extractor/infoq.py | 136 + .../yt_dlp/extractor/instagram.py | 0 .../yt_dlp/extractor/internazionale.py | 75 + .../yt_dlp/extractor/internetvideoarchive.py | 58 + .../site-packages/yt_dlp/extractor/iprima.py | 0 .../site-packages/yt_dlp/extractor/iqiyi.py | 0 .../yt_dlp/extractor/islamchannel.py | 81 + .../yt_dlp/extractor/israelnationalnews.py | 50 + .../site-packages/yt_dlp/extractor/itprotv.py | 0 .../site-packages/yt_dlp/extractor/itv.py | 266 + .../site-packages/yt_dlp/extractor/ivi.py | 253 + .../site-packages/yt_dlp/extractor/ivideon.py | 77 + .../site-packages/yt_dlp/extractor/iwara.py | 0 .../site-packages/yt_dlp/extractor/ixigua.py | 83 + .../yt_dlp/extractor/izlesene.py | 113 + .../site-packages/yt_dlp/extractor/jable.py | 0 .../site-packages/yt_dlp/extractor/jamendo.py | 210 + .../yt_dlp/extractor/japandiet.py | 274 + .../yt_dlp/extractor/jeuxvideo.py | 50 + .../site-packages/yt_dlp/extractor/jixie.py | 47 + .../site-packages/yt_dlp/extractor/joj.py | 108 + .../site-packages/yt_dlp/extractor/jove.py | 76 + .../yt_dlp/extractor/jwplatform.py | 0 .../site-packages/yt_dlp/extractor/kakao.py | 0 .../site-packages/yt_dlp/extractor/kaltura.py | 545 + .../site-packages/yt_dlp/extractor/kanal2.py | 66 + .../yt_dlp/extractor/kankanews.py | 48 + .../yt_dlp/extractor/karaoketv.py | 61 + .../yt_dlp/extractor/karrierevideos.py | 96 + .../yt_dlp/extractor/keezmovies.py | 125 + .../yt_dlp/extractor/kelbyone.py | 80 + .../site-packages/yt_dlp/extractor/ketnet.py | 0 .../yt_dlp/extractor/khanacademy.py | 110 + .../site-packages/yt_dlp/extractor/kick.py | 0 .../site-packages/yt_dlp/extractor/kicker.py | 55 + .../yt_dlp/extractor/kickstarter.py | 68 + .../site-packages/yt_dlp/extractor/kinja.py | 206 + .../yt_dlp/extractor/kinopoisk.py | 63 + .../yt_dlp/extractor/kommunetv.py | 0 .../site-packages/yt_dlp/extractor/kompas.py | 26 + .../yt_dlp/extractor/konserthusetplay.py | 119 + .../site-packages/yt_dlp/extractor/koo.py | 113 + .../yt_dlp/extractor/krasview.py | 57 + .../site-packages/yt_dlp/extractor/kth.py | 28 + .../site-packages/yt_dlp/extractor/ku6.py | 30 + .../site-packages/yt_dlp/extractor/kusi.py | 83 + .../site-packages/yt_dlp/extractor/kuwo.py | 0 .../site-packages/yt_dlp/extractor/la7.py | 0 .../yt_dlp/extractor/laola1tv.py | 261 + .../site-packages/yt_dlp/extractor/lastfm.py | 0 .../yt_dlp/extractor/lazy_extractors.py | 0 .../site-packages/yt_dlp/extractor/lbry.py | 0 .../site-packages/yt_dlp/extractor/lci.py | 28 + .../site-packages/yt_dlp/extractor/lcp.py | 87 + .../yt_dlp/extractor/lecture2go.py | 66 + .../yt_dlp/extractor/lecturio.py | 0 .../site-packages/yt_dlp/extractor/leeco.py | 364 + .../yt_dlp/extractor/lefigaro.py | 135 + .../site-packages/yt_dlp/extractor/lego.py | 0 .../site-packages/yt_dlp/extractor/lemonde.py | 56 + .../site-packages/yt_dlp/extractor/lenta.py | 50 + .../yt_dlp/extractor/libraryofcongress.py | 148 + .../site-packages/yt_dlp/extractor/libsyn.py | 89 + .../yt_dlp/extractor/lifenews.py | 234 + .../site-packages/yt_dlp/extractor/likee.py | 192 + .../yt_dlp/extractor/limelight.py | 0 .../site-packages/yt_dlp/extractor/line.py | 0 .../yt_dlp/extractor/linkedin.py | 255 + .../yt_dlp/extractor/linuxacademy.py | 0 .../yt_dlp/extractor/liputan6.py | 64 + .../yt_dlp/extractor/listennotes.py | 86 + .../site-packages/yt_dlp/extractor/litv.py | 0 .../yt_dlp/extractor/livejournal.py | 39 + .../yt_dlp/extractor/livestream.py | 0 .../yt_dlp/extractor/livestreamfails.py | 37 + .../site-packages/yt_dlp/extractor/lnkgo.py | 163 + .../yt_dlp/extractor/localnews8.py | 42 + .../yt_dlp/extractor/lovehomeporn.py | 33 + .../site-packages/yt_dlp/extractor/lrt.py | 108 + .../site-packages/yt_dlp/extractor/lumni.py | 24 + .../site-packages/yt_dlp/extractor/lynda.py | 330 + .../site-packages/yt_dlp/extractor/m6.py | 22 + .../yt_dlp/extractor/magentamusik360.py | 58 + .../site-packages/yt_dlp/extractor/mailru.py | 0 .../yt_dlp/extractor/mainstreaming.py | 0 .../site-packages/yt_dlp/extractor/malltv.py | 107 + .../yt_dlp/extractor/mangomolo.py | 73 + .../site-packages/yt_dlp/extractor/manoto.py | 133 + .../yt_dlp/extractor/manyvids.py | 161 + .../site-packages/yt_dlp/extractor/maoritv.py | 28 + .../site-packages/yt_dlp/extractor/markiza.py | 122 + .../yt_dlp/extractor/massengeschmacktv.py | 0 .../site-packages/yt_dlp/extractor/masters.py | 38 + .../site-packages/yt_dlp/extractor/matchtv.py | 51 + .../site-packages/yt_dlp/extractor/mdr.py | 184 + .../site-packages/yt_dlp/extractor/medaltv.py | 0 .../yt_dlp/extractor/mediaite.py | 0 .../yt_dlp/extractor/mediaklikk.py | 0 .../yt_dlp/extractor/medialaan.py | 111 + .../yt_dlp/extractor/mediaset.py | 0 .../yt_dlp/extractor/mediasite.py | 0 .../yt_dlp/extractor/mediastream.py | 0 .../yt_dlp/extractor/mediaworksnz.py | 103 + .../site-packages/yt_dlp/extractor/medici.py | 67 + .../yt_dlp/extractor/megaphone.py | 46 + .../yt_dlp/extractor/megatvcom.py | 0 .../site-packages/yt_dlp/extractor/meipai.py | 99 + .../yt_dlp/extractor/melonvod.py | 68 + .../site-packages/yt_dlp/extractor/meta.py | 70 + .../yt_dlp/extractor/metacafe.py | 281 + .../yt_dlp/extractor/metacritic.py | 62 + .../site-packages/yt_dlp/extractor/mgoon.py | 81 + .../site-packages/yt_dlp/extractor/mgtv.py | 0 .../site-packages/yt_dlp/extractor/miaopai.py | 36 + .../yt_dlp/extractor/microsoftembed.py | 65 + .../yt_dlp/extractor/microsoftstream.py | 121 + .../extractor/microsoftvirtualacademy.py | 189 + .../site-packages/yt_dlp/extractor/mildom.py | 291 + .../site-packages/yt_dlp/extractor/minds.py | 0 .../yt_dlp/extractor/ministrygrid.py | 55 + .../site-packages/yt_dlp/extractor/minoto.py | 45 + .../site-packages/yt_dlp/extractor/miomio.py | 0 .../yt_dlp/extractor/mirrativ.py | 118 + .../yt_dlp/extractor/mirrorcouk.py | 98 + .../site-packages/yt_dlp/extractor/mit.py | 130 + .../site-packages/yt_dlp/extractor/mitele.py | 82 + .../site-packages/yt_dlp/extractor/mixch.py | 81 + .../yt_dlp/extractor/mixcloud.py | 0 .../site-packages/yt_dlp/extractor/mlb.py | 381 + .../yt_dlp/extractor/mlssoccer.py | 114 + .../site-packages/yt_dlp/extractor/mnet.py | 85 + .../site-packages/yt_dlp/extractor/mocha.py | 0 .../yt_dlp/extractor/moevideo.py | 74 + .../site-packages/yt_dlp/extractor/mofosex.py | 70 + .../yt_dlp/extractor/mojvideo.py | 52 + .../yt_dlp/extractor/morningstar.py | 45 + .../yt_dlp/extractor/motherless.py | 0 .../yt_dlp/extractor/motorsport.py | 51 + .../yt_dlp/extractor/movieclips.py | 0 .../yt_dlp/extractor/moviepilot.py | 97 + .../site-packages/yt_dlp/extractor/moview.py | 43 + .../yt_dlp/extractor/moviezine.py | 38 + .../yt_dlp/extractor/movingimage.py | 50 + .../site-packages/yt_dlp/extractor/msn.py | 167 + .../site-packages/yt_dlp/extractor/mtv.py | 0 .../yt_dlp/extractor/muenchentv.py | 71 + .../yt_dlp/extractor/murrtube.py | 162 + .../yt_dlp/extractor/musescore.py | 64 + .../yt_dlp/extractor/musicdex.py | 172 + .../site-packages/yt_dlp/extractor/mwave.py | 87 + .../yt_dlp/extractor/mxplayer.py | 241 + .../yt_dlp/extractor/mychannels.py | 35 + .../site-packages/yt_dlp/extractor/myspace.py | 195 + .../site-packages/yt_dlp/extractor/myspass.py | 92 + .../site-packages/yt_dlp/extractor/myvi.py | 100 + .../yt_dlp/extractor/myvideoge.py | 81 + .../yt_dlp/extractor/myvidster.py | 27 + .../site-packages/yt_dlp/extractor/n1.py | 0 .../site-packages/yt_dlp/extractor/nate.py | 120 + .../yt_dlp/extractor/nationalgeographic.py | 0 .../site-packages/yt_dlp/extractor/naver.py | 0 .../site-packages/yt_dlp/extractor/nba.py | 419 + .../site-packages/yt_dlp/extractor/nbc.py | 0 .../site-packages/yt_dlp/extractor/ndr.py | 471 + .../site-packages/yt_dlp/extractor/ndtv.py | 106 + .../site-packages/yt_dlp/extractor/nebula.py | 0 .../yt_dlp/extractor/nerdcubed.py | 33 + .../yt_dlp/extractor/neteasemusic.py | 0 .../yt_dlp/extractor/netverse.py | 0 .../yt_dlp/extractor/netzkino.py | 84 + .../yt_dlp/extractor/newgrounds.py | 286 + .../yt_dlp/extractor/newspicks.py | 53 + .../yt_dlp/extractor/newstube.py | 75 + .../site-packages/yt_dlp/extractor/newsy.py | 47 + .../yt_dlp/extractor/nextmedia.py | 235 + .../site-packages/yt_dlp/extractor/nexx.py | 525 + .../site-packages/yt_dlp/extractor/nfb.py | 58 + .../yt_dlp/extractor/nfhsnetwork.py | 141 + .../site-packages/yt_dlp/extractor/nfl.py | 0 .../site-packages/yt_dlp/extractor/nhk.py | 0 .../site-packages/yt_dlp/extractor/nhl.py | 123 + .../site-packages/yt_dlp/extractor/nick.py | 244 + .../yt_dlp/extractor/niconico.py | 0 .../yt_dlp/extractor/ninecninemedia.py | 130 + .../site-packages/yt_dlp/extractor/ninegag.py | 148 + .../site-packages/yt_dlp/extractor/ninenow.py | 0 .../yt_dlp/extractor/nintendo.py | 57 + .../site-packages/yt_dlp/extractor/nitter.py | 0 .../yt_dlp/extractor/njpwworld.py | 0 .../yt_dlp/extractor/nobelprize.py | 58 + .../site-packages/yt_dlp/extractor/noice.py | 116 + .../yt_dlp/extractor/nonktube.py | 36 + .../yt_dlp/extractor/noodlemagazine.py | 0 .../site-packages/yt_dlp/extractor/noovo.py | 101 + .../yt_dlp/extractor/normalboots.py | 51 + .../site-packages/yt_dlp/extractor/nosnl.py | 115 + .../yt_dlp/extractor/nosvideo.py | 0 .../site-packages/yt_dlp/extractor/nova.py | 0 .../yt_dlp/extractor/novaplay.py | 0 .../site-packages/yt_dlp/extractor/nowness.py | 0 .../site-packages/yt_dlp/extractor/noz.py | 82 + .../site-packages/yt_dlp/extractor/npo.py | 612 + .../site-packages/yt_dlp/extractor/npr.py | 132 + .../site-packages/yt_dlp/extractor/nrk.py | 0 .../site-packages/yt_dlp/extractor/nrl.py | 26 + .../site-packages/yt_dlp/extractor/ntvcojp.py | 55 + .../site-packages/yt_dlp/extractor/ntvde.py | 73 + .../site-packages/yt_dlp/extractor/ntvru.py | 140 + .../site-packages/yt_dlp/extractor/nuevo.py | 36 + .../site-packages/yt_dlp/extractor/nuvid.py | 99 + .../site-packages/yt_dlp/extractor/nytimes.py | 262 + .../yt_dlp/extractor/nzherald.py | 123 + .../yt_dlp/extractor/nzonscreen.py | 93 + .../site-packages/yt_dlp/extractor/nzz.py | 40 + .../site-packages/yt_dlp/extractor/odatv.py | 47 + .../yt_dlp/extractor/odkmedia.py | 0 .../yt_dlp/extractor/odnoklassniki.py | 0 .../site-packages/yt_dlp/extractor/oftv.py | 0 .../yt_dlp/extractor/oktoberfesttv.py | 44 + .../yt_dlp/extractor/olympics.py | 65 + .../site-packages/yt_dlp/extractor/on24.py | 87 + .../site-packages/yt_dlp/extractor/once.py | 40 + .../yt_dlp/extractor/ondemandkorea.py | 87 + .../yt_dlp/extractor/onefootball.py | 47 + .../yt_dlp/extractor/onenewsnz.py | 111 + .../yt_dlp/extractor/oneplace.py | 43 + .../site-packages/yt_dlp/extractor/onet.py | 259 + .../yt_dlp/extractor/onionstudios.py | 42 + .../site-packages/yt_dlp/extractor/ooyala.py | 230 + .../yt_dlp/extractor/opencast.py | 0 .../yt_dlp/extractor/openload.py | 243 + .../site-packages/yt_dlp/extractor/openrec.py | 147 + .../site-packages/yt_dlp/extractor/ora.py | 71 + .../site-packages/yt_dlp/extractor/orf.py | 0 .../yt_dlp/extractor/outsidetv.py | 25 + .../yt_dlp/extractor/packtpub.py | 0 .../yt_dlp/extractor/palcomp3.py | 143 + .../yt_dlp/extractor/pandoratv.py | 128 + .../site-packages/yt_dlp/extractor/panopto.py | 0 .../yt_dlp/extractor/paramountplus.py | 201 + .../site-packages/yt_dlp/extractor/parler.py | 0 .../yt_dlp/extractor/parlview.py | 64 + .../site-packages/yt_dlp/extractor/patreon.py | 0 .../site-packages/yt_dlp/extractor/pbs.py | 0 .../yt_dlp/extractor/pearvideo.py | 68 + .../yt_dlp/extractor/peekvids.py | 0 .../yt_dlp/extractor/peertube.py | 1399 ++ .../site-packages/yt_dlp/extractor/peertv.py | 52 + .../site-packages/yt_dlp/extractor/peloton.py | 0 .../site-packages/yt_dlp/extractor/people.py | 29 + .../yt_dlp/extractor/performgroup.py | 77 + .../yt_dlp/extractor/periscope.py | 183 + .../yt_dlp/extractor/philharmoniedeparis.py | 97 + .../site-packages/yt_dlp/extractor/phoenix.py | 130 + .../yt_dlp/extractor/photobucket.py | 43 + .../site-packages/yt_dlp/extractor/piapro.py | 0 .../site-packages/yt_dlp/extractor/picarto.py | 0 .../site-packages/yt_dlp/extractor/piksel.py | 0 .../yt_dlp/extractor/pinkbike.py | 93 + .../yt_dlp/extractor/pinterest.py | 248 + .../yt_dlp/extractor/pixivsketch.py | 118 + .../yt_dlp/extractor/pladform.py | 0 .../yt_dlp/extractor/planetmarathi.py | 72 + .../site-packages/yt_dlp/extractor/platzi.py | 0 .../site-packages/yt_dlp/extractor/playfm.py | 70 + .../yt_dlp/extractor/playplustv.py | 0 .../site-packages/yt_dlp/extractor/plays.py | 49 + .../yt_dlp/extractor/playstuff.py | 63 + .../yt_dlp/extractor/playsuisse.py | 0 .../yt_dlp/extractor/playtvak.py | 185 + .../site-packages/yt_dlp/extractor/playvid.py | 90 + .../yt_dlp/extractor/playwire.py | 72 + .../yt_dlp/extractor/pluralsight.py | 491 + .../site-packages/yt_dlp/extractor/plutotv.py | 194 + .../yt_dlp/extractor/podbayfm.py | 75 + .../yt_dlp/extractor/podchaser.py | 97 + .../yt_dlp/extractor/podomatic.py | 73 + .../site-packages/yt_dlp/extractor/pokemon.py | 136 + .../site-packages/yt_dlp/extractor/pokergo.py | 106 + .../yt_dlp/extractor/polsatgo.py | 86 + .../yt_dlp/extractor/polskieradio.py | 0 .../yt_dlp/extractor/popcorntimes.py | 91 + .../yt_dlp/extractor/popcorntv.py | 72 + .../site-packages/yt_dlp/extractor/porn91.py | 95 + .../site-packages/yt_dlp/extractor/porncom.py | 99 + .../site-packages/yt_dlp/extractor/pornez.py | 0 .../yt_dlp/extractor/pornflip.py | 77 + .../site-packages/yt_dlp/extractor/pornhd.py | 116 + .../site-packages/yt_dlp/extractor/pornhub.py | 0 .../yt_dlp/extractor/pornotube.py | 83 + .../yt_dlp/extractor/pornovoisines.py | 102 + .../site-packages/yt_dlp/extractor/pornoxo.py | 54 + .../yt_dlp/extractor/pr0gramm.py | 0 .../yt_dlp/extractor/prankcast.py | 66 + .../yt_dlp/extractor/premiershiprugby.py | 39 + .../site-packages/yt_dlp/extractor/presstv.py | 69 + .../yt_dlp/extractor/projectveritas.py | 51 + .../yt_dlp/extractor/prosiebensat1.py | 496 + .../site-packages/yt_dlp/extractor/prx.py | 428 + .../site-packages/yt_dlp/extractor/puhutv.py | 0 .../site-packages/yt_dlp/extractor/puls4.py | 51 + .../site-packages/yt_dlp/extractor/pyvideo.py | 70 + .../yt_dlp/extractor/qingting.py | 47 + .../site-packages/yt_dlp/extractor/qqmusic.py | 365 + .../site-packages/yt_dlp/extractor/r7.py | 108 + .../site-packages/yt_dlp/extractor/radiko.py | 0 .../yt_dlp/extractor/radiobremen.py | 59 + .../yt_dlp/extractor/radiocanada.py | 0 .../site-packages/yt_dlp/extractor/radiode.py | 49 + .../yt_dlp/extractor/radiofrance.py | 0 .../yt_dlp/extractor/radiojavan.py | 80 + .../yt_dlp/extractor/radiokapital.py | 97 + .../yt_dlp/extractor/radiozet.py | 50 + .../site-packages/yt_dlp/extractor/radlive.py | 184 + .../site-packages/yt_dlp/extractor/rai.py | 0 .../yt_dlp/extractor/raywenderlich.py | 177 + .../site-packages/yt_dlp/extractor/rbgtum.py | 0 .../yt_dlp/extractor/rbmaradio.py | 68 + .../site-packages/yt_dlp/extractor/rcs.py | 0 .../site-packages/yt_dlp/extractor/rcti.py | 0 .../site-packages/yt_dlp/extractor/rds.py | 67 + .../site-packages/yt_dlp/extractor/redbee.py | 379 + .../yt_dlp/extractor/redbulltv.py | 0 .../site-packages/yt_dlp/extractor/reddit.py | 0 .../site-packages/yt_dlp/extractor/redgifs.py | 0 .../site-packages/yt_dlp/extractor/redtube.py | 140 + .../site-packages/yt_dlp/extractor/regiotv.py | 0 .../site-packages/yt_dlp/extractor/rentv.py | 102 + .../site-packages/yt_dlp/extractor/restudy.py | 40 + .../site-packages/yt_dlp/extractor/reuters.py | 65 + .../yt_dlp/extractor/reverbnation.py | 51 + .../site-packages/yt_dlp/extractor/rice.py | 112 + .../yt_dlp/extractor/rmcdecouverte.py | 71 + .../yt_dlp/extractor/rockstargames.py | 64 + .../site-packages/yt_dlp/extractor/rokfin.py | 0 .../yt_dlp/extractor/roosterteeth.py | 0 .../yt_dlp/extractor/rottentomatoes.py | 0 .../site-packages/yt_dlp/extractor/rozhlas.py | 0 .../site-packages/yt_dlp/extractor/rte.py | 0 .../site-packages/yt_dlp/extractor/rtl2.py | 193 + .../site-packages/yt_dlp/extractor/rtlnl.py | 294 + .../site-packages/yt_dlp/extractor/rtnews.py | 196 + .../site-packages/yt_dlp/extractor/rtp.py | 97 + .../site-packages/yt_dlp/extractor/rtrfm.py | 65 + .../site-packages/yt_dlp/extractor/rts.py | 0 .../site-packages/yt_dlp/extractor/rtve.py | 344 + .../site-packages/yt_dlp/extractor/rtvnh.py | 58 + .../site-packages/yt_dlp/extractor/rtvs.py | 85 + .../site-packages/yt_dlp/extractor/rtvslo.py | 0 .../site-packages/yt_dlp/extractor/ruhd.py | 42 + .../yt_dlp/extractor/rule34video.py | 0 .../site-packages/yt_dlp/extractor/rumble.py | 0 .../site-packages/yt_dlp/extractor/rutube.py | 365 + .../site-packages/yt_dlp/extractor/rutv.py | 203 + .../site-packages/yt_dlp/extractor/ruutu.py | 262 + .../site-packages/yt_dlp/extractor/ruv.py | 186 + .../site-packages/yt_dlp/extractor/safari.py | 0 .../yt_dlp/extractor/saitosan.py | 74 + .../yt_dlp/extractor/samplefocus.py | 97 + .../site-packages/yt_dlp/extractor/sapo.py | 114 + .../yt_dlp/extractor/savefrom.py | 30 + .../site-packages/yt_dlp/extractor/sbs.py | 0 .../site-packages/yt_dlp/extractor/screen9.py | 62 + .../yt_dlp/extractor/screencast.py | 117 + .../yt_dlp/extractor/screencastify.py | 52 + .../yt_dlp/extractor/screencastomatic.py | 72 + .../yt_dlp/extractor/scrippsnetworks.py | 0 .../yt_dlp/extractor/scrolller.py | 102 + .../site-packages/yt_dlp/extractor/scte.py | 135 + .../site-packages/yt_dlp/extractor/seeker.py | 55 + .../yt_dlp/extractor/senategov.py | 200 + .../yt_dlp/extractor/sendtonews.py | 104 + .../site-packages/yt_dlp/extractor/servus.py | 135 + .../yt_dlp/extractor/sevenplus.py | 0 .../site-packages/yt_dlp/extractor/sexu.py | 60 + .../yt_dlp/extractor/seznamzpravy.py | 157 + .../site-packages/yt_dlp/extractor/shahid.py | 0 .../site-packages/yt_dlp/extractor/shared.py | 138 + .../yt_dlp/extractor/sharevideos.py | 6 + .../yt_dlp/extractor/shemaroome.py | 0 .../yt_dlp/extractor/showroomlive.py | 80 + .../site-packages/yt_dlp/extractor/sibnet.py | 17 + .../yt_dlp/extractor/simplecast.py | 151 + .../site-packages/yt_dlp/extractor/sina.py | 0 .../site-packages/yt_dlp/extractor/sixplay.py | 0 .../site-packages/yt_dlp/extractor/skeb.py | 140 + .../site-packages/yt_dlp/extractor/sky.py | 156 + .../site-packages/yt_dlp/extractor/skyit.py | 227 + .../yt_dlp/extractor/skylinewebcams.py | 39 + .../yt_dlp/extractor/skynewsarabia.py | 114 + .../yt_dlp/extractor/skynewsau.py | 43 + .../yt_dlp/extractor/slideshare.py | 53 + .../yt_dlp/extractor/slideslive.py | 0 .../yt_dlp/extractor/slutload.py | 63 + .../site-packages/yt_dlp/extractor/smotrim.py | 65 + .../site-packages/yt_dlp/extractor/snotr.py | 68 + .../site-packages/yt_dlp/extractor/sohu.py | 0 .../site-packages/yt_dlp/extractor/sonyliv.py | 0 .../yt_dlp/extractor/soundcloud.py | 0 .../yt_dlp/extractor/soundgasm.py | 74 + .../yt_dlp/extractor/southpark.py | 188 + .../yt_dlp/extractor/sovietscloset.py | 0 .../yt_dlp/extractor/spankbang.py | 195 + .../yt_dlp/extractor/spankwire.py | 174 + .../site-packages/yt_dlp/extractor/spiegel.py | 51 + .../site-packages/yt_dlp/extractor/spike.py | 46 + .../site-packages/yt_dlp/extractor/sport5.py | 86 + .../yt_dlp/extractor/sportbox.py | 88 + .../yt_dlp/extractor/sportdeutschland.py | 142 + .../site-packages/yt_dlp/extractor/spotify.py | 167 + .../yt_dlp/extractor/spreaker.py | 173 + .../yt_dlp/extractor/springboardplatform.py | 113 + .../site-packages/yt_dlp/extractor/sprout.py | 61 + .../site-packages/yt_dlp/extractor/srgssr.py | 247 + .../yt_dlp/extractor/srmediathek.py | 56 + .../yt_dlp/extractor/stanfordoc.py | 89 + .../yt_dlp/extractor/startrek.py | 75 + .../site-packages/yt_dlp/extractor/startv.py | 100 + .../site-packages/yt_dlp/extractor/steam.py | 174 + .../yt_dlp/extractor/stitcher.py | 142 + .../yt_dlp/extractor/storyfire.py | 135 + .../yt_dlp/extractor/streamable.py | 103 + .../yt_dlp/extractor/streamanity.py | 0 .../yt_dlp/extractor/streamcloud.py | 75 + .../yt_dlp/extractor/streamcz.py | 122 + .../yt_dlp/extractor/streamff.py | 30 + .../yt_dlp/extractor/streetvoice.py | 97 + .../yt_dlp/extractor/stretchinternet.py | 35 + .../yt_dlp/extractor/stripchat.py | 0 .../site-packages/yt_dlp/extractor/stv.py | 89 + .../yt_dlp/extractor/substack.py | 0 .../yt_dlp/extractor/sunporno.py | 75 + .../yt_dlp/extractor/sverigesradio.py | 0 .../site-packages/yt_dlp/extractor/svt.py | 0 .../yt_dlp/extractor/swearnet.py | 73 + .../yt_dlp/extractor/swrmediathek.py | 111 + .../site-packages/yt_dlp/extractor/syfy.py | 0 .../site-packages/yt_dlp/extractor/syvdk.py | 33 + .../site-packages/yt_dlp/extractor/sztvhu.py | 38 + .../yt_dlp/extractor/tagesschau.py | 0 .../site-packages/yt_dlp/extractor/tass.py | 58 + .../site-packages/yt_dlp/extractor/tbs.py | 89 + .../yt_dlp/extractor/tdslifeway.py | 31 + .../yt_dlp/extractor/teachable.py | 0 .../yt_dlp/extractor/teachertube.py | 124 + .../yt_dlp/extractor/teachingchannel.py | 31 + .../yt_dlp/extractor/teamcoco.py | 0 .../yt_dlp/extractor/teamtreehouse.py | 134 + .../yt_dlp/extractor/techtalks.py | 80 + .../site-packages/yt_dlp/extractor/ted.py | 236 + .../site-packages/yt_dlp/extractor/tele13.py | 84 + .../site-packages/yt_dlp/extractor/tele5.py | 88 + .../yt_dlp/extractor/telebruxelles.py | 72 + .../yt_dlp/extractor/telecaribe.py | 0 .../yt_dlp/extractor/telecinco.py | 147 + .../yt_dlp/extractor/telegraaf.py | 86 + .../yt_dlp/extractor/telegram.py | 136 + .../site-packages/yt_dlp/extractor/telemb.py | 74 + .../yt_dlp/extractor/telemundo.py | 0 .../yt_dlp/extractor/telequebec.py | 237 + .../yt_dlp/extractor/teletask.py | 51 + .../yt_dlp/extractor/telewebion.py | 52 + .../site-packages/yt_dlp/extractor/tempo.py | 114 + .../site-packages/yt_dlp/extractor/tencent.py | 0 .../yt_dlp/extractor/tennistv.py | 0 .../site-packages/yt_dlp/extractor/tenplay.py | 0 .../site-packages/yt_dlp/extractor/testurl.py | 0 .../site-packages/yt_dlp/extractor/tf1.py | 0 .../site-packages/yt_dlp/extractor/tfo.py | 0 .../yt_dlp/extractor/theholetv.py | 35 + .../yt_dlp/extractor/theintercept.py | 46 + .../yt_dlp/extractor/theplatform.py | 0 .../site-packages/yt_dlp/extractor/thestar.py | 33 + .../site-packages/yt_dlp/extractor/thesun.py | 0 .../site-packages/yt_dlp/extractor/theta.py | 0 .../yt_dlp/extractor/theweatherchannel.py | 0 .../yt_dlp/extractor/thisamericanlife.py | 38 + .../site-packages/yt_dlp/extractor/thisav.py | 66 + .../yt_dlp/extractor/thisoldhouse.py | 0 .../site-packages/yt_dlp/extractor/thisvid.py | 226 + .../yt_dlp/extractor/threeqsdn.py | 0 .../yt_dlp/extractor/threespeak.py | 93 + .../site-packages/yt_dlp/extractor/tiktok.py | 0 .../site-packages/yt_dlp/extractor/tinypic.py | 54 + .../site-packages/yt_dlp/extractor/tmz.py | 0 .../site-packages/yt_dlp/extractor/tnaflix.py | 337 + .../site-packages/yt_dlp/extractor/toggle.py | 228 + .../site-packages/yt_dlp/extractor/toggo.py | 82 + .../yt_dlp/extractor/tokentube.py | 153 + .../site-packages/yt_dlp/extractor/tonline.py | 51 + .../yt_dlp/extractor/toongoggles.py | 76 + .../site-packages/yt_dlp/extractor/toutv.py | 0 .../site-packages/yt_dlp/extractor/toypics.py | 87 + .../yt_dlp/extractor/traileraddict.py | 61 + .../site-packages/yt_dlp/extractor/triller.py | 0 .../yt_dlp/extractor/trilulilu.py | 100 + .../site-packages/yt_dlp/extractor/trovo.py | 342 + .../yt_dlp/extractor/trtcocuk.py | 48 + .../site-packages/yt_dlp/extractor/trueid.py | 0 .../site-packages/yt_dlp/extractor/trunews.py | 32 + .../site-packages/yt_dlp/extractor/truth.py | 69 + .../site-packages/yt_dlp/extractor/trutv.py | 70 + .../site-packages/yt_dlp/extractor/tube8.py | 79 + .../yt_dlp/extractor/tubetugraz.py | 0 .../site-packages/yt_dlp/extractor/tubitv.py | 0 .../site-packages/yt_dlp/extractor/tumblr.py | 0 .../site-packages/yt_dlp/extractor/tunein.py | 0 .../site-packages/yt_dlp/extractor/tunepk.py | 87 + .../site-packages/yt_dlp/extractor/turbo.py | 64 + .../site-packages/yt_dlp/extractor/turner.py | 256 + .../site-packages/yt_dlp/extractor/tv2.py | 0 .../site-packages/yt_dlp/extractor/tv24ua.py | 78 + .../site-packages/yt_dlp/extractor/tv2dk.py | 172 + .../site-packages/yt_dlp/extractor/tv2hu.py | 107 + .../site-packages/yt_dlp/extractor/tv4.py | 0 .../yt_dlp/extractor/tv5mondeplus.py | 0 .../site-packages/yt_dlp/extractor/tv5unis.py | 116 + .../site-packages/yt_dlp/extractor/tva.py | 85 + .../yt_dlp/extractor/tvanouvelles.py | 62 + .../site-packages/yt_dlp/extractor/tvc.py | 97 + .../site-packages/yt_dlp/extractor/tver.py | 105 + .../site-packages/yt_dlp/extractor/tvigle.py | 133 + .../yt_dlp/extractor/tviplayer.py | 78 + .../site-packages/yt_dlp/extractor/tvland.py | 37 + .../site-packages/yt_dlp/extractor/tvn24.py | 99 + .../site-packages/yt_dlp/extractor/tvnet.py | 138 + .../site-packages/yt_dlp/extractor/tvnoe.py | 45 + .../site-packages/yt_dlp/extractor/tvnow.py | 639 + .../yt_dlp/extractor/tvopengr.py | 116 + .../site-packages/yt_dlp/extractor/tvp.py | 0 .../site-packages/yt_dlp/extractor/tvplay.py | 0 .../yt_dlp/extractor/tvplayer.py | 0 .../yt_dlp/extractor/tweakers.py | 59 + .../yt_dlp/extractor/twentyfourvideo.py | 128 + .../yt_dlp/extractor/twentymin.py | 80 + .../yt_dlp/extractor/twentythreevideo.py | 76 + .../yt_dlp/extractor/twitcasting.py | 0 .../site-packages/yt_dlp/extractor/twitch.py | 0 .../site-packages/yt_dlp/extractor/twitter.py | 0 .../site-packages/yt_dlp/extractor/txxx.py | 418 + .../site-packages/yt_dlp/extractor/udemy.py | 0 .../site-packages/yt_dlp/extractor/udn.py | 98 + .../site-packages/yt_dlp/extractor/ufctv.py | 13 + .../yt_dlp/extractor/ukcolumn.py | 70 + .../yt_dlp/extractor/uktvplay.py | 36 + .../site-packages/yt_dlp/extractor/umg.py | 97 + .../site-packages/yt_dlp/extractor/unistra.py | 64 + .../site-packages/yt_dlp/extractor/unity.py | 30 + .../yt_dlp/extractor/unscripted.py | 53 + .../yt_dlp/extractor/unsupported.py | 0 .../site-packages/yt_dlp/extractor/uol.py | 138 + .../site-packages/yt_dlp/extractor/uplynk.py | 88 + .../site-packages/yt_dlp/extractor/urort.py | 59 + .../site-packages/yt_dlp/extractor/urplay.py | 0 .../yt_dlp/extractor/usanetwork.py | 21 + .../yt_dlp/extractor/usatoday.py | 60 + .../site-packages/yt_dlp/extractor/ustream.py | 275 + .../site-packages/yt_dlp/extractor/ustudio.py | 119 + .../site-packages/yt_dlp/extractor/utreon.py | 0 .../yt_dlp/extractor/varzesh3.py | 72 + .../site-packages/yt_dlp/extractor/vbox7.py | 93 + .../site-packages/yt_dlp/extractor/veehd.py | 116 + .../site-packages/yt_dlp/extractor/veo.py | 76 + .../site-packages/yt_dlp/extractor/veoh.py | 188 + .../site-packages/yt_dlp/extractor/vesti.py | 118 + .../site-packages/yt_dlp/extractor/vevo.py | 0 .../site-packages/yt_dlp/extractor/vgtv.py | 311 + .../site-packages/yt_dlp/extractor/vh1.py | 33 + .../site-packages/yt_dlp/extractor/vice.py | 0 .../site-packages/yt_dlp/extractor/vidbit.py | 82 + .../site-packages/yt_dlp/extractor/viddler.py | 135 + .../site-packages/yt_dlp/extractor/videa.py | 0 .../yt_dlp/extractor/videocampus_sachsen.py | 0 .../yt_dlp/extractor/videodetective.py | 27 + .../yt_dlp/extractor/videofyme.py | 50 + .../yt_dlp/extractor/videoken.py | 336 + .../yt_dlp/extractor/videomore.py | 307 + .../yt_dlp/extractor/videopress.py | 89 + .../site-packages/yt_dlp/extractor/vidio.py | 309 + .../site-packages/yt_dlp/extractor/vidlii.py | 0 .../yt_dlp/extractor/viewlift.py | 0 .../site-packages/yt_dlp/extractor/viidea.py | 0 .../site-packages/yt_dlp/extractor/viki.py | 346 + .../site-packages/yt_dlp/extractor/vimeo.py | 0 .../site-packages/yt_dlp/extractor/vimm.py | 66 + .../site-packages/yt_dlp/extractor/vimple.py | 58 + .../site-packages/yt_dlp/extractor/vine.py | 151 + .../site-packages/yt_dlp/extractor/viqeo.py | 86 + .../site-packages/yt_dlp/extractor/viu.py | 542 + .../site-packages/yt_dlp/extractor/vk.py | 0 .../site-packages/yt_dlp/extractor/vocaroo.py | 0 .../yt_dlp/extractor/vodlocker.py | 0 .../site-packages/yt_dlp/extractor/vodpl.py | 29 + .../yt_dlp/extractor/vodplatform.py | 37 + .../yt_dlp/extractor/voicerepublic.py | 59 + .../site-packages/yt_dlp/extractor/voicy.py | 144 + .../site-packages/yt_dlp/extractor/volejtv.py | 40 + .../site-packages/yt_dlp/extractor/voot.py | 0 .../yt_dlp/extractor/voxmedia.py | 221 + .../site-packages/yt_dlp/extractor/vrak.py | 77 + .../site-packages/yt_dlp/extractor/vrt.py | 0 .../site-packages/yt_dlp/extractor/vrv.py | 0 .../site-packages/yt_dlp/extractor/vshare.py | 0 .../site-packages/yt_dlp/extractor/vtm.py | 59 + .../site-packages/yt_dlp/extractor/vuclip.py | 68 + .../site-packages/yt_dlp/extractor/vupload.py | 52 + .../site-packages/yt_dlp/extractor/vvvvid.py | 295 + .../yt_dlp/extractor/vyborymos.py | 52 + .../site-packages/yt_dlp/extractor/vzaar.py | 100 + .../site-packages/yt_dlp/extractor/wakanim.py | 75 + .../site-packages/yt_dlp/extractor/walla.py | 82 + .../site-packages/yt_dlp/extractor/wasdtv.py | 159 + .../yt_dlp/extractor/washingtonpost.py | 123 + .../site-packages/yt_dlp/extractor/wat.py | 0 .../yt_dlp/extractor/watchbox.py | 153 + .../yt_dlp/extractor/watchindianporn.py | 65 + .../site-packages/yt_dlp/extractor/wdr.py | 0 .../yt_dlp/extractor/webcamerapl.py | 44 + .../yt_dlp/extractor/webcaster.py | 92 + .../yt_dlp/extractor/webofstories.py | 155 + .../site-packages/yt_dlp/extractor/weibo.py | 0 .../site-packages/yt_dlp/extractor/weiqitv.py | 49 + .../yt_dlp/extractor/whowatch.py | 96 + .../yt_dlp/extractor/wikimedia.py | 55 + .../site-packages/yt_dlp/extractor/willow.py | 56 + .../site-packages/yt_dlp/extractor/wimtv.py | 0 .../site-packages/yt_dlp/extractor/wistia.py | 0 .../yt_dlp/extractor/wordpress.py | 154 + .../yt_dlp/extractor/worldstarhiphop.py | 38 + .../site-packages/yt_dlp/extractor/wppilot.py | 173 + .../yt_dlp/extractor/wrestleuniverse.py | 0 .../site-packages/yt_dlp/extractor/wsj.py | 120 + .../site-packages/yt_dlp/extractor/wwe.py | 138 + .../site-packages/yt_dlp/extractor/xanimu.py | 51 + .../site-packages/yt_dlp/extractor/xbef.py | 42 + .../yt_dlp/extractor/xboxclips.py | 62 + .../yt_dlp/extractor/xfileshare.py | 198 + .../yt_dlp/extractor/xhamster.py | 0 .../yt_dlp/extractor/ximalaya.py | 0 .../yt_dlp/extractor/xinpianchang.py | 90 + .../site-packages/yt_dlp/extractor/xminus.py | 76 + .../site-packages/yt_dlp/extractor/xnxx.py | 83 + .../site-packages/yt_dlp/extractor/xstream.py | 115 + .../site-packages/yt_dlp/extractor/xtube.py | 0 .../site-packages/yt_dlp/extractor/xuite.py | 149 + .../site-packages/yt_dlp/extractor/xvideos.py | 180 + .../yt_dlp/extractor/xxxymovies.py | 77 + .../site-packages/yt_dlp/extractor/yahoo.py | 0 .../yt_dlp/extractor/yandexdisk.py | 142 + .../yt_dlp/extractor/yandexmusic.py | 454 + .../yt_dlp/extractor/yandexvideo.py | 385 + .../yt_dlp/extractor/yapfiles.py | 89 + .../site-packages/yt_dlp/extractor/yappy.py | 0 .../yt_dlp/extractor/yesjapan.py | 0 .../yt_dlp/extractor/yinyuetai.py | 52 + .../yt_dlp/extractor/yle_areena.py | 138 + .../site-packages/yt_dlp/extractor/ynet.py | 48 + .../site-packages/yt_dlp/extractor/youjizz.py | 90 + .../site-packages/yt_dlp/extractor/youku.py | 0 .../site-packages/yt_dlp/extractor/younow.py | 200 + .../site-packages/yt_dlp/extractor/youporn.py | 0 .../yt_dlp/extractor/yourporn.py | 65 + .../yt_dlp/extractor/yourupload.py | 43 + .../site-packages/yt_dlp/extractor/youtube.py | 0 .../site-packages/yt_dlp/extractor/zapiks.py | 106 + .../site-packages/yt_dlp/extractor/zattoo.py | 0 .../site-packages/yt_dlp/extractor/zdf.py | 0 .../site-packages/yt_dlp/extractor/zee5.py | 0 .../site-packages/yt_dlp/extractor/zeenews.py | 57 + .../site-packages/yt_dlp/extractor/zhihu.py | 65 + .../site-packages/yt_dlp/extractor/zingmp3.py | 0 .../site-packages/yt_dlp/extractor/zoom.py | 0 .../site-packages/yt_dlp/extractor/zype.py | 0 .../site-packages/yt_dlp/jsinterp.py | 0 .../site-packages/yt_dlp/minicurses.py | 182 + .../site-packages/yt_dlp/options.py | 0 .../site-packages/yt_dlp/plugins.py | 173 + .../yt_dlp/postprocessor/__init__.py | 47 + .../yt_dlp/postprocessor/common.py | 0 .../yt_dlp/postprocessor/embedthumbnail.py | 0 .../yt_dlp/postprocessor/exec.py | 0 .../yt_dlp/postprocessor/ffmpeg.py | 0 .../yt_dlp/postprocessor/metadataparser.py | 125 + .../yt_dlp/postprocessor/modify_chapters.py | 0 .../postprocessor/movefilesafterdownload.py | 53 + .../yt_dlp/postprocessor/sponskrub.py | 98 + .../yt_dlp/postprocessor/sponsorblock.py | 104 + .../yt_dlp/postprocessor/xattrpp.py | 63 + .../python3.11/site-packages/yt_dlp/socks.py | 0 .../python3.11/site-packages/yt_dlp/update.py | 0 .../python3.11/site-packages/yt_dlp/utils.py | 0 .../site-packages/yt_dlp/version.py | 0 .../python3.11/site-packages/yt_dlp/webvtt.py | 397 + .../zipp-3.15.0.dist-info/INSTALLER | 1 + .../zipp-3.15.0.dist-info/LICENSE | 19 + .../zipp-3.15.0.dist-info/METADATA | 106 + .../zipp-3.15.0.dist-info/RECORD | 0 .../zipp-3.15.0.dist-info/REQUESTED | 0 .../site-packages/zipp-3.15.0.dist-info/WHEEL | 5 + .../zipp-3.15.0.dist-info/top_level.txt | 1 + .../python3.11/site-packages/zipp/__init__.py | 402 + .../site-packages/zipp/py310compat.py | 12 + .../pip-23.2.1.dist-info/AUTHORS.txt | 0 .../pip-23.2.1.dist-info/INSTALLER | 1 + .../pip-23.2.1.dist-info/LICENSE.txt | 20 + .../pip-23.2.1.dist-info/METADATA | 0 .../site-packages/pip-23.2.1.dist-info/RECORD | 0 .../pip-23.2.1.dist-info/REQUESTED | 0 .../site-packages/pip-23.2.1.dist-info/WHEEL | 5 + .../pip-23.2.1.dist-info/entry_points.txt | 0 .../pip-23.2.1.dist-info/top_level.txt | 1 + .../lib}/site-packages/pip/__init__.py | 0 .../lib}/site-packages/pip/__main__.py | 0 .../lib}/site-packages/pip/__pip-runner__.py | 0 .../site-packages/pip/_internal/__init__.py | 19 + .../site-packages/pip/_internal/build_env.py | 0 .../lib}/site-packages/pip/_internal/cache.py | 0 .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 0 .../pip/_internal/cli/cmdoptions.py | 0 .../pip/_internal/cli/command_context.py | 0 .../site-packages/pip/_internal/cli/main.py | 0 .../pip/_internal/cli/main_parser.py | 0 .../site-packages/pip/_internal/cli/parser.py | 0 .../pip/_internal/cli/progress_bars.py | 0 .../pip/_internal/cli/req_command.py | 0 .../pip/_internal/cli/spinners.py | 0 .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 0 .../pip/_internal/commands/cache.py | 0 .../pip/_internal/commands/check.py | 0 .../pip/_internal/commands/completion.py | 0 .../pip/_internal/commands/configuration.py | 0 .../pip/_internal/commands/debug.py | 0 .../pip/_internal/commands/download.py | 0 .../pip/_internal/commands/freeze.py | 0 .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 0 .../pip/_internal/commands/inspect.py | 0 .../pip/_internal/commands/install.py | 0 .../pip/_internal/commands/list.py | 0 .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 0 .../pip/_internal/commands/uninstall.py | 0 .../pip/_internal/commands/wheel.py | 0 .../pip/_internal/configuration.py | 0 .../pip/_internal/distributions/__init__.py | 21 + .../pip/_internal/distributions/base.py | 0 .../pip/_internal/distributions/installed.py | 0 .../pip/_internal/distributions/sdist.py | 0 .../pip/_internal/distributions/wheel.py | 0 .../site-packages/pip/_internal/exceptions.py | 0 .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/collector.py | 0 .../pip/_internal/index/package_finder.py | 0 .../pip/_internal/index/sources.py | 0 .../pip/_internal/locations/__init__.py | 0 .../pip/_internal/locations/_distutils.py | 0 .../pip/_internal/locations/_sysconfig.py | 0 .../pip/_internal/locations/base.py | 0 .../lib/site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 0 .../pip/_internal/metadata/_json.py | 0 .../pip/_internal/metadata/base.py | 0 .../_internal/metadata/importlib/__init__.py | 0 .../_internal/metadata/importlib/_compat.py | 0 .../_internal/metadata/importlib/_dists.py | 0 .../pip/_internal/metadata/importlib/_envs.py | 0 .../pip/_internal/metadata/pkg_resources.py | 0 .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 0 .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 0 .../pip/_internal/models/link.py | 0 .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 0 .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 0 .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/auth.py | 0 .../pip/_internal/network/cache.py | 0 .../pip/_internal/network/download.py | 0 .../pip/_internal/network/lazy_wheel.py | 0 .../pip/_internal/network/session.py | 0 .../pip/_internal/network/utils.py | 0 .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../operations/build/build_tracker.py | 0 .../_internal/operations/build/metadata.py | 0 .../operations/build/metadata_editable.py | 0 .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 0 .../operations/build/wheel_editable.py | 0 .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 0 .../pip/_internal/operations/freeze.py | 0 .../_internal/operations/install/__init__.py | 2 + .../operations/install/editable_legacy.py | 0 .../pip/_internal/operations/install/wheel.py | 0 .../pip/_internal/operations/prepare.py | 0 .../site-packages/pip/_internal/pyproject.py | 0 .../pip/_internal/req/__init__.py | 0 .../pip/_internal/req/constructors.py | 0 .../pip/_internal/req/req_file.py | 0 .../pip/_internal/req/req_install.py | 0 .../pip/_internal/req/req_set.py | 0 .../pip/_internal/req/req_uninstall.py | 0 .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 0 .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 0 .../resolution/resolvelib/factory.py | 0 .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 0 .../resolution/resolvelib/reporter.py | 0 .../resolution/resolvelib/requirements.py | 0 .../resolution/resolvelib/resolver.py | 0 .../pip/_internal/self_outdated_check.py | 0 .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/_jaraco_text.py | 0 .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 0 .../pip/_internal/utils/encoding.py | 0 .../pip/_internal/utils/entrypoints.py | 0 .../pip/_internal/utils/filesystem.py | 0 .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 0 .../pip/_internal/utils/hashes.py | 0 .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 0 .../site-packages/pip/_internal/utils/misc.py | 0 .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 0 .../pip/_internal/utils/subprocess.py | 0 .../pip/_internal/utils/temp_dir.py | 0 .../pip/_internal/utils/unpacking.py | 0 .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 0 .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../site-packages/pip/_internal/vcs/bazaar.py | 0 .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 0 .../pip/_internal/vcs/subversion.py | 0 .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 0 .../site-packages/pip/_vendor/__init__.py | 0 .../pip/_vendor/cachecontrol/__init__.py | 0 .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 0 .../_vendor/cachecontrol/caches/__init__.py | 0 .../_vendor/cachecontrol/caches/file_cache.py | 0 .../cachecontrol/caches/redis_cache.py | 0 .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 0 .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 0 .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../pip/_vendor/certifi/cacert.pem | 4589 +++++ .../site-packages/pip/_vendor/certifi/core.py | 0 .../pip/_vendor/chardet/__init__.py | 0 .../pip/_vendor/chardet/big5freq.py | 0 .../pip/_vendor/chardet/big5prober.py | 0 .../pip/_vendor/chardet/chardistribution.py | 0 .../pip/_vendor/chardet/charsetgroupprober.py | 0 .../pip/_vendor/chardet/charsetprober.py | 0 .../pip/_vendor/chardet/cli/__init__.py | 0 .../pip/_vendor/chardet/cli/chardetect.py | 0 .../pip/_vendor/chardet/codingstatemachine.py | 0 .../_vendor/chardet/codingstatemachinedict.py | 0 .../pip/_vendor/chardet/cp949prober.py | 0 .../pip/_vendor/chardet/enums.py | 0 .../pip/_vendor/chardet/escprober.py | 0 .../pip/_vendor/chardet/escsm.py | 0 .../pip/_vendor/chardet/eucjpprober.py | 0 .../pip/_vendor/chardet/euckrfreq.py | 0 .../pip/_vendor/chardet/euckrprober.py | 0 .../pip/_vendor/chardet/euctwfreq.py | 0 .../pip/_vendor/chardet/euctwprober.py | 0 .../pip/_vendor/chardet/gb2312freq.py | 0 .../pip/_vendor/chardet/gb2312prober.py | 0 .../pip/_vendor/chardet/hebrewprober.py | 0 .../pip/_vendor/chardet/jisfreq.py | 0 .../pip/_vendor/chardet/johabfreq.py | 0 .../pip/_vendor/chardet/johabprober.py | 0 .../pip/_vendor/chardet/jpcntx.py | 0 .../pip/_vendor/chardet/langbulgarianmodel.py | 0 .../pip/_vendor/chardet/langgreekmodel.py | 0 .../pip/_vendor/chardet/langhebrewmodel.py | 0 .../pip/_vendor/chardet/langhungarianmodel.py | 0 .../pip/_vendor/chardet/langrussianmodel.py | 0 .../pip/_vendor/chardet/langthaimodel.py | 0 .../pip/_vendor/chardet/langturkishmodel.py | 0 .../pip/_vendor/chardet/latin1prober.py | 0 .../pip/_vendor/chardet/macromanprober.py | 0 .../pip/_vendor/chardet/mbcharsetprober.py | 0 .../pip/_vendor/chardet/mbcsgroupprober.py | 0 .../pip/_vendor/chardet/mbcssm.py | 0 .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 0 .../pip/_vendor/chardet/resultdict.py | 0 .../pip/_vendor/chardet/sbcharsetprober.py | 0 .../pip/_vendor/chardet/sbcsgroupprober.py | 0 .../pip/_vendor/chardet/sjisprober.py | 0 .../pip/_vendor/chardet/universaldetector.py | 0 .../pip/_vendor/chardet/utf1632prober.py | 0 .../pip/_vendor/chardet/utf8prober.py | 0 .../pip/_vendor/chardet/version.py | 0 .../pip/_vendor/colorama/__init__.py | 0 .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 0 .../pip/_vendor/colorama/initialise.py | 0 .../pip/_vendor/colorama/tests/__init__.py | 0 .../pip/_vendor/colorama/tests/ansi_test.py | 0 .../colorama/tests/ansitowin32_test.py | 0 .../_vendor/colorama/tests/initialise_test.py | 0 .../pip/_vendor/colorama/tests/isatty_test.py | 0 .../pip/_vendor/colorama/tests/utils.py | 0 .../_vendor/colorama/tests/winterm_test.py | 0 .../pip/_vendor/colorama/win32.py | 0 .../pip/_vendor/colorama/winterm.py | 0 .../pip/_vendor/distlib/__init__.py | 0 .../pip/_vendor/distlib/compat.py | 1116 ++ .../pip/_vendor/distlib/database.py | 0 .../pip/_vendor/distlib/index.py | 0 .../pip/_vendor/distlib/locators.py | 0 .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 0 .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 0 .../site-packages/pip/_vendor/distlib/t32.exe | Bin .../pip/_vendor/distlib/t64-arm.exe | Bin .../site-packages/pip/_vendor/distlib/t64.exe | Bin .../site-packages/pip/_vendor/distlib/util.py | 1932 ++ .../pip/_vendor/distlib/version.py | 739 + .../site-packages/pip/_vendor/distlib/w32.exe | Bin .../pip/_vendor/distlib/w64-arm.exe | Bin .../site-packages/pip/_vendor/distlib/w64.exe | Bin .../pip/_vendor/distlib/wheel.py | 0 .../pip/_vendor/distro/__init__.py | 0 .../pip/_vendor/distro/__main__.py | 0 .../pip/_vendor/distro/distro.py | 0 .../pip/_vendor/idna/__init__.py | 44 + .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++ .../pip/_vendor/msgpack/__init__.py | 0 .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 0 .../pip/_vendor/msgpack/fallback.py | 0 .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 + .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 0 .../pip/_vendor/platformdirs/__init__.py | 0 .../pip/_vendor/platformdirs/__main__.py | 0 .../pip/_vendor/platformdirs/android.py | 0 .../pip/_vendor/platformdirs/api.py | 0 .../pip/_vendor/platformdirs/macos.py | 0 .../pip/_vendor/platformdirs/unix.py | 0 .../pip/_vendor/platformdirs/version.py | 0 .../pip/_vendor/platformdirs/windows.py | 0 .../pip/_vendor/pygments/__init__.py | 0 .../pip/_vendor/pygments/__main__.py | 0 .../pip/_vendor/pygments/cmdline.py | 0 .../pip/_vendor/pygments/console.py | 0 .../pip/_vendor/pygments/filter.py | 0 .../pip/_vendor/pygments/filters/__init__.py | 0 .../pip/_vendor/pygments/formatter.py | 0 .../_vendor/pygments/formatters/__init__.py | 0 .../_vendor/pygments/formatters/_mapping.py | 0 .../pip/_vendor/pygments/formatters/bbcode.py | 0 .../pip/_vendor/pygments/formatters/groff.py | 0 .../pip/_vendor/pygments/formatters/html.py | 0 .../pip/_vendor/pygments/formatters/img.py | 0 .../pip/_vendor/pygments/formatters/irc.py | 0 .../pip/_vendor/pygments/formatters/latex.py | 0 .../pip/_vendor/pygments/formatters/other.py | 0 .../pygments/formatters/pangomarkup.py | 0 .../pip/_vendor/pygments/formatters/rtf.py | 0 .../pip/_vendor/pygments/formatters/svg.py | 0 .../_vendor/pygments/formatters/terminal.py | 0 .../pygments/formatters/terminal256.py | 0 .../pip/_vendor/pygments/lexer.py | 0 .../pip/_vendor/pygments/lexers/__init__.py | 0 .../pip/_vendor/pygments/lexers/_mapping.py | 0 .../pip/_vendor/pygments/lexers/python.py | 0 .../pip/_vendor/pygments/modeline.py | 0 .../pip/_vendor/pygments/plugin.py | 0 .../pip/_vendor/pygments/regexopt.py | 0 .../pip/_vendor/pygments/scanner.py | 0 .../pip/_vendor/pygments/sphinxext.py | 0 .../pip/_vendor/pygments/style.py | 0 .../pip/_vendor/pygments/styles/__init__.py | 0 .../pip/_vendor/pygments/token.py | 0 .../pip/_vendor/pygments/unistring.py | 0 .../pip/_vendor/pygments/util.py | 0 .../pip/_vendor/pyparsing/__init__.py | 0 .../pip/_vendor/pyparsing/actions.py | 0 .../pip/_vendor/pyparsing/common.py | 0 .../pip/_vendor/pyparsing/core.py | 0 .../pip/_vendor/pyparsing/diagram/__init__.py | 0 .../pip/_vendor/pyparsing/exceptions.py | 0 .../pip/_vendor/pyparsing/helpers.py | 0 .../pip/_vendor/pyparsing/results.py | 0 .../pip/_vendor/pyparsing/testing.py | 0 .../pip/_vendor/pyparsing/unicode.py | 0 .../pip/_vendor/pyparsing/util.py | 0 .../pip/_vendor/pyproject_hooks/__init__.py | 0 .../pip/_vendor/pyproject_hooks/_compat.py | 0 .../pip/_vendor/pyproject_hooks/_impl.py | 0 .../pyproject_hooks/_in_process/__init__.py | 0 .../_in_process/_in_process.py | 0 .../pip/_vendor/requests/__init__.py | 0 .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 0 .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 0 .../pip/_vendor/requests/compat.py | 0 .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 0 .../pip/_vendor/requests/help.py | 0 .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 0 .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 + .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 0 .../pip/_vendor/resolvelib/__init__.py | 0 .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 0 .../pip/_vendor/resolvelib/reporters.py | 0 .../pip/_vendor/resolvelib/resolvers.py | 0 .../pip/_vendor/resolvelib/structs.py | 0 .../pip/_vendor/rich/__init__.py | 0 .../pip/_vendor/rich/__main__.py | 0 .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 ++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 0 .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 0 .../pip/_vendor/rich/_inspect.py | 0 .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 0 .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 0 .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 0 .../pip/_vendor/rich/_windows.py | 0 .../pip/_vendor/rich/_windows_renderer.py | 0 .../site-packages/pip/_vendor/rich/_wrap.py | 0 .../lib/site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 0 .../site-packages/pip/_vendor/rich/ansi.py | 0 .../lib/site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 0 .../site-packages/pip/_vendor/rich/cells.py | 0 .../site-packages/pip/_vendor/rich/color.py | 0 .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 0 .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 0 .../pip/_vendor/rich/default_styles.py | 0 .../pip/_vendor/rich/diagnose.py | 0 .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 0 .../pip/_vendor/rich/filesize.py | 0 .../pip/_vendor/rich/highlighter.py | 0 .../site-packages/pip/_vendor/rich/json.py | 0 .../site-packages/pip/_vendor/rich/jupyter.py | 0 .../site-packages/pip/_vendor/rich/layout.py | 0 .../site-packages/pip/_vendor/rich/live.py | 0 .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 0 .../site-packages/pip/_vendor/rich/markup.py | 0 .../site-packages/pip/_vendor/rich/measure.py | 0 .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 0 .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 0 .../site-packages/pip/_vendor/rich/pretty.py | 0 .../pip/_vendor/rich/progress.py | 0 .../pip/_vendor/rich/progress_bar.py | 0 .../site-packages/pip/_vendor/rich/prompt.py | 0 .../pip/_vendor/rich/protocol.py | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 0 .../site-packages/pip/_vendor/rich/rule.py | 0 .../site-packages/pip/_vendor/rich/scope.py | 0 .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 0 .../site-packages/pip/_vendor/rich/spinner.py | 0 .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 0 .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 0 .../site-packages/pip/_vendor/rich/table.py | 0 .../pip/_vendor/rich/terminal_theme.py | 0 .../site-packages/pip/_vendor/rich/text.py | 0 .../site-packages/pip/_vendor/rich/theme.py | 0 .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 0 .../site-packages/pip/_vendor/rich/tree.py | 0 python/lib/site-packages/pip/_vendor/six.py | 998 + .../pip/_vendor/tenacity/__init__.py | 0 .../pip/_vendor/tenacity/_asyncio.py | 0 .../pip/_vendor/tenacity/_utils.py | 0 .../pip/_vendor/tenacity/after.py | 0 .../pip/_vendor/tenacity/before.py | 0 .../pip/_vendor/tenacity/before_sleep.py | 0 .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 0 .../pip/_vendor/tenacity/stop.py | 0 .../pip/_vendor/tenacity/tornadoweb.py | 0 .../pip/_vendor/tenacity/wait.py | 0 .../pip/_vendor/tomli/__init__.py | 0 .../pip/_vendor/tomli/_parser.py | 0 .../site-packages/pip/_vendor/tomli/_re.py | 0 .../site-packages/pip/_vendor/tomli/_types.py | 0 .../pip/_vendor/typing_extensions.py | 0 .../pip/_vendor/urllib3/__init__.py | 0 .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 0 .../pip/_vendor/urllib3/connection.py | 0 .../pip/_vendor/urllib3/connectionpool.py | 0 .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 0 .../pip/_vendor/urllib3/contrib/ntlmpool.py | 0 .../pip/_vendor/urllib3/contrib/pyopenssl.py | 0 .../urllib3/contrib/securetransport.py | 0 .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 0 .../pip/_vendor/urllib3/packages/six.py | 0 .../pip/_vendor/urllib3/poolmanager.py | 0 .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 0 .../pip/_vendor/urllib3/util/__init__.py | 49 + .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 0 .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 0 .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 0 .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 0 .../pip/_vendor/urllib3/util/url.py | 0 .../pip/_vendor/urllib3/util/wait.py | 0 .../lib}/site-packages/pip/_vendor/vendor.txt | 0 .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + python/lib/site-packages/pip/py.typed | 4 + lib64 => python/lib64 | 0 python/pyvenv.cfg | 3 + requirements.txt => python/requirements.txt | 0 .../share/bash-completion/completions/yt-dlp | 29 + {share => python/share}/doc/yt_dlp/README.txt | 261 +- .../fish/vendor_completions.d/yt-dlp.fish | 30 +- {share => python/share}/man/man1/mid3cp.1 | 0 {share => python/share}/man/man1/mid3iconv.1 | 0 {share => python/share}/man/man1/mid3v2.1 | 0 {share => python/share}/man/man1/moggsplit.1 | 0 .../share}/man/man1/mutagen-inspect.1 | 0 .../share}/man/man1/mutagen-pony.1 | 0 {share => python/share}/man/man1/yt-dlp.1 | 293 +- python/share/zsh/site-functions/_yt-dlp | 30 + {static => python/static}/LICENSE.txt | 0 .../static}/css/line-awesome.css | 0 .../static}/css/line-awesome.min.css | 0 {static => python/static}/css/style.css | 0 {static => python/static}/favicon.svg | 0 .../static}/fonts/la-brands-400.eot | Bin .../static}/fonts/la-brands-400.svg | 0 .../static}/fonts/la-brands-400.ttf | Bin .../static}/fonts/la-brands-400.woff | Bin .../static}/fonts/la-brands-400.woff2 | Bin .../static}/fonts/la-regular-400.eot | Bin .../static}/fonts/la-regular-400.svg | 0 .../static}/fonts/la-regular-400.ttf | Bin .../static}/fonts/la-regular-400.woff | Bin .../static}/fonts/la-regular-400.woff2 | Bin .../static}/fonts/la-solid-900.eot | Bin .../static}/fonts/la-solid-900.svg | 0 .../static}/fonts/la-solid-900.ttf | Bin .../static}/fonts/la-solid-900.woff | Bin .../static}/fonts/la-solid-900.woff2 | Bin {static => python/static}/img/bg.png | Bin {static => python/static}/img/vinyl-card.jpg | Bin {static => python/static}/img/vinyl-card.png | Bin {static => python/static}/img/vinyl-card.xcf | Bin {static => python/static}/img/vinyl.png | Bin {static => python/static}/img/vinyl.xcf | Bin {static => python/static}/js/app.js | 0 {static => python/static}/line-awesome.fig | Bin .../static}/scss/_bordered_pulled.scss | 0 {static => python/static}/scss/_core.scss | 0 .../static}/scss/_fixed-width.scss | 0 {static => python/static}/scss/_icons.scss | 0 {static => python/static}/scss/_larger.scss | 0 {static => python/static}/scss/_list.scss | 0 {static => python/static}/scss/_mixins.scss | 0 {static => python/static}/scss/_path.scss | 0 .../static}/scss/_rotated-flipped.scss | 0 .../static}/scss/_screen-reader.scss | 0 {static => python/static}/scss/_stacked.scss | 0 .../static}/scss/_variables.scss | 0 .../static}/scss/line-awesome.scss | 0 {static => python/static}/svg/500px.svg | 0 .../static}/svg/accessible-icon.svg | 0 {static => python/static}/svg/accusoft.svg | 0 .../static}/svg/acquisitions-incorporated.svg | 0 {static => python/static}/svg/ad-solid.svg | 0 .../static}/svg/address-book-solid.svg | 0 .../static}/svg/address-book.svg | 0 .../static}/svg/address-card-solid.svg | 0 .../static}/svg/address-card.svg | 0 .../static}/svg/adjust-solid.svg | 0 {static => python/static}/svg/adn.svg | 0 {static => python/static}/svg/adobe.svg | 0 {static => python/static}/svg/adversal.svg | 0 .../static}/svg/affiliatetheme.svg | 0 .../static}/svg/air-freshener-solid.svg | 0 {static => python/static}/svg/airbnb.svg | 0 {static => python/static}/svg/algolia.svg | 0 .../static}/svg/align-center-solid.svg | 0 .../static}/svg/align-justify-solid.svg | 0 .../static}/svg/align-left-solid.svg | 0 .../static}/svg/align-right-solid.svg | 0 {static => python/static}/svg/alipay.svg | 0 .../static}/svg/allergies-solid.svg | 0 {static => python/static}/svg/amazon-pay.svg | 0 {static => python/static}/svg/amazon.svg | 0 .../static}/svg/ambulance-solid.svg | 0 ...rican-sign-language-interpreting-solid.svg | 0 {static => python/static}/svg/amilia.svg | 0 .../static}/svg/anchor-solid.svg | 0 {static => python/static}/svg/android.svg | 0 {static => python/static}/svg/angellist.svg | 0 .../static}/svg/angle-double-down-solid.svg | 0 .../static}/svg/angle-double-left-solid.svg | 0 .../static}/svg/angle-double-right-solid.svg | 0 .../static}/svg/angle-double-up-solid.svg | 0 .../static}/svg/angle-down-solid.svg | 0 .../static}/svg/angle-left-solid.svg | 0 .../static}/svg/angle-right-solid.svg | 0 .../static}/svg/angle-up-solid.svg | 0 {static => python/static}/svg/angry-solid.svg | 0 {static => python/static}/svg/angry.svg | 0 .../static}/svg/angrycreative.svg | 0 {static => python/static}/svg/angular.svg | 0 {static => python/static}/svg/ankh-solid.svg | 0 .../static}/svg/app-store-ios.svg | 0 {static => python/static}/svg/app-store.svg | 0 {static => python/static}/svg/apper.svg | 0 .../static}/svg/apple-alt-solid.svg | 0 {static => python/static}/svg/apple-pay.svg | 0 {static => python/static}/svg/apple.svg | 0 .../static}/svg/archive-solid.svg | 0 .../static}/svg/archway-solid.svg | 0 .../svg/arrow-alt-circle-down-solid.svg | 0 .../static}/svg/arrow-alt-circle-down.svg | 0 .../svg/arrow-alt-circle-left-solid.svg | 0 .../static}/svg/arrow-alt-circle-left.svg | 0 .../svg/arrow-alt-circle-right-solid.svg | 0 .../static}/svg/arrow-alt-circle-right.svg | 0 .../static}/svg/arrow-alt-circle-up-solid.svg | 0 .../static}/svg/arrow-alt-circle-up.svg | 0 .../static}/svg/arrow-circle-down-solid.svg | 0 .../static}/svg/arrow-circle-left-solid.svg | 0 .../static}/svg/arrow-circle-right-solid.svg | 0 .../static}/svg/arrow-circle-up-solid.svg | 0 .../static}/svg/arrow-down-solid.svg | 0 .../static}/svg/arrow-left-solid.svg | 0 .../static}/svg/arrow-right-solid.svg | 0 .../static}/svg/arrow-up-solid.svg | 0 .../static}/svg/arrows-alt-h-solid.svg | 0 .../static}/svg/arrows-alt-solid.svg | 0 .../static}/svg/arrows-alt-v-solid.svg | 0 {static => python/static}/svg/artstation.svg | 0 .../svg/assistive-listening-systems-solid.svg | 0 .../static}/svg/asterisk-solid.svg | 0 {static => python/static}/svg/asymmetrik.svg | 0 {static => python/static}/svg/at-solid.svg | 0 {static => python/static}/svg/atlas-solid.svg | 0 {static => python/static}/svg/atlassian.svg | 0 {static => python/static}/svg/atom-solid.svg | 0 {static => python/static}/svg/audible.svg | 0 .../static}/svg/audio-description-solid.svg | 0 .../static}/svg/autoprefixer.svg | 0 {static => python/static}/svg/avianex.svg | 0 {static => python/static}/svg/aviato.svg | 0 {static => python/static}/svg/award-solid.svg | 0 {static => python/static}/svg/aws.svg | 0 .../static}/svg/baby-carriage-solid.svg | 0 {static => python/static}/svg/baby-solid.svg | 0 .../static}/svg/backspace-solid.svg | 0 .../static}/svg/backward-solid.svg | 0 {static => python/static}/svg/bacon-solid.svg | 0 .../static}/svg/balance-scale-left-solid.svg | 0 .../static}/svg/balance-scale-right-solid.svg | 0 .../static}/svg/balance-scale-solid.svg | 0 {static => python/static}/svg/ban-solid.svg | 0 .../static}/svg/band-aid-solid.svg | 0 {static => python/static}/svg/bandcamp.svg | 0 .../static}/svg/barcode-solid.svg | 0 {static => python/static}/svg/bars-solid.svg | 0 .../static}/svg/baseball-ball-solid.svg | 0 .../static}/svg/basketball-ball-solid.svg | 0 {static => python/static}/svg/bath-solid.svg | 0 .../static}/svg/battery-empty-solid.svg | 0 .../static}/svg/battery-full-solid.svg | 0 .../static}/svg/battery-half-solid.svg | 0 .../static}/svg/battery-quarter-solid.svg | 0 .../svg/battery-three-quarters-solid.svg | 0 {static => python/static}/svg/battle-net.svg | 0 {static => python/static}/svg/bed-solid.svg | 0 {static => python/static}/svg/beer-solid.svg | 0 .../static}/svg/behance-square.svg | 0 {static => python/static}/svg/behance.svg | 0 .../static}/svg/bell-slash-solid.svg | 0 {static => python/static}/svg/bell-slash.svg | 0 {static => python/static}/svg/bell-solid.svg | 0 {static => python/static}/svg/bell.svg | 0 .../static}/svg/bezier-curve-solid.svg | 0 {static => python/static}/svg/bible-solid.svg | 0 .../static}/svg/bicycle-solid.svg | 0 .../static}/svg/biking-solid.svg | 0 {static => python/static}/svg/bimobject.svg | 0 .../static}/svg/binoculars-solid.svg | 0 .../static}/svg/biohazard-solid.svg | 0 .../static}/svg/birthday-cake-solid.svg | 0 {static => python/static}/svg/bitbucket.svg | 0 {static => python/static}/svg/bitcoin.svg | 0 {static => python/static}/svg/bity.svg | 0 {static => python/static}/svg/black-tie.svg | 0 {static => python/static}/svg/blackberry.svg | 0 .../static}/svg/blender-phone-solid.svg | 0 .../static}/svg/blender-solid.svg | 0 {static => python/static}/svg/blind-solid.svg | 0 {static => python/static}/svg/blog-solid.svg | 0 {static => python/static}/svg/blogger-b.svg | 0 {static => python/static}/svg/blogger.svg | 0 {static => python/static}/svg/bluetooth-b.svg | 0 {static => python/static}/svg/bluetooth.svg | 0 {static => python/static}/svg/bold-solid.svg | 0 {static => python/static}/svg/bolt-solid.svg | 0 {static => python/static}/svg/bomb-solid.svg | 0 {static => python/static}/svg/bone-solid.svg | 0 {static => python/static}/svg/bong-solid.svg | 0 .../static}/svg/book-dead-solid.svg | 0 .../static}/svg/book-medical-solid.svg | 0 .../static}/svg/book-open-solid.svg | 0 .../static}/svg/book-reader-solid.svg | 0 {static => python/static}/svg/book-solid.svg | 0 .../static}/svg/bookmark-solid.svg | 0 {static => python/static}/svg/bookmark.svg | 0 {static => python/static}/svg/bootstrap.svg | 0 .../static}/svg/border-all-solid.svg | 0 .../static}/svg/border-none-solid.svg | 0 .../static}/svg/border-style-solid.svg | 0 .../static}/svg/bowling-ball-solid.svg | 0 .../static}/svg/box-open-solid.svg | 0 {static => python/static}/svg/box-solid.svg | 0 {static => python/static}/svg/boxes-solid.svg | 0 .../static}/svg/braille-solid.svg | 0 {static => python/static}/svg/brain-solid.svg | 0 .../static}/svg/bread-slice-solid.svg | 0 .../static}/svg/briefcase-medical-solid.svg | 0 .../static}/svg/briefcase-solid.svg | 0 .../static}/svg/broadcast-tower-solid.svg | 0 {static => python/static}/svg/broom-solid.svg | 0 {static => python/static}/svg/brush-solid.svg | 0 {static => python/static}/svg/btc.svg | 0 {static => python/static}/svg/buffer.svg | 0 {static => python/static}/svg/bug-solid.svg | 0 .../static}/svg/building-solid.svg | 0 {static => python/static}/svg/building.svg | 0 .../static}/svg/bullhorn-solid.svg | 0 .../static}/svg/bullseye-solid.svg | 0 {static => python/static}/svg/burn-solid.svg | 0 .../static}/svg/buromobelexperte.svg | 0 .../static}/svg/bus-alt-solid.svg | 0 {static => python/static}/svg/bus-solid.svg | 0 .../static}/svg/business-time-solid.svg | 0 {static => python/static}/svg/buy-n-large.svg | 0 {static => python/static}/svg/buysellads.svg | 0 .../static}/svg/calculator-solid.svg | 0 .../static}/svg/calendar-alt-solid.svg | 0 .../static}/svg/calendar-alt.svg | 0 .../static}/svg/calendar-check-solid.svg | 0 .../static}/svg/calendar-check.svg | 0 .../static}/svg/calendar-day-solid.svg | 0 .../static}/svg/calendar-minus-solid.svg | 0 .../static}/svg/calendar-minus.svg | 0 .../static}/svg/calendar-plus-solid.svg | 0 .../static}/svg/calendar-plus.svg | 0 .../static}/svg/calendar-solid.svg | 0 .../static}/svg/calendar-times-solid.svg | 0 .../static}/svg/calendar-times.svg | 0 .../static}/svg/calendar-week-solid.svg | 0 {static => python/static}/svg/calendar.svg | 0 .../static}/svg/camera-retro-solid.svg | 0 .../static}/svg/camera-solid.svg | 0 .../static}/svg/campground-solid.svg | 0 .../static}/svg/canadian-maple-leaf.svg | 0 .../static}/svg/candy-cane-solid.svg | 0 .../static}/svg/cannabis-solid.svg | 0 .../static}/svg/capsules-solid.svg | 0 .../static}/svg/car-alt-solid.svg | 0 .../static}/svg/car-battery-solid.svg | 0 .../static}/svg/car-crash-solid.svg | 0 .../static}/svg/car-side-solid.svg | 0 {static => python/static}/svg/car-solid.svg | 0 .../static}/svg/caret-down-solid.svg | 0 .../static}/svg/caret-left-solid.svg | 0 .../static}/svg/caret-right-solid.svg | 0 .../static}/svg/caret-square-down-solid.svg | 0 .../static}/svg/caret-square-down.svg | 0 .../static}/svg/caret-square-left-solid.svg | 0 .../static}/svg/caret-square-left.svg | 0 .../static}/svg/caret-square-right-solid.svg | 0 .../static}/svg/caret-square-right.svg | 0 .../static}/svg/caret-square-up-solid.svg | 0 .../static}/svg/caret-square-up.svg | 0 .../static}/svg/caret-up-solid.svg | 0 .../static}/svg/carrot-solid.svg | 0 .../static}/svg/cart-arrow-down-solid.svg | 0 .../static}/svg/cart-plus-solid.svg | 0 .../static}/svg/cash-register-solid.svg | 0 {static => python/static}/svg/cat-solid.svg | 0 .../static}/svg/cc-amazon-pay.svg | 0 {static => python/static}/svg/cc-amex.svg | 0 .../static}/svg/cc-apple-pay.svg | 0 .../static}/svg/cc-diners-club.svg | 0 {static => python/static}/svg/cc-discover.svg | 0 {static => python/static}/svg/cc-jcb.svg | 0 .../static}/svg/cc-mastercard.svg | 0 {static => python/static}/svg/cc-paypal.svg | 0 {static => python/static}/svg/cc-stripe.svg | 0 {static => python/static}/svg/cc-visa.svg | 0 {static => python/static}/svg/centercode.svg | 0 {static => python/static}/svg/centos.svg | 0 .../static}/svg/certificate-solid.svg | 0 {static => python/static}/svg/chair-solid.svg | 0 .../static}/svg/chalkboard-solid.svg | 0 .../static}/svg/chalkboard-teacher-solid.svg | 0 .../static}/svg/charging-station-solid.svg | 0 .../static}/svg/chart-area-solid.svg | 0 .../static}/svg/chart-bar-solid.svg | 0 {static => python/static}/svg/chart-bar.svg | 0 .../static}/svg/chart-line-solid.svg | 0 .../static}/svg/chart-pie-solid.svg | 0 .../static}/svg/check-circle-solid.svg | 0 .../static}/svg/check-circle.svg | 0 .../static}/svg/check-double-solid.svg | 0 {static => python/static}/svg/check-solid.svg | 0 .../static}/svg/check-square-solid.svg | 0 .../static}/svg/check-square.svg | 0 .../static}/svg/cheese-solid.svg | 0 .../static}/svg/chess-bishop-solid.svg | 0 .../static}/svg/chess-board-solid.svg | 0 .../static}/svg/chess-king-solid.svg | 0 .../static}/svg/chess-knight-solid.svg | 0 .../static}/svg/chess-pawn-solid.svg | 0 .../static}/svg/chess-queen-solid.svg | 0 .../static}/svg/chess-rook-solid.svg | 0 {static => python/static}/svg/chess-solid.svg | 0 .../static}/svg/chevron-circle-down-solid.svg | 0 .../static}/svg/chevron-circle-left-solid.svg | 0 .../svg/chevron-circle-right-solid.svg | 0 .../static}/svg/chevron-circle-up-solid.svg | 0 .../static}/svg/chevron-down-solid.svg | 0 .../static}/svg/chevron-left-solid.svg | 0 .../static}/svg/chevron-right-solid.svg | 0 .../static}/svg/chevron-up-solid.svg | 0 {static => python/static}/svg/child-solid.svg | 0 {static => python/static}/svg/chrome.svg | 0 {static => python/static}/svg/chromecast.svg | 0 .../static}/svg/church-solid.svg | 0 .../static}/svg/circle-notch-solid.svg | 0 .../static}/svg/circle-solid.svg | 0 {static => python/static}/svg/circle.svg | 0 {static => python/static}/svg/city-solid.svg | 0 .../static}/svg/clinic-medical-solid.svg | 0 .../static}/svg/clipboard-check-solid.svg | 0 .../static}/svg/clipboard-list-solid.svg | 0 .../static}/svg/clipboard-solid.svg | 0 {static => python/static}/svg/clipboard.svg | 0 {static => python/static}/svg/clock-solid.svg | 0 {static => python/static}/svg/clock.svg | 0 {static => python/static}/svg/clone-solid.svg | 0 {static => python/static}/svg/clone.svg | 0 .../static}/svg/closed-captioning-solid.svg | 0 .../static}/svg/closed-captioning.svg | 0 .../static}/svg/cloud-download-alt-solid.svg | 0 .../static}/svg/cloud-meatball-solid.svg | 0 .../static}/svg/cloud-moon-rain-solid.svg | 0 .../static}/svg/cloud-moon-solid.svg | 0 .../static}/svg/cloud-rain-solid.svg | 0 .../static}/svg/cloud-showers-heavy-solid.svg | 0 {static => python/static}/svg/cloud-solid.svg | 0 .../static}/svg/cloud-sun-rain-solid.svg | 0 .../static}/svg/cloud-sun-solid.svg | 0 .../static}/svg/cloud-upload-alt-solid.svg | 0 {static => python/static}/svg/cloudscale.svg | 0 {static => python/static}/svg/cloudsmith.svg | 0 .../static}/svg/cloudversify.svg | 0 .../static}/svg/cocktail-solid.svg | 0 .../static}/svg/code-branch-solid.svg | 0 {static => python/static}/svg/code-solid.svg | 0 {static => python/static}/svg/codepen.svg | 0 {static => python/static}/svg/codiepie.svg | 0 .../static}/svg/coffee-solid.svg | 0 {static => python/static}/svg/cog-solid.svg | 0 {static => python/static}/svg/cogs-solid.svg | 0 {static => python/static}/svg/coins-solid.svg | 0 .../static}/svg/columns-solid.svg | 0 .../static}/svg/comment-alt-solid.svg | 0 {static => python/static}/svg/comment-alt.svg | 0 .../static}/svg/comment-dollar-solid.svg | 0 .../static}/svg/comment-dots-solid.svg | 0 .../static}/svg/comment-dots.svg | 0 .../static}/svg/comment-medical-solid.svg | 0 .../static}/svg/comment-slash-solid.svg | 0 .../static}/svg/comment-solid.svg | 0 {static => python/static}/svg/comment.svg | 0 .../static}/svg/comments-dollar-solid.svg | 0 .../static}/svg/comments-solid.svg | 0 {static => python/static}/svg/comments.svg | 0 .../static}/svg/compact-disc-solid.svg | 0 .../static}/svg/compass-solid.svg | 0 {static => python/static}/svg/compass.svg | 0 .../static}/svg/compress-arrows-alt-solid.svg | 0 .../static}/svg/compress-solid.svg | 0 .../static}/svg/concierge-bell-solid.svg | 0 {static => python/static}/svg/confluence.svg | 0 .../static}/svg/connectdevelop.svg | 0 {static => python/static}/svg/contao.svg | 0 .../static}/svg/cookie-bite-solid.svg | 0 .../static}/svg/cookie-solid.svg | 0 {static => python/static}/svg/copy-solid.svg | 0 {static => python/static}/svg/copy.svg | 0 .../static}/svg/copyright-solid.svg | 0 {static => python/static}/svg/copyright.svg | 0 .../static}/svg/cotton-bureau.svg | 0 {static => python/static}/svg/couch-solid.svg | 0 {static => python/static}/svg/cpanel.svg | 0 .../static}/svg/creative-commons-by.svg | 0 .../static}/svg/creative-commons-nc-eu.svg | 0 .../static}/svg/creative-commons-nc-jp.svg | 0 .../static}/svg/creative-commons-nc.svg | 0 .../static}/svg/creative-commons-nd.svg | 0 .../static}/svg/creative-commons-pd-alt.svg | 0 .../static}/svg/creative-commons-pd.svg | 0 .../static}/svg/creative-commons-remix.svg | 0 .../static}/svg/creative-commons-sa.svg | 0 .../svg/creative-commons-sampling-plus.svg | 0 .../static}/svg/creative-commons-sampling.svg | 0 .../static}/svg/creative-commons-share.svg | 0 .../static}/svg/creative-commons-zero.svg | 0 .../static}/svg/creative-commons.svg | 0 .../static}/svg/credit-card-solid.svg | 0 {static => python/static}/svg/credit-card.svg | 0 .../static}/svg/critical-role.svg | 0 .../static}/svg/crop-alt-solid.svg | 0 {static => python/static}/svg/crop-solid.svg | 0 {static => python/static}/svg/cross-solid.svg | 0 .../static}/svg/crosshairs-solid.svg | 0 {static => python/static}/svg/crow-solid.svg | 0 {static => python/static}/svg/crown-solid.svg | 0 .../static}/svg/crutch-solid.svg | 0 {static => python/static}/svg/css3-alt.svg | 0 {static => python/static}/svg/css3.svg | 0 {static => python/static}/svg/cube-solid.svg | 0 {static => python/static}/svg/cubes-solid.svg | 0 {static => python/static}/svg/cut-solid.svg | 0 {static => python/static}/svg/cuttlefish.svg | 0 .../static}/svg/d-and-d-beyond.svg | 0 {static => python/static}/svg/d-and-d.svg | 0 {static => python/static}/svg/dashcube.svg | 0 .../static}/svg/database-solid.svg | 0 {static => python/static}/svg/deaf-solid.svg | 0 {static => python/static}/svg/delicious.svg | 0 .../static}/svg/democrat-solid.svg | 0 {static => python/static}/svg/deploydog.svg | 0 {static => python/static}/svg/deskpro.svg | 0 .../static}/svg/desktop-solid.svg | 0 {static => python/static}/svg/dev.svg | 0 {static => python/static}/svg/deviantart.svg | 0 .../static}/svg/dharmachakra-solid.svg | 0 {static => python/static}/svg/dhl.svg | 0 .../static}/svg/diagnoses-solid.svg | 0 {static => python/static}/svg/diaspora.svg | 0 .../static}/svg/dice-d20-solid.svg | 0 .../static}/svg/dice-d6-solid.svg | 0 .../static}/svg/dice-five-solid.svg | 0 .../static}/svg/dice-four-solid.svg | 0 .../static}/svg/dice-one-solid.svg | 0 .../static}/svg/dice-six-solid.svg | 0 {static => python/static}/svg/dice-solid.svg | 0 .../static}/svg/dice-three-solid.svg | 0 .../static}/svg/dice-two-solid.svg | 0 {static => python/static}/svg/digg.svg | 0 .../static}/svg/digital-ocean.svg | 0 .../static}/svg/digital-tachograph-solid.svg | 0 .../static}/svg/directions-solid.svg | 0 {static => python/static}/svg/discord.svg | 0 {static => python/static}/svg/discourse.svg | 0 .../static}/svg/divide-solid.svg | 0 {static => python/static}/svg/dizzy-solid.svg | 0 {static => python/static}/svg/dizzy.svg | 0 {static => python/static}/svg/dna-solid.svg | 0 {static => python/static}/svg/dochub.svg | 0 {static => python/static}/svg/docker.svg | 0 {static => python/static}/svg/dog-solid.svg | 0 .../static}/svg/dollar-sign-solid.svg | 0 .../static}/svg/dolly-flatbed-solid.svg | 0 {static => python/static}/svg/dolly-solid.svg | 0 .../static}/svg/donate-solid.svg | 0 .../static}/svg/door-closed-solid.svg | 0 .../static}/svg/door-open-solid.svg | 0 .../static}/svg/dot-circle-solid.svg | 0 {static => python/static}/svg/dot-circle.svg | 0 {static => python/static}/svg/dove-solid.svg | 0 .../static}/svg/download-solid.svg | 0 .../static}/svg/draft2digital.svg | 0 .../static}/svg/drafting-compass-solid.svg | 0 .../static}/svg/dragon-solid.svg | 0 .../static}/svg/draw-polygon-solid.svg | 0 .../static}/svg/dribbble-square.svg | 0 {static => python/static}/svg/dribbble.svg | 0 {static => python/static}/svg/dropbox.svg | 0 {static => python/static}/svg/drum-solid.svg | 0 .../static}/svg/drum-steelpan-solid.svg | 0 .../static}/svg/drumstick-bite-solid.svg | 0 {static => python/static}/svg/drupal.svg | 0 .../static}/svg/dumbbell-solid.svg | 0 .../static}/svg/dumpster-fire-solid.svg | 0 .../static}/svg/dumpster-solid.svg | 0 .../static}/svg/dungeon-solid.svg | 0 {static => python/static}/svg/dyalog.svg | 0 {static => python/static}/svg/earlybirds.svg | 0 {static => python/static}/svg/ebay.svg | 0 {static => python/static}/svg/edge.svg | 0 {static => python/static}/svg/edit-solid.svg | 0 {static => python/static}/svg/edit.svg | 0 {static => python/static}/svg/egg-solid.svg | 0 {static => python/static}/svg/eject-solid.svg | 0 {static => python/static}/svg/elementor.svg | 0 .../static}/svg/ellipsis-h-solid.svg | 0 .../static}/svg/ellipsis-v-solid.svg | 0 {static => python/static}/svg/ello.svg | 0 {static => python/static}/svg/ember.svg | 0 {static => python/static}/svg/empire.svg | 0 .../static}/svg/envelope-open-solid.svg | 0 .../static}/svg/envelope-open-text-solid.svg | 0 .../static}/svg/envelope-open.svg | 0 .../static}/svg/envelope-solid.svg | 0 .../static}/svg/envelope-square-solid.svg | 0 {static => python/static}/svg/envelope.svg | 0 {static => python/static}/svg/envira.svg | 0 .../static}/svg/equals-solid.svg | 0 .../static}/svg/eraser-solid.svg | 0 {static => python/static}/svg/erlang.svg | 0 {static => python/static}/svg/ethereum.svg | 0 .../static}/svg/ethernet-solid.svg | 0 {static => python/static}/svg/etsy.svg | 0 .../static}/svg/euro-sign-solid.svg | 0 {static => python/static}/svg/evernote.svg | 0 .../static}/svg/exchange-alt-solid.svg | 0 .../static}/svg/exclamation-circle-solid.svg | 0 .../static}/svg/exclamation-solid.svg | 0 .../svg/exclamation-triangle-solid.svg | 0 .../static}/svg/expand-arrows-alt-solid.svg | 0 .../static}/svg/expand-solid.svg | 0 .../static}/svg/expeditedssl.svg | 0 .../static}/svg/external-link-alt-solid.svg | 0 .../svg/external-link-square-alt-solid.svg | 0 .../static}/svg/eye-dropper-solid.svg | 0 .../static}/svg/eye-slash-solid.svg | 0 {static => python/static}/svg/eye-slash.svg | 0 {static => python/static}/svg/eye-solid.svg | 0 {static => python/static}/svg/eye.svg | 0 {static => python/static}/svg/facebook-f.svg | 0 .../static}/svg/facebook-messenger.svg | 0 .../static}/svg/facebook-square.svg | 0 {static => python/static}/svg/facebook.svg | 0 {static => python/static}/svg/fan-solid.svg | 0 .../static}/svg/fantasy-flight-games.svg | 0 .../static}/svg/fast-backward-solid.svg | 0 .../static}/svg/fast-forward-solid.svg | 0 {static => python/static}/svg/fax-solid.svg | 0 .../static}/svg/feather-alt-solid.svg | 0 .../static}/svg/feather-solid.svg | 0 {static => python/static}/svg/fedex.svg | 0 {static => python/static}/svg/fedora.svg | 0 .../static}/svg/female-solid.svg | 0 .../static}/svg/fighter-jet-solid.svg | 0 {static => python/static}/svg/figma.svg | 0 .../static}/svg/file-alt-solid.svg | 0 {static => python/static}/svg/file-alt.svg | 0 .../static}/svg/file-archive-solid.svg | 0 .../static}/svg/file-archive.svg | 0 .../static}/svg/file-audio-solid.svg | 0 {static => python/static}/svg/file-audio.svg | 0 .../static}/svg/file-code-solid.svg | 0 {static => python/static}/svg/file-code.svg | 0 .../static}/svg/file-contract-solid.svg | 0 .../static}/svg/file-csv-solid.svg | 0 .../static}/svg/file-download-solid.svg | 0 .../static}/svg/file-excel-solid.svg | 0 {static => python/static}/svg/file-excel.svg | 0 .../static}/svg/file-export-solid.svg | 0 .../static}/svg/file-image-solid.svg | 0 {static => python/static}/svg/file-image.svg | 0 .../static}/svg/file-import-solid.svg | 0 .../static}/svg/file-invoice-dollar-solid.svg | 0 .../static}/svg/file-invoice-solid.svg | 0 .../static}/svg/file-medical-alt-solid.svg | 0 .../static}/svg/file-medical-solid.svg | 0 .../static}/svg/file-pdf-solid.svg | 0 {static => python/static}/svg/file-pdf.svg | 0 .../static}/svg/file-powerpoint-solid.svg | 0 .../static}/svg/file-powerpoint.svg | 0 .../static}/svg/file-prescription-solid.svg | 0 .../static}/svg/file-signature-solid.svg | 0 {static => python/static}/svg/file-solid.svg | 0 .../static}/svg/file-upload-solid.svg | 0 .../static}/svg/file-video-solid.svg | 0 {static => python/static}/svg/file-video.svg | 0 .../static}/svg/file-word-solid.svg | 0 {static => python/static}/svg/file-word.svg | 0 {static => python/static}/svg/file.svg | 0 .../static}/svg/fill-drip-solid.svg | 0 {static => python/static}/svg/fill-solid.svg | 0 {static => python/static}/svg/film-solid.svg | 0 .../static}/svg/filter-solid.svg | 0 .../static}/svg/fingerprint-solid.svg | 0 .../static}/svg/fire-alt-solid.svg | 0 .../static}/svg/fire-extinguisher-solid.svg | 0 {static => python/static}/svg/fire-solid.svg | 0 {static => python/static}/svg/firefox.svg | 0 .../static}/svg/first-aid-solid.svg | 0 .../static}/svg/first-order-alt.svg | 0 {static => python/static}/svg/first-order.svg | 0 {static => python/static}/svg/firstdraft.svg | 0 {static => python/static}/svg/fish-solid.svg | 0 .../static}/svg/fist-raised-solid.svg | 0 .../static}/svg/flag-checkered-solid.svg | 0 {static => python/static}/svg/flag-solid.svg | 0 .../static}/svg/flag-usa-solid.svg | 0 {static => python/static}/svg/flag.svg | 0 {static => python/static}/svg/flask-solid.svg | 0 {static => python/static}/svg/flickr.svg | 0 {static => python/static}/svg/flipboard.svg | 0 .../static}/svg/flushed-solid.svg | 0 {static => python/static}/svg/flushed.svg | 0 {static => python/static}/svg/fly.svg | 0 .../static}/svg/folder-minus-solid.svg | 0 .../static}/svg/folder-open-solid.svg | 0 {static => python/static}/svg/folder-open.svg | 0 .../static}/svg/folder-plus-solid.svg | 0 .../static}/svg/folder-solid.svg | 0 {static => python/static}/svg/folder.svg | 0 .../static}/svg/font-awesome-alt.svg | 0 .../static}/svg/font-awesome-flag.svg | 0 .../static}/svg/font-awesome.svg | 0 {static => python/static}/svg/font-solid.svg | 0 .../static}/svg/fonticons-fi.svg | 0 {static => python/static}/svg/fonticons.svg | 0 .../static}/svg/football-ball-solid.svg | 0 .../static}/svg/fort-awesome-alt.svg | 0 .../static}/svg/fort-awesome.svg | 0 {static => python/static}/svg/forumbee.svg | 0 .../static}/svg/forward-solid.svg | 0 {static => python/static}/svg/foursquare.svg | 0 .../static}/svg/free-code-camp.svg | 0 {static => python/static}/svg/freebsd.svg | 0 {static => python/static}/svg/frog-solid.svg | 0 .../static}/svg/frown-open-solid.svg | 0 {static => python/static}/svg/frown-open.svg | 0 {static => python/static}/svg/frown-solid.svg | 0 {static => python/static}/svg/frown.svg | 0 {static => python/static}/svg/fulcrum.svg | 0 .../static}/svg/funnel-dollar-solid.svg | 0 .../static}/svg/futbol-solid.svg | 0 {static => python/static}/svg/futbol.svg | 0 .../static}/svg/galactic-republic.svg | 0 .../static}/svg/galactic-senate.svg | 0 .../static}/svg/gamepad-solid.svg | 0 .../static}/svg/gas-pump-solid.svg | 0 {static => python/static}/svg/gavel-solid.svg | 0 {static => python/static}/svg/gem-solid.svg | 0 {static => python/static}/svg/gem.svg | 0 .../static}/svg/genderless-solid.svg | 0 {static => python/static}/svg/get-pocket.svg | 0 {static => python/static}/svg/gg-circle.svg | 0 {static => python/static}/svg/gg.svg | 0 {static => python/static}/svg/ghost-solid.svg | 0 {static => python/static}/svg/gift-solid.svg | 0 {static => python/static}/svg/gifts-solid.svg | 0 {static => python/static}/svg/git-alt.svg | 0 {static => python/static}/svg/git-square.svg | 0 {static => python/static}/svg/git.svg | 0 {static => python/static}/svg/github-alt.svg | 0 .../static}/svg/github-square.svg | 0 {static => python/static}/svg/github.svg | 0 {static => python/static}/svg/gitkraken.svg | 0 {static => python/static}/svg/gitlab.svg | 0 {static => python/static}/svg/gitter.svg | 0 .../static}/svg/glass-cheers-solid.svg | 0 .../static}/svg/glass-martini-alt-solid.svg | 0 .../static}/svg/glass-martini-solid.svg | 0 .../static}/svg/glass-whiskey-solid.svg | 0 .../static}/svg/glasses-solid.svg | 0 {static => python/static}/svg/glide-g.svg | 0 {static => python/static}/svg/glide.svg | 0 .../static}/svg/globe-africa-solid.svg | 0 .../static}/svg/globe-americas-solid.svg | 0 .../static}/svg/globe-asia-solid.svg | 0 .../static}/svg/globe-europe-solid.svg | 0 {static => python/static}/svg/globe-solid.svg | 0 {static => python/static}/svg/gofore.svg | 0 .../static}/svg/golf-ball-solid.svg | 0 {static => python/static}/svg/goodreads-g.svg | 0 {static => python/static}/svg/goodreads.svg | 0 .../static}/svg/google-drive.svg | 0 {static => python/static}/svg/google-play.svg | 0 .../static}/svg/google-plus-g.svg | 0 .../static}/svg/google-plus-square.svg | 0 {static => python/static}/svg/google-plus.svg | 0 .../static}/svg/google-wallet.svg | 0 {static => python/static}/svg/google.svg | 0 .../static}/svg/gopuram-solid.svg | 0 .../static}/svg/graduation-cap-solid.svg | 0 {static => python/static}/svg/gratipay.svg | 0 {static => python/static}/svg/grav.svg | 0 .../static}/svg/greater-than-equal-solid.svg | 0 .../static}/svg/greater-than-solid.svg | 0 .../static}/svg/grimace-solid.svg | 0 {static => python/static}/svg/grimace.svg | 0 .../static}/svg/grin-alt-solid.svg | 0 {static => python/static}/svg/grin-alt.svg | 0 .../static}/svg/grin-beam-solid.svg | 0 .../static}/svg/grin-beam-sweat-solid.svg | 0 .../static}/svg/grin-beam-sweat.svg | 0 {static => python/static}/svg/grin-beam.svg | 0 .../static}/svg/grin-hearts-solid.svg | 0 {static => python/static}/svg/grin-hearts.svg | 0 {static => python/static}/svg/grin-solid.svg | 0 .../static}/svg/grin-squint-solid.svg | 0 .../static}/svg/grin-squint-tears-solid.svg | 0 .../static}/svg/grin-squint-tears.svg | 0 {static => python/static}/svg/grin-squint.svg | 0 .../static}/svg/grin-stars-solid.svg | 0 {static => python/static}/svg/grin-stars.svg | 0 .../static}/svg/grin-tears-solid.svg | 0 {static => python/static}/svg/grin-tears.svg | 0 .../static}/svg/grin-tongue-solid.svg | 0 .../static}/svg/grin-tongue-squint-solid.svg | 0 .../static}/svg/grin-tongue-squint.svg | 0 .../static}/svg/grin-tongue-wink-solid.svg | 0 .../static}/svg/grin-tongue-wink.svg | 0 {static => python/static}/svg/grin-tongue.svg | 0 .../static}/svg/grin-wink-solid.svg | 0 {static => python/static}/svg/grin-wink.svg | 0 {static => python/static}/svg/grin.svg | 0 .../static}/svg/grip-horizontal-solid.svg | 0 .../static}/svg/grip-lines-solid.svg | 0 .../static}/svg/grip-lines-vertical-solid.svg | 0 .../static}/svg/grip-vertical-solid.svg | 0 {static => python/static}/svg/gripfire.svg | 0 {static => python/static}/svg/grunt.svg | 0 .../static}/svg/guitar-solid.svg | 0 {static => python/static}/svg/gulp.svg | 0 .../static}/svg/h-square-solid.svg | 0 .../static}/svg/hacker-news-square.svg | 0 {static => python/static}/svg/hacker-news.svg | 0 {static => python/static}/svg/hackerrank.svg | 0 .../static}/svg/hamburger-solid.svg | 0 .../static}/svg/hammer-solid.svg | 0 {static => python/static}/svg/hamsa-solid.svg | 0 .../static}/svg/hand-holding-heart-solid.svg | 0 .../static}/svg/hand-holding-solid.svg | 0 .../static}/svg/hand-holding-usd-solid.svg | 0 .../static}/svg/hand-lizard-solid.svg | 0 {static => python/static}/svg/hand-lizard.svg | 0 .../static}/svg/hand-middle-finger-solid.svg | 0 .../static}/svg/hand-paper-solid.svg | 0 {static => python/static}/svg/hand-paper.svg | 0 .../static}/svg/hand-peace-solid.svg | 0 {static => python/static}/svg/hand-peace.svg | 0 .../static}/svg/hand-point-down-solid.svg | 0 .../static}/svg/hand-point-down.svg | 0 .../static}/svg/hand-point-left-solid.svg | 0 .../static}/svg/hand-point-left.svg | 0 .../static}/svg/hand-point-right-solid.svg | 0 .../static}/svg/hand-point-right.svg | 0 .../static}/svg/hand-point-up-solid.svg | 0 .../static}/svg/hand-point-up.svg | 0 .../static}/svg/hand-pointer-solid.svg | 0 .../static}/svg/hand-pointer.svg | 0 .../static}/svg/hand-rock-solid.svg | 0 {static => python/static}/svg/hand-rock.svg | 0 .../static}/svg/hand-scissors-solid.svg | 0 .../static}/svg/hand-scissors.svg | 0 .../static}/svg/hand-spock-solid.svg | 0 {static => python/static}/svg/hand-spock.svg | 0 .../static}/svg/hands-helping-solid.svg | 0 {static => python/static}/svg/hands-solid.svg | 0 .../static}/svg/handshake-solid.svg | 0 {static => python/static}/svg/handshake.svg | 0 .../static}/svg/hanukiah-solid.svg | 0 .../static}/svg/hard-hat-solid.svg | 0 .../static}/svg/hashtag-solid.svg | 0 .../static}/svg/hat-cowboy-side-solid.svg | 0 .../static}/svg/hat-cowboy-solid.svg | 0 .../static}/svg/hat-wizard-solid.svg | 0 .../static}/svg/haykal-solid.svg | 0 {static => python/static}/svg/hdd-solid.svg | 0 {static => python/static}/svg/hdd.svg | 0 .../static}/svg/heading-solid.svg | 0 .../static}/svg/headphones-alt-solid.svg | 0 .../static}/svg/headphones-solid.svg | 0 .../static}/svg/headset-solid.svg | 0 .../static}/svg/heart-broken-solid.svg | 0 {static => python/static}/svg/heart-solid.svg | 0 {static => python/static}/svg/heart.svg | 0 .../static}/svg/heartbeat-solid.svg | 0 .../static}/svg/helicopter-solid.svg | 0 .../static}/svg/highlighter-solid.svg | 0 .../static}/svg/hiking-solid.svg | 0 {static => python/static}/svg/hippo-solid.svg | 0 {static => python/static}/svg/hips.svg | 0 .../static}/svg/hire-a-helper.svg | 0 .../static}/svg/history-solid.svg | 0 .../static}/svg/hockey-puck-solid.svg | 0 .../static}/svg/holly-berry-solid.svg | 0 {static => python/static}/svg/home-solid.svg | 0 {static => python/static}/svg/hooli.svg | 0 {static => python/static}/svg/hornbill.svg | 0 .../static}/svg/horse-head-solid.svg | 0 {static => python/static}/svg/horse-solid.svg | 0 .../static}/svg/hospital-alt-solid.svg | 0 .../static}/svg/hospital-solid.svg | 0 .../static}/svg/hospital-symbol-solid.svg | 0 {static => python/static}/svg/hospital.svg | 0 .../static}/svg/hot-tub-solid.svg | 0 .../static}/svg/hotdog-solid.svg | 0 {static => python/static}/svg/hotel-solid.svg | 0 {static => python/static}/svg/hotjar.svg | 0 .../static}/svg/hourglass-end-solid.svg | 0 .../static}/svg/hourglass-half-solid.svg | 0 .../static}/svg/hourglass-solid.svg | 0 .../static}/svg/hourglass-start-solid.svg | 0 {static => python/static}/svg/hourglass.svg | 0 .../static}/svg/house-damage-solid.svg | 0 {static => python/static}/svg/houzz.svg | 0 .../static}/svg/hryvnia-solid.svg | 0 {static => python/static}/svg/html5.svg | 0 {static => python/static}/svg/hubspot.svg | 0 .../static}/svg/i-cursor-solid.svg | 0 .../static}/svg/ice-cream-solid.svg | 0 .../static}/svg/icicles-solid.svg | 0 {static => python/static}/svg/icons-solid.svg | 0 .../static}/svg/id-badge-solid.svg | 0 {static => python/static}/svg/id-badge.svg | 0 .../static}/svg/id-card-alt-solid.svg | 0 .../static}/svg/id-card-solid.svg | 0 {static => python/static}/svg/id-card.svg | 0 {static => python/static}/svg/igloo-solid.svg | 0 {static => python/static}/svg/image-solid.svg | 0 {static => python/static}/svg/image.svg | 0 .../static}/svg/images-solid.svg | 0 {static => python/static}/svg/images.svg | 0 {static => python/static}/svg/imdb.svg | 0 {static => python/static}/svg/inbox-solid.svg | 0 .../static}/svg/indent-solid.svg | 0 .../static}/svg/industry-solid.svg | 0 .../static}/svg/infinity-solid.svg | 0 .../static}/svg/info-circle-solid.svg | 0 {static => python/static}/svg/info-solid.svg | 0 {static => python/static}/svg/instagram.svg | 0 {static => python/static}/svg/intercom.svg | 0 .../static}/svg/internet-explorer.svg | 0 {static => python/static}/svg/invision.svg | 0 {static => python/static}/svg/ioxhost.svg | 0 .../static}/svg/italic-solid.svg | 0 {static => python/static}/svg/itch-io.svg | 0 {static => python/static}/svg/itunes-note.svg | 0 {static => python/static}/svg/itunes.svg | 0 {static => python/static}/svg/java.svg | 0 {static => python/static}/svg/jedi-order.svg | 0 {static => python/static}/svg/jedi-solid.svg | 0 {static => python/static}/svg/jenkins.svg | 0 {static => python/static}/svg/jira.svg | 0 {static => python/static}/svg/joget.svg | 0 {static => python/static}/svg/joint-solid.svg | 0 {static => python/static}/svg/joomla.svg | 0 .../static}/svg/journal-whills-solid.svg | 0 {static => python/static}/svg/js-square.svg | 0 {static => python/static}/svg/js.svg | 0 {static => python/static}/svg/jsfiddle.svg | 0 {static => python/static}/svg/kaaba-solid.svg | 0 {static => python/static}/svg/kaggle.svg | 0 {static => python/static}/svg/key-solid.svg | 0 {static => python/static}/svg/keybase.svg | 0 .../static}/svg/keyboard-solid.svg | 0 {static => python/static}/svg/keyboard.svg | 0 {static => python/static}/svg/keycdn.svg | 0 .../static}/svg/khanda-solid.svg | 0 .../static}/svg/kickstarter-k.svg | 0 {static => python/static}/svg/kickstarter.svg | 0 .../static}/svg/kiss-beam-solid.svg | 0 {static => python/static}/svg/kiss-beam.svg | 0 {static => python/static}/svg/kiss-solid.svg | 0 .../static}/svg/kiss-wink-heart-solid.svg | 0 .../static}/svg/kiss-wink-heart.svg | 0 {static => python/static}/svg/kiss.svg | 0 .../static}/svg/kiwi-bird-solid.svg | 0 {static => python/static}/svg/korvue.svg | 0 .../static}/svg/landmark-solid.svg | 0 .../static}/svg/language-solid.svg | 0 .../static}/svg/laptop-code-solid.svg | 0 .../static}/svg/laptop-medical-solid.svg | 0 .../static}/svg/laptop-solid.svg | 0 {static => python/static}/svg/laravel.svg | 0 .../static}/svg/lastfm-square.svg | 0 {static => python/static}/svg/lastfm.svg | 0 .../static}/svg/laugh-beam-solid.svg | 0 {static => python/static}/svg/laugh-beam.svg | 0 {static => python/static}/svg/laugh-solid.svg | 0 .../static}/svg/laugh-squint-solid.svg | 0 .../static}/svg/laugh-squint.svg | 0 .../static}/svg/laugh-wink-solid.svg | 0 {static => python/static}/svg/laugh-wink.svg | 0 {static => python/static}/svg/laugh.svg | 0 .../static}/svg/layer-group-solid.svg | 0 {static => python/static}/svg/leaf-solid.svg | 0 {static => python/static}/svg/leanpub.svg | 0 {static => python/static}/svg/lemon-solid.svg | 0 {static => python/static}/svg/lemon.svg | 0 .../static}/svg/less-than-equal-solid.svg | 0 .../static}/svg/less-than-solid.svg | 0 {static => python/static}/svg/less.svg | 0 .../static}/svg/level-down-alt-solid.svg | 0 .../static}/svg/level-up-alt-solid.svg | 0 .../static}/svg/life-ring-solid.svg | 0 {static => python/static}/svg/life-ring.svg | 0 .../static}/svg/lightbulb-solid.svg | 0 {static => python/static}/svg/lightbulb.svg | 0 {static => python/static}/svg/line.svg | 0 {static => python/static}/svg/link-solid.svg | 0 {static => python/static}/svg/linkedin-in.svg | 0 {static => python/static}/svg/linkedin.svg | 0 {static => python/static}/svg/linode.svg | 0 {static => python/static}/svg/linux.svg | 0 .../static}/svg/lira-sign-solid.svg | 0 .../static}/svg/list-alt-solid.svg | 0 {static => python/static}/svg/list-alt.svg | 0 .../static}/svg/list-ol-solid.svg | 0 {static => python/static}/svg/list-solid.svg | 0 .../static}/svg/list-ul-solid.svg | 0 .../static}/svg/location-arrow-solid.svg | 0 .../static}/svg/lock-open-solid.svg | 0 {static => python/static}/svg/lock-solid.svg | 0 .../static}/svg/long-arrow-alt-down-solid.svg | 0 .../static}/svg/long-arrow-alt-left-solid.svg | 0 .../svg/long-arrow-alt-right-solid.svg | 0 .../static}/svg/long-arrow-alt-up-solid.svg | 0 .../static}/svg/low-vision-solid.svg | 0 .../static}/svg/luggage-cart-solid.svg | 0 {static => python/static}/svg/lyft.svg | 0 {static => python/static}/svg/magento.svg | 0 {static => python/static}/svg/magic-solid.svg | 0 .../static}/svg/magnet-solid.svg | 0 .../static}/svg/mail-bulk-solid.svg | 0 {static => python/static}/svg/mailchimp.svg | 0 {static => python/static}/svg/male-solid.svg | 0 {static => python/static}/svg/mandalorian.svg | 0 .../static}/svg/map-marked-alt-solid.svg | 0 .../static}/svg/map-marked-solid.svg | 0 .../static}/svg/map-marker-alt-solid.svg | 0 .../static}/svg/map-marker-solid.svg | 0 .../static}/svg/map-pin-solid.svg | 0 .../static}/svg/map-signs-solid.svg | 0 {static => python/static}/svg/map-solid.svg | 0 {static => python/static}/svg/map.svg | 0 {static => python/static}/svg/markdown.svg | 0 .../static}/svg/marker-solid.svg | 0 .../static}/svg/mars-double-solid.svg | 0 {static => python/static}/svg/mars-solid.svg | 0 .../static}/svg/mars-stroke-h-solid.svg | 0 .../static}/svg/mars-stroke-solid.svg | 0 .../static}/svg/mars-stroke-v-solid.svg | 0 {static => python/static}/svg/mask-solid.svg | 0 {static => python/static}/svg/mastodon.svg | 0 {static => python/static}/svg/maxcdn.svg | 0 {static => python/static}/svg/mdb.svg | 0 {static => python/static}/svg/medal-solid.svg | 0 {static => python/static}/svg/medapps.svg | 0 {static => python/static}/svg/medium-m.svg | 0 {static => python/static}/svg/medium.svg | 0 .../static}/svg/medkit-solid.svg | 0 {static => python/static}/svg/medrt.svg | 0 {static => python/static}/svg/meetup.svg | 0 {static => python/static}/svg/megaport.svg | 0 .../static}/svg/meh-blank-solid.svg | 0 {static => python/static}/svg/meh-blank.svg | 0 .../static}/svg/meh-rolling-eyes-solid.svg | 0 .../static}/svg/meh-rolling-eyes.svg | 0 {static => python/static}/svg/meh-solid.svg | 0 {static => python/static}/svg/meh.svg | 0 .../static}/svg/memory-solid.svg | 0 {static => python/static}/svg/mendeley.svg | 0 .../static}/svg/menorah-solid.svg | 0 .../static}/svg/mercury-solid.svg | 0 .../static}/svg/meteor-solid.svg | 0 .../static}/svg/microchip-solid.svg | 0 .../svg/microphone-alt-slash-solid.svg | 0 .../static}/svg/microphone-alt-solid.svg | 0 .../static}/svg/microphone-slash-solid.svg | 0 .../static}/svg/microphone-solid.svg | 0 .../static}/svg/microscope-solid.svg | 0 {static => python/static}/svg/microsoft.svg | 0 .../static}/svg/minus-circle-solid.svg | 0 {static => python/static}/svg/minus-solid.svg | 0 .../static}/svg/minus-square-solid.svg | 0 .../static}/svg/minus-square.svg | 0 .../static}/svg/mitten-solid.svg | 0 {static => python/static}/svg/mix.svg | 0 {static => python/static}/svg/mixcloud.svg | 0 {static => python/static}/svg/mizuni.svg | 0 .../static}/svg/mobile-alt-solid.svg | 0 .../static}/svg/mobile-solid.svg | 0 {static => python/static}/svg/modx.svg | 0 {static => python/static}/svg/monero.svg | 0 .../static}/svg/money-bill-alt-solid.svg | 0 .../static}/svg/money-bill-alt.svg | 0 .../static}/svg/money-bill-solid.svg | 0 .../static}/svg/money-bill-wave-alt-solid.svg | 0 .../static}/svg/money-bill-wave-solid.svg | 0 .../static}/svg/money-check-alt-solid.svg | 0 .../static}/svg/money-check-solid.svg | 0 .../static}/svg/monument-solid.svg | 0 {static => python/static}/svg/moon-solid.svg | 0 {static => python/static}/svg/moon.svg | 0 .../static}/svg/mortar-pestle-solid.svg | 0 .../static}/svg/mosque-solid.svg | 0 .../static}/svg/motorcycle-solid.svg | 0 .../static}/svg/mountain-solid.svg | 0 .../static}/svg/mouse-pointer-solid.svg | 0 {static => python/static}/svg/mouse-solid.svg | 0 .../static}/svg/mug-hot-solid.svg | 0 {static => python/static}/svg/music-solid.svg | 0 {static => python/static}/svg/napster.svg | 0 {static => python/static}/svg/neos.svg | 0 .../static}/svg/network-wired-solid.svg | 0 .../static}/svg/neuter-solid.svg | 0 .../static}/svg/newspaper-solid.svg | 0 {static => python/static}/svg/newspaper.svg | 0 {static => python/static}/svg/nimblr.svg | 0 {static => python/static}/svg/node-js.svg | 0 {static => python/static}/svg/node.svg | 0 .../static}/svg/not-equal-solid.svg | 0 .../static}/svg/notes-medical-solid.svg | 0 {static => python/static}/svg/npm.svg | 0 {static => python/static}/svg/ns8.svg | 0 {static => python/static}/svg/nutritionix.svg | 0 .../static}/svg/object-group-solid.svg | 0 .../static}/svg/object-group.svg | 0 .../static}/svg/object-ungroup-solid.svg | 0 .../static}/svg/object-ungroup.svg | 0 .../static}/svg/odnoklassniki-square.svg | 0 .../static}/svg/odnoklassniki.svg | 0 .../static}/svg/oil-can-solid.svg | 0 .../static}/svg/old-republic.svg | 0 {static => python/static}/svg/om-solid.svg | 0 {static => python/static}/svg/opencart.svg | 0 {static => python/static}/svg/openid.svg | 0 {static => python/static}/svg/opera.svg | 0 .../static}/svg/optin-monster.svg | 0 {static => python/static}/svg/orcid.svg | 0 {static => python/static}/svg/osi.svg | 0 {static => python/static}/svg/otter-solid.svg | 0 .../static}/svg/outdent-solid.svg | 0 {static => python/static}/svg/page4.svg | 0 {static => python/static}/svg/pagelines.svg | 0 {static => python/static}/svg/pager-solid.svg | 0 .../static}/svg/paint-brush-solid.svg | 0 .../static}/svg/paint-roller-solid.svg | 0 .../static}/svg/palette-solid.svg | 0 {static => python/static}/svg/palfed.svg | 0 .../static}/svg/pallet-solid.svg | 0 .../static}/svg/paper-plane-solid.svg | 0 {static => python/static}/svg/paper-plane.svg | 0 .../static}/svg/paperclip-solid.svg | 0 .../static}/svg/parachute-box-solid.svg | 0 .../static}/svg/paragraph-solid.svg | 0 .../static}/svg/parking-solid.svg | 0 .../static}/svg/passport-solid.svg | 0 .../static}/svg/pastafarianism-solid.svg | 0 {static => python/static}/svg/paste-solid.svg | 0 {static => python/static}/svg/patreon.svg | 0 .../static}/svg/pause-circle-solid.svg | 0 .../static}/svg/pause-circle.svg | 0 {static => python/static}/svg/pause-solid.svg | 0 {static => python/static}/svg/paw-solid.svg | 0 {static => python/static}/svg/paypal.svg | 0 {static => python/static}/svg/peace-solid.svg | 0 .../static}/svg/pen-alt-solid.svg | 0 .../static}/svg/pen-fancy-solid.svg | 0 .../static}/svg/pen-nib-solid.svg | 0 {static => python/static}/svg/pen-solid.svg | 0 .../static}/svg/pen-square-solid.svg | 0 .../static}/svg/pencil-alt-solid.svg | 0 .../static}/svg/pencil-ruler-solid.svg | 0 .../static}/svg/penny-arcade.svg | 0 .../static}/svg/people-carry-solid.svg | 0 .../static}/svg/pepper-hot-solid.svg | 0 .../static}/svg/percent-solid.svg | 0 .../static}/svg/percentage-solid.svg | 0 {static => python/static}/svg/periscope.svg | 0 .../static}/svg/person-booth-solid.svg | 0 {static => python/static}/svg/phabricator.svg | 0 .../static}/svg/phoenix-framework.svg | 0 .../static}/svg/phoenix-squadron.svg | 0 .../static}/svg/phone-alt-solid.svg | 0 .../static}/svg/phone-slash-solid.svg | 0 {static => python/static}/svg/phone-solid.svg | 0 .../static}/svg/phone-square-alt-solid.svg | 0 .../static}/svg/phone-square-solid.svg | 0 .../static}/svg/phone-volume-solid.svg | 0 .../static}/svg/photo-video-solid.svg | 0 {static => python/static}/svg/php.svg | 0 .../static}/svg/pied-piper-alt.svg | 0 .../static}/svg/pied-piper-hat.svg | 0 .../static}/svg/pied-piper-pp.svg | 0 {static => python/static}/svg/pied-piper.svg | 0 .../static}/svg/piggy-bank-solid.svg | 0 {static => python/static}/svg/pills-solid.svg | 0 {static => python/static}/svg/pinterest-p.svg | 0 .../static}/svg/pinterest-square.svg | 0 {static => python/static}/svg/pinterest.svg | 0 .../static}/svg/pizza-slice-solid.svg | 0 .../static}/svg/place-of-worship-solid.svg | 0 .../static}/svg/plane-arrival-solid.svg | 0 .../static}/svg/plane-departure-solid.svg | 0 {static => python/static}/svg/plane-solid.svg | 0 .../static}/svg/play-circle-solid.svg | 0 {static => python/static}/svg/play-circle.svg | 0 {static => python/static}/svg/play-solid.svg | 0 {static => python/static}/svg/playstation.svg | 0 {static => python/static}/svg/plug-solid.svg | 0 .../static}/svg/plus-circle-solid.svg | 0 {static => python/static}/svg/plus-solid.svg | 0 .../static}/svg/plus-square-solid.svg | 0 {static => python/static}/svg/plus-square.svg | 0 .../static}/svg/podcast-solid.svg | 0 .../static}/svg/poll-h-solid.svg | 0 {static => python/static}/svg/poll-solid.svg | 0 {static => python/static}/svg/poo-solid.svg | 0 .../static}/svg/poo-storm-solid.svg | 0 {static => python/static}/svg/poop-solid.svg | 0 .../static}/svg/portrait-solid.svg | 0 .../static}/svg/pound-sign-solid.svg | 0 .../static}/svg/power-off-solid.svg | 0 {static => python/static}/svg/pray-solid.svg | 0 .../static}/svg/praying-hands-solid.svg | 0 .../svg/prescription-bottle-alt-solid.svg | 0 .../static}/svg/prescription-bottle-solid.svg | 0 .../static}/svg/prescription-solid.svg | 0 {static => python/static}/svg/print-solid.svg | 0 .../static}/svg/procedures-solid.svg | 0 .../static}/svg/product-hunt.svg | 0 .../static}/svg/project-diagram-solid.svg | 0 {static => python/static}/svg/pushed.svg | 0 .../static}/svg/puzzle-piece-solid.svg | 0 {static => python/static}/svg/python.svg | 0 {static => python/static}/svg/qq.svg | 0 .../static}/svg/qrcode-solid.svg | 0 .../static}/svg/question-circle-solid.svg | 0 .../static}/svg/question-circle.svg | 0 .../static}/svg/question-solid.svg | 0 .../static}/svg/quidditch-solid.svg | 0 {static => python/static}/svg/quinscape.svg | 0 {static => python/static}/svg/quora.svg | 0 .../static}/svg/quote-left-solid.svg | 0 .../static}/svg/quote-right-solid.svg | 0 {static => python/static}/svg/quran-solid.svg | 0 {static => python/static}/svg/r-project.svg | 0 .../static}/svg/radiation-alt-solid.svg | 0 .../static}/svg/radiation-solid.svg | 0 .../static}/svg/rainbow-solid.svg | 0 .../static}/svg/random-solid.svg | 0 .../static}/svg/raspberry-pi.svg | 0 {static => python/static}/svg/ravelry.svg | 0 {static => python/static}/svg/react.svg | 0 {static => python/static}/svg/reacteurope.svg | 0 {static => python/static}/svg/readme.svg | 0 {static => python/static}/svg/rebel.svg | 0 .../static}/svg/receipt-solid.svg | 0 .../static}/svg/record-vinyl-solid.svg | 0 .../static}/svg/recycle-solid.svg | 0 {static => python/static}/svg/red-river.svg | 0 .../static}/svg/reddit-alien.svg | 0 .../static}/svg/reddit-square.svg | 0 {static => python/static}/svg/reddit.svg | 0 {static => python/static}/svg/redhat.svg | 0 .../static}/svg/redo-alt-solid.svg | 0 {static => python/static}/svg/redo-solid.svg | 0 .../static}/svg/registered-solid.svg | 0 {static => python/static}/svg/registered.svg | 0 .../static}/svg/remove-format-solid.svg | 0 {static => python/static}/svg/renren.svg | 0 .../static}/svg/reply-all-solid.svg | 0 {static => python/static}/svg/reply-solid.svg | 0 {static => python/static}/svg/replyd.svg | 0 .../static}/svg/republican-solid.svg | 0 .../static}/svg/researchgate.svg | 0 {static => python/static}/svg/resolving.svg | 0 .../static}/svg/restroom-solid.svg | 0 .../static}/svg/retweet-solid.svg | 0 {static => python/static}/svg/rev.svg | 0 .../static}/svg/ribbon-solid.svg | 0 {static => python/static}/svg/ring-solid.svg | 0 {static => python/static}/svg/road-solid.svg | 0 {static => python/static}/svg/robot-solid.svg | 0 .../static}/svg/rocket-solid.svg | 0 {static => python/static}/svg/rocketchat.svg | 0 {static => python/static}/svg/rockrms.svg | 0 {static => python/static}/svg/route-solid.svg | 0 {static => python/static}/svg/rss-solid.svg | 0 .../static}/svg/rss-square-solid.svg | 0 .../static}/svg/ruble-sign-solid.svg | 0 .../static}/svg/ruler-combined-solid.svg | 0 .../static}/svg/ruler-horizontal-solid.svg | 0 {static => python/static}/svg/ruler-solid.svg | 0 .../static}/svg/ruler-vertical-solid.svg | 0 .../static}/svg/running-solid.svg | 0 .../static}/svg/rupee-sign-solid.svg | 0 .../static}/svg/sad-cry-solid.svg | 0 {static => python/static}/svg/sad-cry.svg | 0 .../static}/svg/sad-tear-solid.svg | 0 {static => python/static}/svg/sad-tear.svg | 0 {static => python/static}/svg/safari.svg | 0 {static => python/static}/svg/salesforce.svg | 0 {static => python/static}/svg/sass.svg | 0 .../static}/svg/satellite-dish-solid.svg | 0 .../static}/svg/satellite-solid.svg | 0 {static => python/static}/svg/save-solid.svg | 0 {static => python/static}/svg/save.svg | 0 {static => python/static}/svg/schlix.svg | 0 .../static}/svg/school-solid.svg | 0 .../static}/svg/screwdriver-solid.svg | 0 {static => python/static}/svg/scribd.svg | 0 .../static}/svg/scroll-solid.svg | 0 .../static}/svg/sd-card-solid.svg | 0 .../static}/svg/search-dollar-solid.svg | 0 .../static}/svg/search-location-solid.svg | 0 .../static}/svg/search-minus-solid.svg | 0 .../static}/svg/search-plus-solid.svg | 0 .../static}/svg/search-solid.svg | 0 {static => python/static}/svg/searchengin.svg | 0 .../static}/svg/seedling-solid.svg | 0 {static => python/static}/svg/sellcast.svg | 0 {static => python/static}/svg/sellsy.svg | 0 .../static}/svg/server-solid.svg | 0 .../static}/svg/servicestack.svg | 0 .../static}/svg/shapes-solid.svg | 0 .../static}/svg/share-alt-solid.svg | 0 .../static}/svg/share-alt-square-solid.svg | 0 {static => python/static}/svg/share-solid.svg | 0 .../static}/svg/share-square-solid.svg | 0 .../static}/svg/share-square.svg | 0 .../static}/svg/shekel-sign-solid.svg | 0 .../static}/svg/shield-alt-solid.svg | 0 {static => python/static}/svg/ship-solid.svg | 0 .../static}/svg/shipping-fast-solid.svg | 0 .../static}/svg/shirtsinbulk.svg | 0 .../static}/svg/shoe-prints-solid.svg | 0 .../static}/svg/shopping-bag-solid.svg | 0 .../static}/svg/shopping-basket-solid.svg | 0 .../static}/svg/shopping-cart-solid.svg | 0 {static => python/static}/svg/shopware.svg | 0 .../static}/svg/shower-solid.svg | 0 .../static}/svg/shuttle-van-solid.svg | 0 .../static}/svg/sign-in-alt-solid.svg | 0 .../static}/svg/sign-language-solid.svg | 0 .../static}/svg/sign-out-alt-solid.svg | 0 {static => python/static}/svg/sign-solid.svg | 0 .../static}/svg/signal-solid.svg | 0 .../static}/svg/signature-solid.svg | 0 .../static}/svg/sim-card-solid.svg | 0 {static => python/static}/svg/simplybuilt.svg | 0 {static => python/static}/svg/sistrix.svg | 0 .../static}/svg/sitemap-solid.svg | 0 {static => python/static}/svg/sith.svg | 0 .../static}/svg/skating-solid.svg | 0 {static => python/static}/svg/sketch.svg | 0 .../static}/svg/skiing-nordic-solid.svg | 0 .../static}/svg/skiing-solid.svg | 0 .../static}/svg/skull-crossbones-solid.svg | 0 {static => python/static}/svg/skull-solid.svg | 0 {static => python/static}/svg/skyatlas.svg | 0 {static => python/static}/svg/skype.svg | 0 {static => python/static}/svg/slack-hash.svg | 0 {static => python/static}/svg/slack.svg | 0 {static => python/static}/svg/slash-solid.svg | 0 .../static}/svg/sleigh-solid.svg | 0 .../static}/svg/sliders-h-solid.svg | 0 {static => python/static}/svg/slideshare.svg | 0 .../static}/svg/smile-beam-solid.svg | 0 {static => python/static}/svg/smile-beam.svg | 0 {static => python/static}/svg/smile-solid.svg | 0 .../static}/svg/smile-wink-solid.svg | 0 {static => python/static}/svg/smile-wink.svg | 0 {static => python/static}/svg/smile.svg | 0 {static => python/static}/svg/smog-solid.svg | 0 .../static}/svg/smoking-ban-solid.svg | 0 .../static}/svg/smoking-solid.svg | 0 {static => python/static}/svg/sms-solid.svg | 0 .../static}/svg/snapchat-ghost.svg | 0 .../static}/svg/snapchat-square.svg | 0 {static => python/static}/svg/snapchat.svg | 0 .../static}/svg/snowboarding-solid.svg | 0 .../static}/svg/snowflake-solid.svg | 0 {static => python/static}/svg/snowflake.svg | 0 .../static}/svg/snowman-solid.svg | 0 .../static}/svg/snowplow-solid.svg | 0 {static => python/static}/svg/socks-solid.svg | 0 .../static}/svg/solar-panel-solid.svg | 0 .../static}/svg/sort-alpha-down-alt-solid.svg | 0 .../static}/svg/sort-alpha-down-solid.svg | 0 .../static}/svg/sort-alpha-up-alt-solid.svg | 0 .../static}/svg/sort-alpha-up-solid.svg | 0 .../svg/sort-amount-down-alt-solid.svg | 0 .../static}/svg/sort-amount-down-solid.svg | 0 .../static}/svg/sort-amount-up-alt-solid.svg | 0 .../static}/svg/sort-amount-up-solid.svg | 0 .../static}/svg/sort-down-solid.svg | 0 .../svg/sort-numeric-down-alt-solid.svg | 0 .../static}/svg/sort-numeric-down-solid.svg | 0 .../static}/svg/sort-numeric-up-alt-solid.svg | 0 .../static}/svg/sort-numeric-up-solid.svg | 0 {static => python/static}/svg/sort-solid.svg | 0 .../static}/svg/sort-up-solid.svg | 0 {static => python/static}/svg/soundcloud.svg | 0 {static => python/static}/svg/sourcetree.svg | 0 {static => python/static}/svg/spa-solid.svg | 0 .../static}/svg/space-shuttle-solid.svg | 0 {static => python/static}/svg/speakap.svg | 0 .../static}/svg/speaker-deck.svg | 0 .../static}/svg/spell-check-solid.svg | 0 .../static}/svg/spider-solid.svg | 0 .../static}/svg/spinner-solid.svg | 0 .../static}/svg/splotch-solid.svg | 0 {static => python/static}/svg/spotify.svg | 0 .../static}/svg/spray-can-solid.svg | 0 .../static}/svg/square-full-solid.svg | 0 .../static}/svg/square-root-alt-solid.svg | 0 .../static}/svg/square-solid.svg | 0 {static => python/static}/svg/square.svg | 0 {static => python/static}/svg/squarespace.svg | 0 .../static}/svg/stack-exchange.svg | 0 .../static}/svg/stack-overflow.svg | 0 {static => python/static}/svg/stackpath.svg | 0 {static => python/static}/svg/stamp-solid.svg | 0 .../static}/svg/star-and-crescent-solid.svg | 0 .../static}/svg/star-half-alt-solid.svg | 0 .../static}/svg/star-half-solid.svg | 0 {static => python/static}/svg/star-half.svg | 0 .../static}/svg/star-of-david-solid.svg | 0 .../static}/svg/star-of-life-solid.svg | 0 {static => python/static}/svg/star-solid.svg | 0 {static => python/static}/svg/star.svg | 0 {static => python/static}/svg/staylinked.svg | 0 .../static}/svg/steam-square.svg | 0 .../static}/svg/steam-symbol.svg | 0 {static => python/static}/svg/steam.svg | 0 .../static}/svg/step-backward-solid.svg | 0 .../static}/svg/step-forward-solid.svg | 0 .../static}/svg/stethoscope-solid.svg | 0 .../static}/svg/sticker-mule.svg | 0 .../static}/svg/sticky-note-solid.svg | 0 {static => python/static}/svg/sticky-note.svg | 0 .../static}/svg/stop-circle-solid.svg | 0 {static => python/static}/svg/stop-circle.svg | 0 {static => python/static}/svg/stop-solid.svg | 0 .../static}/svg/stopwatch-solid.svg | 0 .../static}/svg/store-alt-solid.svg | 0 {static => python/static}/svg/store-solid.svg | 0 {static => python/static}/svg/strava.svg | 0 .../static}/svg/stream-solid.svg | 0 .../static}/svg/street-view-solid.svg | 0 .../static}/svg/strikethrough-solid.svg | 0 {static => python/static}/svg/stripe-s.svg | 0 {static => python/static}/svg/stripe.svg | 0 .../static}/svg/stroopwafel-solid.svg | 0 .../static}/svg/studiovinari.svg | 0 .../static}/svg/stumbleupon-circle.svg | 0 {static => python/static}/svg/stumbleupon.svg | 0 .../static}/svg/subscript-solid.svg | 0 .../static}/svg/subway-solid.svg | 0 .../static}/svg/suitcase-rolling-solid.svg | 0 .../static}/svg/suitcase-solid.svg | 0 {static => python/static}/svg/sun-solid.svg | 0 {static => python/static}/svg/sun.svg | 0 {static => python/static}/svg/superpowers.svg | 0 .../static}/svg/superscript-solid.svg | 0 {static => python/static}/svg/supple.svg | 0 .../static}/svg/surprise-solid.svg | 0 {static => python/static}/svg/surprise.svg | 0 {static => python/static}/svg/suse.svg | 0 .../static}/svg/swatchbook-solid.svg | 0 {static => python/static}/svg/swift.svg | 0 .../static}/svg/swimmer-solid.svg | 0 .../static}/svg/swimming-pool-solid.svg | 0 {static => python/static}/svg/symfony.svg | 0 .../static}/svg/synagogue-solid.svg | 0 .../static}/svg/sync-alt-solid.svg | 0 {static => python/static}/svg/sync-solid.svg | 0 .../static}/svg/syringe-solid.svg | 0 {static => python/static}/svg/table-solid.svg | 0 .../static}/svg/table-tennis-solid.svg | 0 .../static}/svg/tablet-alt-solid.svg | 0 .../static}/svg/tablet-solid.svg | 0 .../static}/svg/tablets-solid.svg | 0 .../static}/svg/tachometer-alt-solid.svg | 0 {static => python/static}/svg/tag-solid.svg | 0 {static => python/static}/svg/tags-solid.svg | 0 {static => python/static}/svg/tape-solid.svg | 0 {static => python/static}/svg/tasks-solid.svg | 0 {static => python/static}/svg/taxi-solid.svg | 0 {static => python/static}/svg/teamspeak.svg | 0 .../static}/svg/teeth-open-solid.svg | 0 {static => python/static}/svg/teeth-solid.svg | 0 .../static}/svg/telegram-plane.svg | 0 {static => python/static}/svg/telegram.svg | 0 .../static}/svg/temperature-high-solid.svg | 0 .../static}/svg/temperature-low-solid.svg | 0 .../static}/svg/tencent-weibo.svg | 0 {static => python/static}/svg/tenge-solid.svg | 0 .../static}/svg/terminal-solid.svg | 0 .../static}/svg/text-height-solid.svg | 0 .../static}/svg/text-width-solid.svg | 0 .../static}/svg/th-large-solid.svg | 0 .../static}/svg/th-list-solid.svg | 0 {static => python/static}/svg/th-solid.svg | 0 .../static}/svg/the-red-yeti.svg | 0 .../static}/svg/theater-masks-solid.svg | 0 {static => python/static}/svg/themeco.svg | 0 {static => python/static}/svg/themeisle.svg | 0 .../static}/svg/thermometer-empty-solid.svg | 0 .../static}/svg/thermometer-full-solid.svg | 0 .../static}/svg/thermometer-half-solid.svg | 0 .../static}/svg/thermometer-quarter-solid.svg | 0 .../static}/svg/thermometer-solid.svg | 0 .../svg/thermometer-three-quarters-solid.svg | 0 {static => python/static}/svg/think-peaks.svg | 0 .../static}/svg/thumbs-down-solid.svg | 0 {static => python/static}/svg/thumbs-down.svg | 0 .../static}/svg/thumbs-up-solid.svg | 0 {static => python/static}/svg/thumbs-up.svg | 0 .../static}/svg/thumbtack-solid.svg | 0 .../static}/svg/ticket-alt-solid.svg | 0 .../static}/svg/times-circle-solid.svg | 0 .../static}/svg/times-circle.svg | 0 {static => python/static}/svg/times-solid.svg | 0 .../static}/svg/tint-slash-solid.svg | 0 {static => python/static}/svg/tint-solid.svg | 0 {static => python/static}/svg/tired-solid.svg | 0 {static => python/static}/svg/tired.svg | 0 .../static}/svg/toggle-off-solid.svg | 0 .../static}/svg/toggle-on-solid.svg | 0 .../static}/svg/toilet-paper-solid.svg | 0 .../static}/svg/toilet-solid.svg | 0 .../static}/svg/toolbox-solid.svg | 0 {static => python/static}/svg/tools-solid.svg | 0 {static => python/static}/svg/tooth-solid.svg | 0 {static => python/static}/svg/torah-solid.svg | 0 .../static}/svg/torii-gate-solid.svg | 0 .../static}/svg/tractor-solid.svg | 0 .../static}/svg/trade-federation.svg | 0 .../static}/svg/trademark-solid.svg | 0 .../static}/svg/traffic-light-solid.svg | 0 {static => python/static}/svg/train-solid.svg | 0 {static => python/static}/svg/tram-solid.svg | 0 .../static}/svg/transgender-alt-solid.svg | 0 .../static}/svg/transgender-solid.svg | 0 .../static}/svg/trash-alt-solid.svg | 0 {static => python/static}/svg/trash-alt.svg | 0 .../static}/svg/trash-restore-alt-solid.svg | 0 .../static}/svg/trash-restore-solid.svg | 0 {static => python/static}/svg/trash-solid.svg | 0 {static => python/static}/svg/tree-solid.svg | 0 {static => python/static}/svg/trello.svg | 0 {static => python/static}/svg/tripadvisor.svg | 0 .../static}/svg/trophy-solid.svg | 0 .../static}/svg/truck-loading-solid.svg | 0 .../static}/svg/truck-monster-solid.svg | 0 .../static}/svg/truck-moving-solid.svg | 0 .../static}/svg/truck-pickup-solid.svg | 0 {static => python/static}/svg/truck-solid.svg | 0 .../static}/svg/tshirt-solid.svg | 0 {static => python/static}/svg/tty-solid.svg | 0 .../static}/svg/tumblr-square.svg | 0 {static => python/static}/svg/tumblr.svg | 0 {static => python/static}/svg/tv-solid.svg | 0 {static => python/static}/svg/twitch.svg | 0 .../static}/svg/twitter-square.svg | 0 {static => python/static}/svg/twitter.svg | 0 {static => python/static}/svg/typo3.svg | 0 {static => python/static}/svg/uber.svg | 0 {static => python/static}/svg/ubuntu.svg | 0 {static => python/static}/svg/uikit.svg | 0 {static => python/static}/svg/umbraco.svg | 0 .../static}/svg/umbrella-beach-solid.svg | 0 .../static}/svg/umbrella-solid.svg | 0 .../static}/svg/underline-solid.svg | 0 .../static}/svg/undo-alt-solid.svg | 0 {static => python/static}/svg/undo-solid.svg | 0 {static => python/static}/svg/uniregistry.svg | 0 .../static}/svg/universal-access-solid.svg | 0 .../static}/svg/university-solid.svg | 0 .../static}/svg/unlink-solid.svg | 0 .../static}/svg/unlock-alt-solid.svg | 0 .../static}/svg/unlock-solid.svg | 0 {static => python/static}/svg/untappd.svg | 0 .../static}/svg/upload-solid.svg | 0 {static => python/static}/svg/ups.svg | 0 {static => python/static}/svg/usb.svg | 0 .../static}/svg/user-alt-slash-solid.svg | 0 .../static}/svg/user-alt-solid.svg | 0 .../static}/svg/user-astronaut-solid.svg | 0 .../static}/svg/user-check-solid.svg | 0 .../static}/svg/user-circle-solid.svg | 0 {static => python/static}/svg/user-circle.svg | 0 .../static}/svg/user-clock-solid.svg | 0 .../static}/svg/user-cog-solid.svg | 0 .../static}/svg/user-edit-solid.svg | 0 .../static}/svg/user-friends-solid.svg | 0 .../static}/svg/user-graduate-solid.svg | 0 .../static}/svg/user-injured-solid.svg | 0 .../static}/svg/user-lock-solid.svg | 0 .../static}/svg/user-md-solid.svg | 0 .../static}/svg/user-minus-solid.svg | 0 .../static}/svg/user-ninja-solid.svg | 0 .../static}/svg/user-nurse-solid.svg | 0 .../static}/svg/user-plus-solid.svg | 0 .../static}/svg/user-secret-solid.svg | 0 .../static}/svg/user-shield-solid.svg | 0 .../static}/svg/user-slash-solid.svg | 0 {static => python/static}/svg/user-solid.svg | 0 .../static}/svg/user-tag-solid.svg | 0 .../static}/svg/user-tie-solid.svg | 0 .../static}/svg/user-times-solid.svg | 0 {static => python/static}/svg/user.svg | 0 .../static}/svg/users-cog-solid.svg | 0 {static => python/static}/svg/users-solid.svg | 0 {static => python/static}/svg/usps.svg | 0 {static => python/static}/svg/ussunnah.svg | 0 .../static}/svg/utensil-spoon-solid.svg | 0 .../static}/svg/utensils-solid.svg | 0 {static => python/static}/svg/vaadin.svg | 0 .../static}/svg/vector-square-solid.svg | 0 .../static}/svg/venus-double-solid.svg | 0 .../static}/svg/venus-mars-solid.svg | 0 {static => python/static}/svg/venus-solid.svg | 0 {static => python/static}/svg/viacoin.svg | 0 .../static}/svg/viadeo-square.svg | 0 {static => python/static}/svg/viadeo.svg | 0 {static => python/static}/svg/vial-solid.svg | 0 {static => python/static}/svg/vials-solid.svg | 0 {static => python/static}/svg/viber.svg | 0 .../static}/svg/video-slash-solid.svg | 0 {static => python/static}/svg/video-solid.svg | 0 .../static}/svg/vihara-solid.svg | 0 .../static}/svg/vimeo-square.svg | 0 {static => python/static}/svg/vimeo-v.svg | 0 {static => python/static}/svg/vimeo.svg | 0 {static => python/static}/svg/vine.svg | 0 {static => python/static}/svg/vk.svg | 0 {static => python/static}/svg/vnv.svg | 0 .../static}/svg/voicemail-solid.svg | 0 .../static}/svg/volleyball-ball-solid.svg | 0 .../static}/svg/volume-down-solid.svg | 0 .../static}/svg/volume-mute-solid.svg | 0 .../static}/svg/volume-off-solid.svg | 0 .../static}/svg/volume-up-solid.svg | 0 .../static}/svg/vote-yea-solid.svg | 0 .../static}/svg/vr-cardboard-solid.svg | 0 {static => python/static}/svg/vuejs.svg | 0 .../static}/svg/walking-solid.svg | 0 .../static}/svg/wallet-solid.svg | 0 .../static}/svg/warehouse-solid.svg | 0 {static => python/static}/svg/water-solid.svg | 0 .../static}/svg/wave-square-solid.svg | 0 {static => python/static}/svg/waze.svg | 0 {static => python/static}/svg/weebly.svg | 0 {static => python/static}/svg/weibo.svg | 0 .../static}/svg/weight-hanging-solid.svg | 0 .../static}/svg/weight-solid.svg | 0 {static => python/static}/svg/weixin.svg | 0 .../static}/svg/whatsapp-square.svg | 0 {static => python/static}/svg/whatsapp.svg | 0 .../static}/svg/wheelchair-solid.svg | 0 {static => python/static}/svg/whmcs.svg | 0 {static => python/static}/svg/wifi-solid.svg | 0 {static => python/static}/svg/wikipedia-w.svg | 0 {static => python/static}/svg/wind-solid.svg | 0 .../static}/svg/window-close-solid.svg | 0 .../static}/svg/window-close.svg | 0 .../static}/svg/window-maximize-solid.svg | 0 .../static}/svg/window-maximize.svg | 0 .../static}/svg/window-minimize-solid.svg | 0 .../static}/svg/window-minimize.svg | 0 .../static}/svg/window-restore-solid.svg | 0 .../static}/svg/window-restore.svg | 0 {static => python/static}/svg/windows.svg | 0 .../static}/svg/wine-bottle-solid.svg | 0 .../static}/svg/wine-glass-alt-solid.svg | 0 .../static}/svg/wine-glass-solid.svg | 0 {static => python/static}/svg/wix.svg | 0 .../static}/svg/wizards-of-the-coast.svg | 0 .../static}/svg/wolf-pack-battalion.svg | 0 .../static}/svg/won-sign-solid.svg | 0 .../static}/svg/wordpress-simple.svg | 0 {static => python/static}/svg/wordpress.svg | 0 {static => python/static}/svg/wpbeginner.svg | 0 {static => python/static}/svg/wpexplorer.svg | 0 {static => python/static}/svg/wpforms.svg | 0 {static => python/static}/svg/wpressr.svg | 0 .../static}/svg/wrench-solid.svg | 0 {static => python/static}/svg/x-ray-solid.svg | 0 {static => python/static}/svg/xbox.svg | 0 {static => python/static}/svg/xing-square.svg | 0 {static => python/static}/svg/xing.svg | 0 .../static}/svg/y-combinator.svg | 0 {static => python/static}/svg/yahoo.svg | 0 {static => python/static}/svg/yammer.svg | 0 .../static}/svg/yandex-international.svg | 0 {static => python/static}/svg/yandex.svg | 0 {static => python/static}/svg/yarn.svg | 0 {static => python/static}/svg/yelp.svg | 0 .../static}/svg/yen-sign-solid.svg | 0 .../static}/svg/yin-yang-solid.svg | 0 {static => python/static}/svg/yoast.svg | 0 .../static}/svg/youtube-square.svg | 0 {static => python/static}/svg/youtube.svg | 0 {static => python/static}/svg/zhihu.svg | 0 {templates => python/templates}/base.html | 2 +- {templates => python/templates}/download.html | 0 .../templates}/download_queue.html | 0 {utils => python/utils}/__init__.py | 0 {utils => python/utils}/browser.py | 0 {utils => python/utils}/download.py | 0 {utils => python/utils}/processor.py | 0 {utils => python/utils}/scraper.py | 0 {utils => python/utils}/yt-links.py | 0 {utils => python/utils}/yt_dlp_logger.py | 0 pyvenv.cfg | 5 - share/bash-completion/completions/yt-dlp | 29 - share/zsh/site-functions/_yt-dlp | 30 - 9489 files changed, 776074 insertions(+), 286 deletions(-) delete mode 100644 database/album.json delete mode 100644 navidrome/cache/images/01/dc/01dc1df46675b3a4cc4149dfff3a2bad485d141e delete mode 100644 navidrome/cache/images/02/61/02610867f561bbd07db3f2393e4bce269c12a7db delete mode 100644 navidrome/cache/images/0d/93/0d9321a102d93f4288e4e8da225feff516afb35f delete mode 100644 navidrome/cache/images/16/7b/167b5bdae701ba598f2a1e0862596f9bd570a914 delete mode 100644 navidrome/cache/images/1a/15/1a15fc1e2e17a098e09e94664a0f1bdde3182994 delete mode 100644 navidrome/cache/images/1d/15/1d1525455687037b510e9c58c6aac1aec3a01bb9 delete mode 100644 navidrome/cache/images/21/03/2103bf6ec1f2008c8a43a60cff2968cd4e067cb7 delete mode 100644 navidrome/cache/images/21/55/215516c5761dae0017f7ffe74d08fd09ab14cd7e delete mode 100644 navidrome/cache/images/2f/83/2f8366f1a3158fda017099693211fe24730ec5f4 delete mode 100644 navidrome/cache/images/43/cf/43cfc7d35115bc141f5cbaffdf95600136b78f0a delete mode 100644 navidrome/cache/images/4a/33/4a330de9b563091132d58918ba898576dac97583 delete mode 100644 navidrome/cache/images/52/71/52710b6543b5e778467426e38dd117843da128d8 delete mode 100644 navidrome/cache/images/5f/1e/5f1e942acb89b3456ab644ce17150d71800f8139 delete mode 100644 navidrome/cache/images/60/fe/60feabfb3ad5b0a71eaff6b364aacd17f3510295 delete mode 100644 navidrome/cache/images/68/9e/689e94d05db5d6dd42acd6e667870927d8387d78 delete mode 100644 navidrome/cache/images/6a/46/6a4663184a296bd9902cd68e08e138db6c280dc4 delete mode 100644 navidrome/cache/images/73/8e/738e414f3ee2cc537b7ca8bfa6e95757065adc63 delete mode 100644 navidrome/cache/images/75/e0/75e0eb2d3c3d10e88e04ddd9011d3d104cfd1be7 delete mode 100644 navidrome/cache/images/80/51/805161f6790c00faffaf61a522492d0de18ed62c delete mode 100644 navidrome/cache/images/82/41/8241ab6f33f4e74fb99efb813f6767519a31cc40 delete mode 100644 navidrome/cache/images/87/f9/87f94b422331baa1d81e0d277b699ad46cf11187 delete mode 100644 navidrome/cache/images/88/c7/88c7004eded52ac85da6e662bef03244701bde06 delete mode 100644 navidrome/cache/images/95/2f/952f4586139ba03d8a59f932964e4362ece6a481 delete mode 100644 navidrome/cache/images/99/95/9995206040bbb762c38a79be73cb06fe00ce1cf1 delete mode 100644 navidrome/cache/images/9b/15/9b15c7269d5b068386dab8cf8ad34c50930fee8b delete mode 100644 navidrome/cache/images/9e/9a/9e9a48cc36949efbec7067be051c93d88b8eee51 delete mode 100644 navidrome/cache/images/b1/62/b16257a8253cb16c1a30a54acee4e0394d8a60be delete mode 100644 navidrome/cache/images/b9/c8/b9c8abd62d15bac48b738e9cd98bcc4c847bd90f delete mode 100644 navidrome/cache/images/c9/ca/c9ca1e99a28e93e9b5f952430017c833ebbca732 delete mode 100644 navidrome/cache/images/ce/5e/ce5ec4ddaa6f903a901ac6d5b2d8421f5b3457bf delete mode 100644 navidrome/cache/images/cf/8b/cf8bd7a4a7d89237642713e87c96e9e0b510552f delete mode 100644 navidrome/cache/images/d1/7d/d17d22b6ccf5639901cdec7323faa049771cab6a delete mode 100644 navidrome/cache/images/d3/d5/d3d51bac720faefa0d4d005287aefcbbecc70352 delete mode 100644 navidrome/cache/images/d4/4f/d44fd9cd59e53482be9cb5c9dee952669bec2d07 delete mode 100644 navidrome/cache/images/d5/c3/d5c3d9464ccb4f69981bd652b4386355ea887969 delete mode 100644 navidrome/cache/images/db/60/db60bf5ca1bcd80704c3b358da175e24a9501cb4 delete mode 100644 navidrome/cache/images/e7/28/e7288cdadb7fe821f89e96399cc180e222525161 delete mode 100644 navidrome/cache/images/f1/80/f180b48373bcafa1deff21859159692d83025431 delete mode 100644 navidrome/cache/images/f9/85/f985ed095bf95de987c9138ea012ce4d0d9f5481 delete mode 100644 navidrome/cache/images/fd/26/fd26b9a68e5b68c1c302bc6622c560dedd6a27c4 delete mode 100644 navidrome/navidrome.db create mode 100644 nginx/conf/default.conf create mode 100644 nginx/dockerfiles/nginx.dockerfile create mode 100644 php/dockerfiles/php.dockerfile create mode 100644 php/dockerfiles/php.root.dockerfile create mode 100644 python/.gitignore rename __init__.py => python/__init__.py (100%) rename app.py => python/app.py (95%) create mode 100644 python/bin/Activate.ps1 create mode 100644 python/bin/activate create mode 100644 python/bin/activate.csh create mode 100644 python/bin/activate.fish create mode 100755 python/bin/flask create mode 100755 python/bin/mid3cp create mode 100755 python/bin/mid3iconv create mode 100755 python/bin/mid3v2 create mode 100755 python/bin/moggsplit create mode 100755 python/bin/mutagen-inspect create mode 100755 python/bin/mutagen-pony create mode 100755 python/bin/normalizer create mode 100755 python/bin/pip create mode 100755 python/bin/pip3 create mode 100755 python/bin/pip3.10 create mode 100755 python/bin/pysondb create mode 120000 python/bin/python create mode 120000 python/bin/python3 create mode 120000 python/bin/python3.10 create mode 100755 python/bin/tldextract create mode 100755 python/bin/yt-dlp rename const.py => python/const.py (100%) rename database.py => python/database.py (100%) create mode 100644 python/database/album.json rename Dockerfile => python/dockerfiles/Dockerfile (78%) rename {drivers => python/drivers}/geckodriver-0.33.0/.cargo/config (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/CHANGES.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/CONTRIBUTING.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/Cargo.lock (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/Cargo.toml (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/ISSUE_TEMPLATE.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/LICENSE (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/README.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/build.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/dist/geckodriver.exe (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/ARM.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Bugs.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Building.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Capabilities.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/CrashReports.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Flags.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Notarization.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Patches.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Profiles.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Releasing.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Support.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Testing.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/TraceLogs.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/Usage.md (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/doc/index.rst (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/Cargo.toml (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/common.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/error.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/lib.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/marionette.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/message.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/result.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/test.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/marionette/src/webdriver.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/android.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/browser.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/build.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/capabilities.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/command.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/logging.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/main.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/marionette.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/prefs.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/test.rs (100%) rename {drivers => python/drivers}/geckodriver-0.33.0/src/tests/profile.zip (100%) rename geckodriver-install.sh => python/geckodriver-install.sh (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/APScheduler-3.10.1.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Brotli-1.0.9.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Brotli-1.0.9.dist-info/LICENSE (100%) create mode 100644 python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/Brotli-1.0.9.dist-info/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/WHEEL rename {lib/python3.11 => python/lib/python3.10}/site-packages/Brotli-1.0.9.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/AES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/AES.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ARC2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ARC2.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ARC4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ARC4.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/Blowfish.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/Blowfish.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/CAST.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/CAST.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ChaCha20.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ChaCha20.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/DES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/DES.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/DES3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/DES3.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/Salsa20.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/Salsa20.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_ARC4.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_EKSBlowfish.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_chacha20.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_cbc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_cbc.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ccm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ccm.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_cfb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_cfb.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ctr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ctr.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_eax.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_eax.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ecb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ecb.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_gcm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_gcm.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ocb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ocb.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ofb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_ofb.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_openpgp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_siv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_mode_siv.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_des.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/BLAKE2b.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/BLAKE2b.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/BLAKE2s.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/BLAKE2s.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/CMAC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/CMAC.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/HMAC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/HMAC.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KMAC128.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KMAC128.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KMAC256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KMAC256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KangarooTwelve.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/KangarooTwelve.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD2.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD4.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/MD5.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/Poly1305.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/Poly1305.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/RIPEMD.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/RIPEMD.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/RIPEMD160.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/RIPEMD160.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA1.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA224.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA224.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA384.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA384.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_224.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_224.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_384.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_384.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_512.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA3_512.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA512.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHA512.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHAKE128.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHAKE128.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHAKE256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/SHAKE256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/TupleHash128.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/TupleHash128.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/TupleHash256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/TupleHash256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_MD2.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_MD4.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_MD5.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_SHA1.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_SHA224.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_SHA256.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_SHA384.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_SHA512.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_keccak.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/_poly1305.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/cSHAKE128.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/cSHAKE128.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/cSHAKE256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/cSHAKE256.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/keccak.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Hash/keccak.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/PEM.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/PEM.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/PKCS8.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/PKCS8.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/_PBES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/_PBES.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/IO/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/Numbers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/Numbers.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/Primality.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/Primality.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerBase.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerBase.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerCustom.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerCustom.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerGMP.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerGMP.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerNative.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_IntegerNative.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Math/_modexp.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/KDF.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/KDF.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/SecretSharing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/SecretSharing.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Protocol/_scrypt.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/DSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/DSA.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/ECC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/ECC.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/ElGamal.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/ElGamal.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/RSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/RSA.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_ed448.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_openssh.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_openssh.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/PublicKey/_x25519.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Random/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Random/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Random/random.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Random/random.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/common.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/common.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/IO/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/IO/test_PBES.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Math/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Math/test_Primality.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Math/test_modexp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Protocol/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Random/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Random/test_random.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Signature/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Signature/test_dss.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Signature/test_pss.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_Counter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_Padding.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_asn1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_number.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/Util/test_strxor.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/loader.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/SelfTest/st_common.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/DSS.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/DSS.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/PKCS1_PSS.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/PKCS1_v1_5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/eddsa.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/eddsa.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/pkcs1_15.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/pkcs1_15.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/pss.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Signature/pss.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/Counter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/Counter.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/Padding.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/Padding.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/RFC1751.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/RFC1751.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_cpu_features.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_cpu_features.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_cpuid_c.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_file_system.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_file_system.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_raw_api.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_raw_api.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/_strxor.abi3.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/asn1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/asn1.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/number.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/number.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/py3compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/py3compat.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/strxor.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/Util/strxor.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/__init__.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Cryptodome/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Flask-2.2.5.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Jinja2-3.1.2.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/MarkupSafe-2.1.3.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL rename {lib/python3.11 => python/lib/python3.10}/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt (100%) create mode 100755 python/lib/python3.10/site-packages/_brotli.cpython-310-x86_64-linux-gnu.so create mode 100644 python/lib/python3.10/site-packages/_distutils_hack/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/_distutils_hack/override.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/events.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/asyncio.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/base_py3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/debug.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/gevent.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/pool.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/tornado.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/executors/twisted.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/job.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/memory.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/mongodb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/redis.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/rethinkdb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/sqlalchemy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/jobstores/zookeeper.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/asyncio.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/background.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/blocking.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/gevent.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/qt.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/tornado.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/schedulers/twisted.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/combining.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/cron/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/cron/expressions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/cron/fields.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/date.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/triggers/interval.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/apscheduler/util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/async_timeout-4.0.2.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout-4.0.2.dist-info/zip-safe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/async_timeout/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/brotli.py (100%) rename {lib/python3.11/site-packages/certifi-2023.5.7.dist-info => python/lib/python3.10/site-packages/bs4-0.0.1.dist-info}/INSTALLER (100%) create mode 100644 python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/RECORD rename {lib/python3.11/site-packages/certifi-2023.5.7.dist-info => python/lib/python3.10/site-packages/bs4-0.0.1.dist-info}/REQUESTED (100%) rename {lib/python3.11/site-packages/click-8.1.3.dist-info => python/lib/python3.10/site-packages/bs4-0.0.1.dist-info}/WHEEL (100%) rename {lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info => python/lib/python3.10/site-packages/bs4-0.0.1.dist-info}/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/builder/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/builder/_html5lib.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/builder/_htmlparser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/builder/_lxml.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/css.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/dammit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/diagnose.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/element.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/formatter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_builder.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_builder_registry.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_css.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_dammit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_docs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_element.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_formatter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_fuzz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_html5lib.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_htmlparser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_lxml.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_navigablestring.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_pageelement.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_soup.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_tag.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/bs4/tests/test_tree.py (100%) rename {lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info => python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi-2023.5.7.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi-2023.5.7.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/RECORD rename {lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info => python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi-2023.5.7.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi-2023.5.7.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi/cacert.pem (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi/core.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/certifi/py.typed (100%) rename {lib/python3.11/site-packages/click-8.1.3.dist-info => python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer-3.1.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/RECORD rename {lib/python3.11/site-packages/click-8.1.3.dist-info => python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/api.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/assets/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/cd.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/cli/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/cli/normalizer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/constant.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/legacy.py (100%) create mode 100755 python/lib/python3.10/site-packages/charset_normalizer/md.cpython-310-x86_64-linux-gnu.so rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/md.py (100%) create mode 100755 python/lib/python3.10/site-packages/charset_normalizer/md__mypyc.cpython-310-x86_64-linux-gnu.so rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/models.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/charset_normalizer/version.py (100%) rename {lib/python3.11/site-packages/filelock-3.12.2.dist-info => python/lib/python3.10/site-packages/click-8.1.3.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click-8.1.3.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click-8.1.3.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/click-8.1.3.dist-info/RECORD rename {lib/python3.11/site-packages/filelock-3.12.2.dist-info => python/lib/python3.10/site-packages/click-8.1.3.dist-info}/REQUESTED (100%) rename {lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info => python/lib/python3.10/site-packages/click-8.1.3.dist-info}/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click-8.1.3.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/_compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/_termui_impl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/_textwrap.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/_winconsole.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/core.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/decorators.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/formatting.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/globals.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/parser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/shell_completion.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/termui.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/testing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/types.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/click/utils.py (100%) create mode 100644 python/lib/python3.10/site-packages/distutils-precedence.pth rename {lib/python3.11/site-packages/idna-3.4.dist-info => python/lib/python3.10/site-packages/filelock-3.12.2.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock-3.12.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/RECORD rename {lib/python3.11/site-packages/idna-3.4.dist-info => python/lib/python3.10/site-packages/filelock-3.12.2.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock-3.12.2.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_api.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_error.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_soft.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_unix.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/_windows.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/filelock/version.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/app.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/blueprints.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/cli.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/config.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/ctx.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/debughelpers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/globals.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/helpers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/json/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/json/provider.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/json/tag.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/logging.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/scaffold.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/sessions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/signals.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/templating.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/testing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/typing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/views.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/flask/wrappers.py (100%) rename {lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info => python/lib/python3.10/site-packages/idna-3.4.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna-3.4.dist-info/LICENSE.md (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna-3.4.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/idna-3.4.dist-info/RECORD rename {lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info => python/lib/python3.10/site-packages/idna-3.4.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna-3.4.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/codec.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/core.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/idnadata.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/intranges.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/package_data.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/idna/uts46data.py (100%) rename {lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info => python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata-6.6.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/RECORD rename {lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info => python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_adapters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_collections.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_functools.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_itertools.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_meta.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_py39compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/_text.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/importlib_metadata/py.typed (100%) rename {lib/python3.11/site-packages/mutagen-1.46.0.dist-info => python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous-2.1.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/RECORD rename {lib/python3.11/site-packages/mutagen-1.46.0.dist-info => python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info}/REQUESTED (100%) rename {lib/python3.11/site-packages/mutagen-1.46.0.dist-info => python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info}/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/_json.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/encoding.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/exc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/serializer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/signer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/timed.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/itsdangerous/url_safe.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/_identifier.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/async_utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/bccache.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/compiler.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/constants.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/debug.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/defaults.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/environment.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/ext.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/filters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/idtracking.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/lexer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/loaders.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/meta.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/nativetypes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/nodes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/optimizer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/parser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/runtime.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/sandbox.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/tests.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/jinja2/visitor.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/markupsafe/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/markupsafe/_native.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/markupsafe/_speedups.c (100%) create mode 100755 python/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so rename {lib/python3.11 => python/lib/python3.10}/site-packages/markupsafe/_speedups.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/markupsafe/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen-1.46.0.dist-info/COPYING (100%) rename {lib/python3.11/site-packages/pip-22.3.1.dist-info => python/lib/python3.10/site-packages/mutagen-1.46.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen-1.46.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/mutagen-1.46.0.dist-info/RECORD rename {lib/python3.11/site-packages/pip-22.3.1.dist-info => python/lib/python3.10/site-packages/mutagen-1.46.0.dist-info}/REQUESTED (100%) rename {lib/python3.11/site-packages/tzlocal-5.0.1.dist-info => python/lib/python3.10/site-packages/mutagen-1.46.0.dist-info}/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen-1.46.0.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen-1.46.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_constants.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_file.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_iff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_riff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tags.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/mid3cp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/mid3iconv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/mid3v2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/moggsplit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/mutagen_inspect.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_tools/mutagen_pony.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/_vorbis.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/aac.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/ac3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/aiff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/apev2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/asf/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/asf/_attrs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/asf/_objects.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/asf/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/dsdiff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/dsf.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/easyid3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/easymp4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/flac.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_file.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_frames.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_id3v1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_specs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_tags.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/id3/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/m4a.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/monkeysaudio.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp3/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp3/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp4/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp4/_as_entry.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp4/_atom.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/mp4/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/musepack.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/ogg.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/oggflac.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/oggopus.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/oggspeex.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/oggtheora.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/oggvorbis.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/optimfrog.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/smf.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/tak.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/trueaudio.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/wave.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/mutagen/wavpack.py (100%) rename {lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info => python/lib/python3.10/site-packages/pip-22.0.2.dist-info}/INSTALLER (100%) rename {lib/python3.11/site-packages/pip-22.3.1.dist-info => python/lib/python3.10/site-packages/pip-22.0.2.dist-info}/LICENSE.txt (100%) create mode 100644 python/lib/python3.10/site-packages/pip-22.0.2.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD rename {lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info => python/lib/python3.10/site-packages/pip-22.0.2.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL create mode 100644 python/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt rename {lib/python3.11/site-packages/pip-22.3.1.dist-info => python/lib/python3.10/site-packages/pip-22.0.2.dist-info}/top_level.txt (100%) create mode 100644 python/lib/python3.10/site-packages/pip/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/__main__.py (100%) rename {lib => python/lib/python3.10}/site-packages/pip/_internal/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cache.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/cli/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/cli/autocompletion.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/command_context.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/cli/main.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/cli/spinners.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/cli/status_codes.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/cache.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/commands/check.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/freeze.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/commands/hash.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/commands/help.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/list.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/commands/search.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/configuration.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/distributions/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/exceptions.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/index/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/index/package_finder.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/index/sources.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/locations/base.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/main.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/candidate.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/models/direct_url.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/format_control.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/index.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/models/link.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/scheme.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/models/search_scope.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/selection_prefs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/models/target_python.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/models/wheel.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/network/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/network/auth.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/network/utils.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/network/xmlrpc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/metadata.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/metadata_editable.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/metadata_legacy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/wheel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/wheel_editable.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/build/wheel_legacy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/check.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/operations/freeze.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/install/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/operations/install/editable_legacy.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/legacy/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/resolvelib/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/resolvelib/base.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/resolvelib/reporter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/resolution/resolvelib/requirements.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/_log.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/appdirs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/compatibility_tags.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/datetime.py (100%) rename {lib => python/lib/python3.10}/site-packages/pip/_internal/utils/deprecation.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/direct_url_helpers.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/egg_link.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/encoding.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/filetypes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/glibc.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/hashes.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/inject_securetransport.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/misc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/models.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/packaging.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 python/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/urls.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/virtualenv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/utils/wheel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/vcs/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/vcs/git.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/vcs/mercurial.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_internal/vcs/versioncontrol.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/_cmd.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/adapter.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/compat.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/filewrapper.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/heuristics.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/cachecontrol/wrapper.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/certifi/__main__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py rename lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt => python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/compat.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py rename {lib/python3.11/site-packages/pip/_vendor/chardet/cli => python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata}/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/chardet/version.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/colorama/ansi.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/colorama/initialise.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/colorama/win32.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/colorama/winterm.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/compat.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/database.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/index.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/manifest.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/markers.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/resources.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/distlib/version.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/distro.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/constants.py rename {lib/python3.11/site-packages/pip/_vendor/chardet/metadata => python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters}/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/idna/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/idna/codec.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/idna/compat.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/idna/intranges.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/msgpack/_version.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/msgpack/exceptions.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/__about__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/_manylinux.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/_musllinux.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/_structures.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/markers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/requirements.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/specifiers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/tags.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/packaging/utils.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.10/site-packages/pip}/_vendor/packaging/version.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/build.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/check.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/compat.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/meta.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pep517/wrappers.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/pkg_resources/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/pkg_resources/py31compat.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/platformdirs/__main__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/platformdirs/api.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/platformdirs/macos.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/platformdirs/unix.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/platformdirs/windows.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/progress/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/progress/bar.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/progress/colors.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/progress/counter.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/progress/spinner.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/actions.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/pyparsing/common.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/pyparsing/unicode.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/pyparsing/util.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/models.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/requests/packages.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/requests/utils.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/compat/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/providers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/reporters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/resolvers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/resolvelib/structs.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_cell_widths.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_emoji_codes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_emoji_replace.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_extension.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_log_render.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_loop.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/_lru_cache.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_palettes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_pick.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_ratio.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_stack.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/_timer.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/abc.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/bar.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/color.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/color_triplet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/columns.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/console.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/constrain.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/containers.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/emoji.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/errors.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/json.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/live.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/live_render.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/measure.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/padding.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/pager.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/palette.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/region.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/rule.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/scope.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/screen.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/status.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/style.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/styled.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/tabulate.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/text.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/theme.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/rich/themes.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/rich/tree.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/six.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tenacity/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/_asyncio.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/_utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/after.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/before.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/before_sleep.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/nap.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tenacity/retry.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/stop.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/tenacity/tornadoweb.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py rename {lib/python3.11/site-packages/setuptools => python/lib/python3.10/site-packages/pip}/_vendor/typing_extensions.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.10/site-packages/pip/_vendor}/urllib3/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/appengine.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/contrib/socks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/fields.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/filepost.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/packages/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/request.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.10/site-packages/pip/_vendor}/urllib3/response.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/proxy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/queue.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.10/site-packages/pip/_vendor}/urllib3/util/request.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/response.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/ssl_.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/ssltransport.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/urllib3/util/timeout.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py rename {lib/python3.11/site-packages => python/lib/python3.10/site-packages/pip/_vendor}/urllib3/util/wait.py (100%) create mode 100644 python/lib/python3.10/site-packages/pip/_vendor/vendor.txt rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/webencodings/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/webencodings/labels.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/webencodings/mklabels.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/webencodings/tests.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/_vendor/webencodings/x_user_defined.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pip/py.typed (100%) create mode 100644 python/lib/python3.10/site-packages/pkg_resources/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/__about__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/packaging/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/packaging/_manylinux.py (100%) create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/_structures.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/packaging/markers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/packaging/requirements.py (100%) create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/packaging/tags.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pkg_resources/_vendor/packaging/utils.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.10/site-packages/pkg_resources}/_vendor/packaging/version.py (100%) create mode 100644 python/lib/python3.10/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 python/lib/python3.10/site-packages/pkg_resources/extern/__init__.py create mode 100644 python/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pycryptodomex-3.18.0.dist-info/AUTHORS.rst (100%) rename {lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info => python/lib/python3.10/site-packages/pycryptodomex-3.18.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pycryptodomex-3.18.0.dist-info/LICENSE.rst (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pycryptodomex-3.18.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/pycryptodomex-3.18.0.dist-info/RECORD rename {lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info => python/lib/python3.10/site-packages/pycryptodomex-3.18.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pycryptodomex-3.18.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pycryptodomex-3.18.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/cli.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/db.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/db_types.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/errors.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb/utils.py (100%) rename {lib/python3.11/site-packages/pytz-2023.3.dist-info => python/lib/python3.10/site-packages/pysondb_v2-2.0.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb_v2-2.0.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb_v2-2.0.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/pysondb_v2-2.0.0.dist-info/RECORD rename {lib/python3.11/site-packages/redis-4.5.5.dist-info => python/lib/python3.10/site-packages/pysondb_v2-2.0.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb_v2-2.0.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb_v2-2.0.0.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pysondb_v2-2.0.0.dist-info/top_level.txt (100%) rename {lib/python3.11/site-packages/redis-4.5.5.dist-info => python/lib/python3.10/site-packages/pytz-2024.1.dist-info}/INSTALLER (100%) rename {lib/python3.11/site-packages/pytz-2023.3.dist-info => python/lib/python3.10/site-packages/pytz-2024.1.dist-info}/LICENSE.txt (100%) create mode 100644 python/lib/python3.10/site-packages/pytz-2024.1.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/pytz-2024.1.dist-info/RECORD create mode 100644 python/lib/python3.10/site-packages/pytz-2024.1.dist-info/WHEEL rename {lib/python3.11/site-packages/pytz-2023.3.dist-info => python/lib/python3.10/site-packages/pytz-2024.1.dist-info}/top_level.txt (100%) rename {lib/python3.11/site-packages/pytz-2023.3.dist-info => python/lib/python3.10/site-packages/pytz-2024.1.dist-info}/zip-safe (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/lazy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/reference.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/tzfile.py (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/tzinfo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Abidjan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Accra (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Addis_Ababa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Algiers (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Asmara (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Asmera (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Bamako (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Bangui (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Banjul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Bissau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Blantyre (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Brazzaville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Bujumbura (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Cairo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Casablanca (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Ceuta (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Conakry (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Dakar (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Djibouti (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Douala (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/El_Aaiun (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Freetown (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Gaborone (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Harare (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Johannesburg (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Juba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Kampala (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Khartoum (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Kigali (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Kinshasa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Lagos (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Libreville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Lome (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Luanda (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Lubumbashi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Lusaka (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Malabo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Maputo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Maseru (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Mbabane (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Mogadishu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Monrovia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Nairobi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Ndjamena (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Niamey (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Nouakchott (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Ouagadougou (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Porto-Novo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Sao_Tome (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Timbuktu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Tripoli (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Tunis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Africa/Windhoek (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Adak (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Anchorage (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Anguilla (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Antigua (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Araguaina (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Catamarca (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Cordoba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Jujuy (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Mendoza (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Salta (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/San_Juan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/San_Luis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Tucuman (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Aruba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Asuncion (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Atikokan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Atka (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Bahia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Bahia_Banderas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Barbados (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Belem (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Belize (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Blanc-Sablon (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Boa_Vista (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Bogota (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Boise (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Buenos_Aires (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cambridge_Bay (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Campo_Grande (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cancun (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Caracas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Catamarca (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cayenne (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cayman (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Chicago (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Chihuahua (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Ciudad_Juarez (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Coral_Harbour (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cordoba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Costa_Rica (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Creston (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Cuiaba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Curacao (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Danmarkshavn (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Dawson (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Dawson_Creek (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Denver (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Detroit (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Dominica (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Edmonton (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Eirunepe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/El_Salvador (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Ensenada (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Fort_Nelson (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Fort_Wayne (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Fortaleza (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Glace_Bay (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Godthab rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Goose_Bay (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Grand_Turk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Grenada (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Guadeloupe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Guatemala (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Guayaquil (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Guyana (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Halifax (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Havana (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Hermosillo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Knox (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Marengo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Petersburg (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Tell_City (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Vevay (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Vincennes (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indiana/Winamac (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Indianapolis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Inuvik (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Iqaluit (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Jamaica (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Jujuy (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Juneau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Kentucky/Louisville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Kentucky/Monticello (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Knox_IN (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Kralendijk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/La_Paz (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Lima (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Los_Angeles (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Louisville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Lower_Princes (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Maceio (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Managua (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Manaus (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Marigot (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Martinique (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Matamoros (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Mazatlan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Mendoza (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Menominee (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Merida (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Metlakatla (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Mexico_City (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Miquelon rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Moncton (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Monterrey (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Montevideo (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Montreal rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Montserrat (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Nassau rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/New_York (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Nipigon rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Nome (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Noronha (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/North_Dakota/Center (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Nuuk rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Ojinaga (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Panama (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Pangnirtung (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Paramaribo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Phoenix (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Port-au-Prince (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Port_of_Spain (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Porto_Acre (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Porto_Velho (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Puerto_Rico (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Punta_Arenas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Rainy_River (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Rankin_Inlet (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Recife (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Regina (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Resolute (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Rio_Branco (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Rosario (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Santa_Isabel (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Santarem (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Santiago (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Santo_Domingo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Sao_Paulo (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Scoresbysund rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Shiprock (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Sitka (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Barthelemy (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Johns (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Kitts (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Lucia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Thomas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/St_Vincent (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Swift_Current (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Tegucigalpa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Thule (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Thunder_Bay rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Tijuana (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/America/Toronto rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Tortola (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Vancouver (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Virgin (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Whitehorse (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Winnipeg (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Yakutat (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/America/Yellowknife (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Antarctica/Casey rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Davis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Macquarie (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Mawson (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/McMurdo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Palmer (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Rothera (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/South_Pole (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Syowa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Antarctica/Troll (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Antarctica/Vostok rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Arctic/Longyearbyen (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Aden (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Almaty rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Amman (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Anadyr (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Aqtau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Aqtobe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ashgabat (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ashkhabad (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Atyrau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Baghdad (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Bahrain (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Baku (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Bangkok (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Barnaul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Beirut (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Bishkek (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Brunei (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Calcutta (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Chita (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Choibalsan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Chongqing (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Chungking (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Colombo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Dacca (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Damascus (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Dhaka (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Dili (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Dubai (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Dushanbe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Famagusta (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Gaza rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Harbin (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Hong_Kong (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Hovd (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Irkutsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Istanbul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Jakarta (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Jayapura (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Jerusalem (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kabul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kamchatka (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Karachi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kashgar (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kathmandu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Katmandu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Khandyga (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kolkata (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kuching (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Kuwait (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Macao (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Macau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Magadan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Makassar (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Manila (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Muscat (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Nicosia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Novokuznetsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Novosibirsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Omsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Oral (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Phnom_Penh (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Pontianak (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Pyongyang (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Qatar (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Qostanay rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Qyzylorda (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Rangoon (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Riyadh (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Asia/Saigon rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Sakhalin (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Samarkand (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Seoul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Shanghai (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Singapore (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Srednekolymsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Taipei (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tashkent (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tbilisi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tehran (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tel_Aviv (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Thimbu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Thimphu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tokyo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Tomsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ulan_Bator (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Urumqi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Ust-Nera (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Vientiane (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Vladivostok (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Yakutsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Yangon (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Yekaterinburg (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Asia/Yerevan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Azores (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Bermuda (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Canary (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Faeroe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Faroe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Madeira (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Reykjavik (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/South_Georgia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/St_Helena (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Atlantic/Stanley (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/ACT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Adelaide (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Brisbane (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Broken_Hill (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Canberra (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Currie (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Darwin (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Eucla (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Hobart (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/LHI (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Lindeman (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Lord_Howe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Melbourne (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/NSW (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/North (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Perth (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Queensland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/South (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Sydney (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Tasmania (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Victoria (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/West (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Australia/Yancowinna (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Brazil/Acre (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Brazil/DeNoronha (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Brazil/East (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Brazil/West (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/CET (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/CST6CDT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Atlantic (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Central (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/Canada/Eastern rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Mountain (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Newfoundland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Pacific (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Saskatchewan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Canada/Yukon (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Chile/Continental (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Chile/EasterIsland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Cuba (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/EET (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/EST (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/EST5EDT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Egypt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Eire (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+1 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+10 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+11 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+12 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+2 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+3 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+4 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+5 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+6 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+7 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+8 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT+9 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-1 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-10 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-11 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-12 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-13 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-14 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-2 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-3 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-4 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-5 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-6 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-7 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-8 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT-9 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/GMT0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/Greenwich (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/UCT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/UTC (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/Universal (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Etc/Zulu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Amsterdam (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Andorra (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Astrakhan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Athens (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Belfast (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Belgrade (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Berlin (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Bratislava (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Brussels (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Bucharest (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Budapest (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Busingen (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Chisinau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Copenhagen (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Dublin (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Gibraltar (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Guernsey (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Helsinki (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Isle_of_Man (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Istanbul (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Jersey (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Kaliningrad (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Kiev (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Kirov (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Kyiv (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Lisbon (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Ljubljana (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/London (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Luxembourg (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Madrid (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Malta (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Mariehamn (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Minsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Monaco (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Moscow (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Nicosia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Oslo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Paris (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Podgorica (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Prague (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Riga (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Rome (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Samara (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/San_Marino (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Sarajevo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Saratov (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Simferopol (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Skopje (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Sofia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Stockholm (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Tallinn (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Tirane (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Tiraspol (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Ulyanovsk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Uzhgorod (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Vaduz (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Vatican (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Vienna (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Vilnius (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Volgograd (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Warsaw (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Zagreb (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Zaporozhye (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Europe/Zurich (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Factory (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GB (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GB-Eire (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GMT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GMT+0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GMT-0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/GMT0 (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Greenwich (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/HST (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Hongkong (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Iceland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Antananarivo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Chagos (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Christmas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Cocos (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Comoro (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Kerguelen (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Mahe (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Maldives (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Mauritius (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Mayotte (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Indian/Reunion (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Iran (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Israel (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Jamaica (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Japan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Kwajalein (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Libya (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/MET (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/MST (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/MST7MDT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Mexico/BajaNorte (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Mexico/BajaSur (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Mexico/General (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/NZ (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/NZ-CHAT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Navajo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/PRC (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/PST8PDT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Apia (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Auckland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Bougainville (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Chatham (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Chuuk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Easter (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Efate (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Enderbury (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Fakaofo (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Fiji (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Funafuti (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Galapagos (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Gambier (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Guadalcanal (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Guam (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Honolulu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Johnston (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Kanton (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Kiritimati (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Kosrae (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Kwajalein (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Majuro (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Marquesas (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Midway (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Nauru (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Niue (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Norfolk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Noumea (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Pago_Pago (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Palau (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Pitcairn (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Pohnpei (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Ponape (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Port_Moresby (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Rarotonga (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Saipan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Samoa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Tahiti (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Tarawa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Tongatapu (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Truk (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Wake (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Wallis (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Pacific/Yap (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Poland (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Portugal (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/ROC (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/ROK (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Singapore (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Turkey (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/UCT (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Alaska (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Aleutian (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Arizona (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Central (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/East-Indiana (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Eastern (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Hawaii (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Indiana-Starke (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Michigan (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Mountain (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Pacific (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/US/Samoa (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/UTC (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Universal (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/W-SU (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/WET (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/pytz/zoneinfo/Zulu (100%) create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/leapseconds create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/zone.tab create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 python/lib/python3.10/site-packages/pytz/zoneinfo/zonenow.tab rename {lib/python3.11/site-packages/requests-2.31.0.dist-info => python/lib/python3.10/site-packages/redis-4.5.5.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis-4.5.5.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis-4.5.5.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/redis-4.5.5.dist-info/RECORD rename {lib/python3.11/site-packages/requests-2.31.0.dist-info => python/lib/python3.10/site-packages/redis-4.5.5.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis-4.5.5.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis-4.5.5.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/client.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/cluster.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/lock.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/parser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/retry.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/sentinel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/asyncio/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/backoff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/client.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/cluster.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/bf/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/bf/commands.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/bf/info.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/cluster.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/core.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/commands.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/edge.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/execution_plan.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/node.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/path.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/graph/query_result.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/helpers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/json/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/json/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/json/commands.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/json/decoders.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/json/path.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/parser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/redismodules.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/aggregation.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/commands.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/document.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/field.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/indexDefinition.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/query.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/querystring.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/reducers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/result.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/search/suggestion.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/sentinel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/timeseries/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/timeseries/commands.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/timeseries/info.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/commands/timeseries/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/crc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/credentials.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/lock.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/ocsp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/retry.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/sentinel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/typing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/redis/utils.py (100%) rename {lib/python3.11/site-packages/requests_file-1.5.1.dist-info => python/lib/python3.10/site-packages/requests-2.31.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests-2.31.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests-2.31.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/requests-2.31.0.dist-info/RECORD rename {lib/python3.11/site-packages/requests_file-1.5.1.dist-info => python/lib/python3.10/site-packages/requests-2.31.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests-2.31.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests-2.31.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/__version__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/_internal_utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/adapters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/api.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/requests/auth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/certs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/compat.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/requests/cookies.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/help.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/requests/hooks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/models.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/packages.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/sessions.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/requests/status_codes.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/requests/structures.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests/utils.py (100%) rename {lib/python3.11/site-packages/schedule-1.2.0.dist-info => python/lib/python3.10/site-packages/requests_file-1.5.1.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests_file-1.5.1.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests_file-1.5.1.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/requests_file-1.5.1.dist-info/RECORD rename {lib/python3.11/site-packages/schedule-1.2.0.dist-info => python/lib/python3.10/site-packages/requests_file-1.5.1.dist-info}/REQUESTED (100%) rename {lib/python3.11/site-packages/pytz-2023.3.dist-info => python/lib/python3.10/site-packages/requests_file-1.5.1.dist-info}/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests_file-1.5.1.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/requests_file.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule-1.2.0.dist-info/AUTHORS.rst (100%) rename {lib/python3.11/site-packages/selenium-3.14.1.dist-info => python/lib/python3.10/site-packages/schedule-1.2.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule-1.2.0.dist-info/LICENSE.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule-1.2.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/schedule-1.2.0.dist-info/RECORD rename {lib/python3.11/site-packages/selenium-3.14.1.dist-info => python/lib/python3.10/site-packages/schedule-1.2.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule-1.2.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule-1.2.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/schedule/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium-3.14.1.dist-info/DESCRIPTION.rst (100%) rename {lib/python3.11/site-packages/setuptools-65.5.1.dist-info => python/lib/python3.10/site-packages/selenium-3.14.1.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium-3.14.1.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/selenium-3.14.1.dist-info/RECORD rename {lib/python3.11/site-packages/setuptools-65.5.1.dist-info => python/lib/python3.10/site-packages/selenium-3.14.1.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium-3.14.1.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium-3.14.1.dist-info/metadata.json (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium-3.14.1.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/common/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/common/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/android/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/android/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/blackberry/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/blackberry/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/chrome/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/chrome/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/chrome/remote_connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/chrome/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/chrome/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/action_chains.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/action_builder.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/input_device.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/interaction.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/key_actions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/key_input.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/mouse_button.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/pointer_actions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/actions/pointer_input.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/alert.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/by.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/desired_capabilities.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/html5/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/html5/application_cache.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/keys.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/proxy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/touch_actions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/common/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/edge/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/edge/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/edge/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/edge/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/extension_connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/firefox_binary.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/firefox_profile.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/remote_connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/webdriver.xpi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/webdriver_prefs.json (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/webelement.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/ie/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/ie/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/ie/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/ie/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/opera/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/opera/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/opera/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/phantomjs/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/phantomjs/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/phantomjs/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/command.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/errorhandler.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/file_detector.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/getAttribute.js (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/isDisplayed.js (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/mobile.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/remote_connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/switch_to.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/remote/webelement.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/safari/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/safari/permissions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/safari/remote_connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/safari/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/safari/webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/abstract_event_listener.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/color.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/event_firing_webdriver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/events.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/expected_conditions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/select.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/ui.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/support/wait.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/webkitgtk/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/webkitgtk/options.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/webkitgtk/service.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/selenium/webdriver/webkitgtk/webdriver.py (100%) rename {lib/python3.11/site-packages/six-1.16.0.dist-info => python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info}/INSTALLER (100%) create mode 100644 python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info/LICENSE create mode 100644 python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info/RECORD rename {lib/python3.11/site-packages/six-1.16.0.dist-info => python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info/WHEEL rename {lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info => python/lib/python3.10/site-packages/selenium_requests-1.3.dist-info}/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/seleniumrequests/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/seleniumrequests/request.py (100%) rename {lib/python3.11/site-packages/soupsieve-2.4.1.dist-info => python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info}/INSTALLER (100%) rename {lib/python3.11/site-packages/setuptools-65.5.1.dist-info => python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info}/LICENSE (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/RECORD rename {lib/python3.11/site-packages/soupsieve-2.4.1.dist-info => python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/WHEEL create mode 100644 python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/entry_points.txt create mode 100644 python/lib/python3.10/site-packages/setuptools-59.6.0.dist-info/top_level.txt create mode 100644 python/lib/python3.10/site-packages/setuptools/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_deprecation_warning.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/register.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/command/upload.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/config.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_distutils/debug.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/py35compat.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/py38compat.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_imp.py (100%) rename {lib/python3.11/site-packages/pkg_resources/_vendor/jaraco => python/lib/python3.10/site-packages/setuptools/_vendor}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/more_itertools/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/more_itertools/recipes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/ordered_set.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/packaging/__about__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/packaging/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/packaging/_manylinux.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/packaging/markers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/packaging/requirements.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/_vendor/packaging/utils.py (100%) rename {lib/site-packages/pip => python/lib/python3.10/site-packages/setuptools}/_vendor/packaging/version.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 python/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 python/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 python/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/command/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/alias.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/bdist_egg.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/bdist_rpm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/build_clib.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/build_py.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/develop.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 python/lib/python3.10/site-packages/setuptools/command/install_scripts.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/launcher manifest.xml (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/py36compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/register.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/rotate.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/saveopts.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/sdist.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/setopt.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/test.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/command/upload.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/command/upload_docs.py create mode 100644 python/lib/python3.10/site-packages/setuptools/config.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/dep_util.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/depends.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 python/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 python/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 python/lib/python3.10/site-packages/setuptools/extern/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/glob.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 python/lib/python3.10/site-packages/setuptools/gui.exe rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/installer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/launch.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 python/lib/python3.10/site-packages/setuptools/msvc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/namespaces.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/package_index.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/py34compat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/sandbox.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/script (dev).tmpl (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/script.tmpl (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/unicode_utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/setuptools/version.py (100%) create mode 100644 python/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 python/lib/python3.10/site-packages/setuptools/windows_support.py rename {lib/python3.11/site-packages/tldextract-3.4.4.dist-info => python/lib/python3.10/site-packages/six-1.16.0.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/six-1.16.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/six-1.16.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/six-1.16.0.dist-info/RECORD rename {lib/python3.11/site-packages/tldextract-3.4.4.dist-info => python/lib/python3.10/site-packages/six-1.16.0.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/six-1.16.0.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/six-1.16.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/six.py (100%) rename {lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info => python/lib/python3.10/site-packages/soupsieve-2.4.1.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve-2.4.1.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/soupsieve-2.4.1.dist-info/RECORD rename {lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info => python/lib/python3.10/site-packages/soupsieve-2.4.1.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve-2.4.1.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve-2.4.1.dist-info/licenses/LICENSE.md (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/__meta__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/css_match.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/css_parser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/css_types.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/pretty.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/soupsieve/util.py (100%) rename {lib/python3.11/site-packages/tzlocal-5.0.1.dist-info => python/lib/python3.10/site-packages/tldextract-3.4.4.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract-3.4.4.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract-3.4.4.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/tldextract-3.4.4.dist-info/RECORD rename {lib/python3.11/site-packages/urllib3-1.26.2.dist-info => python/lib/python3.10/site-packages/tldextract-3.4.4.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract-3.4.4.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract-3.4.4.dist-info/entry_points.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract-3.4.4.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/.tld_set_snapshot (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/_version.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/cache.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/cli.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/remote.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/suffix_list.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/tldextract/tldextract.py (100%) rename {lib/python3.11/site-packages/urllib3-1.26.2.dist-info => python/lib/python3.10/site-packages/typing_extensions-4.6.3.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/typing_extensions-4.6.3.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/typing_extensions-4.6.3.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/typing_extensions-4.6.3.dist-info/RECORD rename {lib/python3.11/site-packages/websockets-11.0.3.dist-info => python/lib/python3.10/site-packages/typing_extensions-4.6.3.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/typing_extensions-4.6.3.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/typing_extensions.py (100%) rename {lib/python3.11/site-packages/websockets-11.0.3.dist-info => python/lib/python3.10/site-packages/tzlocal-5.2.dist-info}/INSTALLER (100%) rename {lib/python3.11/site-packages/tzlocal-5.0.1.dist-info => python/lib/python3.10/site-packages/tzlocal-5.2.dist-info}/LICENSE.txt (100%) create mode 100644 python/lib/python3.10/site-packages/tzlocal-5.2.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/tzlocal-5.2.dist-info/RECORD create mode 100644 python/lib/python3.10/site-packages/tzlocal-5.2.dist-info/WHEEL rename {lib/python3.11/site-packages/tzlocal-5.0.1.dist-info => python/lib/python3.10/site-packages/tzlocal-5.2.dist-info}/top_level.txt (100%) create mode 100644 python/lib/python3.10/site-packages/tzlocal/__init__.py rename {lib/python3.11/site-packages/websockets => python/lib/python3.10/site-packages/tzlocal}/py.typed (100%) create mode 100644 python/lib/python3.10/site-packages/tzlocal/unix.py create mode 100644 python/lib/python3.10/site-packages/tzlocal/utils.py create mode 100644 python/lib/python3.10/site-packages/tzlocal/win32.py create mode 100644 python/lib/python3.10/site-packages/tzlocal/windows_tz.py rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/urllib3-1.26.2.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3-1.26.2.dist-info/LICENSE.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3-1.26.2.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/urllib3-1.26.2.dist-info/RECORD rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/urllib3-1.26.2.dist-info}/REQUESTED (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3-1.26.2.dist-info/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3-1.26.2.dist-info/top_level.txt (100%) create mode 100644 python/lib/python3.10/site-packages/urllib3/__init__.py rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.10/site-packages}/urllib3/_collections.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/_version.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/connectionpool.py (100%) rename {lib/python3.11/site-packages/setuptools/_vendor => python/lib/python3.10/site-packages/urllib3/contrib}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/_appengine_environ.py (100%) rename {lib/python3.11/site-packages/setuptools/_vendor/jaraco => python/lib/python3.10/site-packages/urllib3/contrib/_securetransport}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/_securetransport/bindings.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/_securetransport/low_level.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/appengine.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/ntlmpool.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/pyopenssl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/securetransport.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/contrib/socks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/fields.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/filepost.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/packages/__init__.py (100%) rename {lib/python3.11/site-packages/urllib3/contrib => python/lib/python3.10/site-packages/urllib3/packages/backports}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/packages/backports/makefile.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/packages/six.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/packages/ssl_match_hostname/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/poolmanager.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/request.py (100%) create mode 100644 python/lib/python3.10/site-packages/urllib3/response.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/proxy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/queue.py (100%) create mode 100644 python/lib/python3.10/site-packages/urllib3/util/request.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/response.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/retry.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/ssl_.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/ssltransport.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/timeout.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/urllib3/util/url.py (100%) create mode 100644 python/lib/python3.10/site-packages/urllib3/util/wait.py rename {lib/python3.11/site-packages/zipp-3.15.0.dist-info => python/lib/python3.10/site-packages/websockets-11.0.3.dist-info}/INSTALLER (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets-11.0.3.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets-11.0.3.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/websockets-11.0.3.dist-info/RECORD rename {lib/python3.11/site-packages/zipp-3.15.0.dist-info => python/lib/python3.10/site-packages/websockets-11.0.3.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/websockets-11.0.3.dist-info/WHEEL rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets-11.0.3.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/auth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/client.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/datastructures.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/extensions/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/extensions/base.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/extensions/permessage_deflate.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/frames.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/headers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/http.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/http11.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/imports.py (100%) rename {lib/python3.11/site-packages/urllib3/contrib/_securetransport => python/lib/python3.10/site-packages/websockets/legacy}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/async_timeout.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/auth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/client.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/compatibility.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/framing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/handshake.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/http.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/protocol.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/legacy/server.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/protocol.py (100%) rename {lib/python3.11/site-packages/werkzeug => python/lib/python3.10/site-packages/websockets}/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/server.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/speedups.c (100%) create mode 100755 python/lib/python3.10/site-packages/websockets/speedups.cpython-310-x86_64-linux-gnu.so rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/streams.py (100%) rename {lib/python3.11/site-packages/urllib3/packages/backports => python/lib/python3.10/site-packages/websockets/sync}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/client.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/compatibility.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/connection.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/messages.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/server.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/sync/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/typing.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/uri.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/websockets/version.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/_internal.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/_reloader.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/datastructures.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/datastructures.pyi (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/console.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/repr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/ICON_LICENSE.md (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/console.png (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/debugger.js (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/less.png (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/more.png (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/shared/style.css (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/debug/tbtools.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/formparser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/http.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/local.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/dispatcher.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/http_proxy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/lint.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/profiler.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/proxy_fix.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/middleware/shared_data.py (100%) rename lib/python3.11/site-packages/websockets/legacy/__init__.py => python/lib/python3.10/site-packages/werkzeug/py.typed (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/converters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/exceptions.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/map.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/matcher.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/routing/rules.py (100%) rename {lib/python3.11/site-packages/websockets/sync => python/lib/python3.10/site-packages/werkzeug/sansio}/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/sansio/http.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/sansio/multipart.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/sansio/request.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/sansio/response.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/sansio/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/security.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/serving.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/test.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/testapp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/urls.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/user_agent.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/utils.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/wrappers/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/wrappers/request.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/wrappers/response.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/werkzeug/wsgi.py (100%) rename {lib/site-packages/pip-23.2.1.dist-info => python/lib/python3.10/site-packages/wget-3.2.dist-info}/INSTALLER (100%) create mode 100644 python/lib/python3.10/site-packages/wget-3.2.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/wget-3.2.dist-info/RECORD rename {lib/site-packages/pip-23.2.1.dist-info => python/lib/python3.10/site-packages/wget-3.2.dist-info}/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/wget-3.2.dist-info/WHEEL rename {lib/python3.11/site-packages/wget-3.2-py3.11.egg-info => python/lib/python3.10/site-packages/wget-3.2.dist-info}/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/wget.py (100%) rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info}/AUTHORS (100%) rename lib/site-packages/pip-23.2.1.dist-info/top_level.txt => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info/INSTALLER (100%) rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info}/LICENSE (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info/METADATA create mode 100644 python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info/RECORD rename lib/python3.11/site-packages/werkzeug/sansio/__init__.py => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info/REQUESTED (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info/WHEEL rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info}/entry_points.txt (100%) rename {lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info => python/lib/python3.10/site-packages/yt_dlp-2023.10.13.dist-info}/top_level.txt (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/YoutubeDL.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/__init__.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/__main__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/__pyinstaller/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/__pyinstaller/hook-yt_dlp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/aes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/cache.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/casefold.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/_deprecated.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/_legacy.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/compat_utils.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/compat/functools.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/compat/imghdr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/compat/shutil.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/types.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/urllib/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/compat/urllib/request.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/cookies.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/dependencies/Cryptodome.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/dependencies/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/common.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/dash.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/external.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/f4m.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/fc2.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/fragment.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/hls.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/http.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/ism.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/mhtml.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/niconico.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/rtmp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/rtsp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/downloader/websocket.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/downloader/youtube_live_chat.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/_extractors.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/abc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/abcnews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/abcotvs.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/abematv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/academicearth.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/acast.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/acfun.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/adn.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/adobeconnect.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/adobepass.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/adobetv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/adultswim.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/aenetworks.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/aeonco.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/afreecatv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/agora.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/airmozilla.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/airtv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/aitube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/aliexpress.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/aljazeera.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/allocine.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/alphaporno.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/alsace20tv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/alura.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/amara.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/amazon.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/amazonminitv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/amcnetworks.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/americastestkitchen.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/amp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/anchorfm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/angel.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/antenna.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/anvato.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/aol.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/apa.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/aparat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/appleconnect.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/applepodcasts.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/appletrailers.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/archiveorg.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/arcpublishing.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ard.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/arkena.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/arnes.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/arte.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/atresplayer.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/atscaleconf.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/atttechchannel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/atvat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/audimedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/audioboom.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/audiodraft.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/audiomack.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/audius.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/awaan.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/aws.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/axs.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/azmedien.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/baidu.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/banbye.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bandaichannel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bandcamp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bannedvideo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bbc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/beatbump.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/beatport.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/beeg.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/behindkink.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bellmedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/berufetv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bfi.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bfmtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bibeltv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bigflix.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bigo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bild.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bilibili.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/biobiochiletv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/biqle.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bitchute.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bitwave.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/blackboardcollaborate.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bleacherreport.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/blerp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/blogger.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bloomberg.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bokecc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bongacams.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bostonglobe.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/box.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/boxcast.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bpb.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/br.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/brainpop.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/bravotv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/breakcom.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/breitbart.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/brightcove.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/brilliantpala.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/bundesliga.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/businessinsider.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/buzzfeed.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/byutv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/c56.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cableav.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/callin.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/caltrans.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cam4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/camdemy.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/camfm.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cammodels.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/camsoda.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/camtasia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/camwithher.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/canal1.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/canalalpha.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/canalc2.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/canalplus.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/caracoltv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/carambatv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cartoonnetwork.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cbc.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cbs.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cbsinteractive.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cbsnews.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cbssports.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ccc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ccma.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cctv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cda.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cellebrite.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ceskatelevize.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cgtn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/channel9.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/charlierose.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/chaturbate.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/chilloutzone.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/chingari.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/chirbit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cinchcast.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cinemax.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cinetecamilano.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cineverse.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ciscolive.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ciscowebex.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cjsw.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/clipchamp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cliphunter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/clippit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cliprs.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/clipsyndicate.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/closertotruth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cloudflarestream.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cloudy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/clubic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/clyp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cmt.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cnbc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cnn.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/comedycentral.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/common.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/commonmistakes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/commonprotocols.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/condenast.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/contv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/corus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/coub.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cozytv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cpac.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cracked.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/crackle.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/craftsy.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/crooksandliars.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/crowdbunker.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/crtvg.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/crunchyroll.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cspan.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ctsnews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ctv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ctvnews.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cultureunplugged.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/curiositystream.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/cwtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/cybrary.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dacast.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/daftsex.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dailymail.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dailymotion.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dailywire.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/damtomo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/daum.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/daystar.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dbtv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dctp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/deezer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/defense.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/democracynow.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/detik.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/deuxm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dfb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dhm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/digg.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/digitalconcerthall.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/digiteka.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/discogs.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/discovery.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/discoverygo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/disney.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dispeak.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dlf.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dlive.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dotsub.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/douyutv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dplay.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/drbonanza.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dreisat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/drooble.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dropbox.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dropout.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/drtuber.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/drtv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dtube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/duboku.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/dumpert.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dvtv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/dw.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/eagleplatform.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ebaumsworld.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ebay.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/echomsk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/egghead.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ehow.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/eighttracks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/einthusan.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/eitb.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/elevensports.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ellentube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/elonet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/elpais.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/embedly.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/engadget.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/epicon.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/eplus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/epoch.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/eporner.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/erocast.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/eroprofile.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ertgr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/escapist.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/espn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/esri.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ettutv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/europa.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/europeantour.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/eurosport.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/euscreen.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/expotv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/expressen.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/extractors.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/extremetube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/eyedotv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/facebook.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fancode.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/faz.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/fc2.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fczenit.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/fifa.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/filmmodu.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/filmon.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/filmweb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/firsttv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fivetv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/flickr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/folketinget.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/footyroom.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/formula1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fourtube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fourzerostudio.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/fox.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fox9.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/foxgay.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/foxnews.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/foxsports.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fptplay.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/franceinter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/francetv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/freesound.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/freespeech.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/freetv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/frontendmasters.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/fujitv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/funimation.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/funk.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/funker530.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fusion.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/fuyintv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gab.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gaia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gameinformer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gamejolt.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gamespot.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gamestar.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gaskrank.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gazeta.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/gdcvault.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gedidigital.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/generic.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/genericembeds.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/genius.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gettr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gfycat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/giantbomb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/giga.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gigya.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/glide.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/globalplayer.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/globo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/glomex.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/gmanetwork.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/go.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/godtube.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/gofile.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/golem.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/goodgame.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/googledrive.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/googlepodcasts.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/googlesearch.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/goplay.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gopro.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/goshgay.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gotostage.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/gputechconf.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/gronkh.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/groupon.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/harpodeon.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hbo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hearthisat.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/heise.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hellporno.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/helsinki.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hgtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hidive.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/historicfilms.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hitbox.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hitrecord.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hketv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hollywoodreporter.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/holodex.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hotnewhiphop.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hotstar.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/howcast.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/howstuffworks.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hrefli.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hrfensehen.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hrti.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hse.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/huajiao.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/huffpost.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/hungama.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/huya.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hypem.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hypergryph.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/hytale.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/icareus.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ichinanalive.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/idolplus.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ign.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/iheart.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/iltalehti.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/imdb.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/imggaming.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/imgur.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ina.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/inc.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/indavideo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/infoq.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/instagram.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/internazionale.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/internetvideoarchive.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/iprima.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/iqiyi.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/islamchannel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/israelnationalnews.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/itprotv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/itv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ivi.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ivideon.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/iwara.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ixigua.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/izlesene.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/jable.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/jamendo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/japandiet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/jeuxvideo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/jixie.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/joj.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/jove.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/jstream.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/jtbc.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/jwplatform.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/kakao.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kaltura.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kanal2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kankanews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/karaoketv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/karrierevideos.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/keezmovies.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kelbyone.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/khanacademy.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/kick.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kicker.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kickstarter.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kinja.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kinopoisk.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/kommunetv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kompas.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/konserthusetplay.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/koo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/krasview.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ku6.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/kusi.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/kuwo.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/la7.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/laola1tv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/lastfm.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/lazy_extractors.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/lbry.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lci.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lcp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lecture2go.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/lecturio.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/leeco.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lefigaro.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/lego.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lemonde.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lenta.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/libraryofcongress.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/libsyn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lifenews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/likee.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/limelight.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/linkedin.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/linuxacademy.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/liputan6.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/listennotes.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/litv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/livejournal.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/livestream.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/livestreamfails.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lnkgo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/localnews8.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lovehomeporn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lrt.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lumni.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/lynda.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/m6.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/magellantv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/magentamusik360.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mailru.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mainstreaming.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/malltv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mangomolo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/manoto.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/manyvids.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/maoritv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/markiza.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/massengeschmacktv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/masters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/matchtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mbn.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mdr.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/medaltv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mediaite.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mediaklikk.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/medialaan.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mediaset.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mediasite.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mediastream.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mediaworksnz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/medici.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/megaphone.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/megatvcom.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/meipai.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/melonvod.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/meta.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/metacafe.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/metacritic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mgoon.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mgtv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/miaopai.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/microsoftembed.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/microsoftstream.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/microsoftvirtualacademy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mildom.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/minds.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ministrygrid.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/minoto.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/miomio.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mirrativ.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mirrorcouk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mitele.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mixch.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mixcloud.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mlb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mlssoccer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mnet.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mocha.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/moevideo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mofosex.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mojvideo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/monstercat.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/morningstar.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/motherless.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/motorsport.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/movieclips.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/moviepilot.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/moview.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/moviezine.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/movingimage.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/msn.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mtv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/muenchentv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/murrtube.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/museai.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/musescore.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/musicdex.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mwave.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mxplayer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/mychannels.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/myspace.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/myspass.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/myvi.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/myvideoge.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/myvidster.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/mzaalo.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/n1.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nate.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nationalgeographic.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/naver.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nba.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nbc.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ndr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ndtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nebula.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nekohacker.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nerdcubed.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/neteasemusic.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/netverse.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/netzkino.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/newgrounds.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/newspicks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/newstube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/newsy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nextmedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nexx.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nfb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nfhsnetwork.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nfl.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nhk.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nhl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nick.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/niconico.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/niconicochannelplus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ninecninemedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ninegag.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ninenow.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nintendo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nitter.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/njpwworld.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nobelprize.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/noice.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nonktube.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/noodlemagazine.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/noovo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/normalboots.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nosnl.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nosvideo.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nova.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/novaplay.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nowness.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/noz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/npo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/npr.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nrk.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nrl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ntvcojp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ntvde.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ntvru.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/nubilesporn.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nuevo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nuvid.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nytimes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nzherald.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nzonscreen.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/nzz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/odatv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/odkmedia.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/odnoklassniki.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/oftv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/oktoberfesttv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/olympics.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/on24.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/once.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ondemandkorea.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/onefootball.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/onenewsnz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/oneplace.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/onet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/onionstudios.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ooyala.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/opencast.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/openload.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/openrec.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ora.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/orf.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/outsidetv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/owncloud.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/packtpub.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/palcomp3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pandoratv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/panopto.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/paramountplus.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/parler.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/parlview.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/patreon.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pbs.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pearvideo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/peekvids.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/peertube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/peertv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/peloton.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/people.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/performgroup.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/periscope.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pgatour.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/philharmoniedeparis.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/phoenix.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/photobucket.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/piapro.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/piaulizaportal.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/picarto.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/piksel.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pinkbike.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pinterest.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pixivsketch.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pladform.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/planetmarathi.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/platzi.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/playfm.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/playplustv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/plays.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/playstuff.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/playsuisse.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/playtvak.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/playvid.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/playwire.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pluralsight.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/plutotv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/podbayfm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/podchaser.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/podomatic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pokemon.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pokergo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/polsatgo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/polskieradio.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/popcorntimes.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/popcorntv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/porn91.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pornbox.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/porncom.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pornez.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pornflip.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pornhd.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pornhub.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pornotube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pornovoisines.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pornoxo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/pr0gramm.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/prankcast.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/premiershiprugby.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/presstv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/projectveritas.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/prosiebensat1.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/prx.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/puhutv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/puls4.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/pyvideo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/qdance.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/qingting.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/qqmusic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/r7.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/radiko.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radiobremen.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/radiocanada.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radiode.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/radiofrance.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radiojavan.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radiokapital.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radiozet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/radlive.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rai.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/raywenderlich.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rbgtum.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rbmaradio.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rcs.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rcti.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rds.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/recurbate.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/redbee.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/redbulltv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/reddit.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/redgifs.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/redtube.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/regiotv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rentv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/restudy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/reuters.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/reverbnation.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rheinmaintv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rice.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rmcdecouverte.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rockstargames.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rokfin.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/roosterteeth.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rottentomatoes.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rozhlas.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rte.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtl2.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtlnl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtnews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtp.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtrfm.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rts.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rtvcplay.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtve.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtvnh.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rtvs.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rtvslo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ruhd.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rule34video.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/rumble.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rutube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/rutv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ruutu.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ruv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/s4c.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/safari.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/saitosan.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/samplefocus.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sapo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/savefrom.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sbs.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/screen9.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/screencast.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/screencastify.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/screencastomatic.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/scrippsnetworks.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/scrolller.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/scte.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/seeker.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/senalcolombia.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/senategov.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sendtonews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/servus.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sevenplus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sexu.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/seznamzpravy.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/shahid.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/shared.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sharevideos.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/shemaroome.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/showroomlive.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sibnet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/simplecast.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sina.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sixplay.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/skeb.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sky.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/skyit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/skylinewebcams.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/skynewsarabia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/skynewsau.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/slideshare.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/slideslive.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/slutload.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/smotrim.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/snotr.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sohu.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sonyliv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/soundcloud.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/soundgasm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/southpark.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sovietscloset.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spankbang.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spankwire.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spiegel.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spike.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sport5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sportbox.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sportdeutschland.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spotify.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/spreaker.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/springboardplatform.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sprout.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/srgssr.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/srmediathek.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/stacommu.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/stageplus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/stanfordoc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/startrek.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/startv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/steam.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/stitcher.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/storyfire.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/streamable.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/streamcloud.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/streamcz.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/streamff.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/streetvoice.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/stretchinternet.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/stripchat.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/stv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/substack.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sunporno.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/sverigesradio.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/svt.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/swearnet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/swrmediathek.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/syfy.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/syvdk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/sztvhu.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tagesschau.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tass.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tbs.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tbsjp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tdslifeway.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/teachable.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/teachertube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/teachingchannel.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/teamcoco.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/teamtreehouse.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/techtalks.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ted.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tele13.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tele5.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telebruxelles.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/telecaribe.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telecinco.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telegraaf.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telegram.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telemb.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/telemundo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telequebec.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/teletask.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/telewebion.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tempo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tencent.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tennistv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tenplay.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/testurl.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tf1.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tfo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/theholetv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/theintercept.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/theplatform.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/thestar.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/thesun.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/theweatherchannel.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/thisamericanlife.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/thisav.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/thisoldhouse.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/thisvid.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/threeqsdn.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/threespeak.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tiktok.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tinypic.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tmz.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tnaflix.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/toggle.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/toggo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tokentube.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tonline.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/toongoggles.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/toutv.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/toypics.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/traileraddict.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/triller.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/trilulilu.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/trovo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/trtcocuk.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/trueid.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/trunews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/truth.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/trutv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tube8.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tubetugraz.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tubitv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tumblr.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tunein.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tunepk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/turbo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/turner.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tv2.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tv24ua.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tv2dk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tv2hu.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tv4.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tv5mondeplus.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tv5unis.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tva.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvanouvelles.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvc.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tver.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvigle.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tviplayer.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvland.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvn24.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvnet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvnoe.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvnow.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tvopengr.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tvp.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tvplay.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/tvplayer.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/tweakers.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/twentyfourvideo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/twentymin.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/twentythreevideo.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/twitcasting.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/twitch.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/twitter.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/txxx.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/udemy.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/udn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ufctv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ukcolumn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/uktvplay.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/umg.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/unistra.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/unity.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/unscripted.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/unsupported.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/uol.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/uplynk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/urort.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/urplay.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/usanetwork.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/usatoday.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ustream.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ustudio.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/utreon.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/varzesh3.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vbox7.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/veehd.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/veo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/veoh.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vesti.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vevo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vgtv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vh1.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vice.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vidbit.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/viddler.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/videa.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/videocampus_sachsen.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/videodetective.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/videofyme.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/videoken.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/videomore.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/videopress.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vidio.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vidlii.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/viewlift.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/viidea.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/viki.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vimeo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vimm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vimple.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vine.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/viqeo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/viu.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vk.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vocaroo.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vodlocker.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vodpl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vodplatform.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/voicerepublic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/voicy.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/volejtv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/voot.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/voxmedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vrak.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vrt.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vrv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/vshare.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vtm.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vuclip.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vupload.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vvvvid.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vyborymos.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/vzaar.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wakanim.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/walla.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wasdtv.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/washingtonpost.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wat.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/watchbox.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/watchindianporn.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wdr.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/webcamerapl.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/webcaster.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/webofstories.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/weibo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/weiqitv.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/weverse.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wevidi.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/weyyak.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/whowatch.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/whyp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wikimedia.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/willow.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wimbledon.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wimtv.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wistia.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wordpress.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/worldstarhiphop.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wppilot.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wrestleuniverse.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wsj.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/wwe.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/wykop.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xanimu.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xbef.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xboxclips.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xfileshare.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/xhamster.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/ximalaya.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xinpianchang.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xminus.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xnxx.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xstream.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/xtube.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xuite.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xvideos.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/xxxymovies.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/yahoo.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yandexdisk.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yandexmusic.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yandexvideo.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yapfiles.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/yappy.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/yesjapan.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yinyuetai.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yle_areena.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/ynet.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/youjizz.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/youku.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/younow.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/youporn.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yourporn.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/yourupload.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/youtube.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zaiko.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/zapiks.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zattoo.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zdf.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zee5.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/zeenews.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/extractor/zhihu.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zingmp3.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zoom.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/extractor/zype.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/jsinterp.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/minicurses.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/networking/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/networking/_helper.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/networking/_urllib.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/networking/common.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/networking/exceptions.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/options.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/plugins.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/__init__.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/postprocessor/common.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/postprocessor/embedthumbnail.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/postprocessor/exec.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/postprocessor/ffmpeg.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/metadataparser.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/postprocessor/modify_chapters.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/sponskrub.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/sponsorblock.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/postprocessor/xattrpp.py (100%) create mode 100644 python/lib/python3.10/site-packages/yt_dlp/socks.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/update.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/__init__.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/_deprecated.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/_legacy.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/_utils.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/networking.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/progress.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/utils/traversal.py create mode 100644 python/lib/python3.10/site-packages/yt_dlp/version.py rename {lib/python3.11 => python/lib/python3.10}/site-packages/yt_dlp/webvtt.py (100%) create mode 100644 python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/INSTALLER rename {lib/python3.11 => python/lib/python3.10}/site-packages/zipp-3.15.0.dist-info/LICENSE (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/zipp-3.15.0.dist-info/METADATA (100%) create mode 100644 python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/RECORD rename lib/site-packages/pip/_internal/operations/__init__.py => python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/REQUESTED (100%) rename {lib/python3.11/site-packages/pip-22.3.1.dist-info => python/lib/python3.10/site-packages/zipp-3.15.0.dist-info}/WHEEL (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/zipp-3.15.0.dist-info/top_level.txt (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/zipp/__init__.py (100%) rename {lib/python3.11 => python/lib/python3.10}/site-packages/zipp/py310compat.py (100%) create mode 100644 python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt create mode 100644 python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD (100%) rename lib/site-packages/pip/_internal/operations/build/__init__.py => python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED (100%) rename {lib/python3.11/site-packages/setuptools-65.5.1.dist-info => python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info}/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE rename {lib => python/lib}/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD (100%) rename lib/site-packages/pip/_internal/resolution/__init__.py => python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED (100%) rename {lib => python/lib}/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py rename lib/site-packages/pip/_internal/resolution/legacy/__init__.py => python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi (100%) create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py rename lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py => python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi (100%) create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/PEM.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/IO/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/Primality.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi rename {lib/site-packages/pip/_internal/utils => python/lib/python3.11/site-packages/Cryptodome/Math}/__init__.py (100%) create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py rename lib/site-packages/pip/_vendor/chardet/cli/__init__.py => python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi (100%) create mode 100755 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so create mode 100755 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Random/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Random/random.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Random/random.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/pss.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/Counter.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/Padding.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi create mode 100755 python/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/asn1.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/number.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/number.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/strxor.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi create mode 100644 python/lib/python3.11/site-packages/Cryptodome/__init__.py create mode 100644 python/lib/python3.11/site-packages/Cryptodome/__init__.pyi rename lib/site-packages/pip/_vendor/chardet/metadata/__init__.py => python/lib/python3.11/site-packages/Cryptodome/py.typed (100%) create mode 100644 python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD (100%) rename lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py => python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED (100%) rename {lib/site-packages/pip-23.2.1.dist-info => python/lib/python3.11/site-packages/Flask-2.2.5.dist-info}/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD (100%) rename lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py => python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED (100%) create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD (100%) rename lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py => python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED (100%) rename {lib => python/lib}/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD (100%) rename lib/site-packages/pip/_vendor/urllib3/packages/__init__.py => python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED (100%) rename {lib/python3.11/site-packages/zipp-3.15.0.dist-info => python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info}/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt rename {lib => python/lib}/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so (100%) rename {lib => python/lib}/python3.11/site-packages/_distutils_hack/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/_distutils_hack/override.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/__init__.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/events.py rename {lib/site-packages/pip/_vendor/urllib3/packages/backports => python/lib/python3.11/site-packages/apscheduler/executors}/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/asyncio.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/base.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/base_py3.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/debug.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/gevent.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/pool.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/tornado.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/executors/twisted.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/job.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/__init__.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/base.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/memory.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/redis.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/background.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/base.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/qt.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/__init__.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/base.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/combining.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/date.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/triggers/interval.py create mode 100644 python/lib/python3.11/site-packages/apscheduler/util.py create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt rename {lib/python3.11/site-packages/tzlocal-5.0.1.dist-info => python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info}/zip-safe (100%) create mode 100644 python/lib/python3.11/site-packages/async_timeout/__init__.py create mode 100644 python/lib/python3.11/site-packages/async_timeout/py.typed create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS create mode 100644 python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE create mode 100644 python/lib/python3.11/site-packages/brotli.py rename {lib => python/lib}/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO (100%) rename {lib => python/lib}/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt (100%) rename {lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info => python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info}/dependency_links.txt (100%) rename {lib => python/lib}/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt (100%) rename {lib => python/lib}/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt (100%) rename lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/dependency_links.txt => python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt (100%) create mode 100644 python/lib/python3.11/site-packages/bs4/__init__.py create mode 100644 python/lib/python3.11/site-packages/bs4/builder/__init__.py create mode 100644 python/lib/python3.11/site-packages/bs4/builder/_html5lib.py create mode 100644 python/lib/python3.11/site-packages/bs4/builder/_htmlparser.py create mode 100644 python/lib/python3.11/site-packages/bs4/builder/_lxml.py create mode 100644 python/lib/python3.11/site-packages/bs4/css.py create mode 100644 python/lib/python3.11/site-packages/bs4/dammit.py create mode 100644 python/lib/python3.11/site-packages/bs4/diagnose.py create mode 100644 python/lib/python3.11/site-packages/bs4/element.py create mode 100644 python/lib/python3.11/site-packages/bs4/formatter.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/__init__.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_builder.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_builder_registry.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_css.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_dammit.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_docs.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_element.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_formatter.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_fuzz.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_html5lib.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_htmlparser.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_lxml.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_navigablestring.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_pageelement.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_soup.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_tag.py create mode 100644 python/lib/python3.11/site-packages/bs4/tests/test_tree.py create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/certifi-2023.5.7.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/top_level.txt rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/certifi/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/certifi/__main__.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/certifi/cacert.pem (100%) create mode 100644 python/lib/python3.11/site-packages/certifi/core.py create mode 100644 python/lib/python3.11/site-packages/certifi/py.typed create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED rename {lib => python/lib}/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/__init__.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/api.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/assets/__init__.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/cd.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/cli/normalizer.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/constant.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/legacy.py rename {lib => python/lib}/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so (100%) create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/md.py rename {lib => python/lib}/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so (100%) create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/models.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/py.typed create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/utils.py create mode 100644 python/lib/python3.11/site-packages/charset_normalizer/version.py create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/click-8.1.3.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/click/__init__.py create mode 100644 python/lib/python3.11/site-packages/click/_compat.py create mode 100644 python/lib/python3.11/site-packages/click/_termui_impl.py create mode 100644 python/lib/python3.11/site-packages/click/_textwrap.py create mode 100644 python/lib/python3.11/site-packages/click/_winconsole.py create mode 100644 python/lib/python3.11/site-packages/click/core.py create mode 100644 python/lib/python3.11/site-packages/click/decorators.py create mode 100644 python/lib/python3.11/site-packages/click/exceptions.py create mode 100644 python/lib/python3.11/site-packages/click/formatting.py create mode 100644 python/lib/python3.11/site-packages/click/globals.py create mode 100644 python/lib/python3.11/site-packages/click/parser.py create mode 100644 python/lib/python3.11/site-packages/click/py.typed create mode 100644 python/lib/python3.11/site-packages/click/shell_completion.py create mode 100644 python/lib/python3.11/site-packages/click/termui.py create mode 100644 python/lib/python3.11/site-packages/click/testing.py create mode 100644 python/lib/python3.11/site-packages/click/types.py create mode 100644 python/lib/python3.11/site-packages/click/utils.py rename {lib => python/lib}/python3.11/site-packages/distutils-precedence.pth (100%) create mode 100644 python/lib/python3.11/site-packages/filelock-3.12.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/filelock-3.12.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/filelock-3.12.2.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/filelock-3.12.2.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/filelock-3.12.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE create mode 100644 python/lib/python3.11/site-packages/filelock/__init__.py create mode 100644 python/lib/python3.11/site-packages/filelock/_api.py create mode 100644 python/lib/python3.11/site-packages/filelock/_error.py create mode 100644 python/lib/python3.11/site-packages/filelock/_soft.py create mode 100644 python/lib/python3.11/site-packages/filelock/_unix.py create mode 100644 python/lib/python3.11/site-packages/filelock/_util.py create mode 100644 python/lib/python3.11/site-packages/filelock/_windows.py create mode 100644 python/lib/python3.11/site-packages/filelock/py.typed create mode 100644 python/lib/python3.11/site-packages/filelock/version.py create mode 100644 python/lib/python3.11/site-packages/flask/__init__.py create mode 100644 python/lib/python3.11/site-packages/flask/__main__.py create mode 100644 python/lib/python3.11/site-packages/flask/app.py create mode 100644 python/lib/python3.11/site-packages/flask/blueprints.py create mode 100644 python/lib/python3.11/site-packages/flask/cli.py create mode 100644 python/lib/python3.11/site-packages/flask/config.py create mode 100644 python/lib/python3.11/site-packages/flask/ctx.py create mode 100644 python/lib/python3.11/site-packages/flask/debughelpers.py create mode 100644 python/lib/python3.11/site-packages/flask/globals.py create mode 100644 python/lib/python3.11/site-packages/flask/helpers.py create mode 100644 python/lib/python3.11/site-packages/flask/json/__init__.py create mode 100644 python/lib/python3.11/site-packages/flask/json/provider.py create mode 100644 python/lib/python3.11/site-packages/flask/json/tag.py create mode 100644 python/lib/python3.11/site-packages/flask/logging.py create mode 100644 python/lib/python3.11/site-packages/flask/py.typed create mode 100644 python/lib/python3.11/site-packages/flask/scaffold.py create mode 100644 python/lib/python3.11/site-packages/flask/sessions.py create mode 100644 python/lib/python3.11/site-packages/flask/signals.py create mode 100644 python/lib/python3.11/site-packages/flask/templating.py create mode 100644 python/lib/python3.11/site-packages/flask/testing.py create mode 100644 python/lib/python3.11/site-packages/flask/typing.py create mode 100644 python/lib/python3.11/site-packages/flask/views.py create mode 100644 python/lib/python3.11/site-packages/flask/wrappers.py create mode 100644 python/lib/python3.11/site-packages/idna-3.4.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/idna-3.4.dist-info/LICENSE.md create mode 100644 python/lib/python3.11/site-packages/idna-3.4.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/idna-3.4.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/idna-3.4.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/idna-3.4.dist-info/WHEEL rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/__init__.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/codec.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/compat.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/core.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/idnadata.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/intranges.py (100%) rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/package_data.py (100%) create mode 100644 python/lib/python3.11/site-packages/idna/py.typed rename {lib/python3.11/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/idna/uts46data.py (100%) create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/__init__.py create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/_adapters.py rename {lib/python3.11/site-packages/setuptools/_vendor => python/lib/python3.11/site-packages}/importlib_metadata/_collections.py (100%) create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/_compat.py rename {lib/python3.11/site-packages/setuptools/_vendor => python/lib/python3.11/site-packages}/importlib_metadata/_functools.py (100%) rename {lib/python3.11/site-packages/setuptools/_vendor => python/lib/python3.11/site-packages}/importlib_metadata/_itertools.py (100%) create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/_meta.py create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/_py39compat.py rename {lib/python3.11/site-packages/setuptools/_vendor => python/lib/python3.11/site-packages}/importlib_metadata/_text.py (100%) create mode 100644 python/lib/python3.11/site-packages/importlib_metadata/py.typed create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/itsdangerous/__init__.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/_json.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/encoding.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/exc.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/py.typed create mode 100644 python/lib/python3.11/site-packages/itsdangerous/serializer.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/signer.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/timed.py create mode 100644 python/lib/python3.11/site-packages/itsdangerous/url_safe.py create mode 100644 python/lib/python3.11/site-packages/jinja2/__init__.py create mode 100644 python/lib/python3.11/site-packages/jinja2/_identifier.py create mode 100644 python/lib/python3.11/site-packages/jinja2/async_utils.py create mode 100644 python/lib/python3.11/site-packages/jinja2/bccache.py create mode 100644 python/lib/python3.11/site-packages/jinja2/compiler.py create mode 100644 python/lib/python3.11/site-packages/jinja2/constants.py create mode 100644 python/lib/python3.11/site-packages/jinja2/debug.py create mode 100644 python/lib/python3.11/site-packages/jinja2/defaults.py create mode 100644 python/lib/python3.11/site-packages/jinja2/environment.py create mode 100644 python/lib/python3.11/site-packages/jinja2/exceptions.py create mode 100644 python/lib/python3.11/site-packages/jinja2/ext.py create mode 100644 python/lib/python3.11/site-packages/jinja2/filters.py create mode 100644 python/lib/python3.11/site-packages/jinja2/idtracking.py create mode 100644 python/lib/python3.11/site-packages/jinja2/lexer.py create mode 100644 python/lib/python3.11/site-packages/jinja2/loaders.py create mode 100644 python/lib/python3.11/site-packages/jinja2/meta.py create mode 100644 python/lib/python3.11/site-packages/jinja2/nativetypes.py create mode 100644 python/lib/python3.11/site-packages/jinja2/nodes.py create mode 100644 python/lib/python3.11/site-packages/jinja2/optimizer.py create mode 100644 python/lib/python3.11/site-packages/jinja2/parser.py create mode 100644 python/lib/python3.11/site-packages/jinja2/py.typed create mode 100644 python/lib/python3.11/site-packages/jinja2/runtime.py create mode 100644 python/lib/python3.11/site-packages/jinja2/sandbox.py create mode 100644 python/lib/python3.11/site-packages/jinja2/tests.py create mode 100644 python/lib/python3.11/site-packages/jinja2/utils.py create mode 100644 python/lib/python3.11/site-packages/jinja2/visitor.py create mode 100644 python/lib/python3.11/site-packages/markupsafe/__init__.py create mode 100644 python/lib/python3.11/site-packages/markupsafe/_native.py create mode 100644 python/lib/python3.11/site-packages/markupsafe/_speedups.c rename {lib => python/lib}/python3.11/site-packages/markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so (100%) create mode 100644 python/lib/python3.11/site-packages/markupsafe/_speedups.pyi create mode 100644 python/lib/python3.11/site-packages/markupsafe/py.typed create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/COPYING create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/mutagen-1.46.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/mutagen/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_constants.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_file.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_iff.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_riff.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tags.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/mid3cp.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/mid3iconv.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/mid3v2.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/moggsplit.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/mutagen_inspect.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_tools/mutagen_pony.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/_vorbis.py create mode 100644 python/lib/python3.11/site-packages/mutagen/aac.py create mode 100644 python/lib/python3.11/site-packages/mutagen/ac3.py create mode 100644 python/lib/python3.11/site-packages/mutagen/aiff.py create mode 100644 python/lib/python3.11/site-packages/mutagen/apev2.py create mode 100644 python/lib/python3.11/site-packages/mutagen/asf/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/asf/_attrs.py create mode 100644 python/lib/python3.11/site-packages/mutagen/asf/_objects.py create mode 100644 python/lib/python3.11/site-packages/mutagen/asf/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/dsdiff.py create mode 100644 python/lib/python3.11/site-packages/mutagen/dsf.py create mode 100644 python/lib/python3.11/site-packages/mutagen/easyid3.py create mode 100644 python/lib/python3.11/site-packages/mutagen/easymp4.py create mode 100644 python/lib/python3.11/site-packages/mutagen/flac.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_file.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_frames.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_id3v1.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_specs.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_tags.py create mode 100644 python/lib/python3.11/site-packages/mutagen/id3/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/m4a.py create mode 100644 python/lib/python3.11/site-packages/mutagen/monkeysaudio.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp3/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp3/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp4/__init__.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp4/_as_entry.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp4/_atom.py create mode 100644 python/lib/python3.11/site-packages/mutagen/mp4/_util.py create mode 100644 python/lib/python3.11/site-packages/mutagen/musepack.py create mode 100644 python/lib/python3.11/site-packages/mutagen/ogg.py create mode 100644 python/lib/python3.11/site-packages/mutagen/oggflac.py create mode 100644 python/lib/python3.11/site-packages/mutagen/oggopus.py create mode 100644 python/lib/python3.11/site-packages/mutagen/oggspeex.py create mode 100644 python/lib/python3.11/site-packages/mutagen/oggtheora.py create mode 100644 python/lib/python3.11/site-packages/mutagen/oggvorbis.py create mode 100644 python/lib/python3.11/site-packages/mutagen/optimfrog.py create mode 100644 python/lib/python3.11/site-packages/mutagen/py.typed create mode 100644 python/lib/python3.11/site-packages/mutagen/smf.py create mode 100644 python/lib/python3.11/site-packages/mutagen/tak.py create mode 100644 python/lib/python3.11/site-packages/mutagen/trueaudio.py create mode 100644 python/lib/python3.11/site-packages/mutagen/wave.py create mode 100644 python/lib/python3.11/site-packages/mutagen/wavpack.py create mode 100644 python/lib/python3.11/site-packages/pip-22.3.1.dist-info/INSTALLER rename {lib/site-packages/pip-23.2.1.dist-info => python/lib/python3.11/site-packages/pip-22.3.1.dist-info}/LICENSE.txt (100%) rename {lib => python/lib}/python3.11/site-packages/pip-22.3.1.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/pip-22.3.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/pip-22.3.1.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/pip-22.3.1.dist-info/WHEEL rename {lib => python/lib}/python3.11/site-packages/pip-22.3.1.dist-info/entry_points.txt (100%) create mode 100644 python/lib/python3.11/site-packages/pip-22.3.1.dist-info/top_level.txt rename {lib => python/lib}/python3.11/site-packages/pip/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/__main__.py rename {lib => python/lib}/python3.11/site-packages/pip/__pip-runner__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/build_env.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cache.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/cli/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/cli/autocompletion.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/base_command.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/cmdoptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/command_context.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/cli/main.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/main_parser.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/parser.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/progress_bars.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/req_command.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/cli/spinners.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/cli/status_codes.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/cache.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/commands/check.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/completion.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/configuration.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/debug.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/download.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/freeze.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/commands/hash.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/commands/help.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/index.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/inspect.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/install.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/list.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/commands/search.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/show.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/uninstall.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/commands/wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/configuration.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/distributions/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/distributions/base.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/distributions/installed.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/distributions/sdist.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/distributions/wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/exceptions.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/index/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/index/collector.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/index/package_finder.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/index/sources.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/locations/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/locations/_distutils.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/locations/_sysconfig.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/locations/base.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/main.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/_json.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/base.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/candidate.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/models/direct_url.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/format_control.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/index.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/models/installation_report.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/models/link.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/scheme.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/models/search_scope.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/selection_prefs.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/models/target_python.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/models/wheel.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/network/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/network/auth.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/network/cache.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/network/download.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/network/lazy_wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/network/session.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/network/utils.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/network/xmlrpc.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/__init__.py create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/operations/build/metadata_legacy.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/operations/build/wheel_legacy.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/check.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/operations/freeze.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/operations/install/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/operations/install/legacy.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/operations/install/wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/operations/prepare.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/pyproject.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/constructors.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/req_file.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/req_install.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/req_set.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/req/req_uninstall.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/resolution/base.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/resolution/resolvelib/base.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 python/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/self_outdated_check.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/utils/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/_log.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/appdirs.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/compat.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/compatibility_tags.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/datetime.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/deprecation.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/direct_url_helpers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/distutils_args.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/encoding.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/entrypoints.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/filesystem.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/filetypes.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/utils/glibc.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/hashes.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/inject_securetransport.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/logging.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/misc.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/models.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/packaging.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/setuptools_build.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/subprocess.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/temp_dir.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/utils/unpacking.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/urls.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py rename {lib => python/lib/python3.11}/site-packages/pip/_internal/utils/wheel.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/vcs/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/vcs/bazaar.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/vcs/git.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py rename {lib => python/lib}/python3.11/site-packages/pip/_internal/vcs/subversion.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_internal/vcs/versioncontrol.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_internal/wheel_builder.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/_cmd.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/adapter.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/filewrapper.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/heuristics.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/cachecontrol/wrapper.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/certifi/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/certifi/__main__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/certifi/core.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/big5freq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/big5prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/enums.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/escprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/escsm.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/johabprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/chardet/version.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/colorama/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/colorama/ansi.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/database.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/index.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/locators.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/manifest.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/markers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/metadata.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/resources.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/scripts.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/util.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/distlib/version.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distlib/wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distro/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distro/__main__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/distro/distro.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/idna/codec.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/idna/compat.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/idna/core.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/idna/idnadata.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/idna/package_data.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/idna/uts46data.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/msgpack/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/msgpack/exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/msgpack/ext.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/msgpack/fallback.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/packaging/__about__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/packaging/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/packaging/_manylinux.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/packaging/_musllinux.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/packaging/_structures.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/packaging/markers.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/packaging/requirements.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/packaging/specifiers.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/packaging/tags.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/packaging/utils.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/packaging/version.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/build.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/check.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/colorlog.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/dirtools.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/envbuild.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/in_process/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/meta.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pep517/wrappers.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/platformdirs/android.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/platformdirs/version.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/__main__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/cmdline.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/console.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/filter.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatter.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/lexer.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/modeline.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/plugin.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/regexopt.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/scanner.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/style.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/token.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/unistring.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pygments/util.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/actions.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/pyparsing/common.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/core.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/results.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/testing.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py (100%) rename {lib/python3.11/site-packages/pkg_resources => python/lib/python3.11/site-packages/pip}/_vendor/pyparsing/util.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/__version__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/adapters.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/api.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/requests/auth.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/certs.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/compat.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/requests/cookies.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/help.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/requests/hooks.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/models.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/requests/packages.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/sessions.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/requests/status_codes.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/requests/structures.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/requests/utils.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/__main__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_cell_widths.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_emoji_codes.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_emoji_replace.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_export_format.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_extension.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_inspect.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_log_render.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_loop.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_palettes.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_pick.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_ratio.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_spinners.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_stack.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/_timer.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_win32_console.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_windows.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/_wrap.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/abc.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/align.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/ansi.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/bar.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/box.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/cells.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/color.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/color_triplet.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/columns.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/console.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/constrain.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/containers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/control.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/default_styles.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/diagnose.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/emoji.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/errors.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/file_proxy.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/filesize.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/highlighter.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/rich/json.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/jupyter.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/layout.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/live.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/live_render.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/logging.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/markup.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/measure.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/padding.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/pager.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/palette.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/panel.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/pretty.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/progress.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/progress_bar.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/prompt.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/protocol.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/region.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/repr.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/rule.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/rich/scope.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/screen.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/segment.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/spinner.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/status.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/style.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/styled.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/syntax.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/table.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/text.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/rich/theme.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/rich/themes.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/traceback.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/rich/tree.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/six.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tenacity/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/tenacity/nap.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tenacity/retry.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tenacity/wait.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tomli/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tomli/_parser.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tomli/_re.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/tomli/_types.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/typing_extensions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/__init__.py (100%) rename {lib/python3.11/site-packages => python/lib/python3.11/site-packages/pip/_vendor}/urllib3/_collections.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/_version.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/connection.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/contrib/socks.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/exceptions.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/fields.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/filepost.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/request.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/response.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/connection.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/proxy.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/queue.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/util/request.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/response.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/ssl_.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/urllib3/util/ssltransport.py (100%) create mode 100644 python/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/util/url.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py (100%) rename {lib => python/lib}/python3.11/site-packages/pip/_vendor/vendor.txt (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/webencodings/__init__.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/webencodings/labels.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/webencodings/mklabels.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/webencodings/tests.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/_vendor/webencodings/x_user_defined.py (100%) rename {lib => python/lib/python3.11}/site-packages/pip/py.typed (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/appdirs.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py (100%) create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/packaging/__about__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/packaging/_musllinux.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/packaging/_structures.py (100%) create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/packaging/specifiers.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/packaging/tags.py (100%) create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 python/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/pyparsing/common.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py (100%) rename {lib/python3.11/site-packages/setuptools => python/lib/python3.11/site-packages/pkg_resources}/_vendor/pyparsing/util.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/_vendor/zipp.py (100%) rename {lib => python/lib}/python3.11/site-packages/pkg_resources/extern/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/AUTHORS.rst create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/LICENSE.rst create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/pysondb/__init__.py create mode 100644 python/lib/python3.11/site-packages/pysondb/__main__.py create mode 100644 python/lib/python3.11/site-packages/pysondb/cli.py create mode 100644 python/lib/python3.11/site-packages/pysondb/db.py create mode 100644 python/lib/python3.11/site-packages/pysondb/db_types.py create mode 100644 python/lib/python3.11/site-packages/pysondb/errors.py create mode 100644 python/lib/python3.11/site-packages/pysondb/utils.py create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/pytz-2023.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/pytz-2023.3.dist-info/LICENSE.txt rename {lib => python/lib}/python3.11/site-packages/pytz-2023.3.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/pytz-2023.3.dist-info/RECORD (100%) rename {lib/python3.11/site-packages/requests_file-1.5.1.dist-info => python/lib/python3.11/site-packages/pytz-2023.3.dist-info}/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/pytz-2023.3.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/pytz-2023.3.dist-info/zip-safe rename {lib => python/lib}/python3.11/site-packages/pytz/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/exceptions.py create mode 100644 python/lib/python3.11/site-packages/pytz/lazy.py create mode 100644 python/lib/python3.11/site-packages/pytz/reference.py create mode 100644 python/lib/python3.11/site-packages/pytz/tzfile.py rename {lib => python/lib}/python3.11/site-packages/pytz/tzinfo.py (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Adak create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Atka create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Belem create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Belize create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Boise create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Ciudad_Juarez create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Creston create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Denver create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Glace_Bay rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Godthab (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Havana create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Lima create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Managua create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Merida create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Mexico_City rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Miquelon (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Montevideo rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Montreal (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Montserrat rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Nassau (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/New_York rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Nipigon (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Nome create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Nuuk (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Panama create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Recife create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Regina create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Sao_Paulo rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Scoresbysund (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Thule rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Thunder_Bay (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Tijuana rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/America/Toronto (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/America/Yellowknife rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Antarctica/Casey (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Troll rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Antarctica/Vostok (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aden rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Almaty (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Famagusta rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Gaza (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Harbin rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Hebron (100%) rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Qatar rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Qostanay (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Riyadh rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Asia/Saigon (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/North create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/South create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/West create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/CET create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Central rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/Canada/Eastern (100%) create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Cuba create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/EET create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/EST create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Egypt create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Eire create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kyiv create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/London create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Factory create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GB create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GMT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/GMT0 create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Greenwich create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/HST create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Hongkong create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Iceland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Iran create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Israel create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Jamaica create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Japan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Libya create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/MET create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/MST create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/NZ create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Navajo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/PRC create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kanton create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Poland create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Portugal create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/ROC create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/ROK create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Singapore create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Turkey create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/UCT create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Central create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/UTC create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Universal create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/W-SU create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/WET create mode 100644 python/lib/python3.11/site-packages/pytz/zoneinfo/Zulu rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/iso3166.tab (100%) rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/leapseconds (100%) rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/tzdata.zi (100%) rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/zone.tab (100%) rename {lib => python/lib}/python3.11/site-packages/pytz/zoneinfo/zone1970.tab (100%) create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/redis-4.5.5.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/redis-4.5.5.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/redis/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/client.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/cluster.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/connection.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/lock.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/parser.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/retry.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/sentinel.py create mode 100644 python/lib/python3.11/site-packages/redis/asyncio/utils.py create mode 100644 python/lib/python3.11/site-packages/redis/backoff.py create mode 100644 python/lib/python3.11/site-packages/redis/client.py create mode 100644 python/lib/python3.11/site-packages/redis/cluster.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/bf/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/bf/commands.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/bf/info.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/cluster.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/core.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/commands.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/edge.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/exceptions.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/execution_plan.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/node.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/path.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/graph/query_result.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/helpers.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/json/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/json/_util.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/json/commands.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/json/decoders.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/json/path.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/parser.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/redismodules.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/_util.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/aggregation.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/commands.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/document.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/field.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/indexDefinition.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/query.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/querystring.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/reducers.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/result.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/search/suggestion.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/sentinel.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/timeseries/__init__.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/timeseries/commands.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/timeseries/info.py create mode 100644 python/lib/python3.11/site-packages/redis/commands/timeseries/utils.py create mode 100644 python/lib/python3.11/site-packages/redis/compat.py create mode 100644 python/lib/python3.11/site-packages/redis/connection.py create mode 100644 python/lib/python3.11/site-packages/redis/crc.py create mode 100644 python/lib/python3.11/site-packages/redis/credentials.py create mode 100644 python/lib/python3.11/site-packages/redis/exceptions.py create mode 100644 python/lib/python3.11/site-packages/redis/lock.py create mode 100644 python/lib/python3.11/site-packages/redis/ocsp.py create mode 100644 python/lib/python3.11/site-packages/redis/retry.py create mode 100644 python/lib/python3.11/site-packages/redis/sentinel.py create mode 100644 python/lib/python3.11/site-packages/redis/typing.py create mode 100644 python/lib/python3.11/site-packages/redis/utils.py create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/requests-2.31.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/requests-2.31.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/requests/__init__.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/__version__.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/_internal_utils.py (100%) create mode 100644 python/lib/python3.11/site-packages/requests/adapters.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/api.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/auth.py (100%) create mode 100644 python/lib/python3.11/site-packages/requests/certs.py create mode 100644 python/lib/python3.11/site-packages/requests/compat.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/cookies.py (100%) create mode 100644 python/lib/python3.11/site-packages/requests/exceptions.py create mode 100644 python/lib/python3.11/site-packages/requests/help.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/hooks.py (100%) create mode 100644 python/lib/python3.11/site-packages/requests/models.py create mode 100644 python/lib/python3.11/site-packages/requests/packages.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/sessions.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/status_codes.py (100%) rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/requests/structures.py (100%) create mode 100644 python/lib/python3.11/site-packages/requests/utils.py create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/requests_file-1.5.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/requests_file-1.5.1.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/requests_file.py create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/AUTHORS.rst create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/LICENSE.txt create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/schedule-1.2.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/schedule-1.2.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/schedule/__init__.py create mode 100644 python/lib/python3.11/site-packages/schedule/py.typed create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/DESCRIPTION.rst create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/selenium-3.14.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/metadata.json create mode 100644 python/lib/python3.11/site-packages/selenium-3.14.1.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/selenium/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/common/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/common/exceptions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/android/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/android/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/blackberry/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/blackberry/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/chrome/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/chrome/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/chrome/remote_connection.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/chrome/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/action_chains.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/action_builder.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/input_device.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/interaction.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/key_actions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/key_input.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/mouse_button.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/pointer_actions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/actions/pointer_input.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/alert.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/by.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/desired_capabilities.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/html5/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/html5/application_cache.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/keys.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/proxy.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/touch_actions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/common/utils.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/edge/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/edge/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/edge/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/edge/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/__init__.py create mode 100755 python/lib/python3.11/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/extension_connection.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/firefox_binary.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/firefox_profile.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/remote_connection.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.xpi create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver_prefs.json create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/firefox/webelement.py create mode 100755 python/lib/python3.11/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/ie/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/ie/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/ie/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/ie/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/opera/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/opera/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/opera/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/phantomjs/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/phantomjs/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/phantomjs/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/command.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/file_detector.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/getAttribute.js create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/isDisplayed.js create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/mobile.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/remote_connection.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/switch_to.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/utils.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/remote/webelement.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/safari/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/safari/permissions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/safari/remote_connection.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/safari/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/safari/webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/abstract_event_listener.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/color.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/event_firing_webdriver.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/events.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/expected_conditions.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/select.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/ui.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/support/wait.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/webkitgtk/__init__.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/webkitgtk/options.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/webkitgtk/service.py create mode 100644 python/lib/python3.11/site-packages/selenium/webdriver/webkitgtk/webdriver.py rename {lib => python/lib}/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/PKG-INFO (100%) rename {lib => python/lib}/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/SOURCES.txt (100%) create mode 100644 python/lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/dependency_links.txt rename {lib => python/lib}/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/installed-files.txt (100%) rename {lib => python/lib}/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/not-zip-safe (100%) rename {lib => python/lib}/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/requires.txt (100%) create mode 100644 python/lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/seleniumrequests/__init__.py create mode 100644 python/lib/python3.11/site-packages/seleniumrequests/request.py create mode 100644 python/lib/python3.11/site-packages/setuptools-65.5.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/setuptools-65.5.1.dist-info/LICENSE rename {lib => python/lib}/python3.11/site-packages/setuptools-65.5.1.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools-65.5.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools-65.5.1.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/setuptools-65.5.1.dist-info/WHEEL rename {lib => python/lib}/python3.11/site-packages/setuptools-65.5.1.dist-info/entry_points.txt (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools-65.5.1.dist-info/top_level.txt (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_deprecation_warning.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/_collections.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/_functools.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/_macos_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/archive_util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/ccompiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/cmd.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/bdist.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/build.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/build_clib.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/build_ext.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/build_py.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/check.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/clean.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/config.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install_data.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install_headers.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install_lib.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/py37compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/register.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/sdist.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/command/upload.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/config.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/core.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_distutils/debug.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/dep_util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/dir_util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/dist.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/errors.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/extension.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/file_util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/filelist.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/log.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/msvccompiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/py38compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/py39compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/spawn.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/sysconfig.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/text_file.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/unixccompiler.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/version.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_distutils/versionpredicate.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_entry_points.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_imp.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_importlib.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_itertools.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_path.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_reqs.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/__init__.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/jaraco/context.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py rename {lib/site-packages/pip => python/lib/python3.11/site-packages/setuptools}/_vendor/packaging/__about__.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py rename {lib/site-packages/pip => python/lib/python3.11/site-packages/setuptools}/_vendor/packaging/_musllinux.py (100%) rename {lib/site-packages/pip => python/lib/python3.11/site-packages/setuptools}/_vendor/packaging/_structures.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py rename {lib/site-packages/pip => python/lib/python3.11/site-packages/setuptools}/_vendor/packaging/specifiers.py (100%) rename {lib/site-packages/pip => python/lib/python3.11/site-packages/setuptools}/_vendor/packaging/tags.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/tomli/_re.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/tomli/_types.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py rename {lib => python/lib}/python3.11/site-packages/setuptools/_vendor/zipp.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/archive_util.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/build_meta.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/alias.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/bdist_egg.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/build.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/build_clib.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/build_ext.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/build_py.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/develop.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/dist_info.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/easy_install.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/editable_wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/egg_info.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/install.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/install_egg_info.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/install_lib.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/command/install_scripts.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml create mode 100644 python/lib/python3.11/site-packages/setuptools/command/py36compat.py create mode 100644 python/lib/python3.11/site-packages/setuptools/command/register.py create mode 100644 python/lib/python3.11/site-packages/setuptools/command/rotate.py create mode 100644 python/lib/python3.11/site-packages/setuptools/command/saveopts.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/sdist.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/setopt.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/test.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/command/upload.py rename {lib => python/lib}/python3.11/site-packages/setuptools/command/upload_docs.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/expand.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/pyprojecttoml.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/config/setupcfg.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/dep_util.py create mode 100644 python/lib/python3.11/site-packages/setuptools/depends.py rename {lib => python/lib}/python3.11/site-packages/setuptools/discovery.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/dist.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/errors.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/extension.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/extern/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/glob.py create mode 100644 python/lib/python3.11/site-packages/setuptools/installer.py create mode 100644 python/lib/python3.11/site-packages/setuptools/launch.py rename {lib => python/lib}/python3.11/site-packages/setuptools/logging.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/monkey.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/msvc.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/namespaces.py rename {lib => python/lib}/python3.11/site-packages/setuptools/package_index.py (100%) create mode 100644 python/lib/python3.11/site-packages/setuptools/py34compat.py create mode 100644 python/lib/python3.11/site-packages/setuptools/sandbox.py create mode 100644 python/lib/python3.11/site-packages/setuptools/script (dev).tmpl create mode 100644 python/lib/python3.11/site-packages/setuptools/script.tmpl create mode 100644 python/lib/python3.11/site-packages/setuptools/unicode_utils.py create mode 100644 python/lib/python3.11/site-packages/setuptools/version.py rename {lib => python/lib}/python3.11/site-packages/setuptools/wheel.py (100%) rename {lib => python/lib}/python3.11/site-packages/setuptools/windows_support.py (100%) create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/six-1.16.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/six-1.16.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/six.py create mode 100644 python/lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/soupsieve-2.4.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/licenses/LICENSE.md create mode 100644 python/lib/python3.11/site-packages/soupsieve/__init__.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/__meta__.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/css_match.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/css_parser.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/css_types.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/pretty.py create mode 100644 python/lib/python3.11/site-packages/soupsieve/py.typed create mode 100644 python/lib/python3.11/site-packages/soupsieve/util.py create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/tldextract-3.4.4.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/tldextract-3.4.4.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/tldextract/.tld_set_snapshot create mode 100644 python/lib/python3.11/site-packages/tldextract/__init__.py create mode 100644 python/lib/python3.11/site-packages/tldextract/__main__.py create mode 100644 python/lib/python3.11/site-packages/tldextract/_version.py create mode 100644 python/lib/python3.11/site-packages/tldextract/cache.py create mode 100644 python/lib/python3.11/site-packages/tldextract/cli.py create mode 100644 python/lib/python3.11/site-packages/tldextract/py.typed create mode 100644 python/lib/python3.11/site-packages/tldextract/remote.py create mode 100644 python/lib/python3.11/site-packages/tldextract/suffix_list.py create mode 100644 python/lib/python3.11/site-packages/tldextract/tldextract.py create mode 100644 python/lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/typing_extensions-4.6.3.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/typing_extensions.py create mode 100644 python/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/LICENSE.txt rename {lib => python/lib}/python3.11/site-packages/tzlocal-5.0.1.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/tzlocal-5.0.1.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/zip-safe rename {lib => python/lib}/python3.11/site-packages/tzlocal/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/tzlocal/unix.py (100%) rename {lib => python/lib}/python3.11/site-packages/tzlocal/utils.py (100%) rename {lib => python/lib}/python3.11/site-packages/tzlocal/win32.py (100%) rename {lib => python/lib}/python3.11/site-packages/tzlocal/windows_tz.py (100%) create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/LICENSE.txt create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/urllib3-1.26.2.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/urllib3-1.26.2.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/urllib3/__init__.py rename {lib/site-packages/pip/_vendor => python/lib/python3.11/site-packages}/urllib3/_collections.py (100%) create mode 100644 python/lib/python3.11/site-packages/urllib3/_version.py create mode 100644 python/lib/python3.11/site-packages/urllib3/connection.py create mode 100644 python/lib/python3.11/site-packages/urllib3/connectionpool.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/appengine.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/securetransport.py create mode 100644 python/lib/python3.11/site-packages/urllib3/contrib/socks.py create mode 100644 python/lib/python3.11/site-packages/urllib3/exceptions.py create mode 100644 python/lib/python3.11/site-packages/urllib3/fields.py create mode 100644 python/lib/python3.11/site-packages/urllib3/filepost.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/backports/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/backports/makefile.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/six.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 python/lib/python3.11/site-packages/urllib3/poolmanager.py create mode 100644 python/lib/python3.11/site-packages/urllib3/request.py create mode 100644 python/lib/python3.11/site-packages/urllib3/response.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/__init__.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/connection.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/proxy.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/queue.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/request.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/response.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/retry.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/ssl_.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/ssltransport.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/timeout.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/url.py create mode 100644 python/lib/python3.11/site-packages/urllib3/util/wait.py create mode 100644 python/lib/python3.11/site-packages/websockets-11.0.3.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/websockets-11.0.3.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/websockets-11.0.3.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/websockets-11.0.3.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/websockets-11.0.3.dist-info/REQUESTED rename {lib => python/lib}/python3.11/site-packages/websockets-11.0.3.dist-info/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/websockets-11.0.3.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/websockets/__init__.py create mode 100644 python/lib/python3.11/site-packages/websockets/__main__.py create mode 100644 python/lib/python3.11/site-packages/websockets/auth.py create mode 100644 python/lib/python3.11/site-packages/websockets/client.py create mode 100644 python/lib/python3.11/site-packages/websockets/connection.py create mode 100644 python/lib/python3.11/site-packages/websockets/datastructures.py create mode 100644 python/lib/python3.11/site-packages/websockets/exceptions.py create mode 100644 python/lib/python3.11/site-packages/websockets/extensions/__init__.py create mode 100644 python/lib/python3.11/site-packages/websockets/extensions/base.py create mode 100644 python/lib/python3.11/site-packages/websockets/extensions/permessage_deflate.py create mode 100644 python/lib/python3.11/site-packages/websockets/frames.py create mode 100644 python/lib/python3.11/site-packages/websockets/headers.py create mode 100644 python/lib/python3.11/site-packages/websockets/http.py create mode 100644 python/lib/python3.11/site-packages/websockets/http11.py create mode 100644 python/lib/python3.11/site-packages/websockets/imports.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/__init__.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/async_timeout.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/auth.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/client.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/compatibility.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/framing.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/handshake.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/http.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/protocol.py create mode 100644 python/lib/python3.11/site-packages/websockets/legacy/server.py create mode 100644 python/lib/python3.11/site-packages/websockets/protocol.py create mode 100644 python/lib/python3.11/site-packages/websockets/py.typed create mode 100644 python/lib/python3.11/site-packages/websockets/server.py create mode 100644 python/lib/python3.11/site-packages/websockets/speedups.c rename {lib => python/lib}/python3.11/site-packages/websockets/speedups.cpython-311-x86_64-linux-gnu.so (100%) create mode 100644 python/lib/python3.11/site-packages/websockets/streams.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/__init__.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/client.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/compatibility.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/connection.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/messages.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/server.py create mode 100644 python/lib/python3.11/site-packages/websockets/sync/utils.py create mode 100644 python/lib/python3.11/site-packages/websockets/typing.py create mode 100644 python/lib/python3.11/site-packages/websockets/uri.py create mode 100644 python/lib/python3.11/site-packages/websockets/utils.py create mode 100644 python/lib/python3.11/site-packages/websockets/version.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/_internal.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/_reloader.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/datastructures.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/datastructures.pyi create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/console.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/repr.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/console.png create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/less.png create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/more.png create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/shared/style.css create mode 100644 python/lib/python3.11/site-packages/werkzeug/debug/tbtools.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/exceptions.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/formparser.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/http.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/local.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/lint.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/profiler.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/middleware/shared_data.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/py.typed create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/converters.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/exceptions.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/map.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/matcher.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/routing/rules.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/http.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/multipart.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/request.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/response.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/sansio/utils.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/security.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/serving.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/test.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/testapp.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/urls.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/user_agent.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/utils.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/wrappers/__init__.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/wrappers/request.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/wrappers/response.py create mode 100644 python/lib/python3.11/site-packages/werkzeug/wsgi.py rename {lib => python/lib}/python3.11/site-packages/wget-3.2-py3.11.egg-info/PKG-INFO (100%) rename {lib => python/lib}/python3.11/site-packages/wget-3.2-py3.11.egg-info/SOURCES.txt (100%) create mode 100644 python/lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/dependency_links.txt rename {lib => python/lib}/python3.11/site-packages/wget-3.2-py3.11.egg-info/installed-files.txt (100%) create mode 100644 python/lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/wget.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/AUTHORS create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/LICENSE rename {lib => python/lib}/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/METADATA (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/REQUESTED rename {lib => python/lib}/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/WHEEL (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/entry_points.txt create mode 100644 python/lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/top_level.txt rename {lib => python/lib}/python3.11/site-packages/yt_dlp/YoutubeDL.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/__init__.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/__main__.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/__pyinstaller/__init__.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/__pyinstaller/hook-yt_dlp.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/aes.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/cache.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/compat/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/compat/_deprecated.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/compat/_legacy.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/compat/compat_utils.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/compat/functools.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/compat/imghdr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/compat/shutil.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/cookies.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/dependencies/Cryptodome.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/dependencies/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/__init__.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/common.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/dash.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/external.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/f4m.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/fc2.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/fragment.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/hls.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/http.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/ism.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/mhtml.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/niconico.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/rtmp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/rtsp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/downloader/websocket.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/downloader/youtube_live_chat.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/__init__.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/_extractors.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/abc.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/abcnews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/abcotvs.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/abematv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/academicearth.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/acast.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/acfun.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/adn.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/adobeconnect.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/adobepass.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/adobetv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/adultswim.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/aenetworks.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/aeonco.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/afreecatv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/agora.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/airmozilla.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/airtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/aitube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/aliexpress.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/aljazeera.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/allocine.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/alphaporno.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/alsace20tv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/alura.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/amara.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/amazon.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/amazonminitv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/amcnetworks.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/americastestkitchen.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/amp.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/anchorfm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/angel.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ant1newsgr.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/anvato.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/aol.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/apa.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/aparat.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/appleconnect.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/applepodcasts.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/appletrailers.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/archiveorg.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/arcpublishing.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ard.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/arkena.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/arnes.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/arte.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/asiancrush.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/atresplayer.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/atscaleconf.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/atttechchannel.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/atvat.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/audimedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/audioboom.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/audiodraft.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/audiomack.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/audius.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/awaan.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/aws.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/azmedien.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/baidu.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/banbye.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bandaichannel.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bandcamp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bannedvideo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bbc.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/beatbump.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/beatport.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/beeg.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/behindkink.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bellmedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/berufetv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bfi.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bfmtv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bibeltv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bigflix.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bigo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bild.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bilibili.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/biobiochiletv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/biqle.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bitchute.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bitwave.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/blackboardcollaborate.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bleacherreport.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/blerp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/blogger.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bloomberg.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bokecc.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bongacams.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/booyah.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bostonglobe.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/box.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/boxcast.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bpb.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/br.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/bravotv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/breakcom.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/breitbart.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/brightcove.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/bundesliga.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/businessinsider.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/buzzfeed.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/byutv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/c56.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cableav.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/callin.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/caltrans.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cam4.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/camdemy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cammodels.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/camsoda.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/camtasia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/camwithher.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/canalalpha.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/canalc2.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/canalplus.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/canvas.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/carambatv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cartoonnetwork.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cbc.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cbs.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cbsinteractive.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cbslocal.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cbsnews.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cbssports.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ccc.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ccma.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cctv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cda.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cellebrite.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ceskatelevize.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cgtn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/channel9.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/charlierose.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/chaturbate.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/chilloutzone.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/chingari.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/chirbit.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cinchcast.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cinemax.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cinetecamilano.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ciscolive.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ciscowebex.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cjsw.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cliphunter.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/clippit.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cliprs.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/clipsyndicate.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/closertotruth.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cloudflarestream.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cloudy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/clubic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/clyp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cmt.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cnbc.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cnn.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/comedycentral.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/common.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/commonmistakes.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/commonprotocols.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/condenast.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/contv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/corus.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/coub.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cozytv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cpac.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cracked.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/crackle.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/craftsy.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/crooksandliars.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/crowdbunker.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/crunchyroll.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cspan.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ctsnews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ctv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ctvnews.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cultureunplugged.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/curiositystream.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/cwtv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/cybrary.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/daftsex.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dailymail.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/dailymotion.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dailywire.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/damtomo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/daum.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/daystar.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dbtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dctp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/deezer.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/defense.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/democracynow.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/detik.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/deuxm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dfb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dhm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/digg.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/digitalconcerthall.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/digiteka.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/discovery.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/discoverygo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/disney.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dispeak.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dlive.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dotsub.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/douyutv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/dplay.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/drbonanza.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dreisat.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/drooble.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/dropbox.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/dropout.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/drtuber.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/drtv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dtube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/duboku.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/dumpert.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dvtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/dw.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/eagleplatform.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ebaumsworld.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ebay.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/echomsk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/egghead.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ehow.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/eighttracks.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/einthusan.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/eitb.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ellentube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/elonet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/elpais.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/embedly.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/engadget.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/epicon.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/epoch.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/eporner.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/eroprofile.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ertgr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/escapist.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/espn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/esri.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/europa.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/europeantour.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/eurosport.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/euscreen.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/expotv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/expressen.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/extractors.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/extremetube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/eyedotv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/facebook.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fancode.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/faz.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/fc2.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fczenit.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/fifa.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/filmmodu.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/filmon.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/filmweb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/firsttv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fivetv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/flickr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/folketinget.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/footyroom.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/formula1.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fourtube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fourzerostudio.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/fox.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fox9.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/foxgay.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/foxnews.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/foxsports.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fptplay.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/franceinter.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/francetv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/freesound.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/freespeech.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/freetv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/frontendmasters.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/fujitv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/funimation.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/funk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fusion.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/fuyintv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gab.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gaia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gameinformer.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gamejolt.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gamespot.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gamestar.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gaskrank.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gazeta.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/gdcvault.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gedidigital.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/generic.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/genericembeds.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/genius.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gettr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gfycat.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/giantbomb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/giga.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gigya.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/glide.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/globo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/glomex.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/go.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/godtube.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/gofile.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/golem.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/goodgame.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/googledrive.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/googlepodcasts.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/googlesearch.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/goplay.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gopro.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/goshgay.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gotostage.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/gputechconf.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/gronkh.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/groupon.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/harpodeon.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hbo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hearthisat.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/heise.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hellporno.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/helsinki.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hentaistigma.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hgtv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hidive.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/historicfilms.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hitbox.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hitrecord.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hketv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/holodex.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hotnewhiphop.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hotstar.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/howcast.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/howstuffworks.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hrfensehen.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hrti.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hse.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/huajiao.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/huffpost.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/hungama.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/huya.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hypem.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hypergryph.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/hytale.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/icareus.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ichinanalive.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ign.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/iheart.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/iltalehti.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/imdb.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/imggaming.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/imgur.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ina.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/inc.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/indavideo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/infoq.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/instagram.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/internazionale.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/internetvideoarchive.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/iprima.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/iqiyi.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/islamchannel.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/israelnationalnews.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/itprotv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/itv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ivi.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ivideon.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/iwara.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ixigua.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/izlesene.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/jable.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/jamendo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/japandiet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/jeuxvideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/jixie.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/joj.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/jove.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/jwplatform.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/kakao.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kaltura.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kanal2.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kankanews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/karaoketv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/karrierevideos.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/keezmovies.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kelbyone.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ketnet.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/khanacademy.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/kick.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kicker.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kickstarter.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kinja.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kinopoisk.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/kommunetv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kompas.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/konserthusetplay.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/koo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/krasview.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kth.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ku6.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/kusi.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/kuwo.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/la7.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/laola1tv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/lastfm.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/lazy_extractors.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/lbry.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lci.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lcp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lecture2go.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/lecturio.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/leeco.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lefigaro.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/lego.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lemonde.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lenta.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/libraryofcongress.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/libsyn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lifenews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/likee.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/limelight.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/line.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/linkedin.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/linuxacademy.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/liputan6.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/listennotes.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/litv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/livejournal.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/livestream.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/livestreamfails.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lnkgo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/localnews8.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lovehomeporn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lrt.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lumni.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/lynda.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/m6.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/magentamusik360.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mailru.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mainstreaming.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/malltv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mangomolo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/manoto.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/manyvids.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/maoritv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/markiza.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/massengeschmacktv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/masters.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/matchtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mdr.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/medaltv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mediaite.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mediaklikk.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/medialaan.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mediaset.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mediasite.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mediastream.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mediaworksnz.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/medici.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/megaphone.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/megatvcom.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/meipai.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/melonvod.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/meta.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/metacafe.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/metacritic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mgoon.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mgtv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/miaopai.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/microsoftembed.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/microsoftstream.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/microsoftvirtualacademy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mildom.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/minds.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ministrygrid.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/minoto.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/miomio.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mirrativ.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mirrorcouk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mit.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mitele.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mixch.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mixcloud.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mlb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mlssoccer.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mnet.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mocha.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/moevideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mofosex.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mojvideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/morningstar.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/motherless.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/motorsport.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/movieclips.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/moviepilot.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/moview.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/moviezine.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/movingimage.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/msn.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/mtv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/muenchentv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/murrtube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/musescore.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/musicdex.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mwave.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mxplayer.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/mychannels.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/myspace.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/myspass.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/myvi.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/myvideoge.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/myvidster.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/n1.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nate.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nationalgeographic.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/naver.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nba.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nbc.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ndr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ndtv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nebula.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nerdcubed.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/neteasemusic.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/netverse.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/netzkino.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/newgrounds.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/newspicks.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/newstube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/newsy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nextmedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nexx.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nfb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nfhsnetwork.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nfl.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nhk.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nhl.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nick.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/niconico.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ninecninemedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ninegag.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ninenow.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nintendo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nitter.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/njpwworld.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nobelprize.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/noice.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nonktube.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/noodlemagazine.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/noovo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/normalboots.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nosnl.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nosvideo.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nova.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/novaplay.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nowness.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/noz.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/npo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/npr.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/nrk.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nrl.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ntvcojp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ntvde.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ntvru.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nuevo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nuvid.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nytimes.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nzherald.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nzonscreen.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/nzz.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/odatv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/odkmedia.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/odnoklassniki.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/oftv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/oktoberfesttv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/olympics.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/on24.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/once.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ondemandkorea.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/onefootball.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/onenewsnz.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/oneplace.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/onet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/onionstudios.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ooyala.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/opencast.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/openload.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/openrec.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ora.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/orf.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/outsidetv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/packtpub.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/palcomp3.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pandoratv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/panopto.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/paramountplus.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/parler.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/parlview.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/patreon.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/pbs.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pearvideo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/peekvids.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/peertube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/peertv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/peloton.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/people.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/performgroup.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/periscope.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/philharmoniedeparis.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/phoenix.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/photobucket.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/piapro.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/picarto.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/piksel.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pinkbike.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pinterest.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pixivsketch.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/pladform.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/planetmarathi.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/platzi.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/playfm.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/playplustv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/plays.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/playstuff.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/playsuisse.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/playtvak.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/playvid.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/playwire.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pluralsight.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/plutotv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/podbayfm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/podchaser.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/podomatic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pokemon.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pokergo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/polsatgo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/polskieradio.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/popcorntimes.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/popcorntv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/porn91.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/porncom.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/pornez.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pornflip.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pornhd.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/pornhub.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pornotube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pornovoisines.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pornoxo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/pr0gramm.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/prankcast.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/premiershiprugby.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/presstv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/projectveritas.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/prosiebensat1.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/prx.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/puhutv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/puls4.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/pyvideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/qingting.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/qqmusic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/r7.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/radiko.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radiobremen.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/radiocanada.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radiode.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/radiofrance.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radiojavan.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radiokapital.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radiozet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/radlive.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rai.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/raywenderlich.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rbgtum.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rbmaradio.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rcs.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rcti.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rds.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/redbee.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/redbulltv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/reddit.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/redgifs.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/redtube.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/regiotv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rentv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/restudy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/reuters.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/reverbnation.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rice.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rmcdecouverte.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rockstargames.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rokfin.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/roosterteeth.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rottentomatoes.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rozhlas.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rte.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtl2.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtlnl.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtnews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtp.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtrfm.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rts.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtve.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtvnh.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rtvs.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rtvslo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ruhd.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rule34video.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/rumble.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rutube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/rutv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ruutu.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ruv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/safari.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/saitosan.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/samplefocus.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sapo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/savefrom.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sbs.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/screen9.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/screencast.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/screencastify.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/screencastomatic.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/scrippsnetworks.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/scrolller.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/scte.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/seeker.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/senategov.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sendtonews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/servus.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sevenplus.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sexu.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/seznamzpravy.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/shahid.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/shared.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sharevideos.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/shemaroome.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/showroomlive.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sibnet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/simplecast.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sina.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sixplay.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/skeb.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sky.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/skyit.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/skylinewebcams.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/skynewsarabia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/skynewsau.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/slideshare.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/slideslive.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/slutload.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/smotrim.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/snotr.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sohu.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sonyliv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/soundcloud.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/soundgasm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/southpark.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sovietscloset.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spankbang.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spankwire.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spiegel.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spike.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sport5.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sportbox.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sportdeutschland.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spotify.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/spreaker.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/springboardplatform.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sprout.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/srgssr.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/srmediathek.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/stanfordoc.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/startrek.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/startv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/steam.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/stitcher.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/storyfire.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/streamable.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/streamanity.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/streamcloud.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/streamcz.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/streamff.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/streetvoice.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/stretchinternet.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/stripchat.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/stv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/substack.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sunporno.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/sverigesradio.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/svt.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/swearnet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/swrmediathek.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/syfy.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/syvdk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/sztvhu.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tagesschau.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tass.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tbs.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tdslifeway.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/teachable.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/teachertube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/teachingchannel.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/teamcoco.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/teamtreehouse.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/techtalks.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ted.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tele13.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tele5.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telebruxelles.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/telecaribe.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telecinco.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telegraaf.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telegram.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telemb.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/telemundo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telequebec.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/teletask.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/telewebion.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tempo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tencent.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tennistv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tenplay.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/testurl.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tf1.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tfo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/theholetv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/theintercept.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/theplatform.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/thestar.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/thesun.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/theta.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/theweatherchannel.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/thisamericanlife.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/thisav.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/thisoldhouse.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/thisvid.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/threeqsdn.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/threespeak.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tiktok.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tinypic.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tmz.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tnaflix.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/toggle.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/toggo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tokentube.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tonline.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/toongoggles.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/toutv.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/toypics.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/traileraddict.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/triller.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/trilulilu.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/trovo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/trtcocuk.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/trueid.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/trunews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/truth.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/trutv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tube8.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tubetugraz.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tubitv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tumblr.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tunein.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tunepk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/turbo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/turner.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tv2.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tv24ua.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tv2dk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tv2hu.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tv4.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tv5mondeplus.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tv5unis.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tva.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvanouvelles.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvc.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tver.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvigle.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tviplayer.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvland.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvn24.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvnet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvnoe.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvnow.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tvopengr.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tvp.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tvplay.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/tvplayer.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/tweakers.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/twentyfourvideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/twentymin.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/twentythreevideo.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/twitcasting.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/twitch.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/twitter.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/txxx.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/udemy.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/udn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ufctv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ukcolumn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/uktvplay.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/umg.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/unistra.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/unity.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/unscripted.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/unsupported.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/uol.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/uplynk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/urort.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/urplay.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/usanetwork.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/usatoday.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ustream.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ustudio.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/utreon.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/varzesh3.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vbox7.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/veehd.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/veo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/veoh.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vesti.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vevo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vgtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vh1.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vice.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vidbit.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/viddler.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/videa.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/videocampus_sachsen.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/videodetective.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/videofyme.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/videoken.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/videomore.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/videopress.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vidio.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vidlii.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/viewlift.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/viidea.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/viki.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vimeo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vimm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vimple.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vine.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/viqeo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/viu.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vk.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vocaroo.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vodlocker.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vodpl.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vodplatform.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/voicerepublic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/voicy.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/volejtv.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/voot.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/voxmedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vrak.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vrt.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vrv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/vshare.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vtm.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vuclip.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vupload.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vvvvid.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vyborymos.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/vzaar.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wakanim.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/walla.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wasdtv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/washingtonpost.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/wat.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/watchbox.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/watchindianporn.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/wdr.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/webcamerapl.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/webcaster.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/webofstories.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/weibo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/weiqitv.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/whowatch.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wikimedia.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/willow.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/wimtv.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/wistia.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wordpress.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/worldstarhiphop.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wppilot.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/wrestleuniverse.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wsj.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/wwe.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xanimu.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xbef.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xboxclips.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xfileshare.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/xhamster.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/ximalaya.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xinpianchang.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xminus.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xnxx.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xstream.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/xtube.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xuite.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xvideos.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/xxxymovies.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/yahoo.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yandexdisk.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yandexmusic.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yandexvideo.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yapfiles.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/yappy.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/yesjapan.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yinyuetai.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yle_areena.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/ynet.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/youjizz.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/youku.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/younow.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/youporn.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yourporn.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/yourupload.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/youtube.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/zapiks.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zattoo.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zdf.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zee5.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/zeenews.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/extractor/zhihu.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zingmp3.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zoom.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/extractor/zype.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/jsinterp.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/minicurses.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/options.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/plugins.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/__init__.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/postprocessor/common.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/postprocessor/embedthumbnail.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/postprocessor/exec.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/postprocessor/ffmpeg.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/metadataparser.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/postprocessor/modify_chapters.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/sponskrub.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/sponsorblock.py create mode 100644 python/lib/python3.11/site-packages/yt_dlp/postprocessor/xattrpp.py rename {lib => python/lib}/python3.11/site-packages/yt_dlp/socks.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/update.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/utils.py (100%) rename {lib => python/lib}/python3.11/site-packages/yt_dlp/version.py (100%) create mode 100644 python/lib/python3.11/site-packages/yt_dlp/webvtt.py create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/INSTALLER create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/LICENSE create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/METADATA rename {lib => python/lib}/python3.11/site-packages/zipp-3.15.0.dist-info/RECORD (100%) create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/REQUESTED create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/WHEEL create mode 100644 python/lib/python3.11/site-packages/zipp-3.15.0.dist-info/top_level.txt create mode 100644 python/lib/python3.11/site-packages/zipp/__init__.py create mode 100644 python/lib/python3.11/site-packages/zipp/py310compat.py rename {lib => python/lib}/site-packages/pip-23.2.1.dist-info/AUTHORS.txt (100%) create mode 100644 python/lib/site-packages/pip-23.2.1.dist-info/INSTALLER create mode 100644 python/lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt rename {lib => python/lib}/site-packages/pip-23.2.1.dist-info/METADATA (100%) rename {lib => python/lib}/site-packages/pip-23.2.1.dist-info/RECORD (100%) create mode 100644 python/lib/site-packages/pip-23.2.1.dist-info/REQUESTED create mode 100644 python/lib/site-packages/pip-23.2.1.dist-info/WHEEL rename {lib => python/lib}/site-packages/pip-23.2.1.dist-info/entry_points.txt (100%) create mode 100644 python/lib/site-packages/pip-23.2.1.dist-info/top_level.txt rename {lib => python/lib}/site-packages/pip/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/__main__.py (100%) rename {lib => python/lib}/site-packages/pip/__pip-runner__.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/build_env.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cache.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 python/lib/site-packages/pip/_internal/cli/autocompletion.py rename {lib => python/lib}/site-packages/pip/_internal/cli/base_command.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/cmdoptions.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/command_context.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/main.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/main_parser.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/parser.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/progress_bars.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/req_command.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/cli/spinners.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/cli/status_codes.py rename {lib => python/lib}/site-packages/pip/_internal/commands/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/cache.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/check.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/completion.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/configuration.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/debug.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/download.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/freeze.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/commands/hash.py create mode 100644 python/lib/site-packages/pip/_internal/commands/help.py rename {lib => python/lib}/site-packages/pip/_internal/commands/index.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/inspect.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/install.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/list.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/commands/search.py rename {lib => python/lib}/site-packages/pip/_internal/commands/show.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/uninstall.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/commands/wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/configuration.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/distributions/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/distributions/base.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/distributions/installed.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/distributions/sdist.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/distributions/wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/exceptions.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/index/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/index/collector.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/index/package_finder.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/index/sources.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/locations/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/locations/_distutils.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/locations/_sysconfig.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/locations/base.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/main.py rename {lib => python/lib}/site-packages/pip/_internal/metadata/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/_json.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/base.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/importlib/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/importlib/_compat.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/importlib/_dists.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/importlib/_envs.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/metadata/pkg_resources.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/models/__init__.py create mode 100644 python/lib/site-packages/pip/_internal/models/candidate.py rename {lib => python/lib}/site-packages/pip/_internal/models/direct_url.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/models/format_control.py create mode 100644 python/lib/site-packages/pip/_internal/models/index.py rename {lib => python/lib}/site-packages/pip/_internal/models/installation_report.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/models/link.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/models/scheme.py rename {lib => python/lib}/site-packages/pip/_internal/models/search_scope.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 python/lib/site-packages/pip/_internal/models/target_python.py rename {lib => python/lib}/site-packages/pip/_internal/models/wheel.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/network/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/network/auth.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/network/cache.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/network/download.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/network/lazy_wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/network/session.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/network/utils.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 python/lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 python/lib/site-packages/pip/_internal/operations/build/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/operations/build/build_tracker.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/build/metadata.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/build/metadata_editable.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/operations/build/metadata_legacy.py rename {lib => python/lib}/site-packages/pip/_internal/operations/build/wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/build/wheel_editable.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/operations/build/wheel_legacy.py rename {lib => python/lib}/site-packages/pip/_internal/operations/check.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/freeze.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/operations/install/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/operations/install/editable_legacy.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/install/wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/operations/prepare.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/pyproject.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/constructors.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/req_file.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/req_install.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/req_set.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/req/req_uninstall.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 python/lib/site-packages/pip/_internal/resolution/base.py create mode 100644 python/lib/site-packages/pip/_internal/resolution/legacy/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/resolution/legacy/resolver.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 python/lib/site-packages/pip/_internal/resolution/resolvelib/base.py rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/candidates.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/factory.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/provider.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/reporter.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/requirements.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/resolution/resolvelib/resolver.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/self_outdated_check.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/utils/_jaraco_text.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/_log.py create mode 100644 python/lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 python/lib/site-packages/pip/_internal/utils/compat.py create mode 100644 python/lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 python/lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 python/lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 python/lib/site-packages/pip/_internal/utils/direct_url_helpers.py rename {lib => python/lib}/site-packages/pip/_internal/utils/egg_link.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/encoding.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/entrypoints.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/filesystem.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/filetypes.py rename {lib => python/lib}/site-packages/pip/_internal/utils/glibc.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/hashes.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/inject_securetransport.py rename {lib => python/lib}/site-packages/pip/_internal/utils/logging.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/misc.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/models.py create mode 100644 python/lib/site-packages/pip/_internal/utils/packaging.py rename {lib => python/lib}/site-packages/pip/_internal/utils/setuptools_build.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/subprocess.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/temp_dir.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/utils/unpacking.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/urls.py rename {lib => python/lib}/site-packages/pip/_internal/utils/virtualenv.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 python/lib/site-packages/pip/_internal/vcs/__init__.py rename {lib => python/lib}/site-packages/pip/_internal/vcs/bazaar.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/vcs/git.py rename {lib => python/lib}/site-packages/pip/_internal/vcs/mercurial.py (100%) rename {lib => python/lib}/site-packages/pip/_internal/vcs/subversion.py (100%) create mode 100644 python/lib/site-packages/pip/_internal/vcs/versioncontrol.py rename {lib => python/lib}/site-packages/pip/_internal/wheel_builder.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/adapter.py rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/cache.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/caches/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/compat.py rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/controller.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/heuristics.py rename {lib => python/lib}/site-packages/pip/_vendor/cachecontrol/serialize.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 python/lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 python/lib/site-packages/pip/_vendor/certifi/cacert.pem rename {lib => python/lib}/site-packages/pip/_vendor/certifi/core.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/big5freq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/big5prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/chardistribution.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/charsetgroupprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/charsetprober.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/chardet/cli/__init__.py rename {lib => python/lib}/site-packages/pip/_vendor/chardet/cli/chardetect.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/codingstatemachine.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/codingstatemachinedict.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/cp949prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/enums.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/escprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/escsm.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/eucjpprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/euckrfreq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/euckrprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/euctwfreq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/euctwprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/gb2312freq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/gb2312prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/hebrewprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/jisfreq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/johabfreq.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/johabprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/jpcntx.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langbulgarianmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langgreekmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langhebrewmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langhungarianmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langrussianmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langthaimodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/langturkishmodel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/latin1prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/macromanprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/mbcharsetprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/mbcsgroupprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/mbcssm.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/chardet/metadata/__init__.py rename {lib => python/lib}/site-packages/pip/_vendor/chardet/metadata/languages.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/resultdict.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/sbcharsetprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/sbcsgroupprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/sjisprober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/universaldetector.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/utf1632prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/utf8prober.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/chardet/version.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/colorama/ansi.py rename {lib => python/lib}/site-packages/pip/_vendor/colorama/ansitowin32.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/initialise.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/ansi_test.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/initialise_test.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/isatty_test.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/utils.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/tests/winterm_test.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/win32.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/colorama/winterm.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/distlib/compat.py rename {lib => python/lib}/site-packages/pip/_vendor/distlib/database.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/index.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/locators.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 python/lib/site-packages/pip/_vendor/distlib/markers.py rename {lib => python/lib}/site-packages/pip/_vendor/distlib/metadata.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/distlib/resources.py rename {lib => python/lib}/site-packages/pip/_vendor/distlib/scripts.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/t32.exe (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/t64-arm.exe (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/t64.exe (100%) create mode 100644 python/lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 python/lib/site-packages/pip/_vendor/distlib/version.py rename {lib => python/lib}/site-packages/pip/_vendor/distlib/w32.exe (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/w64-arm.exe (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/w64.exe (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distlib/wheel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distro/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distro/__main__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/distro/distro.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/core.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 python/lib/site-packages/pip/_vendor/idna/uts46data.py rename {lib => python/lib}/site-packages/pip/_vendor/msgpack/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/msgpack/exceptions.py rename {lib => python/lib}/site-packages/pip/_vendor/msgpack/ext.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/msgpack/fallback.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 python/lib/site-packages/pip/_vendor/packaging/version.py rename {lib => python/lib}/site-packages/pip/_vendor/pkg_resources/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/__main__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/android.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/api.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/macos.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/unix.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/version.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/platformdirs/windows.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/__main__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/cmdline.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/console.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/filter.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/filters/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatter.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/_mapping.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/bbcode.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/groff.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/html.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/img.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/irc.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/latex.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/other.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/rtf.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/svg.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/terminal.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/formatters/terminal256.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/lexer.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/lexers/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/lexers/_mapping.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/lexers/python.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/modeline.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/plugin.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/regexopt.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/scanner.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/sphinxext.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/style.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/styles/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/token.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/unistring.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pygments/util.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/actions.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/common.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/core.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/diagram/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/exceptions.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/helpers.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/results.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/testing.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/unicode.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyparsing/util.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyproject_hooks/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyproject_hooks/_compat.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyproject_hooks/_impl.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/requests/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 python/lib/site-packages/pip/_vendor/requests/_internal_utils.py rename {lib => python/lib}/site-packages/pip/_vendor/requests/adapters.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/requests/api.py create mode 100644 python/lib/site-packages/pip/_vendor/requests/auth.py rename {lib => python/lib}/site-packages/pip/_vendor/requests/certs.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/requests/compat.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/requests/cookies.py rename {lib => python/lib}/site-packages/pip/_vendor/requests/exceptions.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/requests/help.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/requests/hooks.py rename {lib => python/lib}/site-packages/pip/_vendor/requests/models.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 python/lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 python/lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 python/lib/site-packages/pip/_vendor/requests/structures.py rename {lib => python/lib}/site-packages/pip/_vendor/requests/utils.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/resolvelib/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py rename {lib => python/lib}/site-packages/pip/_vendor/resolvelib/providers.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/resolvelib/reporters.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/resolvelib/resolvers.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/resolvelib/structs.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/__main__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_emoji_replace.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/_export_format.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/_extension.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/_fileno.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/_inspect.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_loop.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/_null_file.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_pick.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_ratio.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/_spinners.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/_stack.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/_timer.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/_win32_console.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/_windows.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/_windows_renderer.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/_wrap.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/abc.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/align.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/ansi.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/bar.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/box.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/cells.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/color.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/columns.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/console.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/constrain.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/containers.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/control.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/default_styles.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/diagnose.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/emoji.py create mode 100644 python/lib/site-packages/pip/_vendor/rich/errors.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/file_proxy.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/filesize.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/highlighter.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/json.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/jupyter.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/layout.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/live.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/live_render.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/logging.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/markup.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/measure.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/padding.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/pager.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/palette.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/panel.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/pretty.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/progress.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/progress_bar.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/prompt.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/protocol.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/region.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/repr.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/rule.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/scope.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/screen.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/segment.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/spinner.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/status.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/style.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/styled.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/syntax.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/table.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/terminal_theme.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/text.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/theme.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/rich/themes.py rename {lib => python/lib}/site-packages/pip/_vendor/rich/traceback.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/rich/tree.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/six.py rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/_asyncio.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/_utils.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/after.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/before.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/before_sleep.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/tenacity/nap.py rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/retry.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/stop.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/tornadoweb.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tenacity/wait.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tomli/__init__.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tomli/_parser.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tomli/_re.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/tomli/_types.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/typing_extensions.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/__init__.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/_collections.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/_version.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/connection.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/connectionpool.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/contrib/appengine.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/contrib/securetransport.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/packages/six.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/poolmanager.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/request.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/response.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/queue.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/request.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/response.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/retry.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/ssl_.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py (100%) create mode 100644 python/lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/timeout.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/url.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/urllib3/util/wait.py (100%) rename {lib => python/lib}/site-packages/pip/_vendor/vendor.txt (100%) create mode 100644 python/lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 python/lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 python/lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 python/lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 python/lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 python/lib/site-packages/pip/py.typed rename lib64 => python/lib64 (100%) create mode 100644 python/pyvenv.cfg rename requirements.txt => python/requirements.txt (100%) create mode 100644 python/share/bash-completion/completions/yt-dlp rename {share => python/share}/doc/yt_dlp/README.txt (93%) rename {share => python/share}/fish/vendor_completions.d/yt-dlp.fish (95%) rename {share => python/share}/man/man1/mid3cp.1 (100%) rename {share => python/share}/man/man1/mid3iconv.1 (100%) rename {share => python/share}/man/man1/mid3v2.1 (100%) rename {share => python/share}/man/man1/moggsplit.1 (100%) rename {share => python/share}/man/man1/mutagen-inspect.1 (100%) rename {share => python/share}/man/man1/mutagen-pony.1 (100%) rename {share => python/share}/man/man1/yt-dlp.1 (93%) create mode 100644 python/share/zsh/site-functions/_yt-dlp rename {static => python/static}/LICENSE.txt (100%) rename {static => python/static}/css/line-awesome.css (100%) rename {static => python/static}/css/line-awesome.min.css (100%) rename {static => python/static}/css/style.css (100%) rename {static => python/static}/favicon.svg (100%) rename {static => python/static}/fonts/la-brands-400.eot (100%) rename {static => python/static}/fonts/la-brands-400.svg (100%) rename {static => python/static}/fonts/la-brands-400.ttf (100%) rename {static => python/static}/fonts/la-brands-400.woff (100%) rename {static => python/static}/fonts/la-brands-400.woff2 (100%) rename {static => python/static}/fonts/la-regular-400.eot (100%) rename {static => python/static}/fonts/la-regular-400.svg (100%) rename {static => python/static}/fonts/la-regular-400.ttf (100%) rename {static => python/static}/fonts/la-regular-400.woff (100%) rename {static => python/static}/fonts/la-regular-400.woff2 (100%) rename {static => python/static}/fonts/la-solid-900.eot (100%) rename {static => python/static}/fonts/la-solid-900.svg (100%) rename {static => python/static}/fonts/la-solid-900.ttf (100%) rename {static => python/static}/fonts/la-solid-900.woff (100%) rename {static => python/static}/fonts/la-solid-900.woff2 (100%) rename {static => python/static}/img/bg.png (100%) rename {static => python/static}/img/vinyl-card.jpg (100%) rename {static => python/static}/img/vinyl-card.png (100%) rename {static => python/static}/img/vinyl-card.xcf (100%) rename {static => python/static}/img/vinyl.png (100%) rename {static => python/static}/img/vinyl.xcf (100%) rename {static => python/static}/js/app.js (100%) rename {static => python/static}/line-awesome.fig (100%) rename {static => python/static}/scss/_bordered_pulled.scss (100%) rename {static => python/static}/scss/_core.scss (100%) rename {static => python/static}/scss/_fixed-width.scss (100%) rename {static => python/static}/scss/_icons.scss (100%) rename {static => python/static}/scss/_larger.scss (100%) rename {static => python/static}/scss/_list.scss (100%) rename {static => python/static}/scss/_mixins.scss (100%) rename {static => python/static}/scss/_path.scss (100%) rename {static => python/static}/scss/_rotated-flipped.scss (100%) rename {static => python/static}/scss/_screen-reader.scss (100%) rename {static => python/static}/scss/_stacked.scss (100%) rename {static => python/static}/scss/_variables.scss (100%) rename {static => python/static}/scss/line-awesome.scss (100%) rename {static => python/static}/svg/500px.svg (100%) rename {static => python/static}/svg/accessible-icon.svg (100%) rename {static => python/static}/svg/accusoft.svg (100%) rename {static => python/static}/svg/acquisitions-incorporated.svg (100%) rename {static => python/static}/svg/ad-solid.svg (100%) rename {static => python/static}/svg/address-book-solid.svg (100%) rename {static => python/static}/svg/address-book.svg (100%) rename {static => python/static}/svg/address-card-solid.svg (100%) rename {static => python/static}/svg/address-card.svg (100%) rename {static => python/static}/svg/adjust-solid.svg (100%) rename {static => python/static}/svg/adn.svg (100%) rename {static => python/static}/svg/adobe.svg (100%) rename {static => python/static}/svg/adversal.svg (100%) rename {static => python/static}/svg/affiliatetheme.svg (100%) rename {static => python/static}/svg/air-freshener-solid.svg (100%) rename {static => python/static}/svg/airbnb.svg (100%) rename {static => python/static}/svg/algolia.svg (100%) rename {static => python/static}/svg/align-center-solid.svg (100%) rename {static => python/static}/svg/align-justify-solid.svg (100%) rename {static => python/static}/svg/align-left-solid.svg (100%) rename {static => python/static}/svg/align-right-solid.svg (100%) rename {static => python/static}/svg/alipay.svg (100%) rename {static => python/static}/svg/allergies-solid.svg (100%) rename {static => python/static}/svg/amazon-pay.svg (100%) rename {static => python/static}/svg/amazon.svg (100%) rename {static => python/static}/svg/ambulance-solid.svg (100%) rename {static => python/static}/svg/american-sign-language-interpreting-solid.svg (100%) rename {static => python/static}/svg/amilia.svg (100%) rename {static => python/static}/svg/anchor-solid.svg (100%) rename {static => python/static}/svg/android.svg (100%) rename {static => python/static}/svg/angellist.svg (100%) rename {static => python/static}/svg/angle-double-down-solid.svg (100%) rename {static => python/static}/svg/angle-double-left-solid.svg (100%) rename {static => python/static}/svg/angle-double-right-solid.svg (100%) rename {static => python/static}/svg/angle-double-up-solid.svg (100%) rename {static => python/static}/svg/angle-down-solid.svg (100%) rename {static => python/static}/svg/angle-left-solid.svg (100%) rename {static => python/static}/svg/angle-right-solid.svg (100%) rename {static => python/static}/svg/angle-up-solid.svg (100%) rename {static => python/static}/svg/angry-solid.svg (100%) rename {static => python/static}/svg/angry.svg (100%) rename {static => python/static}/svg/angrycreative.svg (100%) rename {static => python/static}/svg/angular.svg (100%) rename {static => python/static}/svg/ankh-solid.svg (100%) rename {static => python/static}/svg/app-store-ios.svg (100%) rename {static => python/static}/svg/app-store.svg (100%) rename {static => python/static}/svg/apper.svg (100%) rename {static => python/static}/svg/apple-alt-solid.svg (100%) rename {static => python/static}/svg/apple-pay.svg (100%) rename {static => python/static}/svg/apple.svg (100%) rename {static => python/static}/svg/archive-solid.svg (100%) rename {static => python/static}/svg/archway-solid.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-down-solid.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-down.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-left-solid.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-left.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-right-solid.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-right.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-up-solid.svg (100%) rename {static => python/static}/svg/arrow-alt-circle-up.svg (100%) rename {static => python/static}/svg/arrow-circle-down-solid.svg (100%) rename {static => python/static}/svg/arrow-circle-left-solid.svg (100%) rename {static => python/static}/svg/arrow-circle-right-solid.svg (100%) rename {static => python/static}/svg/arrow-circle-up-solid.svg (100%) rename {static => python/static}/svg/arrow-down-solid.svg (100%) rename {static => python/static}/svg/arrow-left-solid.svg (100%) rename {static => python/static}/svg/arrow-right-solid.svg (100%) rename {static => python/static}/svg/arrow-up-solid.svg (100%) rename {static => python/static}/svg/arrows-alt-h-solid.svg (100%) rename {static => python/static}/svg/arrows-alt-solid.svg (100%) rename {static => python/static}/svg/arrows-alt-v-solid.svg (100%) rename {static => python/static}/svg/artstation.svg (100%) rename {static => python/static}/svg/assistive-listening-systems-solid.svg (100%) rename {static => python/static}/svg/asterisk-solid.svg (100%) rename {static => python/static}/svg/asymmetrik.svg (100%) rename {static => python/static}/svg/at-solid.svg (100%) rename {static => python/static}/svg/atlas-solid.svg (100%) rename {static => python/static}/svg/atlassian.svg (100%) rename {static => python/static}/svg/atom-solid.svg (100%) rename {static => python/static}/svg/audible.svg (100%) rename {static => python/static}/svg/audio-description-solid.svg (100%) rename {static => python/static}/svg/autoprefixer.svg (100%) rename {static => python/static}/svg/avianex.svg (100%) rename {static => python/static}/svg/aviato.svg (100%) rename {static => python/static}/svg/award-solid.svg (100%) rename {static => python/static}/svg/aws.svg (100%) rename {static => python/static}/svg/baby-carriage-solid.svg (100%) rename {static => python/static}/svg/baby-solid.svg (100%) rename {static => python/static}/svg/backspace-solid.svg (100%) rename {static => python/static}/svg/backward-solid.svg (100%) rename {static => python/static}/svg/bacon-solid.svg (100%) rename {static => python/static}/svg/balance-scale-left-solid.svg (100%) rename {static => python/static}/svg/balance-scale-right-solid.svg (100%) rename {static => python/static}/svg/balance-scale-solid.svg (100%) rename {static => python/static}/svg/ban-solid.svg (100%) rename {static => python/static}/svg/band-aid-solid.svg (100%) rename {static => python/static}/svg/bandcamp.svg (100%) rename {static => python/static}/svg/barcode-solid.svg (100%) rename {static => python/static}/svg/bars-solid.svg (100%) rename {static => python/static}/svg/baseball-ball-solid.svg (100%) rename {static => python/static}/svg/basketball-ball-solid.svg (100%) rename {static => python/static}/svg/bath-solid.svg (100%) rename {static => python/static}/svg/battery-empty-solid.svg (100%) rename {static => python/static}/svg/battery-full-solid.svg (100%) rename {static => python/static}/svg/battery-half-solid.svg (100%) rename {static => python/static}/svg/battery-quarter-solid.svg (100%) rename {static => python/static}/svg/battery-three-quarters-solid.svg (100%) rename {static => python/static}/svg/battle-net.svg (100%) rename {static => python/static}/svg/bed-solid.svg (100%) rename {static => python/static}/svg/beer-solid.svg (100%) rename {static => python/static}/svg/behance-square.svg (100%) rename {static => python/static}/svg/behance.svg (100%) rename {static => python/static}/svg/bell-slash-solid.svg (100%) rename {static => python/static}/svg/bell-slash.svg (100%) rename {static => python/static}/svg/bell-solid.svg (100%) rename {static => python/static}/svg/bell.svg (100%) rename {static => python/static}/svg/bezier-curve-solid.svg (100%) rename {static => python/static}/svg/bible-solid.svg (100%) rename {static => python/static}/svg/bicycle-solid.svg (100%) rename {static => python/static}/svg/biking-solid.svg (100%) rename {static => python/static}/svg/bimobject.svg (100%) rename {static => python/static}/svg/binoculars-solid.svg (100%) rename {static => python/static}/svg/biohazard-solid.svg (100%) rename {static => python/static}/svg/birthday-cake-solid.svg (100%) rename {static => python/static}/svg/bitbucket.svg (100%) rename {static => python/static}/svg/bitcoin.svg (100%) rename {static => python/static}/svg/bity.svg (100%) rename {static => python/static}/svg/black-tie.svg (100%) rename {static => python/static}/svg/blackberry.svg (100%) rename {static => python/static}/svg/blender-phone-solid.svg (100%) rename {static => python/static}/svg/blender-solid.svg (100%) rename {static => python/static}/svg/blind-solid.svg (100%) rename {static => python/static}/svg/blog-solid.svg (100%) rename {static => python/static}/svg/blogger-b.svg (100%) rename {static => python/static}/svg/blogger.svg (100%) rename {static => python/static}/svg/bluetooth-b.svg (100%) rename {static => python/static}/svg/bluetooth.svg (100%) rename {static => python/static}/svg/bold-solid.svg (100%) rename {static => python/static}/svg/bolt-solid.svg (100%) rename {static => python/static}/svg/bomb-solid.svg (100%) rename {static => python/static}/svg/bone-solid.svg (100%) rename {static => python/static}/svg/bong-solid.svg (100%) rename {static => python/static}/svg/book-dead-solid.svg (100%) rename {static => python/static}/svg/book-medical-solid.svg (100%) rename {static => python/static}/svg/book-open-solid.svg (100%) rename {static => python/static}/svg/book-reader-solid.svg (100%) rename {static => python/static}/svg/book-solid.svg (100%) rename {static => python/static}/svg/bookmark-solid.svg (100%) rename {static => python/static}/svg/bookmark.svg (100%) rename {static => python/static}/svg/bootstrap.svg (100%) rename {static => python/static}/svg/border-all-solid.svg (100%) rename {static => python/static}/svg/border-none-solid.svg (100%) rename {static => python/static}/svg/border-style-solid.svg (100%) rename {static => python/static}/svg/bowling-ball-solid.svg (100%) rename {static => python/static}/svg/box-open-solid.svg (100%) rename {static => python/static}/svg/box-solid.svg (100%) rename {static => python/static}/svg/boxes-solid.svg (100%) rename {static => python/static}/svg/braille-solid.svg (100%) rename {static => python/static}/svg/brain-solid.svg (100%) rename {static => python/static}/svg/bread-slice-solid.svg (100%) rename {static => python/static}/svg/briefcase-medical-solid.svg (100%) rename {static => python/static}/svg/briefcase-solid.svg (100%) rename {static => python/static}/svg/broadcast-tower-solid.svg (100%) rename {static => python/static}/svg/broom-solid.svg (100%) rename {static => python/static}/svg/brush-solid.svg (100%) rename {static => python/static}/svg/btc.svg (100%) rename {static => python/static}/svg/buffer.svg (100%) rename {static => python/static}/svg/bug-solid.svg (100%) rename {static => python/static}/svg/building-solid.svg (100%) rename {static => python/static}/svg/building.svg (100%) rename {static => python/static}/svg/bullhorn-solid.svg (100%) rename {static => python/static}/svg/bullseye-solid.svg (100%) rename {static => python/static}/svg/burn-solid.svg (100%) rename {static => python/static}/svg/buromobelexperte.svg (100%) rename {static => python/static}/svg/bus-alt-solid.svg (100%) rename {static => python/static}/svg/bus-solid.svg (100%) rename {static => python/static}/svg/business-time-solid.svg (100%) rename {static => python/static}/svg/buy-n-large.svg (100%) rename {static => python/static}/svg/buysellads.svg (100%) rename {static => python/static}/svg/calculator-solid.svg (100%) rename {static => python/static}/svg/calendar-alt-solid.svg (100%) rename {static => python/static}/svg/calendar-alt.svg (100%) rename {static => python/static}/svg/calendar-check-solid.svg (100%) rename {static => python/static}/svg/calendar-check.svg (100%) rename {static => python/static}/svg/calendar-day-solid.svg (100%) rename {static => python/static}/svg/calendar-minus-solid.svg (100%) rename {static => python/static}/svg/calendar-minus.svg (100%) rename {static => python/static}/svg/calendar-plus-solid.svg (100%) rename {static => python/static}/svg/calendar-plus.svg (100%) rename {static => python/static}/svg/calendar-solid.svg (100%) rename {static => python/static}/svg/calendar-times-solid.svg (100%) rename {static => python/static}/svg/calendar-times.svg (100%) rename {static => python/static}/svg/calendar-week-solid.svg (100%) rename {static => python/static}/svg/calendar.svg (100%) rename {static => python/static}/svg/camera-retro-solid.svg (100%) rename {static => python/static}/svg/camera-solid.svg (100%) rename {static => python/static}/svg/campground-solid.svg (100%) rename {static => python/static}/svg/canadian-maple-leaf.svg (100%) rename {static => python/static}/svg/candy-cane-solid.svg (100%) rename {static => python/static}/svg/cannabis-solid.svg (100%) rename {static => python/static}/svg/capsules-solid.svg (100%) rename {static => python/static}/svg/car-alt-solid.svg (100%) rename {static => python/static}/svg/car-battery-solid.svg (100%) rename {static => python/static}/svg/car-crash-solid.svg (100%) rename {static => python/static}/svg/car-side-solid.svg (100%) rename {static => python/static}/svg/car-solid.svg (100%) rename {static => python/static}/svg/caret-down-solid.svg (100%) rename {static => python/static}/svg/caret-left-solid.svg (100%) rename {static => python/static}/svg/caret-right-solid.svg (100%) rename {static => python/static}/svg/caret-square-down-solid.svg (100%) rename {static => python/static}/svg/caret-square-down.svg (100%) rename {static => python/static}/svg/caret-square-left-solid.svg (100%) rename {static => python/static}/svg/caret-square-left.svg (100%) rename {static => python/static}/svg/caret-square-right-solid.svg (100%) rename {static => python/static}/svg/caret-square-right.svg (100%) rename {static => python/static}/svg/caret-square-up-solid.svg (100%) rename {static => python/static}/svg/caret-square-up.svg (100%) rename {static => python/static}/svg/caret-up-solid.svg (100%) rename {static => python/static}/svg/carrot-solid.svg (100%) rename {static => python/static}/svg/cart-arrow-down-solid.svg (100%) rename {static => python/static}/svg/cart-plus-solid.svg (100%) rename {static => python/static}/svg/cash-register-solid.svg (100%) rename {static => python/static}/svg/cat-solid.svg (100%) rename {static => python/static}/svg/cc-amazon-pay.svg (100%) rename {static => python/static}/svg/cc-amex.svg (100%) rename {static => python/static}/svg/cc-apple-pay.svg (100%) rename {static => python/static}/svg/cc-diners-club.svg (100%) rename {static => python/static}/svg/cc-discover.svg (100%) rename {static => python/static}/svg/cc-jcb.svg (100%) rename {static => python/static}/svg/cc-mastercard.svg (100%) rename {static => python/static}/svg/cc-paypal.svg (100%) rename {static => python/static}/svg/cc-stripe.svg (100%) rename {static => python/static}/svg/cc-visa.svg (100%) rename {static => python/static}/svg/centercode.svg (100%) rename {static => python/static}/svg/centos.svg (100%) rename {static => python/static}/svg/certificate-solid.svg (100%) rename {static => python/static}/svg/chair-solid.svg (100%) rename {static => python/static}/svg/chalkboard-solid.svg (100%) rename {static => python/static}/svg/chalkboard-teacher-solid.svg (100%) rename {static => python/static}/svg/charging-station-solid.svg (100%) rename {static => python/static}/svg/chart-area-solid.svg (100%) rename {static => python/static}/svg/chart-bar-solid.svg (100%) rename {static => python/static}/svg/chart-bar.svg (100%) rename {static => python/static}/svg/chart-line-solid.svg (100%) rename {static => python/static}/svg/chart-pie-solid.svg (100%) rename {static => python/static}/svg/check-circle-solid.svg (100%) rename {static => python/static}/svg/check-circle.svg (100%) rename {static => python/static}/svg/check-double-solid.svg (100%) rename {static => python/static}/svg/check-solid.svg (100%) rename {static => python/static}/svg/check-square-solid.svg (100%) rename {static => python/static}/svg/check-square.svg (100%) rename {static => python/static}/svg/cheese-solid.svg (100%) rename {static => python/static}/svg/chess-bishop-solid.svg (100%) rename {static => python/static}/svg/chess-board-solid.svg (100%) rename {static => python/static}/svg/chess-king-solid.svg (100%) rename {static => python/static}/svg/chess-knight-solid.svg (100%) rename {static => python/static}/svg/chess-pawn-solid.svg (100%) rename {static => python/static}/svg/chess-queen-solid.svg (100%) rename {static => python/static}/svg/chess-rook-solid.svg (100%) rename {static => python/static}/svg/chess-solid.svg (100%) rename {static => python/static}/svg/chevron-circle-down-solid.svg (100%) rename {static => python/static}/svg/chevron-circle-left-solid.svg (100%) rename {static => python/static}/svg/chevron-circle-right-solid.svg (100%) rename {static => python/static}/svg/chevron-circle-up-solid.svg (100%) rename {static => python/static}/svg/chevron-down-solid.svg (100%) rename {static => python/static}/svg/chevron-left-solid.svg (100%) rename {static => python/static}/svg/chevron-right-solid.svg (100%) rename {static => python/static}/svg/chevron-up-solid.svg (100%) rename {static => python/static}/svg/child-solid.svg (100%) rename {static => python/static}/svg/chrome.svg (100%) rename {static => python/static}/svg/chromecast.svg (100%) rename {static => python/static}/svg/church-solid.svg (100%) rename {static => python/static}/svg/circle-notch-solid.svg (100%) rename {static => python/static}/svg/circle-solid.svg (100%) rename {static => python/static}/svg/circle.svg (100%) rename {static => python/static}/svg/city-solid.svg (100%) rename {static => python/static}/svg/clinic-medical-solid.svg (100%) rename {static => python/static}/svg/clipboard-check-solid.svg (100%) rename {static => python/static}/svg/clipboard-list-solid.svg (100%) rename {static => python/static}/svg/clipboard-solid.svg (100%) rename {static => python/static}/svg/clipboard.svg (100%) rename {static => python/static}/svg/clock-solid.svg (100%) rename {static => python/static}/svg/clock.svg (100%) rename {static => python/static}/svg/clone-solid.svg (100%) rename {static => python/static}/svg/clone.svg (100%) rename {static => python/static}/svg/closed-captioning-solid.svg (100%) rename {static => python/static}/svg/closed-captioning.svg (100%) rename {static => python/static}/svg/cloud-download-alt-solid.svg (100%) rename {static => python/static}/svg/cloud-meatball-solid.svg (100%) rename {static => python/static}/svg/cloud-moon-rain-solid.svg (100%) rename {static => python/static}/svg/cloud-moon-solid.svg (100%) rename {static => python/static}/svg/cloud-rain-solid.svg (100%) rename {static => python/static}/svg/cloud-showers-heavy-solid.svg (100%) rename {static => python/static}/svg/cloud-solid.svg (100%) rename {static => python/static}/svg/cloud-sun-rain-solid.svg (100%) rename {static => python/static}/svg/cloud-sun-solid.svg (100%) rename {static => python/static}/svg/cloud-upload-alt-solid.svg (100%) rename {static => python/static}/svg/cloudscale.svg (100%) rename {static => python/static}/svg/cloudsmith.svg (100%) rename {static => python/static}/svg/cloudversify.svg (100%) rename {static => python/static}/svg/cocktail-solid.svg (100%) rename {static => python/static}/svg/code-branch-solid.svg (100%) rename {static => python/static}/svg/code-solid.svg (100%) rename {static => python/static}/svg/codepen.svg (100%) rename {static => python/static}/svg/codiepie.svg (100%) rename {static => python/static}/svg/coffee-solid.svg (100%) rename {static => python/static}/svg/cog-solid.svg (100%) rename {static => python/static}/svg/cogs-solid.svg (100%) rename {static => python/static}/svg/coins-solid.svg (100%) rename {static => python/static}/svg/columns-solid.svg (100%) rename {static => python/static}/svg/comment-alt-solid.svg (100%) rename {static => python/static}/svg/comment-alt.svg (100%) rename {static => python/static}/svg/comment-dollar-solid.svg (100%) rename {static => python/static}/svg/comment-dots-solid.svg (100%) rename {static => python/static}/svg/comment-dots.svg (100%) rename {static => python/static}/svg/comment-medical-solid.svg (100%) rename {static => python/static}/svg/comment-slash-solid.svg (100%) rename {static => python/static}/svg/comment-solid.svg (100%) rename {static => python/static}/svg/comment.svg (100%) rename {static => python/static}/svg/comments-dollar-solid.svg (100%) rename {static => python/static}/svg/comments-solid.svg (100%) rename {static => python/static}/svg/comments.svg (100%) rename {static => python/static}/svg/compact-disc-solid.svg (100%) rename {static => python/static}/svg/compass-solid.svg (100%) rename {static => python/static}/svg/compass.svg (100%) rename {static => python/static}/svg/compress-arrows-alt-solid.svg (100%) rename {static => python/static}/svg/compress-solid.svg (100%) rename {static => python/static}/svg/concierge-bell-solid.svg (100%) rename {static => python/static}/svg/confluence.svg (100%) rename {static => python/static}/svg/connectdevelop.svg (100%) rename {static => python/static}/svg/contao.svg (100%) rename {static => python/static}/svg/cookie-bite-solid.svg (100%) rename {static => python/static}/svg/cookie-solid.svg (100%) rename {static => python/static}/svg/copy-solid.svg (100%) rename {static => python/static}/svg/copy.svg (100%) rename {static => python/static}/svg/copyright-solid.svg (100%) rename {static => python/static}/svg/copyright.svg (100%) rename {static => python/static}/svg/cotton-bureau.svg (100%) rename {static => python/static}/svg/couch-solid.svg (100%) rename {static => python/static}/svg/cpanel.svg (100%) rename {static => python/static}/svg/creative-commons-by.svg (100%) rename {static => python/static}/svg/creative-commons-nc-eu.svg (100%) rename {static => python/static}/svg/creative-commons-nc-jp.svg (100%) rename {static => python/static}/svg/creative-commons-nc.svg (100%) rename {static => python/static}/svg/creative-commons-nd.svg (100%) rename {static => python/static}/svg/creative-commons-pd-alt.svg (100%) rename {static => python/static}/svg/creative-commons-pd.svg (100%) rename {static => python/static}/svg/creative-commons-remix.svg (100%) rename {static => python/static}/svg/creative-commons-sa.svg (100%) rename {static => python/static}/svg/creative-commons-sampling-plus.svg (100%) rename {static => python/static}/svg/creative-commons-sampling.svg (100%) rename {static => python/static}/svg/creative-commons-share.svg (100%) rename {static => python/static}/svg/creative-commons-zero.svg (100%) rename {static => python/static}/svg/creative-commons.svg (100%) rename {static => python/static}/svg/credit-card-solid.svg (100%) rename {static => python/static}/svg/credit-card.svg (100%) rename {static => python/static}/svg/critical-role.svg (100%) rename {static => python/static}/svg/crop-alt-solid.svg (100%) rename {static => python/static}/svg/crop-solid.svg (100%) rename {static => python/static}/svg/cross-solid.svg (100%) rename {static => python/static}/svg/crosshairs-solid.svg (100%) rename {static => python/static}/svg/crow-solid.svg (100%) rename {static => python/static}/svg/crown-solid.svg (100%) rename {static => python/static}/svg/crutch-solid.svg (100%) rename {static => python/static}/svg/css3-alt.svg (100%) rename {static => python/static}/svg/css3.svg (100%) rename {static => python/static}/svg/cube-solid.svg (100%) rename {static => python/static}/svg/cubes-solid.svg (100%) rename {static => python/static}/svg/cut-solid.svg (100%) rename {static => python/static}/svg/cuttlefish.svg (100%) rename {static => python/static}/svg/d-and-d-beyond.svg (100%) rename {static => python/static}/svg/d-and-d.svg (100%) rename {static => python/static}/svg/dashcube.svg (100%) rename {static => python/static}/svg/database-solid.svg (100%) rename {static => python/static}/svg/deaf-solid.svg (100%) rename {static => python/static}/svg/delicious.svg (100%) rename {static => python/static}/svg/democrat-solid.svg (100%) rename {static => python/static}/svg/deploydog.svg (100%) rename {static => python/static}/svg/deskpro.svg (100%) rename {static => python/static}/svg/desktop-solid.svg (100%) rename {static => python/static}/svg/dev.svg (100%) rename {static => python/static}/svg/deviantart.svg (100%) rename {static => python/static}/svg/dharmachakra-solid.svg (100%) rename {static => python/static}/svg/dhl.svg (100%) rename {static => python/static}/svg/diagnoses-solid.svg (100%) rename {static => python/static}/svg/diaspora.svg (100%) rename {static => python/static}/svg/dice-d20-solid.svg (100%) rename {static => python/static}/svg/dice-d6-solid.svg (100%) rename {static => python/static}/svg/dice-five-solid.svg (100%) rename {static => python/static}/svg/dice-four-solid.svg (100%) rename {static => python/static}/svg/dice-one-solid.svg (100%) rename {static => python/static}/svg/dice-six-solid.svg (100%) rename {static => python/static}/svg/dice-solid.svg (100%) rename {static => python/static}/svg/dice-three-solid.svg (100%) rename {static => python/static}/svg/dice-two-solid.svg (100%) rename {static => python/static}/svg/digg.svg (100%) rename {static => python/static}/svg/digital-ocean.svg (100%) rename {static => python/static}/svg/digital-tachograph-solid.svg (100%) rename {static => python/static}/svg/directions-solid.svg (100%) rename {static => python/static}/svg/discord.svg (100%) rename {static => python/static}/svg/discourse.svg (100%) rename {static => python/static}/svg/divide-solid.svg (100%) rename {static => python/static}/svg/dizzy-solid.svg (100%) rename {static => python/static}/svg/dizzy.svg (100%) rename {static => python/static}/svg/dna-solid.svg (100%) rename {static => python/static}/svg/dochub.svg (100%) rename {static => python/static}/svg/docker.svg (100%) rename {static => python/static}/svg/dog-solid.svg (100%) rename {static => python/static}/svg/dollar-sign-solid.svg (100%) rename {static => python/static}/svg/dolly-flatbed-solid.svg (100%) rename {static => python/static}/svg/dolly-solid.svg (100%) rename {static => python/static}/svg/donate-solid.svg (100%) rename {static => python/static}/svg/door-closed-solid.svg (100%) rename {static => python/static}/svg/door-open-solid.svg (100%) rename {static => python/static}/svg/dot-circle-solid.svg (100%) rename {static => python/static}/svg/dot-circle.svg (100%) rename {static => python/static}/svg/dove-solid.svg (100%) rename {static => python/static}/svg/download-solid.svg (100%) rename {static => python/static}/svg/draft2digital.svg (100%) rename {static => python/static}/svg/drafting-compass-solid.svg (100%) rename {static => python/static}/svg/dragon-solid.svg (100%) rename {static => python/static}/svg/draw-polygon-solid.svg (100%) rename {static => python/static}/svg/dribbble-square.svg (100%) rename {static => python/static}/svg/dribbble.svg (100%) rename {static => python/static}/svg/dropbox.svg (100%) rename {static => python/static}/svg/drum-solid.svg (100%) rename {static => python/static}/svg/drum-steelpan-solid.svg (100%) rename {static => python/static}/svg/drumstick-bite-solid.svg (100%) rename {static => python/static}/svg/drupal.svg (100%) rename {static => python/static}/svg/dumbbell-solid.svg (100%) rename {static => python/static}/svg/dumpster-fire-solid.svg (100%) rename {static => python/static}/svg/dumpster-solid.svg (100%) rename {static => python/static}/svg/dungeon-solid.svg (100%) rename {static => python/static}/svg/dyalog.svg (100%) rename {static => python/static}/svg/earlybirds.svg (100%) rename {static => python/static}/svg/ebay.svg (100%) rename {static => python/static}/svg/edge.svg (100%) rename {static => python/static}/svg/edit-solid.svg (100%) rename {static => python/static}/svg/edit.svg (100%) rename {static => python/static}/svg/egg-solid.svg (100%) rename {static => python/static}/svg/eject-solid.svg (100%) rename {static => python/static}/svg/elementor.svg (100%) rename {static => python/static}/svg/ellipsis-h-solid.svg (100%) rename {static => python/static}/svg/ellipsis-v-solid.svg (100%) rename {static => python/static}/svg/ello.svg (100%) rename {static => python/static}/svg/ember.svg (100%) rename {static => python/static}/svg/empire.svg (100%) rename {static => python/static}/svg/envelope-open-solid.svg (100%) rename {static => python/static}/svg/envelope-open-text-solid.svg (100%) rename {static => python/static}/svg/envelope-open.svg (100%) rename {static => python/static}/svg/envelope-solid.svg (100%) rename {static => python/static}/svg/envelope-square-solid.svg (100%) rename {static => python/static}/svg/envelope.svg (100%) rename {static => python/static}/svg/envira.svg (100%) rename {static => python/static}/svg/equals-solid.svg (100%) rename {static => python/static}/svg/eraser-solid.svg (100%) rename {static => python/static}/svg/erlang.svg (100%) rename {static => python/static}/svg/ethereum.svg (100%) rename {static => python/static}/svg/ethernet-solid.svg (100%) rename {static => python/static}/svg/etsy.svg (100%) rename {static => python/static}/svg/euro-sign-solid.svg (100%) rename {static => python/static}/svg/evernote.svg (100%) rename {static => python/static}/svg/exchange-alt-solid.svg (100%) rename {static => python/static}/svg/exclamation-circle-solid.svg (100%) rename {static => python/static}/svg/exclamation-solid.svg (100%) rename {static => python/static}/svg/exclamation-triangle-solid.svg (100%) rename {static => python/static}/svg/expand-arrows-alt-solid.svg (100%) rename {static => python/static}/svg/expand-solid.svg (100%) rename {static => python/static}/svg/expeditedssl.svg (100%) rename {static => python/static}/svg/external-link-alt-solid.svg (100%) rename {static => python/static}/svg/external-link-square-alt-solid.svg (100%) rename {static => python/static}/svg/eye-dropper-solid.svg (100%) rename {static => python/static}/svg/eye-slash-solid.svg (100%) rename {static => python/static}/svg/eye-slash.svg (100%) rename {static => python/static}/svg/eye-solid.svg (100%) rename {static => python/static}/svg/eye.svg (100%) rename {static => python/static}/svg/facebook-f.svg (100%) rename {static => python/static}/svg/facebook-messenger.svg (100%) rename {static => python/static}/svg/facebook-square.svg (100%) rename {static => python/static}/svg/facebook.svg (100%) rename {static => python/static}/svg/fan-solid.svg (100%) rename {static => python/static}/svg/fantasy-flight-games.svg (100%) rename {static => python/static}/svg/fast-backward-solid.svg (100%) rename {static => python/static}/svg/fast-forward-solid.svg (100%) rename {static => python/static}/svg/fax-solid.svg (100%) rename {static => python/static}/svg/feather-alt-solid.svg (100%) rename {static => python/static}/svg/feather-solid.svg (100%) rename {static => python/static}/svg/fedex.svg (100%) rename {static => python/static}/svg/fedora.svg (100%) rename {static => python/static}/svg/female-solid.svg (100%) rename {static => python/static}/svg/fighter-jet-solid.svg (100%) rename {static => python/static}/svg/figma.svg (100%) rename {static => python/static}/svg/file-alt-solid.svg (100%) rename {static => python/static}/svg/file-alt.svg (100%) rename {static => python/static}/svg/file-archive-solid.svg (100%) rename {static => python/static}/svg/file-archive.svg (100%) rename {static => python/static}/svg/file-audio-solid.svg (100%) rename {static => python/static}/svg/file-audio.svg (100%) rename {static => python/static}/svg/file-code-solid.svg (100%) rename {static => python/static}/svg/file-code.svg (100%) rename {static => python/static}/svg/file-contract-solid.svg (100%) rename {static => python/static}/svg/file-csv-solid.svg (100%) rename {static => python/static}/svg/file-download-solid.svg (100%) rename {static => python/static}/svg/file-excel-solid.svg (100%) rename {static => python/static}/svg/file-excel.svg (100%) rename {static => python/static}/svg/file-export-solid.svg (100%) rename {static => python/static}/svg/file-image-solid.svg (100%) rename {static => python/static}/svg/file-image.svg (100%) rename {static => python/static}/svg/file-import-solid.svg (100%) rename {static => python/static}/svg/file-invoice-dollar-solid.svg (100%) rename {static => python/static}/svg/file-invoice-solid.svg (100%) rename {static => python/static}/svg/file-medical-alt-solid.svg (100%) rename {static => python/static}/svg/file-medical-solid.svg (100%) rename {static => python/static}/svg/file-pdf-solid.svg (100%) rename {static => python/static}/svg/file-pdf.svg (100%) rename {static => python/static}/svg/file-powerpoint-solid.svg (100%) rename {static => python/static}/svg/file-powerpoint.svg (100%) rename {static => python/static}/svg/file-prescription-solid.svg (100%) rename {static => python/static}/svg/file-signature-solid.svg (100%) rename {static => python/static}/svg/file-solid.svg (100%) rename {static => python/static}/svg/file-upload-solid.svg (100%) rename {static => python/static}/svg/file-video-solid.svg (100%) rename {static => python/static}/svg/file-video.svg (100%) rename {static => python/static}/svg/file-word-solid.svg (100%) rename {static => python/static}/svg/file-word.svg (100%) rename {static => python/static}/svg/file.svg (100%) rename {static => python/static}/svg/fill-drip-solid.svg (100%) rename {static => python/static}/svg/fill-solid.svg (100%) rename {static => python/static}/svg/film-solid.svg (100%) rename {static => python/static}/svg/filter-solid.svg (100%) rename {static => python/static}/svg/fingerprint-solid.svg (100%) rename {static => python/static}/svg/fire-alt-solid.svg (100%) rename {static => python/static}/svg/fire-extinguisher-solid.svg (100%) rename {static => python/static}/svg/fire-solid.svg (100%) rename {static => python/static}/svg/firefox.svg (100%) rename {static => python/static}/svg/first-aid-solid.svg (100%) rename {static => python/static}/svg/first-order-alt.svg (100%) rename {static => python/static}/svg/first-order.svg (100%) rename {static => python/static}/svg/firstdraft.svg (100%) rename {static => python/static}/svg/fish-solid.svg (100%) rename {static => python/static}/svg/fist-raised-solid.svg (100%) rename {static => python/static}/svg/flag-checkered-solid.svg (100%) rename {static => python/static}/svg/flag-solid.svg (100%) rename {static => python/static}/svg/flag-usa-solid.svg (100%) rename {static => python/static}/svg/flag.svg (100%) rename {static => python/static}/svg/flask-solid.svg (100%) rename {static => python/static}/svg/flickr.svg (100%) rename {static => python/static}/svg/flipboard.svg (100%) rename {static => python/static}/svg/flushed-solid.svg (100%) rename {static => python/static}/svg/flushed.svg (100%) rename {static => python/static}/svg/fly.svg (100%) rename {static => python/static}/svg/folder-minus-solid.svg (100%) rename {static => python/static}/svg/folder-open-solid.svg (100%) rename {static => python/static}/svg/folder-open.svg (100%) rename {static => python/static}/svg/folder-plus-solid.svg (100%) rename {static => python/static}/svg/folder-solid.svg (100%) rename {static => python/static}/svg/folder.svg (100%) rename {static => python/static}/svg/font-awesome-alt.svg (100%) rename {static => python/static}/svg/font-awesome-flag.svg (100%) rename {static => python/static}/svg/font-awesome.svg (100%) rename {static => python/static}/svg/font-solid.svg (100%) rename {static => python/static}/svg/fonticons-fi.svg (100%) rename {static => python/static}/svg/fonticons.svg (100%) rename {static => python/static}/svg/football-ball-solid.svg (100%) rename {static => python/static}/svg/fort-awesome-alt.svg (100%) rename {static => python/static}/svg/fort-awesome.svg (100%) rename {static => python/static}/svg/forumbee.svg (100%) rename {static => python/static}/svg/forward-solid.svg (100%) rename {static => python/static}/svg/foursquare.svg (100%) rename {static => python/static}/svg/free-code-camp.svg (100%) rename {static => python/static}/svg/freebsd.svg (100%) rename {static => python/static}/svg/frog-solid.svg (100%) rename {static => python/static}/svg/frown-open-solid.svg (100%) rename {static => python/static}/svg/frown-open.svg (100%) rename {static => python/static}/svg/frown-solid.svg (100%) rename {static => python/static}/svg/frown.svg (100%) rename {static => python/static}/svg/fulcrum.svg (100%) rename {static => python/static}/svg/funnel-dollar-solid.svg (100%) rename {static => python/static}/svg/futbol-solid.svg (100%) rename {static => python/static}/svg/futbol.svg (100%) rename {static => python/static}/svg/galactic-republic.svg (100%) rename {static => python/static}/svg/galactic-senate.svg (100%) rename {static => python/static}/svg/gamepad-solid.svg (100%) rename {static => python/static}/svg/gas-pump-solid.svg (100%) rename {static => python/static}/svg/gavel-solid.svg (100%) rename {static => python/static}/svg/gem-solid.svg (100%) rename {static => python/static}/svg/gem.svg (100%) rename {static => python/static}/svg/genderless-solid.svg (100%) rename {static => python/static}/svg/get-pocket.svg (100%) rename {static => python/static}/svg/gg-circle.svg (100%) rename {static => python/static}/svg/gg.svg (100%) rename {static => python/static}/svg/ghost-solid.svg (100%) rename {static => python/static}/svg/gift-solid.svg (100%) rename {static => python/static}/svg/gifts-solid.svg (100%) rename {static => python/static}/svg/git-alt.svg (100%) rename {static => python/static}/svg/git-square.svg (100%) rename {static => python/static}/svg/git.svg (100%) rename {static => python/static}/svg/github-alt.svg (100%) rename {static => python/static}/svg/github-square.svg (100%) rename {static => python/static}/svg/github.svg (100%) rename {static => python/static}/svg/gitkraken.svg (100%) rename {static => python/static}/svg/gitlab.svg (100%) rename {static => python/static}/svg/gitter.svg (100%) rename {static => python/static}/svg/glass-cheers-solid.svg (100%) rename {static => python/static}/svg/glass-martini-alt-solid.svg (100%) rename {static => python/static}/svg/glass-martini-solid.svg (100%) rename {static => python/static}/svg/glass-whiskey-solid.svg (100%) rename {static => python/static}/svg/glasses-solid.svg (100%) rename {static => python/static}/svg/glide-g.svg (100%) rename {static => python/static}/svg/glide.svg (100%) rename {static => python/static}/svg/globe-africa-solid.svg (100%) rename {static => python/static}/svg/globe-americas-solid.svg (100%) rename {static => python/static}/svg/globe-asia-solid.svg (100%) rename {static => python/static}/svg/globe-europe-solid.svg (100%) rename {static => python/static}/svg/globe-solid.svg (100%) rename {static => python/static}/svg/gofore.svg (100%) rename {static => python/static}/svg/golf-ball-solid.svg (100%) rename {static => python/static}/svg/goodreads-g.svg (100%) rename {static => python/static}/svg/goodreads.svg (100%) rename {static => python/static}/svg/google-drive.svg (100%) rename {static => python/static}/svg/google-play.svg (100%) rename {static => python/static}/svg/google-plus-g.svg (100%) rename {static => python/static}/svg/google-plus-square.svg (100%) rename {static => python/static}/svg/google-plus.svg (100%) rename {static => python/static}/svg/google-wallet.svg (100%) rename {static => python/static}/svg/google.svg (100%) rename {static => python/static}/svg/gopuram-solid.svg (100%) rename {static => python/static}/svg/graduation-cap-solid.svg (100%) rename {static => python/static}/svg/gratipay.svg (100%) rename {static => python/static}/svg/grav.svg (100%) rename {static => python/static}/svg/greater-than-equal-solid.svg (100%) rename {static => python/static}/svg/greater-than-solid.svg (100%) rename {static => python/static}/svg/grimace-solid.svg (100%) rename {static => python/static}/svg/grimace.svg (100%) rename {static => python/static}/svg/grin-alt-solid.svg (100%) rename {static => python/static}/svg/grin-alt.svg (100%) rename {static => python/static}/svg/grin-beam-solid.svg (100%) rename {static => python/static}/svg/grin-beam-sweat-solid.svg (100%) rename {static => python/static}/svg/grin-beam-sweat.svg (100%) rename {static => python/static}/svg/grin-beam.svg (100%) rename {static => python/static}/svg/grin-hearts-solid.svg (100%) rename {static => python/static}/svg/grin-hearts.svg (100%) rename {static => python/static}/svg/grin-solid.svg (100%) rename {static => python/static}/svg/grin-squint-solid.svg (100%) rename {static => python/static}/svg/grin-squint-tears-solid.svg (100%) rename {static => python/static}/svg/grin-squint-tears.svg (100%) rename {static => python/static}/svg/grin-squint.svg (100%) rename {static => python/static}/svg/grin-stars-solid.svg (100%) rename {static => python/static}/svg/grin-stars.svg (100%) rename {static => python/static}/svg/grin-tears-solid.svg (100%) rename {static => python/static}/svg/grin-tears.svg (100%) rename {static => python/static}/svg/grin-tongue-solid.svg (100%) rename {static => python/static}/svg/grin-tongue-squint-solid.svg (100%) rename {static => python/static}/svg/grin-tongue-squint.svg (100%) rename {static => python/static}/svg/grin-tongue-wink-solid.svg (100%) rename {static => python/static}/svg/grin-tongue-wink.svg (100%) rename {static => python/static}/svg/grin-tongue.svg (100%) rename {static => python/static}/svg/grin-wink-solid.svg (100%) rename {static => python/static}/svg/grin-wink.svg (100%) rename {static => python/static}/svg/grin.svg (100%) rename {static => python/static}/svg/grip-horizontal-solid.svg (100%) rename {static => python/static}/svg/grip-lines-solid.svg (100%) rename {static => python/static}/svg/grip-lines-vertical-solid.svg (100%) rename {static => python/static}/svg/grip-vertical-solid.svg (100%) rename {static => python/static}/svg/gripfire.svg (100%) rename {static => python/static}/svg/grunt.svg (100%) rename {static => python/static}/svg/guitar-solid.svg (100%) rename {static => python/static}/svg/gulp.svg (100%) rename {static => python/static}/svg/h-square-solid.svg (100%) rename {static => python/static}/svg/hacker-news-square.svg (100%) rename {static => python/static}/svg/hacker-news.svg (100%) rename {static => python/static}/svg/hackerrank.svg (100%) rename {static => python/static}/svg/hamburger-solid.svg (100%) rename {static => python/static}/svg/hammer-solid.svg (100%) rename {static => python/static}/svg/hamsa-solid.svg (100%) rename {static => python/static}/svg/hand-holding-heart-solid.svg (100%) rename {static => python/static}/svg/hand-holding-solid.svg (100%) rename {static => python/static}/svg/hand-holding-usd-solid.svg (100%) rename {static => python/static}/svg/hand-lizard-solid.svg (100%) rename {static => python/static}/svg/hand-lizard.svg (100%) rename {static => python/static}/svg/hand-middle-finger-solid.svg (100%) rename {static => python/static}/svg/hand-paper-solid.svg (100%) rename {static => python/static}/svg/hand-paper.svg (100%) rename {static => python/static}/svg/hand-peace-solid.svg (100%) rename {static => python/static}/svg/hand-peace.svg (100%) rename {static => python/static}/svg/hand-point-down-solid.svg (100%) rename {static => python/static}/svg/hand-point-down.svg (100%) rename {static => python/static}/svg/hand-point-left-solid.svg (100%) rename {static => python/static}/svg/hand-point-left.svg (100%) rename {static => python/static}/svg/hand-point-right-solid.svg (100%) rename {static => python/static}/svg/hand-point-right.svg (100%) rename {static => python/static}/svg/hand-point-up-solid.svg (100%) rename {static => python/static}/svg/hand-point-up.svg (100%) rename {static => python/static}/svg/hand-pointer-solid.svg (100%) rename {static => python/static}/svg/hand-pointer.svg (100%) rename {static => python/static}/svg/hand-rock-solid.svg (100%) rename {static => python/static}/svg/hand-rock.svg (100%) rename {static => python/static}/svg/hand-scissors-solid.svg (100%) rename {static => python/static}/svg/hand-scissors.svg (100%) rename {static => python/static}/svg/hand-spock-solid.svg (100%) rename {static => python/static}/svg/hand-spock.svg (100%) rename {static => python/static}/svg/hands-helping-solid.svg (100%) rename {static => python/static}/svg/hands-solid.svg (100%) rename {static => python/static}/svg/handshake-solid.svg (100%) rename {static => python/static}/svg/handshake.svg (100%) rename {static => python/static}/svg/hanukiah-solid.svg (100%) rename {static => python/static}/svg/hard-hat-solid.svg (100%) rename {static => python/static}/svg/hashtag-solid.svg (100%) rename {static => python/static}/svg/hat-cowboy-side-solid.svg (100%) rename {static => python/static}/svg/hat-cowboy-solid.svg (100%) rename {static => python/static}/svg/hat-wizard-solid.svg (100%) rename {static => python/static}/svg/haykal-solid.svg (100%) rename {static => python/static}/svg/hdd-solid.svg (100%) rename {static => python/static}/svg/hdd.svg (100%) rename {static => python/static}/svg/heading-solid.svg (100%) rename {static => python/static}/svg/headphones-alt-solid.svg (100%) rename {static => python/static}/svg/headphones-solid.svg (100%) rename {static => python/static}/svg/headset-solid.svg (100%) rename {static => python/static}/svg/heart-broken-solid.svg (100%) rename {static => python/static}/svg/heart-solid.svg (100%) rename {static => python/static}/svg/heart.svg (100%) rename {static => python/static}/svg/heartbeat-solid.svg (100%) rename {static => python/static}/svg/helicopter-solid.svg (100%) rename {static => python/static}/svg/highlighter-solid.svg (100%) rename {static => python/static}/svg/hiking-solid.svg (100%) rename {static => python/static}/svg/hippo-solid.svg (100%) rename {static => python/static}/svg/hips.svg (100%) rename {static => python/static}/svg/hire-a-helper.svg (100%) rename {static => python/static}/svg/history-solid.svg (100%) rename {static => python/static}/svg/hockey-puck-solid.svg (100%) rename {static => python/static}/svg/holly-berry-solid.svg (100%) rename {static => python/static}/svg/home-solid.svg (100%) rename {static => python/static}/svg/hooli.svg (100%) rename {static => python/static}/svg/hornbill.svg (100%) rename {static => python/static}/svg/horse-head-solid.svg (100%) rename {static => python/static}/svg/horse-solid.svg (100%) rename {static => python/static}/svg/hospital-alt-solid.svg (100%) rename {static => python/static}/svg/hospital-solid.svg (100%) rename {static => python/static}/svg/hospital-symbol-solid.svg (100%) rename {static => python/static}/svg/hospital.svg (100%) rename {static => python/static}/svg/hot-tub-solid.svg (100%) rename {static => python/static}/svg/hotdog-solid.svg (100%) rename {static => python/static}/svg/hotel-solid.svg (100%) rename {static => python/static}/svg/hotjar.svg (100%) rename {static => python/static}/svg/hourglass-end-solid.svg (100%) rename {static => python/static}/svg/hourglass-half-solid.svg (100%) rename {static => python/static}/svg/hourglass-solid.svg (100%) rename {static => python/static}/svg/hourglass-start-solid.svg (100%) rename {static => python/static}/svg/hourglass.svg (100%) rename {static => python/static}/svg/house-damage-solid.svg (100%) rename {static => python/static}/svg/houzz.svg (100%) rename {static => python/static}/svg/hryvnia-solid.svg (100%) rename {static => python/static}/svg/html5.svg (100%) rename {static => python/static}/svg/hubspot.svg (100%) rename {static => python/static}/svg/i-cursor-solid.svg (100%) rename {static => python/static}/svg/ice-cream-solid.svg (100%) rename {static => python/static}/svg/icicles-solid.svg (100%) rename {static => python/static}/svg/icons-solid.svg (100%) rename {static => python/static}/svg/id-badge-solid.svg (100%) rename {static => python/static}/svg/id-badge.svg (100%) rename {static => python/static}/svg/id-card-alt-solid.svg (100%) rename {static => python/static}/svg/id-card-solid.svg (100%) rename {static => python/static}/svg/id-card.svg (100%) rename {static => python/static}/svg/igloo-solid.svg (100%) rename {static => python/static}/svg/image-solid.svg (100%) rename {static => python/static}/svg/image.svg (100%) rename {static => python/static}/svg/images-solid.svg (100%) rename {static => python/static}/svg/images.svg (100%) rename {static => python/static}/svg/imdb.svg (100%) rename {static => python/static}/svg/inbox-solid.svg (100%) rename {static => python/static}/svg/indent-solid.svg (100%) rename {static => python/static}/svg/industry-solid.svg (100%) rename {static => python/static}/svg/infinity-solid.svg (100%) rename {static => python/static}/svg/info-circle-solid.svg (100%) rename {static => python/static}/svg/info-solid.svg (100%) rename {static => python/static}/svg/instagram.svg (100%) rename {static => python/static}/svg/intercom.svg (100%) rename {static => python/static}/svg/internet-explorer.svg (100%) rename {static => python/static}/svg/invision.svg (100%) rename {static => python/static}/svg/ioxhost.svg (100%) rename {static => python/static}/svg/italic-solid.svg (100%) rename {static => python/static}/svg/itch-io.svg (100%) rename {static => python/static}/svg/itunes-note.svg (100%) rename {static => python/static}/svg/itunes.svg (100%) rename {static => python/static}/svg/java.svg (100%) rename {static => python/static}/svg/jedi-order.svg (100%) rename {static => python/static}/svg/jedi-solid.svg (100%) rename {static => python/static}/svg/jenkins.svg (100%) rename {static => python/static}/svg/jira.svg (100%) rename {static => python/static}/svg/joget.svg (100%) rename {static => python/static}/svg/joint-solid.svg (100%) rename {static => python/static}/svg/joomla.svg (100%) rename {static => python/static}/svg/journal-whills-solid.svg (100%) rename {static => python/static}/svg/js-square.svg (100%) rename {static => python/static}/svg/js.svg (100%) rename {static => python/static}/svg/jsfiddle.svg (100%) rename {static => python/static}/svg/kaaba-solid.svg (100%) rename {static => python/static}/svg/kaggle.svg (100%) rename {static => python/static}/svg/key-solid.svg (100%) rename {static => python/static}/svg/keybase.svg (100%) rename {static => python/static}/svg/keyboard-solid.svg (100%) rename {static => python/static}/svg/keyboard.svg (100%) rename {static => python/static}/svg/keycdn.svg (100%) rename {static => python/static}/svg/khanda-solid.svg (100%) rename {static => python/static}/svg/kickstarter-k.svg (100%) rename {static => python/static}/svg/kickstarter.svg (100%) rename {static => python/static}/svg/kiss-beam-solid.svg (100%) rename {static => python/static}/svg/kiss-beam.svg (100%) rename {static => python/static}/svg/kiss-solid.svg (100%) rename {static => python/static}/svg/kiss-wink-heart-solid.svg (100%) rename {static => python/static}/svg/kiss-wink-heart.svg (100%) rename {static => python/static}/svg/kiss.svg (100%) rename {static => python/static}/svg/kiwi-bird-solid.svg (100%) rename {static => python/static}/svg/korvue.svg (100%) rename {static => python/static}/svg/landmark-solid.svg (100%) rename {static => python/static}/svg/language-solid.svg (100%) rename {static => python/static}/svg/laptop-code-solid.svg (100%) rename {static => python/static}/svg/laptop-medical-solid.svg (100%) rename {static => python/static}/svg/laptop-solid.svg (100%) rename {static => python/static}/svg/laravel.svg (100%) rename {static => python/static}/svg/lastfm-square.svg (100%) rename {static => python/static}/svg/lastfm.svg (100%) rename {static => python/static}/svg/laugh-beam-solid.svg (100%) rename {static => python/static}/svg/laugh-beam.svg (100%) rename {static => python/static}/svg/laugh-solid.svg (100%) rename {static => python/static}/svg/laugh-squint-solid.svg (100%) rename {static => python/static}/svg/laugh-squint.svg (100%) rename {static => python/static}/svg/laugh-wink-solid.svg (100%) rename {static => python/static}/svg/laugh-wink.svg (100%) rename {static => python/static}/svg/laugh.svg (100%) rename {static => python/static}/svg/layer-group-solid.svg (100%) rename {static => python/static}/svg/leaf-solid.svg (100%) rename {static => python/static}/svg/leanpub.svg (100%) rename {static => python/static}/svg/lemon-solid.svg (100%) rename {static => python/static}/svg/lemon.svg (100%) rename {static => python/static}/svg/less-than-equal-solid.svg (100%) rename {static => python/static}/svg/less-than-solid.svg (100%) rename {static => python/static}/svg/less.svg (100%) rename {static => python/static}/svg/level-down-alt-solid.svg (100%) rename {static => python/static}/svg/level-up-alt-solid.svg (100%) rename {static => python/static}/svg/life-ring-solid.svg (100%) rename {static => python/static}/svg/life-ring.svg (100%) rename {static => python/static}/svg/lightbulb-solid.svg (100%) rename {static => python/static}/svg/lightbulb.svg (100%) rename {static => python/static}/svg/line.svg (100%) rename {static => python/static}/svg/link-solid.svg (100%) rename {static => python/static}/svg/linkedin-in.svg (100%) rename {static => python/static}/svg/linkedin.svg (100%) rename {static => python/static}/svg/linode.svg (100%) rename {static => python/static}/svg/linux.svg (100%) rename {static => python/static}/svg/lira-sign-solid.svg (100%) rename {static => python/static}/svg/list-alt-solid.svg (100%) rename {static => python/static}/svg/list-alt.svg (100%) rename {static => python/static}/svg/list-ol-solid.svg (100%) rename {static => python/static}/svg/list-solid.svg (100%) rename {static => python/static}/svg/list-ul-solid.svg (100%) rename {static => python/static}/svg/location-arrow-solid.svg (100%) rename {static => python/static}/svg/lock-open-solid.svg (100%) rename {static => python/static}/svg/lock-solid.svg (100%) rename {static => python/static}/svg/long-arrow-alt-down-solid.svg (100%) rename {static => python/static}/svg/long-arrow-alt-left-solid.svg (100%) rename {static => python/static}/svg/long-arrow-alt-right-solid.svg (100%) rename {static => python/static}/svg/long-arrow-alt-up-solid.svg (100%) rename {static => python/static}/svg/low-vision-solid.svg (100%) rename {static => python/static}/svg/luggage-cart-solid.svg (100%) rename {static => python/static}/svg/lyft.svg (100%) rename {static => python/static}/svg/magento.svg (100%) rename {static => python/static}/svg/magic-solid.svg (100%) rename {static => python/static}/svg/magnet-solid.svg (100%) rename {static => python/static}/svg/mail-bulk-solid.svg (100%) rename {static => python/static}/svg/mailchimp.svg (100%) rename {static => python/static}/svg/male-solid.svg (100%) rename {static => python/static}/svg/mandalorian.svg (100%) rename {static => python/static}/svg/map-marked-alt-solid.svg (100%) rename {static => python/static}/svg/map-marked-solid.svg (100%) rename {static => python/static}/svg/map-marker-alt-solid.svg (100%) rename {static => python/static}/svg/map-marker-solid.svg (100%) rename {static => python/static}/svg/map-pin-solid.svg (100%) rename {static => python/static}/svg/map-signs-solid.svg (100%) rename {static => python/static}/svg/map-solid.svg (100%) rename {static => python/static}/svg/map.svg (100%) rename {static => python/static}/svg/markdown.svg (100%) rename {static => python/static}/svg/marker-solid.svg (100%) rename {static => python/static}/svg/mars-double-solid.svg (100%) rename {static => python/static}/svg/mars-solid.svg (100%) rename {static => python/static}/svg/mars-stroke-h-solid.svg (100%) rename {static => python/static}/svg/mars-stroke-solid.svg (100%) rename {static => python/static}/svg/mars-stroke-v-solid.svg (100%) rename {static => python/static}/svg/mask-solid.svg (100%) rename {static => python/static}/svg/mastodon.svg (100%) rename {static => python/static}/svg/maxcdn.svg (100%) rename {static => python/static}/svg/mdb.svg (100%) rename {static => python/static}/svg/medal-solid.svg (100%) rename {static => python/static}/svg/medapps.svg (100%) rename {static => python/static}/svg/medium-m.svg (100%) rename {static => python/static}/svg/medium.svg (100%) rename {static => python/static}/svg/medkit-solid.svg (100%) rename {static => python/static}/svg/medrt.svg (100%) rename {static => python/static}/svg/meetup.svg (100%) rename {static => python/static}/svg/megaport.svg (100%) rename {static => python/static}/svg/meh-blank-solid.svg (100%) rename {static => python/static}/svg/meh-blank.svg (100%) rename {static => python/static}/svg/meh-rolling-eyes-solid.svg (100%) rename {static => python/static}/svg/meh-rolling-eyes.svg (100%) rename {static => python/static}/svg/meh-solid.svg (100%) rename {static => python/static}/svg/meh.svg (100%) rename {static => python/static}/svg/memory-solid.svg (100%) rename {static => python/static}/svg/mendeley.svg (100%) rename {static => python/static}/svg/menorah-solid.svg (100%) rename {static => python/static}/svg/mercury-solid.svg (100%) rename {static => python/static}/svg/meteor-solid.svg (100%) rename {static => python/static}/svg/microchip-solid.svg (100%) rename {static => python/static}/svg/microphone-alt-slash-solid.svg (100%) rename {static => python/static}/svg/microphone-alt-solid.svg (100%) rename {static => python/static}/svg/microphone-slash-solid.svg (100%) rename {static => python/static}/svg/microphone-solid.svg (100%) rename {static => python/static}/svg/microscope-solid.svg (100%) rename {static => python/static}/svg/microsoft.svg (100%) rename {static => python/static}/svg/minus-circle-solid.svg (100%) rename {static => python/static}/svg/minus-solid.svg (100%) rename {static => python/static}/svg/minus-square-solid.svg (100%) rename {static => python/static}/svg/minus-square.svg (100%) rename {static => python/static}/svg/mitten-solid.svg (100%) rename {static => python/static}/svg/mix.svg (100%) rename {static => python/static}/svg/mixcloud.svg (100%) rename {static => python/static}/svg/mizuni.svg (100%) rename {static => python/static}/svg/mobile-alt-solid.svg (100%) rename {static => python/static}/svg/mobile-solid.svg (100%) rename {static => python/static}/svg/modx.svg (100%) rename {static => python/static}/svg/monero.svg (100%) rename {static => python/static}/svg/money-bill-alt-solid.svg (100%) rename {static => python/static}/svg/money-bill-alt.svg (100%) rename {static => python/static}/svg/money-bill-solid.svg (100%) rename {static => python/static}/svg/money-bill-wave-alt-solid.svg (100%) rename {static => python/static}/svg/money-bill-wave-solid.svg (100%) rename {static => python/static}/svg/money-check-alt-solid.svg (100%) rename {static => python/static}/svg/money-check-solid.svg (100%) rename {static => python/static}/svg/monument-solid.svg (100%) rename {static => python/static}/svg/moon-solid.svg (100%) rename {static => python/static}/svg/moon.svg (100%) rename {static => python/static}/svg/mortar-pestle-solid.svg (100%) rename {static => python/static}/svg/mosque-solid.svg (100%) rename {static => python/static}/svg/motorcycle-solid.svg (100%) rename {static => python/static}/svg/mountain-solid.svg (100%) rename {static => python/static}/svg/mouse-pointer-solid.svg (100%) rename {static => python/static}/svg/mouse-solid.svg (100%) rename {static => python/static}/svg/mug-hot-solid.svg (100%) rename {static => python/static}/svg/music-solid.svg (100%) rename {static => python/static}/svg/napster.svg (100%) rename {static => python/static}/svg/neos.svg (100%) rename {static => python/static}/svg/network-wired-solid.svg (100%) rename {static => python/static}/svg/neuter-solid.svg (100%) rename {static => python/static}/svg/newspaper-solid.svg (100%) rename {static => python/static}/svg/newspaper.svg (100%) rename {static => python/static}/svg/nimblr.svg (100%) rename {static => python/static}/svg/node-js.svg (100%) rename {static => python/static}/svg/node.svg (100%) rename {static => python/static}/svg/not-equal-solid.svg (100%) rename {static => python/static}/svg/notes-medical-solid.svg (100%) rename {static => python/static}/svg/npm.svg (100%) rename {static => python/static}/svg/ns8.svg (100%) rename {static => python/static}/svg/nutritionix.svg (100%) rename {static => python/static}/svg/object-group-solid.svg (100%) rename {static => python/static}/svg/object-group.svg (100%) rename {static => python/static}/svg/object-ungroup-solid.svg (100%) rename {static => python/static}/svg/object-ungroup.svg (100%) rename {static => python/static}/svg/odnoklassniki-square.svg (100%) rename {static => python/static}/svg/odnoklassniki.svg (100%) rename {static => python/static}/svg/oil-can-solid.svg (100%) rename {static => python/static}/svg/old-republic.svg (100%) rename {static => python/static}/svg/om-solid.svg (100%) rename {static => python/static}/svg/opencart.svg (100%) rename {static => python/static}/svg/openid.svg (100%) rename {static => python/static}/svg/opera.svg (100%) rename {static => python/static}/svg/optin-monster.svg (100%) rename {static => python/static}/svg/orcid.svg (100%) rename {static => python/static}/svg/osi.svg (100%) rename {static => python/static}/svg/otter-solid.svg (100%) rename {static => python/static}/svg/outdent-solid.svg (100%) rename {static => python/static}/svg/page4.svg (100%) rename {static => python/static}/svg/pagelines.svg (100%) rename {static => python/static}/svg/pager-solid.svg (100%) rename {static => python/static}/svg/paint-brush-solid.svg (100%) rename {static => python/static}/svg/paint-roller-solid.svg (100%) rename {static => python/static}/svg/palette-solid.svg (100%) rename {static => python/static}/svg/palfed.svg (100%) rename {static => python/static}/svg/pallet-solid.svg (100%) rename {static => python/static}/svg/paper-plane-solid.svg (100%) rename {static => python/static}/svg/paper-plane.svg (100%) rename {static => python/static}/svg/paperclip-solid.svg (100%) rename {static => python/static}/svg/parachute-box-solid.svg (100%) rename {static => python/static}/svg/paragraph-solid.svg (100%) rename {static => python/static}/svg/parking-solid.svg (100%) rename {static => python/static}/svg/passport-solid.svg (100%) rename {static => python/static}/svg/pastafarianism-solid.svg (100%) rename {static => python/static}/svg/paste-solid.svg (100%) rename {static => python/static}/svg/patreon.svg (100%) rename {static => python/static}/svg/pause-circle-solid.svg (100%) rename {static => python/static}/svg/pause-circle.svg (100%) rename {static => python/static}/svg/pause-solid.svg (100%) rename {static => python/static}/svg/paw-solid.svg (100%) rename {static => python/static}/svg/paypal.svg (100%) rename {static => python/static}/svg/peace-solid.svg (100%) rename {static => python/static}/svg/pen-alt-solid.svg (100%) rename {static => python/static}/svg/pen-fancy-solid.svg (100%) rename {static => python/static}/svg/pen-nib-solid.svg (100%) rename {static => python/static}/svg/pen-solid.svg (100%) rename {static => python/static}/svg/pen-square-solid.svg (100%) rename {static => python/static}/svg/pencil-alt-solid.svg (100%) rename {static => python/static}/svg/pencil-ruler-solid.svg (100%) rename {static => python/static}/svg/penny-arcade.svg (100%) rename {static => python/static}/svg/people-carry-solid.svg (100%) rename {static => python/static}/svg/pepper-hot-solid.svg (100%) rename {static => python/static}/svg/percent-solid.svg (100%) rename {static => python/static}/svg/percentage-solid.svg (100%) rename {static => python/static}/svg/periscope.svg (100%) rename {static => python/static}/svg/person-booth-solid.svg (100%) rename {static => python/static}/svg/phabricator.svg (100%) rename {static => python/static}/svg/phoenix-framework.svg (100%) rename {static => python/static}/svg/phoenix-squadron.svg (100%) rename {static => python/static}/svg/phone-alt-solid.svg (100%) rename {static => python/static}/svg/phone-slash-solid.svg (100%) rename {static => python/static}/svg/phone-solid.svg (100%) rename {static => python/static}/svg/phone-square-alt-solid.svg (100%) rename {static => python/static}/svg/phone-square-solid.svg (100%) rename {static => python/static}/svg/phone-volume-solid.svg (100%) rename {static => python/static}/svg/photo-video-solid.svg (100%) rename {static => python/static}/svg/php.svg (100%) rename {static => python/static}/svg/pied-piper-alt.svg (100%) rename {static => python/static}/svg/pied-piper-hat.svg (100%) rename {static => python/static}/svg/pied-piper-pp.svg (100%) rename {static => python/static}/svg/pied-piper.svg (100%) rename {static => python/static}/svg/piggy-bank-solid.svg (100%) rename {static => python/static}/svg/pills-solid.svg (100%) rename {static => python/static}/svg/pinterest-p.svg (100%) rename {static => python/static}/svg/pinterest-square.svg (100%) rename {static => python/static}/svg/pinterest.svg (100%) rename {static => python/static}/svg/pizza-slice-solid.svg (100%) rename {static => python/static}/svg/place-of-worship-solid.svg (100%) rename {static => python/static}/svg/plane-arrival-solid.svg (100%) rename {static => python/static}/svg/plane-departure-solid.svg (100%) rename {static => python/static}/svg/plane-solid.svg (100%) rename {static => python/static}/svg/play-circle-solid.svg (100%) rename {static => python/static}/svg/play-circle.svg (100%) rename {static => python/static}/svg/play-solid.svg (100%) rename {static => python/static}/svg/playstation.svg (100%) rename {static => python/static}/svg/plug-solid.svg (100%) rename {static => python/static}/svg/plus-circle-solid.svg (100%) rename {static => python/static}/svg/plus-solid.svg (100%) rename {static => python/static}/svg/plus-square-solid.svg (100%) rename {static => python/static}/svg/plus-square.svg (100%) rename {static => python/static}/svg/podcast-solid.svg (100%) rename {static => python/static}/svg/poll-h-solid.svg (100%) rename {static => python/static}/svg/poll-solid.svg (100%) rename {static => python/static}/svg/poo-solid.svg (100%) rename {static => python/static}/svg/poo-storm-solid.svg (100%) rename {static => python/static}/svg/poop-solid.svg (100%) rename {static => python/static}/svg/portrait-solid.svg (100%) rename {static => python/static}/svg/pound-sign-solid.svg (100%) rename {static => python/static}/svg/power-off-solid.svg (100%) rename {static => python/static}/svg/pray-solid.svg (100%) rename {static => python/static}/svg/praying-hands-solid.svg (100%) rename {static => python/static}/svg/prescription-bottle-alt-solid.svg (100%) rename {static => python/static}/svg/prescription-bottle-solid.svg (100%) rename {static => python/static}/svg/prescription-solid.svg (100%) rename {static => python/static}/svg/print-solid.svg (100%) rename {static => python/static}/svg/procedures-solid.svg (100%) rename {static => python/static}/svg/product-hunt.svg (100%) rename {static => python/static}/svg/project-diagram-solid.svg (100%) rename {static => python/static}/svg/pushed.svg (100%) rename {static => python/static}/svg/puzzle-piece-solid.svg (100%) rename {static => python/static}/svg/python.svg (100%) rename {static => python/static}/svg/qq.svg (100%) rename {static => python/static}/svg/qrcode-solid.svg (100%) rename {static => python/static}/svg/question-circle-solid.svg (100%) rename {static => python/static}/svg/question-circle.svg (100%) rename {static => python/static}/svg/question-solid.svg (100%) rename {static => python/static}/svg/quidditch-solid.svg (100%) rename {static => python/static}/svg/quinscape.svg (100%) rename {static => python/static}/svg/quora.svg (100%) rename {static => python/static}/svg/quote-left-solid.svg (100%) rename {static => python/static}/svg/quote-right-solid.svg (100%) rename {static => python/static}/svg/quran-solid.svg (100%) rename {static => python/static}/svg/r-project.svg (100%) rename {static => python/static}/svg/radiation-alt-solid.svg (100%) rename {static => python/static}/svg/radiation-solid.svg (100%) rename {static => python/static}/svg/rainbow-solid.svg (100%) rename {static => python/static}/svg/random-solid.svg (100%) rename {static => python/static}/svg/raspberry-pi.svg (100%) rename {static => python/static}/svg/ravelry.svg (100%) rename {static => python/static}/svg/react.svg (100%) rename {static => python/static}/svg/reacteurope.svg (100%) rename {static => python/static}/svg/readme.svg (100%) rename {static => python/static}/svg/rebel.svg (100%) rename {static => python/static}/svg/receipt-solid.svg (100%) rename {static => python/static}/svg/record-vinyl-solid.svg (100%) rename {static => python/static}/svg/recycle-solid.svg (100%) rename {static => python/static}/svg/red-river.svg (100%) rename {static => python/static}/svg/reddit-alien.svg (100%) rename {static => python/static}/svg/reddit-square.svg (100%) rename {static => python/static}/svg/reddit.svg (100%) rename {static => python/static}/svg/redhat.svg (100%) rename {static => python/static}/svg/redo-alt-solid.svg (100%) rename {static => python/static}/svg/redo-solid.svg (100%) rename {static => python/static}/svg/registered-solid.svg (100%) rename {static => python/static}/svg/registered.svg (100%) rename {static => python/static}/svg/remove-format-solid.svg (100%) rename {static => python/static}/svg/renren.svg (100%) rename {static => python/static}/svg/reply-all-solid.svg (100%) rename {static => python/static}/svg/reply-solid.svg (100%) rename {static => python/static}/svg/replyd.svg (100%) rename {static => python/static}/svg/republican-solid.svg (100%) rename {static => python/static}/svg/researchgate.svg (100%) rename {static => python/static}/svg/resolving.svg (100%) rename {static => python/static}/svg/restroom-solid.svg (100%) rename {static => python/static}/svg/retweet-solid.svg (100%) rename {static => python/static}/svg/rev.svg (100%) rename {static => python/static}/svg/ribbon-solid.svg (100%) rename {static => python/static}/svg/ring-solid.svg (100%) rename {static => python/static}/svg/road-solid.svg (100%) rename {static => python/static}/svg/robot-solid.svg (100%) rename {static => python/static}/svg/rocket-solid.svg (100%) rename {static => python/static}/svg/rocketchat.svg (100%) rename {static => python/static}/svg/rockrms.svg (100%) rename {static => python/static}/svg/route-solid.svg (100%) rename {static => python/static}/svg/rss-solid.svg (100%) rename {static => python/static}/svg/rss-square-solid.svg (100%) rename {static => python/static}/svg/ruble-sign-solid.svg (100%) rename {static => python/static}/svg/ruler-combined-solid.svg (100%) rename {static => python/static}/svg/ruler-horizontal-solid.svg (100%) rename {static => python/static}/svg/ruler-solid.svg (100%) rename {static => python/static}/svg/ruler-vertical-solid.svg (100%) rename {static => python/static}/svg/running-solid.svg (100%) rename {static => python/static}/svg/rupee-sign-solid.svg (100%) rename {static => python/static}/svg/sad-cry-solid.svg (100%) rename {static => python/static}/svg/sad-cry.svg (100%) rename {static => python/static}/svg/sad-tear-solid.svg (100%) rename {static => python/static}/svg/sad-tear.svg (100%) rename {static => python/static}/svg/safari.svg (100%) rename {static => python/static}/svg/salesforce.svg (100%) rename {static => python/static}/svg/sass.svg (100%) rename {static => python/static}/svg/satellite-dish-solid.svg (100%) rename {static => python/static}/svg/satellite-solid.svg (100%) rename {static => python/static}/svg/save-solid.svg (100%) rename {static => python/static}/svg/save.svg (100%) rename {static => python/static}/svg/schlix.svg (100%) rename {static => python/static}/svg/school-solid.svg (100%) rename {static => python/static}/svg/screwdriver-solid.svg (100%) rename {static => python/static}/svg/scribd.svg (100%) rename {static => python/static}/svg/scroll-solid.svg (100%) rename {static => python/static}/svg/sd-card-solid.svg (100%) rename {static => python/static}/svg/search-dollar-solid.svg (100%) rename {static => python/static}/svg/search-location-solid.svg (100%) rename {static => python/static}/svg/search-minus-solid.svg (100%) rename {static => python/static}/svg/search-plus-solid.svg (100%) rename {static => python/static}/svg/search-solid.svg (100%) rename {static => python/static}/svg/searchengin.svg (100%) rename {static => python/static}/svg/seedling-solid.svg (100%) rename {static => python/static}/svg/sellcast.svg (100%) rename {static => python/static}/svg/sellsy.svg (100%) rename {static => python/static}/svg/server-solid.svg (100%) rename {static => python/static}/svg/servicestack.svg (100%) rename {static => python/static}/svg/shapes-solid.svg (100%) rename {static => python/static}/svg/share-alt-solid.svg (100%) rename {static => python/static}/svg/share-alt-square-solid.svg (100%) rename {static => python/static}/svg/share-solid.svg (100%) rename {static => python/static}/svg/share-square-solid.svg (100%) rename {static => python/static}/svg/share-square.svg (100%) rename {static => python/static}/svg/shekel-sign-solid.svg (100%) rename {static => python/static}/svg/shield-alt-solid.svg (100%) rename {static => python/static}/svg/ship-solid.svg (100%) rename {static => python/static}/svg/shipping-fast-solid.svg (100%) rename {static => python/static}/svg/shirtsinbulk.svg (100%) rename {static => python/static}/svg/shoe-prints-solid.svg (100%) rename {static => python/static}/svg/shopping-bag-solid.svg (100%) rename {static => python/static}/svg/shopping-basket-solid.svg (100%) rename {static => python/static}/svg/shopping-cart-solid.svg (100%) rename {static => python/static}/svg/shopware.svg (100%) rename {static => python/static}/svg/shower-solid.svg (100%) rename {static => python/static}/svg/shuttle-van-solid.svg (100%) rename {static => python/static}/svg/sign-in-alt-solid.svg (100%) rename {static => python/static}/svg/sign-language-solid.svg (100%) rename {static => python/static}/svg/sign-out-alt-solid.svg (100%) rename {static => python/static}/svg/sign-solid.svg (100%) rename {static => python/static}/svg/signal-solid.svg (100%) rename {static => python/static}/svg/signature-solid.svg (100%) rename {static => python/static}/svg/sim-card-solid.svg (100%) rename {static => python/static}/svg/simplybuilt.svg (100%) rename {static => python/static}/svg/sistrix.svg (100%) rename {static => python/static}/svg/sitemap-solid.svg (100%) rename {static => python/static}/svg/sith.svg (100%) rename {static => python/static}/svg/skating-solid.svg (100%) rename {static => python/static}/svg/sketch.svg (100%) rename {static => python/static}/svg/skiing-nordic-solid.svg (100%) rename {static => python/static}/svg/skiing-solid.svg (100%) rename {static => python/static}/svg/skull-crossbones-solid.svg (100%) rename {static => python/static}/svg/skull-solid.svg (100%) rename {static => python/static}/svg/skyatlas.svg (100%) rename {static => python/static}/svg/skype.svg (100%) rename {static => python/static}/svg/slack-hash.svg (100%) rename {static => python/static}/svg/slack.svg (100%) rename {static => python/static}/svg/slash-solid.svg (100%) rename {static => python/static}/svg/sleigh-solid.svg (100%) rename {static => python/static}/svg/sliders-h-solid.svg (100%) rename {static => python/static}/svg/slideshare.svg (100%) rename {static => python/static}/svg/smile-beam-solid.svg (100%) rename {static => python/static}/svg/smile-beam.svg (100%) rename {static => python/static}/svg/smile-solid.svg (100%) rename {static => python/static}/svg/smile-wink-solid.svg (100%) rename {static => python/static}/svg/smile-wink.svg (100%) rename {static => python/static}/svg/smile.svg (100%) rename {static => python/static}/svg/smog-solid.svg (100%) rename {static => python/static}/svg/smoking-ban-solid.svg (100%) rename {static => python/static}/svg/smoking-solid.svg (100%) rename {static => python/static}/svg/sms-solid.svg (100%) rename {static => python/static}/svg/snapchat-ghost.svg (100%) rename {static => python/static}/svg/snapchat-square.svg (100%) rename {static => python/static}/svg/snapchat.svg (100%) rename {static => python/static}/svg/snowboarding-solid.svg (100%) rename {static => python/static}/svg/snowflake-solid.svg (100%) rename {static => python/static}/svg/snowflake.svg (100%) rename {static => python/static}/svg/snowman-solid.svg (100%) rename {static => python/static}/svg/snowplow-solid.svg (100%) rename {static => python/static}/svg/socks-solid.svg (100%) rename {static => python/static}/svg/solar-panel-solid.svg (100%) rename {static => python/static}/svg/sort-alpha-down-alt-solid.svg (100%) rename {static => python/static}/svg/sort-alpha-down-solid.svg (100%) rename {static => python/static}/svg/sort-alpha-up-alt-solid.svg (100%) rename {static => python/static}/svg/sort-alpha-up-solid.svg (100%) rename {static => python/static}/svg/sort-amount-down-alt-solid.svg (100%) rename {static => python/static}/svg/sort-amount-down-solid.svg (100%) rename {static => python/static}/svg/sort-amount-up-alt-solid.svg (100%) rename {static => python/static}/svg/sort-amount-up-solid.svg (100%) rename {static => python/static}/svg/sort-down-solid.svg (100%) rename {static => python/static}/svg/sort-numeric-down-alt-solid.svg (100%) rename {static => python/static}/svg/sort-numeric-down-solid.svg (100%) rename {static => python/static}/svg/sort-numeric-up-alt-solid.svg (100%) rename {static => python/static}/svg/sort-numeric-up-solid.svg (100%) rename {static => python/static}/svg/sort-solid.svg (100%) rename {static => python/static}/svg/sort-up-solid.svg (100%) rename {static => python/static}/svg/soundcloud.svg (100%) rename {static => python/static}/svg/sourcetree.svg (100%) rename {static => python/static}/svg/spa-solid.svg (100%) rename {static => python/static}/svg/space-shuttle-solid.svg (100%) rename {static => python/static}/svg/speakap.svg (100%) rename {static => python/static}/svg/speaker-deck.svg (100%) rename {static => python/static}/svg/spell-check-solid.svg (100%) rename {static => python/static}/svg/spider-solid.svg (100%) rename {static => python/static}/svg/spinner-solid.svg (100%) rename {static => python/static}/svg/splotch-solid.svg (100%) rename {static => python/static}/svg/spotify.svg (100%) rename {static => python/static}/svg/spray-can-solid.svg (100%) rename {static => python/static}/svg/square-full-solid.svg (100%) rename {static => python/static}/svg/square-root-alt-solid.svg (100%) rename {static => python/static}/svg/square-solid.svg (100%) rename {static => python/static}/svg/square.svg (100%) rename {static => python/static}/svg/squarespace.svg (100%) rename {static => python/static}/svg/stack-exchange.svg (100%) rename {static => python/static}/svg/stack-overflow.svg (100%) rename {static => python/static}/svg/stackpath.svg (100%) rename {static => python/static}/svg/stamp-solid.svg (100%) rename {static => python/static}/svg/star-and-crescent-solid.svg (100%) rename {static => python/static}/svg/star-half-alt-solid.svg (100%) rename {static => python/static}/svg/star-half-solid.svg (100%) rename {static => python/static}/svg/star-half.svg (100%) rename {static => python/static}/svg/star-of-david-solid.svg (100%) rename {static => python/static}/svg/star-of-life-solid.svg (100%) rename {static => python/static}/svg/star-solid.svg (100%) rename {static => python/static}/svg/star.svg (100%) rename {static => python/static}/svg/staylinked.svg (100%) rename {static => python/static}/svg/steam-square.svg (100%) rename {static => python/static}/svg/steam-symbol.svg (100%) rename {static => python/static}/svg/steam.svg (100%) rename {static => python/static}/svg/step-backward-solid.svg (100%) rename {static => python/static}/svg/step-forward-solid.svg (100%) rename {static => python/static}/svg/stethoscope-solid.svg (100%) rename {static => python/static}/svg/sticker-mule.svg (100%) rename {static => python/static}/svg/sticky-note-solid.svg (100%) rename {static => python/static}/svg/sticky-note.svg (100%) rename {static => python/static}/svg/stop-circle-solid.svg (100%) rename {static => python/static}/svg/stop-circle.svg (100%) rename {static => python/static}/svg/stop-solid.svg (100%) rename {static => python/static}/svg/stopwatch-solid.svg (100%) rename {static => python/static}/svg/store-alt-solid.svg (100%) rename {static => python/static}/svg/store-solid.svg (100%) rename {static => python/static}/svg/strava.svg (100%) rename {static => python/static}/svg/stream-solid.svg (100%) rename {static => python/static}/svg/street-view-solid.svg (100%) rename {static => python/static}/svg/strikethrough-solid.svg (100%) rename {static => python/static}/svg/stripe-s.svg (100%) rename {static => python/static}/svg/stripe.svg (100%) rename {static => python/static}/svg/stroopwafel-solid.svg (100%) rename {static => python/static}/svg/studiovinari.svg (100%) rename {static => python/static}/svg/stumbleupon-circle.svg (100%) rename {static => python/static}/svg/stumbleupon.svg (100%) rename {static => python/static}/svg/subscript-solid.svg (100%) rename {static => python/static}/svg/subway-solid.svg (100%) rename {static => python/static}/svg/suitcase-rolling-solid.svg (100%) rename {static => python/static}/svg/suitcase-solid.svg (100%) rename {static => python/static}/svg/sun-solid.svg (100%) rename {static => python/static}/svg/sun.svg (100%) rename {static => python/static}/svg/superpowers.svg (100%) rename {static => python/static}/svg/superscript-solid.svg (100%) rename {static => python/static}/svg/supple.svg (100%) rename {static => python/static}/svg/surprise-solid.svg (100%) rename {static => python/static}/svg/surprise.svg (100%) rename {static => python/static}/svg/suse.svg (100%) rename {static => python/static}/svg/swatchbook-solid.svg (100%) rename {static => python/static}/svg/swift.svg (100%) rename {static => python/static}/svg/swimmer-solid.svg (100%) rename {static => python/static}/svg/swimming-pool-solid.svg (100%) rename {static => python/static}/svg/symfony.svg (100%) rename {static => python/static}/svg/synagogue-solid.svg (100%) rename {static => python/static}/svg/sync-alt-solid.svg (100%) rename {static => python/static}/svg/sync-solid.svg (100%) rename {static => python/static}/svg/syringe-solid.svg (100%) rename {static => python/static}/svg/table-solid.svg (100%) rename {static => python/static}/svg/table-tennis-solid.svg (100%) rename {static => python/static}/svg/tablet-alt-solid.svg (100%) rename {static => python/static}/svg/tablet-solid.svg (100%) rename {static => python/static}/svg/tablets-solid.svg (100%) rename {static => python/static}/svg/tachometer-alt-solid.svg (100%) rename {static => python/static}/svg/tag-solid.svg (100%) rename {static => python/static}/svg/tags-solid.svg (100%) rename {static => python/static}/svg/tape-solid.svg (100%) rename {static => python/static}/svg/tasks-solid.svg (100%) rename {static => python/static}/svg/taxi-solid.svg (100%) rename {static => python/static}/svg/teamspeak.svg (100%) rename {static => python/static}/svg/teeth-open-solid.svg (100%) rename {static => python/static}/svg/teeth-solid.svg (100%) rename {static => python/static}/svg/telegram-plane.svg (100%) rename {static => python/static}/svg/telegram.svg (100%) rename {static => python/static}/svg/temperature-high-solid.svg (100%) rename {static => python/static}/svg/temperature-low-solid.svg (100%) rename {static => python/static}/svg/tencent-weibo.svg (100%) rename {static => python/static}/svg/tenge-solid.svg (100%) rename {static => python/static}/svg/terminal-solid.svg (100%) rename {static => python/static}/svg/text-height-solid.svg (100%) rename {static => python/static}/svg/text-width-solid.svg (100%) rename {static => python/static}/svg/th-large-solid.svg (100%) rename {static => python/static}/svg/th-list-solid.svg (100%) rename {static => python/static}/svg/th-solid.svg (100%) rename {static => python/static}/svg/the-red-yeti.svg (100%) rename {static => python/static}/svg/theater-masks-solid.svg (100%) rename {static => python/static}/svg/themeco.svg (100%) rename {static => python/static}/svg/themeisle.svg (100%) rename {static => python/static}/svg/thermometer-empty-solid.svg (100%) rename {static => python/static}/svg/thermometer-full-solid.svg (100%) rename {static => python/static}/svg/thermometer-half-solid.svg (100%) rename {static => python/static}/svg/thermometer-quarter-solid.svg (100%) rename {static => python/static}/svg/thermometer-solid.svg (100%) rename {static => python/static}/svg/thermometer-three-quarters-solid.svg (100%) rename {static => python/static}/svg/think-peaks.svg (100%) rename {static => python/static}/svg/thumbs-down-solid.svg (100%) rename {static => python/static}/svg/thumbs-down.svg (100%) rename {static => python/static}/svg/thumbs-up-solid.svg (100%) rename {static => python/static}/svg/thumbs-up.svg (100%) rename {static => python/static}/svg/thumbtack-solid.svg (100%) rename {static => python/static}/svg/ticket-alt-solid.svg (100%) rename {static => python/static}/svg/times-circle-solid.svg (100%) rename {static => python/static}/svg/times-circle.svg (100%) rename {static => python/static}/svg/times-solid.svg (100%) rename {static => python/static}/svg/tint-slash-solid.svg (100%) rename {static => python/static}/svg/tint-solid.svg (100%) rename {static => python/static}/svg/tired-solid.svg (100%) rename {static => python/static}/svg/tired.svg (100%) rename {static => python/static}/svg/toggle-off-solid.svg (100%) rename {static => python/static}/svg/toggle-on-solid.svg (100%) rename {static => python/static}/svg/toilet-paper-solid.svg (100%) rename {static => python/static}/svg/toilet-solid.svg (100%) rename {static => python/static}/svg/toolbox-solid.svg (100%) rename {static => python/static}/svg/tools-solid.svg (100%) rename {static => python/static}/svg/tooth-solid.svg (100%) rename {static => python/static}/svg/torah-solid.svg (100%) rename {static => python/static}/svg/torii-gate-solid.svg (100%) rename {static => python/static}/svg/tractor-solid.svg (100%) rename {static => python/static}/svg/trade-federation.svg (100%) rename {static => python/static}/svg/trademark-solid.svg (100%) rename {static => python/static}/svg/traffic-light-solid.svg (100%) rename {static => python/static}/svg/train-solid.svg (100%) rename {static => python/static}/svg/tram-solid.svg (100%) rename {static => python/static}/svg/transgender-alt-solid.svg (100%) rename {static => python/static}/svg/transgender-solid.svg (100%) rename {static => python/static}/svg/trash-alt-solid.svg (100%) rename {static => python/static}/svg/trash-alt.svg (100%) rename {static => python/static}/svg/trash-restore-alt-solid.svg (100%) rename {static => python/static}/svg/trash-restore-solid.svg (100%) rename {static => python/static}/svg/trash-solid.svg (100%) rename {static => python/static}/svg/tree-solid.svg (100%) rename {static => python/static}/svg/trello.svg (100%) rename {static => python/static}/svg/tripadvisor.svg (100%) rename {static => python/static}/svg/trophy-solid.svg (100%) rename {static => python/static}/svg/truck-loading-solid.svg (100%) rename {static => python/static}/svg/truck-monster-solid.svg (100%) rename {static => python/static}/svg/truck-moving-solid.svg (100%) rename {static => python/static}/svg/truck-pickup-solid.svg (100%) rename {static => python/static}/svg/truck-solid.svg (100%) rename {static => python/static}/svg/tshirt-solid.svg (100%) rename {static => python/static}/svg/tty-solid.svg (100%) rename {static => python/static}/svg/tumblr-square.svg (100%) rename {static => python/static}/svg/tumblr.svg (100%) rename {static => python/static}/svg/tv-solid.svg (100%) rename {static => python/static}/svg/twitch.svg (100%) rename {static => python/static}/svg/twitter-square.svg (100%) rename {static => python/static}/svg/twitter.svg (100%) rename {static => python/static}/svg/typo3.svg (100%) rename {static => python/static}/svg/uber.svg (100%) rename {static => python/static}/svg/ubuntu.svg (100%) rename {static => python/static}/svg/uikit.svg (100%) rename {static => python/static}/svg/umbraco.svg (100%) rename {static => python/static}/svg/umbrella-beach-solid.svg (100%) rename {static => python/static}/svg/umbrella-solid.svg (100%) rename {static => python/static}/svg/underline-solid.svg (100%) rename {static => python/static}/svg/undo-alt-solid.svg (100%) rename {static => python/static}/svg/undo-solid.svg (100%) rename {static => python/static}/svg/uniregistry.svg (100%) rename {static => python/static}/svg/universal-access-solid.svg (100%) rename {static => python/static}/svg/university-solid.svg (100%) rename {static => python/static}/svg/unlink-solid.svg (100%) rename {static => python/static}/svg/unlock-alt-solid.svg (100%) rename {static => python/static}/svg/unlock-solid.svg (100%) rename {static => python/static}/svg/untappd.svg (100%) rename {static => python/static}/svg/upload-solid.svg (100%) rename {static => python/static}/svg/ups.svg (100%) rename {static => python/static}/svg/usb.svg (100%) rename {static => python/static}/svg/user-alt-slash-solid.svg (100%) rename {static => python/static}/svg/user-alt-solid.svg (100%) rename {static => python/static}/svg/user-astronaut-solid.svg (100%) rename {static => python/static}/svg/user-check-solid.svg (100%) rename {static => python/static}/svg/user-circle-solid.svg (100%) rename {static => python/static}/svg/user-circle.svg (100%) rename {static => python/static}/svg/user-clock-solid.svg (100%) rename {static => python/static}/svg/user-cog-solid.svg (100%) rename {static => python/static}/svg/user-edit-solid.svg (100%) rename {static => python/static}/svg/user-friends-solid.svg (100%) rename {static => python/static}/svg/user-graduate-solid.svg (100%) rename {static => python/static}/svg/user-injured-solid.svg (100%) rename {static => python/static}/svg/user-lock-solid.svg (100%) rename {static => python/static}/svg/user-md-solid.svg (100%) rename {static => python/static}/svg/user-minus-solid.svg (100%) rename {static => python/static}/svg/user-ninja-solid.svg (100%) rename {static => python/static}/svg/user-nurse-solid.svg (100%) rename {static => python/static}/svg/user-plus-solid.svg (100%) rename {static => python/static}/svg/user-secret-solid.svg (100%) rename {static => python/static}/svg/user-shield-solid.svg (100%) rename {static => python/static}/svg/user-slash-solid.svg (100%) rename {static => python/static}/svg/user-solid.svg (100%) rename {static => python/static}/svg/user-tag-solid.svg (100%) rename {static => python/static}/svg/user-tie-solid.svg (100%) rename {static => python/static}/svg/user-times-solid.svg (100%) rename {static => python/static}/svg/user.svg (100%) rename {static => python/static}/svg/users-cog-solid.svg (100%) rename {static => python/static}/svg/users-solid.svg (100%) rename {static => python/static}/svg/usps.svg (100%) rename {static => python/static}/svg/ussunnah.svg (100%) rename {static => python/static}/svg/utensil-spoon-solid.svg (100%) rename {static => python/static}/svg/utensils-solid.svg (100%) rename {static => python/static}/svg/vaadin.svg (100%) rename {static => python/static}/svg/vector-square-solid.svg (100%) rename {static => python/static}/svg/venus-double-solid.svg (100%) rename {static => python/static}/svg/venus-mars-solid.svg (100%) rename {static => python/static}/svg/venus-solid.svg (100%) rename {static => python/static}/svg/viacoin.svg (100%) rename {static => python/static}/svg/viadeo-square.svg (100%) rename {static => python/static}/svg/viadeo.svg (100%) rename {static => python/static}/svg/vial-solid.svg (100%) rename {static => python/static}/svg/vials-solid.svg (100%) rename {static => python/static}/svg/viber.svg (100%) rename {static => python/static}/svg/video-slash-solid.svg (100%) rename {static => python/static}/svg/video-solid.svg (100%) rename {static => python/static}/svg/vihara-solid.svg (100%) rename {static => python/static}/svg/vimeo-square.svg (100%) rename {static => python/static}/svg/vimeo-v.svg (100%) rename {static => python/static}/svg/vimeo.svg (100%) rename {static => python/static}/svg/vine.svg (100%) rename {static => python/static}/svg/vk.svg (100%) rename {static => python/static}/svg/vnv.svg (100%) rename {static => python/static}/svg/voicemail-solid.svg (100%) rename {static => python/static}/svg/volleyball-ball-solid.svg (100%) rename {static => python/static}/svg/volume-down-solid.svg (100%) rename {static => python/static}/svg/volume-mute-solid.svg (100%) rename {static => python/static}/svg/volume-off-solid.svg (100%) rename {static => python/static}/svg/volume-up-solid.svg (100%) rename {static => python/static}/svg/vote-yea-solid.svg (100%) rename {static => python/static}/svg/vr-cardboard-solid.svg (100%) rename {static => python/static}/svg/vuejs.svg (100%) rename {static => python/static}/svg/walking-solid.svg (100%) rename {static => python/static}/svg/wallet-solid.svg (100%) rename {static => python/static}/svg/warehouse-solid.svg (100%) rename {static => python/static}/svg/water-solid.svg (100%) rename {static => python/static}/svg/wave-square-solid.svg (100%) rename {static => python/static}/svg/waze.svg (100%) rename {static => python/static}/svg/weebly.svg (100%) rename {static => python/static}/svg/weibo.svg (100%) rename {static => python/static}/svg/weight-hanging-solid.svg (100%) rename {static => python/static}/svg/weight-solid.svg (100%) rename {static => python/static}/svg/weixin.svg (100%) rename {static => python/static}/svg/whatsapp-square.svg (100%) rename {static => python/static}/svg/whatsapp.svg (100%) rename {static => python/static}/svg/wheelchair-solid.svg (100%) rename {static => python/static}/svg/whmcs.svg (100%) rename {static => python/static}/svg/wifi-solid.svg (100%) rename {static => python/static}/svg/wikipedia-w.svg (100%) rename {static => python/static}/svg/wind-solid.svg (100%) rename {static => python/static}/svg/window-close-solid.svg (100%) rename {static => python/static}/svg/window-close.svg (100%) rename {static => python/static}/svg/window-maximize-solid.svg (100%) rename {static => python/static}/svg/window-maximize.svg (100%) rename {static => python/static}/svg/window-minimize-solid.svg (100%) rename {static => python/static}/svg/window-minimize.svg (100%) rename {static => python/static}/svg/window-restore-solid.svg (100%) rename {static => python/static}/svg/window-restore.svg (100%) rename {static => python/static}/svg/windows.svg (100%) rename {static => python/static}/svg/wine-bottle-solid.svg (100%) rename {static => python/static}/svg/wine-glass-alt-solid.svg (100%) rename {static => python/static}/svg/wine-glass-solid.svg (100%) rename {static => python/static}/svg/wix.svg (100%) rename {static => python/static}/svg/wizards-of-the-coast.svg (100%) rename {static => python/static}/svg/wolf-pack-battalion.svg (100%) rename {static => python/static}/svg/won-sign-solid.svg (100%) rename {static => python/static}/svg/wordpress-simple.svg (100%) rename {static => python/static}/svg/wordpress.svg (100%) rename {static => python/static}/svg/wpbeginner.svg (100%) rename {static => python/static}/svg/wpexplorer.svg (100%) rename {static => python/static}/svg/wpforms.svg (100%) rename {static => python/static}/svg/wpressr.svg (100%) rename {static => python/static}/svg/wrench-solid.svg (100%) rename {static => python/static}/svg/x-ray-solid.svg (100%) rename {static => python/static}/svg/xbox.svg (100%) rename {static => python/static}/svg/xing-square.svg (100%) rename {static => python/static}/svg/xing.svg (100%) rename {static => python/static}/svg/y-combinator.svg (100%) rename {static => python/static}/svg/yahoo.svg (100%) rename {static => python/static}/svg/yammer.svg (100%) rename {static => python/static}/svg/yandex-international.svg (100%) rename {static => python/static}/svg/yandex.svg (100%) rename {static => python/static}/svg/yarn.svg (100%) rename {static => python/static}/svg/yelp.svg (100%) rename {static => python/static}/svg/yen-sign-solid.svg (100%) rename {static => python/static}/svg/yin-yang-solid.svg (100%) rename {static => python/static}/svg/yoast.svg (100%) rename {static => python/static}/svg/youtube-square.svg (100%) rename {static => python/static}/svg/youtube.svg (100%) rename {static => python/static}/svg/zhihu.svg (100%) rename {templates => python/templates}/base.html (98%) rename {templates => python/templates}/download.html (100%) rename {templates => python/templates}/download_queue.html (100%) rename {utils => python/utils}/__init__.py (100%) rename {utils => python/utils}/browser.py (100%) rename {utils => python/utils}/download.py (100%) rename {utils => python/utils}/processor.py (100%) rename {utils => python/utils}/scraper.py (100%) rename {utils => python/utils}/yt-links.py (100%) rename {utils => python/utils}/yt_dlp_logger.py (100%) delete mode 100644 pyvenv.cfg delete mode 100644 share/bash-completion/completions/yt-dlp delete mode 100644 share/zsh/site-functions/_yt-dlp diff --git a/.gitignore b/.gitignore index 2398ab2..62c8935 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1 @@ - -navidrome/ -music/ -.idea/ - -utils/__pycache__/ - -*.pyc - -geckodriver.log +.idea/ \ No newline at end of file diff --git a/database/album.json b/database/album.json deleted file mode 100644 index 738f013..0000000 --- a/database/album.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": 2, - "keys": [], - "data": {} -} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c70fc6b..c81a5f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,127 @@ -version: '2' +networks: + laravel: + services: - web: - build: . + + nginx: + build: + context: ./nginx/dockerfiles + dockerfile: nginx.dockerfile + args: + - UID=${UID:-1000} + - GID=${GID:-1000} + ports: + - "80:80" + volumes: + - ./php/src:/var/www/html:delegated + depends_on: + - php + - redis + - mysql + - mailhog + networks: + - laravel + + php: + build: + context: ./php/dockerfiles + dockerfile: php.dockerfile + args: + - UID=${UID:-1000} + - GID=${GID:-1000} + ports: + - "9000:9000" + volumes: + - ./php/src:/var/www/html:delegated + - ./shared:/var/ + networks: + - laravel + + python: + build: ./python command: python3 app.py ports: - - "80:5000" + - "5000:5000" volumes: - - .:/code:Z - - ./user:/home/app:Z + - ./python:/code:Z + - ./php/src:/var/www/html:delegated + - ./shared:/var/ depends_on: - redis + networks: + - laravel + redis: - image: redis + image: redis:alpine + restart: unless-stopped + ports: + - "6379:6379" + networks: + - laravel + composer: + build: + context: ./php/dockerfiles + dockerfile: php.dockerfile + args: + - UID=${UID:-1000} + - GID=${GID:-1000} + volumes: + - ./php/src:/var/www/html + depends_on: + - php + entrypoint: [ 'composer', '--ignore-platform-reqs' ] + networks: + - laravel + + npm: + image: node:current-alpine + volumes: + - ./php/src:/var/www/html + ports: + - "3000:3000" + - "3001:3001" + - "5173:5173" + working_dir: /var/www/html + entrypoint: [ 'npm' ] + networks: + - laravel + + mysql: + image: mariadb:10.6 + restart: unless-stopped + tty: true + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: homestead + MYSQL_USER: homestead + MYSQL_PASSWORD: secret + MYSQL_ROOT_PASSWORD: secret + SERVICE_TAGS: dev + SERVICE_NAME: mysql + networks: + - laravel + + artisan: + build: + context: ./php/dockerfiles + dockerfile: php.dockerfile + args: + - UID=${UID:-1000} + - GID=${GID:-1000} + volumes: + - ./php/src:/var/www/html:delegated + depends_on: + - mysql + entrypoint: [ 'php', '/var/www/html/artisan' ] + networks: + - laravel + + mailhog: + image: mailhog/mailhog:latest + ports: + - "1025:1025" + - "8025:8025" + networks: + - laravel diff --git a/navidrome/cache/images/01/dc/01dc1df46675b3a4cc4149dfff3a2bad485d141e b/navidrome/cache/images/01/dc/01dc1df46675b3a4cc4149dfff3a2bad485d141e deleted file mode 100644 index 4bc10d7e3c387a0f3d1dead1dfbcd621d7a47f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174213 zcmV)6K*+y|P)qqSL{LdUMd~Vo0HWYlaf@^I*?X-y$LRh2(fgeHM4o87 z#kptiwf08of=H!!#l%6t zMG$jD9H--M6g^?sjH-ecoQ?n>xC3I~&gcsOs+BPoR27keDvU7@5!?&`vcf%bN$9=s=Z2#}> zAOhx?EqVVY90LatMFd2gF$O*i#Hk1dm?+u`Vt|8>j*37l*f2bn4q64gAR-Jq#u|?8 z66-Yoj4>#sAW}eDd{4{vOso%Z&{{B`5x`w>1jds8EvSP|4cAz=J_cG8A2VhhabZ}e zh=3Wc68FJl4X$g-#)!S-Bi3hWIDiyXoIW~58zPGN0^SfAxXp+(kQ&cR95KhuDMfKN z%sOTRl?FOROpw?o1;tAR6d4Or8mPuIL8#!l88d*yt)!GnA0UkFd#Vy|BqbhbToQuD z1BrJ<0CPb^0jJf5=Yyy zpgXS6+K#>~2p*q<5&@vLSo8?y&hQ=q0bz^?jNT1YD77#$=(r7RcwXBYIP$KkfC4>! z*BY!?uh1{R7Yc$_ro)CRi~%gSV)_P~03v>Ah1>z_!KiB1}@4 z&G6HSG8-ZTqh}QMZ4Ij`MU39!QaImhYn|W+M)3 zoZ%oNo;M=Y5(kEDYh1SV8iy+sEespf+Hmp!(h)%ps0hovfaE$Xjt_y}sd*5`Wh%8) z%sb{CA4C8x4flZ!!A+0?wN6;?u_{Fobo)%}PAoNpY5v0+;8kE)>|G)6r7C!=BO?y} zJQwoc1yNr&LEO7Mpoudh_JJslBX|Tq{n)qwPW_nw7QokySSc#Rev2Kc3cbhaqgt>* zW>Zcn70hw(`7jIa78w*3_sCL|5~mn>!!nSpi)0O0u%3i$8O*w19i?hz^!QzZVm{(T zb|LNuBd1(?)WTtkDHEdK_qU4$7d}CLy@AfNb)`wU9T}tu{f!qPL0u* zEm%n|-iTRo!m9RfRDY%m$(j-03~D zZmnF*GrMbNNSj!W_we}`zfl$OxCVF0jb!my{A2H}+Zb@YDPSxtAnAS0ycW=KL9Op@H^Bh_{cy_MQ9YMxEsS}O1TR1?rXsEh|+P&6>w$r z*f6R!Qa5<(?WFvhnTNZW|F<}g2jl}Mr zX{u+69+{R<(Bc`*^(yGPqVAC)XangHRDFr}Fr}!_=VPSinJvbtH}Yh1jL5D4MmJm) zM{yTK3Zsu)yq+7vvA!T03o`bPZi{xUK!jMp>-t}RW(_(IE}C@_c$NjRSZw>K4+gm? znH`Ftq6{0cSxY0%y(nAy#U*-uqE_(p1-C5wBfe2p;>;F}Z02N#5QjifMT$Xd?A5vR z(4)Nl_6^>C8y-?)Sd=LeA2c)1%BxNnZa%r=M_;Jie&hxxd!-wQ4~p(U2O>%-gK?O* zfKfydgkc_#gbNtd8)wia`uXuH>oh}D8Ot08h(_SS#`b(4yuZ0vAOlA4JxUioHWP~g zJU;e$uKyFo*3F!sS#l}&-g8}8Ko$~*sySdzn<~RIkYpLQ9(b|l2jry|ltMrW_`s#$ z-Wj7~F4R&%71sh%C|Cw6KrQn+zdBf1195x?CrY;MkaTBkP{V`4%D2SBETWZa*&>-I zEP-p5xN+#48NMbc(hw}3x7J85a!tpzMX4%uN(Di$l2dooSupPzkk~#9vgF;*6J<@; z)KJ-N=^fJ0A{a9wJ>R2(lt}TBtXr43E*bgIbqh2OQF@e`nS*4CPCN(!DPU{bEdr%b z$}T>1iImh0q-bJG1(ybLf|NMz3XZB{ET}Dr4GNK-;^d-_fGjSEYi5ZZvdmOUynkIc zK}p;#1Gul*PeI%%fM~;|;#M#m%Lgu7`2m5KSq4Dg0w^d*W_ak9S=Cy%!@&VFkDKJi z5b#ps`Q=F*!B%4d9gdXlXjN!JomTwJ83HPWS}Ix{AA?#d(iA4A?k098J9am3@t=SG z$MIQ@8Pk|qyi>*VdPjU7FH}0+1sNB7=3~Y;ecoG{Zr-4s?5MjPMU665N>#)MQlmsR z(YRMOs8uPG1fW+MWehl6#`1K_$mkJ#g*a#gh+_xK`#eSjvQkQJKEP`pLIR?>4@N$N zC^y|lWIdVXM&Ri{4~!?_5A`U}@`>ciR)%#%1D_QXDJzat!OIpb0;7#m&}}WDI>X}m z1!gwzenfqsC{<%miB6Of8A_}dOYA3tD^d_DT27Es(4q(x_r3)h&Ak@uCUHYq4{A@? zgYEu_238%1KxDFo%-V`4T;w2uhiPdUQwk~-2zbZ6pwbd2H-;}5AQF`s-oZLB&`6Oj zz~W4oJ#V|MIiF_yK2V3^v9Nm)zV@?U&*wZ< z87A!8F4nji%7D_KG?WqLCU7#Huo!&KQxjkJ>)u4ymbrr=BYti`WX2`#j<)Cy*oth3 zAdF~w^f*K$Gor}o9o0rHQsDo2e3Q|qx@UT0Z{Gn^R5hYipJ^b1PHIC(nmbR+9rHC zFpd|vWN;LXU?I9aD4iPKZ3AHiqgKUiy;)Ijms*j`g31SQ&b~V=Fdo!Nh5JZtr2ubbkpMC zNsMCMEcv_2Nu#v}!h`>J2fm%sB->^Qb$#*4%{FxwV6W)VnT6Ejh4 zKJfcL_w~H;;p_ajf9>BzM$nzh%bB*{A)@qoj?>u#lxJPQfcL>bqWfh~Gs_$!;0)P< zeyktE@VqOCXPI|Z_K_H&YzOgG=@KKmz6?4t#H0(6%g5wd9&ZAjMj>8ZFFq)_zK$Qi*0P#ljh=%V6p_|!N4tkDH&zmJpU~-ARiB0OfD1x zYf)M8p^o*Qz;A3y-*ATb`Oz)0AH_$Me^py7j>O;Gg+4l397=Y_EP!OOk(o~fy5XJ) zdz@OL@!$=|?TC#Tv&;~4(TN*2q7ILn?}$gcby=1KWwV?ms0C}uYi`jLa6>&FL@6aU zVs7qr6T||H#kxX!(I&U;K5AwQv7n-XAe!Z#uU*MFxk{Zdj}y>(X9$r^Wod*sD74)K z5{F0IPe@UEA0STK?MBPMvnt6GU<3i znwg|%bcsbODlN(+2F`+b{tSW3ZkTHz?E$-F35RuDlwoU!lxPM(R6TUm3$5-EZ5Vo0 zriv!mU$)HO{R+1;%c^NRus=52{20u2UAUUrmS6oGUgO%g;(2^bBP7<7ZC{8Zl3jaO zDjwK{=(-tpz>HbqKt3o`#-zb%0g#HygcJ2;#LE>oh)l=(6$YlX2Np<1ZWYuUvh>)v zMCZgyN32rH#CRZOcZ+LtohZ^{L(-x|v}nH%9NFz@CiKhuNUf3O$Up&fhx8*V1yjT8 zwP-yr_oI|#2a;K!TL7i3scWRlqJp|*DJID94cHYCFlVT2bO_6ZrKRA_A`43VuV~_e zq5+D#XRRI!zi5L}vEC_t!5G`dK}%)^c{++@S1mfbYj!%uk=jlGr_VFuLXkpjiCCbe z$o5>MDTSnvSf}nLT!qpakM5jTJ#xy6v-8BXFsz}8I|O8uYhdFSc|bWUE={42&S@Du zeJs4@p=&&Pvcoz-OEAL@mK{o^?F1W95|&zn>X0R-0;Y~FhMt~8NpYOxcNRfS>0;(1i7PR3e3lbqf!&QiVpSK zbP-A>wb8|v;Zef70LNHMl(;6-z?t09vcsgne1Y@`KweJ~@wf(Qaqx;!r;|8<=Og0L z?K5dug4d!oGSc2N(TL_we7j?|Rx=6JXzb-$POhFUy5V=CYnGMWP(4Y?$C^d05XY3S zUy~A{=#*f+Z)JGAM|=AeB zX~X&)fFaSn6P-{=9+eD4_5tcINhp;FOu~R9z^b<-r%IMsBNs>Xp4BYKvU=53DqM9A z*UVI4%Ldmj+WNh<#O%Ezxfx7_ksYu}gyTnFz`N5l$c4kMxL~o^YzvxN%N5DCHFRq9 zJ}6V$u(!a?0>@jHnObX2H;ux(?ILe81E{-!_{YCHM%Rk`>^mu`=qdc&XSFlrj zd)&wae_J!pz`-U?Z05^8;c?#o{M-5V@A^qji&HE>Wa|S)WJ-=Ap6gO2yQQ(Y%!M*d zQO48)!;q!3A&JMDCQZQC1Sn}%d*Uaj7;E6h-{_w$E;JXy4Qj8Ty?TnFd7kB zl3N2R2+mf#&&W6~N$^enl8wCHtUSz+T5yf$D`xl@6c6gP=?-lth*!iNw|T?D%9MC1 zad3Kq+={?5=yrjqQ1v>4dqKpup5?E>R=Oq0(>0O?URIYjZ^5gIGPYqo4StPpghx)Hy~ju=-!mmp|@$Z_)>@xsa?ChKcc z34qN($!?uTx-6amp8FOxZ6vZ#%65K59quav!(c?Zjnd5`SSiTpaVlzIn6QGJ>j`Lm zq1&KH1YYqa$|(bB1D8sf3iy$6=(zfZUkpevzT~MUh|Kx-5}D&jTuWBGDFc(sMzM&K z?7%;abw%hclc6=mdJ zlUk7x*q#lf}Iw?DK^uq^2ozCdF{i6hj*7Ol(<(VnIE>Q7DiwW58!L@ zK}*K0C_jh5^?jkXBTqi6yz<5k&R_Z{vo5SH3v;KI8XH!WetC%Jz=|*B8m((Lk?1m8 zvi1)PY7zX$x}nz0%xeTBmN-L_6(UO4mRVj)Fr>lby1+^8yvl?~j2-_lBpQicd#PCQ`6sFBLW?<*5J zok2Z8rd?!4NV4u76_3_5Y_ExUpjqZPRfED14a#GHwF9%}GO@{Q2@rXI{S2R?WsX59(OfVyM!wFo zbsdX#&}|9Ow+K2Fq&QwHw!g-geEJ*ss&_rcGHcwkl?LOPVfhsXx`L)#;9CDB%j{|+ z@Riwl?>nF53qJEn=F<}zjW$hCqxBygo@l$*T7%QKR-FcAI0HjVWq6dhzHhX%Q>5g< z%7cVRFzb2m3vQa3QE~w#mq#9+C8bhpciOfr>k6at2eM{Qd=mJWu33~^iPLQS;-m`Y zwUwGA;S5%5XYwkOi?ymn=-Jo;qwM!k_h`EgdK!Dxb6w+zTUJAf;q3}uPQfZ-m#o>+ z6(psIOla8!bRh8=YMp{`ogL_+Q`0JY#L%MfHMce0HTf74{KZ=Jsg#A}ASf}&#t?&czqHRP9Q zWQl9nFRtP0RQKGWE>Q+i)^2Qqx*7aeS(2zwj)Th=Uq+5cWOR%{A4@!b0q+a7#C@&P z9c@Sn#6nw3-hvkmo}T1^lCX++Zr&o$mHF~sBn5p*tVi+Xh;@gyN7^3k@g$-s zyy_B*IbId38u!j6z);=e|VGl;FyEA&+@K>;Wd#886t7KDDPEK)8aC?n#5lul0jGfLlbNKw>H@X)vx$vV2>=?|Cq6Cp4*_ z%F?Bj8v3%5(x(6gw(`dlSs}#EwPGslPp=_5LASt-yyLnMcy__OP|FD> ziquM*_SgVVbwg`$J&QxJ z)X3}=1|!QJ-JV~7#U(qeh2io4MhI|+#QH0xWM?}&v%X46*t)fAr!nA(l#@wdRhGdB ziH3+nQX3>I6!H)X%8r?51H}*@^wBqN8`OX;Y@oI<<^zl)ZbwRm(ggR;vK;6(QzWXC z5EqXq=ZJf}{*mlZ7M&>S&}V#!28OIzrjN{&G8xHWraHy`6wq?j8GjJT+{(OEoR9=# zv&e#@vz?V4h0(JylJD`L6s?LHHdf-IZ4VMMTCRUo5X)^YD<%~!$5Mjr?U{a>t@^zZ zL2jfPz6eEjL`mrkslfyfJdRT1zrFViOm&ToAOS8)F1R{1%p!-^CXCdYwUa4yS8f4( z8kuHB8R(-^YGfr*7EYA?34IaNm&hWw7Atu=t!XKNtKf;*Mfnw7zXBzKlWe6Dkb$q% z0K9GMqUd%)YpsE`jGozE2Bkb*qV~?euM1)=!AKcMN+euBn{t>B$cS!`5+$sS%zc_b z-UDi-O%3mz+6rZ=cvWgEOec+3Kk+Dc9@=wp*?FjV;G3o3V<5>X64Di-lt?I6(fWpE zT`i;a)RjD0#TL#lg*y-LdGfJ`_+UR`W3Y6i?7)_eiPKJYjAbBmWZPDCFgjFmvskNgX zq~|zze7g~A2_M;4hA>v$VZeYZ=gvSIrR^d!8=c}ov+46OvJMUG%}WJoh()=jHC{i= z0%OwTs+rQ4h2o)VU^__TkR8Wk1c$cIvN~{2cL9x`F@j2?5*o+=_>&u!I!=*~~uxdSrrG80RQTi@}LB*2BqODB8JsW1f`-d(5O+f0+KCN&9zl7s}x`(ug zdEnde)sL}A>J+VIo8xE3y1Ri9+B~#CW<-=0o7IWGJ3xhLiga5Y5~VFSVw+>BH)v4&W=+dXF0jR9*% z1s{}~H)u6FJx+OGv9Aj{ak`bmWf6dCt0}4;bazyP9id(+H_jOShz!BKA(Jv)KV>K( zELEXV-{)E3r5GBUu{(6FugJtsE_M8@t8X~AMHSJp4O9wf1Lbfu*{5Rv16c_0H_ zvxLk@w(O2|`82LF(2(J*Sh6Ku2MJpr`hxcv(Uw)l+WPOfYSKv}&=vO}>W;{uT@=Hj zjNcdmuwuHNQlpU!06|kuHh)Yx$6AGmpe~q&v`@1N67iIrtunG~eu-lqq|;T8m|)0u zfRAML2R^!1cX9vL1HP`2BW`;r&&}7=xu6fcDQoFxaS_MM3x3n*y^D9g^>xg%p(YIa z#_smqi0doeqhuFbOAAfr^-3@$ZA2dEJgjwcE*2rPx$VENQqTaSl`@Q>MoC-_3397S ziQlzm0Or|cio#AtCmCB?N6%NPN0tI>Fp3j>HQxygW3|#)V~nwKdb9VrZQutNucTPJ z^4I?1_ww`$_bF2{jRBW|`4oZ5Ez4rrHidY0fjrvkier7yuAidUc6cl3GZ#pkaD=*R zjLU_x6S^2>2t}p65g}P672d|YJ%3#*-3SL7^4Ux6BVLsY$XNt z8i$n%n!@NZ6=Vc$LUm>R56Tz}0*8Lk#YH8%%o^HGPYo?DnekP|=*d4X3|peSbir+j zbtG3p{grAHBwkBmxo)t|%CZl0gUGOgRN$HYJwQHZP~AH!`{YB+S(j#=o~=m9l7u43 z_mT~?eD0Z-`GwtwInI`THe*Xr0-T4nJ&6y*B1>>hvR)ro)vo0GZ|(4v!A)iu>push zTG|e`!&OEDC^c}E;<3a9`oq;%OjZ)>ih=nQ?OyN6btza8 zWO4Krw`jMo<2Jbe3(s@1KM7EM>Cwv8LY1IBST;z~-H28Sw!hANoO$z8H+bVCD~+Y3 z)M71RGS4o=zm34CWNi*?_bba-kqq1;18qD^(NG~+AH3<|9Zx-elOKEEOX$g-cK?!S z8AMqh=7Q0FU+9d!1Z}ldiaVFjzsQZ(KFN4YS)P3fefFhD?xZBD5Tx0)^Ojez-QQJ? zVp192skLBz%`D}Rc(Z?a4bMg_TRBZTG0c^6d{IjwUuJ)2{`_=Vhel+pBzzfMvbO@!vhaq+Uuov9} z;fQ!8DTuUgSVvA8dh_8Z>w+GgCzf!yJiz6Bm;#&HP(_F`NT%Fm7O!6paj_*`7FNTv z3^N>f~%YLchuOuPLM<?`%;H0Tc5 zHY@}gwrOFSD!UtJy!SKS%9p<5A%+-lyR~D=JX8|H+zkG7Enj+eev*x!IlFnVwj+y3 z(xh3Q>T6lz%s4;s@+C5M{DU8Vj=%AJKg;3XJ(k%x_Kr(nOiQ-Tizvs73-mDP0=u&_ z`tvU{-8kj27uxkR?8S4IXJ1CjF8Qqy{3H(z?<43BD(QCGH{d*&=_wO2kBr-6GgAtK zVE_AYY&nt-EpVM&9>WIJWew5PGNoc7U=`Keh>?fl!vX`-bihT?b`l32P&J9Ki3yKv zY~c~a%>#SvCdhK2v`~vMA}MIo6jn)xL%<(vDQZb<^&ZWy5{bv^C=zFJ1oc8;*qpAz zikFF+2A!$}bz@nU-2U;*;u4mvYFoE@{7?q2wZcMK{kv?%f3@Xy>Qs?}amc7zGab&f zn9#&UAQ>C>k|6*yKc)<1ws+)MS@L+G@u(3JWl z#UXGK-3U>ouC#zmGkt*VVOL=|cI>#UB3(_>w`1T#8V|qJDLkx3hrWwbXLDr;13Mp~ zrP88ToEi~aD^*))EQw6c#wyc@&B#dgK%EGS+6573^f|JevZDwbvs0_3B=8>~y-IwB zI4Q$2c9l9HN;%nMQ$Y!D^m}DymVYJ8Mfl8$G^uX_w3#GAl5rOISIFy*9X(DA_C|YTd@xv?;2D zP`FTPW6UEl;K;003u8$E@kV1Iv$*UCOI)LBngF(VhtZwg$tgA;qj4~j52ZqD`?UVf zN+QpDGmk(c0k%iUo2j1=O(adCw>s_)O z<*I84SGe;EwUn~aMuKFU!E+2mEHJE<_fw=~yeI0{bPqL)dL0AQHa2?^Ww-?H;{%4L zN3;g#X_+xqG(p3mhIlv-hDTC3L%4*a;`T8f1hy^kg^`KN=9EAJnRAp;mRy%{oFjOZ zN_D4OfW$OKCk2_2I^pW{C0O&m4Aj$qN(x=#vxpg8oH2s&8^(rXD{G}!k z&f(sDI0O}-+~|zE7xc?cyLpC81?HrIh$E%as#2@dPOfu#apcS1{U+Y~iMJW&2TXS~ zJL1w3*$X2>3G^fuyBlOd8483>wC6prLz4}k5k}?~*)$;9+$s%D!vTrbcWP{Xh(Mwc3kkDyg0yoi8bFl z?c^i`<)VyZ+F#cipR*6V3-}>u76@GucU`;DVj(t1C_X~IC3{+d@qhrjDBGcJ(kNvY zon%IqbQ0MkSB|}*5Xl0D$T-bL$d+`%laCdI;W#vENxqK}5jI>r1xvQ6tfiPFILLas z4qQU}lgh_9^$FYw(*W95e3__W*UYN49o~rmppwM8gy&@qT9VjJ)b*=YsK1ZS(M6B?KDB2R0(8i4hEXiJE`(9#v=p$Ry||DpXNS!iucc9ljhAU?#g=@z7){ zOuG~8rL^nyIGMH}yuQXWyCgTVg3AaIvqSGG4o|#eMMSU6>N>?6r8JJ#soj}c<#_)b zdEuOL?KCpWN;1}Wm}L2YLoQ4giC}fokYczjeEKK7k#GIN*9OMXt|2mDUQhqbv^DbO zWU+26a72Q2w;v5QNpfYl5{@qv;3E}eJded8cYNJfbUg@?gn zNUustY64;j->lg6hD4`6lEe_-r{k}s6b6lkLq!?sXGh|45h!%a6+{G+wLByarrIcF z&*;Y}S(D;nt80rB-OCoe%<= zrAL&Ao+;zDP9p?I>Yu@E6TW+N{Y*UUMu6cRB-HCpfN&-ffMU_$@FWXZ5-u{AIAtE- zV1$XCvGgOV&{~Pi#-bZx!|B!|02awzJ}5Qa8Z{ZSRg&Rr>po%iKN1aWN>q{3(2ZK4 z8+;a&iY)PRs06K0_AN2#ltxI}w@8o&Ej5FYk_T6(XpkF&RF^DvS$QbrBTwNeJu(yz z=z4eK8v4j}Iz5EU(?q#>4Vx;<+`|Q6H_^^cvYX^lLaU=yC{qpDktuI~)ob_*U-?$< zs53^~_u3Bu8s{N%#UtVYtTVq>dddTvF)*scff5#67m;u5=Lh&tK2VN`7KTmSt~1~M zTi?vvU;QL*l|rZP_Ys(6ZAuQj6zbVY$caW~&ih8Wbq#3^DZ*k4^5`|Dn`hywnjzK2 zGi%68Tk*;5V3uuzX@dR|-bx5prk7I<@A(Hwq(zl_x{tM@*?1^ZR?(RarGu@jhOQC{gnIhQperz{G(lSzW-e;CjN}MnMCqB$CZTKr5LtCl zdC_??li5yq{1l1{)(3s=pp9Bi@KLz3s89SUQ=LJ`4fJG}ojOD6l_Y1CwBW0k^}0dh zLArZj_<~Ri=kek-gxDOUi5vt@Mipy0LG277Y%Q>?&nylp33*O^vo|?DjjP9yz;qjc@sa zH*#kh%tI;KDR#-wh9`ED?HXc)lcw|P6778?6R-z}#u>cQ#D;aslBE(`^a`+F^UyU` zRKK8N%uD0W{>UHv!Z&jL<{4!&T5Yu5j@DwtR4Ef$8)e^c9n5O%YQvY#xHyIlu^D5z zr0kUG;WNrUy|y;J+N#-eO3Ivc3&uR~oUS(3gY4_L_A4C76Et?i8Fs+z~tBElSU zT_QS!n%34K^1ph&;n}EiAT3gNo}w@VWhlFWuVP)IfBfnc0`nUF-pzn)>Bo{VH5^Pz4%7kkR5K==|6{6^v z)z)o5QAXWm)LeT>4e?5Sz`$%B9N;NQa8XQ@ZUIP!wrNnu90hHO+8wFLYV+=yffb>4 zU?BpVdjO6mn-F<*PEZXNaUo``se`7T(mdM8rIr*d+ZJr~*pa&je18LEmz#A}Q(nnb zLhuReq!y9JO0p9)wVU~f6XZt(lY-V03PL;Eg9?XdUt-+5K#p*{d!U$M$IAd__l4FZ`s}@ELE|ahRPp1qo0+8r@!C#7zihd`XLjEICob z>y&uQyp>X`v18~zqxFqMh9@-+2+^7qbz(lHrdAo`D*SR9km07 z(xx4Ce?~bu4bw(-%IOKy=?T7@0*_i^ZOkuSAP1+ve4oR!cX2V~Mq?C3>JHFwl&uZ* z5z>%o*QInSs4!RfowAB`*8|dh!EK4P3$dnmH_;dG!#oELBn1%*t*h=L5ZGlV;W6)z zv9OAu3yNup9D;0Ur9oy#(LoHR=mRSSk%^wR;+7ttuoJji?D zh%n-TOVIS)qeCYIuo-o34n!EsCi_@ZN6CmC*i{HN1!J*}mcnkTEOUrORTNW4d-^FU zjDEZdi0k|GNJFJWS4OwyLih)*W_VE&L@8q~Io?UPQfRDRR{cKI3G;#^r^T{M=xM_e z#M%s)>X|YpW|$>59v!E)+u;ba5{&~KooZkeE;MQMd1fk&z8GRb(u?mY%uz}djRwT3 z_Lr%lP5In6KfyQs+E-%7g}Px%x#+Vixn1`W#k&l6e&;s zm=>gn7*R`)c}D3mnR8(RUe3PpWO7YFDSVRCJcZa(aUeo<8^R8|&k z$pAQdPhud9B|L^IVaqah1sxXU>F_JrjRfCAAiANM>Z>R&4KIeIk-n4&G>(Rgg9k%i zlLQ;K($OUo3NcA2Cc<2$wecC8*f23rQ_-CLXKq)__#*V<9JBhO2uG*Fp@&vZhqGYl zeu~uFlvWzc>aaRS1UEt?JglQusI4FhPrl*~zva{4!fQ?q^UQYq0of31yZ;Ki@?a>k z^sseV2+XqNhTghM51d^?I*W%#J2`%=`2(kG;$vbU(%DesZ0Vajue~w&vd?@2A3VS0 z10Q%6YmIpcdt_}2saOd4Sz0?!dzPgqmg;m#jh!0Dv4kFV8K@U*?sV^=>&&vPn#2nytibFZ`=(PZ970NtEQM%qRTk!2=sIEW#!9uwqC z;0lQ|*c9!=P?%TPO8H#05@fR&EYYr5y8+Iy`na!vY#7p$DRD&z`&A!A`oCF6)a=%b zlm->n;S-XW+UmDs>9)Bt@Ks{KXAudfgQQ(Vuc3#x(ypN;grW+Yyuu`SPo>oK|5-ug zw6oYvA!_#Uf>&v%wg8YzoJ1o#L|Pi<TmBwpMjYqHVI6d9tD%3Us0XeiHsE1Ixi!+^_FiL3HBD+ujaEa2t zO;Zfc5JJq|3ia9^uO-|!$DnY#r6>z+eU?%fF6fwHEKJvLMMI#qbYCdc zdKy8jPB=C99>ELS?J%i06SeGe4aQ-n`TW-*6!CtJ?oMF04;voo+tDJb)Eb8+_=d?w zKnOywIniZLJ#lpWlH{wTlW01nWJ5~TgW_T7rACE}6XC=l*))pA#PF4~NKSRKu%OOo zygG`86GmX9Ydl&fKdDsuGS(n3nO&uqwqLatb}vcx@%dCit8(r7j@`90-t&%E@y;i&F?w*o))H5A?dx21IU&mhkNY+gGYprAvvgo& zbKxqx^1wX^U$G-bSLc$Plq|~XQ@=`Hphd|dme0{qIyMULc=CiVe8;Pp&dxZyaT;L`LM2cooH@nf zH1V9^OL!x>Mhc9CP4HNZorR*`CFDO*!?*Z+>*ylY9Ir)oKz$1a1DmtzU6L__RaSSM`z)pK;9I^71t1$X6gESN*9;gw%q z!Xb9ES&2hUtPy5_OTqz0rSNI5Jmve|_9!3x(8LFDmO0Amo>|ItZBL(jFvw4Lw6^28 zEYS%o1wS0GFcuNYZqJZ8f=OSH+89gt-y;EPtE|>ZhKzNMrs6@wf=vx=6Kx2i4%9|W zz}}w)ZN`JPV|~H*l`$Jt1Y3-rkVdfF3oBu8)mOrj*;x*ptp>qT3jaCjs0Rds7DR(Z z5RN11c4{L!-?<-M!hs@OVZ#tKvzag#6pzCrWjc}FMPgFDXml}$(U)KyYYD4|7<3R! zURwi*XsXl$Ak!L!SA;!Hj4DznsVz^xwIy5|ypyK6qEO1yW;6LSQaO_EO#dnYh1b%N-Y#>z`20c z1L{hRn(3@Lt|2EeVhmT@yDRJ4=!F{92A*Y}Tl~9=(|r(BMTx8-%WFySczySvM~p3S zWt9x-0rU>x^^czMjqiE`fAjR0dExxP{PIP@R?(e0o?l?cLDRxK&#*YVlO4mH<>G*J zi!wZw3^Cp;e!rT)9B_v^vA!fr{t~4NWwU6E?8pXV7^Q@s&d12iAut|q0=lCQID7RS z`iu7&$H-*DF-f5tA`R~gizXbPk-@BU2el*=QcETPOH>dN`^K_Vl~jVLR;)ypr;?q! zR-x@^EckJby;l-aAtS2Db!fZJm&% zD~WCkMs@8%jwC`zTH|<>(wg1r8ue`GyUI2QGVNs~Bn2grG&93X-!5onrmlx69`&|M z@HvV|lte2oQn=#P^Fb!Og>KBDyAEcupd#yhH!+KZ&wq)I0V31^0eD@XAa(sIw{3LbVAMP^z52w zPCd@XfdF4%EKS_J9gP$eu!j>}AwaK6BdQJuOw zfn%pHM`}~{(~j%c&-koQd_CXrNw44?j}Td>hh}aC=6R4XmZfq8EeQ<9gx-x(getiy zMT3p)Q5;^;lLWOE*qJKy&UQ!4a((2&U0<_yNz-aqJlM|R){Zth-3vBq~F zJ1@U{AC|$=qqAI2_l&utJ?IsEUKl`a712sSaA7Ij`vFs7odizR0O4~YkPBB-6OB&k z6=lT|yNe0pVTYt4`2l>1KqRH1wop$C{l#Mh9#_Ia&nPv(aaG{-Bv|+ZdQZpORs$k$ zA?MOo^04c$n@E`oob1psSk%#JqEhJNK$#{M8f``@22>K008N`GoO-wcp_X-~FACwyF+E@4Cx?zYahFIV1=OS4VyrdA@0xVjM z2gBw`sM33Ktx9kwx`z(X(psi~CsE9^&LxSRVg9FUpo|Tt3ZsYTm98mGkPoADTtV~I zGNMyjlux#d&=4gL2?_seZ83Jrv`})gb4;%t*hui)9i0mJLQHrbnMrwSwZikuYuPsA zx(E@ck0VVh)D|VxGNL-F3stAE+R4&Xlj}O>h4T-6G;~z+1tx^EsIAVXYc`e{rmvV) z-jDPR_jI{%mtZW;ajj7sw?{We3la#hN$byEq4%Ho=(O{DtG;>tTtOX|2If&V=C z#|?Es1}s8MvcU)u`$Tm?8KCP(uMA#!h`N@o^B1Q#_`L855AFB^pZNq2o$dKs-}^JX z^wF2-$0KMB%bcQEt!S(0Fi^!>q3RUDuz)QGz-V>PJa@_zRGi*Nu8ru37a}t-2^%1Y zdmo?J6LbzXxV9R8S5lC+4@_rVKrP&V|F5J%A`b@~@s3ENRTy>ztJp&5Je%VEz*vsR zG~s1OipS#fXp4hP9BJzzV-$-4dulUv3i5GGtnSnzi1jqg44#y>2(V%!Di{}<3NlV` z3~w#iJN<~2oJ5&j^AInGn{LU280%rXRCn>778R38!6oipm{v5TgfeBg1!X2DY6b5v zEx+SG(cYv`pf}`Tme~ks0f@X6Gr^Zdaz8;2aJJ+{BvjNZn{zP<^&>4l-)YXBC z5R%xDDtOhcMI6(WW0Bh+%D>66PDW{1Emup;OiGmQPQik?Finv?ByXnoY^RQBGWbYw zDlzhWEs=@}%RJ*0Y-)_YFj)Z2teh3gg{y{mfZLHJWh{__j>tG9+r>kpoC`_PI*=et z+T5LP!E-YuuzS)k*^kt^H<0mJP+K;%1dRn>p$PK>uQ(nv0 zyz5bJ?<{b?64?g6tSy$uIw1qGa z3G=sI2_8{89R@z44^RMTK$pKFwklZyv?cgoSrlMn@Yu=3SAWtYoL|0#|c5lXQp_a5J9*&bHhT7;JJhPEw!SLWL z6)71E1V4lz+a$f$bWW&r#Rp4>mP@79MqeCTI<-XdV5Z3f%LaiHi~!GpAR7%RxKWk@ zcwOZ`u&FXwgR+DIpcKVywL%^Nc_gAAbc@K;w5)3(*0Fh&EboVgXd6 z;8)|>HRq<;+ICOQ&Bl0taJ41JDzg2^PC}QL8Y;6*640|oC;hkA5;35yNW+V!Tj;Qu zuA-7UqZ~k5Lw#=&r=59^(P65LIdp?kV!)+&{2n2u*%S>M-EE{&O314aH`rE#wi;gW zJzC4#Su}>=^nz+oU!jhK-xeRe7$G zr3P1c8`1TvcubfPp-G{5EXZ){uq#=irB_!iD9SEN^Pmh!ps*4rJ*I3R<7UF-iRA@U zfdpU3B)W<|j5pqJKKm_?@*h9+BC~Z~dioq0BLhsq`k?N1cpr?5BYF~gx8po0yFD&D z`q3y;qt8b;cB;mRxh5+gF52783W4!95x2NjHr5A#k~hzMwQ-= zj2=*s=LGjCgF{s!1cajr3B}e_Qr84YBN`ScyhsfUvP8qe`|>dor#P81*&)Gn6wB$; zr6g7*mccV@q0q2`0;j5nZ?>c=Tg`I;C&Hhqc<~_41t}+5yD>Lz&}xpoP6hdryd#s4 z^F#>EP2gEpNz|t!8NF*qa5XpGY>8Phjoc&zu~4)kHZ#&&J2JXR`=@E5%Oz3;?>$?h z%FrPC+ZfvzZp~oSN0h3yMkW_vXOt*qbW{s-i?QxS!|W|e;OulTavmb|)t*Eeqppm6 zXsYyO-Xgq*{p5yknFwA(&segVVA0z}v|^0tTAl4#Fz8BY&bU0lPN`>+g3B{ARAn;#MLx{L>Ljqxc9IG@#u_7jzSY9h@Wc) z?u1UNX26SU3v907+MRvnC$;9%KMRAShx>#7xv z;4Q9ri9{g?riJ2`pE=g*$Z9QTtKyahiMFr`m+YGLQj_IOiE_^{N*C^*pC_0tFr8A);M6ONc18&o!f2ZpguZPG zRFKhWvSUf}uOgvGG7Z0XABN-*0HiQvLdM|y{(a7Fo}rSQT}>Rz3||h&n8W)!7l!wN z25*2`YC1|9ZEDeSx9|nG9wlaz!cb57NMw~|cgE%cRU(V5+US^8#Kz9vk&hGjR#Ne^V zAK}`yg-2TtJby$0D!LL1BO4QTxD3z^(&DrDf#4KH`4;TsV+5R(fe3-!xLK63cyzqn zaakB@NtdZ$jcq65VDpxdiL4^{2o6X*A2-D*xE{A`)YD@t1jo+p=G?euJa*?H?%lgb zyZ$K0m+m2pFpd}Kun-8Fp;nO*lVQr`%#Z}phu}jQx>^CJjHVgpe!qMrbo- z0KLavX)$qXxxA0=Dt?rpVBicb6b;OB0Inmrm89ed=p&R1NQG)tCfs@qZI$Q}T2Bid z3A%<#AqG_#;xTH^hs4x%EI{`RjCgcnPRlpYRW`(>ZTC%*L!6r7*^@JsyFzxzF$ACK&0 zA9Q=ItlXTH(O|yn^rDlX5*|X`!?3?-`Wux>@5dMvpbo9EtBwEXZ+tg@^vwe*J9wTaaF8dj zXa^#aT2n!FN4I6mrUU9z&_oaGP%Ig+Y`{rIrAaCDzW+=z8{Hcxf~(jM?yAqdfcwV_slcD9NEh zl$y3Qo#5z6sylRE;+jjrOGiqh){+#4m|rtS2F1~%RMUcKbaDm7t3h*Yj&&M@(G_zR zmSqk~!AQeQiM=|;NI`y7M!uH5gla@Gn~N#YA*Lp^yDJZ|ltOolL}D%ZOG^H*4gU>e zP)E_6RVnBSpqE-UoTb*N8Lg*PMs@{Pja{wl;D*Y)bbjYoe*tfP^&Ou1r4RFEU+^ye zzu)$CXunU7WDGawc$hgJ4~!9~mugV|hX>ewad{paV3#b|Ovw-P!f_t4@Y|kY%Gv1& z-}F^qz}d;3!^I`XW02brMG>kNT5T*2hx->Cmzgp}-9CKfd1SipkqSo#NWu%N6qYfN zqUcod+Bhx|Fd8Z5Ea57!k_|0~<7q3YfWK;iBf&7w>Mp?B96qoPsi6B--r9PN3bcyV zV9pP5W=lN74KLvR6s6caLZRU` zCP4=wvjR0>nKZ(4iSDtKBrYRSW>c8z6nzt7Fm6wBwhf`rj+V;M8qZEO^uIX}*Lswj zQY)(uSV+$__h#@6#|RhMRR^~QFJEDw%_1rSkknAg8hH;{jRjLZYa?fK66z8_Yh1@# z-050}_A!DTow$^?(B5H#;pI(8Kf$DRWi26tb2 zi8s9JA>Q%UC-8pY-o*vV1l{@Q-AgVm?(uQ2dX%@m{z)#62QDlkx%a`#FW%*m>t}q@ z+h4=OH%_?w@_Ce6Q-LWrih+!r&{1n>&svOX-=FL-AK~2DJ12c0%N%yfD>XyHqN6V( zCzSLMmVbhos=M>I;5^Eb%1DyuNBs4AOzQ{X+?Ub&%`Mt)|rn->=-O< zQ^9L&PCMIka_c&eKXiw8+`h>>ZVz_7v6neFJDE|fot_LMs!?tsTP74@^9VrEKor)I zW~5A8Y@qXzo#$N22Rg<(o6%*Vn5A$w$%jVbBC&*H_ev&N`Fbf^$1!VcSk<)z&e_Vs zWE1bW4Ti=|uUaO>h=m!bDLMIKH~>;8~4%AVV^U#ILY1<4dOv!Ir?*7NG5SO#2<)B8!q5 znmX@-&IP6&ezFTQz|n%IR--GZ)1Gd^d@-X7xb9+Lh6bHMYRGoR0;>}Wx*A@_XEPg# z8G+Ye^Gk8eW@4+Xfh-$i1Z*S2DZZoCuvc0w$4zt#z$ES~#O%bPijU5i=fF2LSo>ov z)b-#pr%vI$SKXqsCCP4=QnLiGI3YR-vQ>-~G3ooi?1oP^Yvh zv{z}{5gnk&AiRd$LXRPy9ukB?(h@^g9B-7EMzbs+4fnw~_DF?WP#3~7I=!t7)Pm$X zR!f;;u|ZU`(?%>l7i@$lSJgrHPO*Jthf7D6f$bErf*)qsO)+BrWY1I&+&U{fdcCrD zrJh8|;+gV$x(A4BmV22&=?Eg}YF(VA2sO({tDp-`C;cN5&j8sB6nmC&g3#Eg5)Vp# zWNm$i?#y#@M;=gFg}hEfe96sK11Ga}DA}L^yHjOGxpS>@^P1E2$o}+{x!>gJOGCd3Tq1~9O7Q^8M_AJMGFU~y^d&;O zG^A!=fW(WgC@d_B)j`n-Pd5=4p`=Hq@;uX%v3!2Fm3;#4PYPBM2z(<*hdyOk^*uE=semLQ-> zfs6b67hnAz{_dasM*h%$@s+%I??sNsBQ`7l(|_|`E|(*p@!oIcv%ccL<0pUigZ!m$ z`#OBwM{VNOk3Ph=e#dw7Yk$ihzSW@fj{%Ir@WOv z{Pmy1H~tTQncwhD|1)3v$NmPt|F?ZMpZ)GPaB-Le!0(1EBOXWz;u@-0ZFs2+V48L@ zUO@!O5$>{&G+LsCM=44XvgRkUE@bNhZIgZovfQv}Zb-U`1{ES23YuD~P2!W55F;!F z5N+WvFJTC%E3wjrNdtscl%02`rrf!C%BMWBV;X@0F4{6fikvD~#2O23E&uX4huNHN znH9il#3v=njx}3~&T)LnW-qh8sAM3#%9LU)O`tojY?fiQ8Bx)ci=-%B@_iCJT5+}D zcTFtPseZ|)KDOhrTPL(??CBH<+npkk7@8%WBD+wkK$IJn*`FjAPi!FF;@?U*bcCNp zIBbaNTE&LxotNkaPc2{pkCI*xmg6xP>&gF%W(UYrp@kTlot{74V z+B)4jtJ8t0U{$gsT%k33Hmu6Y4t6z2sy+~{=-D+&3Y)#8a;4RrgiSys#Y0D#!fVO| zTIjHHWJqY^#iiM$shY)|32^e-TytG@Sfkt&%f9n} z{`;TiY&XHJJ)iro*Yo@S%>ThhkM}uy=o)|EFaKkPUGlC^cmrJv&%Jz~Kk^;_C$lN7 zOnl4#@=tm7Bad?D71#KZcfFPG`o5p#U;oH2vA_KYKllSb#sBu*Kg`#B-X~$lCGd*6 z`d4{$M(et8v!qMgn3z%%+s_2L2Uu?eco?<6Ftrx-eStF7z^oEy3cYvO?na!m1Ubt_ z83^Kj@OxHE;-C!#RukIV8dzg18=r~uBYv3Ud0lJx-Z;B;jqBHL^X6MOsK-l&?hqf; zabUyS8DJfwY<5BconFaQBt6Minn^JDS5RV&J{gc!P9AJs#5j|)-7RZIv&OU3-L2g| z5>$>OeZ3NbRt%mDdSA(!1P#Q>%ruPRJFp{fxOt0PH*T}Pd5WAm?37l6i`S2r0fd)A zX%(r3@F>@fbWG|*Ni4=j&vT$A~fsiiaxL zSS^_f+iFURkrY9y#Qo0Fv$RTA(022Tm^l#4@iC6!eWaGDuYQdD#&f=&iA2;L;I{CQ z=U?RBGYcR7*{AvL@Ba_H?c<(ezTa`5dD9!7V4QcxM_=T%ue`~AH*xv$UA#>!oN-z~ z`kpSe|>4^LsDz)T?h} z2ItStoZo+m*Sz8u+`rG=7tUcm@RlbZ=Go^iSoLA1jwHwaD@&8vR3L;4*klgpa(IrBd8eJhtPpW7Zgwma~ z=+&l-F=NYtBF6QzGb)8AZZ^K~jVGM#3wOJ4@WNn!6_k?57=xQ6v*-*=TgDT?b!*9Xz|t4!J&gCV-1e&2I(1ot!m~-sR+WY*rN!p4PH%c|MLidj2 zu{>5nE8t7V=7koC4CAm+29)kBmq)aNr*5_!=S_tYavcT2`PX$I6G+QBq8jcCxW<$o z6Vx@y-pR?zPT|_f(F|fi+IGB#<&9*wGuD%1CX_M-{Us0Z2z(MCesQEaeaxseq#C_+ zrt7z;OE>E78cV+j@v4VKN@*=7kO*kmArjpwEf16dI4*_#>BLvR=iNMfdY#8#amqJ* z#pm!}{h7ao9gqBlzw`b4wQu`+zU7gBz;aypgWvpH_|AX!!#w>fcX|D*pWxPw9bFWk zjW!9lZ|>pP`5(XYU-D6b>JzC=q$T)7@&j?C} zF<*84gsb4r5$}e`wHSy|qRd_WzT@WxLJs~Ux`M&1H~YXt_>hS(Ce%B50uAiFbUz6eUew2SvorwUh(4EES5C7Mo{ z!4l$j$KbeNgT(eiTP!1t1f}fI;>ZfH`DPRhOeh;>X0)5$5ze2E`SgFnxWedFTdlCSuZck^ZM`83>TzUK#ioWJn5e~4m7 zUiqrqeB~E>7XQn4{!{MVz0c=<*2nYIt6#}q`FsD8?u9S?HJ`|D{o+sMq|E%lk9~;$ z@jJhlZs**(d53TOl6UYkAAE@~e$OX!eK+yl-}|F{`*;5*PIpSb-+9FoH~E&|{`oxm z@J(KP{yF|Xf8+ak-!DJU*|atp0#_P&(u5Uss=^a*&=NB*rqpkwwo;X_g!t1Uu zOXE#%d4m7fZ+ttSd#7<;3hzIMSDrN<-N9ak8{X+ka9m`^*zI|7Iil8iNQC`Z*h)FK z#4G|cT1l;HGpnAj6(sNue|*2coFZJdPyy*!<8Q8MAA~$Qr&<;3r=L8Q+8GuODCYR#;_jU z##T5U=K$SHBn#|zVe5Ty#LXD3GM%0<<|B4_KyJL^csJQ$*hH&H*e7QJMO>m402zBCCFdeG^a@QD#feEs|NjdbsyFjM@5%>s7o69HQkb zQw(`!WE-ErB}|FaXvC?F$Fz}=-qwK)#Y6NVbIC|-6vw+t3vxS`HtrBQP# zw2zdaKyJv~>>{WK3tJ@122=11SPzzcumvQ1pJVAGAWF^w5WDhRiY%1O-~-_HQh1t$ zyGx9tx>J?b7n(U};RT$R56;CHJbMvSou4QR58tT#gP(kvKl#`H1BZJrNxojs=}Xzw>>hYet5>*N2}1RT*?3^VUIG`>d5Mx|zsrLxoFAkX ztX6D)hK>cXn6HR~&2tKk9iKbvq;VhdJABL(k4~aA&5rJpL`&I-o|!l8C5sa7~zRZUpoNGZwp)WI@`bbM* zNO*fBl_JkJ_m~N>bfcc`ky-*Ly`0h3Fre0nV=J`Nt6?PIH&ILQ_I5OKkc179k8zzO5 z=8VO-ND7CK*dE@OTo}>4BL^0!ND}`Y-=9QBV-EJQ*o-b$!HDI+P^di}ShF21PS~2* zz@;RGATlzuB~Hl^^oAHwKA2j`6(8n+W=p)65Ta^LFKt^ki{~m1V`f2k#bXcgfkP?T9LOl| ztoi;*n~ZMe$NtIFmw}`K9Eq7lRudVV0O?2BSDHE3)VSvp&m0dNyl~Tl!?P?0 zqzadE!qI0&sXTunyr^(z3~t}J!6Q#R!UsS4G}V-m1AEQmP!aSg(lapo& zRw7f>A~ALgkg73;OQI9z7PAY&jn)YUeQFO?8DmM0s32hu0{emydee3i8~Oe*TpTR@ z=O18uhrBJaQ5S(pffnQI`a(q*-f8>B>;_Y#XrmvFR5wc6zLZ)SsgLzEg~UcQpN6Jz zyN9H%g|(8@2zbMyo9?MpsFf(st8Dx_vm8#7gwr6Cu2i5f2A$ej&itG)H|joTCmhe= zXjHFw4f`GIF)zU?RJE`q8RE!sprc@FEXRR%W%NtRwP|Q0WE;GEt8E8n)g5Cc>1F8k;CAr+i)hr%X1CSp(ZQ`rMS_X@Z!=~fO~!6`blB-nHT8Xk_N7* zPbo%?%t}^5rGpbBSYLye1{X;ZkAQs!t3yyIbRW-a%u()bmdIDGtn0Y@A<-F%5$wi` z!_p7FaXv4oH7?D0s4X0ZG8X017GCIui%WRqR5^0sr=AmRfyb|%@ZpoQu<0?t!m`-2 z)Lnydh;NfN;T|4mB^*oCdcXlWP*jR+?R|)YS|qxj)|c2T9;4Q+OsGQ}#t_5XK1zRa zXj70a4>R-i7^v#Lq;8K0ZgntvtZhnIJ&B)0R(PBl+EYN4utRBS<}38YY0@d~=~mk4 zZd5FV)0yFlM#s_wwTsBGQp~VUk&5?J&>sG9UBNqUF%D3W!2UG+*`)@xXAHw6stC({ zBD)$5iXH}`-cArL^!pb<%r=mHqnm}lSPS=uakx(vbp|t2+cOSfu+?@`pk&<`7c)aH z!=ht2-Ddp8DP`A~&+qY`U-cF~z;ayH$7(j!b_dqyyx|gIzMr@a(OvZ zW#XlyaZ(EI6Tf&Fgvo2W!V8C);{^f$@><+`n}0&qo@SU%4D~hikg$rQ^)SD7129zSyC) z^KsV~-v4Z6r=6#s*zDZ&}gGw$NH4)94|#EqN#gennWy z5HNtbM;1+R_*^8)^`yo0?w~bFq2ah`;J?LLY8;x31@}hT?FpNefo29ZN(^@8;%>Nl z))3HF5r#?HJ*D}fc(U>x*NJXRfaV@0n1)s+Uf){KXGT^UlI{QGULs2fp*_2u`C3$y z#uI_fO`^24wK&dht49~r(orKEK|Ju?F(U4sozRCe&W{vx#4f^?`dFX}V_)g}21{pH z=x>+hz*Lo5o_YoHp=a?I?!oDvQ8P^!$1g4st6}|nj3K0xDC1&bh;uTX@>l-hzvh4Y zC*RAm#9~}K#cSFxQw>IN0`+VCF14%&_6B-JR*~%`(a3~ck(3RsoIfe?J#&Zr79!9J z-jA%pRU4^GOY4~^Vj{cps8(Q#fM_cYvD@Lr$sR1~6{d!DgRyMV89y!okgl6;3~E{z zuZtkCn0O!A$ToH*x9fxIMsF4RpzT7Z89c3YbWPjhX!(Xu(^zJ#DzcvtGnRw%=u@|t z>M1|*taAVU!Y{vg!nGTn=9QxvT?>Z=j&!`QL-9lJDIox#RX?0#W z3cFI61X`c5BYa?5a4C%R4?8ZMlhSy0HvY{=oV^@5x9EP|dGt}<_cK4wX(@PXEb|e` zAs#5n|B2;5A1OZ1p(l7wV$$gFd2aAryp}RGPvwK!>c$b1khY26Q^iD(WeEoPZk0qC zOQ}@Ruq7^qF`P0@Y~$gQTrBR`yo9Sl3Eg1~WR2MhW`U7P&4a-lX+$=UMbNeIW>X`a zNYq(p9C(og(qr5kLo<{1*l!wxSj?A=A80*Dtm{x#HzMPbxSr7mtp#2=+@kY-5$-U% zpn|d-4^)j=nWa`_x5KB9H+fg&#dCJ2mGbIWP%C@%)lYEm?mecqN2Rl*aeYz8j|PP> z{qnr%5$=P_RA|!;nmX6Zj-?;5q(z`@^RU4@Q_S#VbP>D-FewVn)5J@{iBnucF;@jG zmOj!UPS$>mT33_YWZ5n*H3Y~OUJ5pH;VCG}@M!m{6gF<+Fh-SNqz|L6cC$4yO*N2}2{iXRpw1RFOJMU zM8d3XXoOpr0yam<;>H2xiB~?(Q*U^Rr|(~K_ruP9cgp_s$PfK;#l|JKZWay~NBSt- zGU2oo&Sh{`3sr(WeM05QQm7KVrwG=LNI16o#@5P{Bc~=IF`q6d9}UqSp96wt%U1}qeJ_6qlWaP3&=1~1GD`+4G?9{Htbg<^xt za>?`e&bWN(9v2t)dCePM$NBkPo_*${G|5s8$Fy!(-8yHWlnHlB5pGx}n=9&qrtXln zVMAbxk$|jSPD#hohK(%!HJT_Uj(edlgh2kFv5tW75$am3j zXUL+al#01hWI-`(4C<~?S~&KKR)#j36^0GQWTD9MvzQ812TQGyY{ZEbSPCQo={4q#3=ZQCYYcJKh&wzPN;P5eslQ zrR~_^=n2fyXmyFm>#My#$<|l)}v!3cxPk2jNt%7aV{BU;@&*i zmotVOB4aBJbO9@{Zg%%K|<%T#{4d;fWQ-ZW>-%vhtH`EB6YO;g_s3BbOC;7qC@lSa32! z^|U({iJvDhEthmG&(5tF^lqF@g_jP6gI=Q2*wsDv4wvkT^T_obzw*N1<;#XCoG*?q zN^Kn-JI+ok$BVn%dCimDyMN^P(U&6s&RLQ};{er?c#egVL5nkv$H;6}&Y?Ykx7*Zz=s(DtYw3jaH$B=W=^Xq6)PZ1&jBwZ2+dUp zU%Lc{Ep)|F1oH)Q_>7rDt(2DcuSd2nB`lsD&@zSS+GFiYE6CXn-Jiy6#N)y;I%juo z<8Ivl$O}|;pvNe&agt zc>Q($;|D&B?@m}v(x?^d!TdD}hcSgca1%c9<6g^0KKc?b%m*e~0^H&7_@%%4?Y#Ep zj(_!2&+udK|0T{&3-~U$S8d>PMf(EHV0RV*a5{EWVv!K(8(e`Qb8?DtTf@hk0e)%Ep8*>$|e)5G_D= zigHo+eDLXe=yb~UvmH|(_|6!uurJ{NaHB2UyJs9NtYwaugRYI9+PJgb33uxSXOGGZk$pcK4si!EGGqPiq#;-4RhLb#>vSwzWO(O8o%*#-a)k^U-}vE=2Kt) zYA&An70xf_utMpb7wadxPOUH!Z>A5G;idV4`yYIc@!X53JLl)l#YaBMY!i1E?UqKe2Z41;K6AG7{ zofHlTzjPPQ4~`dO?*r+B`*WvF25rYjeah`J8!vIT_c^R2w%QzJ;Eguq55YeBe?;%)E{_UguU_hwQm7gu=Hoz#XC^txIVOPMx%28L_@!U? z5Pi;(K^I4MbT}>iuiyFI+`c*S!RIdchkyV3c-?>f6};!uUe70f{8Rk%ANpDT*$@3F zZ+iU`{LU}gT2|xWaAL5JN{dT_hhkl-C?j0!I=$8wh{-)b} z`LFvtj*Ii>zw7(>&@< z{189+i%;Wqht|UTKlBm4?SK9|eACx{Hg9?TEBMF%_WgXur@opm{fuA7#nJipfBJv% z>EM>u)-QNH;-Z{htPd6|cJ%a-%StbYZ-EdWx4BB zz}eh9GGoj>L(o{V^O#F_xjA!v#>usWgO4>mGjCY*DI|Q?k>hN z=PfcgpUBzH~$_%N`=b z!0D_Zvk0Ie<{@-c!!^-rrubGUPu=G9)=eJ1eoDD^#=pXqaWl?ee+jxb25(ZR6XT#>3rM&?;r8|-uwC7+$-mYnODE! z3I5R6|9bx3_xuNb-pyQehEMPb06fXS6$~@zUK4!JKz6fyzlAf z_~YO39_pdWE-8Xx@dUB2u4 zeu_WwJAMO?J$#F=__TNOp%?ElRp8J4BKm7CDzJ7+%C~b#bEch{J+IbQu_xo&# z3sNV%7RI#`e80m=_I33b7-PpB#9u9V3sQdx#kOnC9K z^U|>}59i*+Iroo88WYZrxzAw27>-rt^xAc9-oC>qEyd*vK8~^Z_EXHk+ZSZoQ})-8 zI>GJ?zjhs;8qy-W=;FxfK7e`ga0b2K;W%Tfv%nHuJF25<_{k1$jjmu*`lrtwJNDps zo$j&Lg1fg2Mn6(1=@=mqRnmdf`aqUr42w+xvavA691zNIY(&ZJ!;;q)!&0R-L~CGe zMWB0_Lnhx$r+v&bU`BE#Loq`%oJ*oW%r2e^?v+wb!g+TdK|h*G`uq!eZ3nkbkuIQy z)u1qOKC?eLr8^7-r?AdpML)@bACL6DobD3ot&{$MUI1UxnsU2*x|_VN}m^g;D>*T zAN+~;@$>J0o=v-)eZt%)SZu08K&UpT%ncH_B!j9oAx<5VP`+o96{LBCFll;+d z{1Tpi@h-pi&5!eAKlfq&^}qfp{>I<`7ZeH~_rw$Y;x9kLKmYeX#`E_sc?Y^wXFtmS<1c;}U-7Nq&R2cb+j!4AUdvCu?`i(c zzxoNjc{!O`(EI0fA4?dZBISUFFySe|MZ{#NB-IO{5$^HfBY$4d;2lo zdiypvPA1;=nuqx5=gxWjv4{A@=bqzV{NRuABfoHufBbKLn&0#}pGdWZ<9x~emk)>? zQ#>81_eg4k*t>`qSuS?LQWwQ~LBlyT_X zy>}7WSW$FWczHHnJnVRJKIMg3!7EEIT+GJQCaNok%b4a}3Sm+x>x@UIXgH3p0`BBy zWTxS3iaXzehu8SCfZqoW_Y3Y=n9in++4o=}%G_aj;Oyj)$9ssC zH0>Gp=eV=X)0+!^@8viA>8n?;W?sKN@ehChclr4*-jR|ZvT_w0&#un-cmL1-fJrmI z^K0Md@BP!C@)v&coWJ!q{xbi@zy9AuwetJlyy5ZF9p}3n;wn6Sw&TzL-~$MetMiHT zvmL|a$bQ})lFZ{rH~jTK_W^(Pw|@A=pN*6;A&{crqN`I~>`*ZJ9-d;Z|d7fh4q7jG7R`OUZd;V-}8 z=JK34jeP!Sq}PT2{P+Kq|JJ|y+kEfQ4gc-m`j}M2{rne@)Q6xQ0gUzD$I zD_`GL?pJ{UmY}>_JICsIsmfPtVHS@U$KpIo>zg(awh{Kdp5@*Tw7jomQ@?Hgz61Jg zLiNAEYX45aci4laFsm}-@f}tN-xPSM!m)ea&7CI7;5!ei^38qY>)XQpsw``x*1o+Y zJ54%4ggDp;8pcEz6GXSI-tBf7#{p|=4-ETh+ZHM=4}S(;jE<-ssfFrr_q$Vi{wZS7C*ZzS8;Yz!}B^xGIL7^cOFS6r~p$oH&v^E_?UT+UgGP4x6_ z;SgZELD~nZacjBq?~S>JZSHDXpNP>WbPH^UU?V=>eqQyuNfE)uPwCs9#3Q}iLP!O{ zqB>GKRxNLic9N&HMn|bRB3C=~Zo%KLtUE{F4anUCSpzxB8OF8|u^{D_;YGyaGF>;DVQ@A=>SKmIYL zHr}qn|LEWQJN(vfe4j5qd&a-{@BTeb^E>{h|H1#AHAMdMZ~vHo^5qL85Bwkh!5?vZ z>U?>3kEDTL{o*tJXaD=Z%l_t!$Co?s-B{PHnpeqNLx?%v6<<4Pd%*BerhpES9vnTG zS0}0`=S$4xOE|5+w3MbB5E@9j3=Po7%ZQQ5_5(}=Xj@t<3ish(h!il12Q_E{ODtXHp>qW1D}5W zgx~n{-{U8rUO{i%9t*OX$BP&kr@+ls#{I2->)+5RP4OADY;?T8nem!w$jlM3>VK2ZvIL`%J3B z@nJRpi}#G);iR*a%CNh@jR}dJ`P~tUxpBv{iR9r_41IwQgM^4L1d~%6LDR(Dy zF54yrrqLr+SRYmh9mbJ-zN3g|JRKo8mbF1G#H+7%7-63=jLp051)&KWG{mh8bfMy z7wOJ3Vq;>}##weIg-B%@181Z1^lac_uQUcej+JMw)1v3pD^Go5PiJt@#SuMbaCH%{ z#tX-R7d3wvbu-Cs4ZzNFhhgJjAvPLzXD`Akof*%o-q@!^Xz;ZR{GwF`X}p~qZ|?$k z71p)VwhZE_I1)-x$J&J$tb1~mk+oatLzQM*s@i#bIPm4y-{O4W&6``+!%R$$kTNBB z>Rf2mh_qeBz-7 zl;|$t#o@M1uudbfZA9U1(SUO{PA-ZT`L07SsL)&6Hn(O1)>?5@H}kYN+r(zS(5U!$ z217(n2i&wL44HcWj+;*(^T8({^7^X)XF!<0TfX`EFY!Kb_TeLbI>>(}qN7y>`~{ui9;A5dJ`4f6MQVu81-?MO>FkW6jQ<|=n zQ`^P~&&4oVi-#9R5B_4LDoie*XXh535T&3@XPM^AalhM7_FQ1IzdFzUVx-oBt_?4a z^Zf{e=>p=Fs)1n)5Hij=xG1z?$ln`Wh+jN>ZmEQI**q~>D}n`vXL3OTFz}iNtiG%D&MtrZ&?x=)^L)xfV0DGZfHeagP>FwSk$6vCmgF9 zTT3PJwJf|wh}E&gfs=wyN)+L!pdpe13?j@`>FN<2$HhLYRV~fnM64R#EA#0{2#)>5 zp4OF{$Je~`j``uhFq-A0ZUqg=2i9YyA7%r``OW#AY{f6md}>m~M!bIksiPEJ>gK}> z;MK^qJ=$iGvTogm0Zju=Y~+`)J@jRU7zn}BoDdZ2vg~5?-|h`mki%vpc+c(=!1sZnA4Q7KaEfZ2ll; z=#CiZ-3*?1NB2gOl#R3PxA3%?-`>}#vk6Zo(#8;|TeRlSR^3)lFYj|W&ipZ5twGyu zKd0(@zSib}aVzMK|M`FT_xZ)QLe}tS1(k|@5xp`@BWIU;cKeb2euqzCYu|OOwUT_q zC&jq}z}h+~j0CR?(bF8H=viAw2n+!{6~Qw%g%xflVGu{~i8rz!-Fg{^Ahg;TTq3!? z_2YHCk8I4D4e?v8#KAe52d9C6-+CyW!T+2mY`&)l5srCet;(W}xi1748M>n-<>A=q zHG>?8>WLw75>J;#NFJx2ghxt8VrG`M`5G%eT7I%d8{LaFkT-jAu$f9N=V^tzMji>U z%SI6GjnIrp(wl{%-A2wZr<@HV-+p_KoK`L_5-@U@BWW1;;=>!h zebtE4dHMPs@teCNpPmo=%10ma?cptB4xFE#GY!Ht4E*zlw{!v*G0>yq*M9Vr7k4vv z$CdTr!2k6>{>S|Nvp*ze&(p^jIN$i{r>|M>7Th?JE_U>Xd;Hq1d3HMmEL*wxImB<= zArll)kl@h4P^msx+p()1?;_&Gs*X~CIN+D)?lX%yAeB!xoh3oFVvW*$9zLYY@unF-OuQaAsQN1P)$ zr6;4t_8|D~Y=IKvW*e|hfZzj81@RDaK<^LM=O;?^j_x~71XmrsTSK;r$0ch)PATJC zqvOnaP#swuxNZlaw=j0VnSDUiEE8g%t@cjxhSZU;#s8}@MZ2iA<0MBYRzpYhG_{|Z z-9&Q^-@38g7a@zI2fxV^_7V%;nKl*z;zW3vgpavd> zBg3jZ%y*n-qv<|0ao|)sck78dANax35BTcaH~jMU zp4eOA+gl+|58Sr}?>ryh?73S{JRE1z;P`ZR&Z#I@dC#XeBcEPX&dw+P-@pG;{`jB0 zfb)sC8+dbC`25*5AAIjAKl{_Sym)=bCm&pLzX*q4JP^l?P}z)|^c}%r^Bo~u;M9lj ziUQt~8=Z4TRPdJgm#w|UhXeRXFO{er#n3Sp`%p9+DrZX**j2n)|6KD9M?-^|Gwng@ z;JhJ7n!uQ8(frw38ot=YUwhj)SZdxF=j;pAD-shNtNlBAPm~pH9UWRJ`Lw zH*Io=j^<4Z2{=R7he*@P1CfGoQsKRY)cHWIYIY_Oq$Z*ScC4&Dax5!LO^6pVAR1{h zQ;OqQm7E5m6RKchd@CpoFP%JOi(P3ZPmYSP+*PLR(Hf`^GrM6#&IhD6^EtIfaY~94 z#dl&5^gN?$N6L1S_a3U*BD(jm9B^*)(v=hH%&o4qZe6k7xSP&fYqa;ojNL|^Hxx|Y zngG0RR1*7H)Oj>|vj>Qnm&?m{I3v8``bKk5(AW%8fJN%GRJ$3wV9n32eP;$%D&0AJ zZ5ymW(O$5>#5R)J!FzkgIt~qu*dwJ07vJA={qzxEKHT%{S3l>AA3bHgTlwiXZ)j3E zo{rSx%=droL;lKd{VMl|BNt=l?cIrau6+LZf>SNr9V+`X&j-6bhnIzShZAe@eDm%e z)kZ`e)hTc1Behqux0S9J<#alN1oopc>?Zaa2`W6gzT|g4ga7YO15bba5vRKY<1jGo zN8T(a_Q${vKD&Y_JXZML4?f|a_+PMmy%N2n#rI_nTNcf4+mf)gXz0e!-XME|GyH{f zxYoegy1MmdWCaaG9KIWr-vtBUsfhVaqTOslN?Wrrs46K2y31y~3mdXGd1HTz63;W5 zBT+jnEAC=KPphr1C2bvZyf=TF*Tn~9D`oYvLHoB+)+H-4l~x&iK)Q`d49RYq#}yat z&8q(W2F)?#L`t6Il{5y@G!jxKi9+)x3zN_G61hj=a>dQ z@`-b2#@E&zM<02>+Ea#*n4II(grzsuu2gZ1!uIChnvoQj9B!ZKWibh4E7@p=6Cq{0Db=kV z*>4R4(rLXBg6UlNK&!@MuOblNb6+>2t3pi9bkyJtM(HD3R_hf_#$VS~h#EHroziQ? zdEKzhZfor})Q*oGah=FW(@y%~B|rYj=RCZax%%Le&%XDVZ+>w{4V8F4lA7Rll_wwH zkoSqd`R4}ypMNs29!@;JIHz>wxUTl!Q)54#Lk_gkSZkrQ6BWg|KpawH+-EAC;3FwS z?j8<2IzL0aXX>7-WGmq1q44--$K%xa)7Ob77ti_r6Xo6MnpHa~DR18uetvt)%XWt= zo}a(D<@;Rnqc1+?cl$S-Uf(k0NUz4_aef<3RPAH{eBT5@Y53p?F;Yt*Zkahj=u)i$ zT(BFIY*-Yvt(1!%#BX*2yQOuujg_~J6^b!{F!5d9M=pY*Nom^fbGM-M+Cl6e{HLQjY4C8j}$}Dx(>Ci4ADB=M7m)2TzKY+amd`xh2p<$zH$(rYO`EUeAu|JkfbP%DGb{7`!fs zW9=|_t2^^V?kV&bd0mA^z>{E3{x8?YYw?CW_x2*M1YU^H`^-nf{I_ba$o7<1xe++u2Xgcwj7>JqJVVsH%JVkTJ} z(bk&mQ?M7YH(%5^3`9If5%!mR?q46MYb83Yd(%Vk#?SJ@Xok|YS=+jIXpn8x#dNz( zZp6!G=?LE)j(Dqss{$@XTC>rU#hm!QJL)>qqBHx-#)oqofm59`OG|gKX;O|Y>a=n5 zy>0<)AL&am`mghwrl_##iCP=3Z$rI8FO}pSt_fYNjmUdD_{D8oOI3Ud1l{Zn!Ljzn z{=;j2@}tjKUmp3zt2gxM`QtzSlH)=7_>&txz8TT$bAoeRU1T1X$j@FWALPp0^N|;? z4xF8hq%lEGcGo&;cDvCQ{~}wVj2?PySUV_=d42|9! z`9SOe4rxG3vwwzHgX?YlX-+de+lUv7F@ahzHji{6Xr?1Hr-U(Y%K+s)&96H6U7U zk)Xi@>X5f7Ly&AZ;9MF~J2Gba+DIK-9t_8#-E=v>9hfO1-cgGZ^MKaAb%ZwK#k*~p z6vLKrG*6yymh0@^-mR__(11%I($Hq$Seep;nr9UY{Dzi2S8r`I!II!Sd>!?iXkd6`Q$(D!q1s zvu&S`5#Mc|4lW>K?r%XYrqFHdlMqlJ=mCg{P?|mb-dTPP3^Cg~;;c2sd@T*v95M`O zjMh)67T6c~j%uo1Xj%zDQFX*=Z_eq%J+7LA*!e9wAp*|h$7$PQ+Akh8Jt?)m^)@)1 zxNTH(^pNc3)>aedr$j`V#z;=qjW_Kk^04P3XL1n4HL3>2oalX_Xve9i>bBC)_Gd-4 zZI&xmYO%J)o04!SQ*w+cqpje(GUd#%d3-EH7jey@A+oectDVaf&|W!;=O~71zC^iD zn0qG#$JcdZ+WSsZB}?X{kvpd(O$@yd3B(Q$+K7Il^v)tml?Yl{`^Xp@rPQq*6*@FUqbF!ItHOSu93Kc_yTv%`IrOz4QzBnn(ON~9)8@Og z??_J$=ac#J954hV18Kn5fIA$mz*ihTMd(5dKuQ+d3c+*<5t1r(+Su&sZK7zF2PAmB zTELpMlVUKdf+{X$wA!W@tUQ$%to6xxizTJV{-YcI(rOtmJ@bPn6F<8qNgHOvI4F0YP=5st~p^ z4xA<4V+!`O`9O}D^Ye*mh_+#jMoJZ*h|Ymj#$*`Y!(wG15P`8HL=LA$9y(els;>5eO9Qi1&Qd3ctUCmRuu zT2Yi8Tg^Ml?OMnoQ+wm>snObiwi8VRWI)2oX$2n=ECuO}r3oQ;YVG6{?RP3d%I4T! zS|bIA^Mf^P15@f|M3IJiPxXVjMEo{7@AmYNsQqYYY~KjcN@k@gLI<%eVeAn{w^)mh zxRf@*x|?ZJzw#~Pl#HYkBk8gN-{+R2*ahNh8!Qt>=o*=JG0Ul=0yW`5*gk4geoMlFY z4=?xB3g?f`c>V25&dY>vrYUV%S)wy>n%0qC(Dx%>-73g7oyfnxj>l+gWvom>)EVzw zEH~w%#SCQgMTOvLSdoFoXpplQaXH&Kr$TGpAa5~H*2V5 zOeeCInY7h{h3LsS+W+6`2E_9=E(513grMxQXT(@dI71STQ$o5>=f*DE(#5AloZ#K* zgshG>CHhv@e4YYQD}(n;DY6upqRh5w(zHX|3TuTFHs+NQlSk|J^KDs4t!Cua zlx^d;wK=I%e0(pnytgVCW?99yi2%|H&N-uv_-2lN1=nmMSVvIbxVgR|?na)RW&CPk z?>Bcd4`pS@f$7-}9Xh@XyCD*^^6dI4H(}&@6dv}OU*5mw=KK*#U|wco2&6bMFBO_; zth-^LIL8oRKMlme3x3R$)@e)O)PyL;^#w&V^!tNyLUX*IWO)W@UEf~SX$%a@{DCYp;Ec6p7m~F+D|;b+Vh*AeZ()%N51;{$kNqZ;fE7x z6Bo_r0V>sqrcKUiiS~phDVAp2E7(%Kh zggQUaR0$m@ogoZ#XCsOg4Me*-*NVgAyW*Bg%^r3Gt_f)o`?wVZZg{|9F+u3GR zLPSy|J)G!6__JJ?y6r^*DGv;zkt5foTIkt16Z^f5$=*f8DWya20p|tpm8iD7SVim_ z@2%A(Y*01po-@~YU5)hZyrU3!b*tpZ!u<)t%ofGz9DHQ-Hl}uIAj0Bcs0wai@h6V! zR%QU)RmUzna2a}IRp=VfDx@@UT06I^Za+)l#anyXoDah7J5P@uZH@=&l%}}qkX|>Y zpk?`buopkw-o2z~x1V6&jk$WX2eZY%7Q?e{JaGYamAaLkPSeCNPRw(m>uNoEAwW}n zt+=_+cRPHyx->C8n~)Q37?8I4+FG{)(%|XiV2#YRF`POrMVwb^DFh#2u+N5Wx3>|yj`Pg0cjyo}8%K8Io^?H- z;t8Sh9MN^|9~w(-G$$NayOl?$4C7!2 z^IA5SYBG_wY2{c7yQGXcqs{yrv3XJqT%1q*;`olAzE=M0KYGTyf%n7kthXbxy{_GQLa+DfNI zqZ>ppp@!JlKet0|d+eAq7j&Db6)|iqux1bVG3FehF4wN3~Ve1z(7Zcq< zik91R14!9S$fI=^(wgb69b8-JTJdfNMBH&E)JjX~yN=2<4rp_B%hHOrijRpZ7B)`a z(`!YS8Im1#vNb4$luRyA(CAUmn;E z10OsZXjN(5Gf?>LFCO!s{FATv#Lrw`UUOIubSXA!yTmvI*4jAMN|iuy)?7WWjUFPg zZzD@efpu9(4pMZaoGEod8e{@z5w0)JsB{h`^W&S5+f(5e_eVUQPaf@fba}zscQ5$S zlS@8)bU{Y=%@051AANJr?dg|9S@`tvW4?Yk^6l%HX^2GK*4`gJX7AzUn_G?#jflqu zG4(qH>*}iwf(fv^H#C}qiS9f^whlNO1=YFjOR+hMyO?_(&?fW{h<-wxr&VjBan)+r z2>}&ig$^+#S{L5Fy(jq5#&2)b z$cECz9sr!9)k1WTV&e3$&~hduq2f4J0oPbo$34o`ZeSGQp#>mNPmR#JEpyBJZLa73 z)TpacLq?tBDjH_zc3pW`VQC6@sybq_Od*HP5GM}3+KBJs7L?w`@vT*-;wW=N<_azn zgZ*CIrup<{pG63PDu5H>wuNol@XlQ2(R-o~NPAesNHbXbWA_k_s>`3mTO1`=L=%gjx-q~t0MKA*>CTMtqA14Sf>% z{G;bQy1wAcKYc+MB5z;bGp{Spp6&SP*(G-mFNkU2*MIOCzx~N$-n^Yz&QDDJ1BNa< zy}shzt9!n@z2}WK+T*~leDs(%>&h-SK74%6?Oa$_WiAU{P1dLwy4*Wuh>0Rr+!5zu z<4#=`y!Y&oaOu zd3G`IG<42}9e@6#M}#!+$@LlU)|H2~b9=1#(KiqOy`&2aV`p z?ha`y-dojFX^oT;IcIVR&%@lfEl?#8gYsZrT&83JWET>*r%LhN7AHhXU5QSq)&6}%%~y7s z7krGw7+6+wYv&l5HxFFwMsg^nl42mFjN4ZC$%psT66$Q(&|beIh$6KSq=AblN-6@S zq9K`yRA5~eq9`E`c9F;1$SPLkVAXZbvWhCCaYBmXSnzJfg+vM&A2ajagQYiu(oZuU zB|3*siM2PY4RdxQ_Sk{kYA2{QBx$plk_*XjMwnTY7_EX$#G0;@jrV2S$)4U~Hw8f7b1?8_U5e8$uu4{$N=Im|2XR^fxID|T|^ z=K7k)yTmuQ2YzxL`Pr+$kM@xtU1o;Qujr-nydoDr#zf!$7&8zCD`lW!1%2{A5QEvov@y;joRCTl92fGov~&AYH|R z&E0uwDV&|{nGX*JCF^QbNM{Dn-j&`88n=wqS_xf{;&DR)6?``aRw)JVt(-?s3vNh; znJ%_9)Rb|};kUFzm&X2V$9@<|Az0O!gE1Q25fQxa#MljwtQI1V-fn$PAvvRCiV7(k zDyKCe21o05GJ9{#@Y8Z)Op%l#D~>5CXEX#Gv%E_rgyuZWW$sHS#m3}d_MVQXi8X1b zZ2q*lcf;at*}TyS#}0R^P_~3YD2=|c#D^^GqHt743&E%f-TXaMPV~BvQleFR_)1ek z+HMRud>n{aX45!Rk=B(iCOXH>1uiO<{R@#=s`>PCVmx<@S9@OF-4dh6X|i6}A)t%Z zY-x5j?$7oD_2xFV?Wc62_g2qdiuGJ3hXkt!Yt_&$-gPE6QKWl)h#93!qFO4S`ds4`}yuD@E1-cX- zBr(o~V{Nno$t&I~FAt4hzjpk~k9U0ia6z7S9A`&Lfln?Ys}x?nF8u7vSA6*46Vxxb z;eugsjTL@OXqUWJ|KeGiA?|;Pq-^ zeibo;qk}Y4X5ySzVV@$mbas9p!W+ zkEUtX!wDB`k<^2;+fwhgC9ak30wHF!*DXZv=q}=>j60t2Md-R!eQo`O9$T(h6B0=B z`1_SI2J-V8o?KnAPzdgV-9B(JX8!o6FS$P7^TE}gAw5} zkKMdst8!X|pY|Ewgt=6LS9W>g-D&0NqYIvd3%<5SFOeIjAXBEW{(N^!JbnXr-FK!0AZ-a4|Z_?*xo zpi{y-N9?A5p`G3q0)kf|jsx|5l~wIF0zbMy{DJ^2xQ#+-xh}@Ym@~B$*pK*_&=hS8 zm8|^KNhb$$@T=H3=Yi05tGcpg-eH=ktr1Y3J-T6v=6O=Am{QbM*aBz>6j5pi2?>I2 zi(E`}wZ%j9Vj{CBs#bw+dd4(?++7CbCtJjr3{pKw}E7`4l`e@Jf z#hzup;On<1o;)78x_rV<-@c~Ff{TuxJl%KJ));-TqLb4DQ}*nJOu|@pXS+;bWEeBv zca~#iJ#?f8iUxl1_Ky3*N~_j1pJTvBr{oCZ5J_?1EbVNw(v(~2G!>ed%R8ztB~L4b z)&%u|hvN(`Fvi5=-Hz)RxtRub-kFFuO-KlQJSsnUdWMbzFOMgJIIhz`4uPlF=Twxp zZy#8f%Eyl$ai+q*^8F9_U_WrHM_wFW@+f+)udlfJ=$S=Vk}<|bojKjNYowj*CU$!7 zNTpM2!8sVF$$A5~enlS!(1atS?S18zy%>UbmNKuN$4{>DbX*m3h`6Tat6Elz+vLH7 z@ML629~@0L(`hTz(`@VI6fCB*g-KmEeNKS5+cEBU3@LJXw)<|p>%F7S8f;v!s8JEi z+&KjA10h9Xu(8Bh(ukB2-6!rA<=6v_gb%`Q%tUWIFP8!<8@z4sI9JJ=o;PptrTvr* zb)$CDRXWuxCqN{aQ12Z}Q&w@*F4Qip4VG%efviebnDJB}D5?}Jv>U{;o9u;tS{pe9 z%+}io$$WJS;BvIml9ZV8CSAD5u?OCrgd&j?BOzF2m|>qCVI1&cpW9kHwOe!rZ%{fj zaP}=x;kmfnGfZdX{X{-LvzK4*TMfLLk1lv5m|djK3)GEeg&jzZZh2N0EXET&wHACY zw7xKo0htfP1dkryP-^3N|6p>)W(>8Im3@cYmhI~vdiLlL8Fy#4KxlV;5NEohNSLH^TCXxq6*cM5<~>oD=|cZk1Wk@eQW8o z3Q;S&~=iVBWzZL-kLQxZ^$DT18fH6=+yFh4s>gYc203L zScLZIoLGcjyZQZcq;^MNDp!xMXeZ&@S1*a%ZKx+KD_GVIiDW-(>lHUdh9T4E!usyk zq={h2V#%4*EaD^1;l(4HC$3h@R)VKJxgZ`3FW)_&r^s*q`e%&0j&~E3N(hNphc^r% zGoJ7Hh^Ul{_ALx3{r@M)C1EU-G<(oo`0RoKY15O5-GsEyQ zA2^hi-j!*Hw>7TrogO_lIQs}aS%s+_m-u5)_Gy@%6W=-KZ5J*9i&|%DO`ktubvlcstvVA-410ZWLL`X>X;kSl(0kMcsN}gdF zi6P^i;$5_jsDcw?!1vhjUI9mNj^S*_x|*XnBqfiDPy$XnQ-Bsc!3ig^&7t;yD7+iZs2BAXqhiQc+878M>q=m>5Q*lzvKMLITurApDLeR zO;p!dj)h|yK?DAHM4RyDbj0DwQMtOhFfa})muDlx zZqMCACw5th@sc5Au181rh10ws61hKC^5_sB`F81)*C#H5;z;cCMC-P{@WB&vqW8*K z@?0dLOQA^Sm@@B5XA#fSvw_{{IWC2$fjW2Ya$=t=t#zKCCp>WMf#Xs*98Nrce8ZtG zeD(4L|Jn~fVRv@Ue{}jI>f(u~g62$6bFnj-mSZgMVD(xlpmB>Vgg|eVq);Aa+-|g- z71dJg`rZw0>~SfD*aI>qda1m7`HJhOkBQM!x-|ud=qSyKE-eLb&DgxS0BMGMgeZ~UaqwxKGUw5v=*AUNBSrp@^ugSV}a zD$*5ED;m9wj_j2oIYvB(wbQn-Xz)U+hEz$(8igN9v?LI^bw>!nCpyvSp6cl+t3pHZ zK@bM>r$uwqFCvIWA_F}Hi%g+-=_nDB86WRYFy_wr_V7tvQSVs=>ISyE8WTPT=4v7H zxtb>BM9AI~lWBF?**4A!65ekr!FkITHnj)XqM5`23eEJ{d$xQ#=%U%kZbC)*l}9lkM5xM1Pt z&>LMU1!p1TwNUOKNX{YB2wLc^;rF|3J6VlV>))f6!7bgkh8ob*fsi9{m-uUc@pJyl zXV3Y^zyB@sP?-D~zq~&(oh7bzJ0{;@%q%#XK$(@kc7jHh5}2mU^G9dgH;9YiVxqK# z7~pJ7XcbPiGK~Wd#}j!sK!=ME@Ll-BH}ANu%Kg$g;aSD8&W$l9GAkEDB21YvCYm<1 z-{DWa^5u)y{NmMHs+x&(I^Qw(mC_6QoSA|UU1t?IF|gEyL+LDQH9mEB5X|X5+P;+F zBB#=+9iHsrdhGn<>5fNU@L}NM>Wq+;xplrgWj?vcJi53dPb2roJK_-d_=6jESt+gY zZ54k0@{W(Ekzf7(2Ym3^Q_7%}Zp|T*4F1=()0{;-&@F!AEphI>$7{!RHIZ~)2;zui z#)-v!tTESEU3oCHhd7I0#FV*vcZc-GG-k>&D9J1QYQ^ssLMjW|22J^(=uxk0P4aNbX=Kjk-n^@lv4_Wbmlx4f*v zT2}U>vSFX;<_U{N2?2mR(W&s+>D-^o#S2|*(nD%Fm^>{;K{`eF*u%`?|Jp`z)x;2Aqt~U z{PKR`CzqG}=<nr z0B_orbj(p7z%{!~xfBQlj;DLhgRq|xOBa0bNL?+P*u(a~Y`T?fBS735fZ0S_FqCr) zKu3#VdD9q;V5yEVCp*Q>_DX9NA04eblw|xOaqOpz+OuKEKWAeOYNxr1FeJy2JZqCp zZW1nr#BPG61&$Tskf_dHoUJanVPY5}hqd9HCk`MCti6*HWFJ_%Wzb5iwyKYj=uH+|Hn51GT#SjEvaFxs_#R5!8#M(Io;m`goCb`z}k)Vh-L9-S3eIz2eZ1OB_< zvmJzPh=$5;-QrbgFyEKh!PvEv)CBWZm0^EI?S=c}J#h@E7*J1f)L<>xDxKinW~$zy z?cV6Nht+HueS=kc(A5#+MD;=q=0^@mHo8K|%J#01ad1s~qr@WZDU#0U>d;iJnv zzy4{WuIIcx9{9ntYj)9YW9wcvO+Gy+D zWnJ(wFrJ+eF$PnPjueF|EfB zXE*%#@i~Hxp3O&I-M_{8$m#9@=@nl$%!ip$EGS$T)MwkIwMK9Qz1Zzx8WP0`Qy4j& zR@T}G-n5PwGzOs95sgc6*x zNaemXF3&H_zf>E+1y(Oag{by($Dq_|oO9=t!8xS&ZEfuthK1Om^hCt)yvYek-}f|E zR5M+zJYf{2dCTo3v6htDB5V}Tm?9n}b*04!-iVoL^ys=GZ1BURtlg25ReM$Okc~Os zdnW~}&^jy?NT%(eR(#+yif~%1;aQxOepY8U_<@GE5*t=E|Je3Nn&%7izE$y@$wEkp zRU*#GR!-t6bi>!UN{Ysna@`09t#_pArZEN1FU~oZh0?)C^Z03Lw$MnP?i|E~YBwyA z_qb`Y^n`TdV2KbzHUp>+q`|13_ir8u={+$ND}XJHIAnV3j6-19nZ_4$;CL9(xex;M zS}-8EbsV_C-d{l~UWHm4J*@aKbMfek*p$mBSNOWJ3yvQ?-*cHGfBf~gEYc}u<}ZHs z7#)nD@$R@VuL~bOzQhN(UuGV~K+TC~d&iqo=hTb=AH%?#*^}4Kw?~+@P`$7&&<`Ci zLg@<++rpx>%6^FKl85GyzLN2bq1#q8f=g-pom-~3%qNyAwCEWfMCSx;o!*4*tO6=- zBTve9`kzW+Zua1>ODApZw4#Y!hW%hO<}AXgXJQQOvbnok?*yl$YC-1n@qI;>Fc-%h zh4U%m5*$vE`$OTd9Fde*yl~|VDtD@Iy9$RUNQ!)WJeZ(emD75n`^a7c`zcb>6<^;! zK+g2zg3HlF)oMXjryJGNDb0!bSBf>YxDZ*iFpQb#3LUob2ZIT2s2Zn%<+PZAHD)W( z2$pt_(MC&;;bMF;$^*{Mbv6vMb&7VofvLl-rhgnB?zq0bz)dztu7K`+5n9m5znz;k!%M}I$|}C_~b!5?-nKbL{Mv6 zo;9wHc}>4V-GHb-|}jijFBy)I}+)V_lS43a9nRxO1FJ1W7p8tOry( z>r!aVM*Aie@rmX=vDLDD@i$XqZ>VgpSaswuu-3ML_nZ9^%1TzN+;Y`0vJ$KVEhI+_ z!n&Sl5@-r@Um4w=VGx>Z5f0$Z+Uc%wb3V|u&|0HJ<>Gwek;^>V4_u9b7$WODlRbQN zu_wCBquoH4!ViAs8GrcV9sl&j19#PP|N6l5r;mAh1sCJUu{OSbcL&WFTiQC_n@CP@ z_`2ffLTQzFeP!Do^(?bRY20_ry^d~;%Ab^HsWAa>$nZ>7a<@PYYCANNOXc)WtI2ajjUEu3WU^c z%@1TcNTAe49zDUiEhr2gi?P^?Md)g1>$aNaCD^9$q0OZ1+3ga?wX&+PPnjYOq???v zeRun2%57rg(a<_w?VuIa?FE$#IV?&Z5=|Q3S*3hi3$+Vf1VISnNV`35pPPBFtQyT* z*@M{lY5zv18yZj&gYGGaGap!yM#K?AV5yC?jdp!=&`0M0bLF45(05QrDvkQ)79Rp` zzeAD(X;wP1c02=q%19JG`S^3jF>yF7OmW9AzIuW8nLULce|E$7K7Gvn+Y>%zyc;bp z<|3^@8kA2yI_Kiu$}1Pluq(n|lr8~}=habow~93diBj-X7g$@Qv>6uyxfFsZIR#^B zVP@D~i(QX5lkvJP7Pw!noHwW==V;G{iWR|1!;6wSw55`BB#JnuVI&TjaSSGuc~9~Y zX;8c(DO1)00>@3z(+FNV1!XNW)p>$=_9>FRqxKmIdz>n12t2G6mjj)N(|TkPnAghU zMw~?E;OJf015c-k90E62JHEMnM~#_B`-v|eTld}JP`Mlu+TjNmXFMIxaPk#@JQqZE zl+($wW~K65-@oMMBJ&5oe2YsH%ey<{X}uSX1ISsn4VDVdb$qnIa_iOD^0LtuhlH*j zRnwzs804nsm!s7uF(M(NOW%bz*N zTq`baHwU%Mp|nU#)&!HgYzI>(1;aiB*T~q2q}@(f#BXkXhxEn}BgsK@U=TB56>~YXil(zOWE$ztS-XEFDDvXF)ytu7=6{FG>7H|^-&(_#fAz=T<1z|=I9mgH*Ao}dZWw&$ z>MU_TuN<53(c=qJu$TVp`y)*nr!`ZS!nbqd-NPMcX&@!fwCglknTyFkeHB(I9G96C z2Nr>)2sK(ryNjR=x;WOhEq_A756U>$i>w!u4u%MBp9%X!n;UDbv}GmkE-vsv8A2j? z1t)YmYq6@WMg_m4R@=Hc@5yPvI}^0mZY$y;8j^PD!l7E7lM5@mC{5|iL#A`Ow3_cLG5!bK|lOHW2pn0Qw_HC7(9flC}aky`@#b_iCY8XBAMIJfS!%rpO6DPV{v) zG>il75kCZUZMa_W!P8sC-yh*@z(pYiPdQqL98yhq!ulyQMf6zpI)`KGCY(wq76X z#X1srsFq{fjhVrzZ3MkXB~YZ|n#V_v)0HNfeMrz(yh{X^P=v{Q7U!6Y*r?-_7%Xr+ zi9L*njp9Nlgltt(Qi)-YNTaJY)ubS3w|+@KjjXlPU0_wypyt-N_|8}hOB2*b2&UJS zo~X6hI8pod{Y>Z@aJ}KDgm{PcV2*S(>T2Br?ZF35^Nd?|_-NsICD4fY$zDz()gHK% z&BUtUcbTr>W}|v?_P*gr=&#>cs46AAnl;GnMryBw)=_OVJbpCdC~LKVGmX|EZ^bKa zQ6vn+De=iikJ0G4o-#kUx#Y_ix7?iyH;)6KKYjwhysm}~iiM+i>q!WnAKdH-XOWvM z{P4o_ciyhtEe-EZOuHTPsS>c{$*o(y%VtI&SwvZvh4BzsyR~%>&eK}w*aT@pighzf z+jj8OI%r~a9-mAzE!ALscHf?fy+X4BjE0~okaU2d(xM|~NBsT=SN!tb8`3&cyx;oH zBKSbt;9hgR1)uQ<)3D!4F*`#_EK;c(lx~O#mjZP*noX;fUIV)f&3EQjIW7zLYh~K) z8FEB>;}*|ptt4r9msuUWes{1&l`-&>%RN3+yfiK}v8KRU8h(gOUik4%;KlkOKYe`y zI?rw{dA4)>W9i6dGW_`J5`FcK>x(mnl=$-7S7?vWt$aRcAc&yBoXXm_t9l#|skT}4 zo+h0%Ow{+lxRj}_!U=*3aYzh1<4~)Bj{`DPS`&glL)?OQW}WbAqeK(I2eq+q^9ZSS z90~0!J!C@6AfApGof2?rQ5fevAv&v^Qlk}!Ge4N(H`jHiwPM1%1I2JK3pNJs#=T`8 zoi)aEC#>DdKCFpNjADtg;-j}br1!=aQw71(wh~ZuTPj!voZgMf;hSY5i$KG)y!t+% zi=)%Gmz^=2D$zVpr-h|;aF9bFDufQ5Zj5s^GFot*UX9F&I*6Iztf#PuBQ!BGs1xJG z^WF*GXr)-bbZcIE9~Km61-s69yc;Y$o+BCpF$`2O%BS-Qx1Lb#q_Yu;o_;D;y4uwW zR_lx)q;a>UEF$6+A4Z7DK!sAxZ>MG(ieW2X4c-zJLHPKir+j#I!Q0ydA3wUZ{OgeT z;OP~=`PszP?vk(H-m)Lh`TotwU-)3+cfVTLjfq|>XW5E#LtPp`rV1- zXD%-GR2L|Hr93FZIMSsu?RFebCr-;^l8W=JwIW1LOJ%`wf2}vp#{st#y9~6g2`7!F zYvU|q*k)RVb#+WB5-@$-ceB%U?YK5`mM0!Ry&-;Z?s-0b#9N*D`qjN{8JxB9maA>J3bK9r~ zV!Wxl$c}f5^7`obE6)Q#&iUz^8Cg63>JOjO z@@o!#M|Q%K-AG$1-a9_O+VSM_Q-1#H4ew5swN}Glsfr`T9I0fcjc8PjjqD5jfRSB zoFyy7)b8+64K345(@1gLSX4q2#kq~jpi0~}n5u@0c49@Q8m!y#{m9e2BRaRW3T^x` zo8{~Vph_3>)`%*t74k4}nj76%)0>)O|7p_E;7ueiWz%&cB95+B%&7)lH$6de=|Q(#>i zDI1%sicyLm)(+B8?`W-as;FZM}WUKDWDN*u7TZP)7)XoqJ z;~41TY!e+5UwrzM==V%RA^z1LeaO#V9QimT9-ZxY@owh+e&)C=bSGHfi887Ql~yd{ z(CC;;p)~W3L=A{Kigd&~=GJK2_J*Jwmx8p&kW4^MKCmo>)n`H$+*-KniWFf!-Lc5X zb@p5ik$?2|9nXh}-4IxO=gl&+8~2EqtNXANPMQhPGfWS>U6fqU_+mfud#_j0Fp#t{ z?K7uS;nRzA(v%6>`O`Ni-rnDDr@XVuFmc-ptfSuI6kVzrNsEbr)}CXTDWM_n?#SmC z_;`k}f_B!2gK^*UNUaSo3m#AN_Tq5P(Y0-%Wor#eK5%t;LB~)f&Kd7W%8YMN0}SJy zs!Hjd!6&;BX{XT0KH7~>jIQatl42&tNN<&yMj{g_9HS7`ZRSfMdCwvi>GA4818Xbf zY&x2Ac9XW6vPkd{L)&hM(ZGkg1&g z-xg;g?pi8};bdI&tWrU3E3K_jdP7uf)O1Gv6fvV~^fqEv?L-MA0(D&wtyZNK4D2Wo z3Z1J**Y@XVv&Bm=&y*Xpbrq_EWjlbXnNrc>pvMR5{lR!u(bF}fF@9H8 z5{E#ktKH6;h2euUGb%B|aozk~fy>>*51wD}=RbVP^04yN;mGAa;QLH+o_1RJ;is3x zD!f|@c?T&ZUOgzSG@8p+Na8#%Pxp*hSNI;dzd!Ke!ErHoUM6Lph1YLh=GEOBZV$!Ktxo7w zAu2HnUX@ma(mG4U!o>_cAcSpfT6-hJfbR?UtFku8(Q_8Si?YsQL0nb#EpXgA^GawO zm%uQ<^a>Xdq(d#wXI+Pa|GYZiJw2fMU3RQaFWi$?UA?l zCo}|J-wBh9eE<5AUGjW+zUOD_FR62}0I&DBRt?zJfPE&UfULH{uJe(!6(DF+(vXos zndc)uH}Y<`HS;F)xZsOvWwJTmeY5)1Zr$U0u~l}ng4o*4sqM6z zzT@mOM4}Z~IJWlbj7ZJ3S8&w2 zFa{W7Bxpy(ib0B6!%h>Sb<-c>rZ2VH32vYTW890k!qDCX*FB?i%)QZjfRJ&uQB|3{ z;=OsqP(hrqi;1}^V^D_dm>cAj$e!(n7_6&M1bY=mL&1Oo8qN8eCoMxxUPd%~9T*_y=D;pc42=c}D!bpS?n2;_br&FAj};7F0dr7RGVM zSyguDdyW-WS7}nIYoK)#ikm7yl*4J>67ZQ6BT+NHJ5EwKF01)VoTqQvmWY|eN~cxzt*aacgw;)?#UtYuoR;Lc+VIVmB`wZ+JrKnAY@+F&gGOS8n`{3 z&|W#z%EdIW1mWTCf%9q4{liQtwwm`jqE(DynKFfjBNDsECn&KX4N}bXTJSmHvpLg6 zI(bNRU|lO|Fq34@)))=CMJDk7`>r1uteg44XbgQ>$h20TFBJacaGKVY5m| z1d5o}(H%Wl^_Ags10h;eg=T2wD&Uiqdg=`7o3%nWQ0-PRRz0OF4P&$q&OwYcuPnge zJgzIrIg%HKG%(jn@6Nsx+mc@#_SvM)xHBn1M6K+^Ta{eH9(L#KCf_}*H85sR3c^~u zEgHPN7}weu(?}-KmX)3@{!>b$td%a_g!8CGZ`?B#HkQ2_0;mefDPF)_VUD)0bTy$n z;J^te1Q(GI2q~DTzlEfI3`kUq->`+zhXL^h!)(iJOPxGWi#1{UF%Z0?&Xtfe5*+Fr z*$4A`1&?b189a*?QdyB9A74pPDXV3UqcP%Gy>0uVBaeYGnr6P6CLZP)M&<5s&+Q=-C2?#G z7mi%*FZrXNza?H?pYh~k;>GJ<@b#_Qug^II$Gh7*x(H9AvLCN#r-j*dYIW4AknFF; zJ6f+M!X~$6yE-98x+y!_waH(X)oYsX}R$+#Ofm_)Kpf7VZuQ8lK&dI1|P9MpdC#;g%Dx=fbIV zKKkexFWC;jy;dB0>s@+B!>LNnwO)zLMZJ zr%sBvuErS8hIr8w@q%%Jmd@xsWtq{*$_bWkZ1vzw8`OaDxkVV(LhC}yBh>|{3rnr| zn2`-}BVCP)Bps?JqJ$jLy~D4K<64Mf<*fJsP7rO3LneD+A39Ssrc!@z!RQUT>1`

F4W1#gA&qT=DC%*sBi(~E#=#-W$~Xk7Y&RCcGKkV>t+R@aqiGij z!3?KG1nnM&(7V|;ni!6y)de3cL+45()RnQrio>fJK1B=@-KEl+Wj$MKtm}#Bp{~^g z_#vBK({aMzi^XFhy(!^67pstCKm(Q7jS8)di4j6-6cD{t=>UZ3w6L*_b0XpPd8hYl`z z1~ng|6EokwemHSFbxLR~weaRJlQ$i-Hme#F>6B`hlAtTW?QjIvGLwncC4gg|Eh!UI zr>ra9N1TVY2E@I8u{%mJuiB731V;wODYLFCZ{9o*Qf4=Scu(;&V+wruXwS39Pk3|R zh_8?La9a87qvxctP-^A&{s3{phs?YC6W_eKWxwCdd3aQcQGXCYAqnH2{BX%#vwSi#$hpGdaadj<`W^pRfq&pVsFe9 zjxKU2opmc)eZCJ2sc^e?t}oBb2)Uj(n+BU0GVJz=U%q=|WfR?4>7PA$3<+M}9(eWQ zj-Vdj3K}AvM5uNfXicrmAQ=bAIsMMB)z?ZIc1ZS{HNb95t*m&rp{T_un}#8YNZFd8 z)eyPU<14)Lrkgm23yJO>-Wl^t+;&jt=9I?St-u;vNgVszEDcIMg`o9A30 zd!mH1Lw6Br6TT2x#!tVC~g{X%^IKM``cKw8+ur+E1(7C`uPnXJb6T)D_RzOX|&$x zE%E&66SOu;Y4%d+h5h-N>3UswvTG!bd~-wVNHJ zbU{vq1vo4xmQrzf&&9>aKCVdfoL!u=O9Rg?CcgUS6>obW{_ukv=F`G2-X57t<;{H| zdB^?h2d;0Vp;S_AIPVzu8EHZe zO6!hOZKMEWP);?HQ(_JvL7kS6^c_hV0ygMGy zMd`=FT03!Dnfpzc*9z4Oo&-&ZqEM=}^k`zbOdRJEwHTVXw~8mx2cT6#RrGz0c(Ljj zcd@6aGW0^xNcI_Iu|}O32-&iHNkNmRlxl?r+cka4fwJ1ke!kC$)2(Q=GK|Sgg{7j4 zXUdTnBgr*v&1E{6Cs|=@Xe`>OVpyI$Sv<(G(J$3*nIh3lsMQ%$3oD&abu{suR*NI4 zgW4U=b#s9GiU!AAKzv5EG6aY|8%;HOz>#T$D0G)V3lE1v?T$1Ij6-B80>Lx*Kun(d z!-98-96jrNz`XfTTPLRxaCDamV#^Ao<9x@3f$r2wVnenYX=`Y3#55v9Ld%NVImBga zs3zi)r)VJ$k-Q(69~x3t<8X}`ao|&itq8RTv!!TR2;+{ncG9YZvq0QWOy`;Fabm!6 zTV`(G-Q)25>KE7i*5{9Sd31dKE63JQJm-UF5jd@dIwZ1lT#f@0m7t2NjaRjk zoFzxHH|gPSsbr0u?=o}!|1aF%&bh-n#Cg7O*Wg20S6dh z{`tWGGhZ4rJ=2Y5HqaiQ&Y^fiWs#@vr$*%ObqAQ3Y=k8R>aLz1en@14Clr7DXO zo6}NwS`v%Gci-Q6_j2aD?;pH>XAB#x&u9MnypnYr(4Ege-Fa)q>tkcz@1(r&w}1GF zS}V!Ie{I5mr zjjFN8%9=9PcSM~wa`4`zu~cOr>7bJOv6%~>Rv(U-a$PevciJ@QPA!?Gu8h`cV;(Ug z4sTH6Btjb-Yl#GekAW?Ui(_su)4`i}Obf}N4L$r)@%`VY9h*W!M*#1pg*{=_XfS$= zopPXd_GWYw?gu5K=0sVA+cw#58)G^pXP!?Qw@8twq_-%%&=kMFtp~nhj2@pEcXAGM z>9SVF*6G@j5JbUx*ez0KOW?}_>nXfweK5vXov9 zLB8!B9g#;JO!89ErBF37Z<9yv{Hs6vHP7|JmV#co_l7Q&Uw=IF{@n||`sFhp*OlLW zx^o+Y_s>fI6fCloGjnUSt@EW8UY5f1nt7d#KAgAS*(bcwIpvBlxvmv}Rh3I!d42oD zqwP!!k6P$>MxPsXNg#)5MMFKD z22Z-+?mYI!4?o>dRlfY;J1(a)xX?=DS0Aoun&kic|Ma(f>4Tvu;sI5uIeZmT3msy- zm`2H!wrxMd;mn}9p;>7jO(xZiJcZE*o5ktbxaJeopwO|o$#SZ3TnhY8o4Hh z2;GF#o!%zb^@Puz)_0cmL`V4Pv2i^W9($*I=jq*r;)B<*^V$c?x^OwK$lO_%%K5yI z%EI6M@drviF?-^vW`6l}=Fh%)&+i|dDvs8~ci(;Hsa8IG`;H&(8*e{8uw-1`z3}O~ zAE2Z#gIZ(&wP?IGFAG`+vm1~5&goi6sYUq&(C>HZTEY}5GjxtILR8j-wVf#zFgQ&S z($!dj>#=FF1F>vONEU8ttN2W4fhe_@2sH?-8Y9i)ap(EzL@62XlUy@T*{G?rrHOZ^ z4W(<`qNW)qO;ky&nxGA4T6o(+ldCz$h<21YfFRnL8rB0%#+=Gb$$h`RD%kh7B2`1~3pI5;-KN+ENgsx2TD!+ z_~p)DeEWgh0)tqUzPmp0>UUmSyqsUMG8O*e_R5+wM&@&yq^HQy_Qy`i%C#Tr@mFXTZds{QXizfn&MYl#o^`(@>p zob!6&8-0ald~S_(Sy|2tcHjBG{?%Xbzdrwg&#!|4ynBA;%j+Gf3E%Gkk?7~RNob9m z*Y?Ji7jmuiox`9w83+GJa)Bi=Uhfp*;Ip@lcH8iGFAO~Zc+#VxSR$u3r&G(qHtr0| zOcQceQi7yHYdfd9GIxV2j1ePqsbR=-lv+b?%yQI{rA(8_nk8D4`iz570}8kIFlq$< zKsk>HL>)Qck_$ZtLVnGDBE$+^^u%s}%Pj(ZfXZYFr2M{dq(revFB4FvV0hsQ_6 zShBD;m}S8&HkfJ2kexB3fYy4HRP^4-bz%4|Q*vK;Anfm{;Xc8`W8$;_0aT7KJ(m-{4Thq{o&xn5R^ z!uoRMw+G8*O`9{O3;(3Xydz$r-(| zB%xc!%NnA5c9uoSsnB-g@tAz(K~@W!jV2y@Cy^Pca@!lT2X(|{upj!@S_)$fhDXbG zcLCREf69rmJ;+H(H8bWoJ{Qp{o^yEMENP@-#7Q|?GFE||$!RXQ5Z-q8**Kas^~#Ff;C2dcIA2=iuWWAd_|sMTq^ zQOlWWH=b)@pus`f8?E2ryrS!wwN_5SJINmKKRr3?-76F zr?(r~67Qd%*r#Dnna8IMopD>l!i6rbkd-kKRimN0mqPj4w8MlvBTJZ~?KYK)NM?U@ z=F72$KM7S%6c>yc?rr_*mJ+gZq}#_4<>}O=hKENCtdPXH)SyP(Zw*xA1_ErZq!F7> zO$SL7hb22H2Ud9sj5$Nslf>4d^aF&wXU>a)54v?yf{aoGmI)is z3I2Wl>ML^)31p3nU}=KnU?Lrdqhw)DVeIg7u7Nb3>1f{`bc|d|++1VOj{jA{9O{u3 z9n+YEg{AnU7snoriL%{#;Al$RcwHd17MtEf!B0z}S4Em3{fLN`j1LcuvyIqhYZz#s z-d*WaxGX8Qbv}9ba^}yjSE?9Vm1Lk}(iY(gEOu0OjT>SspIf4o%K3ES?e<{X?`-!C zThG*bVo63$IecfXj18VnXL1*QZ#PQr>~r$yp%W(rD~Vx7@&VGw$$0a)bZ9#L+%%q+ zQ+VYz$CKmi%o*el)#DJGPLafJL21yGN$Pxj_r#ZdL|vH~S(VnD&$kUbzAwWfPn)$I zeFlcrGpR^u#I=&Uwa}Ql9PaBHn~k|2WW)GNJvLL1N8`R7dO(7cW@@c`^Ztpo3a>Zg z@pca&+ORN|jR-sMt%WgB;)CABu^wFV=%VltWr4L;uImM5Vm{*Vv$zcmj~cCYT`0w= zn&{Jb6X)5Sq?z-za-XnmoqZTaq7UIck)e_zyzO`1-gb637>$olS8jLb4}bWPr_0Lg zmoNOYKm8@$I`;P9*YDpWDe>>W{GMDg^FCo&kX7lAjoK1+^f6Kb_?NbUdAwChPIL*g zVW~@KcLdKIIdCa`r{C|W8`cN9o|&bPG?7~aNwhg}7m_NXMv*X4jv0-@;)yv2ImIEG z4~-1TST(eN9nZp=U}l*2aFdUYjn3(Giax#}af6UJ{P$s0A+$01+6o=xzGLBE`ifze ziAdm#g^akOw4)~7*;;_zlEz3jJVqrc!u|dTsA9^@wj(O>(iEdeiIF91G+xW0?~Wj_ zemzLtjjYB}5`6^5M@29<+QGk4hfy^Skk%Oc!1sae4I3@+KgWRsiZ7v++0-zTs?se= zUp)zOERB2&B#I>Qv{CDo))eUvZdR~4_-B9m4c|UJflkV)@SF3>zyG`MxL#N8x6eHP z$+uiCmG6IerJ?-s^Mlhhaj7e5OwK4@MvC^KK1jt_*M)0cg13e6*`RoE(aMrpHM2i< z%wiOGH+m1*ApzI(6Sub;v-P91VKC=l_JeZ!)tu}pYTzW`lC@9N<5Hm_7=w53FI-Ox zZFFQRX~OL-ww-chP$?ytZ0@oBwuoXm&VFc~W5x@^)W|7^-zkEl3C)80j%ehba$cD; z7&xx*cHbBl<&O5aGkRmcozR^4%`dJbX)LFOX|c8~rxUNA?%ex4NNpN)%p>Hhx}aht z3BFXy5!h{g(D#kBtc)>nkyxvzK(#(!Ppq|&-T0%%XnD5GJZuN9gy)L`Lp+toBMfWb zUe3Je!usJo|L*Y}QxdoPotH&vZDXy)gP3Af0wF$TA{2l?rO&P3Y><$MrL zC5(`L!c@h{jIA-Zjnnl^^U1Uzs5&!XeEcI-S0o*oxIrnzR!?B;QJ4|%pa^42hbBTv zk!PI87D!0=RQB2F+7PMqnHW=|SYkw$FcoKSnUn~)pKaKTZ7t%A!`CLR5u53DbSgR~ z6FD|$5cHEJ5{ew!mOnO9c!GoFG%Oz45pgapmDB0WoWl0lcz$2Ws+@-M z*B{<9&G~YBrG9wkBuZ;{YS*COZVz%Q+#ek(XzBd+{YUP%#*aSu)E+z@8)>a!hnSN# zla+_Ldy?3{C<=ESDT>)S2xL=wI{nL*VZk2~9Nbb_dovoab;IyiPVf*gV$ zTrjcx1XwUWz3 z=3q3B1iXjd(QM*FC?Y&RJw^7&ol*+R=>&bCDN{;{tpYIygQv?+eulmeH>7|$$C05&H3r|f#gC;#?$ka zF0hn^U%q_g?Y?1j{`Ft~Ilue-nJ+!~J#Vi&x-QIfL{4lHh~@$5as?B7bo_{p)LbF} zs-V}*?1pzgpl^ar3T#=PHA6sv-y71hMFMB67X*TS!!UpS}9FJE40-motG^4+)8QrYIt_4-6k ziQ&o*Uv89jp`I3Qj~lvHtZkI(q`mR+bcsXZyoO(G>&)JxMo!_&wy`V=&ysnFv-O?l zlX5L5YEFE5?A*7;-WxR)z$ryZOAbG!7@{lpx3}=0W#xIf^7{FW-aC}&WfX}3|28&? zOte(YGLJ_CAMrJ>#?$#k`rNopA?1qT>|3LLjg=iVSsk5qSt#l}R9MSOPOugs|N8xf zTWj1-v2nR=TRcn@=5%J8Xby&v?MB}R<)m>XcjHo5MvVrNw{6B?ud3tdkkH%wrkSd%`XWG`Iv>*%9GMXpmPLUI1?+klGY(a6X#0Xptgc3e5 zD~#QEy}$BLK0c8KwAsl+sd{Md=;Y zM6Q+D2HW1LOXB+eOf7}=bm7zE&PjxiPfz64Nfr%LPft%&n=DJ>r%yYhb)J^QyZXe- zdSN%Ed#9z$J_g$q&cnIZgqMn#v((UfWl;)=^K`DI@|ozX%t^SG%wu%6k$CHZr$miV zW?-eIBMfRfqfbxleZxkkB<17BD{ULRPA9t{V;mk$p)B!r-nY&)XxmP$aZ68<_+k$j z!AEOjAX?Z7p^R;p+!gXEA|Ng)Ho|I~A1uWyz!Xq(9pf3)xsnYu$(otX(3-gBmAyB%ZKHXoUJB!A!g&*= zx6aNayKt_RyLLW2e?XJ)wt?0KEVw-VsFJE)d6dNWw;e%wdb#k}JD*|p zwbrNs^AO=x;sKwdGgK&R1yN=SyF#~k@N!Blnm`jN7iCICu{0N6pcWGbYo7$4+qOn{l&{#rq)>4TgzsRRjj z;%qaZgTnEksG>srzS>|857h9mc;OwW-BKzKkI``zL7B`E4NA$Ce7N=>ZD-r|V=NU$ ziU4)eu&h{Xs6_Xn9hzRlB5D)1M6?vjQPs8Y8ze|6aecn>^z_1)ZL-~V-Y?}Cl>=Eb zT4zz^o2LrBaak+x&);z02A7=KTj$20HK?ib@L*{zlDN|VA;`nk)kyoh(X`9BuA7kyAu^bc46n3qQ<4LFe~ z3R4a-vNiVEdGwtZDZH!;NrdOq3*Y_tiCUI}1yyL%n6q=rh3h-zDHZBz;nSBly2I1U zHEajVO1pjL(K_9YQVS_f=5Wr}E7P3)hac&ivF5{K;6Z1YPIz_@{Qf}d%H#FHZR@;0 zKVx&y$BY^%cO+*}AuS3APDWE~5Q_+Hw0LV7J=o=B=}j}56xDT#gWs7k~n!*4f;+n|b)nFkaSzJ33WoL|YRd}$lE{XtRXTmtB~2nPx% z=n-S?3`?XGiyQ^C_t=Oo!lQ5OeX?)HIRqn0%3*Gvou-E5MBAcAagIrMC8ZM2fA92t zu+Kp@nBx&Qd@c07;no8eEm2%Tia*nKi=>8|#^*vKww9*{O*I`PTG8;e5h*jD&QN9V zarUIFWa%@m$YuyVPD%&KIkrv`P%)puNb(d1MIy%)TO)_&U1@Zz8jPbTq3+akVf4Vr zBoVf~1*|?VR5D+-2j&IM%5rkDr=v{-vKCC0nleQbitun}9-~k;&|27A=g|j?R@~!& z*v6o1M$HjPfpuml&B^^RB|6T>^@&TV;Dh(Iprdov%9RrPK&ki(fZ<8 zXnnb$_Zy@4sEvPgrYD>r94sOT8fCANSk}tcT10b1=wqOoNSXo-ywspSq)^w}2#2!cQA@nP`DhooJ z5f*lcb|IZHu6o#Mh7*KTQA`G>Drim2HiM7u;dPrTm^w?&h&gkFak2M#w0S$51**Cv zrIbuA>F~pS?Yl`d>7-+!aJ#oy7#v?ut>-WUJCNd#A1NUz<1)E?I76=7UcXS5!m^$z zI>|}-^~aB#lk@p)N=icJ`R)+DCGWR)n z|MHGyAH41l_P&8ak^)&cdttW`dgOHOy|I)iCUG+!uXj?dR1xl@(LL-&sm7nFra(sT z)?$38M~zuhk`?-9?DHO07%%ut?E4;5%X*4J7mXa@qsIZ_Evyi&kHa)QkC&JQs!1G( z<%C;MI$RX@6IsD$kW1qQ7&8Ctjf{uc&`XNgh=)S&I|00x5oF4oqxHgs_vKSWOpZ-$QUaRSF5!gN>9bLxg!S z#PJ;=#w0goYG$9Ebf0ty>cpC&-b>st8T|11&XNw~v4%_k<#Y}Q^_=99NoDYIE~KS$ zs>btLxXnplSH|Owr&_rUkDfSJQW3_8p19E-JYJpm@1FS0Z~vTblOMjk!nZH{;rkn( zfBcEdb>;m(`N*dqKf&JPt`ca#NFgGKYz#2<9JEBV7Crc{qdu(TO4&v#s1J;;h^Erxe zYw^;af{3{sj_mTvu%T4UZ1Gv9Hkm2wC?EK(UcBv zQ)29c%-7bW*e*9Gw5kkcPDC=p;pwun-F9vxQXi(<&uIx0BlkpC$GfvV8t-17@#$>$ zK*!E8*eq_naoQ7!0VN_-(@CD`vmGJ-!1<)3*ktYp_FBHSN`+NIhLV?ci8Oy*=oZw+ zBodJh2Ij%f(VUpQ;g$mpEJrNGVn(;avSp)_QncZ^0UDl~-h--{0)vT(94YtMuK0}D zPFV_TigjjN1f8+wuX#|H%$z#`0S?gKr+wop1#;pxd(?I1%#sVs96X!|b=u&zPwuvJ zSu0DKBQh{_`uh*PSdGmdTgf zD|3LSOu9XokH)*FGw;p|OIH5kw|~y3Kl#AF`>%gT>l@dXXSUDLO5!@P5zOz=T6~S> zKze8Ua^vmo!TISK?VTx5i;@pgLmzSNHg_OLxr1t??L~PIIZtt+91)sYD`O1Yg(^x0 z#u)U`Ijv`~#$&rkXR?l<s&*xHSx@PGOjf6n{! z%Dz9?im-P0a=-D`8?U`_yAR5`ur7))xV<&T06@eO5cbXC+RAJ3KPgGfVD zeNr-^p?XL&2`Hs9w~b(mv>3m05M5GIYAU!vQ6&c&x3IMyCPn}=Y`~BS=y6>)mLe{LlaCKl8_*ex#%oaS092!wX|IqANOsk8fM!@Bi=vFHbL=&MR}yuzqNC>GiB3 zAg2^@C%|k*MVTgQ&hhh^aawa^7-x@arcx0NURKnAWfD#*@$d9~{v0cDmBY>MfiT{K zC7-IY)I#qT*|B{DGak5Oh!j$aF#K(AM|&uwlIeR#J@S1~P#gbZN#XzTDabi0%7+=I zLP?6x!BP{shD`|6)m3@hD*MQ+DGtK9-N>5w=ED=Jja4;xS3X%~vTg7s8M{xkCThyO-3Nbo zd+_b$3HlaIGbuELUFbPNSkMq}n-U z;p4k^{HZ6tyxwS5ur=_}k`h1sbmMed`R3(`IpH=R$lm##|YR(KZ`WT`8O{YCtm@W<6 z;wIz*V;nAYChaj0qFLs#NA4`b%~1d`W>`NmP)m;3%z)D=_)D9?FrY^^^pZf+VE2Tf zY+J;&O0D!UX--s&xrg)JVVH9}dL8?0q!LB5zx(bpKYo5g$B3I=R;)xkge=UY$Wl>v z`u^bK%M<_hpZ^WNxt>^3;(z_=J2sScSva51yxw+9jgKGSAya65q5{kH%KPUl@2-W@ zV%$mi9eQzYvvJJ@9gXE&xzxl-CO>pR+oUXsKaR<1UD)o1Srpx7&3x{S^mgO@^@Pua zkSRrDQ@8K5482VXiG;=1(Us8$Hg}TL5V?k%XO+0g{HJxC)) zbtyGOdYdRE{B(X4Y{(kQmCu7n68Y7HQ)?n+VVi*m3R(z_8vEQszvu=cEGdd0CGAWG$%DKwePZ520PWFSl4`7$RgYk` zlxPe=Sj)m`U9i4!DJRsULaH1NShItLp!99(1!2qTW5IuzT772!S#8% zzOWjQ6KjI&l6m)Z<~bXy3N^z^i7z5!=cx*tRQ4VVfOC$`)`x51EY5FU65rpA=Xzor z50+)659O`h@fW2UeEWRm_1=(?*&d%UYyA21O0vxDul|%jzE1x5>3g>B+yUDMDg`gW z9M?8TC#AQ>@Ba85=WF6mzx_x`74f)siw7foiZf-ft_79Cw8+Wj;_MRIQ<{y(GzxHj zI`im?C4~fzQ*vP}V9nXK#w;Od@3WJ1C6$EF$?d+Qxp1GLYOF~RkEOv-jVgDXA(NZ{ zI;NG`h31nk!uGgRr6Na`w6(BA7{=`};&zgSoH9t5l@-wS#G;D$VDG|6iH9j8$HCUd zq$DV{()Nws1}TNJUL<@zl9fdYW}W}~<4^qkAO47#Q`Qupv#O96RAFi&m&|#|oU-u# zn{WB`(-XhBEd1GX<#%5mbTclOCnP&h>zV!WU?kyEE0=nrW~Yq@tDY!1@tb!G*P@Y` z>>brknnw1_x~`PmSxWSFKKtOa8)X{r&as4w2-aYdDO34aD_e_tF$A=n*m|SSH?pJv zV;x& z4M{xQ&ACKXxmXD5!itKa2f-n>Ku7#UBtCTJK-4#J{KpZ-RF;$p)g&_|M#Ob3qzp-o zlw*XNv*8Rz-=mhjMD6`5M=g>#LpswVh`MbX#gyR*4l=;NaB;3k7`>~Iic{2hSytX< z<+?=EtZCt9(C-n&$hBZL*{9Yggaa_{N}mvwx2mw;TJDgzI%J)``1@~_Yc3vBuBPT9n={uT3EKR^T+MM)9Czq zRr2VVC7iEfWhQgzfF&b29kqNFvB-mI33KBx!zIS=Fsn|AK$3`Cyvk%qMtY{x8AwDa zB;iS7W2|v)UkNSHb4L|)KOC?Ubzy5#l2kMmWLnrSG)gzMDB@9AGK`35m_|vd2}{jX z)uX&akQ7EjAF*DST+sxx?J*u|VzYMmre>gIvLXpIQsQJ4u4U4a^AC69_xC&d=p>>v z!%r12g6P7q0dD;A+Yh{ZTKMJ5g_BplS%g1*TDj&JdCunxni91H>;C0@#dBr>e(_W( zvhZooxnieZL`n_Q>EDCqDs$UU~X=QCv8&Aqs2+X zBt7Pc2CLmE3`Tcqtw(gJgAUdj+S#@prEJrJXC+YUf^*c4No@ayIph9_Fv5Cg`D@3Bh8tOqIMKqRFU#$X{NBI}V0F5*bZ$QX?Ak1bM`clr=&y^ti6`_>4* zb7ssIFs_m*DlzZ6Qz+QPsyS}!_HrL2@sj>kKXWRF1QtuO&FabL8V2U}XlF3WKmpDW% zRk~E}+u)@PkQGmfof!eo8RO)A8osR1dpNp_b2?Jx2z!ea>U?;4qVLB3-DjTGLaNVPm%@MiKmNc(No8e9CT$Jv0~B6AKltwY z#``LKSWYaG7<;1)qtt~oppPDCKxw~!^(~jnm4$+~%)1X)J}e>3Jc!6qE(guFF5I>| zwIs?~_;6aerb+e0q+&JkJ_$zDwlC_OYv91|KCxQ3j}BePo})Cx2ktpAJ#O4uY|2TF zE=nneZ4XLX7{g)-mS-%+Mj(NjIrqnn(|RWEsS!B-IrOZFISBvd5(P734oV5pyN?j^ zB_(|HW5JdX4Zm0H$U|C~7Or&&Lo=2Tw-D?-wAbD{0bn^rrgI2IBb!>1lGioD@FN8H zEGxZDG(nyQ@gk|=o<0TsR)|tlks6$!IcdE|oI#?xecI7MC*f*NYN!U4H0Kij4DVq` zP2sh2#?eGPi(Omx^qiOUZor_7|+{%D?}Q z{|9YAeY(&A+c(4&8*qEO@yAl&nmFaksX9AB(iDN=vHHH2f&gk3x16MS>xhiwh8x0Z zS0W8RCu>%6P1MbpNqN;q_8cFo96Yf;#y>7s+@J;O#YvapSry&>jqRPI>Z+OKfvLF7RTN?{{MrJzy5m1G!XT-<>S+5}&U0ZBoUlDJTnj z8-Z3ziOHnTj# zNIJ|Jx*}rH@{|r7kqW6qDGFKe1dA^*qK+AMg&fbQ+l))Zj7x$OpHC-(%t#bnOfri? zmZ+jPpSTv3L>?Tdp0HT6dWa!Zc=XihtM=+qLz_bUs6cVu^YBo^?n}dDM$RTL~ zfvw%hx=kIW-?t~0T>5R`XUh8asz+89jHFsWK6 zN#;XMd>)zaW%A)^;c5-n#8P%{o3X4tOTI~i?`S!mDjfi zqK#iYJ@Mhc`y2kp|M!33es8SrpO`-k`quE?`TRrYWjS-I3)vti<(v}3!#(dLwh?53 zd_->gFifGG3ce4NfwYO|m9B}$)>tHRefj8Je$2yekdDnUncV?(L{m+YjuQ#ro`wFfjR5LogI*%(4+Zm}FHD*7^68V4Mh>pc!DB$Da#{rDBw0s*uE4p5 z-^v1*H*IISkc&_RPO5><$x3pewaKkbK5sj(KYk8c?B1|7v%J5u|8(b4l>gyh{|z-S zyuICVA6(BXT0CeJT6i7KPt6(rpytA|6jqt^rBK$wnhT?M&L<`3%)9RR1-?8cPpZ6B zXV?UvbjvhLxEmF?51|)mT_|FR4BDvlK3S9Vs*@qY6-C^*8DTLXbWB6ZrPB9C+jr0l z6T?h`U++i!Zf|JLWG3Q~ORQ)Vo!9`4xOV1oUVb@}Y<%Mh`NqiN{tv*8o+@9svqX0UGl$Aqm5x{Y2+H z>bql{6OPJr4en8Lm>$k?BnNR+!+#Z=hCoN?0WF^v0o-&HDku@TxNnb$vUqTwjR8lg zXdjMBrSFrWiZ!Q7VsDdyhxa52rL3_zA;fjhO0H+5M%sQkB`zMr$SEfvadV@Pc%4FP zom3Mh0WV})yh*U1i4r+W_^l?KBy*aRdrH`7{L`0(|IH?!yK!0)%d*CUot(awFyD@# zq9%#ROOm7iL4$#z!ohj)4~xy%$b?^VDzvT)MI4*+Uey<8JZ~`MZIOIJVu9U z=x~&Vmc%}L=uvJgb)`Ani7lMccCyXHp>63>G13kp;C<)FfV@cV1++dfwaK(8p$|Uh-1Ch$w zSGvr@YSf~SaaoSdTVR*QBMjd*6l}$NLp(kU6Jf(CE{F@8fP0Uu<1kbu$QgZx?PW$e zuiK$3Cy7)9p;e6`2%Tmf^QflBBa1Aqh{naI_oyFRN?4(08)zUnD5^*fO35%M+Z=@N z_<+dwL6#Cp^U<*$C$p(w2bWw^w4>OO_t6xXRMp5C#&16STU8SrnwPsqNhuL1og%@C zmxzv-5XLlv*l|U2{JcbC@IH)ms+dgPwg>mVgA^nM*T^IzIoLgOL_}a&DvKy5O(YND zycENI@HU(-#*-FW3IThz8E#w-+Ca*PP4dD1*-UtS3?400QsSNxt7VcWZnm@3%w-VG zK1q0Zd*B`{~}`CAm>@)J!45!zN>NUY3Q6z$^i4)F`?S`@><2$R$%n=z9xo#$ca=k|IVlaT><| z@*n>L+uP3GI^|EE$ph|x_dU;IOww>NJ02V)rfY-lcM(zvCmkUWYm3gOzm z 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

>c_3jEbY@PA@Zw1fm;qqvJDZ?6@FCEzpLpnE5d} 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 Pza=Fm_pV4p*Y|$`UYHW6 diff --git a/navidrome/cache/images/1d/15/1d1525455687037b510e9c58c6aac1aec3a01bb9 b/navidrome/cache/images/1d/15/1d1525455687037b510e9c58c6aac1aec3a01bb9 deleted file mode 100644 index 4765a6e067526a41a1e330bc4432f9f7b0038484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39232 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 yBddh-jzZfMiCw$qXLw_i49L&YFnB;CfF diff --git a/navidrome/cache/images/43/cf/43cfc7d35115bc141f5cbaffdf95600136b78f0a b/navidrome/cache/images/43/cf/43cfc7d35115bc141f5cbaffdf95600136b78f0a deleted file mode 100644 index 1305a6828c3fb62893952bf69c61698e1b078b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15092 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 z 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

%fy9@p#_)idXUWm;EvC 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%0D4AmfVMROAk0O#IGNXCtv3v098Cv{h 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

*lB|>4Rhzr|F!?Tu@u!B5-Fdm^A(cGJ# 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 diff --git a/navidrome/cache/images/80/51/805161f6790c00faffaf61a522492d0de18ed62c b/navidrome/cache/images/80/51/805161f6790c00faffaf61a522492d0de18ed62c deleted file mode 100644 index 0312b7a4e39df0f877a7450639fa614edd734d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45166 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 z 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

>c_3jEbY@PA@Zw1fm;qqvJDZ?6@FCEzpLpnE5d} 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 yBddh-jzZfMiCw$qXLw_i49L&YFnB;CfF diff --git a/navidrome/cache/images/88/c7/88c7004eded52ac85da6e662bef03244701bde06 b/navidrome/cache/images/88/c7/88c7004eded52ac85da6e662bef03244701bde06 deleted file mode 100644 index 4765a6e067526a41a1e330bc4432f9f7b0038484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39232 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 diff --git a/navidrome/cache/images/b1/62/b16257a8253cb16c1a30a54acee4e0394d8a60be b/navidrome/cache/images/b1/62/b16257a8253cb16c1a30a54acee4e0394d8a60be deleted file mode 100644 index 3c3323a2ce1b076355603f912f1a8538e732e395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16237 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 Pza=Fm_pV4p*Y|$`UYHW6 diff --git a/navidrome/cache/images/b9/c8/b9c8abd62d15bac48b738e9cd98bcc4c847bd90f b/navidrome/cache/images/b9/c8/b9c8abd62d15bac48b738e9cd98bcc4c847bd90f deleted file mode 100644 index d56400d37a32d55f915d8e8896cf862092fdb2b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25778 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 diff --git a/navidrome/cache/images/c9/ca/c9ca1e99a28e93e9b5f952430017c833ebbca732 b/navidrome/cache/images/c9/ca/c9ca1e99a28e93e9b5f952430017c833ebbca732 deleted file mode 100644 index bf320f483818259b25ef8c0e076c1f0be5baeca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16757 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%0D78&IAix5Xsq;6x)I$LlkK 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 diff --git a/navidrome/cache/images/ce/5e/ce5ec4ddaa6f903a901ac6d5b2d8421f5b3457bf b/navidrome/cache/images/ce/5e/ce5ec4ddaa6f903a901ac6d5b2d8421f5b3457bf deleted file mode 100644 index 2f538e19ccddbb89e4029bc80be08b42117329f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26153 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 YNrk{brJZ1nYHjU?ksA-3MAqm3*{MOEM*si- diff --git a/navidrome/cache/images/cf/8b/cf8bd7a4a7d89237642713e87c96e9e0b510552f b/navidrome/cache/images/cf/8b/cf8bd7a4a7d89237642713e87c96e9e0b510552f deleted file mode 100644 index 575f7c8285705f0d97f732cc2fcbfd25e4eb55ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19976 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 diff --git a/navidrome/cache/images/d3/d5/d3d51bac720faefa0d4d005287aefcbbecc70352 b/navidrome/cache/images/d3/d5/d3d51bac720faefa0d4d005287aefcbbecc70352 deleted file mode 100644 index 0312b7a4e39df0f877a7450639fa614edd734d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45166 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

%fy9@p#_)idXUWm;EvC z{F7Jl{x`gf*T3{n`L$ns8ee_uJ8|@-8=ypL$s`OdE7@Wr0gU1W9f^Nhz|q^#D=OpB^3 zaxOS4o>M4=YsCdz7e(=iibDlb&ZwZtW)8JMkO@O!Ab~jigK0;}0*%p=t~u(e%n`*;bQ@qsMBEt{rLXF$t7& z1f>Z5G2`|Gl?pKpLN#&~xi%D?Men%jD7}Qjs1O*39y>@ZoOLy&59Gl^$>_$p^4~;xLi^e<4x0&vc~!W7sUGw zXGEP+RaDD8N>$S(Po5dn(t(9^5*SYgf)C=O*GsWVS))`fnVmyNay6;lK}zO?Dxn1U zm7=Al(dp*#P)`(v%hEw58^9O?KX}i3apybTiBEmzQ+)0VpJ%;V@vBdLI)CxVocNkMeKp^3=Q|6w9R-`pDwBdI`v56U4|+kx0hPi8QY#5k@DWoAo1x>| zzwul7-n)J`Km3qK2{sn8csre%n`XILjn=G=j`^Ce`fC2+^>60|zxy0i&OG-eFXR_~ z<*7X5+0W$qn{MRSe(~vi;EjLBy}s*vSRWnZGH9Pj{m9;Y&bNKTw{hO{PJ)ADo_8NU*rAPzK^Fq`R94pU%Zi9-{#izA)=!u>wv0);1qoz1jXK!x8z42 z`4}GcfQRr^ceoSdwnJ4FxoOEeyXe`BtO{|+Xwz`JtFGei-~Ju^%1`|_wkKO+T@&j$ zwo!!P1R94fiurt(yMDtra*JEul2TXFPp&P|CmweH`*GV_UCpOI^>M!R$xrd=Pk#cZ zT7Kq-9>)jX{C57|Z#;`qYWmfPQI7f5*RXTTFC*{nvh7En`Ly5Q&!7Jys@aTZz3_Sb z{L_Dd-+$h7Y0N&ae(oRh)F1yjR!4{Um{9WynwsJo5rJ28yitsC4c!Ja2K;&pv7knI zpXdZ*FI~cRpm>F`M!@9Rf)s#ZB(Dzf>n+`-FL845OQ`H95vmj@+E$jzWsLKL5b+`7 zswJTx&=}NgDdDJ2Hpn?B$cB^~`cy&mKw?N)I_tSeMG3D3|ZlyewcpO&UL=Zl*dE zl_#7C-ujNW^QebC3ic`(Jm2*l-^DxL{0@HnM<36x|Mvgp!uj(OGyxI^gu)L4ovA3= z$Tm+Kw8`Qxo+nHzC*e$?!6`6BG;~pTTbTkr^N0sOjK1&qmT&qdzV1$6%ZESyA(pcp z#@@?CL@=@S@rrNx`fujVfBsi|>T{pv+wcAz{KK{X47N!3RsiSt%G-Y#&-nG<;`M+0 zm)!0C-_N`M?%kZ(*+n^xPl?fwfAyXh=e+ni?3_7E zjuYEH3)p_jd{@(TPd?DA6Ok?+6Xy}16S>%>D|11aA^eYDeJVxmkk=8Lq>D&CVzXE{ zk3|t<%D-C=I^zgg9bQ)a{IuZI3UOgyz+6 zcmqH6_$R>mbKp;)ww%4{7CiP5kL9=i>r?sWZ}0kVLp8eA2%7P+9$cm@`-)HjFCq0EdBptRu0RW9JTaa3I#+MLKtk#^g0BDq_m$$qO!>CLN)~bH5wG z4y4*M-#v#*6@J*VT8*FzXV1*J@nl4mhL}WDuC-x2Jfg&cwVE(^N|MjN6hr7FSOFtc znB=37HtRxNH@??gFS^qG6H>wSaSv+N1A!U_(1FfF&FCjOoEWD z!7Li#e<{%jXCLuingrX(n5xKFr}4fejbO%}>=e3oQ}d9~og!)RywXMyjTMQ}V~n)zj$o zpEiSPVzmGN0QmomXicVcQ=985huN(-yMKmE;a%^17q5BUUvaN{+>76Q#_tfLQ2qt_ z(i7(h5$>Koyh@Q(P0@)$61$lUDrfPVQhNIH8r>LjQuM2i+h2WK?ticQ@+-gobRPG^ zKgwes@(6zBSKrG*Eh(c|)>vx^!@&97eg6C@P9%Br# zwtVvQpXGs%dKiy+@FO|6;YMobNDGVJ-uyFAGS+Bf2>9*Di=XueJoX`v=7*p3qrCK0 zf5e#!=Seeq#zGR#i=EGLGsS8<@c18kEbsceck_{t{To00@JI5SzyE&- z%Fs4*hV_YHTee2ULSAi|@9gp~|N0R={^@_`4}b63eBfU{zzxTTEL=<1uPHlAn!PjV zxhC5nR=S;s-ArXIVQ9b?_RsCme8rU*y@yphpfWxcUigZ?;GaM6A>QzU7xUt0Jd+1L z@v-=RjZTVm)bX$%d?43edo9m?!SmR; z(%=P~EK2;?oDvmN&R6#CSj$wxYv~HOftd=6OZ46bISh18y4# z!$_$r%&a0iM~;Q=`s9L*9yly$Q#jpTF>TW(?v+MPG*v|5F4Lqubd(}Fc_|U1^ng2yIo^Aj-Bp>0 zo6|T{^5pE0rwv;Y&6^KUGAZHy0Lof^|K%^_ zwQqg{k9g?Axbjw45qyxAHVU6>dwk4Oe)eZMx3kYfANMGRvE$rT=P*t&mdsFB39*u?EdVe;7#RCw{K=8t)fiiWpl^E`T3cEF7p~#%|55&NQ<~B9K*LzTaZn7UiKo zTw|tyqcjFe%xGjulEy?BgTN}Mk}bs7J&XfQBO7*WG{pzBRTN#&iZGt`gy3cK zpQN4?BE=@u@d?Tg=sY=#LY5R}#Uz1|t(TgJnR+5lY9+qw`IP0JW&2cefj+a{ZrL2K zdGuo+!*_q@ck!GTJcn>Nie5@9@nebtKwnsXJkw-q3 z=e+1ST=&UOaQ5o+6j$&m3&C|~MxMfBA;jvVZ0ZMn7SKh zXHYD|_Jp{N;+dvA?&@9atOhe9MR7Ywn?(Pmo4^(-(_{1r?XqEhZl7~k--6e@=C!>0 zpZ}2`fAC{5ttF=|_`sXr@ixBwTfUj^{HAZ@=wqK}b@38?hy-I%R^ckk?%6$5%;fb6 zX>~}=z-*CG;~F)3=p(8$P-=lSaz=$9Bg`nHj@A*gcLsCj3hd54x@rVl=|*xf#2dGy zg8{7!!%dfDNmDtpk`7r%$m4*~hFN0ARm3ndfgiVw$H&xU>Sl&+TW0%9+T9r`2bo$@ z#&jE8@ThKsxpW{r$+jYEnKEKB_-s*CEqca9O_^!vBY8XN1GP{UnC+sBBl}Y-jzUd3 z*Ha}2DDWA*9R>3;6Av*9MJmmfLZ8rm zK!qriObCdi&!9!foTd+Yn%Pdx`n0;tQqL1{Oe|=iq=|{HH0#xxd))nd`M|XwPKxJozV|!Y}>m|DdfJHtUUuey7*Yr<%nQFs`60u|~}$PBtuB6!|(~ zt=N44qG1Y|RF{a$fS9SKt;i-h1t}y#Lw{@g{sz6fBX+y%MD7x0I|?SGAX`Na8GSSoFKy-Pc%TefxINY~de4=Mect$* zH*lA)x-;MYU%rF4zx!?M?w_OgfuJUt(ez=Xgl18aM0l4WN?cejSnD`huXyr*`>#Cg z{`cn}-}Yu6_wa{u$2;Dc-7Bxcr_Axe0mCq$t){pN*Gi0ej50p8S@W2OK9pCz;jj48 zr4>ZOi(d3Re&B9*=hk=nN_@$fCZN(5m9{jq29{Tn&5Z1Y!ttJWzK37>wO{9d{I_4? z`|j~QY>sch%oiAK(LsdaDGh}6nsB^9Z%47f0kQ!qd9NWjhz+?PNhfPEiR|FjfAiPe z<&Iy=+2z&vZKNUd%9p>4zj@=|@V3{zk>C5hXK{~jzALw!@6e{q=48d{_?TD}cD6t@ zEi4<_D;s84X?DJB$=)57=-oXq;+19dC6 zQxY)-F|V8&6zi;P{Zo=>!WoL2WOhZ#z1?q7+auJ_gK4R*yhfm=SUWUktbz#TYU4n>mX1XfE5!D2jF@>!c$Pm|vzheG0T`A$(5k^;1r~)`p{_ zBi{G^_wmt>eu#I!=bb$NMbG28FL*A82M7GGr~Oa<{%!B!PItH?-KN7>2|3lL0KU;A zD{NV9ig1*y25TrrNTx|CqE=*Mz!*%1aMbhAdp?xUUiVqv`M$qnXSs_{fj@lpE4as9 z@6MNf*;irC*DSBzrI^H37tS+8&zFu5G0NdL0z8VCR)BM@64_>G3`xnh5ub2lAs=?+ zgEe|1%;%Rp|HXXk*MB2QYi@Jf+X_Y(lGJ`Z$rSXoc`ZU3Og_nI>mxBFw6S;}Snlrf zn!o-l?smWXak5(R?BD!N{^|8^;G=JT4Q zns2_-UHJ0b-jQ&$xns&)wyzaGx=y~u1AIiAiVnfDdLmGRwN7uu+7M_>}-;c~L zT*+@g^I5#{ZExje&wT+`U2%@Qx=zS}?JhYLC=I4aYB1vo>F5$F1SH_KVDg51@es9= z^pkDx0gW;ZpZ@q~S+sNZ+=3Jn)@g=u;QkMN2v2+3f9Kx!xi4>c{TunnKmQ9K``|}; z(;ME*V;=ojVoLNnVfGi4&~SLeNOv(4hn9X-le&&HuE?pvQ^AliA(HD%wg%HKDXJoQ zPdU0oxO9LXdh+H7#sL)q-UpO57^66M<#~)Q=;+a|CMBqcAiZb70ObVR?v)wsmz7M7)9p5B;C?mzilEu}dAB5tg4Vju$ z)sy3{;MdAQN}gl^Ye+Fd22)k?tY*=?o=yqbOwaHb$X+nWTq4#MQr(i8B~d{fRyZHg zF;d1(7G2{&AQEecaUevGHW{a)q)?$TbxT%q9%?3BDW*a)mgFqis)^(&yZ54?Xf4SZ zlg#9FrY$)!U(EQ&fBr|F@VLkGs7F7V$3FIl`SB$U{nwCU<}d#A zRW!RxdNfouQE9T#P&XuFDONyJtU*}^t|q%B+06;2CYp*|)sPkAIB@7TIu(nZXm*j+C8t9QSVF+?8pJ@;X|-e9W=>YAWr+o%!TptKFunF{8LTu<>~jlxw$ ztW%JvZqqu-vW7D=bXDQk9kaIOGoSf1U;7PT&!7F-pYobNc@=m6&bzU?;YQ{Obnhim zo2hvXnKC9+NaT|^=lr$5De-}Nq99a$K-{<<&m*Kd3SkALJN zX|KA1&dx~AjJh`aKt{6Nkl)QyeCbrs^fSp zTf^jtA+q}XA+hshld+9K+3A5UQzBH#QevcTYs{i0cbU=m%y%7DE4GIs zMH*HsC=oMnX_rf?S&g1qLg;B4$KuQm&DkAhXBzBsj%s#E%^Ax49O`7taKnx0`J8%h zmslo}axb})P9;prWS>L_IG>Sg3w4cZTbRw5?VV+Q?rK!ih%Q%aV#(;*QLNZ2>mu0! zrmln==_AD_V#=7Nf?A_(M%ADh(I*E);~2*csXHMX$WBrDi0eJtO{N7-qn9;ir;&|e z(d3}WeL|Nk5)rLH`2iDq(Gw~}!>1?TXR8I^)QX^t*h=V06H~xdHO3jvUO30zEv{te z>T6hBaSN8$+?J1j;X3aBqd&s!Z+m+l_`rv<^%>d)+F02%+KN=o$@QF6wPIwZ9ZJ_2 z+n}pCrkbOx8QE0mx@8yx_x=7Kq;6_n`qGzBJgir1LSMM`_PA@I#}Jf z!e+%6uKPUBTJCVgt;p*W=2fCnnzRZKHMS9!M>VsUM#HQkHxj zYF<&z9rdh2YsJoD&fd;~8!q0!+yCzGc@=z;g;4_@*Dx=V+UGV8I2T=;{RzJ#y1!()LnWJC zv_{83p2WLFRiF~p9P+T{E?;&Bj!%xc{^*!`u|%baDhaDCdsknL)|L-{?4!KlUGLy` z|L?Q-{`>y`-|%0)joaPkw!HXvpDX;K94Muy){rkM)_Z+9itg(b=NcdN2VmA>hp1@_u8i0prLjZ%4s8mR&C|<` zs5-(JFtdhSGPX7nGoM8|q9((PdRAfFR4@(1$;BbZglcON8sBAncGzVFZca9uyxkH` zHuPIh>_@b%&{f6IZ(!I!x1o$DGJC)Z8T{b}J#F~3F_^j{DNPCy zz3$LmM=pt~no}+3*t)`)NQx`s<{0G+PFu24C}ZVkvSR;{5!sqbSzIqvL0gMkSn{HV zsL|^Iv)!VGfox=SG|iH+u2Fr!BstWgHssT&XL#fTA1ZNX7Q!}@ zqS)OS=g`U$#yt692~jRvu`*8Uj&S1)+~zB9$7eqGNk03f zFYt)(zB~TkKY`hLLIy?;KFamintZaRY&!yloy9(HeBJB$t>1el&-h=z#$CSpYdQGz zbyQf)6c(aWz~z9_9!(IA+?gdsk8C#=iQNgRjFd5wx=elHEDwA5!+7hv-pcCW5-KFZ z$%gf61=FTjTf_Y91s3ximgn}k@Rhgb10VV)e(YzT$lbs9d${x0ej`z}EH3P^DO+ZH z`}l6d@$p5XvXr_d8z;>6+TdJ+PMWxE&`Og!PsyIj>@#*PD21+T!k8dIERpWyMs)5l z&QR)_(k@`Wi)|OQZHp?Iz1lrvVM@x`bm;XKMo)=RoERt+pXgU>v9m{u?s4mh$xsk! z848k5_+G58GmvKmyKH2l=o8q6Sl3euyP*_A^bNMmMU?M_k*_T1O2e!n4;p;}dL!nD zr5n*!6LxBGYfwOlK`dD>2TUlbpdn)vB9zpMq9qcnBt@DMhtXP2BdabuiK?lh+sa~^ z79CoQb;9#VBjiL$Vw|UPhf9`3p=2w%d`z;{#C#j6G;0P8k%cb_RLH zhdy*Ix4XmbC5WSl^XS9x{{X70;%{H~Mx1ph?ItFDB&AGUH+`koJj2QAh^C&4 zn`yg4axErXR5M2>gBb&HRDewvj`F zgQP&R+6o996?xS` zrLh^3*2GfKTH~CfA4OZMwZad96vTBTg^0EqS2xp$Y9&EDE8;ej(}**cS~sMsVzIMN zmsXPQwDlyAWa)hw$A%&pY4j00uBp2gPl?}EQ5uy4WYERQ zbD(c749b`(*i-(0){z`NDI0Xj#5A&A9r5ko`d!@Rj(6m@{_y{yYDF2nM2Uq+*>q61 zf~A>6t}ID;v9v8(%aQ^IhFXy}O_x*h0)1PK>?n+$IV!%%#7tQM6fOA(| z#j~FNfB56S{7c^Zkq@(HcNiCn>{@h!TpMzw@F_8y&)96%eBZkO z*ki#O=I1W3I=WF>+iXPw5i=AiNXG{U{NHE%9=E*3t@w`b`A&@LSS*%PM=N@}&1OTr z({k7ExGV2`$Ga(GVY7+c`Ho-D-M;I;@H@ZzJACM0KEiC#5{-zo6%7&C+1ugSzw&hM zbN~DElIK64`4vmTo`NyrvL_W!83&jx$Y~_!7QMGa={g?slRw2jzW((*=h@FDcn?L$ zMOsB+?&pdD3OV)0tQ;v8%E<=WGlZ;2apdIU2?WIxp8Q|=_5c2Kp8kyA=AWJmI^3>;bs8=JSU)VQ0I9 z!vhM1!#<)zK+hCS)lx`AHA1p1_Rh2EHl&bXB_2@D2+6Ur8m$_({Tek>RC_Z@lnqx5 zS!}{fA&*;h-QwCzw}u5i@x^$YR|YvQNY!vGdVKk)9QVMxnA~ zXx0wh7*sAKt*GjTJO)b6xDd%UQeU}4IqB$!Uf8BXqJ$)>5a%$i#m9 z8b_%bR7nsdmb{orTx_%?*I;9bGWy`V7jVlzZOo`+3oyypSu-USJa=kN$}t;;&!+ zYX136@8RcuNX#uCFwv)tkHH{Qg3e)Pw9_n*9yKl<(8;gLW4)0Darx6&*Iej@CKNS3TN z>v+M7Uc~EO^IG2c+BfjzpL;SN`{ciqm4y^hK60yDU&FJ1|Jht~i)(oHOP)`2^?8O% zCp_Z84`H?1@U&+<1HbL3JFUPFB%{ey5PBYbx4ZKrk9;gIdEN^oY~$hxmo}tsiWzf8 zIzMB{-3e^h%$7U++qM6~CcS8snkuYBpt+27se6|a6Zn=!%3 z3AjQvZ+Ot79?bKe{XAa%hQH#YpZXNn-05rRS4Z?W9ZzPCh0sG=6?`WY4{II$$x1-? z&Xb0K*=@;j#5qgdF6q`=;>jA_D@rp(R|TPEWRsz?6eX^p#sjlP5_YyDV;aQ@*cutJ zVkRQ|qLLM25GfvUDJKk$sSy$Ar8X!d8)aoQtb4+kNRxxd=mVyUY{x;yFQqX)5r$DH z15yp>lPt#6&|~_Z(l~NE6H;vff`{l)DTu#ZVX{7F%0Q6LjGS;oFEk@#VIr!UafH#6 zwGv@8Sq`hLNZN?@Pn6~I=1L(KM~RjgSF%~uLhRKlk%tJuW2{3h=F%j2k8wx@p9hr^ zIR%Qd;$|8GRE}iDdfe(F?O57b;ts`tOeKkxqB0WOK4o|5Qph3hP&Ex_cK3PLyWhp5e)2~MH>{`^3mAIh==t7z-ILFJ^b;5j4heLS zaYMdhDOA?*^Z)Z#_>uaGuMBX zcm30Qc*^6S$SYp^$HbDEEoyE!yn%Z@?0)?3r~ei&eCF@*n@>C7pFZ$@4o{9*%;tRE zo$t(TuDKQO`p19dVNZG@*WGx)+5IcQXl4fHRZG>@wDTpZS%A|drHK^gduRFJhd;y* zJob^i>(Bm@|NFH6!K0t}ICjpSrI;D`L9|mTGNu5zU~9))-~PAU`~LUlh0l2rANjzC z`KR~4k57I6^AIApy6P&v<=elF&8Fi)k9{Q9{>ukxnmPMdp6922>L+>0AHEoWe87ck zuEBQ$ITiE*iEBzDn-k0PU;an@@e5zbH~yFJ<^$JW%iL9vVAeG3TsTK{)s^^7hw%YJ zM4fFRu35UwpZ?Ly`1Wu7CVu7#Pe5m2n~2pw$r{}cgfQ^<$NeZjaL;>Touod_+m`ua z&cA)^<2>jQ59if?^%~|^oR#o{VZgKt;>9DL@Wdx_@i$gH_t}5Iul~>f#Xo)cLmb|4 zJ@e&^uf5A%xc#ke$7}!kwfy)`|2R%%!upum&N)n#=#JN_^`F{`c{&cfK9Q0b?xv@fMRJ&wKW>`S(wJ3f0aq zRn55FqPH7N5&x#FZq_q?_}~5oKX}pedC+|xz&G6GYq`~JZ%fy8y!GAh;Z<*V z9q+mJ12oNy-Q^k4H#Id)U9;T|{J|?;$@Mo}VsE}Drhdhcaw3MvUQ_e#x4o4I{>Y>G z>aVy1l`61aV|0zAWea{+lAv}uWtO`;y!Bo0;4a_#bv)#O58^)eyf=5c!yP~wuDkID zp7!g%#-IH8EBV6pH?VMX;t*-uU0(XiSMt0+dKvY6h99W*0fH3wb2X?=~h8chTrZ@7j>u+Rv?pDlh;W)bKON68A1tZaxw5ynfEBMXlJ)h(w zAN|*lVVo5oGNW;g<2Ro9+uZe=zE!wPDWNOFkzeyqAO2U~`<{Oy92|4Yue&oLE4=QO>l2WAo1zKrrf|LqDtx(ZX)eu&JbZO1( z*5~0|MM)M_FBrEY3?mva>4-8I!r>O}fY}T?M)Dy3Ybj++7O-78g{`b$NydOtLQqv% zey^=DRXrtBi`gJrlS)FRNz|W^Oaf;ZdoLU6qA+MYfoidXGm5Z2p^SsXzG+R=NOz|Y z2ilw|-lKPRrFeFcTpL`jE;ky&U>CllnTl;5M?hg*Mahxuj4U9maLWiuSo=m3LyxW|=(8tn23YLDa!-u=HivM0DC5kj_F99P?=UkOwYy-`1#;KX?ChYN zo5rAs)&)JQW$w-yr6ntkYwEO&O%rI3n86+68z(OQ)$ zGK~V-2(a6)wxBEYY-0Mx09}u39Zj>K#DKAuh+;eRxcP$GTF3!4c=E)?&qax~a4Gn% zC-glSgL4*DDXP6W-F8bJEqA)x58!j)hA(`Ad~iMWjw4kKX)M&GA{52yrWXl2B+A)@=APgXurkSOvw&gE%3*OP$D#ns%a@9lR7yBN($&@OLO)-;b=`< zttc*|l_U(?WsR9N3%8Z#vdIkPCJuRKe& zdzP@-kWLOJ{qFR4)fEP@%%%is7>q^jSX5)lC!TCHb`U8~F&eF8K^BxG4{0yOp1L75 zGfM0*O!6Wo((53pH%e)e4;16byXUAEOIRNfR+og7niR!?t}7vOYA2GZIGHROOHmcN z+mf3~o=xw`DPS{{)|SMlW>ddsk%5)DKM&tTdA{?f6r-xji#ttQffoS*_u)r z31)}}s|?N>DmSBQB;nYYY8r4LZm=PW<0^#`3n_T9J~ob0iMn3~4l&!IXfidnX>s)&)o(bt z>GPPeh={fnLIGnGW@e~n6~)x3Tu~S)c_alHC34luX>qhA_9Jd*DVX9okQWxE3`tw4 z4K_}z?hvqhI~09_%8KMO6W< zwrMG*6*8d>j5i%qHA`I8(03?vOGFf#{zW{+z30^JurhY3LzP`OMt zFG8cp%E^5Y3uqyMmr7CDL>Wd%YAR@&Jg-nbU}8qqj#L>j63j(Hil=5FD=v$Xl>#+J zVhECJ5F=C#YVQi1tw_f=5;rT%lxq+|!ZtOfmLznYi@ab6WK&a=Mu(0FsLAn_X(LN* z(TiH9yf|fQ7L5%`I3lJ%4uM<{&O}y{I-@l?M|28ezY1i+low~gC_)P4q`?^CRI^Gz zkbZ5&v9KtpD`Ive222X*G+FYhEGzMwETXgu#;)Z z940VRK`fAhQ2wX1=%6KdLPXs+TjIzgUdXW{=0ry0^9Wn%cyg|YMKq(n(1q;Yo zk&C#HT4S(Aku;a-6-w*LS4mCW7i8{70xXIW=hcj&C?ltjk_}6UvZYdflx?h*=q6Pu ztgV>l26B#5p_13qIgyK#>plidqp7aC6-6mlU;H>RwnhDGd3gt7o^!Vz4BNJw3fW?P$m&K1G$+|T{wqER{ILg zuyGh22shn`sTZgWxfeNy$^{lXRGT2usM?aPV>VyVA0A?tEqlA?=*J#w3l8zHAGK%$ z&CH@w691?W>5sP3QOql7Ex|{ut1wCvZ`v^G4rf})25c*whmy9KS%aOotd74#QGwL7 z6xEWuK&}OMa@$DA62_vH7I{jPI6CVLMT|#KlW{31=PFNzAtbjM5louv(L`6kCxdT6ZAB^RU5$+izJ&&HUBcV%@8Oq(49n5=vdtH_Jqxr{?c{0 z-97ni3lJswMk%lnLhuw4Ryj&2=o0bU4YsYIvRDix@I$1o6@`dPN^F{Akm$CeNhd38 zYtd-54{&nGNW^v{%0#RSWP27>PSC@KWF59xl(h^ImKgNayQFoGTCK?0Fceu%4#z9h z?vj)XLq8IOCisjm0cBcrWih(oeH6iYTj8pTF^QMHt2KGme9`Y)pWATe+$qumUeIVO)}J>p9sM+xZ7I!fBKn#B28Tpo(m=-OhOolFBD z_(1W67$hLqYPqhtq$$ThVH$DgOqF3UmTK)W-e2ZoQ&a3hknWsG zu}AeQj1w1yh&c5ct;mA}oM zIStAZNtlvxC{grRljro{#W=!1wi(^`C|?m8Nt(5KhBg`e3Q(jt6)CMj7g;H1(Qzq+ zE25{dFr|z#Om3edLRDI$wP=>A(;IiW!MUstRSY*(j7r463oZqEv~P zl;kSLB!gPHSzDI0LK}B^iBYtjmKjKkokb9xD=VVnm;pnY2)tQOqbySh+q8u#S;&D* z4{siNcCWcD);P9b_!P5S-hzTB`;ju+McbBic$2KAQz3atnn@}^TM@^evg**zVbAWP zm%A9(5KfMXU%Z}ZT3Mq<2v%Xw?xU6s`O-~jKM?9xqNKDX#esV4Nx2Y>kp!Q1Ls6Px zGsJ-PTXgH_^GL}sj2<;6bOi7i49Rzxd5zVO zl)@Rq*pIlyjG`Tc0Urados-uiWk)u?Y3wPs5(UHvIdrI65p{*Gz^aT79VTs2vkE=0 z;2?^WBu^dkbPT3aE(6mT*`lW)E*&{a?xkh2b&8^=gN$*CQiRi{mH4umy2i##sx3v& zP~M|bCZvq9mJ}^nft{a`P2F~lRvE1l1~JeDONGJD8@0f(=DP z)Qv;uX<_Fil(wKTAyY`W{RXSURLP8*$fCmgF~*T~1yv<+>m>`f12ws&$VQ@MC{egM z#tLt!jERzr`0D6s#XOBgIu#0zWUHxKM>GMG1=vRwa^<9pNM259EjGStj5w9hUSpOs zV!cF-17)>EJ0m!~6Nd*i-3_HHs2GIVTU$!VsHmi{O;fYh8D$il^1e(>%1W@OoFGOL zl7^Fue5F)yE?u72wbo!As6-hP*;FKzrqfPX;Yw+FKNAN=O$&vrWHgjJOB0orL?NIU zJKZ=Ff%Y<9KUqW@!5xYM9StdrP$Wh@99&}O%f5n3$2Z}xJEA^wfpL96wP(;~PHfMh zU4|hO)Ig3x+RVcs<3a(e6eVP$&zRcbmP^w7P{v^&FMDs7F-QPHG2+QReP7W9W26hD z6f_mNIZNE$gw+KHB;<@9dNhVep+p7SiSINy(k5ho?xV*T zO?C#9!Hr(HZbnkDOEBc5v29HpBPs{_>oXVwvxP*^uSe40(Q}~QLysF$SHsykuHO&} zpbB>8Fry(KLUxj>lyb(@7H7o4p@d9M>T)_%2CxcOJM2`fQi?R^TX2ctiyO4ERA(Fv z(_+X+Nkj6HY%18jAYHT;(@SO!Jp^>WC3Gu@QRoXyPAbNV>J)_(sw}zQL8XyAbW_TXP$o_@Ae1r!AECii6l26|3?&Af+JSQ9?gn)9C<3`8 z+%S?$hYFEc3~IRp6teFzjnISuluzP(nj}5l77Atps*6#mkcmEGR6(ae#z=@_nV_5^ zDauN#DGVZ_Co{5w+(em-s>C{@SRpYgGT8|^v_$#vw1K1znS!3uBD`^wMN75rAP#b) zIfJeoc?jf9N34#iw+^+lfOGpI_XzRco>CTDa)LRO8I4o#@~ z#7Rqa+L>JrHzlL85Z?qqFF+#aQxUk_$VyqXspOElcfhJU!%Q8r^q<0xcH$DlAXbOPx6D{5;jnu znd9~=RD?XY)XEaRcq~NW#-eJ4_A>64u_uRs@76Gi|B<@l4C#1-@;!AZL~AI=14dcW za)BDBFoftYkLf5y30u;|L>kuUof(uw-mcL&%)(%5O}$rPLjv!yryM5~IwbKZH!@}m zUMQxB%2`ZPk#&WRpmM_dMB0v+`qOng+yJ7B2OVIZlN!`h?ZO^ML1BVHq@2FG+MF%bH;1~sUPVs zo-n_1A9Ma339!S4Y&B-`m$zurx~JrUGJ2}zLcsB^!zf1_H^h|0irGr%CUAi!3?r3t z=-N<(8;nMiVix!VnV|Hfg(OMrJOHMUlf@J$#S_L3?SurT5&9BQ%d;P(Nm0s3(@_#7 zXY83m-JZ}72|^TnZ{CtCjcYBc)R<<*u*p=%TZn<2#q3ZOv1G1vgVL5XWUNBE7jmBb zZjAV)mjWrG^A?oBOwsccrj;#|Fj9CKN^6N$Dut@8DO$*9Wt5cWGL4Xal)2q#CoS#d zwwMZJXHXL`O%a}#PD(n9otCs)QJNaJK4FX=eYBx61#1x?xm9&IbOu(&xU|HIE*#gMut7XYha=|o;V&^0c^D}4Y zyA}C(EnJ}-1k}7Vzz{JrjjA2G--?0ZOg5xx>xIGr_&&&*ycDwOXl`*O@xVi0D7(8b z$_Sn0Lq=tdF^*JO%63Ec9#=OgX9#1YtVhbYmFTDC5>!k{;nY5$`x_}mW2&0s zW`NixB@`+_N+Zq+F05jhYJ+g5Frep-**Q&&3utO^g*>cDB~V>B!|;U@avo@0ORkl8 z)@Q+%Rb63RmP6kfbV}Hgi)`?M%+VOp2Z|q-;6Np20jsA@LzhA>A}Nu(RK^;Ncxx9u zJ@8`?rmvChmyU?lEP`WY=g>v62F+CUi5v29Cf61>YluPQ0p<7vnikX4l%c_Hwv;N8 zR$GkI)OEyf2B=$r{ukXn|@u2L1EHXF$Kg<(i#~7 zG}dNHk*-Op2{_F{G*BpX(bH?({AG+0=LvK9ry&(5WZ49{c#&LaE?-|c9polEHBM9o zRL+-)y=YCDFL3P+wU!%7=N@AeAqPq@Br}S~P?s@HL+KJxDI>0U~!3}MpPMM@dS`m9s)dx~lNX?9BHMSDgwl0?9JW(rZV{wZb zTUl}#DIt;<73ySzI&+q?9myH2($d8^k&VROqoP6=OG*N1sEIaH5L<1OqOMv(E!@B| zBtlG>rX^b|>BXidm6}?6qR-UluEY!jWqk>q3we7&SshBC!=lCpkLm|XQ!uU~C$P52 z-*4n|&0`>s@=R%Yhy-Rp6UKyzBYITe=0ey!TWD8?m;$RWd|vE+Cbf$%Wl9bgOJ$sr z?l;SlB`aW9lXmt|?HSZ&MT{FEp-S07H;T|_ph8pRa489`jdbNPpsbQDwDc5HM?Xyw z69l5BF*HSpF;msGJQtNlHx=kW3V~#VuchmnoD1ooV?`w%Wyf1d=nfDDkNMJ?c+ioD z6KERTUX9tAi6etELd%!}FhWsO*~lgurBSt&4T(~yBI(K!L9ZZ3(f1(W^yvebVwBWj zEB3z_163i1)3NdYYwFCl<4AHe{Q2Msl*B-*;|Ym zEiohr0;c0UyU?yXswr0g4a3W0Gf%k0-Tfn%e#k=z2jVeuxWwn0lpb?AJu<=3U?!uu zK%Xp73Y^BHXod;+He88r*#2pJ2E)PYlPxjO&H7^<`3l=x2XfQMpzv5FI6O2th zRZzk1ExJ7%)+cCA|MM5@woS>1L|~w&*}{j+r6gh8cO*sVoEBj@CH%S2|FW=NI@{L` z2lD9z#KUQJ#Avb30-Q5gbe6@UXrabf7y75?xc0BFjO!hJUKuuEUC9{z`Uj(jXwui% zP+fY$bHaZ4CGa1NamrYS*sPt9TIddG4G(N<8_odD(KV$I=lU?@+bjKOAfI8|cnKV`vFkg9-ydJuy-oW=S(98eLW?kR10$ zefdPfLRc({j640Rr01VwLBq>877P4yc-(W=I-?Ixe>qc%bG$k0=Zu^b>B`=W_HDzD zJO0}sH}G@dNf8(*k^QAQJE@F&?D#Y~lH=YG4VG6@i6oZZvHgfkm|_YM582E^IJlH2 z&`j?;d0itt_uk1U;)TH;Foi4TLc1{ir_(#x8{UND|81nximWHv<<5B9$)8W?Bjj>7 zk`G2%=}QLfWDA-pSTs5ku%p!$Q&oC_6rELIJ%BHhBMt7#UwVBj>xMYAMf zov9IOKemQ8j~jf3gE1d~j6fflH{`rf@)BAv2GFUw;4btQtJwQ)xC(ixScy(h0Ba+3 zVSuJMI=Wblct)&ChbRbR@+aThub_ED?7+;Uh@v&ENA4b?%@LiKO2*wHQg)tB9|~ca z?_m}ydn`+kx!!D!u%7tdJ;|f6!9$3_)W!G_!ozfWBBexj;l6j+FCm~+L2C`~SNF&| z%0My7Qpqn16y{O{$E~IvpJ*!R%Rk}%M`W&_&Ws~t z(kVYxY|GTUVgKz&IphDnkR;>+?RKD=S=STII(f;|pPuoT#Qs&NXPY|<48|QfzQWMJ z*4!Zl4wh6oyi?K?-8?VkHNHFP@q6k{zdKo#BNHZV>$nQ$b74du@f}G>gD}u}FuHh5 zQ7L@{ak?fbki|&?eHd;za@|B|N3h+vF~*L}4XF$t^u>VVW%_x@QlhDCv39tI=c8}1*y znHY>MjI+52r=NbN^&lR`QgKPB1;ffP{Mbn+W&Mw5Qq@@ZE>Q%0Ox=xL zH?#*Xs3W@ZV~=QMZOZZ=KO-czKmTCA-l@Z4b^Fvdsm@XPK?=Dbb2Lw?m?&8k>zzb& z!YL*C?T!79SF~30-e}S(F9OSn+qkd*<2DQONzs$y{U_x2J7vkVbI0G`8E&L0ARTl0 zulb-I2f44oOuK@wq?b=*O|jlBjfm(uc9dY}{pCce&)`ODgR#Ss1a<=CA4YrM1INt; zkrWe>H)!o+!?^W;9AxgnR0Qf02W|_kzGwJXD$@~BO5B_??Qij~I<4!4+TuMA`Idq3Y zk9%1__X9}_*(ZG%VzAg^V>326x}Ld}8AoU{k|G{u_lbW&j3=?Z4xh$PvFK_{JYG}7 zJTuj1F|MJZ*%%$`jo!!n-@;sL){wV1#f; zS3Xz9L$H}sr^PHB%%}}}e1~F>;SI#5su)DAkhSh=|;M<)(BDzL; zhkv}V{_RA2yCYkK0s7y9?bZ8E?~#+HI@#z^BGbFQlTN}SEA8zXdHa1ZOvvj>swrZB z+BTW0==4Pc@{k^>rY(hdl=Xx>Ka+0Xf}PS8*s<4t(bE%ED?0A` z`TYEa>v3nly^(Ul4>pQx4xI2C9$Wmg`xf}hxQ9muDq_l50(2Q1roY9w+A(@_{n+lvWO!l57w2pl+j@X1# zvPb8eq6rzJ&me;n-aCC9fmJ4nu{=eG)@Po7UW8N?ISILBZ0+=Yq1}|UZAhJoFL^<8 z;{1Pp;@&sxFhC>WBe*d1`LCQlKe7G!E93r+MBvFb4B0zbJO&>57>DM=2jHP(T}3T`JIEx_lX7f~CGeP{Gg&F69g6Z%|G`cROY4)PLVg4P;- z+@Z}@vrQ>Kf=g(kP58@ZbrgV=x59nx_zMj=k=vMtA8r_RyHX$0F26 z!4fCbyt4~+bJQ*J#AYM$@Q1lOnP6N^Gu|UIw@)11&8D_0ex8jn*Qh&U!7dt1F&&U& zyh|d}<+C8miT!d5R!%eCJodo#j<$oQTin=d=yuEn+YM=e5>l2RWib&_a`JP<#z0Or zK>ly{DJ_8RgJJ;Fxtx7VwUY8$$+ZKS+1yx9dhu4yBNi(09Y=WE0YBA2CKUA33X9U;F4#?x_d7D2R11eeCGaM%j=ofMNLba* z3*8jE-q4cpPd~*}w7*A}J=ZXMt%$@Zttla8-eYcI6G}DeK%d*UlcVbi$uGflZ?_QS z76tF<;WIl+NI0&Q`yU5--|@1b*~8zsEcC8$-56#tF1-BL3#LMU?;LM8dILW?>q*fj zaP+|AvP>C9M_T_LksR1asH%P9Q}V#4W@j;{pov}0qNR@_r!&r2NoIHlFUrW}V?44x z=p*nDO-es@`mu+lz#=0m+Si1TvBQC5`l14}3XWi!uT^nL7!_F(JLJf)w!{=vlkFi3+ApI!9q2`@ncffh^=uVlzc(g?y7jlkuK1a;BupyY8 zBFEt)Mu?e9^hi@R?@<^Z7kdV*jrrphC9M%-U20~{C-!T{Kb=`MBg?{ZztfIj8GXRm zubiLPNO?uV-xkKh3A)Z}De@se6$!b6r?7|ksnYHZ8A29iXvhqb3qI{fB1E+D`y0Bq zAS5*2zo^cUG79tPo&I)^DacQXqy;r-U*9lq>-*sVuVO7WexZIIl;%d=@NW z4p!eR20{1ew38;14ZIzUH1(A}NF~u!LSSl;7e$gVWCSFW1owuQ6L~!|`UPdc+k3zU zDKUniw&O)f>x#*AjJVP1^l$%Wdxxxp{75!_JV*Fs2`981&!Ihrp!v(@crrn0nb-|7 zZycZabaYl-6Uhxv9uXEpu{7djQjN647OA3TS)#&6)Z+y3JrWTd7*6YrQgT>fRFNW) z*tjUoLZ!_Rd^k%vbNu}ieyQQZyKl6tAS)tM+$OOyJW?X&el?FyF(e56Bd=U$lH!A4 zK*Abhvj`y(qw&#UN_47^>k?#PT z`04Xc5hiySss)}ZGMsB0P&?&|1jDu@^t#Z@$)52rYe3N$|IB95pEUW=KZpR=$Y>wp zkwxF*9vL|WKA0lAiJ_=j_|tk1!D3d9ZfMT2=1GO)x*@udi*fqP6L)jQ>w%7n`;<-` z2lc6jXw?(_?${Q@PhB$UEaY=68wI5u1KFma_Xw=f#vJ*Fho&bhIVHCHhK)qIUXfD> zX8X1wPhn*4kNf_#(9L=Ov7cYr(EP zwkMB0#Gjj?bq#wKFm9c+4ESI%I6DdxBc!0yqYmew;lb9ScA529)D{=}=MQav%oUDx2 zz+(k<${8gw+QI1eN%b>d^O$j4k2fyC9M!d8MaUC(>-$DtbLEE(Qo4lR$*=F)^{$!`<*)!?Dm{NU%|q5plN@BZP?)&8~6QaFB@L#UoWf zvQWH4qQ?-rIr+5EUN^?=j*N&YqAFfvO_YnHiz081?L7kU&V{lnV`7NP<1+?Jb+jYK z)VVuTRLHerNBH-O6xP3e<|2vX@=iV8NIlUU#!{nr19CW*`=4k7KK+d7f!yBc$2U?c zl$sc8!Sjl|y@yt4#!Ra?R?nnT*)G50?G9w>^JkKrackr+=NYhfkM7$QUkden;<&wq zUTk>49SAhT#({XjmNSMkwu98-IZ96_WGxXzRHtaW9gO=sT@!h!Fyf$&CC1KiJ;*At zBv+lBBS_FSI;zlUb&?&y6~H9MdSJ|w0?rtM*33X4uXuU}-?8hzW7K^92YOmLuCL_# z77IQ`n@pvIpxd2e82Yrp3bG$DwoeQ=m5g(tQr%iNX zSR>l;IqvuzR~Uh1P2mH=G(ihtL-H`gx<(`{u81k4@0@=wEQ@k|>!Fx8pNR;Sfrx(aN2&MJgtaj{MgA$Vg0}V z%{Uytd;=M@*V{C)8^&DtFmG+!1~MePvOVI4{oatZk}^RyVn<> zz{@kGH~M~=+pv_LjQspFA{pD>ky4?4!qOJ{LmWRv3ajXZO~lCoK2It=DL#Vrk`Juv zJDdal{q+y*YT^|0kCup2Z|43;3My2G!@ZHOd*DtQL4Z;+#g*2TaegM%6@A{(`#1FZ z&gd3aADK26rusYy14m{Y@`Dp__b_1-dlJ31pyNs3?JWdr7~(dc-R1Ys>5uMdn)uv* z81){-{9`1X!%4yPsiC5Ld%e<+=uQXmS|4p< za|*v*7=IVaS$N@@ycS-*IQP5o{@UqVB2h?WIu`!PuC(3}FJZMxDY`GB(-jfCOq~uM zZ0-X;dlcCZ#=s|F8&(jFSdXxFh|^jRb$eQ9mpk4!Qe7#F;=8~pb~O4Hxln0Dr!KMe z1kDLu5?1D@Hu@w`1UHQ$IkUzj3o?YH5k99#Sh{W_q#vmuZ%#UYVt1uo@1&Y(Ug_P) zDHghp(GX8aE68$!r)P3i^15>U^%wm94Y$O&?v%eik@mpN9`J$6#9?!a3B*fW%kD^V zYW2VZbH;t(w>vp!_H)5+18xV_p{5mc2{{ZIO*_jjKj%Qqp%*0 zbc#HzjN%k*7>%8A3~Zn2A~4x!Me)G;RAz$`_q3J@KY!t*!qI+3Mx@#HBSHX0V2p$E zw8UPdJ3@L7!j;jLq9h5 zz^inchJAL554C&z(I1UsB&w$Gsh|%=4+!s`L}7Fbl7X_&RZwry><#}&X#9{Z%%A22 z(E8{^lSU_I^I`X#`1ZEpq9jr5XxIplG}i^I!cC1ODST~oSxLH4)w%wusASgjGq8HxzJ6ucWXCm}3CSTzh6JO6bD$+QjV~{s*)A83?SiHX z%M0W8J-l}~qB-O=G^mwwj!xHFM_R_R;ojNrdr(>iwjZ>u!?`eqkk&Kp`3c`=;9eU@ zpHVdysi4W@z$QT|g4KatgE5cwd_t{d`Yt2a-#vudsmAx*Zv*cVapEXqPWKVcmEj;Z zeZ$V^2mb3=#xM)kZvva11d<^mMg$N(Xt&32KXhI$5jjhmAMS_0>myPYA8XF|UVj?F76sp-NG9|>*7w2vtMt4!rB=d$3 zH-3b{g&f8%SNwcJ*AfgKDdMi($g0SfOg>i*F@{Pk6%`M0aq_Up6v2AJT92rfM>g4j z2W3xI%BiBghdpUH>9nxaO26GWq~pK;%DBIi*Uz-AliP;xJIKJ-m6nzO*Utst-r=~@ zuV49k`F9lXtk62T8_k5Y9l;`(fK+<#)S6}__@KC85+jy4kdfkI*4f@)>GylsS*~xf+%;Fy(m&QFxH&mxtcGE@_Yo%X?8uY|xjv=}CQcfX5JM4d zpb9pE!L2pA+YvTAO#ya$>l|A{mmp9`PM+({`eD$G`?o9F4NMvClq}fR8SN{kjvY$% zjCiM|jP?z&1I-Jm)KC&6r|&zu?O?`mrX2>0;uy?gIDXK%Cq z!}hrz?Q6yISnv6}?+kmJefHUB- zn4wjmK^h$jm2;LTR(0($JD=v!Six zB_Rs#1|rBH$ZU|~vwVqbASsw5-ha0`B!?`xfK-9x*bZbL-*!NfVAYWug~4DFJULiA2Sx!^Tn)wXOF>Mrs||6%_MjUBS3C*gV3zQIGy;_|DMm$X4Lsw8;=rk_x^NEIUn|Gzq?dje@AN%vaIvL-vOak}~J{f~5*R z8flYBJ|Pl6!y>TF?C+0Qb!u`_u7I#D!aNC*E916eRZ(vUg+=0b`2n;#X%uWRY;pGU z6;7{SA}mN#d;(4#7a@tT>>DWy?h46Z5yU`>BL~5g(WZF!Y1431Y&OzCVGEXG9dlwZ zCfWs*VPW?MRu2c-m;7t(iYtIy# zVM_vutziy=0R@HyJ0!#m>DTAUu?AWc85=ag2gipJpM4lu`6l47Gt9UQSp}t}$kqE+=xCdH90TZe?zM@k>}vuo%9K$S%QX*omQsh7kLE znT?zcs?!YeMyL*w6u*^`b4RulEQ(8_y_87jjg&0*dofhOn@YG`csUw3xjYsJTGD*N4Ukn}MX}d*G5f=bN1yKPEHE7~U15NRA7$p9!2uO_= zZ~#Hk;; z437XH4jZQ(8hI<&1d;`JfmzUPW8MwS>YQCoFjX{beBUD>$i^W-o1herdp`)KhMZ(r z90Novc)_cpn}#Pt1SrlpK7j0?3%<-O6Ab5##T{vmOo}VxdnY;34|te4TLE+ol7L$lCK zkkpVt@Csg(HaWTV#qW{*EPEu=7Rx|MwC1tG$yjUXXymQ3wAf6diZ2PD9N!3D9Caa& z3ycPUw+1z%(lB*Q6|Gmkn(9uv7#^ToFl_&JmbR15}KPh(R-`;0SI9R3@BLRA;O?`J|#ZFC)0k z6-f$axSrDdf?=7dhYengJRHcQ011F34b(}CMzVj!0i6U|!aerj@OY(Z#TP{e@a(wf zxF=s?Jp(S4w2hw;5g^_#r-mu0_vofI5;~3uxI3BV5mAfaW+-v+u|=fVv~rLv)RMc6Tf%W>)muW7flUTe(2iVS-w?GFDX>eQ|nI)ce z6UGxkPb!ypPng7M$b&$2yv9ZhR3!Mk;GO`XY&=kJ723|p$_&VuqgUoYOjCvg)`5!%*rF)HvOsAGQlMw? zUSZ*ADVRm}(CU~Q8d(qw5=yHUm5d5zJr>lce%8uK#RCk*hv7>A2bEY`K;Q5w7GeKN zY`_-L%@taTtnUrX6fk6Qya8fJj%+R|VvA_}N53JG;2IlOERcz~VXZ-F0e5NW+z{eL z(JUZ!agqv>9j`{Sh=o!Dp;?naG&N9+n&Sth?KBV<-VvnGW+SCU9;0kzAU5C(J~>v6 zG&?q1l$UNSnvfwuYj}#xV6`LBjo^#oGl38Ru|Rpvfhx$QV=sd26{&{3R4H?&9UOK> z#?Z+kFkUg_ija!JXy_0zQ%)4?LDdsb5{P03Y8m#99t7Jrycz8v*u%I^D;W-oEt$Lb zowBX*00+f2N;Ih&&mudjFdrJ1x3`E@)CQ8ApjnufL|c@cox_rF2Cm#($YQ8pMG@@a z_#(6!+P<;u0_LZ)8NJfW=L%+y-!)`5+#r>BroJTHW6erz9v8;}CP(Is z<%X3&rm_G{upJ}}$%+q=1YJF{eex)KRbg;s;ak$n>Em!I_?c=j<iY7ZlJlN#mFfgu=Gl+MPxG!6%7y|9+g=& z)LY+J4qiPLFtK2)MX6^Fc@)$df@2yGO%_LM0uyv&B#BZFk4^6jAcA?6kna5@yF_UK zSo45c=9H~Kj=)5T_o{>5_Av9<+PDiQ@Y$uV)wc!m)$vBC0at|FVxg=^;>O4egk2CF0s2P@Y zLE2QjRiq};#u;xKI(YClKps5!5p`q(HYRj41a6UqW|=e+<*R2L$9&Cx9fevv3$rM( z8KQL75kP3QXKahWP@BYhvx=4sV<7J3G6fgpErQXDrh+&s7? zRq)7w-g>Fi15dm>Ks2&UjZ)7ezIKi((269mNl=uwmYdZB9`~%~ErO6H!CY}ud>0X1 zQV{4Wid*m{mT6bYD>W-B@M7{+5@lSgOh|PVNzr(ibq+p2vUV*cB}|GC+rZ& zjubqctC6Z=R8Fo4?IMw?AYSn?u3Hdn>MtV+X#^9&t-rj!p{zRO6nyCp(m`q0oO{m= z+&Ew0q#>UeFXVDb@-1!N;~2RB))>Yb8?**-T=IeWu%YA`mWD6!Z7j3w zj8szaQy$MN_#|cVN=X7ap|i8J&Z|z=(QI&`2$2xx;43vrUy_29;GJc5N=aC2h#IDj zrc7&%aocE<_OiL6L+ooWg42UY5o8IJ5jA}f-p5AI3}nU72yTnPF40tiltyUHDIRFt zQ(p(t=>-QfBZ<)5Ay@EBt(i0!m?C}=?=@@BVzDiK<%7Hg*sw@CzBuNY)EsLQa0=5% zvomNj!W|&v-U8LCMtP_isF)cd1KaaU+~R_L>VZauBom%>1+~3F)o{_+uko5<{XuZA zu2_!BYvrNbWQ`IW|M;VykMPw|XVtjpA!s8N3+T+yiS@Li9*J^J1a-%!sJ|3hDJe7y zk}NKMu^!>+$folfO<-}EjSfHVOe1AA~>JLEWQxuL&B!V4E#c%L-tAJIJmh%r4T4+^&cW6CdlZ^i+A>6!%%J%mqd|2P zC3z(kN0L*<1>0rPvSEL}V3wd*pw0<$X~^I-Q<5fBoYpqXhe9bcqjVB`0mh|wsx&sb zNt6=wCXUA|0Ea~a8F^&+BvBc-^(sI?ymaPGMr**6R1;rQqQs9)22mvICxJ|jiDH# zO9YUXBdkb*(i;^JLB956W4($Q169eq1_)41QT`E>jk}`K5i#-e<`SEw2+b60xd*O- zNs#U;ASGfEsN*?^u-Nb(P%OR@*|B%~I2hU-s`ZV;5qe8A*c(!#T`vuw1u`>%?9stk zyJ{8^3HN~Y6o-vPTf5OafB`F&6oh#34mA~KJqBrS9(;n)Gn!%EdgsLOMS{F0g0Bcj zHasWtM)9el$#IQTp+tbNCZw$(8^c;`>!j@{#gMAl6y<`uA!9ECyl0Bm%S4wzN=rqo zksNAE2u2==Y}P80om>;TL=<<6fF)TvsUJ5i2r7ZF)ajkgK*OR+^XRyUq(G|LFf2Aq z5;QHCO|da0VN3ta6a=eJ4XKWjAy+g9>8nK{DG4LDmy!P2qO2+tjV^gb7+hNsj~V=p6#pyzWh zw~@{{wH{$3xQanmL$pQ*)hkUMZ7Gt8doOM>ZH~{-?4+$nW8$E!xJO3~SwP(ZhRv6l z-C^F1og)TH?1gA;I3g`7klYb^islj0fA1uLq>@MV;D#&&((7@68uWqZ5(Qf8(A?Hqtb~M+EVALJO`Yt3kiV9|rq!rSlL?w3w5;!y#ezy2p zQ!qg!w!@LjBJ?jH9nKrH+R;fbf7e<&LmDN@gR#ST2$@Av8VWTKgf<}!8fC@U8;woS z6bs*lC?k$5_p&yO79<~7d_lKht>9u^Y9eTjJ>a&9Bq)wGL&p};0gH+! z_uzGq-mQO#mWEBab763->sktastWDWknGfH6Zc;lq>8Hq7^sHkM)a>@?+A{n2TyIW z=e)}ZWa&v8i+4c;iATG3ZKx1?zyF&E+Tg84T!|PKd$*$4!vTgNkdI3sqZS0ZdxR_P z9XU?|+68sq5t;O0AQH7|*7yagk$nfHwL~LD{o3nytZSa6bp*g6d%UVoNd^hl0-_O(Mg)z}c7Kat+a zQ1@e?_P&|C1^o9(nJ+r>>z&Pb(|yq?Xz81>^N3WBPFaq!%xiDpCJBM=O6t4g&4R%1 zyrcHa-`6cF9z?4*e0JJ}VV4##K54vz78}8vVxEpV8C5|%6R$S-6D7DPX_-_#2;5Qu zXiab{Aqm(tmUcopwcf=HSp_q}Jq`|4aBD~jZWD7v(-BP~kKQM>1lgUV#t0M`f>H0m z&s$$NU819XT}m(84P!RLwO}}a^h@n?9tMbkq`|J4{+cfG9j8pr+iLP8e0bw zrLVo&LtExSAFbU|Z-TE)s|JeqlAQoIzS2G3JL`^W?0fU5WV}H-YPF;zRmYNJy_v5v zZYaY6<^?9OB}l~;!LdpaRx-`{1-eES!H>{9x(dDhiX$5jE-OWMhz7Pe%)u9g6ha<7 zzywa022>&Cj@DY=d?LMsw202$k(_Z9d?JpQXp?FpN;HiJ6(vI#zL{VPG%K{$iL_3R zx3z;AP=!>YrA;LQp=boP+##ohUWV;2w??u=H%!;(-|*D8v@5N~=Fm+-MnN^9C3R5Tj=?!Zu$k5@5M)xk z^O({Duv-egW2~@QLaa*e!b3=1pQeqV4P3CQc+GvW$D(u9;Ccuyu8QC(#GAISvH9xS ztccF5w2Bvr62}Y^r#3^gKFZj0C#ka@HF;iRoy6@HiU>LF81u|DU7^*NmD=NkNG5L= zo_*Cz(G5?L#Y_k;Q5rr5@|Gp;TL(xQs9cK%0`knm`HWdlqr2AV98OOpp}eL|9_vjN zTF4iIqwE@`D$ya;jA+6nL2l&j16nR98N2LUv1xqntcVGVZK$$=c>-yqNnrw)+8gGb zTXup%$XyPUL#CiZr7a1mIRK0G{ce%q(9XqGLRrvJqGPx$Au)*v5LL(ufL3_fp|9bz z4tzA)x$&IgQB!WMzBIusWNgB&R`gO(PeHm0y^fB~n^!|DYX4OtAgu*FA9A#9m)cA6 zw02Sfr?sB7OABs`j=DTb9V9ZL)m6=^_`IrC8#+Vs9N)_ZId~%#?>FPe#SlRyBE5GV zhjk5y^>WVFF_I;qc1lLu6l}kcI*Js4z8Hhjt9>&Pt>tF%0wg-4k_A5m`7RO&!07~k zPVrI?7N1`Y-GHURL>lIWd3JJIumhw-a2JxPuA~I!J0vgI z91Bj0;TP{5p4Q)nGWi)Sw(3KnbRRwL-vD1qHNd*j|I z8adKN(s^oH!)qV0(~v*NIt|krTC_Jgg2N3W-Mak2qJo)vLeEjT$Vu>FSxb!@5vQei z`7E77D)hQ4{t^rIso^Z?lvD>=lPsjMYebcW{3g?8-NgO-Id-G&l# zuT+hZlzhPEj95nVj_gV*m6Z21g+*UUW}#Yi`j``?-9v4PWKlvwLW_|Y2hY)d z{M#s>{%KMfz-FXG$yfJEecS&7dGohnz6q4~fq%sOBY&P^PLqmi?+Pb=Ooz^FV`e^#vFdta3Pg4dt7Eg5@XvDBF*{oh3Q*+x|xid+NXWW2B*gw~%Jg z&;dM4bk<5DpG;IsY`^vgNl$$_E>M`6(;4lZe;NDvze+kA@Tq6*J{!m6XbCjO0d(li z0}=GJr|hJ(3nP!vvLFMIyaMwDw*nWy!-EA+XNF-TA)W( z?h)GJ@b&*3Ui&-A^FyS~_~trpGxPVpm6Kb)09rbw;Z(U!Y6bi`AVue`fTtE5V71R4?$0HG)ApV(P3i#$YU@rY@V#KKDy?q0lI4(Uh&mz{*T|wsHe=o@SO}F z_y@EUfm5BB%CKmLNm{_5CGC{N#B}8q_}BhVfvrsN2cJt~y!yGEo;{7f=})4s`&P#5Z=#&O ziaeY}8{2b4&_hFO2=0_Ff-FQGlsoy@xeHkuRw9t)H~w+ju2G-=0P>~ZNn0GN725-c zKpL5d^5Tk%&@TD|&rp~4i0CtqGU~$7-}cwZn;Xba{bvk6@t;w$!`J)(?NCU>0>_2A zU+|}Y2l*@h0{NHz5u2a-3-C+-Z{!QVgZlZuA35w|klMk9C@;-o1Z0&K0C?s&j^TX+ z>+?TP`;kA7-}?wj2I^1#d4~7=0J#rSyAUuOIo_Xi{xGQ^L&CGfSccG{dCz#G!M4i? z)bPPzFv?OH_V-CwpCvv16*O^D+Om1}t1+A50Cwn-W$7BH7BiVzI9`+0E#oWRjDF@F z=uiAb>d*b(@t^z889w$y5g4T+(n9-H!l3{Nf_%xeDdV1LH3y1aVE z16hQ{KvE8|ZHiLT4Rp|$Sa4_im462AeTeb$CGwYjJ9TnMpnU+|`};Q$Xv#DvJULQE z+Q)x{_T%4%{=#>WH#eEz{ddSe`W?up-yWY)8@hB#fUe1!!51M_#eey~CjIcYkv{pe zq~Q#H_)n95=ua}-|7fQ-EZ$24$qmc%qpHP&px4R6DWxg8Sd5_1$f95c@*&W<7Ho0S zBFti>$3RjGg}ik=SV}B=A$`^Vi|NkC@ZBxsbALbe64b|dAEowAT+AVQD^Mh45~*Q_ zM)~5uM0x6M@NfTf(hvVx?D=S>2E)k>#>ZZd?~LWC zFJ*k&Kf<5;3H0G7Xz4U`mTu%4fl4&^YF}k49*IrDZUvv5Ow}l(YU>GGkM*gkhddw? zk+^qYauviH4{p7et6%uF9Qgh0pZ`_1=dWc>A*NGlw621ufggm>WC;w4^l^!GtbxJt zq6~TB;jGA$zZv=HzrbJoW#o5!7t6^OmWf2dr6JoW*`&_`hsxRTE@;cHU@>apIg@1J za3Z8@uR}ld!|Z@P~r;SZAA5Ne8Hpy&7?6`mz5CySR&t&_*Xe{3Iqh zh|&VO1$LeLNGV#)tJ1!Acr7ylJ;&9ef(yH z#ul`m0Bva<()Uu$iN-~IH_FEYxQ4E(N`uqPVgC}tyM;`4Lb~7rYRj~xluhTyB%akX+2)^IMr$ubWuc zIL}t4Epq!!n?mac(tuUNw~G(;%I@oYmJMSXy2oK5@hJp8UTaP+;B#kCpIS+ z@pBoFm;@Q0nDOGl8P5q%4H*hDAMmHY6rOl9=^wlW{hfam?TK?)GO09jHM}^C6(+?d zVYFsif& zRz7>E*OSmDW86NDoWG9w6F*M5^&uEe(397qw|||siMG1U67mUes7Y)HiSmO4WP8+M z@Mzl#760_x@!#+#NKbqT+IHBj_b~m^-{8arTgTIhd9?X6@1lq^{GWb>cK0KUZAbmU zKg2%%)96s}He+Xs%ndP#S;Q{$@Xjp-7v`kaVvlA+bi{PV<%BE)awWq^DETY+CNh?{ z)}0$7`%s{nAt?oS75@s&!PS@>sS3@(R7o9;$P`v6Wvb|NzfOJn%YyH^@p=}4^6B@X zGuXHUsa=A1GC-QqtWcYfbH%m|pDvK!_?^hBzYh8E_fp^cL-@wnw1jITZx(1dO1YYF zoLmT1e(HkP0jzsX4Y?g>?n1TRH9{8mMj;63CD1deJ0mp5Z+s3d-=uuv9q82$W2b+X zc6I}~xWi!{8MeU{8IVXp^qC=288-(kZ7AnPJBxvBJ%0>8O~{aGb3^8Y%of3>OE8dx zSj9A9XD4KtXxkH16I|P(wqW}d+B0oPZur6R{1~ctgNy4Oa&cinSuTXlNtEC$pk>BJ zrS3H>d?vxSEy~6woa&5CijRT}74;C%wgcoZ{^R(a51=3TIppik@QWSVK({j{3*rfr zK9bcEX_&}4uE)pTd=Wup#II%2m4qEW&E}`R9Zu+7PwyOSbf&F~!DD35V?Fu8l1@4K zh9AI(>$HFVo4Jw=%b8Sb#2S@j(~Q2Jk4`W`bY*8?oA7NHE|^70BPlkxbqN4{irPD@ zr_cPkIGzf_;W_5_e-FzC{tfBg2k^8BEk~k@C3`1tZE{LvP5KNR9YHX1^uTfqf7KVn zWRLPXA@MGV`;otv7hWS1$ z3BK@8vHkjg$udX~qg{x(YzmvZzs&p(e+%-Nf6vAi+U9A--}C+O`rnIBODKP_==Nqmh-mjI@)*;x;NV#L*E}>Ul46#UOOF?`>Dg8SD#uIg0@vPQ?X*^JO)EA# zQYErfNU z70zCPZ@1*l1%o<^8)74E8JJ9>%#aWqvN$Y?9Wt#6HY-dCxrBL691dNh*Fqi`N^ zrE9BVU6~1JdL%z`T~$4xIruP)u=H_scJOTkq!zS+i1fx!j}5xE*ZV#fXmcZrkP-_1oEe z&EKZ@25a}wAzHWWjp^ynCqMI*w14&o$QQ7jLHbK~kSD(!`?Y@+L8gUR)+L%3vm=UQA%|6{5o$beM%sZr5rUc zRwT*@2QL{JCi1;s$Mb+~A4i{jGxpMZ&<8V;uaMHA3mz@X_?bRno{)|8;8W4zoaI0K zU)a6RG&yg2L`%wLlXKi=~9>lG$p!m8?G7J9^E(ahMk;o_`*NL$$P&Sua|uyBmz~; zaR&G3fsx`{EL3ky-}k#IU-*q|zV3fye*PCIm+!&1CDyFa=?w49s#we3frk-OCWv5@ zkbU26QW9N^CwTaqgwnc?v`CA4Nd~pVK&_|q5S`Bz-&nuk6zFDbA$}{-sSBM@5TPOw zOd!b1&~O+_>ipd^UyI!NCHzOe8M|-HU-y0Fr@sQLvG8KfDHgr-x|treV@|O@%tRMQ z8s-VxgM9IyV0_ab<1+slnD=a+{Th5Zu;`x67|2g@f{U4S_POZq{9DZP#Km*(L#|zC zvw4j9@Ith8$1oLiqH{;-MEUGdN)KI-)(8F+$C|U>oOAj5H3KO*fxUSYI3GP!6-D`arkI-5FS1}P`TjWD-Hd+d$a>;E@A*pB46kf&c`y#EPE zLnI;#WTd$x$dw*ggD-|`LW!Pm(wV~)ZT^09K~;$1Ifl_S6A2+ZOgk(o_U!M35B((k z@VC)6r?hYR5%Oz(JMydl80HYuia9aGP++oq%%^F^6hnN7L3(OGnzu zLK=*=+u(XY-7wpPz|$vG6)8iMs?{)q;YYM$=F^BL2_^K(SJ1D9KuIy)fAEyNfnWDfzb@c;B>5al;TEZHBbm0RB!Fe z(ScIPNmzdD&yl|2dpP@+AB(9T_DnzV=h!@$;Iv>`kpgm(kdOQ{?fu`6ea(N%X@92k z^Y21``TJqWNDh`>`@P`MYA?aG6TUT`W886YZ1(wI#mTq)AY&iWo&ME+m@t^p= zqNNZlq=zA!he4Z*2Z^g7b42MbTRoO4VcO6G+ZrcRJR4t(#wqRor)VGiC!GG4|B~Hw zkL6welq)$51%uV^?**lrql=(sA>3?&*o0j?$LSY;2WMaW9hgB?@DKh|{D;03Qbt8E z8%fM4`&a`;I1i+R9K3hE6qXjW;h^|7L0w4AXs*3WD&!IkAZZc~3){FwOJ{KYG|R94 z_nbcbSaibf`~vmy&qKxlGS=@$Hy|9S`xDY2q%zZHCC^3`KxdqVvTfw-;rcKb+tQQc zx*^>VNhEK5m_9~`rUS^lBe^jQ#N1mPW=l?qC)+g~R+Uba{PG5tTt{j$chl;f=hnt^A`Sg3ytszy&t4zRprQ1tG*C=IT4$Mg> zfkfOC+Zfa77n5K5ESX!V2y=dd+HNvTzYg1xwhC<3vJI^6F zzQjV+)oibGe^UF@fCkcB@>S~f*HT)+)WWpC-lF)YgC}hMNF!s!XoFh!U+Pvp);CZE z8GDdfh&fD2N9PESL4VYhhi#zN#%WHZ>u=`Hau4KFba z^*(UB9(Lj!?SRZPewvYFwB5{f^EWbFe3W!?K$0*Flj z8=T*IA9gyTQjldI7QrW}yMRXGk*+ZJ6qHt6Od+NDa~gV}O< zN**dQ?b+=Vzjl+8&1;!U!FG4acYlrCZD~9ST4Q6o2CzZtwmwR8$MVy(D_1G^-iM?S zuREs4zKF8iM(XpVr4TZhu4eCJX5NA}l3wBIqQ^5Dr2fspNznz7+^cxiFx6QMHUWiI z;^FzjL>&dCqD#h0sB@_n-KCllbiiE_t1ROsDnoPBQ}<=zdR z!8YOgp%*iH0NBRqJ=;i{elVnTXVfJ))|DQK#OP};B~U?A*o58@Dacsyddj?Hw&(Yd z3SKk2!ZbgDE38B>($ zY31s>IGA|m<`&~Q8FUbQvY3apHG5{kx-vaVwa^36ddElw<^-vPZ@0wUi-t#R47OU1 z?-hYgj;|SHEd$q06`QwpW6;SZOe#Z=(XCrQk4_rVIbBG@fd#>G!7af-x<6Aa#z1jS8Gt3MY3@94Jn+XzS2Yl2%|XT< z9Ol+J4I!Uo?!HtwJScc>*o_hQfxIa(L)tPjrlaeID=eOv+K8kbLwbPf2yF;K;s$g( zA*v`FvNzPavf5K1tQ8rW_u0}Y3qz-9ByUm5pA<}Hq{QS%+iySyJOveEjj((X2{O2s znGqNx&!RD!lye};gd;v9OxPR)@s5!YT7vighXMWQL!Nl%l9yhbc<%7|q|$?*)Mz3x zMpK|Bk{a9730uIV1aj8^5iUyvt1c^$G{R;;$011awsgZ0jmkx}H~4%l!6JT003R(L zV|v=DA9Jh}BzGr}6o?i4$U_Gm(LXx{EnwMTNVMvxVsVjpZ|bctME$Ks|RDB-j!-I_PJq#jEms6{Z22AB8J!|2oXJpkl~JJ$lFhS3PZo0Kd*}WQ0Vx0$^yCF7`8&UNV))x-nJ} zL5tq0>^4n(qsRXrZE2E5V?#7Pi-v4Gq#S0nL!a(n-C7|WA^O-&O7S`CC`)u`{E^Vu zA6)|){`H!BCumZF!%v7f`-{q!iD68EMssv{BXWUF9;R?Dhjn!?KWPP7jCN@F3~hFn z-3hQEQGz(u9LI!7!cyt-js%)$t=pow<8#8dk+>e)8V^5QY4aw|d9>(cg>jeQO{fPW zrOH!J?NN++P;739EVPFU%=A`2*qkEpEkl%NZ6xQ^2kb-prL9o!jMzSfyXR!I{TXg! zaE8f)Gwa=;&<*uuQkH0t^i7L-kl|Y(Rg{MMKE$C7#8N2NyW0j3U03NeNp}UoAB|K! zQhGPa>hDCNx>8#ux596D%Z_WWI3R=YrZ-%2@yWa4+#!ySj%=daXs$G(EfP#fgTqi;^-!n)V|LCbUfRUVA$o({Q@Keh$O;B zI0bKIopbW$-8HihfO>Sbz}buy^(BJP93^Dxq+a;$B&5V=+o8{<5%sV17IOr)2wvX0 zd79YKpb+Ao;sg*sE*w`!$FPd^xkt&qC;`%0D4AmfVMROAk0O#IGNXCtv3v098Cv{h z@3wjz;gkfOg*2}Yi#;LqAQU#sftJYWsQMO(6G+1KvEMI5$8G2Mu9vJHLf#=aOq^U6 zw#8|a(hMkyZgL#{A<<}&p$APb@pl8C3b|Brnve>qCWg)ZK$-Ofk&5UXQV1WqQW>gf zKc6IFQn0DS7|!U_vLO}Y=41D$4`z@po>P%bTXkCw+Il;^cY zNh1<9Y;}BcQmSlDA4C91BT_2!BxG$2XANNtpRY|r^3-KF8Cqc|eGYK}EOpx%K!+IE zC4`PH-ch}F&NhWipenNT!zotNJPWys6XPwKK-{Q(4cfx7q>mA!zBf#1(oi*q&4f!O zNyD~k+aX5IUGTD|RM?dnEW^uG6X z1y$?X_b$QdZZ6&vYp>5j>EVQ4vPOL9tY&y%^{Vd3YIM}5#lyGG94(MZt?PQCtEDSn z!usC*5m9b|AfaDS2QoBf5U$grLWVgVsSlVTUfB8id-59%65 zbPTC?0R@?yw(Vm;Ga;DNmj#0!5a}gvxFNO}mR>uPb0>8dM@s}Mh>?_4M<%61oGe|VW**A^)it%nOe1~%Z%sNOsPm(Pq$^ORb8L~h>TIZ_qbScMcq^}T6Sc7B zNV49au^u0#$97X33*~Su?<9v)LRt!kdnY7?Y6p@T*5aH+OCcFy4pE^eNXvRp36fH? zvg~d!E;~xzW7C#8XNHaAX=0JY?!hU;l@r_=<^w4?wO+*MIY^ywDO9$UsZllwmW5&4 zXotdd-zeLRv;#IZ^tAO7JUX-UgM^QbRFtNt-1+FjcrI-79+q&=)o}q+vcNLuC@I@% z_vsR{7joL;hj88S0&WB77-jM7NGq5wvGyvRC{I*V+J!P|0$sWkL4t2w-5L79DY$jC zrg8qF%aLkX!+`hyQ;}Xpgmn;|7qTuhvPBt`@E+^2kuAv5Xf@;)GJw_$60>)joz|38 zAbE_&sWqBt?^edpez*t+g{E%k>AqKa#_=Q|?bJ;#o20K#?_blzv5^p`r_(#;5d-vC z1w?%zy*hCV<-PWxbJSn;u`o{_qkI@y`johIp&lKsN$aJCc0Rz??veJBIs%o12Tvfh z=z{b>)`gEzo5%lajoCC&I|i1x{@!`0j|Es2k2!}@JRNk ztQLucP@{J(>$HFq<20h7eUmtbU9=<9*@N(wo=9?V0eY}Nt4$vbKTGOJO7VVJr-_DL zkS`%CXiCKyh69^3gXt;^Mm}8NRaq{tQuG4KI%;&47xM|VY+3dr3&NfK$U`$0D;y@c zu*}H98y~yND~C(Yl5jDc@{fPvH9UXUIoSwLoH|cGcEKw*7d)O}$P?Gcg@IEZ>>CFP zFJ3f;Qh5Ez1t+@;*f%&!@K^;cktH%9~N}V==Cer~;>p^*jw;^UC%S@d!l8sy%pyB(JJEB|5!`jQ2(qh(c zp-UiAP!6WOi%j<_>(|!|laR8-0UG^Kjtps7(51w>Qp3qHEl@hoRU4WkGq%Y{W5I0- z4r@|;t`SVFU?)+QHBV##+r)mU`!V7`inSZI+(P$PJ?@WHIuwaA(Ax0`zwVYIeaa;Q zr1kel41}+)t3950c@z|VC2554=~!*rCCbGda)NFHax9Z#gY}(_S=T#tl6gf9B6_s_ z2-G4kE1jgbE4x&mb^QdQ@bsw8JrdF)=m5*EfoxbVoIFfeHxX1k+PZ70iVz1y#0FmB zCpo&3wDl+~C*>AFFw+Ts=>%tFgH1|{=9yk#S&)76t z!_>_;1+R@F3-#;R<7Q_b-Cl>5uXe%?^`iIxw{I=Q8WxqL8FHd{_dqs~z8H)NZ_)2a*v8M%pPX8U+QY}oH$J670K zXi7UcdMK0(u5%<00#U@i2;Q+tyf3j7$Ys~MlWyl8rB^1Jz!KhSoTj8H4j<_*xHfg< z+YS6;49a424-!dL0$GV_teez%+r?4qCYVLKc(|W<(?!&pyn}+M2FlrjT~v$_9i6%e z$po7lOHuNP^^!Lu8bZ!y5>qA8TkX<~#eIZZmRz3z8`?AEPm&4Ux_0m(}s80o>xjc75`%eU^wOo|qIo4WzNce-EJ z16PBOK|0ww1drqv>e}^W4i|?*I-WmP4}~&bhM8Ck28nB7uyH*rbQuwOVQCIKIxP#5X$3-Fvl*z$aT}WA7Bn47R zoppWcq*Qk1pv|6vE9Kp(=`QN{ScYPr7+&$;=V#fBB7j~!o;Je?*Z~hGnckc~+>bCNkJHo|%L0K?c z$a%y)ak3Fq3(&AOQT>4XB_B=aeC**!(hVPYF)?Q2#&)5c2t{G3GnWrC4^8+)6O1@C zb`boezD=`OCMiaCJL!c{y?Cfly^&^2AU6a^j!->?!{MNkF#0=Wlq5@BD%f zaW!3V&;!fE3TY&5l;%-7?5HJ0Gr=p%JOtk)PIg0DLV68j-umz`Vg2kmx{BU{zqXEIBoH#KMvzMm(!1P7 zoZ@UzvUOiYOmkEbmx63+G+$be7_;J|Mrm&~nn@LE4wr+aHBch~xRS3r^8rFg(-2)~ zu4EBXZmf3b(gSz+u34N^eGD*bH4{ysb#Kxuu5clZy&#n%FDJz5JK={Hq*q%h9SD`d z(i>|+jA&IS$5GhCnSC8(1^Mhpp{Lcg%8n9iJ&|JN;=BdH9Y=om4p2uwF>M*y%9?jX z6D^8HAfrU*h;Ue7o--{EoSYh#<4F3XhBrmWNS0A_El3=lMReVI0MtGj zJjPG_;w4uG$R;FhoSkKEoJ@#ie(D#u+`G5*_q?#lLP-_znIVVvOUdD%RzgcOO_wAc zc)~W^-U$@vsWXH5f+dCDu%<*#F$kTsYx069#I>>1g{4inov|4&8Io}SzJn^SdFm>) z%^X?-*>btS-}o1WAA9dx_?FMV!yC_EKnJ4&b21pnUp?y791!` zg*J4j0Xc3$C6Kfs9c_Cbjp}Qc;B0NNFjI8v2PZqe?XJBo#o3yPFh(2OEkl}Rk#j0f?@7-MO56q+FFVB030Mga&^91 zCOO?TSfVrNF-y5_-SwzC&t3i`Q8QUTIVixGbZ_;PI&6zFC~Q!OXx}4e@K|;{BQIL` zJ^C)aRk`Z7x~S33j{&R4;m}}7G-43PY5+t}K^&I>+A_yTh7qjT7+pfpb6v5D}i}rFve0K{{+dVpd+5_}@?LB@WF$=ho-m$29r*ouxJUuGi zAlxTf{4+%2h$(Ltw$RY|KZ{u@>mKbI5(0P7oI_3`7ROvIaqn#-zI)JBG>aDNqEQl4X z8A*nacX&nIC?r}xXFZZiKX6pz3{CeK_>Rh@1)^%58kr*~MyV6?pGN|?b!s8^y+kib zJI#VSKKBZyC0b4l`vq+UPfG}8X9q2K>Fdja95-9YbMQ)SG(M_o+maN_vHfzl--l1;l2cri6)I4~v z`7$${g0+fUM(2p?-aBC7spVn*mf`^(&AxhcmKs9HxcMIKHISDyuof9eg>YS#{=geu z<`F1LbJWn%iNmlW4$cVGII4RFU*bsatQx_)qp;|t(A(aTVKIUL)y~xdHgxm-&J4&p z?Qi{sYDZm`Xan4BPx8wj-*CE_xcbyN+w?qa20puc6~A!n8o%<1f%o4@{OTu9x%bjc zo9^(+YiBG}#^lTf%fXoshU9x#%d|Gre2TI}lthX5LXGi6jlk2W5l~fFY9pmW7Px#c z<7tnUYitC@G$P$TH?N$G2+iW}oHNNS_#P6~7LtxwoeSi?I=9lMZag#>EBPc__>+uKVO{WUEi|hF3q$A9%|{ ze%}-CME4iWOJWu4>DVwG!cIjh?J$tCW0OFc@zz)*l6(o~oZL@>3Y}B!6-%sX>8JF7 z_SsO5RgACenLw!0Vomyba6>1dk1aYk93^EVM}X`O(z zcy~6n?u3xS85PA)@+M)2K-$r)_Kq(5p|NX_fg`jE?y1{%*EKlz0J|2C+Ub^+6JPh+ zTG@21g!Fw9IKlCyS724*Nr#v&BJoO;X^Wsk3sI%(S}*o8uea5`>ySbu*%j9oElcY} z*=i@V3O&P9OCvB^=gBnD&#ENVIY`ru_H)o;gKNKmu*nd73X~QHly;W`x8uDWEo?0G zOFqztN-eyaEbM7aWA1M4kaElt5r{<;T8&VWdiiLE*M?<3ifvPldk>rBfX3e2;i3G0 zG^`weY#mpzV<~RlPx-N4UY3_RGvtJLLl5WNej)Q!ulp?Hu<*0Do@MW!%iDix!;ijm z1NjM_zjeX=hkLG$7mRAic3`$Wwa&~|!IjOhB^O1cu+%xwlC>x$1dG*U{a8HvP|;tbd7ysMAF>HejxQa!mTluk^O$hwZ}GGKi~3^58Z_`2F=UU#+@dMt=?UUOtxnA|g~X_pv$GM@Xyzo#XiBtt!o#^CRIZE@qW(HYig z>_iC_q28U)KV^d!V{7ZQN0dl(8U<(#T0cI|B+LxY98y7+8i%2_4fqme*8*k*hK5^v zBw{^L{LsaqMRAYm4JqAcDwXJZjte>^ya>AKfnfnpy?dnbx7f?%p~fQ=wW5{YV3R&1 zF6+0}zm22rF{qIK{yj$NoKDBA)8HOKncm@-UL{HDv)QU~?2njtCrdd77FH|3W4R^0 zyAjTpvUd5jYce!8sA!OBn&|UMbaAN1oZTRCnrsfdX+W-Bk-JGzMtS^fz~WHM+JW#Z z+In=$I!uiR(HjAe9$S=$nqVDJ?lqchLR1+sIIe{u9;9{smaNi=j*>)rt=6NNaE#qy zn`3?yU4mef^%t2Uc=wXnlCz#g=XoWq;yvl=kSf-XL+bAi@AlP+W(T%66ECL6`Io_a@`&%u%z^5H0E)I4I-6hTV|Bspzo$kxy@ zX`2{>}ED-X4LeOWgz6kWaR{AFRUC-$`>f_P3TctWc8!n;qAYo=?56dx_F z)#=Af^~l%DOi5{t5(pZCGrF{Yl?dcG?kd{((%WVc+{7e?p3P9}>iQJ9H(v^A`v9M# z?JSvInmUNGOo=kqsIF!wrQTsNqQ2J{-i@-Wch8`ktVK6aEQrCTEdoc+aw2q_iwHO= zr|_04+TBDs>e3{wrvibcPSf=^a|9UTg|5F_`wMH@t&}5sc?jTLT-F z)V+)5%~ihtS6;&pzH{WmpQsGp*lrrHI!`RimfH`WV=-f%W=hr=ye5$(-kGmRKtOY% z6h(Dp98ZEXl!2Tp&1O<^rgA?T@rxKRm#DDzS6JFCkj_tOT zlR3`oJV%O-8kFL5ZIwuuJ0BTfM(g98nZeDu= zm#**XfJfEvMaXe_b9hMw|K!J`vf{AHuBYmyo4bd+A$R1XzHWy&fn$|HNIdM7Q1cv6 zL3&rgm+oK?EPOA~6V5_8Q}i0RU5%_WJ?uKAUb;#Sjg`;|?#^HJuFb0JVs(qqh|+$L zAlA3u9VNSGc#WU69M`l$T18n^8b|n>`-7arqe%%xZ}MLDN(3!$?U9gBLP0J~A^@)+ z*I(A!IZXr6L0h1u5Roz&YEC+@TyTYdcl*`+lb^W8JKj^ccX5v=PPb^O9Ht8%K4_H9 zNUJr@<4Y2jzaC|ovmgTFa6;0|PzKD2l1-Gm)?Iy)2D+-qTuRC?osbj$s&R$HRb~L?)-i zerl8~JXt1w@*UTC;f2@n&2N5!uPMKXv>i)J2eKv~aH-*3P!mqZhl;iZse!b- zb2NeM`vz?u2&+4C=;Hm9s*WU9hhFqJjiD))4@gf?LI>HIO(fPc1#UIw47l3g%^cOJAiB zy=v&|{7AKk9#2e9zA7rIqw9_!{W?DHP-+frw;r7$jPXwJWRpBsX*Hu=S+Z zfVBOCONvdmga?guZc5ji2!U%D*&WN82vou6Se#KfSHvZZ^&8ldxplYj*AyzQB(s7%RmIoZq@5q`nn1f z!mT_lW7uSeB3#q+G~pASFdLk#ZcllT&7ChL9;`K)d83 zX(FfK6>Bq=wkPMr+#shdH0Azbre!71F`{(mLU?LOFg4!j5BM#wy3e~mbpQB{)Wo)F`C z$APj!Z8bhuduigvFcyZP(5iLPAC^{`rNudWJ|Jzt?H)h(ZsXH0-Q;~=@n!tMXFkeP zCm*L?Tw-?8T>(Aj1J%2BD)kO_l*^thOfMHhx|^Z{$P(+XrS1e<=?v(R>vdK-Li%QZ zIa&#cg)Q-}+bk3fpkQ-C(}Eu==`6GL8QB9TnIt_ZrO5RxofpQ#QDjJQYWc#ka$vCV ziSK(9)t+NpfCKTDQ6wt?M-FsS9DN#X*!^`k}6P59+?w%og1aF^O@k)Iz@C-i54mk*XYPbYCRS zeUyeuLboFymS_3lkG_I`_09|4_n}J?%9Zm0eB|4E$bMA1sdy) zx@$?}9AzsJ!}L*mIF~G(D#Mo1(r4+>ePI9v#-G_mA_?-Y| z-JG>^Dk+YVQjs1BBKq6Baz86s)}vyFfzpX{Yl?QSap`=G7qG?gWk57KQMNyY8wYY) z0y!)(6za+GefJyR#7mYQ6usBOs^MSc$wS=MKyvCqw2Nc29BcCk?%n@LC0rd+*P!+L zT8VUT0?qnqD819M$|`EFbyxOjiRVZ+`m^3S(!MrbKx!OMmU?osLCJ>&t`xMQ=)Y)_u#saHJ3)y+LVXZU%Zv5&yv z4#*xZ3hXmnChDBf@e+{%Dc5jL5Lyh8`V2#ZdH@=G0ru7>rKo?8=^x@WEjhJ3;}3^Z$$ zoH2vL;Sy3o09sPxEkT;^baf|uUm=xqh@xuXZ8*a8~#>)oHJ7gxT(236ukm1-EB{;?70L`67Q_MOABDGT) zk^HUeFju#eK7;=VNtyIcX{D^Ablq)<c93v2E z3!I;E*Pr5_fAT55?-vW7{%qs^gO|86oCMd__OxnINN5B`Gb5!$E;+1xON^lu&4>su z-Fk_){*Jft?SJAs_+NhLU+}%(^N%?_xk1Y#kDYC}e*G$6_WBL4dMfkOlV?2j#5GR0 zg*+q}pMcHNI0fB2L2Hj8zGu4iPEK|oAP<>?ZP@6557#+Ae4Lvf{BArS`0(faS<OMN@(4d z)~Izs6JVLmN#bz0q}73v3!Adx?qTNUGw1y2FTc(CP2q{*K3{(Q1$a17cN1|Os^dOE z+J%q542TvOGR}dzpUHaK8$6e&_W|k^A(T#r*AxZmL|a%y!or2Vb%e~BT= z7|>?Vbk3@`_bDk#tma21e|0H{%n$);wU9ZA<67s0GI)*&b(fGhMC%j$zEHK0 zHjTWo=p;-WQN*%?JOtksL=A!F{88OF^U;F#`hOhr- zG-aN6{FLwh2mb@lJ^$;x?F|ok-BUN%-h2huAG?C(*D~j8NV&r0VZa$F+p|Ep2ymab@`|C%eybJ}S%AbMBtKl9%e|@WNr_>dLp`3C3N+uWh!*6YT(;M#bRQ?#;Jw($fx1bW*f@Gt%4QbOjm{9US zt`*LJ*ci`19S?dcmBlsKDTJn ztq?0r1e{f-z8>Tu=0`URC+HyD`@WS&guQgIkUI&Ui0-I;S8`ioDjM-FzU=78IM(FH z8r5G`UrHA^a@1({U%q0y{_|^xU?tK<4VO`oE<|@Md)(N=#G;Ae+*yTpI@@tfhEBYD zBKWX=z8xk=JC|k(bzz;^^a5-o4%AHjazkZ@7K4qmJj~JENpn1h zm8V*TwOQb@1!2Cvh_%yLHMC|H1n*%u<$b>8-@bR`rFrD1J~Z=-?_IcYHD)_cHfNL^ zWlXg_wT7!h&i$Z4r0c1I3{@49jf~wv^uay&Q-AtD;Z?7B7B}PB*F4SUM7aLsO|0F* zZvPTXx{jo$a6N_125HKmh1w2ytI;)d$GTOB_aL6>N5RuOMrLR^#}4o1^}qBjym;*k zx%0XI1H-T(CPt%`eO#1XY;4xg3QR+kOOnXLhT0m|xhVBYZ4>iy$?m~tDFc-4Qyg|n zbf#tD`uSBQIv;>}NglJeqRX1&12fqI!4 z(g9^dy$bnSWB%YwUACn09%F83_1+lrWAX#XJtN(0vLR>*e|`}`=Fq_1y8AfSpPta& zeHcpEm6K>VGG;CxT<7$ehv>WyQ@{aiuSipLoMI4G7MzfV_&S(>V$2Um@;sCK4C6|< z1aHjoPf*p~QPCsb%AJ^-bw5@bZei{0>qJLyCPZm0k4XI9VO%*qt05msn=m^F-lyw_ zWTo}{v^6cFtFC$t4cnABu!1Q4yl+^w-p&l@7ZL{PL{JxPYDZ#gENOi#VG(r9)Z`Ih znsh#`KLqLg&;o4e^Gq6I7VoIA->i&;db~S3#xQe7QW6VTB~u|b53Cs+`>0%UC-_nH)R~5=)l!2Jb39g|I@z`{@Yym#^3q{{C~dr zlMHu04)eew_wh?X(tUh7XS!$T{*;EFe2%Y2YKO6S#%n`e2DjT+eeUA@Ixo_S0%i8R7}!mn(4{{ZNU*|>!&&6 zeuQGt+SDlfR%F!`snWx%41KdK5#OxYqiD;@FUcbUUmvN(9ghQAM}b}E#$2(bq5`F) z5Q?qcgWi>3=s^r(aCw~~SK{ldgkK%+n_1kjCXfrNMsq<^#;Lf6QuomVi`rQ=)20vx zrec@`@t3k6?Jr`4h9k6ezz>bI`k%+UKw74D6Qp)!!=L)`GcIl9OodywcHF$y7+ml) z(&#RxK4ZQKSJ1kUb78mNQ*!PB%R6cbqrHm@FSmK} z@$;~u5htaLXxJTZ#|x^1)it|iRvlhzy#u@6hV+|pUbcB1v+gn=0C5VjCu7TtB)^U7 z>+p66^xGXPd?jA}xL%KcR6|Ud(}3H8wIyUHHO4kH*LVjyAP6Z5DQ)^W0}E;+Hr-*i z8$2vu!_&_^->?~`IQ&X_`&zw;AcLt;gffSC(pK=j%OTfAy*F^sBsu6UMVGa z=Uu1P=(V@jC}rp|JQVk*n~`zTILwWI`*VB#@PpTL<@{Ox?3aI#Hcw5k z&1-DL`kZWyqpSq95S*!LY*v}WkiZ3~L@TN578TSKwF8o`Mna$=c@qF*YDiJ8+_=Eo zW1#mDT`&*3A#?A;=nY?$qn;3!RU3}v)z3Wz{jnyR4y%ODH}&x?dD)8Tss|qFwfcm| z%MB6MpHK-y0Qa?eTvOoj!;A){^%KRVqlLT%o8I!L|FBrMo{(b;Gq(2XzwDrXRFTJA zl=ZrG#g2VmXg#@?u#{O%xzy|uVrGkhQfc{@S3vA}%SA$pcTRGSJ1 zIr?vz2-*t86}A_=>!qjozza{a-@m{oKK6jKZ2_FwwO@T>ow9_I%>}5AYc|XGr(Rn-mg;?#CtK;5D>S z^2jGFD)t&mX2NHSN8buv-f`L@^kR7HP7d)dEP?SjgHL3;hu4gGi{DY#!~oUhcs;n& zj)wf<)gPlb(b;u#QX&pepoASvdwI*eQHqlDz+w$K*{~t8DZh(5SKiD^4}XpE!7p?5 zRlmlcd-gg00?W^;IfOrk-FZi25>N` z@eUME*= zwJan~{motRd-O?;&5)9C*cHYTSdy^FhSQUWaM>SDg*qj2>DsHVvUlqi#@<`0qhW`T zHfZVB>!5j+TJ%BWnZAJqM#ToY(ABya7NquIc@n`fEQ@>aUQ(2~0y++06?^DVGhzdF zsN}M6=k%QSoSgAD|LJvp@!bQ&s{8!z&);!HPPo7OJU(^pTd|v8%eWm;U69^|3cj%&H8RpQN#S4+ zi!7FGr0}H$_momcMYSDEBvm8Sy^W<+hM_<@XTJP3zT`81irJ0#U;i&SdFmT+e~9;} zwu=AU!L0>Ov{mpXM;T1g5)u_rL^4SC(9*C88iwK6aOhDh)>>LA0PlmenU)%DzTocd z+t}p?dE9=6*XS>C`=g)Yum0;N`LU0kGwLZPo6PBHMH#rbyrB6^>l|UuISz{urPfNV zl`>?`&#y2|GyB~hNaUoLFL;BCcFOhZ*Z9ugtvoqC$61^C{Lek%+QlcZ{Tml>5Uk|sRQ5d||bc|?IE3DP~rL;A)|UBKpqR6zrsc<%_VenHYryi`1FVUQT0>;sLm zjv}m!N&>Bk5jHc>yNjXqZ51>N(^N>MkWcs6ppnZiq>Dg3)V&+9$)iN<*B+@Gp#LLzjlL% z50#dTx4n7c+ke*!{MOe$g#ByyZ2Nj%c2)a-0rm=4{3-DHZ0~C?!q`9)|Jwd{&AV;D%ZOt6{~`4KX7^w6Js%;*^_Bf_a9M4R)Ae0I?w6ntmBlhx7 z`XqoYa{T#~iE$IwLuG@8BD$q7qj`e={(BlWQ~h92M>_feZ2_Gejvh}I(;n!C9+)CC z`W(NIhNB|P&qOC{84fA9gmG)}j|<>i5;&RjV^VZY;OrQ2GFS8EM2 zc_@X9b9R26yLTqeub=X@UwPmUyyZT>@zoP`_Xa*x{&(!JzlE}Wh9rs14xwT?M9JN| zG%m+I2I~n&7G;Qa?_G278p>-or_vopJ@t-Yqb`seviZkVMUxYfk4g@|CJmk2x*QkQ6FS4 zrI1UwXyzO|T5CP=^grGQ#e?ODQYZJ}@2PH>P z@ve_;S*FbSS)7qLEtR2{X=W>$2%XWm8H49qW+XYaMp+%FPj?=7-cq*<_wPC1`ZYKB z^S}KwJTd(m)7_C`hD+^y=#0lA#I2!(BWIwTf^5Pl%T1w_a55cEk!8YCm@0;)c|$iE z-dChRoM{1#LugQ@VBZ2b&&dVTunUPTlB?_bkIuh2Ge~! z%R$z6(kryZyJ_W03v`gv6$(e0lFAY5&}k#FzY~IpmvNurOyC|tY9*ChG_{Xyf#RWo zLSqnmiW)GGPA~tuU@TH-PfjbjzseYh4&+Mg*~3ChThhq|X=72N&;92;jw3Sd*?Q1! zJoYG~x;t8;UT+;Ks(>vCE3Kar9Vg6mkJUhWg%}fp=v+33BG}yLDpSFD@A zLE1t(rL~2^1EzM$cR%+!{=0v@8`E;Yta9zzIX7=U#wS1VVhBHT0*AVU zC9SBE@_;RgAsu+@S3SYEeSPH%u0Q0Z{cqvk_}e+$_^ph2L$OOb2F69mDK;{sK91tu zT_8@yHnV=tU4Thz-o37ZJoR2a&#U=C4MOzd;)1i&E6n=?_wL@o%xEn>tF?-1;xOGM z+o!lvKEb7YA!Yk{WKEoGlw5@Uex@#orOvcwU5^zHJsJ!_3j}v0oS&aDY%)13L&@Zv zSUHGsEWHyQbD=AOi_)Q+QT7rP=%>4AxO-}&HK*8BT1h;2`=i|d#lOZ|pL!41xXb%q zgztUlDL?#<8{BFaTsyl#?p|iobm-EOewHS^tidTcVb-WtyNQAD)GMB5S{e@?T%u{_ zg$L)n@|g|)=sP~m8y@`n|BtITkJ~M)>N~%CIOjaWJKp)$y){o1MN!36jDiJ%N(ux- z1}BVDA|{P7_=!f7Hl)*?p_8QBhHlK|nwXs-S?H$9t>pJiPP!Oy``v z_v$~^KF@pU>jytob>HE6&U4P%YyH-5AdYkcor3yn8yxsr3ts0+if&PpGpboca~jjE z#`XtLPnEJDxg!!Vg(o@1KCQJ-1_kG%QQM>tvg?RNk|#NbF*U~K099&SRFgm5qIQOy zS)t+;+wC$2F*Yk*M18!zZM-vdp732^(>OrMoAo^170RDVP0W#Xa~OYqnN9o`Mx}J# zD)Gx?U^eQ=Cun=8Aa(Zb5w-iJ*0I!--Rsb=m+WnwLduwsB{e$2%|SG$TR@pAXm1KV z48ph|x{9hd&MmNo)+lp)ZZDEAQYo1urmt7D7SRPwkPQV>jF?mqeZmlN$&;eq1Z01C zT$+!u)V+rU%&Y_p)^4Zj6UsyQ`pN z*~6Hy_x_C*5u00B&EQlDL07O4Gv5}am`T;v(KI0!67?tF9qo|Xn(1Ur)7D(Rc%B0X z_cNV#BV8g%#AR`JZ5`ir_~RVwo#Ic<{Qx_YeRMU(mlmPL+Jck)=P%w*d;U|rtp5PFtX$$x9zVpd{_auQ$vV*%>h=)Yytys0))O)z5+a2!NHO3% zSP^E^8U0?5!NL-gwk0&+y|B3(ICylK-}{>vxn}KgVyH0Er7Js(o6WlnF+nxFVo}pe zi?IdbgT{IF3#8G4)fJ#-0={2h%2vlLiP|9Gl&VzdGD*6o!u1hXLfFB$5(6aHs8Xb{ zi1ligkQZ%Q6ZGG$q`al7dCJAwv)y{ zoA9Pm9)@~er3|ojRWE-S-8U3YnXRz{;f(74^8DI)znjd?wFr`>C{kGs9uTtUk5z3U zG2?PZ4=OL3w%m7Q5|6%#lr67}woJx~Iwo|aHES?cw{bw@ut@a;R6~QXs{d z`fXcu{ZHIW;_j?TT+BwNIxGo@{WAi`*8o5^U*Y%*dx9qDL5 z%ApOgwYjcNqC{O++X9iO`Fus>06T2Xme|-`q;!qaCNM~?!fNXhR)pAQ;&7%pgxVsu zRC!==ZZP?qwqz>_7cQ| zvkHBbRY?qit=%H+djd&Atl7!6&oj3TL2(>o zGMkx%q)4i2+F6Crqp&sNEfNDJI*KY{iYhNsrx@=@Xz>cI!$ylOJ1VeYe7ZY%Rn8oTDaPzbK;MT{7AJMQ_$F*4-N2 zMwlv(v)w4{bK7dk%6aru!|W|G8gk2SaA|-fr)zxEP%MvlaQB7$!hi1Z_~Y9g7`Dt( zBu<-bcGvMXGAq2Zl15qH#uzSN-r~F8@@9VYM}CrH$F9Ys2Dly9@6qcyq?r;!$emxI zAb5;m6bv_cmP;`aNi<%8UrU9uroE1D2~skIX2SMloy(WbFdpv^Ya!W!&@}mk)Na{1 zqm%-Z=KLK=XopRQfeF@lyblCpnArvG9IYsL9`$nT*v8~Us^sV3K?5T6C?B9>eMAr}+To#~*mN^~B zpp+h8INCN)lobnRi6$rp=wrl4U|LUE9tvOi$}Yco$5s6Nwd=GSQw$d40+L$92BkcN zLOUul;O`rKzCxwllZ$H2G^3i$XLC z)fjPeLc3ZX<#o8RYK*DvS?*}5Ym~D0laRXu zBN}hzbfX9nn>?XSi0M|ltumZp8VYrmm^O$v8Jko6AU5Mp*3B0>7Co>eZ#uLE zwR>h`VhF9rx}eJd*(0u5VQ#)>f4ZYWr>A_MZ8l|ZD@6*P1$GO zSV!RuWtrxzZLv|K+49Did<~4XG|dd~tn`<8*Z17Z>t6L*{@{=Plt22t-(@n}W^rL5 ze}0k+b%&nL+w@$F1BEZBdIM}bBZZ`$vFNyJonfWe;S+z==cjI7VPHojN}MzrY?7}l zg(!R7=0hBhNs-tD+O$C578z4E%CSm{t;uwZ8I&YjXhYJXd4iVg`k)xDI;VOyC2%n> zzbr8)*qF>_PsXTlKSkzVSjGSuXY-jzo#6&?xx?)shtgfxb>+e7eHe@W! z=Bdl%Cd4GXEkwJAu24z7P)YgJbcGbj;Su?wbRb$xdoRS0HFR1ijLWMjr$Ljc>y|8Y z?{c-F&>&OsAg#kX!Dbp81_F*|)?+vvgG;2T5CzHtWbP}T6LF2GtOOlBL=EUIQH^jk-lxklH}%>FXR=%xr{RGJN#(O?>dbPTAg=v05ett3^Os z#0ayd#^;R+q889vbcD8@G3Xn9`R{*-H^1@yJa^&(N3L4p;K3nn7R5?3d6dgSXT?zo zu|;TUn=!Mg&;}u-lF6i1HJJ#`J3>1GlW6J*qwx;2@dOd|jWT-2;C+EuNNuDG#7q*2 zp~ZWTcM9HH=M)b#-PyZmH58)|?TlD>W|IQj8cda?9j?VWLkJec;C!Z1NZ#-zJ*Azv zIY!bnHAWI`_SY|*j?dPpE9q=D;moNK;gq2)3lnzUZf|H-64h69`GHG{66US=*03Z6Bf0H-8;dT7?-}!Cs|H^$FSS{HeJH$l1 zH?(cTY!;}h0kIW~4fL{OgoH#@^+>j%sT(~+qb1>4UYzmF^NIU+uH#LMCur6O*ves& zx;&<6!9;Z>jhSH|^JGyZnmSNY;$oq&ij7Kn@Cj!n>vgkqEGBH!Y)t|>>6BVbqO(X9 zK-6$hx7JxTROIo_7(F;eiP?J5(jLdLvr_JSW{@jfU99@r=PAir#jvu6v|ju|=3ZEI zU7!<%s>EsUGZKyY60Hil1I$tG-Tc{+x^zSo9iKX}v|Is}SyV=2$pB%tndv|wgR1sX ziOYPG81%*$V=!Jxl-BC#B{^`^NWwWKrDi^g5+YL)yoWcv=`P;%`uDN6w#7}i?qfI{&^A#wM1Y8P9+Kx` z6+^d#l&I^#WXCd{z_bZqbu^4-MpMsdLrrJ{)7h99T8a!}I$LN5rAUv8j5EE0j8zCx zIbbQ_tk1F_OPkanu(N0iL0VVI2|ht zQAI=uk-{lI%X`1aPYWT-iloH4%L4BUhJzkhk99pJ;{p9%kKUlA z>Q{K@@E*h)oD15iCYft@Qx3FE2)p%+(d7v@-FP$q>p%IYJo3l`{KmieO)fw4b%t&g zha-7M+1JV7x|>!IBF{g)O;IRLSvP^QaFo4@$z)1dlr&9X&|6@EDgX523mkp_9lWr8 zkaoAi`Vwe$sFJQ!7g}hIVDJ!14N!FjE^aX0e}w<_bGPt+ zeDoB~Y|*P0XiWs0aAL5&Aha!Y({lWpn{m!@^2B-iPEFICFBol)xc!AM=8bRoF-$S# znw$1vMF@>xL{0d*hqoKCyHR7-L`J&}<55d!>zt@PqiI`G8whPn3==}sgcYk#zIMp5 zyU`#<-MCqsQ-rbV0dJIAfN0KQOo@<^8UlLlvYJ`};cokEt--mHew+|zYt&*Xnm}2p zkXXDPz9|%>Xff8|ebhxv%GjQRkR*@li4+ropi+;d4{wYCW1Q*>k$jkWs=k^V#@JHN zri6M&qsF|aX?jd2eFpU+!)6KR9aUB0y~PzKzjnd9FfZIG3Q1H{j)C2sG1KXk7r*!w z{OU)p=Yem1l&^f@6MXqE*I8X%rFAXmH+Km!va(VUVvDg}jd;Z}n+B?0$#Afsax3p> zV#4(UPdsvpfAG;;_?P!auIoJy+m~rmPjdodtM{-8bb@h}yfsW`eX2GhZUX2M$QY+v zd150#QToug@{TzBo&{N11b z5a03I*Rj35OIx=@qvGd8$PDzn0v3=Ii7C;vhUwH&H|SUe#MsizCQN1%V$hDk+HM7H zkUZW?-Wy9M@Jcd>MMpBa8%00$5F#-Km8GCuuGp%+u5^{+O_+=kDp=SnF0));V8!e* zFmED|ux+D!HA>yE#z;sLQtA`M(ctm1hqD$jE#5^;Ar#3XeufihrIUvRL>yw3FzSrU z{JiYGYCPVSszG&8t*&K4XlBgf4zt+~b<zgbu4*2eSev;d6d>!@d*ZIOwBcsV2#(5B%^8t+RPu5q=`(TGPM+3e(rO2f=N31C$Bh{2N(7> z>!v$KvrC7P>J(bAE@b#8gW@Lh8udn=FVtk-;dJ+?HYw!Dvraf|eA3BjDw*kSAe1H#q=;tWQikqx!*sO6csyb< z+M=n)NNlrvLf+mHwY^T@OaN&>mcOBgl7kom&M2tf2E}r0w!2kRC>0*JQ8zxizE@3Q zH~$-PnYt3e7F5>Z7ZZ2)KF7<(e+Gr;)3f*UO>U>(H0oB-_OULqx-#SN%ClHEBDE@T zo=rT{W|>jD$kud;wppezfHMq?qohGxqp@zuLkgPQV_bgC8Os#Kxl(E=s)k;#r=3#t zgwQBa)>IT_kA8oV!C;B9)bNc#zmM|m9v9==ChlTIv{So514Y zG9rQh@E`tf{_p?z-}%8GxSAh$#el!}e?H4Ims@&0p>P$YsgxdK485wS)WR@BlBckW z=Otqpj|?mv;`ZB?_$P0AoR_4>h~omOYOJW$aw6coXYFj_($Y(K;en?}(<$^aJ~e3( zTjGj>WOgy?YB0xalh65qqL{8Rxp{C}B#f~-0*YX43$X;R_khgMMVt${u;lwx(1s^d zj>v^aqAsY&mQFUg%;ij4WUNujhUD3kG^aF(CDWcVE>;+15;d1l44N?9bsu~CpLygu zxnnTdwgrGzTg?=;uyocwAsMXX2%xTmlKl7i_e%!B$+L2b5z~57J;L;q{AfCVc``$p zpui|O$p%QJ;3|^^nED`**QN#qDZ4Zs$)OOM&YM}aPUSH+iLP~v&^Qo7C~FkHo87=qOD|&o!UYz}mgR*Fj;>y&avQApG282o2S;~v z>%!Mq-`vOP$@N^S4>4;8cxxEg8s~e2RO`6bQS*(>V(COt8U}-c>7*rw+(BEf2XSm^ z>YC8ZXr@!D{vy3zkG8JC2*ZUQn35(1Qgrmn5;1X3^N6WcDp`ZXqzOw#et zL_JPpnV;I3y5e@7Nq)YP={&0}V)7^!(_98;qRMnMOp!U0z@PxR>0Dlt^8JvMHOG1{ z+T58*?gTsCrKMvQSR{MwnUo!kLj>>he*;^93IC@Rid=0|w=PN9r#YXzour1`u5}Uh zX-_L8Xce?hc|K$;qTBQ(m}}U`jMqKkvQqseT4E^hrcvg31tuE8M2niu$s;1n37`zp zytpFTO{w>v&6@_g3b}{FkqM=J9hD5|jo_?qSz@JNd>mjI!@*_#_9tJ+fBNHR8CKiG z*6ZsrcFq^kw-Yr-FY0zJw0#a7Tx5Iu5--2&HT?3g{0cYScq5lDuj_}YS_hnSoIZVu z<<6kVIpE^nxNdU@Y5R zyk!4lT-!f`mkqYsA!jxZ@$C2(HbyHX7O>RxouZ$O*ldcMbi-{N-nFEt@`*@8QDldX zWQa+-(3pf|A`AUxh6}5NU~!daW#2N+78Jh1nhE>&4X{-~S)f3%I7~k1+O{Rd#KA*{ zIdSp{{>y*)&zyYdFL?dyuIJg4XZZb3z`p$rrSIchNtA{*1P&fJg7=1?CIJ4J?8cvb%<1zk-qLwdrOwn(0g5?1?E*jYy7%$ZKlw9E#trAsu2EJ+ z7RpAjme594_8kBb+87AI<*qgAK~qQ8E}r4+`O~z`l+s!>a=pW&bmUeUiev(?%54mt zU{`U5qHwB5Gg)WmJpEpY^}=j6WmeA^?Ox)<^Jm!F-eEEsv$eHDl7K6M%639RVnG`k zLQ0e#c1FTgs|Jb*G>bg9HJ~2va_ZD`T&PYkZVQebvD|g2Wwk8Xc1uhri>%dsb~gLW zwicPT9!VDG6VFz6Fj#mo$5toYynmO~Lzj6?@ien7cxwGBp5HmnR=q&!9Hp6%3QJ55 zBSC2k=zEWnJ^n-H<^fg`0Y{sZz&qL9pl%v`Ib>KYP|pPGbR*fXO6t0$@{ZPkvj!(w zzGj5NfmqMRr8TZTdOaWc)qlXR{Lf4L-X}l7Cx6j!G|u=pU#i$Qm|<*#wMvS;eEAf^ z-hgC!;5<=Uj5G|(9f*<@nSpMFWTQsaTPR#2HC7#YJ0Ee$&#Oy$3D&hkstj?ZJ|~H!d`6QGyr`v(4vUi9 z=-7m@9`#v^oqk!nFG<=2<*v?jn0Z$tl2hf3Q=HmZgG2OQHF_9(lZ^h71RXVv`3YDLb;{0s4mEAXBAsz!RHB%WE61Ju~M-fx^7L^c60{z(m)XdL>9}TCpbif;c z$(~b^eQm6>T49sq>TCDLr_L+Oh-!}81mcw0>s0e+ZP5I)Jpbx98fEH6LFxpRncLg| zdF89PnMP@60MMY^D`Sy5Al9ok(K?XavBXl>#tw?33;dg}UC+Pxz0(|ADjClvh)h7L zyhKRd71QEjgkIku?IG;&GPm4%3m^WuU*(P$yp&6q*1$NNW!?>v6k8BUq-2>*8|qoa z8qaK2v$M0q#>NG9w>Bx9Isr&hY(Vip{W;Fr?Dw7nVzaju*@nkCm9CVf!?|*9L%cg4 z@x}YTz^Sum7>&o;kUB?MmU!>!4Tnflv%C-@P1}H|rHbS*gicHyvnNuM3hF5I!*+bxH9<%MOmixbc3MY}Wa-2QA&StM=abbxRg&1{gZR>!w9_uP@ zI3k=mb&kLD>09{Fn=0Npe2O$4;`@R1bzyZlpz2RD9Md9Ez2u^e7#h4a#Aq?WLKW13 zSJVnRBh-6^XTHVLVyu~naWB;;!#T!eLa5D3i_ZSKgImPp&MWT06B%0Qo_EvbLxkK( znFQHkMKUaF=&&*aUIRiiAT4%IiMJ+WOI=Hs1d8kz4a#EAEnWwl*&=TNnxt)H zp#)4xNptnm6(geED|p&*3DzltT}UKvvAHNJJ}COLGOx=jw@&qfosYW9r>8Xv4h9|3 zFrpo>RY5d(t(`S`T(*T4E9Z%^q&zz2kDt4SfB2s+vTs>Pu?u4D0SZ`m%K{OLHIAx3 zplO!4>ki>HuYEOd`)mJ%tBxJ!!liQ*u1_LlLY#7*6u*l&W7Ng64#WtX+iUD@Z?Lno zL(`1#g~J&Y!={wImhu6j9iA>ILTK>5!n-Vc3c6MDg=J}JkC+R`}{MUIeQLk zEa%Q&WVkS-*Beq4<@{$F$z!@zPkAL(YAn2SjxGaEH_IN|78wj0c4e8%JC2L%!p=^jnFK=cAQo%;%tA|5R203Sy3?Ro-I=GK z;<+atB17JD>QA z6@LBc|G~{yt+95w&xK1h?NpeIU}tBG(ixnqXgf}$QK{ML>VV#oaMVOjJb#&g_UR)m zzGcQ+`lm=S(jNrcwpIsH(Ze{k2BcDMn+aMlQXo6^<)vEQYKu-1B1w~{M6%^mXH=&W z94!@=Wb`vP-SaDY@0(;$KsKpLWKJls${*|gr2OpWC7$UzwfrR#g97hPpAFN2`W-nv zPkvs1fC60Fz+@}ZIUON?6jt9`?DCqQfnJ=Xb(HzO1Z-iKwtmDh`tLXMY!Qs4f zw0ae6Kph*aWhmEGA0;Kms-uDN1}XDvYr#Z^c>P`-kJQ}CI6>LvL!`7A8%VQ=i4Mvs z5(35*x{Z{IWGty|DVN4PG`@-t{@R3oF~i9sjho?}r*0?NPfAZGV-i*(VtP#5KF5wl zUjJRM=H2i52UJC$jg8F=v}QK7=-Ae@QAf~ZAT%U1A(?{h%^fz@&M=*B6QaeMtl7&v zv92{X**e!{B|ShQdUwM=>r!H`DZ4F~AMd2{UvAn!OlBoQ+ z90V{QZ&M-}-B|!xTB9Q{q`7}t8(J(v5=$rz)=VLJ&TjXa2B?#|1SAngI|1)4er1_@ zyJ5F>n3S09wlup*X&pwf4{se=EI&pvscgG)WGS)FqG zD{kh-<3|ZHpsAYr+a9JYblVVgemBXXCPImrJQ5>**>EZz=12Zj#dNmI;!>gF z+^FQaROb;nyK<5u)-NEoz_Y`5zwv$i$PfJz^=!&)ysM~9Y z4EppJ1{A)Z37C15|NnoU()mhRWyt4*oESTsV>8FhVvL&pV$@eFO+2mL4{XsARrV4a z40`RAjM);}3S5uU*Q{?e?C!S2sH|$6QQ8pO`F$8tLnM2vi>SM35~`}C>XpPKY>zJU z(0Iz%o)`9g{uD2N@vFGy*5eezlD1w{7Yb^f2;AP5SHx)%wIyvBVVvNY5tGF_m42RRoii_+lC-gWCbHVk--2B5^i-M7D##if0G^?^U+&X;|W%Uh1e z9zKuMJ%;@uuJAN%PD&QlfbNb)EG`X+Ga=#e{g(RtF8|< z=9}@Ke2Fe`i1e|E#7ld2wbkdD=jBYmn|2>jhJMiY%MS=SO62 zK%b0gl1vAnksnA4HdoZ{#zVBA>FK zD~fW)LR*j|Qe>S~5~KVpBiUYdSMiKyglQD4Hc~>XUu#_=hJutl<-&|ptn!Y3-RI1O zODr!gVuDu!rl{*^;R`}QPu9!=j-lYtb(SCb{=dav|B=7JXfz_V5$g**#j|!L#-O1F zCPC9Ot%YPtE?(MTfG2Dju;|Ce0M|mb%pgZ&nBT!v(gdy6SF1OVdC~nb<1&Fu2^orrgbSzdWTtN{Kdi zf)XRnm829|S~{$h1rf%ZyL{#|pXR>%D{i^z4sN^s#jG4SfQuE)Xp7QhOK2_oG>st` zL+J+~yMVem)S;#@j-n`;%yxL}ihU+|{dHRq#XK7@{ zZ7(>+&DZ@M{_VdjxwQQyuD|9MzWl(0EH5syxKvTMYAz{8?TC$m&CP8F{Y5Hcal;|4 zs~K$yfA3@an7!#myzPeP)pfK`u-v+gJ@+kQ#*myoZ}Sc^K`;up_)JL%Cf^Ur0g~(q zN6~dpHa8R*3-12DLvXt@HMirYlkL#4-#a*`6F+y~t$%c z`S+HPY9LwcT(GIzf`s6!mdwV;KWI+})+xjHxH(bnZ?bUP8ug1x!BZ}6@`SyHAN-ew zN6u_f zKk#h`gxE5j3a3w>XMN+07Fg>@N#D0}SJV!A@0zNntqv_IH0t^89c5K9YZ}g9UgN$8 zzQTnI=ct^;d3DHa+eWWR5)3&FNnGCWcEGD{ExVRHrECc3(tI%hGPgrUtU6)jvC3IZ zj2X8uGx}LeoD$-UX|0~xSVBp`aWz z#BJe6fA=_l^x=}X)DO`31)QnzrlJWAt|;|h&z*)K;FLQi0SKCqltQM!Sbf%$%hLlH z8W6kZpkU12IN0IB2puw{;JRXPN%X&)ykt{eZ!TJS(@$=Qx(tO5ELREE6~8lg^^&In z->K%ix~X+X2hq;ksw<2p_hrhlvMS3#kWS{_{Q{#u$Yf#T+@>b~tdwt*uE?33%wl># ziWFt8*qI$KZJIw|7$v3|fHGi$S4z?R%_&8|&abroX9xca>`l`$9t)>WpJwgSIpy(W|Dl+)(= z4c0d{5QJW@%Kl%XENWx2(_>e7vc+@0&0>todbf5SO>eCwnn2ym^udvcq<~1GjV;Dh zSW3k~Oha@Pvni|`URJAPnbE5TijM`#lAvbvx}iDdJGQsiEYax4}X(KAAOL!Uveim-26iJ zEico~YQ4{M(F#$=MUrJ>dz+=DAp>7Aokk>jg&&BVJ$s7Lc+8DA-a>zIfQZoR660&{7T~PeV=4{;;Vep-Lh}d%*W8lY=>Soz*!Fo znpvYBZ~^Q>%kfJ!pZ>;vUVZm529pbf!4MmAY*?}xx7AS{TS2TLDlQbtpcExvWbC)Y zo0FO?8pRgXnO7&L4r?}&p&6(5ikK{|xpFj=44R9U?YV2vWtKv!lQwh!+q}3v7jHuIsSdHycy*DBi zP%|CCPyPG-oIJhG@~Wjx3s^JN&1vp5qvWv9q#UO@6|5YDcfI>PyyLBZgUPs2(wm1U z`Sk@An<~vh^mrGiNVx z-veLc{Do71g6=Va7)wYkNg`hIfq=z(9lKJNQK+GxZurz|TSu^_9$~DdZ6h%Syf3u~ zQDAW_6b06o8T-++=&Gt{YQuFm9|5-s(=Dz!el6Etx1R+cuoM~JP({CYdz6{!Y{GQ1 zMccGUJEk5_NUk6i6~PC6wSJBNwLKJF$%LG$JSwYwqa zdpd_N(=Bsyld@;7&|zP>(>2OEP-sURhVJt7*u$J3TQ43z{EYd_$3(1xkblfvuizminOwi7&Pz@lp#S~yN zHYQPN77F&+xuu3ghqNV@5{yUM0uvkD;eucJ^F==X;2Kx&FNslbt|kV(4h~&0#}sg0 z=ljqG>gky8f7?&+Ge7oWHrBTZBz&ok7l?AAQU-=4DsJSQV|#1NGf$snw!5hTAw~mB zt;q~*GT?12&e)7ysUN#@iRG0c)4Jh{U-~i+J^Bbu+tMHO5J5+^%mz-7y8*%GLrA$= z`DPMPg?ucaYG^~MTe#%Q!nUDq@_HP&cxbhbc}SFydw z9B-SS!gPFp#XzDYZ1PN}Gped&VWCe|6{NQ1YY#lgnKKu7>0K}8`s=P?cV}Cd9mbHN zg4V-+rN(@v(|gRA`8@?t*JGYL@hojK32wpkr(HnNQvH(sdM(fMr-DZo2bz zeEf^g^VX%`;@5wC#?Spxi#3rYzn>{hE(&N0k8_#%7fC_8=apW~AAD;cf9=KBaOfN@9)`h5Aksq;pkS1WrXVbW(}KDl(GTD+n= zN-67T_QppsiH_qb`QSAf*X->NuLV2)vR?P7;hu~%91ZAJd_J=u&kbF5626G^?xvjuZ(9VQB{xS}ejJOc+& zEnSWr5)U?Z1vKe=Y<=$VbaSa~dQGv~aR2rV{D)6$bMqHi!g0(6ZlkRTSV1&zv~PgWvoH=PsV7C<}ak@U2sq$dFnDOHuTQZDg)gfcX|s zMc{$DolrL|lX}W%k)Ts%ls^uX(eNxJu8MH69?jsPikpJ4!}RDpi9xS*%p zVj9sV!I<17T1${U2DIzKF|z%ycLSnCT;V8tLyBsF6kB>#kKOG}Qkv4VHEoz6^t8J( z25UUd=k9?t=K(1O6G=2kf~HNF*n)8sWl3)^;N1ChoIG)YSHJRZUjEX%upa7J$Q^@V zqG8bQ;hmYgX9x*vGhfXZL|RTg|2#&7Yj3_m4+yl2oj*9_Nkl6t#zc~h99Zn}f|tLO zPd+l`Z{P6i{N#%+@q4H4Vd%Emc=j~Q3&S~Q&-y*0Zitbkr6po$IQ8rX|KY)F_*XCA zAZ^tu0get#kwI_4*#?s=u@TK24QWos7K!S>AQll-HxN{UXLDUhVpMpn!3@l8T7`~H zk#VVxB2T_f=8A?#xbmMmz4Hjh2}6th`F;R`)+M8Qd|+nTo0 zom?FcN+htju*BNhCZGS(7ddn0EXG2AP?E%I(5Z8|gA(dl&0t{xXLP$+I7i5|3TvQk zBTX}-uD1X~ufNE#{l{4tu2Pi))K^^ylBld9G>s1h{|Ax4aGL<^y? zAO*u*v_lBk1pTs)%Oj!C(KB??2(1!gz16Q349@l`{19tB%PRw_(i2m|&h7?HJ!WTX z10his1FCX}HwDQk&Xy!^Je}fx-KZEst1_`dEmRhl1{6iXm%j29o__XeUh(o*aKrUC z(bQ9{aq7^T586)rYddU4RD+v{SZ8?d)JdlGlsoQxpa0C&`tKiq}JIH4r+T!qXAHk49oUk-}_V4b;L_eXB7|BoJ}abX==Jxpu&|He z!U{$jwl=qz)w>u0UlkO-hZ9FMfe`CCeM7H_(Ss!lZSG(Pg8|kWF0XI!iBEo(JMUQI zWiPplD2bx#MjJg)opYJ{X0!{}rw9?jd&8x(r+GNmy!d5z5%NK9z11$pb|haVX$pom z1!m0_*Ia#!le<69XHGxIKY#m!T)1#64_ycxT{5H*1YhB7OVhMeWrgz=+J-iIyfd^r z8~p1(bG+%phge)X!ECpONmG(Uj8jO#ihx(RLafsWcmuA4FcalXiY{xM&(Kh}IX0qP zC~^}scUiGSuZ7TrJVr{wqEw2QG35Lp<)UNr=-4$mPVe|6IsR|2`%*^}^!d+RK}+l^ zqM4t52CasK4i&I-_JFnylBxEY4@2&*x;C#n(sQTQF{tTAL(@(4+FGimk%3BZgGk|K zv@>YOo_5Dzn%sGyN3sN<0qc{hal|0j%tHhu^G}rES%T?f#1R9O%aLzf8uBkbI_1cq z0Pivw>bP>V>72{d2O&z}uf6p>{NVfkC#v28Z9BymcCR}`U%#5jWsiCBoPPc^k3ISj z(|U~a%B04|T&Ox0aLB;7Y6PPse5rWF=f3zw{_K-~PTe*XrK4$PgxJnk`;u`$?@F${ z?gsYl->2!(`6ADnhMmzCTRRu9zTx1ZYqc}6DVx+W@w}_YBrga9*g20`CeemJlO#Qxha*?>&|KXxN2* z29p0z4-2buAOVP^7-<_YW=K&T;PBC#ICAt_`U^v5vl*k&h^DQzyR`*|j_|0yWhuL> zcDP<$*Yx{+mX?+%O2fsq3w-*spJ8)n3+ElPrY3}V#eHsbC~gZT;Elmseb|etU^;0DtsX9#-PjQ*v*mOfX=~_L%cSX;!&k5H^ztupx<1A~f7dw@iR}$Xe^6xD zK@YLIX_!o=_(Fa8lNA<*mNRRPcmL+KoHR%2FN_HEbz7J+ak+bf=W-dZi~p1#nqmmThMifvJ$lBO^nG0N4Jd7CN1jd?lN?AC2oGj zHrqteEvHyC_pAGb-Iqwlin>jnRG^eXlo4|)tIP`OlhV{GrF)5Wm_S#Q6cJE+ufsO5Le*cgDkOv?77GgE@G-!=tZu37zNA8$M zIYdErjHcr_Yw5yqD`WAdGY<5mBurf-8V7BlX&t+>1?p*FcNVD|LyUPO_dpET)KWR^ zV3jKbg|S#%?wEbn!D-&2wF-*692Ylh8k!(r`y4oMJ=Yw+jm5=P+Bl}J$N9l3bM~Vy zO}sC3F_Dzy8A2e0z+f<->Xpo96DIYP&wl>%eC_MsU}14VyM@@2=GWb4us@TEQKF|< zL$BXweQkq>zx5E)X-jB@w#nV27+nNd16Z7O49bM<4~WeUFS!0T9_{^o_Fv`s<+q(@ znr7_IT0F{A>z+>U9h2!4qOdp|;`%+7?Jj@uxzl{){-ZkHH#3YWNT~!$Jy4_5$s^-$ zE{~1Yt8`6oN14myq(j54$sLhooYmycME33-t6a7D0?y=A?mfInzpi`#hP+M8D3Q0? z+~g_G=nD4vy?Y#H}IKPzNf6Sb!ma?-^P8v2EqY7Pfd#oKG zEtVFKr}712BXulQ`!{LW#gNPrLckL#{g9oUxP&b@x?HO z44T4hjTU#35R&B1P{*_owA1KSeI}C$_3kdKEBko(;l~*5?DD2JzmhQR8|FdHgKFkB^VZE)=! z-^+bZjrg8d|5KhHo#Wqr>L|AzTSQ!iX=iv>tFANFSleSdol!Tt5Cew?BTj7|XMObm z``33!sKKOWJ7)MH>ZVVOWL9~=c$bOYIyD&^b&PfDk0sgf&g4Qv?%4F-RY9TVnjKe5 zN4pel7Rbjrs;y;9xA_K0?h2JnwlmMPO&v3>0~2!^7nt-PjgZVdOhUUx$()p~BBA3S zWX=wA8<(!88Jhujw^zvK4Ft@wDr40QOutu8RSC>FTzE)Hr2{EOOr5K{%O-!_^wNN_ ziL~287LH+tC-EJN*HuXDA;DpMMQCRf%kYQmFW|@i$r`H*Exss09Bqg+O+!kFg+ZSt zYCc=2YhL`K7xNGQ;YV2Ax1T7H)zuX?H+SY6&=`f-YRKqp+7Ls@=Ef!`Pdti908v2P z+Ps>j8?9o#mSg~4D0&57d+=L)`72*xxVT7?KvU1M1$D?G+f09Ooh6Qnn0*1WW|!^l zb*{epCRSID(6$a^N+d;MH>P$VT?VD~VAPvRfWl-sf{WPX2sSYlgG~c`)zB~dEDjv2 zgO+PnM;uK%?CVcivfHf08LLYZjj$U1GrqJ>P&WNG2&AB2yn?%5D+ay`p2Rs}*!fQ5xDfW^3y* z+glq{#ek|P^FpJ|$<30(K61poQCf#FhS6xspxG_?@w zeOQ+;CJ;hFOa;y=78;Ctz_m@}z`^~z^c8ohL@OWuod(p}9GGIXm`&=I!dPbIA{$Tq z3+_DsZ}{-Xuj9TGhq&?hRc!B$5NQeRgqT{qtC-d^B+by35v;`lzwo|e{M}o=K)5`@ zmJX!B5avYiWHQGoM5M6l?(0-9sJtk>j<(b(!#Jn)L5v2$bm|yMh{=(8hEBYzpt&)` zkcG_I9k(Ns&YPGdBs5b1FZ%s4Df_@#QUEPVaXuZI`0tGv$+P49ib~!N+UyMtrZMv* zm<|IM+1m=vqqaJ)8@+onCP7EEP%|`%c}&W`Q@SDuF*&u4siLxDJN&A&q?w)yMwQYE zrR^jxhL^H@?SzHVlaLm`_Vhwv2-Z-PBi5F$=bnFDaPHJ5ODk1wIXz9&W^mq77)vXW zrmfkxxX4HT(Ld()7rl%&CZ2o#8LqziYRaM_X5hAqNN-yqM$6je%RKqm;|MiAo4$2# z-R2?(MtLv!#1T^>&T!w??&INyzD2)3z+eb%ok@C$wykl#faJh9e6feS%_d_;<82mK zmpFLv8V3CpX49-LrO|L%49Tjr$vKC!COgGyhZqx-*)FI7T32E#&tTZ+s$s(m_HS~_ zzRO%c9CKi}%@OY?!x)N|)~+%guTrF%syOUZUcrjS>fT0t9X3t0AJlb$ce2(tWOg~oUrIEL(^hSB3VaBI%caIm&$`M zCdZU1R-#(If@U^iXX^sZtid}+uV2wA2ih2bL{U_8*0oBodPGszg6XKG^)=u7mbdVd z+xm>R5)sF2TH)v+wjsnsk^RSG>J$Zrwr;uV_;GG~@$EUF1Vq$#UWk<5Q8-VMkf#uf zFH6p>ZP0u6mwD0l$9Tv8co7%3_p>sr^fRB1vWCwPQq5?z#p=Q;VtZ_DU7}bz#GijS zaDDSF!gj*=S?;bBR>0?kr<9;@IaDI6KWKF-@D}4+RcxR*Gi?r0oudeu>E0P0h{4R2 z8IVHvIphhS+V>k+R!3>}?4NbvvMe%KZizt{k7k5mXoK*?qu*jO-lFgoAt*z* z+c52|FZM`u))h=c;{FG}z|)UEORpM|q*dTNOCi+YFHjVfj^3^SDKI9nv%SgE65Mp# z3)tH3K`PWE$&f=klsD7?r-FvmI;n^xgn%;@jhQ0R(>OfWhVwb#fwUF0t(l1@xm!KcP8}vLkeG^q}y)uXXcwg z=L&lLK3y{T#`-#SJLau#eKU96ek<+t5^Z#ZW@M;vQ5DK3GbVN%X^dUq%ZOitg;w5(-;154=nriJdA%RbAhG7y|kEEy+5^GTEyOOX$Fi9<;Y_==5 zg@GWXnKJmVgs$eWxL1pFX|HHr8p-2V$~HC%J9P(&A~=~F=&aH}vThVBm^Nc&E@>y! zCKW$-wIst(dvt}22kjLpayz&Ox*7H`HIqy0oQah;3Z2$SFm(33-Mf{9`oU!$n2Jav z)M)iinfntHCg$I3lM+T9K;-tjTY4)!q%Cz2wiYV|k$_z;`QN{G9sl_gXINb@)XkI_ z9i{JsQN5Yw5GKTWX45VH+V^}H?|%0Wurr!!UR`J@e4k#gqG=j+1&Bf$B7((v%M*`1 z%4lbovhwqdP`-q@PRkrWv=V9YjO)mwC+_3a+G7|$)a#h#1u0WKv?KBuTz2KLG-1Mc zXPq0bKgJ90yqVLd60=!N=@pQTDXE=Nrc7w`m7brHygE{vn%I_%+ZsdQ>O&Pb9QVBZ zx^vvMaFGL5AlSoP?!A?h{vd&hx>%ugE4XSIV}}^$>6Lw)wam-{_2E|#pZOh%w8LoS zI>N!1QPtX z(B810`^VSwxpS+0{@fv++bTGc3I--pINhY_f+u+=#> zH?~MoB~3-4BJmg_MN#CFKQfz6@V=zq@3XS9!p@H4&;IPww4vn{cU_NdHV9&9r;9+u zxtwQdb#sVla#YnXIDP&JOi^?F4R>a7aLS*F(Ntqe*}yO1t*4P0N0*NB&0GIHuea~y zZ@lUp|N5`4f^vZIL*leX2=uBxF-9h{G0u2mj4bwRzWCJ*exiRJ|K-Ofl+UdbV+FR> zWkD1uKx`rei#JBMeT8;~DHF!KsJd=DJhy?7j;D2HW76SLT_Nf~^SwW&d*-iz$IX1g zl5G8*zgF@HnK@m?D)#L=X+tMk>~NNDM3ap4tL{&Wk95Th$(>oJ`j`3X(p98Rv8|X@ zcLM1vGPy&WGc92*O_^^T%X}efqtROVT_;HzIbU0v046NpT@6xU#1LpHiYZ@iU&gQf z?s-<@3_CFF>^6DLtRF&6N`G#Zst)Kl_LbS>mvfA7wv9xW-I|vW6L8x_66aG;~o6gyB?=pKZCTY7fe;7lTie( zX%dJl72k?sURhF9Khv;<6HoO=}-AI?IkD}va7o^M;b)hRt^AdnwCy7a| z#1oLReY>-ypq-abF5^Uf?NCfUTU$pMRLfs2DZbikVC~d*NGL-Z;<3dPOsilrEvLvhtlGP&maJ zoV9psxwL+X#l<1Fzwq^J?gpNGavg6y+7z@`xN<1o*ombjw%`+WV`+kCVQ6^$t(SS} zwL9E?=i8Vax|i+ojIuXmXSB`XtB+DoN5rsG94yiA4_Mu|pW$$UPk!Kduen-eU-G;p$OX!} z%&AJE_)}M)x-Kej1gt26(~XWvbb{-oLE6pe0w9q$DQzxv`Ek@Pts}SU5@4Yp&_s?B z<&S{xdpf6cM8OubURJElJez(BkKbEp5Ba>9b$q)cG~e zUxe+=8H1iDwpltNQ1uGcjDl3D-rYeivnQ3c1KfiLf zESZQGrC>Y*JM8g&H$2C8-?Ghka04qh{W!DLyKoXXexTIP!S-lpJ6H_H78q|x&LUJQ zA2Q_aq{*8uGv7W=#j`Uw%*-|tbm z3JDD%&mzt+cg{%3u()^xYkO>MU#6)WhQo!t;fnJXAf~|1?iL~m?+S{d;;N%p@wv}^ z2|p0te$SAL7cY{+5_QO9lqgMGB&xtY+tU=KaPi#pEG;duvi|^W+hSdTF=T$39tP2f z2GV-VzU}jD?z@ebzwQox;p7+j@TW>{+UH4WKq>+j)n@kk1Deq0q7cCfHy`%==4V^p z^P;P{W8rb?+F|Kz#S`j{7O^CvDX|zeAs}IgM&E-|3|U02vZd~L2O!phci5N>6l}f| z3!~fqRv{dm&7iz!6Vx>+)Y1XJGmN&YdtmXN<7MiqtpgLS21k}Q zd$W7Qf@Q*vJIa6jOvFzo_{w0glto_&qE@5JLugfSYaKV=coRSTLqAO0bPIuyB^3I} zSX+>Sva|(HGn?|%Q;%Y7R1h9kip9Gqdxnw*69R3PixfqXA6Rs3cOEM;w^6pvX3dz%@(c$l zA~sR_A?pu7b8H2QDg&@us8k4>?UqCCn8`PD?g+a(Lt%{$A1!E`gta4t#Blj~W-B-G z*r7Ml+j@or+keWzjn8t&;sf0Aoh!U&?OJ~OscZP+Ge_7R&*&`{h|L=(wAk9YDnXcG z=q>JJAtk1xQFdfCDm#gRloZ#Bv1MnpNxvEZk3ew0(kq5IS8-t9KK}fp_fb!8;(c#F z%;mGsvbJ*+(vVK31z8&^8qnfgz}m>k6OVIq@iG=ym+4ZDx`SA)bF>AL1h~Y)cFl#O zzsmdXeLJ6d<`SPjbC@Gb36jM~gT%aG@QS&HnDEl#ZKPc1ed#gv&# zD55Hi2-a(82O+0jW&Nb_4vCN&u)QmY#&k^2094v!ShNWGh?!cYM0L3(S)F0$&p#+( zI)W5vVs)JJy@G&A23P8}5s7%?)j2>7>vMrJChPU|yKG07H<@SE(Hl(evh4h?=~8Zx zPWrr8z&cv%9?8@wUo?qwInXUocMe-?5SvHKmfSXi5tYnH0n`TLEy+1G^7Df4JO0P% zYk2U1GaOv1sH6Hpm4%93+cd*@4Qd?k?DCQq-^EY<=#O#r)i)}c)Oq!W&-OWzxjM=U zFNjfi{IQ3L^^CGCwOHi$gw?c~$!^fo(j+iFge^{<`X;B(U*P%ELOb(#qg$9}T4RmD z7hWwjM7z=5@j595Uh(qR(}aS{Ya@K2?R5^+!}tuwXYdkH{6J<7UyZr;2I0N8uknWK z_pyHP@3XP`oeYXdUm6IOU>(tbCuN6 z!B=u&{G%*h`dyZ{KF^)24{_(~pW^-(zleYP;Bmh7+>reNVy~fSOR`o5XH;>Z&Z&ms z!hU>FvAwkhsiCa;NS16Q33T$5>2#!PcjNHB;=ukMfBuPQ*uOO7P4{@F&rF!k`d|uu zkfnnKvj2WG6uzX5Gfq7H7%zRrtM$OipS$X6yQ1ml|J}-nUAdmMgTKT_-v0Bv<<|y` zCp{J_#n=ST?&doEL8az~Z6dUZM2i*Sv(FvoCvH4IoK1*Bp$NO`^5pXvW?gpsR1Dda zMgw=9K7*z;cyWk$u&ver>5g+xGC|4TVl_JvL2N*ZY=7SQfmx4+U+AQzVJ03iN@KF3 zISy9964d}Jt7f!mOi{ZTZDh3~cI{JF1oP>qo5VcNcH2U_i`?DndgIT(A(?!7D7zM; z|4DyL>Z)1xKhGVpkWB!)F;#J=E*DSL+!`QYT?wMue8G6Ej5ufa^B+DtqaGpBj_amRQ^qqy5tQ#VtLg`zA-G0`*)&RceN*Xj2wUiaGX zVryHtw6TM=QJo?qDqk^sH@UNxnQV-d8WX9jV=K_EGH3P1{>&G~E^FJXRcr!y& zBke>F2a`ZTPS@?Q26A>{mS#Zqoznl!g|I2j?;9OK4VD26N_s~hQ;f(3l0D4pE3^68Akh^p)V@{5$zr^zD zA*}0B*EK0ctaa+cmG9FK8%C3DV$#=G^!Ic8&?>+4yZ7_izc4JX9>G+*w6V?I2XqE@ z8o%oa!QfrNcxQ{}pF2UXD%CJ?Zfo34EJo#5&SQMRkQo;byo2L+yoZ1KolkLgb4HMc zUe#BNpVSg#n>zw+LYe^m!IZ!H@)i%u)z~m*G%j&vAAEr=qB{B}qlb95rtau4_{^3s zBJ>o8#pslRvzQ{YNS#gvA_lx*MA`G|U1s(MFzGNXr`UKYidQ?EiKSMhTh@Zr?-vWk zB&;`@iO`LJrcfHbMFDt~+=`%b03tiZ5Kr^W)INb`=hv6*TI?m8Dcs|1TfC3 zbrmUV8x?<%2~b0qQ>LOz57A>&fusUcl*lY#Q;l7y`0o#|aN@~rRu-3t2@EBM0+s6| z2E7HGb%dtj>Z^`%&v(8NUkz#6Kh-3y~G? zvzh3tr(|doRoQ2IbdIM_oaFo^L)%!q^Lo8ee9l?r{(!|7C2MP!SXo)%4d3xrF0Iu} zn;E57t)tC8QqbXf+TA%Ln8vbgJg<4t2Jd~NUZT@BSb9t$0a zx)(yRx3>PaUQ2Jrl(G=ml42f1MQ?IrplLm=F-QRew?>@`(lijFCkTX)*d5PuXlzT! zBlfJ0w5_3TEVJ4$odsf0{#i^dDK&sba6#wMuTf(uS{%ESWnyXZD(rQ?$TKhab-vku z7d!2Yw;%co{>yiLjytX!b9QryB3TX4$fI-0utQf^dc8#!SC3HjhIAG`u0cp`k1-v)MT7VsqD)BH)N&#J~I8 ze%#gjSdiVkjStEyPaZ1)q{WbOycViLu}Q&iu|%uaeSUAu7jU_O@kR|b1+^rPMq~Oq zI8X#t+;`oU{Wgk|@nDO2ecvm9S!t6bsb6r%wAUAr3rUADb#w)oZxZLkFPFQmtPdog zwAzOya{S8P8nhesoZ0)G^HD0B!et=0W8O<1A+6IFO|nSJHvkD!mKgCk1Fj4_<*(y6 zKN+ZOi*b(94hXICnfiU7fmefbE!HMp^{Q8J>#esi9@SdOt(&_?sB@_1qP4l0ojmbW z)=G69n3=!M{AeQyszJlRJ4U01haP&A=g;hrqNnUnRU3!erFd@$p`qVffCOtB7r61J z>v-*J-^hLUJ<6<&IlMGq^UTWcBDd5uF*0iU^i~2te&;1_zw>SuuX-DPVIL;cl=UX! z9IX_JG|Ynr=4fIDL3411s4U7Fr~4P9>C}LB0j(Mgmc1TooT`H9?cH6b1Qx3SXU2D(~@MSIlj-o6mOLY|O9x`ha)N-MMvRtOT#mkPb z1`ze+uc`{iK6YcvtRCZi!Th7n*UFHHp{6koC>aiVw4vd5fA{13*av=)q8u=rwRo?B zalK#lXGF-?Q}9lB?9qogu>TO=Y0{DtJ(Nu5E~;ijJKhC9VRQ90T)OaD{@Lrk!0Z0& z3Tqp%vZBP|@nlL-_Vb;n4}BY37K)lb{QNF2zwJ7H=HLn1@d#&2qzGUd#UwL9J4HQ+ zAYF#cXMVc38>~&}&St211^|$m69rRn}OAfK1AC ziew98xp?h;$-L-%8|ZGYC`j2(w@c+PX7BGZdPV1C zm}=!Oi8YvvrKQ^Hcqj(ELy{%s50hxIWg-^G`G3B;$f@U^=h)#Dnp&vJTsVzNR0^*v z*Dy=mc+(4b$M?OP@n}ZptDd6bRw<1?M3_tKz^g%e(U8!dZ(6314mX2`6pG*qQ$IvsQ7)G4mN>Dnx6hN4p@bd&=z5G_Um%jE*6SALY2-Sz-K`>Hkmmroz& z=#h%qWP!vEZEUbM!yx(5i>_tCZSzO>FY*&V(8o+hM57rArt-A4nqE5FVDkHQS7b97 z*?VTi=x~cMDxfxcU)fAZ#~MtnoxeWfs$rzdUC7Ww9u5#%L<;6k5g5G*rNg+%*UjMP z6ex`TK)V+`-yJK)+l*UD-Xz+&sb5EW@16rvn!g~CF8*tNG^z0N+gND%{~2`E+T=d0 z1QWID;vFWa%YhM#iRB)^mmF3su2=Ke&W(KRzIDp7!8*Z84`V!q^Ez@GOTSmph8FKy zzVB`CVc*JO#^VWP>9gZz$3sIOuAoJB{n7<4oIOKT_*^JD+uS@_B|-9tktES8R(bT1 zXZh?GKc7>8B6ZU4!Dp8ME$o(Fuj0bR=fD;mJbVKWJ$jNDqnhTWm=*7O%DOJ88|C^y zVE>_-*WYzJFSz?H^aj_m5T?uu@J^*CbJ2O)+gf!;P0FWu=beio*V4S6ABZ7Js$7V(fQ(_X@q^_Wd zVK&*o8q4;YqYkjNx}RZxK}S@;xssiY9eRVr{(S=m1KkEY>xr=jJkAw3mmh*W4K%>e zj3|%Z#p&=%eBtbWCSHD)o-O#zdq2xBeDUS{#i;`v?9urKDrDol;$zNGR!i*PXW81i zsE~?vYM_{s`bAljalSxIGYlmQ3kzJlaE?!X>dSopz28Bsw+LxTJ5jUuKhTXUVkv#e zlTSX*>VbVME)9q=Q8?{r_dYY5H}-}q)NCJpE2pH;X%FM+_kFW8-NiFDsTXo#7W+p4cwAc(!H#(gMcz@wTAfUxds9ibkzinpxtNcfW==z3CpNvnkf= z8%s$$EX}{u(I`epq2{@h&*;gU^?4~<26yrV=Nz-3C!uvEbyM@$liy-ikEpUWj0U0R zMT{}Ih_ux81n>J?b?k*)x;(~M!ForBh3icqd-lBfu5X)ww^QEs_Ir8Rov* zp1~!ENv`lN>TZ@?xbo>1lMo}>7)_W?r)+F&vv%n+qpeM*)15iN&=;1q%V&vgi}MA( z9BM38jy><2$QLes7aOBPYQmT*oC!!K>RP~gWy?#F?4zaHEbAHo#+&CEZ>WOadastx zc(yiLn(2gn`%C&uQ_5n9a}90V(CZKN0J91ldjlSIh_ESe%e6Ofy8L^5eey@FZJxx~ z#J~LB`}t>Ixt-ts`pq0!j3lcMwsjUOj)ZO~%W9d$#mM&d#Vq~F*h+WH8!b9*8z`%S zUe%*_@Bm-^+T$EK((;B^zk=sa27Kw}_kVZqlNAw#hgdf}`^+=E^kpw4#2IY_?`&>3 zI^L5-OrjN7Fa^&ad^fL)_w&JfCj5g>P1)}Xyz`7kJM_yw7`4_(F%rd7SYdO0gKtib zaLvN=q)CCb0b-je%NA#J%CgoVF+lVP7D=rZE{k$8O-E}X<6wET5>U%3$pmudRQ9e= zrOxR^<~2(||bmy3Q=f&dw&oYC%Ev zt~-&uStaYBFc{-V7{2hOuX1VaGS&sAloNLmAh9(NvT=xR38{kb#%0Ej$ z0ZXf$oC3cdYoM8Iv$(p*`+nfPy!KVEr4Bp9R3px-Q1uGovoq>()ma2}eq16JYYK$G z=EgefmoKq)`7*ns5hi;^^?Lp87}bv}_J~EHHq@dv#)^jtP3kcqQQ4MRs<5WcuR`V> zkjhYU_aG@3ZA%Df!722HP7?ImY}7PuVmKJ$ER41*MmrYlgad~b7%UWwMm1$&DJrjH zMz%A-c~WecwvnrjEVD3tKW9#Vk&oZMhz~7)?=|0IW!UnczIqcwBY5vf-rx&O_>QS1 z8KFN|#=C-zjWaZ1N`ZQ-lYO0nsN^S38>(`EcNK>ZuJVaLdxk?tZshRFA;zPL0vO_Q z*PQXJq@a4~9hc9a=hFEL96EMLLtTx}ZmSlb4;qs{3!kQh-pe@Ke;wa_$H)0MU%i^k zqcLUKXS6$2FMVey3QOp^9Ruy|4*&005AfICwv5@?#q@fZ5NS-n8AZpXvnG~2b&-_N zo#6-(FkP+!DE&k9>y0Ssx5Lo7F;H8xd}wCcncBl^t2Kv-a+t8NM_iYr#og#gXy}aQ zyYe%iRXZH&+qOzt=}A%FSohcY5T8$fCh0tD1Y(}Wtz^V8cUk$H_r|J(aYAZx@FF(H zBqjDt$Sm|#%qz)bX(`LVt~MSmV;AbBbF@n7=_09rGlQzcGO?JWbp3#~=HBwl^kNr|o%B zsN*H*V3+c!UDq{jNL+W_EmXY)>Y4IeuGmK8(9kYnCvQz;%v~?Jj(flFUT(SR7G~24 z*7PtgDhG$G8ZeF!<6KCcKbg#oFKFtPjmwufd-fEYYnO;o@I^ttD)oKl)6nEDyTc~E z)9YwWqSr5(PBjWF3Lu4sKuEwjpYt|j)@$nFFi)IGDn`=8Yo}AbsGP$ZtK2WACu!Y| zX}5Q2W-}HS7bpjb)6ZXKY2N`>_bn=OsQ{lhm*0l>78WeG-}XHmICvu;`wNRb zGvjZ(^c(cYiGTgrE$oYlx|x!aP!@%5r_e0FqUy7{|0owPoWdAG)3ykT5s`5)kwgrU zstPPF?x!BYpMT;j{K)%mq4Y}Tg}s6;WafB&^qdi%eEe~iR+n+!X=Z^*IHMU$T{EDE zmu00o%*7)=%;5Ql_~}<&<{$oP!LdUJu+Fiuz0IJ%fVJfuZxRvqtq7m`@{EUHeT2JY zo#6W5EtQ=p)DjKW2`QlWY$kF_W9OZoHa2F@;YG-kl6)IEK$3oo!Q{e}H~o@F$_}qG zIq=mOWx5mQuCvn7h8(&3id_-O7j93GwwJPzM?_3+^@7a#S`twMzGQR;4G9wk6Hv#% zV6(Gf_ske5az$=+1l8yi{b!RANfUG>N=VwNC8K=F5cNZg78@KPddyXUKlob3mmWXM za5$v$%Pg-hsx+i1iAgtWDXM_@o;QAH2Ku@#w!?MwLZ+lyg45}g=T1ILXgd&dk2lth zWhp7v=z$GP}a6crfSH%jR(u-#ui_D;G2B? zYxl8s=_1~h40`>!%Rm(KDR{NV?tfMgv+KDTsK*0TWo!&={&)WrAKiK<_dj<7Kl;)~_@$RT#da_pIed`YZ@C3mDBIoS zjcmeF_7+&(cQ{{L^)!n_oOfBAqz7)@ObB7daH-Q@;IOZ7^(XKPD6+ooLP)0}n!TJXh0OdJubm(suGReazzr#QY8n2llI;y%in@%ywv%YbOn{K$3n{K*>>2!+sdlC)Fql8GD z3s^5-yufI@OI1`_6RcW*L{gT%FgJ{=`UPM6#{E3`^yBoZiWuwp#?WSieUl^Coij|v zJKS>XHS9aE#CS5vb#TuWLvPH?a&|(bMHumh*WSPn{qXy#ddt+)Dc+cDwXEJ-ZPVzX zk+fP^$(9^lkf5!2;^8N`?+agGXZ-?$UZ1K|ih+`4lSYT7J%1<_(I|%LOtzj*!pcHT z=@iv-L~LuBxIUw}L~1f)ENx?A+PN3iG zv9!EQ;bAnoz}Ds_!+uF zr05x9bV%z+!9eSv0h62(Lo+NQU1KpU-Jh$_kr%dx1&pR zf4WvN+1#1w@9o}{g8Ff9j?Fi7rg-U17$dDj3YqfMIy`fEffwI;J=Y$;1_PWrb&iFF z1!naaV;V-&3&aq3!*||I;Vo^WvF-D8=!~=3?Aab;%jL@#=MQRE{52faW!$F08lg9+ zID7sa_doCeON)!y0M6&uUo}t~^a+Nz z!s}jr3xEBGe~{IE`)ISRb0>7}+WxXs8(=j`Gx=l|s;bXyTyx(S|B5Fcf1IjN?vORg zJ4<;K1I;@$*@HetrFW#{NXe5>N{Pq}&kP~5Yf2`uU=7bp)5E-=e3)cQrpYrbXH;OK~G%c9JAS&eieD`_x=zcYv0et_LN_E;ZywNt1fcismpx*fd?7(N_tg6 z%qia5p~7%@kU@WiHrB+PYTXqSYc1Y;V$_k*I>Vsq@#mlXOJ+?Av4UhsG9+Y1dN%?` z37PH?Id$?R220&Sh+POtz8<3Yl<}6f-N7xqlGEn3{Lpuv|yL-G-;@zPeGe>&)Z|+KzIG^7b|9=aux~Gsa-AQ2fpDrCba5BsRH@>?LYI zSG~GUO7>p6zJR^5st;c0@?iEH8Su%uW$rIFJn^WhXVt3~39A-0r7k-e?*D454a zP~OtU`Wp3gOywMgPDf}lCITu}PSH?0O9%~LyzfhSE7OD-AxCJH z1?3gu8f%rx!i-1fCh#s|3C zT;^@XXZXp%@A2yJQGR6UBmDIP{|7@h*`6I_yRE33K0!Qn(s5DI@rux@_QGQ^N!RMC zPqZ0q)k9BVG)rhLP2-8dQx*nir(C}HJlk8BX`4hngXy>>v=AbMsEqkJ(H4#O@~&W7 zPr0h!a(=4{Nf>hwgfUzxkRiF6}yIyPF(bUBY>v!QZ@$GO)04n6g|Xgc?XV zZ}QlsP8Kl*+AzZy%hFf<6HGl*yC3BfHb`q&Sy^GwGyIP) zRivs%HK|FhXV$1hMvTwWxTuXr?y6GEoxAOj+`VV#3cd!NW6HO|u^Ic4WWd|*G5$8M z`+4_c(Iz56Cz$VuuSvrc6S)aNW2kCQEamYe{TJWYg$XRLmH9LuHv5!A{aESv|pXL2W7`F{u+dEWc z$=cclCZk=Nb{9!~?z!iU42S)_Q&D7ZODKspv>Jli7|xx39-{hN2T_id7@ITVEFlTg zwxuZheEsX+;JN3XV|jT2J9lf;ZY&1D`-;Msq?oAFgxl|W0Z7GkCWPqnc7<*ULub&B zvFuK!96P*^ANis0#}sa^X4eBii$_X&k|#+z^*KEm%fb_5;%i_1CSU!luMnD+K@Qqz zqNc|*G3aZsZVu=g6gN}8Z;5vmJ{63^B3tnw+hIuGtaGS$lJ8jlbAF`ypLyZ%zj00R zhuHoaL4@o5ef;3k?{c^QEH5Y?X4#&jOv3T+iQ;)}pSn4)1t6QQNUA#!Xi80F77NInrahP#v zWrbre{abvoei<;~L*MZTufA)_=?f!f^%U!?y<~2bhtwYqSzJDZwT`BqK#DlO$1xP3 z4K;-`cvrHrvY&5!xoBq zmT-NK9XN_X_l)KSMd7tPJ?VsHM4=&2t{$l?Xq`I+^Lx3w4s_0;T}=xqQy#hk*VVZW ztI8dhL;bm|)s*+Bloj^a?HxfOpSD(ii2mK)NY|Y*-H9dL1KN!y=tyX~%)5+Vbx6O= zzt!xuiiN&Y>x_mbn(PW-btX2F>HiWj-VH&nrb+^8lyYGGpvwDj6ois+~#X;sQf2)OVysPGSxzCXQkF5WWwk^BP z`@r8^Ywf*HxcR>P>QydO6$+uM01yBP0t6@$jG`!tq%BHAq21OHWw)dux7#fb$?_0K z%O<6kMFlF5rV?dRq)bvwAdxc)Kp|BCDyNsj&F7pQR_H(G+WXvc-!ZD*d-vXx_FikQ zIluYM?<3T?ocFoH6P>89Y9;w4G*j^VuOE``l-^=dN$(!84!av%7Z@(u6Wk zf5ea!tBHxiY1z7a>n7`4+stPzWl>-yGVn32!I9`{0omZyjql~I{U`b0qdWYgkFGG; z42;LC#8k4szoQwvHKbHBcEa`DhTnev9B+QtjJUU;YMeSvN#Q@!B4WGt$WxFPc=Qjb@G*6SHFTUK}4cJJ}Cl$qB#Q0Oq|v6>c3YXwsVs7~@b zpADoq$4blI{#EX~{~=b#>q-K|;;M?ej(q2Le1H=tHVD2O*g-pg(>o$|%6ekE&axdEpNu`kVX=_-c0u323hbMDL?%nwx7*(8`99k7_s z@)SC`E0mbe=bSkq{KcR8KF*vuNeF^9rQ$L|zV6HaVu&~=Osa}{QS-&mKhEQieTBol zJ*JZ}y>zw7n&*n^XxGOcGZwH?B2wVfDqXilTYFB7p5ZT^|C{_5C;k_{WBcE7_v&Yu z$W3gqho3}(wb-u1!~|W3@h!$IXl+HqDqWW-i)V=OGF|Z+6LY{`=eQuRagV%49fkX< zPxGk!0dKB8$9?NB@$kwsblp0OI3XqFBN>}<(w_el41&e`hPv*UFCtCT^1?Gu^1^e^ zB2p5As3Az!qteET-kZ+*Jouf!biCo7hxtPMDQ5OOcb2d4|9t;5j4Fe5D$i@39k_X_ z!eXf=+qiP7-jPXiX{%L1ih;Uoh(vq}Ojf46`1I3!?&%p1lr8Vu{0Kg&SEP=p2}C_i zx*+)Exq0I%U6Ys{1{U*%CPxe=A4-CW9byZNEg&Z9Sc1Tv<&%8d^h2B*eTxF&K-PJw`#x?S-NEUV zuhH2p#?r8sE;2DMlS)f80h?4`4I4@IHqiuJQPYX#j`$4>9+Q5Q54z6~(k5RH4|9M0 z7?+Fpu-ZP$*V+$oezeQx_$syk7Kg3nlB_ZcQ(|_Bjxc-%5v8s)wa1zgYb;g*ufF^u zhldBe{he>e+L9*tC3BqIF-5!8Hj`~P*Gjh5e}G?m^*TR(?vMDu+D-o8X367U8{x`Z z7@5$uhhU35CmWfJ*N||AtJj_*wk_kT#~@>tsSda-iiiPQ6nyg2pXSv^&-140<9yY= zjh*fukcE~)Mv1{OsvJ$Tm~*&yi_vtA`8?oUqADz1^hhTd>!>P6=w_^(xSgN=p1XO| z%}?`&la9|_jyN-??OH;Nlt9$o7$yg)m`88=sV)6nGT>-w(6FLcaUj>Hkvu=8CtOTq53)WQYdDV?AM0gH^v4-z z5sQm~G+O5uKemY!JJ^M%o-f$kKEclJ4YoEm=t4(Xj%nM#+u!z1?!Nanm80!J@Z142 zCLv;#*&Y&CuUyv8naf^3%tq>G)h>`FroflJ{6z)ET|v`!ISZ&rNu`n%hB7P`2b{Zb zju=}pe4dxWJNd)z zFL1fO!1ej<*kX-E1MeGeFh9D3t9F$Wyvlb~zs+iTipU6K4lteGr=r@`714PtCcFGP z-m&rvSWa@q-^P2ZS9oCjDZUjRDFX_+`47wqg@<;!1qjPLl)@4#4-M`i7>341jTk%Yn0k~npyVE5op z@hi99$`5S)7Ju%ZFLLAR1AOz6W4mfFWufGSHz%nx^|MpN2OD~?WD zjLrU(NrC=()39L;d*k;I$G^|_-{0|jFHgDa!~{uO9L)9zA?etRWan`^;^xkbfAi%n z{=xeu$aQTj7_16s=ENqqbcR_%$=}PSIvOVOXih)S{5lY8DAM|R@mM8w?B{(IAjcmY zS+WsAhR3!0miioxTv%@)m;!pfIo13e- zBh#CZs@rZ#S~3`M?C$Py^X4wjRho5?R9-hhib{9DM3Rj>{mpOj%BvSC%86b+lQ7m{ zq(EduQH&|elCE8_y1vTF>KPUbOG2%f`h%fwyT+)cX1zG#+um`GhaY-`7#!2d6lWdI zDJ~ULBnpI-=t5M{!5|#%%y|CE7dW`JLs=GxN!TJ=ju}TX7N0~fzX;X}rE#QKano*d zp?HBmx$$%S)Z}k5?n=HH{y4uG{#%|p{C;A0fwHo!jb7lpPkxwN^}|p^-d28&yGNH; zOJ60LNSDS0nG#%1wWUB}P~xaDSWyYpTTgq!xAoZGm8A1!#R{UX=G{oFl$oCnN@ zIa_?1tMLp?d!2U_ALGKQtDGE1IxMBjBO6(ACiu9-u=IfK4gjLqmuSF{zP>D<+&-+vKBPzRIQ1gWNxQk`tqAG?fO0;B_(~ zW(Xt^IXv29Hb087;Ff>GCbJsp^;=Z(kK3WV^njv9HIUDLp-+hO!j|0cS^_+dC{CkFc z@C@zhJo?sCqU3mx%!h6-5Kj(8X~?RU5pejke}gd|k0<)beiNqS-(zS`_JK!o?YOkP z*AE{|9^dKfXHXClffz8pgAQ3l-gEQTB_4R- ztvvF`L(CS3IM>e&q+Ajz&>nLXzjEm^UER@lT0@9KaP9+oO0cLKp8n?3jK?d0692-$ zuFj^I*vw~wlPAuzn7Qn@+@Mm!R+-dUg~3?}P2~1FEFb)1@5Qi=DJpFCYK)ms8e<~* zFkmD_QF7(lRUZ5N7r1uqs=CNdLa*>~0`)B;*`0sMB zd6L$3Jm0+qF^SvEx0uEStK-*L8{OpY0&e*G339-j%TKUrpJ8k-LkUi5M&>3GJH)EB zD9s5{dm8+N&}pYG*@(xn?q1`_pXC>B{w!DhPxA8oNBBoq{w}|J^p|;T@d2KyKFD}A zaaZvKHJ+DlzJdETKh3>s&*0OD!Ul*wt5G^Vv6D(ROH#D}HI*21{rY7-@zD>{EIML< z`J!P_FKD}f?}D=9yFlFqWK|`bCtbzb-S6S)(Yv{G>lW{N^9c^-7JRLMa7y%+^C2Xx zn=oD300bX=mh{ni%NT2Wc1(j z`3y0Rrc*_YG(-f&YYL~|8=EQLO7G>iJ1pOO*FLjZ!b_kZb4gJjBgxQ3VKOdw?)h7M zWpN5OEm^b%#+7!(InI65eHo)H9h@b@HONqfq`~uc0{?*5)T)no-_Nfgf(=Al0FtV|+Mdv$=wHzJQ z{LuIRm)vtVO4rU3d`^B+;kev8GNy`5`}Cr)pQQJ}Y%>Freys%p&9(Tu&lJ$fRY zic}b^7|No=8H3owY(D3nH=JQQKC35)XsM_Id2tvRNFv}13L1Xs2j9c`^fnR-GB2?) z?IIZ*CR#!pvB|P`YsM4bcnTleB?BMLzI=j!AY!pX#xE?e%1sOx#?SC)Hvb+E7QfHe z`D1*h`)e4##(gVa;BNUiZ!W&V_f3C|?;ZaewxnbtuW~Lu&X#jrsJ;ZD!r>H4oaa@v+1AGnqWkd$zyHMgI^tns@Pq z!|!4%zQ9%g77j*t@qy_d@$UE=+%|fa&I>-R(qf2hplur32zBG>x`=bC_GzpkIm>vZ zqHVA9=}-PX^TSB+C3O>NI(5(ST^!DC*CxiJir59LyN#Vwe})^~eZ1{L$?21OETX5V z9L|}XC2L*Ode6qz88$ah=Y03Ci8hV%uPDR zx<5>xAuu!u4i9$dnwk&`x~K=9k)E<(wcCuNlm@oG2iyklf6&k@5+wz_Mq$5qbuJI0 z>1gW6=f7FP)KVpdMwCycd$RB5XD#9(ct}2wmxp?;qR7BG{cGyqjF8K~Gz2$Aol+lG zbYJFp^SVC~5Q|Akpi4_4XTC@(%bL;tlt{hMUQhb$Q@`Oc`Q7!@`;Z1pus&*P@LFbb zDQF5GEyN&5gN_NAsBLuvNfOp&x<4g01^j4@FJIqcYztPVn;??sv`X5>v$4L)Vln6R zsk?Z`x4nhB)|wysu7+x#n;aC&!fS2XIoG8!A~`GFvS8ws+jg8{hC2NK;&4Rcx>?mt~nc zs~)+knLhS~FVVFvld96p!sr}fiaj3bhI?QT#6n|B9<9E?k4^p|tIc%|XSefB`2p^d zKcM6$qs0Pb!G-uFca46Nwd$MP>7M0*wNLQi)~DF-?&fRlU&2*~9JvcjJ4;z#!-N^e zB{dYW9*P;s-Nckf;36?vUk4k{T;VgH z`Lt%#sU-MBG#USkDq!a$D&ANI+B#t;5A&_lALNHm{VIR{+gnVih@l&@Y2~hII|&M= zD3Q z!XQQ?WncdF56Pvgkb~CinCoc?clFP!sRBJCIE6lHO4d`->?tLXn4`9lVf-k1rQs(M z;!{>yR9q~n9gcEtCWgqY_33)aQV0>RTrUcb!#I@@;c=?r=8I496M-2F`T}p-+&Ds{T zmU9=j*}Jtyq)}l&7=~swi%p0ax~}EKw&Q!g=RKG-##o1Sxn%6AB>6gf@A2N#Ht?xW zeu2eepQ=d2w1BMBrF4aSVMW1SVnLEX9Y);dp5~9szaZ2t*V4lz+2p&-Kj(J$SvoOP zqgOEI5MS)mjS{gw%}H~edNJX}`46(^MtB)>F@AuZa+M@EaN`>ocSMXwTGnSbk%*eh ziU}Au$Jz>#<-X!05T=|9ukz;chj4L)?^t<^|N87dWpi}MN`x2dxAC2uze?Fgp6lMi zi}jni*xtjbm6i+R9lmGd6MWCPkFjARi)>S7Y;PhZkQ^~URhBrjN@+H@eDxVV^SO_x zi;vgwtQetbJ36mfL{XKD#p1m|x{~qMcksK1Kf!bUz1)4*gxS2sy7an3q!;%q%T+cu zP7a%}s!FUi)b*UYo)dhHNd>+u7*#X=!>4XCJMm`TRDPa<4vhL2f{uqt#(1nGX7d9i zss)?(aTwAM-eaxBcMZgbWJ)fr{}A_`Uhti#8;)8HWeTxK9_d0maUHCz3ZMV_oL8@% zMoOm&8VTh;W&mjjATeswAur+-G7R)OI+P4}^uQD#tAyn8N{+Kj97%Qth^6;A}oYkS;KE(!f z#!P7eRq2?|57|H1qp%<`5L=~Q#2BfnQ6AWZqNsT8`R8c5MnUk<+eAf5S7>+8XaFik zHR~H&93IVa)?hKqL1oEVnK3wLXcsfy{~eET^3-X%XpkadoKt{3Z~CQ*LxSsr#j%ewtEYw}69)0cQ(`Ey)o|9}sUf0-Y2|Co0dzr)nGoL>7TH;(QirES)V zeW-;eXZQ2<`fc20pW^+eKf=SOuTj?}P3W+A+RhNONkEK|(Ws&*N>(PTT)p%fpa1-) zsH!P#ogf-~qsFznd;1*D4iV>Ysm8dLmGRxQ>ksq73pcs_!aa;DN7n_05fBt(De~Cb zbmb)0lr+tp`Fu`YH*{S~(=M1T=J?nmwq;{=!qZ>9#P3|%;?#*NZ15^|%9Nm-Wh7FT zKN8xurR|jM-ughBl^C2WNYP`90&9dSE?CH2;O^!7-g2n477=3TAgS1-b-i>^%NWP4 zqnZ!BSi-td$0Et#I}toeJ&N&IG|51F>c?<$0P2HLAL#P;wF>Eh`i#9926YxP*-2x~ zvT}P}1WO53_X@`XQgXzg z3J6(XNEcH|8Nf|cwj_#WrD_;kDAF|!?VY$-^Ums5*b0vm?2Nj;z^wgtx-`NPk-Ee$ zHkfe0dH-dSiBxvPUG|G?hu`C&^iO!G`%e%pQg#Hg#gqX|KqO?0G9Z;;$}y>cSaw88 zY*mvC6w-j36Qw2k5hvnfnD9Jj!_M zXX8_xnqKAPsawRlWxs8Ru^|KvRv|{3y2ThnQH)t#n{f5&lYHyRZy^*c<~7Dxg7*jo zq0^1(oX(qiFKn&d&Bo?7>np3=ar+jrEhx$oF>xphLmnL~iWSz^PYvL*_suW}zgWx( zX--iZrlS$-RmZ>nv>~jl^Ctg9rmiSRZbTb8)+jz2Ld#-tgtY}isaTyrui$A+M2w|$ zGma+f?3*|7{=4^Ba~;X(c##`MjC%5`x=fcOKK??2%3(`&(Mgg6XM`npDrYpW??nwA z#QwRJ-qe?KEHSzMHzaA?$sNbzkA~dTTRvUR2n}X1l{ogx%P5(%q#S(A(ALaA@iDM$ zc>jIS%HQb+BL%XQOeA?v^bzBe1}&fZ8YxHVm^%svg37tXuEdOLo?hI~E7vXabe(!u zW0Dg8#^VXj7Hn>9vbVd>*|TT3aQg-7re1D*7>0#4@T>dE)oWMP8HEf5W`Ntdg5Wi^ zt*VkMS1xj}zssm9@xkZTa~jkgK!as53~wS-71QzwoHS56tgEqdMCq+)m;}IJG2Ua_W$?8E8%8qDCyaQXdtjW{d zV?WOu%+pL=%Q<_MKjyTn5@Yqzh+O)6>4JI z8K%`XPk#OL+_-+7u1mCaM~DFtM_G-R)rwCnnvUt}dG5LIPL2-eyz#-?aK#}$kC65I zA`moCMvtqexf4vjrz)n{b}dJ<8S_~~NQTXg6~6NI>wJCh9v*ZrF`>p;hqZ1APUprB zF;FiK0JWe~oBMuEY2!eoz=&aDORj7@#QC);?>fEUsE$m^a=>2u_Z$gyAu_TZ-+1PT zgLy^Kb~=Vb9vUBD3CRJd2jQiUJ{r`H!|$>TG(#dnP6!6k!sR^S(nMCDS3MY(2X@> zEt+;p7a}5l2vnLi>b#!-ZSA@3^eNu<_BYVBz3(9T5K|U$3ZgCOt|NrR3(q}AvpB*@ zK?;#B1VS=I=@e{FCgY7solnFuPZLUe$lK#L*@_+4iZ`>t%Z$t`jO>C&))o7)hgh?x zstK(yEAAn>Es}9qbAT&$ILD_LxfgK&jzDq0Q4nJZQUG1f2t><4jsvf{_ymOj#I=|x zkOC>S3}ay_BFlAdTj zq+I58!K)Vt?I{#`2_i~iHvdpe z-t;8JKBQ;Z$K~%CvO|x>Nn$^(^Sh7jW5SG-I)Yy?s#cW*m>gv>rfoY4S91UT4`hdv zq{2L~)Q`$XK#ZQczD4M2R5nIAA}MFRR*cFSTf?p0UB3D3bBrb0H?f7I zZd<4#_a@1yKGOlO#+Z_xM$ zY1}GMgIkdNh|Z1)w!oFQ5Tn_Tx&fzry@JXZXRcU(@3Gl|Md2`_6)20>Wtcj4g?dh! zY@jPiz3HUGNkgIr@wnn9r`@M`fA_C>SNBogz(>IDFkM{d$;Ef`j6A?ISMK7IuYNF> zr)A#A1-5V$&L}w-PmCU8B9qA~*Kc0r{rUdwcBd?lK;awaFlY%Zj2#^6yE36AzpBQ?EY6ThH!eQ=kcs`OyKb zZ%JZ^DUWv{6wYvX(DJ#LE0~moB4}cfgJmCt{{O%Fc~*U&$Ez)j9IMde_)qk2rVm66 zuhH+#eA*4n`JVS_`Unb%BujVNWQ2IEi$|~1)N@4o^sQIZazrI-eHoZ)AAGxjN5 z|1{B>L6SzC$yQSuQHet6BCL=3Cm$_%`PE$oa+6SEDN0LGI=Z%HJRVb3V~V2U%$c)z zud=DZhat-vf>sW&FTU_B?YzSoJG?(@EzYP$QzYRk%PX(F#(dr~n06%9RayqY#L;ZV z*2xLu$&{l*mA&nUY>l;4Rh4y*EKS|8y}iv_AHEl&VLV=?s8oDUj!BvHT26CB?{P_B+hTW#`{Kpz-m0=3I7PEyU+5b@SE&)Z{-9}Qrn7D z27Dnnd!5vtpsCK$*t=MX&tT0JCUOa5jx_MQPA^kwGS{kqFL}`o${!JNnOGnq!wJLjnv`WZq{15tyz-NckA+!~|N3Mpq_Js~va&T{8l2!YXf%qy1;`0UXI9vJVc z32@O1KrXWYF@leg8#iu}Kuub6^F~ClPH=_Ah{IS*omSXc{Wk7B*|M>jXk!)^MAwON zg~H#)TiN^pSUQVta+At4St{ z*rP-^5lbQvMOZBMshfSA8`HOa1Bou_-(#j|bUyORYcFGsb`Mp9N;j^tLd26KuxMKD zynBuIXo|CXSBx=OWAR;0QEI6alc)Bc?|j!=IeFp~u9{MgEM-|@^Pp@W1Y>6WKKYF& zIXv9QI=wkYpm28BP(`6#AB!g@ZFNsfi$7T7`S4!$rtqWwmsxYKaxy&0+3*>*9Wos^y;q!4ag=%(=@A z94k<%1X0Mw8oHo0xS0&v8;5;TJ3Ndz{i;VtxH4 zCpUH(j~Zr24U3?UFG_Xj(J2HSgr81UC@OgV*>6zKkBCum$QW9z^!9AZZVsViduxS< z9(*J7+VSuk)=1qE)>O;kT_f2#Eg-gHW%VRo;|bA2ih96gm4n%0kEW|B$18LPNBq`P zj`gYKL^`0u4UMRj#iU|@&5ac#c3Mta$&I_1d4n2Mtkv>sGAcQ&-op0zHQsU(ng$vg zZKP!efB>a+q!1Yu!V?#dh;{|r3s?oRCxhfULm3YHlodjcTY9N6MbE_lzko|A4Re9Z zTd%7o*RH zdZsSP(Jg91r{)KGXVfeq1|3X>#HcLU-#_5Wm8*Ld18y14>eDr5Ld(68s9@Xof))#Osod zF+uAxLm&*4nx2!FvLGT+FlAIZWj6z>yff({!AHi;4Pq2dhn7<`yjY(C1EYyh*#c)1 zhD22q8F)78^h~0xMqIyomBWKQ7K<6xC=ruV0ZjJTbH-qu4jv=E5mqWfGW& zh$XxKq<+mM0+Dh&#T6xOr}8ccbb0-R*ySo9vQip8`He$v2Fs?qmDMWit=2buis*YP!3MkZkp2z^}`%RzR43edH4j3=+_Ag5+#$dHb4 zm0ov|Uf050_5q}Sw|({%HMsSq!H_nQv!$GcB~W6a?H8sxjU;p14}$cda2)oy_Z?cBzJR^ zk`Q7*Ou|`BpIzy=b@L|Pdz^LJ5%k$gYv`6F7K?^6XScAj#bMoMzr}24mAb6)UJ?m3 zi;j1^^(|bu`!pdt#`MjAzJ07C7s{!+eCaaHydH41UXQE4UtOn?&q*pKh2`wpEmn(N zp1pYwaqQTvb{LrzTDgP0$-Q*bb!@2|no4#l+m=X+6bE1mqH&~PvtcIS)V!81BM4nm zCnKA%$}UzcssguRa4Uus113Q1EHz`waf!?uunCEg6fAB$p|mStJw91dvdbl9bO=5Y zNj8zJNAur20g-Bm9a2R?DhRQJ02kbAyeWJYV=97QWja}9R4B1nuOC!ZsRPf^l|}0ltxHC5PcxTs90Ju*rMguZo@bC0GkLR1K2J} z_fg9Dq%o5Fb;sht5QAjErG|1*`T&?iRsVi_tV%NO+Q*#N1-oO1a}SgCEYzfNM;FB~ zS+h*g1|^0bjO+iN$?L1)pPfNi)8;^5_OMIhwH%Hw%x0@?G z)7{UJaa?rorD^VDBsb|yp^WMTQe9DvB!Of+G1weDOJXp?6n+W`@g-P8EDgb1ymv%z zF(b>x8(aL7-#Eo5zJ3b3u|^nq%*gR){?3$t@ySyZ8-Z>HEf!Oi{L+Wk`J4aYG=8)~ zu^urJ2o{1^ViF`8jI&6IG8e@`a@s3$28;*sq>wYUaUhiYyt({C{=(|NW!2oGYx>@j zMI>b=d}36URAr%}byjetWHCpoe&U4qjx3k}!<-YR) zgU}HMS?Q2zJ27-%BE`6*Z5n0M2ek-GQ7yb?^CQ}}#TE|g8NdI;5z}f8z9HncLq zNl6<9u?x%&4|LqtDu&f(AfPk~qGsCbam@9#hq?1?;uJF)-)7a599W}{E{PZ_I|3%` z#{!+kU*bwJ3luDs8W{dQ;MqO)*Ut!hG7;R+3nL7+UfGF@#2^pdJ8Y5i_+D?qDrjQ| z!AK8o=HQ{_n*LBF-DUaa$U!UvrhS$;j5Xy`tY@@~kjHx%fH(cU90q#pDW@A<~K&!W1!27_?-hS563YzjqpYbgP^}EjF%Eb1GZ4M6-WlXigGsKa17bz`jKuyHF^NPR#zUMJ{NMiBl>f(nEcsJ^f6OoZ!D(zUB2^s^-V^v6zYuut zl?|#5C|4~P=a!%SPmX{7=`nxlpPk?jzHx#pi<1=9DsJL%V@Glo#yV1C@vUZCL88X4 zK7J7?oWqs^wn4fAJDyXG_gE`#;X}ZtnR@gE&9Dn=sH&2(Ft|eP-^B_=G2)v~e=DyS zLr6wtah%acMv4fAwyRm4R;+E`$Hoe5R5b||N7QX=Kmw9f8PvKlVjLl8zzM9bT@hIi3lqr$Z8biSeRmVbSEqIN{=_?{oUi;eG-$F zYx(twOJ5M?7=UDgdODU(<;O>q;-mPKLJE?*%t|snX8FQj6`Jeu6 z;$MDv15?6(_h%1y@pEVS_n+OyObjLoHYJKlp-q?wIK@Gu5q$R4Gix(EW3C?E$HcAB z6b>`06%RB8eRD@WE`@1nDNtGKsv2=~_c8|uyR59NBBYEZnPU_Kp)4K7L{6N%i?xk{ zJ2wJ8Wy4mMd_U_fF&LZ~WkJP8DGQ;?n)Hzn6Rq!9v^C?h;M%o0FYHAol}BypdO2$u z3YVfV93CE0*V=J4eFvXRQq7QzF%G2T()eCv^*nDr+0tdR+J4Vlfx<%R3gwU4z?Uyg zfRT=!^)V>pZ`uPgncSRXrNFX%*oTaqS;IVsFfIS2}`t#ZtuJlbSAc9UO!i)6s{ORwSm9I7eS8rn{^-o=_cvf$}_;QX1>T));4x)N9BQ;yf$ zl7|pDapDvYKJW(GZVsY4@z!b96q2^aV@f!&T)TOdgZ%|XQL0iV`INJHfo67do7Pxc zz0S8yKS4OEp!R%U`7e1(c#=g}W3`Gr?SG83;aN_mS6CT;1%f5Gpk-mFo6L*gBACkX z(yfYL{&?gwFKk0d+;w8X-}{RT%slXwgDJoG;T698<&NL`y9M})$G%l^^|0XNT8jf# zT*?3T+wg%m-p1W`UFW`2hTr_E@Kb-UA&6tvI95iU{Z81JR`_nl#T$`-cLjdsvlSBx zuK77f?G}IHoq?709j@-I^4V_`y!*k9v(*8?C!`SCrejosnOL5FafLVDdBol0=lIgj zALG7_iyWnzMLVXEF_r1C0@hf{l(Gt{feu<)5`h;zR-LSiRz+}3u?#}rjTP$jo#zykU+k#nj28u1-zWFM@(5VV- zl9=I)NYZ&AtV>MXgd6o9T~L{%6dBB8qz@z_%b>!tDjc|)L*9~(1rHfY$>XrNUW-1s z$bgMYVj!0;pGt5>G7u$dUaFM%93;&WUy`8)T>|n$sx`d0W@*DHM(R638l8J!U-bIq zIpXzS@P5IK-93y{K)^^vNFHM#1j+c7T7^IR>@!TpV?qk}uFf|`fp23hDI_8t zTN^7J9XYI1>`Mh;b}I6Nx((u)QE-`^Uun@YZTxuL5aPhMQ(f2bpehlwBhyCpkq$yU+u%+-pM z0{`yQCcCvInk1CcvR_a6!Jmz6uWs|~)e$GRBeogQ5*dvHEf$i{be@n7v z2^U<&3pZN++&>(1YWrTExoUXqxt9OquXz6WI}Ye}9b@a6tPAt7#;<(D^N)UG%y+(X z%>Vs;FY(B!k1-P1*mjR|c#PQz?yS6ek?nxAK-ZewFEG0!C;b9)TTxPDk!WrWQLp59&X>X+%+AChjUbLuTMks2ukL21+k2)lF8aC zH(otb0%{MY_X`poV2v?x#~rsZs)W?3@@fwz0)sh*a|MS-J6w8g7d5mj2RsfDe2RHM zHqy0@aar^1?j1bi-^2a#1t9S)`7U0r-@!ZO42$VG&NolNWI-9`#AG>YZ>RAs>(y&a zW5rHe;Ed#NtDaj~O>l0aOmwg1zlujj5<%JbwqWFhZ@qYf8@ml6 zfe>8oN?YAYDd}hcaCCG;?^-UIPGNcoMiNmp$ogi^t<5`VW`bZb4uaRNxMIC3WfabapOL%oUW?!Hc?A(x>n zV~hYU_DZ6CDyykcpR463)Hf4*jzwT-L8fDm>j_`WE@Tc?#tfI{M zD6InSF%}f2W&32KL(UkQ5OQ6w!LF_6R3nE$_0LD+67TD5FkvzPnstLZ&!{T7aqT)? z<8h|UZ!^ocgXZ}P%VRrcP#VNo1kumRogX4Q2 zxy8#j3Jw+{Hp)a7p^hVHl|Jy#KbjbcWjrb9nuK%k-1Wq>S4V745}h=dl%;j)FkPY& zhZHrwo6<_cbuDdh8P5@6O{2cMNt;SmRii19r!6U_L&L?+zKctcr`xsw9aN0>%~;Ea-M-Jac7>4?H*} zH2WCT3A#5}9SS;0%e~&y6M9}{UfO*IHIO|s5n6i%W~e9ogo)#cPUvG1ssJMi*VmH? z6wB&yDnaYuA@D5U>+9ZB-`6rdMiqwur0-SoHdlacut7Iz`8h!GE|>V#^8O#T7$8Ui4AbmM(i#yfoF#k2f_$M5B1pZqM_;}evt!rAtKfBVrXkKYPjE5Td->4uvTgRI^+^qMH(YUA|4H1MKUBB5Qhl`LGmo7=t2$2 zsQ8^R6jHDoY8;Lf0)=syB+L&JZ+q8*H{ZU)3s(w$?hm*4tuG}^QLte=v##SOzIU6S z`H5XlS9^rLhEXykZ%9=`>kG`NlaV7? z=;|Y`-r8q#H4?lD>=>xjnl>b`@jK#p>?Bn)MogtT;cKb{mtg?qHpx0s;xiR3bjlDoS^ zmScOzD>DGAn3qXuNFGS44672~F-J}-h$Sl|&{rS%jl|)?53(}Lpqiibcy!c%AN!Yr z&^@-*e=~m|!Kjy{O*-~r^Tok}vs~I~xp5E~xdTWAy-6tuSFhb7q(B{J?Cf5nEFAl7 z$0$#nhY%nru`_zlcrwPOmnqBvv$)F01d`ZcCNQN)*9BZzD)G-c)wv2$Pfj0*5;LF7 z5IWC8ZyhmPsH%d=0Hx_?<8l_&ww^mL+{WrEc)vh3=-n~N8BKbPbL=1N^2#fhan{mx zHAu?8H|!gH^qRpXhb=TKkv8$A_Iueld5Q0gzsw`@YgE)c_Oj(K|L>L?H$Tc&(bA@p zU;6dyxK!Xx!PynhZ+&UXe|W5;4%!97v?S*h3(1F+nmi~kD<+R5r5OxIY0L)~LJ$a& zD3Y#0L`&}=9(ODYZ@Y$~P)|f36CJ9sU`%A1MdYk3s7Atn`eMt|S5I(l2fp@7VjK&6 z47~MCC;4mNcf=3A@iNp0bVmVkhUC2}*hGU^9f*F*=#O}E=hv!wqGG)xmL{(alCE_ zU?Fo3bN5m*jI`|TF9&z}pwweuF@cFrHOBJ&LDB%`8!>{h8FU{cK{9sL>&GrLJchyH zzCi6unjws3ZblUClq8L;gXw23eI&`!@+&69XAP{R(H9qx(twFz&*1g)h=@6xvc{59$CazE zQWS9*Kqe(z9!fRFsdZBlx?tHm^tt@)hf!0Oo)KKBGmK|W-p0sGSS%c&(=2g5KgzEi zh(Y;aw{GrHFIud#s*!FiUGQp%8H5yzA@{9HN8u_pZ4J=6$a-;$)CJ0}Wj?d~^glhp zt(}T;rC}y;)a|e`wM;hz#^8;xK&_v~P9W~9%7)PZW5i=qi%l(sbddRIq(ls=Hx)D4 zRfX4d9LL2(5DoB_2+0#oq(`hG*-8z?^A^!_;2YW)Xrm`3k4XVsff&bOllbVWt^k;W@&+S*Z@^a0*X^|L}Q)&gg&W##V5Tgd-ht@vEER8W}S(_4c zT|ls;m?+DFvP|5%v4bnB9Ep4EHIY(4B;uS3;@xrkz4Y$j2GsC2ALwOSW>&bNER|8O zrJBwACguaZcNN$Dfp73?v=--I`7c74F?B@SX*$ge~9nYMQJzylfp46 zG^~ua*qhwN#_B5TE3258kPwL>WEg`%;nqoFr!K)doHvAKxz`7JRa)+wzDnwonA9d> zty!3soBa>+e$2s1AFEK3z5(R|vq+>mmx)P80c;RVm$GY)Su)v&C`gZCu{_p~$Jk>? zT0hFu^F)+_k?37-q%T$bC(JkpJ)CBeW_Y3xPBCdJp9E4zRgG}g(|B;12GNV$Ik5wg{O)eoncO`x4Ma zrHfOs)72H>zB3aJ_B*7^WLpuU7$SlXDnDaw!O7EWK*XnnPX^-(K&cJ-oC%`g>gDTs ziaZ1Sxtvx^q)?IAC=^AR4~PJCbjEUe^fLE_r-&saTTrbO{Mg%si509{qwNHnEG?EJ zZwV>l2STO}O{WxTX9o~E23gyr<69Ct3S%&_pK14W#9R~}=e&WHgv%W+9a+(m9yGWG z5}hO(@AVp_Kp^2nC{04}B$H@D$D-@7$ucbs+Y`&*_>+#m^`krd;C+`kx<2ED%VSyx z3lH@SwfUyq2VBLtFojpPqz-Bk=OwHDg zuE83m8*HCB$Eoe9W)}H?)P%!k33SceopU7X@F8SHj+8aeBHq`uz6Q~eu*1E5b`SS> z<+W=xb$4u!W%b$s#w2D3M?`^YRFRV4yNL1uv~d(;!X!(GhIzY6Oe5xtTH%ePlLH}Y zvf`|cM@=V&t5+6WylSC{Dq+;egGiQC*C5cBbMyt4q+Al_&=Hfe0Q6MW_h0BnGvov+ z_K_v4up1rM>k}t3KNBN3Ipzb{gI{Jy)0PCvWowdUL>vMFEEP(RfA!C;E!@~=llf%P zbWu$~4MK7m=kglRf(JW_ymqtU>dY`5CGg6ZN{MX4rB>z1j9FXVpk6d|zC{X43<;9S zgQl7+T4!jJ<)|qzIn@mPFm=9YF{!MsbrpyugqB{FAcTN51;!Y>7fx)#vnJ`)%>jIOA9j&N>L)2FD(a{0>dj}L{MX%4U-6qZ2 zVv0JZl5)oBy|7`* zO^6gTohVA~6lqpv`Wz{FjFQo`Jj(N6{9o2U?~-KmBDW$aLYiTP9vH}vHKJ=G#e|Wd z0a5xv|AOf_a(VBFPkp1{D2=(iv&w7N4ENtX;iuj+;*7hAtzlFY6sr;HL@YXpmM9ZW zri;9B`VGFg_idas0c! zdPwf>MXiqVUKz@{oDGpuE`L)VXwMNT`w_+**isLOXPiS1xh!C5bM+OLNlwg)j?Fv9+&RoLF~;T#+W{r&OGtuF zpc_$1$=EhnZ}B!D*&rg2C|rdkgDb{_5OGC8)6TM@fPgr}7D!4&53~JUs(6jU-bDyD zYh^7B3&a=-YdJhxa5$f3I)t{geGJ)wIcs5smi3j>JpR%eIEPJ%WXW7I)urE^*BmWs zR;H&}SzVeOj8TwRTkr|(I@`=hj-m|*tvq7i`KNN=qOL5Lpp(GGS<5ecXhc~$j(ng= z9)jV+-)wmC`h>sn1Lt`2$(xu$c=pyQZeO|1NNQ3H#9+ZTJTmzxj~_fr8wyGj2WTJ! z(XO6N%oj8E4-eSdn$p!eMkUrFCJuZ-9|M!|n6szWXxll3TN_Ft2JBZ*VHEYPoQpOn z#ArYRG8Ye8Z!l7DaCFGwVwcV7SxmH9OdzwxlLi^*LM|<#EDKc_2}>^kNy^o0+lCZN zigJu~mYv-lD!U9gg)8yCgOswWM8dijZx;Dx8WdzU4BBT=SHl1cr5t*#AqK$;(B%PY zr@Xgdb0o-EXCKQ*{cPeA_BGZ((CHI#kgNd@3JUdUQKsLAl=4iSuC|_WYI=ri4qAgO z1byb!M?Otm`v|JmSI0hFK4FJiHbyX3Q%EnG64pt}%C2L5)iNDb9PTDukpaIPw8W}- z-*j_K*Ba(cgDFb9PjprYu|pCn*zbh#WSv8IlGaBGqrfmo=C(v)3Pe*-FKQ~|sFQ|> z5OfmOho~pAHJWMo5xaATM8QkM<<_o=meM(zCNi5@&Y#=l%&9HLD@rs4(6mACzL|{=!*0Q()QW1I53is2luf%+7A&E7w?iHX>n{hjWCTyjY89IC+nk>J;2}aGiRe1olqemHB&hw>DDg*M_Plh-^1ip8W$&Qn z*B~zQzha%Pt(?z6sZ?2 z^~}Rc4uCP=jU4Fu=x5rM+p?lc>BLjRXrC|(n*+IyUKTd_{KTtk>#A?>ngVuUI zgybWXmPIOPd^5Dc`&z;pi?xn+F=INNvbnWM$a?7q2Mbo#R)|?lt!+CHi*X~WmAi2_ zcZP-7D@Lf^b^s$B93F6RbVxa_n0Jk4U>P)&9K2(K$>e~QQDi426;6w2=^#OA4?%12 z)2FuC*qq{1O2eL&0u`&Tg>@% zGYJLFlM-r8>bpk$2_J_h&T`EtD38^dutcxcs@RWq?94h=WJ6& z6%EXzq9lYSQ=&{B%ZV9d&c?C*J{8II1Px$AACAOQnOw)>%(0+GpJnB*)bpYktL;kedX5*-JIqNg{5OFrYj%XbpLu5K#VRe0#F5H3$lj&;SJO*cl;5(Ik5zEnh zO!T7t_B_JS<6Q||OfSFo3Ok4UoEn|fi)Rep`=M-(0h%sx-?QZO z^5V1u6tJ8cNXzHXbP!@3W>fnzGbM;d{Tqu+zD@bHwcLz2u}Uv6sG3HeiR-(JNj!nT zcv{lco=5H-@h|>L$F{jaH%k~BN#cm9p=uYnD0oK1G{cCYC`(cXgHz}-@6P7H+haV- z;L^J$fx$|FF#%FX?DE{FM0&~Sa$I5xklN)2lqlSgv>dc12hJG43&M!9oapNsHJcFh zK(&sHYbsMxFa#e-qPBICUCtG4jH(hLj`4Jj(RdR{7nLHB3WXm`#CM%ycviEm6!b79 z<>DhxTJ-Uz{}L-X+aHo-&6rFdlteMtoO0=mV8rwSpM!3miXJ4=z{yk>_*_OxA{Jl< z@|Nip6>^M>G22nwT!N*6K-R|@RTEvFx+yM8MlB6Qc{|aNf~J)*8A6ntPUgq>Wrk&< zV7gpNih%-l4m#=@wU|dSqC^7YvW#tFI-OD$g7=BGRbI9B=a@@+DU*jU4SQ4^Ep#K|>6 z(_~djlZUKR-f+u-(sEQXo=&srXv$JlDNp1l1a+9U#^3}>moToxQS;pFP9C4Vgd{CK9GF7>-QnaG9d9a( zc5h8y7%63;y&Pmg$2n}yxT6ugXkG(7WiV#dRdxE2evOG{m{xP{L36EF@XIT?kW$gKc*Yr7DNNiIyH1iiG-zz4YT=zq9_zE zL=7hbIiQ2wJB#$jrGp7X+ubgfrV+9(h@9dEEQU1eIWK~%>5J*USU)&-@r7^?v? zB?mY{Fw7evGGcRMmFUr6l>v3~Miq&97*;{T*u;)Xf;e@nmcSd`<49>pAz&FZYYlZ5iIfDj za^mXM8%i9`7IONs*^N7A`M!&cCL370jgJno+5{=AL6WDS!*mU)jTk8?Y&p!_^_}2; zjI7UMLrfgD*J(RwJMD0`$uJKVWJ>TBXA7D(;*XA~eMjT3`#&kH}qKniLn<;0Sbb_i|KlB$ca zv9&^qk;S56G#+DJK}-oB6-x;z;jt_hJ6Lmr(v>7>a~_}|s4ZSUzVhTVyz5lWm#@HLp6G0$4HeN&iOG8CVl7os()kwOwfHV&LZLzZ z`OrE~5}j{|!K>kgEVbpM=FeDHEIW53Vg}x&+~RP4o!zU46bS33p+!|#O;3EyIFTwFRvMLowqNJ$~3{(Z)E zi5;FmfpXbwUSmV%o}ZZn65;@T^bmwi32y+`FvYNYVEC6G8uOiR3f#B3Pg+0_VWqpl z)O)UTib>jIkqSZ`*jjNE5(z;F!Q>%jGiXAk+}TnFw!XNvBksHR0#CiTL*olbfu;*g zT|wO%+Gt3j#+4)Oq}6DKc?|c_V5OOfbe@Cyh}EfQr}a!FQelu(Qzu7j*OBDewrkYl znC7{}aGY|K%lObL6jGQeZ+T#oD_7UKelTHUVmLUs$lMFtqis%%I*hA1xhC9qVvT#& z_P`rVu^f{TBM@X+(wiRVA!FT{0?|jW;}jN@y`Fk+!~W-e$2w`1CpIT8I*5yj+ANAD zDXl?DSz?*epZaD<1X3TMGHFb+KFLxuX^3knf;D}MGDmtLQ}gqp$}6j{d7&pgBx0i{ zrPz#zB>;m<5y9ecba)D}7(6j`v~d9qLS;e9zQ2Ae8^a~w4l<4{nPHG<03#$>S0 zld`{EN^~4!egC2HBc)?Dvk3 zgbc))V~41ufJ94+u)5aq!p)NZ_Mcb$)gN2q{r5GDNNg;w^8V3p@PfP-mulvf#hZ>$ zPMDcB3SZ%hiq`Aql9*ZS*5v~iNEs9t!4{XWAu(OkajEr@#T$5V>wvmWoWCuyXc~U; z-vz{s^DJo?;1z`vJw<6*bV8EA2e&@O;-+J2OV(m!S{@RZ5k^}`D%g{^u`drI#hBR6 zR2xgIc3FFEDpSzaEy9RLw;~U}1Ln<~&B+ca-Nd;mr&c_tSN3ouCPtvV1@oYavxH18 zU*eA`!${Lcw5zd0vf*M@LT(b8sl7Zit%Q-{-y*|1kOMsgGV9ppuNJGa)u`B&>CTmw?gb?!w z^TK_n_DHGXuvQ#mRtKD`2tH88Ic-WD&Kk<9B*egYJfdq=7|;6_NrqAiYKc(KImbnI z-IRtYbsW=mo+9Z`wi~T-<;vqUi#brK4OO88!6waFwFRf0<$;YI-nc#IHgm|kwy*Q_ zjr(YfV3Q+-l9SUBTdVubW-WW&c`BJ8Q-j&H1fzVafX^Kxg9!#>1AgjQuU_T!_A~6q zEw0rMP*N+-VOlyr!I+v5bpl{oouX?4*DvnyUGMuIKKIE#qzi#2@43g<*X5qq(FO&?ZEr#gInL}>w}6xLF?FejU_FEmGnUm zRCj&JCXXrTiJc@v3Lsg^did(A>mi~hmcns*@OH^lRf*3(H|A^qFmUgQil6z@j_-PC zpLZPn3h!`#2(k^fV6n2!@6|uatQGECy@g%7i-ad6h@n&NVYXIFDeB}!m|*1y8w%d~ zNaSz7_^2OS!Q_ zIk`oYmU`B)x&no3iLFY{#AK1A8fl;n8gfvfr-eyAe1wc)^_j2q2`E?v@Q2PKnn4lr zy6R6r2PTjyGC<6eA4a?9l6inmTtfP>lq|q5eJJezp9h=!a&VcC14h&0BxzVDidCub zSihe7QWIh62A!X<*QM4GonAVoz}f=3$Q_eC{`Q}~joDRCtN^Fa8bhJ$Zt;vpikDnHS~{GFjha z9B*)KHs+JB)LiwE{TqkaYK`O^(OE{~*BA*gRg%1GraTN@8*-A{38Nj2-qn2 z%vbBbdV(Ux;$hG_ikQry5js4ncf;ueg$%cmy!`UH)OX94YsHA<)IAeH`?O!=Sa3W3 z)t|O;$hReD`9aiv%?|M`MoA?S`eVuczfXVA=J*T-{vylh$`}D`WEuQ1`wBhN4uV4 zk?9RlCD40*A6+iBi(FRbz#*cng#;v@aHNPt6{8=pQgVdM+=wLP4qwWA3kA<(Ov4Od z41F5-x~P^Htr`dzn;%0$irgI}s3K@S8KuVvFo;wN#_iPnjkmwTUw?E9;|_ou&a54Ob9lSOr-7hadm}hjxhEXt7)HA1Ed)=t5E z2i6aH>-)Z&-&l1NZ{6U`ro$2tJ7#^9IK3iVn9jL#yn}0I1fxU8+vYmkm2MO&f#N)V zf6AG~OZ+#dp5tn_$E!Pkodf$QD>l%k1H@Kz$r8E+B7uXs=e8UFj8j)`(Z~qdi>wqk z*>ShAKKcxyxxntxNxJqr`@1v#=)=Fx-p*y-|2;p#`o=21{BM4q!ibufV)3z~SE4kc zn|BCZ8M};xAsrXAL6MTB=a}@j(_~FAYt_*v4Pz5aO(iuAi5b^=-6|L|uH%#W%Y*DV zDB3r7`rPl>&tzFfE;G3NsAG?}fX^6)F_waeH*j#&@`LYQmtw4AAGPOKY# z`acEQl=zi*U14kvps0}4WhE0sFbz^Q2pyJ!Yp*=PE4Lg!Ir=oQy-sB3p!}5x3OOHX%5P%Gr<%03Tb=!gH*Dh;IJzQW(qbC@uWD>NZu~s zpdoZ~Y~AthjSutg?=8X9kbLH#1e6M15{nVkHBwqqJ107ISQ#*w&SENubB0A%Vw#RK z;d89EPx4y)%iKKqqa3vbm|Kj}J_$=#USQ?m6FhMJaq7b5wsyy<(aT(H-o%6M%RI5S z&0;?1%C#4G{L5eB#MTC9PMqV`&Mxo&z<94F)d6B_iNWJD=t=4q!Ls8U zhy$LW!E3nVc_C&P;t*aOpQ`hXOGlghIx%^mE17(L_U%f=L;8;o1=wuX@gfL@L^>8I^U@(wrnM zGO^s&dRB@#YwiY@FJ59+IL0BeYFpM^L+D_Z3V#)O+l49qRZE%>Oi2~ zTjkI;bQDZB=Y03(S2?=nNO8=CapKS2`5fXq#5yEaj6+~8CQ=AQW=Nse)1*vsX$>(6 z(H!t-`JZ{O{dLY9?Lv2?fvsqu=l}~9#CU`RLn_li6-gqbs?{M8|fc&M*carSSL+YYrA2>ESl>0?5WItUM69C*>QaqCB_?E2b7S|7Y}gkWjcy^GmL@4^t2c&(9VKq; zujAJu=O;%5V^~lyZVtHn<$u7&&VRf@my@#?!Qh!-FHnl_U5TAL#`%h5!+hnhp$} za)TO!hKOMW^;uJHyXyfZRAr?HQw+l#sm|WnEY7wZ5*`9c)=p9aWL{%23#&-~)_Rnz z4?PT}AM`W`md{C#lxnjg9Se3nZ!09lKlJwk)3M>HR{}rt8&m%Nk2g%D%OU^?L2a?H z71ms1I^Jc?zDTIgaNouuvH&A$glig)=?ZXjr~=-skwyl)Xb@@gMOP!=WLr!KoLoO( z5dx`jNN0&ng`2DZ4dX(0>>?I=D3l|rW=68;AsHf+ddNhA8ry~zNfzH2?oD5U0G+G@ zD;T#2#X^TLLq(i#KyVld;638%p^?%PzlW?>!Djm5u%1t;BT4;5Pdc6AGjx~_JZmJ= z8S+~5!#SkKm*mn?`rve|ATy|1?J*oF<=>UmS6_nb@u;C|m;05e$EkFsVp0Z6b4}3` z`;;V>3yPF7ZJ~c?-U!Fi_mmGm1@L9rF_MIc%NMd&5rm{f4UCNtvh|UZAsFiGI814X zwj)(*P_1I6BQ6?@>nMtbA{??BFX_{kR+U8a=s=7P;}a4?-Y`DLah<%CA|W^(6#_O+ ze2ub=guvj_W=v9!l@Uw~Y;FjD^YM4`6KCfa3eTqi0v)J zUPZD`oET4t4x8X1^Ko8ux6y8&V!9Y}^ZHdzojl2l7hjXyKU&85q>~H8XJShK9gxqaXT&gS!+NNPtmW-=Ptab}6r+{u>E2YmG}FelS?bSyX@jV`iA^J~|czhrg*1Uhht%kI}9pk6K9Tt0M+`ss7HDfjS%f@5X$fWpp#|~8G$OefHr6CFMq&dLU?VZMr0BtT z3|2v87a=yv6LU&K5(Ei>lnz)yOSLv8%tSb48X&Ub5|gP=5io_YS{Zz+!8jS8?}vic zDJzWFC{T1r@U&@!2_BjmQUyf1j9?o`4c6SkC&82f-$l(zMT4Xmh+Wcy27`~HhOlBu zK1)W2ei|X)mp)bqc}_T&g(e$G1Wj*JRQ!p-8t+(adEKp)eAw$c>@^`Jg0cDV6J5uS zEH5KgGQiQ}NHWx|uLIMff=me+n5W6=#vj18{9Ytqm|iUqG8r{OG-)tdO)-H(hn|xq zrUvN;gN+BTY674#!H|?W-%I0IuXg5bfpayQGdRo!Sn-+=x`g;*C|C8`MWSm-MUe-o z8>G|C6Jvq`#2FPAl%Uh)Vkmv1V+3Nfi`(`(oi~=I9W_m`ul#-=$txE)fX*uJx|0G{+--$%S+H{rFZDZ_J z);BjvspP(g-bOX9IM{7Srl9dP(ddkwPVejK()RQcWH8!L26sf#l0++z%l_P=PMNL{ z6XVk9jG2k7t)HZ*#w0op5BKq2LE)xb5L@j!2C-SDCk$DCfPC!gdkeu2(88eiu!OCa zrQi~n%1XcJ#VU66`OwAe+b}=>(1PBqE4A?*|0b@#5R}zdGVw12% zVv>%y)LEi<#3rQ{NTw5%M$OL`ketC53B#P^bWBN1qor05Orfm*WFs=t?8P|n-cVFA zUq=llVm0VGBDF8DX^fL2)p|F%AvO%FB&jsB0BybxMsG&fSS%JRwQ_-a05WKHXbPR?$LIHr#Y)FDzs6tw@H?5A zDL;1q)BJ_IUgD=e_I|ePOZ>!}?&R6)mWSVPmC&l(Zs=4JSTYVKDdJ{F zpPN3gzG|q(hSl{=-u=$+V`s17z2EzztgN13@A?jB&Yb6kSEn2<_9=}JRCE<9YWUiB zUR>reA)@jh`EWTNuw=jmWgWW^JbP_Px>(UfP-E&e@ARbSU1;$w=*}B|Z5<`gUZ>SRi zlB-^EeuvFhy83%H}6zq%nE6MvkkoUyP6><_d=;jiAgf$Wcfp zXLtr}h6VE8@`$t0Mobqq=orD;JPtM}3@i35PKe&9B1+Tf#moCz^1kgQb4cVy8AG|& zXHLoG(hpJd3efSIJOv>=>!APr9E&BQbxs;mJ8cE)8|W)K#i=suSx^N* z(X2{RzFJTt4L0=Weqz0~Hh>~yyoR6wIKbCyKV(y3-rE?5D zHw6-d3DCjWjT!fCSw4BaHbS)QdyO))fHJmd{$_X(Wc`g<+ zns$N3ax~lHXtvLIJfSQKe4|=r7*v5ZYb)U#wrQ0c76LIeko=GV9>=BBbvv&od3}kP zq6`}1=GbHOfDHK7^S-+`_-jA3!-cIqis+dWFm=he2o$y_eTgh|Hfk_aIhjGp4UM`O%HNF8&-C&cOA5>U-Kt6*o$S%-0uq|1cwOhL-k z*TBt8nJX8UG=#o%)gaV2^728L^q`mQdC+IjJz-YkOb+(L8q9N*Ig!DDiPj9_d}8w= zLNl6Z49SR67gFAq`3+0IAV|l^R+*pEmw{F^&D;Ecmy7c$x0ji#+nkck{}nS2%s*EJ=j(cb{cE z88KbiWOH+!mtJ{^2OoMDmoB}AB=vOc$CzS1O=2eWWidychg%+GAUZRc1{oinacg}? z+tjSCZ1960{Bhp?wr}T6Z+w_LF5Jud`Zilzr`TBEU~O$3XGWYpbsHcM;s*1^I%<6Q7!WM&zP|vmMEzorKR2Q@c4=q)d{t&XRybzKM ziAVuRuuR8}?|bu2Sj_mBzdPj@KXZm>uWU1K#_TtSqt>#BiHiq@i&rc%_M~D?Oou>A zG9Fx`wV16D>q*j*(gMnsRMZ(|)~*{)Plnhw3TsH74K<4OL1ev5tQQ@dr5~ym68JWf zjM59lYbliaPFqd{4El2Vd$~#gQm6V{`Y*LHld90Jyy)P(WI}*uz&VgaqY#gc&?>0j zSANoGLpj}%989E_ybhw(M?W^vH$XCWrE}X_s;98zbH==Pbht+JzDf_e%TR&}q8(8b zIm$t^ck#$06+Pzyl^f9rnU>gWf4Gs4Y;EV|)olf+wH)3TIE> z&dbkSBBXs@c=;vnJiE;kU;GrWJo_2G{*BKu8Bb{f5ToKIMqAN?+D6W#q?Zp8r6I(; zl8&>~t+Ch$tLtmL<8ANa!8bk%q7KLitW8&`s)EDW9;5LJCr+HBt&e#Ag|8ztas zK?97nj`4VfrtNU0YMB{P*_*EI5Ch}Ugd`Azy`>KNPa zT0u-e2z>a7DZkagmtLCUO~;46I^j>hC-D7`)|_?@s>sf);_|oFDApF7+Sn&Gr$}}m zLO@tW!Dq#@5(%V()M~A0^5#o<^R}4?+eXD+lgZaw*LGCMql;x#`e?GzN;G7_KZa zsNBrga!vZrnWcr|vC=V*^(CL1bU7@TETJ=Kpy>@8f`ewQOAcrZdCle^tCuJyk~ONy z)L-nJ()As%j00<}nph2 zph@zDilj29pD|w{t0zI%S|qC*h%<-@gft=88Y?~@$jaUcWbu13NQf{>EbKOJZvkb5 zzEeq3{)x#KENUQ+d9(DQ1Sw~S#;Lrn(6Q5QAV(wq-;e$wcdvgZzx3D}_=UHBgw3|a z8^@{10cXQ5(i&1D+5J}_I$Y=ZnlJd@IKIEex{VXCXusEGg5iv@8pk!;~ zBnPuS+OEUdg3^t#?E)dOn9p&p1T1A~03k-NI`g?a9AJQ?ht5#`4Z$q$$CL-pMM%~X zqwu+x60pMR6htbn?F4@AH#;7G?gW47z5CpAw`X;|V{6Ou%oC2$gTngS5nZY=rXu*6 z>d~hFG#ad2M?!;oLdlOYN^U5HVY8*2VW|3nrnzMan`Oc#1)xF-6xJ{;B4y5!F~<&c z^1+#M#+5M~WBaT|4KpyJr78NkC4^;HKJUfUCnXV5kqISUf5%q|iz9mN&JW$&;jCC@ zKUsi3S7I@%H}uLaX@DP6J}6Dz(|tLgi)=moGyh8=!5pZik3o7JOfsq$ZcOjX)_*8N z&&%jDv>u1*xmtiaXqY}_6|Ij=F8%U2yu*fG=0O|F6 zvXGd*HA9q0y(saE4Z2nc-jSSk?@SU>p_{a?E(cG!0LiJ*#a*MPxNY^tTEHpX$4tT9jD6|FY~~C?_g4_KscZ(#*9W2Rwi3WImMI{ z#X19|UIr$q+J#R^$8D010U6PbOOiw~261+9jWI_5v#!7u100u`>BMA23P4%V9AH%F$f~&^urjT zsGuB0f@$f9FcLo(B(buH~CguMwrics&q}sYzyrNQ;;m zV&;fxl@V@*Xj??Q^17@C+o5EoV_dhs9x8OxpC~$3#=5J6Ra4oG6=50^p%X$-a63WP zl*`bH=o$5%%X{w_L}0ANs4cx_b}bc;*2(zyUyl00DyYERhmPOSBY8maKu6 z2T68p>&CII*VIfu@gIk5=)j6C$S{UvSra4NJ*q5QUghF009C7F(2T} z(>Lv*yVt7wN7d^6LH^^O=Q$Y8+27v1yVt7q)?07A6|2?Ug&L?W*OLx%jwBC!(zsqS z>uO(TTQeCUWCJR>R#FZoHK0fuN{T2YAW)cg5!(wgsOc=FMTHWYY!4;ZWjdt;&XXBs zfdoXupzRvaSg^QJ5o{twD5RQSi}-0_*ArYqko}|W^d8)GjUl6yUWd}5u1*I_;e1g= zOZ)8EIl(4a^(2ArdwF_d0ZuDJR@y7nVW?(mXFoTs=H$AC&PvIs!bFVZ^wh!bphbDD z1?hvOxIsx>un2DDCl6FsQjJjv!Ny@(`PVCg4u4fl7e-Q~?#Ow>-Mqxn*UadaBl>y8 zx1aqosZ;t|h@yyeXz+mym8Z5DBxm;LJzu$&5t$P6f?68VJR^OkZx49vi@(GAc#Baz zrAygO`Ruv0=+K~^HTcP{T06U z^p|stL3vz4DSoXM0JMCTqK9m3mF$~Y zUR8oDaL)LxRuK&^fQBRMKDv{of_GF=t-nz!a&vw~F^84)_%uf}X~ zO!6S)x}{%MOeb@~Jfl@h>U`>N5KAK@cp)MWGZ}Lhs#e&`HBVoxDTMM^TSOvf&)>t# zFTF_adTw{OkQnHaEfy`jj@U@~;16!VgU(6WC@w)HIvawgYWA9@8PPNi?Xsn+D+>;} zEIMeHOE%WGICb(YM~+O%Nm;fXfxvjupczh`IE!ZJ`z52%ahkeecjp%8?!1q4cizYT z!A-iH(46S|j=h~7Zr!>?Q;%utG4sU%B0dPWYl$&3ovhJzEmc*odQk;K6yBzDSm|zG z$B6iX4pb88ibJtO(!JX?ur`kDYR}LAw(!2U)jV={%j*yJxbhsFJUS*;bF>XB8X#ki z7Svw7>MaTcL8J3T(YIX?vh%N^wvMDRlfEV>YqcG|DJPOf_IB-OGm)OwQoa&=5$A~# zyUQBcT4R0xnq>ry1-Z~E%VkB1LQ}O!RN@43i)9`q*r>N`Ngz~0(}>e7;zYdb9czb% zMNxoD8eGm1$~I06s({?N4}b9IlB^q~Y(%w_c8Cq);lay;7IQqfSfh-mzZ8qsuu9ho zbd}&$83|=J;}C}mDOEr>B}O@1^p_r5Kr(C$++tN?F-5cA5)_r56a=jf<-J)U1vCXK z!)BX&8@%Kj$31nmBzMWsn+j;M%A1tS_RmSc!k(Bmpc1WABC8xdmslpN6NaMp^$<8n zHcAkUhDbx}nkt!-#eBAu%Q8wz=!vdFpC{NX5~krh@pcuLU=f2eVppcbC*E3S()?z^%D^!`+KA<>@mfQYz|PXvz9fNA(Iv|c1|RwI zW{xP52Z2#q(%iUBs03AePqMlfWJZ=faVo~m_KLQGrie6gb&XEbND%V0Ll#2lf{Rd< zSY;11I&jY=@C;zZBG?cs@XD=}U{QV^MUv^ihCQjJN;tfN0)+;TFt09ZRw{GG1nn&F zV>F_Mp9*VO++VF9U=& zpdle6Pv$y95+Q*0c*yXa8@sVNyECLj^J;PxZ}&?krGqI26E)c z&4bJnUz_sKxjpj1oQEDB(eCe)TdWA>M76!QG8&sB25R>-bzZ!x@KoA2xRdhEnUI&l zXp}j!QJFWpcU060U2p39=uOAC_DVu=L=dzSrW>Xw%vq?ULX#=%H44>wA`;Lp5t{%Z z6Dma{!_wsjZXQ{x^;KnuuXeq)I#mq)e5Dv?0Z0Z;Se$S%ajd#H)B#HnC+zL>4V{I< z9t(s1Qc7R3|GauWH~@{1kqSbv!S{&w=LM89US6E1D$zIy0~$iinbJPUHc0RjO#_2Y zNrs*(M?+Fn=%yVBChBl;nGCii>ZF%=K#)4P_|b2K1hSf^4nUAhXabUj7?LfjJ`UNb zO_{dxvNkSA(=Y_LzDvV1Athq3XlG9-ONNkbkq>}U1{4#dRFwlo^^AAB8}ed!0QSi2 ze&nQt4pN=aCeT$G;y!P?XKqzxwUO|ufx2!6G+>opLw#8@ed653q^Nw@eclZ6QZ)~t^=Nvn6lKWnBAIo+@RYjup zUQksv)9Hk@%?a;#`@8tAZ~0T4IB|yQ+8S*;r->tu9X-zP|G{r@?b;=_Hn%x`{5a$B zh^DSMcI*V_&fUwXnNrs^TU%SKuWgVsG)+TYRfw3U{banxWW0enM;tok4@+o5cvWv< zLHt32-3uv)oV8mmMUk$;W=sp8eSQm?hSZr`>9IRZUXce8CPRiqw&5Fw02~no4^Cdu z%#lG#LnYqgm64EGs}u8G0gWbP4oVg6|FbF~dKw=*g;NHE(#`Y0r@3vq&6mtVo-6d3 zuvGNGf=;Lft-PXF(lDH#u3hauE^F5HZ$rvj5ks)0_)yNA7;C_g zj4GTteJ4#lW@CMm`|f=WYm+t3oVt^5{@{0U=H%U6zHy2B@4ug8$4`(_M_t!UCN_Op zeembe6Gxb?uXD$_ySV3`*K+g5EtJHv>v;X^--N32;!7{EzP?6PSDZR^iX+F4u)TeR zaWiE+T4Q5<%NDW-RU84(_ldfy==+WkD%Pf(#JKX@Dgk^|xVB1_x!PKg7L`@tE@Xvf zq9gE5GhJ#Jg~-#d?9=Vlgeuc_nSN%oA0_%>KJ45TvMA4eZ7Nzu^(pEO6l4rKk|9GT>8e&g%{#YzQ6_ z>;esFFbGdAmGAKih7T1@hG0w%ErX^)!2Ol|0|i&1``?Q}NO2iLv85O`Rp;rLxB%0G zgL-csQC8_=j*hOxuA{erIOO!vuPZ6clv)yjj@$(IKCcLkGPDYWY&tL3WT`09tBF;o zBkDn$l+fB{py?#~AW74r1qn!Fshx`5i-4Dl#pyo{MrwL#T~ao2t6z853%koPjA|ob zgAuNwF;|GizVd}pbhdkWxx@wq=*Qjf= zkk-_(y|&G`UgP|^dwJ6v-pca*Xx0ZSK75JRkYfKft$s>z^Qo#M<`AIu@dG^!QP>x3}2d-ePlO zn`S(X4Lo^vwOL|wlSRgB0@@O2wu5QLtqLa5G7LikX+Mlxx4BR z*e#TIz0yn1CmyYN^4STo_Gc)Vold!_IUu=0nV{Nu@JbXdRB1ueAV|(eKaeSXv;h-5 zlQP@ufmd#|%vBI7@>1ytbZV4`=0j;=d0!Q}T#>5A?nm@BVbIOoMLeC8Dne!Gn(V^b zGVIw2-rV{6u7dMLHv3TtNc8nw(zF;12|8yr)YC$=Dkep8(Hn^~b)|I6&XB~|1~`aI9zyNarCJDU zElM>Mmevh zTMq)vLp`ll08%;?s<>po6Mpo2&vMV5kCPW(k1=AGQmzmJ-7;JIRuiel$+{}AgBWC} zw##aypnaU$rVM^iJ#ZSn`Q0@Kv&4z1Qq`u5l$boHLJTsRa=};(BP1fGl z3QQs91YJU_U}=^kAH^z_q4RAQ86+?uq%KfR1Pv`8wgv+}XDzD}iKQ*!U&pF$D&|KY>G@>i>c&A`S`QKGdq!^jrzb&Z=`kq>5P4*4w@I& zsHxIp*JNWN0E#Y2QL*C4=H@0~vV*(My@s==?`CUjgFDaMWocMdQ&kN&ZrJ-hWA#2Zc+Mt;4cU=WWO=E#kDw-;B?C4Qme)%Hrde?h7aq>9h^_nk! z{!4uH-~Jo^#CLu>O;aNWLS02ttyHlBf#b)IGn>y?wjC!=oZ-feYjl0b`q~D|<&vx& zH*VY@C8cRbj7DRY^MfH3EEdc*K5d2UeS!Olmj_Nr)Y@ON!gyNI?hD7aru^`?Jjq7C zXKgAQVI_2Qu1e@>CIX{&peu$REl-~;w3H#W48gK+PGJ5{TSq$9$B`=s73WVbQ7Tg3 zTi<0B$-*eLrlEHtqJltz(UN0WIe#FC%V2%a4t<1D*L&dL1RQy zASY`;CtEW#Y2~4o{ZKSB0?)9LxsIwU0D{QSz7?Xmngo|NNGNJ{8L-Si?uY32QwBml zlpad!UUC_LzX57OtyR&*BYer(rEn)6#7dO4bHnX7JgswIn^ILNoP+T_#^VgVg-*^5 z`mX>*MqrMTWk7*#e5*E?A5jdDlR044O(Llg`e?R3E|(lgZKd5@T6}uQQrp}*x0sT+WLZg#?`p-m+-pytYcKz1Td0Qo@OC55?MszXJfHMR76P$WIt~2R<7+gb z25IT%kz5CpC-`CwDuWPoD2RX&$YRHrw_lkwBPT10WMyq_i;b7bUB+z%D;;z!1( zz@$ueGl3wWNqF1&ij$iL7=%O};6Q^*bUfZxmQH5Ro($m_T8g-W+y&m!_-5;zD?0#s z8!n-a{Bnel&2T_E?B`OjOhcp56t%9Zb%zE57${NC5R$dxIkzURwl6ab&0g8~CsVJB zxm9@dmO7XKT%9w^#SGIIb}3-E(?ci^TAd6DNzJg%33d~Y6>W!YSoMs^y8m6CaCl6; z2Pw%|8dZ>%r<2lSpV4JP3N|#M^%Z3h#nU`-xr7CR>{Dk8ytk9mYLk^@f|U^rO$n3% zps7S}SIkSU$dia9wIPwrk%b4GXpRplLrUQghiaz%F25nWT3@@2L^sI`!3BT1dWa>L z4;extNhT#Tvr{p?PkYmCU%M4}?B&cs2CB$w?`t^P1om}K8^jiRseY+JX=``T@@x%4 zi%B|=Y@CWJYm+sOZfz3?+;h+Cc<{kTIDYgLw{P!~dga`mcX8jn_tJMgzy7g*#~a`H zM$VkM6GR!0Csb8UUDwR#b5csf@49Z7Or|WC9oMhlB&D9FsX2DyICq`Dn=J6wx4(@y zJn{xclM%DU-1I#$Fquq@W2z%->r<+#qG@W5A3w%uG-fhgV{7{e>ua0DP;vI`8Md~z zIC}IrRcu(_*d&ILw-U*aJ|wqnULhQ9{8`m>GK$>XSFY?g3}WU4(g(D~ zcqc!D@!&UXhLVG-xINP9x!A_`^-xC&eUf@e3Ep&i!HMY{jY3@qVhr>-TY<+bf?Cju z_#O)oqWilGc37y|LGBrEX=m%K8e`(kj7ca|t(O*cave)sGsLDR)|moUY+{ZK!H&Wu z;;AaDwXZoD-;DFNg{+StBSjmf$Q6qI3g@pSy8TfKLwlaZMGMq9SOt90T4|8sbP&HN z^6CqPxT@+>QWN#wA&D85n!t)<=@uf-7#4C1vy9Ovxh zUI#=aHv#R%Zf

PLmRSpo6;gNE`)nHzq8xly6xhwNu-@BBmqon;Hf$@fg(+s$H|h zYy}5|95Nw$YjiNK%(~T`a33^VLaaS-w`xNy-29IUS{)H44S)4rV}9rZ3(g%q;L*pG zAN-jyH`<;Ym4sEh%5aavmBNB^6(t2rAjwJ~ur^sEO2yiEoufyOa{c;MrsEOIcAqbP z>9gE(?>SDNI?a`&xg%$;ZNW_R}%F+_HEcW9R# zIV*ji=sH8Fo0~_tefuU|KRdKOjD#=J1}&Vaqb*MW%1MN%(DjMF&&=AIm-nHn0(~ln zXf{;fJXUteiguo9Mzdj(ex)2YL3ZIi{g4lll#Bewv!2SpLfuA`9toMMc(&n%D-C}7 z`}aUxFKL_C=04ap^|tkh6(E@`kx&J4upUQLtiUFo5@J+}gg|N)scVKFprn?{Mc)VB zwl(N3on%LxvvU30&~k$sGE{2|qOuHaP;M><+uKJ* zV<`ifjrA!_)397FRs$$hk=P)OBebew*>WGi)Jz=UC6Ah zO}TveGBMO_Zf zs7TAeJZC1gSk)>pY(#VK@H?Ct_(dv3+K4#f(hjqXDeF%ZSsGQM&No##p+u+?$pdOi z(B@3a)~zAFrw}naa!2ktX0A+(GpA?0YnDOuxjTvIgK znCsxcBRd6QMLr=VB?{gPY`m2W{FS204z_U~-U5 z_M%7#hHk68h!%|i39N^|1K zZc-*WycTP32=3~*bWAfG&xWETS_O#+Ed6_{3^I+9j;xHy3~6OQ-Eie{N=g%2?%7Cm z`@W{Vr7x6iB-?siWn`2MqSkiV%}2$UcB%OZ+zrUJo3=n z`OV+_McRJOxBl_(rd_H@1w!W3sZ(?*(~KJG##@2rODfkArIe^DrSCIGx3;-?<0f71 zx%2F4QZg%;(xaGCG7mCc>Bd9?O%u6s1O7k1 zDM&kl+`G`!(|hqbe1*_<9??F}iEKY`5uYL@IC1Tjb@H$WP@7MXGten1Dj`O)(-5Ot zsH%uaXNRMgQF1aFhIm&9*|Gw4J_|L(MGZL!F=U%uUMtKT7`TowSHY$MRT-Js9<;t# z(-dk9Xmoi&vZ24L!oTnHY!M?P-ou&)Z54sy2kIG?pgH*L2Cul5)Uy0j3=C;lWp9F^ zH%&qal@ZtKmA|Zhv4RnG>hQI2#8Jr69#-&xqLe^qoXpS{R2&(CRWJzng_zjPrbEk6 zZY@wzywWg~T!ZD(tC3BsO-Y~VXQoTZA-YwDS875g7V|wUs7M7_dUU>SEj3}{M66vm z(Z7ST>SK~Lpu?O@vqCl#yBsksRq_Q?L9Se);rEY}txdzk}X2&2M>_D_1YGbL#+5?z!hK&YU?5Dje+3*xx_k`t=*;;sEr0-< zdH%WQc>bAZhzQGN%WO7VZORff${O%+J|)IL)6_Ig&15oSG^#mv>?o+P zSS&m>-9pt21(CpA=kMj-`yOO{W0R(K9?LnZKk8Uo*Y!ZYd#v!^VyF})v>i8ZT<1T3 z|AKG4<0d-?W_qZ7$s*k91@m_gIU$->)Rii!^$APCc`U?>N}d`;abI;4HYX9QKvvj+ zm(}QvoCw)61e<76@Pe<+9#Y75=tWP}P`Wmd=RWqnNi-8XBIea{>$QSfp-BWo z`wF3g(BSe2T!Nshie3pVr3eJ}{o;!E33y?s5~$1=QY)i9#2cyA9ei!Hm)gYVV3j`e zkH?U@^WUZ^6Dmo9ju>A#zL%JhhrDLX15N zI%3rjLW}6qQ>ctqg0{9m;z-bi`3-54sYVrfrbuHa+R&<01XIyY-*y&=Yf2-Ly!2Bk zU;^^e*mv>Fvrm#k=KQ$_`1Wu4UOxEEA7FjD#b-YISuVWv0$+XRF=p)n-}5K_ z4EI0yFz3$SN#C_xzjl+$S1xncU3ap-KjW2GF0!{j=l$RCbx45y+5W4^?mzM?$Z*tH zJ5yDWH8UDnU^#K(xTllm`+oeyQI^X!_ICH^6=Ge}?wKpX!QKoAJaGTRT)Xx%d;7b@ zDp<8l#G0hlbX$FI);1-O+C7Xu#G+?J=BbOyrTe#-uI)08R&abfBFY`_`yf`ul}na=hlrIJpJTTJo)7(_{ab7AF+FD zhpGyU$0Mq$;^gU59L(nI@9)#p4WrTMRp}qBQnH+Vt$Cd9`<|SvB3)M%OehH88jVboN#DbtIXAwZ2a)nlzUgWXFGgPAu*G(e|Gi? zve}*a{;-3zxCxU487X;`%^jt)B7k^FQinigF1y9Dsc?wNEZ0o1jY416x9h}023OxM>2aH77D z`i8hlAQFPvO+x0;oV# zLWsn?B#@DI%WjAh*CE>?%w%$JhMt=pIQ!k2!JE7vd5rzLNEpJeg|26boOU{X^62_B;6DN;y`}R$)Uc1b4IU~EA z;jn--#?rLOaPW%9b}bdfpmaK7zJx?%*)hmkau*1lKyQIaF-~geaVw%X?~0FAS;y9x zFKX$(>G4W*Sry5}sRq+MX0r4UGOY^99S(AD8%(p%wO&CCN+1!sKw3cRm0GM>zF+!; z^(wNQC!0+$@x7OIsK!aCZ9SK!Dy)RNolH<7jM&a+5H!iPB17 zeUymPr6IPVjBD>%oEQ(IQ57o_PpZr(p9?&CVZ>$xbdMl4ic%9u+L6RUSNTpufN;_> z1cU2)`#WgPOs5mR_Ux00D6hTmLH71UaW zT`pC{N%)McoRgDIOhYx2$p ze{^M?h`p$|4=kC`R6Wu!t%9y4JEYFAMv__RyAjoB z;k|f)zJo9hgqY2s&$o=x%bD?5&^DWea^b_4YIH{dZ%g1dfXOMA605^CRL zNv!f6fndFcnz9ABTn;9Gy%aQK0`620TyP$%Hsq$gA8e{fW5m44M#MzfJ@ku6K#eC# z=&JuI7Eza_Qr0x&kTKh&8B5XZuL^ik|5~N&Z9%N)yEsI8DsCg_Xw5dWxfUvPN=QZV zZYiBcMJ9rbyz!|7KCv__mSanyY5><>sbo?TLT^X$Bo$>B>eItMPdw0#ePgMo#IHFsoLurD^3X0Oa1g68!9~jcLwr$Bd50%2Iu9&w=63S>i z=JxIm%dTZI8L_ps!SNHvm`o>ZtZz~`W1f5N8Ba}=l(VByrK%f>_xWLTS9EGYKy#0z zmXvGSsv*SM_HT9sQ7Kv}GO}oulUI!^kg-@5O|Zi&R7M~8nhnb(k~&*Y#pNW~d`(SO z+CS*U(mrwSM;#Od9Xb@K#GOPynoKpad4bX@G=MBv}8gTi^`N6h&BGs^Z|pJ{~W8ZAK$}%#Mm-;Eb_J ztM}Iod0x`Yh<1W5m3~<>+ph`bNHnPetb8Xd{~Vg4OG!ZU3g+7$F}>5FhEk8Mlz|mE zq$_y9{!E9{_;AWJYZ58XM*9Depj(`tXb(rFFnQ%Sx-pCumob=B5GD-$9CC#I7L)9I8^)3CX*!FV#}%(*)luTN=n&(_gx4wf?{2yHtjdLwv@KGECP zR$bSxYKkuDvT8&T-9n9;U~WTcPz_}nNbXZmEfm> zmxaX_l#(6wSVudBi90Q7gTeNg@X`c;Y2nI3kIx(F_k!T2+%+NI@%y!_=XG z1uT|xG%Mp~%w#m><%=(}y>Xm}9(W_a{O|q+PdxcWzWE#fI9(5KdB@wibn!BGoVklr zr_WF|4VN!nW`5%~P1Eq5ANd}B{$KnHKK6-U;nuAiJoDVs+L#9R~qdsk$y7G<)^_Di@z{LQsQdE1x2O$^{pNwY7 z$+U}ucsmCAtY{yQSP{b#dL{KjU5h*C+C0M4>0oF=od!B(00h~yfe?^ZsevQYs}yS_ z>m|0P?<~Q^Ut#6IkS(Z&f$n!Ua29gk6k}YA=6P#$Fk!(pB*CG}d~TEcdlOCqH=| zeNs|V)xk_ms%#C$j`Y+Ya`D&E0@o7O#_i?g(1=w*DkGmIH)M%OujczMiQHL43*8(# z(^o;Zl(!3nK0uqT!L>4^M{oM7vRK2oMRbQ4dL#1{J5`E@mtDCxVvFLH6$Dz&=WmitC;$}jJz_+WEHqXgru21Cl>9JoxR)a&2EuW=8@OG zl}aLyJ@Ew|eBdGOK6gKtZa>F^Z+n1;UiYx2)3M@X|MsK&{LlO!JpHw&xpm_1ltcl~tPw~L(9^}hUe3n1_%%^$o#i#i3|MGA1+}B=Ydvn`h{Qn>BsyufKX2#uR zzh8B%sbi#RY8GwJ{$gold%I-X)T~b?WX&8qdX#p#U_LuQqLshNwrG5yQ zhZY*;!>#E*(e=uO>l60-imZt?_Z$$I5a`IXo;@VZWHQkfo_S=|HH49G)R7;)md-_& zDs-5AxK+sQkQ(e_B%)>Q^oA&!k&shhNxiB{Mq z7h;iP*uJ6`D;xp2RdS!u&>>@?sxe__ZzxPMi0iY|wP?nT1s}R{_+I*6_oSTCFYLB9 z*5%BqzYD6MFa}3jwbM zgspy47HN5}aHxey54~nZ#c0tpc}}YVuVmm*+)t{c6tjIB+^Fu{;K(ZY15!H~_Sy+K zjaj4(2o<@*tY`BCU1UP*12?^D;zyn}WiRp8npNs0SxDJ}jVv4T9BV`9)cVP?-=|@d z8Z4Dyuso=}ez2ub=vqaR68jN9_B}Jc;~|)}4NYvVJ;77e!)cZO34ipLy{j;48mc;Q z?b<~yyz*5pUVesKH*fLAhu+Fpp8OL3{XhM$`K$l&k8=9xS)PCCB~IUQmKUFWjy!95 z=;4PrdG-w7^Znn)vS0Emzw%4;UFI9!_s4nXJKoRTcfFREUVet{?QNPS@;Cq15Az4V z|9b<9D%Uz(lmB_&_m0SQb$c+YXAz-kYTB+tu)f2-Z`s^jXLECt@x&UW&zw0;RaYLE ziXE~IUG2Ih%jLp?oLV|vE`*z1WIt6bQjMgVr*3U=FdMNRYa4jd z+NA0-j!v?W`+!oTx-`3*UWZ||_SrqrTYKct{?UZ>!7i1MO{|!6fI4z~J#f2A?9VgQ z4UEMY@J^6Qk*cF_u~`8kt0LAikQW|UMoKlZtRoc^U*ttn4t)m)1RHzrJgbR8JIzRlunM3m;>f~s z@Iurnp{lJk+$HZ}QbOf&F!9`&G7v+3K&vutc1@7FsF5lmb%h;8Q*_jzGxhIk4a}Wd zO3_pX;d4r>1KJKBVq@fg!at{seyXB#WNMqTKnc&$Rk2xsE_lUTY^vI(%=Br*+08kB z=TB5TcA??ctfG#AmKCY|s^D}8UA^khL!eJR2m5=hPuH2x=QN`+_rLZHq`ctFnR7to z3y*)1$!Lw&zV1HSzGZV`oezB5hv`K*vbDvtPd&|<6DK)$_Z@uYD_`Vb_Cen9w)b-F z`c-!K_6ZWW^S(2D<}-i5$A0zWJo3gj5vzI-a1Nf`zG<4K8Jr%9Z4g*1PfCfbN>x=z zz&zhawYe88d*<^QF-DrE;_8*F9N9j~+Qu4-n|s6BEM8Y701h5bx$tYUdX8X+gu-r@ zxVYbOcN>{4B8zcL7Xq_>%5OZIc+Z0))+hV)NnP3^ge0IHIVaSDw%L$Dbgfk(-8G7l-mdAg^_`)KR$VL>=?(-?D?V5P7RatFIGl)~SoeqKl^v23 z?73uG7&n%431Y^9QMnG&J?A9bRCuZES%p~3%A-6e5)#zdmkfR}0%CKv9feu>)h;4H zj#%H{id-z!nUXk{eWk%A`B7ZyZa+uij*5+ppGZN~Nkiqv?JXAd5#xtYZ;FOe(FkHU zU6Xn0%$F4@H#DO}h%lWliP{fjq-a9J9BsmI{Zz1AOxU|I0ZA4h8aq)$gF))3Xy-yV z=|KXyuWVtp$#pumI3?QmDigA)83J=bSwW%+Vgm%3vFL?!Tl>8A-UD`fA*nD|Qvrv= zCRm4l4JWsn7gP)tRjjG1F%lx9QO%{xFSEbgj1aOLvL z{EZ*^FZr(T`LlfL4}X^=${&30lia#>o2DMyp?4@)*)>`pA{wY-0|b(*{!_}Xu`=Q4 ze9pw{kG*+7pVI=lV;AEk?m`xMo&23@XsDsP&jI?Nz- zWO_S2yB?9`2b2%Od8b7$BlILnEY)FQ1lA0bYnfziXXq8~2 zc0iLoTeB=0Jg}9cREEne=5@F)M|pCZ;1Ebt@B0XwlVcn| zvdxui7x=;#9%Vcp8^SF_t(fw>?|V{j|L(fZf{-fn`P>7Nl2a!2iScMmd9(nxZrw&i z*xKG=c5uK8FTBWe&p*d_GA4#?+syVYEJHxt#I-*WKpFzcce|zZ?09Upr29(#L8AvqH*!i*SIdcfT(qv5dmXw$bxa zpfyg&g0@!!M}ZuT%PU&oNo}L$I)6LO0qM<+gpf=ueJEqmAZRTHGSo@&49OLgnxLDR z2v%}5F1E-G)ImZCItinCN^znDCABoxq!4*^Aof2zOTxc6g%%G6|Ry8lfW-NFI zyZ*xKmUbAg_F8-~J=m*{Yc2oCz7dL!<#5E56^G(~;r#C^h7GSNe^8)!fx|{nnbBXt z=5~{YgeR>QAfZR2u)ftZ4(e)Kj3ZE2%<4+aYNl%tL_FBBQqvAfdm)E)G;~%{Nl*E1DZIfojDnq@I zy7SRCC$?**VM54>iDW9#p|~;ZMZd3QAZ;1rm2x6R;nuAi=0e`=?7bhmL;6|t zS;@6@D+RtC5=vxL_k8t|^2rxRESD8~i@o-SvzL{ddUMW_O? zF=UlPCM~k1wZUZk=F_B`VyyArygTvS3iW z+7A=ul=KUSgpU0NvbzK*w~h!-erpz2hsx??Kq+13;v!N}e_O$Lf*zPFGQlh~hG7o8 z>LzFz3Fg(s;JS`su9<*JwAThOZ=wp-8f_C%%?I6&5)|?3jh`e*+*e+PMTJ1p45>kA zEzK?Ik3Xzc?ZUVk4dRwF*-t7pJKHS7P>JB)L9$G`M>CZmQc7ccV8ulqXA-*-2miu5UQ z{mNDT*f)QeXP6H3L$dq z+AX%WHW*bkw`aGR&kkt2o_f@*DrJR+9jIN2+hi5GN$i3+O9<;(tD5$o`a;c zvf)^XS-oVh(WEaL`0O(i9=LPH$&(F}QDV}<}S^apMUu{fBHj5 z`Hr`Im2@-Eqf}(1OOye%>N5!Il#P?YvIx}(mHDlOwxdrK;}FPEp^D6jRJ7Jvp@MYD z<_3<$24Yl}p@d~LZc6;Hn+M`FkowMokYW?00))0lV~(r3O+i$^*+`B0a7M`&UKMLvXt|31lw`TI+z=ViCxPDhra;Cv0Rh zD4RAQ9aSk!dnfoXM&5xBQGCo$Mr#J`j#c*jGrMdzFDgo9UhBCZjKu6ahzan5@hYK; zj`qB3TK&O!N+7yG}p^_^F@#NsgR2&b#09E*^NpgY=7*H@)?3yzw1x<*BE>!uNgmw{h~x z&(n+=j-NWmpZ~$X%v&FMHz!Y=;gwfj;`}}L@cs{cfM=im8lU*&C)nKHGA;>QS1Eft z3O3<7MB}bPj6C<;b8KyHG9GO(TP_Hd4ZmH?7c^B(yJ*=z*h5f`9No6GG53Ugl282R zuQHz>&@?rDXUh8+M;@@sVX?Yne^g#ku1`}ofiG4R*l#PIzNVbth-|%fpBuL$+hdqE zGj?8?@mJn|gz3?n{OeEkeEf@By#Kx#k~{KJh{2o(a#perbd_Xd=M7z%PRfXSp^i$Q zde1{v>n8%0s98L@qe1Db)6R@0b!pR zc>{_$HrRGeUM-A6@1Io`hajcCKti1wS08g<_FH)pl&BDp43o)^ytEp^% zmp&-*bW^aO%|WPE2+o5GZP zm?9XlYNc7*7Pm#e@C-wzcTNa3+BJg%!O%mg*?%_Dc0$u6ChI~kfj$YbQ%7t?xM~Q5yul&Y+o31%h4YIUDOBuGV!W-T)rkCCjLJ${z6C+^~o zJMZL)r#{11pWflc=U?WH551YJ%Afzse~A~Ke41JUsZU6Z-1p%9ES3wJX3UTMt-r?u zuX}(+*U|PZ54`pvj%^*|fBIkk0SEhY{^DQyk2qNFbN=3Y_$v=T%>Mo!ZM!6dYN!?# z9;eGJyeyp?VPyxUP4#7XK(n`a-T||avDK>Q)W%%MW(8SuU)En?|n;hmuS`^ zbb5*7J$(4?HU93WP9lu>#yf9Ao>QvSq*Yb8xN;b}H}AEoGPD(rz3;)f_rI!D)U<;Tdg?aN=Rh@5!otOwwF#NC7~Mgmrf2Gu z(0CQkIjxn4os|VkJDPzIu@@y)2RxoZ2yVS>!O!Na1aD!(6!WzpO9vOje)Q;81p^c~ zedBH|xwrSDH*>+N2q9MmoxBQGSuMX0c$Lr?os61nJ_K@aH!Z|f`dEnHLGqwtXk^Iw zEZA7iZ50h9xNgcqt4$nhzFgby!SxTV`IBafd;DXL2nQ?P&6kH76Bdg zR@q6d-JIx9J7we8#Ke5s3%T~wAlbsp-i)kv$?R>w#axwpU31dXPM2uW4y7(GPO(`aCWJ+9=9qGq$0#fQ;$q0 z(D%duqj~}fzWkL(xpeIU?S+>A;G6#>p^ohB@AEJJ<^RP4_dm!x?>R@toDybxJN*6s z=I`^+>mTAT|E0ge)$6xdE@y0RZt~Jg7rFGxMZWmhqkQBef0psIVeepvg(mh7cB!gn zkSrW-g0{wNGv({L4pn8goKsabscRXHCdR#qd7no$F6PDOpW_cc{X3jKdxDMiHE!Ly z#nVqe&1gL4V75=nnUs1$2y|VKYNo1e4qiryA=p$UKwb5I_?k>Fl|X8OcT-&1t+;;B z(jH8hj^GC&e6g?cNj)t)MQG(Nl3zI@Qty5jN;G3AK^khx{^17MR{WIxDib|QikJsYhkcG5;=2qo zmy5R(Du^;#Q{!n=Y+Sr}6LWO98ZyLao#@G;eaY)l7mqrWRc{KFD#5q`#-^32f{RcM zp=q(u=nFE;1IL#u%r{v`#=mwXUL zL(_}~&dbPs>!S>AuOmRt$@?%@+N@PoF;f<9&Y6^ZRFp+ubKzECt_RS=ECpy9p1Zi@ zD=(}wTTV!IL!RBDZgzP2m2Gwzq2uTjP$2c#8Y(;1H*fIugJQjVO&GLepj5%T(n2&s z--C~|igdy3VtS>$(W6Uo;c2uCp$=%}9#SI4@8TNA4z#rcJe9o?Tm6Sv#6n&M*&~s>3QhC*j>-~B~5FVlKmKjph+1d{1nx?!@|;s zSNyU-O~X`XBJ{~d2-#Cdk~N)%Dws?vs`&6i_xyRz zo;eLMGoD(Cb>{3D6zEdN@e^Bo_`}~sn>vc-?ywh?h!+)#M#WE5KN*>6O<{?ZM&pvJ5pyogLS={ zM_8=f;hS zvuApmzUJ7`#6~lR{Y0Et1usT1Yvlu*T%0@OkwOL1mt@0cTxxKdAS=@oi zO30l{cqo78{B^MYSIH&ScCJ;$I#Hs%w`wW!`Qh$sf{4GCL3xm~IsUR#a-&o^`AB$Q zV8NMv+q}BU6)C95Po)yK28Ra!X#a8p;q495*-?jmF+Xxd2L3<}IT?tSyx64cqQUUun6YXn1=NOSs94pgRP!{LJ<77X$}fIyi{E)Zau8aYP|^1t zw{Bjh8c!`4(^HQ}XrJg)q6!t_MEi6ybz`)^$zvxub^I)KHDWs1$fg*`uHh+_xC=D_Hf6YckrHXct7{P<~|nlC5w5_cr+yjq3c>= zw9iYqL+}YT{v5?er&ra;xevFU2_E3VxJ6$-IY5l&@g)Q%<1t_U!lQikE06Q|6JMb1 z7Hn)BW!ZIz_JmOJxko?8_K{7_p1p(7c+CEMpBFB^#JzW&CrTWetcz9id_K3S(cXYv z)bz=NUQlZ?wg*;&h_y+@#4EcEHxG`pV2>_$EK}y}xyu}rnwv|wqGL{E1zoV&%uFC! zS6sa@;lwHBOV@<%pyF+JF3@>rOIU2qKw8=ckI^PB2Q~7X2;n&DiVt0d%U6`gFGa5OHJL~^pV8~gIU%KA&OB`w zWN8F;RYmF;S({90Vx+EWrjs>}Y#n9POgMhz7-!F(MY;u7F22mw%UAfmKk=t|=Ud;- z{{9Wn%%?y5TYTlKU*Oc4Q+(jVALho5TU>bQ6}n`VH&q*MQ8yJfoK;b+xOV+EK_b~x z!5FNK=B1ZjVt;=|tg2yAh9QNwL9aPjMJYxhN(H^}i@*4@{KQZGV?OuTAFzM0$9OvB zv9ErKt2Zt)o=mxZ{VF$Z-Q>j!ub>1@pFGR{{(@znkx(&e8rG+4gcwbj+V#W`sA5H| zDvJM@{aXg7h(Vf@O&DzZIx@?N>$hjLJrHJS?1&4cTXsyE%$?Ir$jW@LCUgyRja=TV zsJBLZ^eZR$J%4}1Pkd<$wraB`Ld>b4GR<7>vbAWnE7Ey=8r>96`~bGfsV+fV z+w9UgiSHW1{oP>4fcLACO`9e@RoR519w<^Es!~g$(@4nH_ZZe8)=EUEFb+6Gmm4_L z5;xn_s7BEs1HU!c$cQ0CiMI3A5x5ck1|p0RaTpbJs5n}7X8wHTs|=J?VDQfKKkMp!kTIpxn51lf`1rm!Eu`i&rmmdjf$crz( z!m{gzX*pF>Q;ixzQyb9?&T+{Qykc1Saw!mFrk^X%+^ku&nb1dTY*zD+iX^t`1!Q4! zE0I{jJhOSE;f3o5eD6QJ%;jaE)6Bp5+!``%utBMis)!cBwZA8^Ko^KXm`b4Sdh4z0 zldYW$+WB)aMzdz3B`^U}C9CH;-r+h*;}VVTnSJ z!H9qgH|MkK5Z8p6)=^ecqkt*cOXo_V1!5U-XY}(*nP6ZBjB2XHz(Nw6m=)__jnV!M zkr0Q5U0l1AhiIn5#jk?NN_RDoTpl4;|1-o7i_#u7vq$?^H||XW@=BR zY-Zhv7z0@|RT$A!fuGV~E1`<`z+ez1@8_w~sQ}*y7Evd4Rf3Y;JFH z?lrIF+rIrz@s%gOz--y^?)SZ)qbIg_==HBBr_68v?(eX+w#NB;&inmSq6AXkv$?s! z2S4~Bx~^w5YPfjmB0|L-cbwtgd+%Y{wsc)jh=E=cnlhu25%W=P0K^L~yg zQ(t?AuJ4&lrcU%n`qbG#0}b@O@o|R04OuV*Ds|zlwFgNW^X%0r`};j?EYM!)JE0dC z2caR;^^sOvCO$bzmo5M55AWpLziyLdwacx8z+=xJaPfM@nYBP#2q9Y2d>(X2%3(Vu zZ9B$MIkIVEm;!c4X>d_=wp83Q13`15iegR6f=!fiq@u}#iWpil{?+MVH|Dd{t}>ZJ zRC-lJsv%GoQd@II`)m_=dgFObT9JK=IUj_jkWv@aWP39g@;v%jy;1~mBZVSKMOHr_ zL`Wp-Cse3PYmK^z{xArYqCj_aA*&BBNMaS3Ni84*x?udHoYu)DBRcM7xTxo^HSQyjtWcU!Tq&M@% z@RRg;M###!t;iEE_ehOY|WgvD%u zgusp6+uU{cYkBaIx3hWT2$N~e+Tu(`EKQ`hXwZWDsA zIj)FV_}Yul60ylSG20N*rmjfY8h&j;wmP>4g9~YlCg#L@3!N|yT2oibZXa08dJb~S zl-erBQHg3E>yTKhZD1+2vRnp!>|1x(I5i{hcZAW1pZ`MQQ(xZTdmou2ERnefC@C{NhEevTYHFtZuIyy#1@kdRL9%A*V#9Mna(L zGW9Z$6zWOo1Q4Vz93Lw_2|>i#(riCtnn!g|;~b1clTOgWb)hAOg8R^y%7pX+BT%W3oQV0rjM1V%D;B7t zD}6WaK=-Z@a&Kh1Dk%$bEpre@Jn_Yfd+!pau_CfWbF`83L#u&bWUMHYY_lkF0;8PC z`)kZ5=V;RrQk)R;E?>Re@WR!WsuFr9hRrl?C2}l-6%b(>t?9b18#dN9h*Gn^J7XO7 zII^+Lq?&Nw-LIt%!ut9K^PN2|yzo4WexFAl`y9Xj=%*P`^X3QN#O}d@t&^KvzH*7L zKK2}qZu8pLypDTcb1xDDw{P8|?>iru$*aa`nZ0pO-{(Wsx!%Zj>=f684b{v_a!;%~ z&Ya*M{exfT=FMwN#_Jp`W=7zvGMg`1EIXQ}VKg0)Q%{=~+}`ck+B{0vbzc2S94rp# z`j*Z0FWEZtg7D+uI|h#HkafhS6U+lUya zXU0}8qt8|WRszcftksc}GNY=aUtDK-N$I+p5iQ?)?s+d6Cr~^+Hm4yf&BAQ$%kr59M$ZcY??(x~R0|g|bac zAokdhU92Ty{8Avt>=gkpiL&g>VHEelW#HmkuOu4Yz>bN_IPShS>!2Esrm90*P3KV9;0

*lB|>4Rhzr|F!?Tu@u!B5-Fdm^A(cGJ# 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 diff --git a/navidrome/cache/images/db/60/db60bf5ca1bcd80704c3b358da175e24a9501cb4 b/navidrome/cache/images/db/60/db60bf5ca1bcd80704c3b358da175e24a9501cb4 deleted file mode 100644 index 0e7faa36ed990e682f3d98761562f3429374617c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16114 zcmbWe1yG#L@;CbIF0PBaySuvw3+~S1uEE_Mf@_fA2?PilT!RD)gb+w@4I#J(?&dxB zf6lqL>ie$r)=vGlyJx1Kp4p!6+1jVCPwN0wMNwH10D%Ai1b+cfn;3@5a&i`$+8T<= zY6|}dFrKM7y19d)0O0E8aq z+WNuq0vyx3__{j6@eLf~yV_cL0{{ZXU%rnm%mI$M;TXe9S6dE_#Q^{X!~Vap^?zX> zTYtEn03he?5#Z%$@8Cnt3}d0@5fKrlerD_EV(a6>p=kwkw(_!}mUDOYuyP9kfPX#n z-(CRjU*A&0oh-;BA}Gkg%L#Y?zv+J~{I}Ns9{gR~e`%a+{j+8u!m0o8{?qqAJoj<{ z5Wa-_CjCD=>wExcj{yMUZ~x)ZmjVEGGyt^C{MYjk{@pJQK0Y3zTwH#Bew>cBFwVaY z{WtwTD*RjXe+~X?KF+`M{o8lc^0szXzAir0f1L_*cX9XiqW1Q%g4t4Y{NFe6|L>0f zW!8V$!LDsz5H@L&5H4)9(- z0{9l30CWZ)fc%;Q5b)3eh-nF20{Zv5siEovf4_MKRD1v0_izlC|I_|o8gLr?BiP%~ zp879aPFt56=Iiz1FNS|7{x*mJ8h{Pp10(f zz-{0G@FaK1-o2eAsV6>$V{5pf6c3JD2`5Qzy%2?D2_b}xgvx|2glUA$gkK2nh$x6; zh-`@xh#H9IiLQysh^2{bi4%z%i5H3QNT^8^NSsMBNZLuhlOm9^l4_Cqk(Q8-kRFlY zlZlbR$P&q#$-a?;$yv#@$%Du%$fw9JDJUtFC_E_gDTXMHC@D0?XnsPL#H zsT`@YsQRc5sR^iMs9mV@sE4UfXvk@v(fHDo(M;3a(=yTO(MHlX(tf8yqZ6jHqsyWj zq&uOfqF1L6rmv^}#(>Ho%;3O~%P_`p&B(-Pz!=Ba&bZG+%%sc|$W+g?%8bb@#q7yk z&b+{a#3Ib%%u>uU%L--{V0B#Z!r!rXR$i5eQ_pnTk+T8TN1PqRuW|r>yp%xmXf8C>rymQR#N3s zo6>aBHquqndonCCPBL#~j%B%Jy<}TuujNGLLgf18A@WM{iSpA5xC(j-1qweDX%+1i z>lIIw1eAi5`kx^_Q+<~4Y)P3y8KzvTe4-+x5~4D!ilM5bTA;eA#;WF})};cChxC4xWyMPMyw`uB>jF?us6> zp0D1ZKDNH8ey#qsfxN*>gLOkL!w|zsBT^$rqYh(aV}0W)<4Y3-lWdb6QvuUh(=TRB zX8va5=A`B><~6-!#UsQ!#!n~kCFCbOCfX!UBylI@ zBt0a(vi~L(!XR#Wz@XHc^UX}D^oqQEsHuUG3z4RB6~cC zKj&30TCQ*IdY)QdM?QUidj3O!L&0L9Y++*&c~L^qb+JwHe2H{P!z+qcNw4lo9ZSEK zDV4RAGnVI6AXU7m*nO@4daP2ovbKt}DyiyEwOjRijdsm&tx#=k9eG_^J-FVt{@{)2 zo7uPWZ#x<|8p;|88Y!Pm0c+c>@s1>g@u?^G~(00=9(7xVb z)G^no(mB{A*46rf^FwtvO?P1rK~GvQT5ojkQ(s`;Wxq%N(SZHH)}Y1U%8=pE!m!rx z^oZ)n$5F-6p)r}UzK;?gyT?VxJ12xE+9w4k+olAjT0aSVYMmCGZkrLB>6jIn?V1yx z>z$XHANVZ)d2~T}VRG^L;@lU#FJG5Tm)5`9eBEDmSw8*t;@ka7_$uOR;&S%dQ^Q}eR6$zdRhVG07M7^0s;gP-XJ0(A|Yd-z|SaTY;<%~3><7+ zTpVm196UmDB0PLj0vsG-8e&ok3MwipJR(|pT1t9yN-D~~gMi>&k&%$GP*AWa@p14e z|3A~yAb^7cVh6E9K(qiD2L!5Cjkaw-N;|B?0{-{g>ch zEeI}0eEJ4pKtKQ(3W36NBCzLO9&5ESVdwH&_T_R5ZloqVMq>Xw^k)PIS_kE}T01cl1EnrZ%fsf;xZj34#ryKYf#BE(-TBpAh6K zoxPh7b0Ql3>$i|}H_;xx5&o|-1(Us&!R149KdVEoq$`XiVG>MYyJ>lQK#vfeRdB~B zCLa3{@Z*P~6-<_qn$|yU`MmwP))qHfIGxfb{$E|TDcH9gSxqe=s9!@Q)%Iub|Gd=N zc~vkU{nJbR)dVOdk;Ym@Rj4DRqO9j@iQP%`Gr23p4GR(LYTa91eDa$dzOh;TuD0dR zJvhY?wS9HKpPXitiDf{V5dve;RDZt2i~c1SG@+ zaksy0m09Sc>N?rKDSR+qWSgXt{g6iQIvkMLt2IE>x>Zdj!ts^^KYJ81@B?FN_&!eI z`&X(O?sHQaGBF;eaCSy)ittzbJtVzntsHg+%9L(*sv z5vubt2f_^=mH3-ZET;ihH^Itg592Fa)8-NZTv#@}IYxm>m3&+<%VbuKP89w#R8*Q& z-Obo()0t5dtc-blk)Y|G_ohx=rNqgWZmLvzYrGXFvD5_0uc|h&Q}UXLm01Q2DMD%v zOHcg0A{DPHspMmlw_XY-a*JV!pYm(E>H6_+_Gj25?kTRiSCvQJL?)F_7S(w0QezkA+X=6h~{+0UccIkl2AtT*l9u zvHdSGWKOzoZeN6c3Lv|6$iH8TTr(E9;b#$E4M`!oXf|kGE6aB_vmV)Z$aB5b5>M_; z5p~zBeb{~RSf+D8XMq{4EnK8ke#yoW#BoPba5oee@?1*2Hh$aYYS*mGNj2oLSL#;x zPIdiLux^ng^;C-5ZlBv))zq@+KopE;>%ySO^A%mY@b?dnY$19vy+C zyqyW3+$P;t?)Y|orj7li+^xLp6F@a+csJvn z$fpDEr1Eir{kE7dVQk6JBam-(J^7a6i?|7&(aRo;_+{gmmu*h~QVRACbYkh5i{ zNGm7FH|K1AOgwoye{^75i3+(QyTIdlaKleRF1RnvT=PzkdgQko)gLikW=DB0%W2w& zw%C`y>eE8gM4F_*4732j6?`A4zDWgM!j z{28B^`)OZne4GZxbAH=T>vfMU$3MOCrgy~CuB^tk^M!AoYcN3C_GZ17_`Rykw>$;LXM^fSAziMVs=`Jv0`5YoO z(dAn)r*~BMlTiVkp(}71S3X0O&z8}dp(d45{MJk`>@Fv3D~u@xNdsXAAkAEK(XtYYMmXq23@uA7Q-E-#$DAD zFwv=1@C39ocrg}Crh2h|EkD~G6w?ss(~}eUeDH``On6r(FfVH+Xf<+Fry~@apT@-K zdB6M1Zm0cEcboX?C-H|?qKO@%F_Y!|Efx(yyRr1~E*#t`*mujgfD%|6d*eEt%v`3b}R<<|** z2N>1(^&JUL`A@m~0~#7SGo9I$s+_Kd_dEq0$rXyRys^$Z6&F(Na0R8K+4S`ETmxmy z4^FB#nKZI-6`#DZ>qY$0iF>lSc6sH7gAA*w^UT{dz}hj`|N3iz61-+L03 zU)tn}Ct^D6dWn;VinYj5%{~Ehcg%48Tw}?DtyeL;bhAHl+8oN0n9HttSr}2HKE8I? z^Xe`#XLJ9T@>_fpj;zTZDxcGjA8ZsyovXB9#CIVow8|MYoPFuLUQ95T$4YK0%gX+|#d7T5xaH@gJ9GTZ{BbI|i_d0urJ7mxnC|V1 zQQlZBIjU!WmE6`&AEYR@8ySoH<}2uU`4~vf9Na%=pqR-&7>;U=8jgPWtL0q%5QaDA z7b;)eexc>^aq7Jn?|#?CFbzt=O;a+AcvRr?q52>1+tf8k!q$f#+#W$4j-074UfvFM z7k9EaC|`To;YvKocF|!B1#=JP%vD|07k!KPhEr2JI*N8H2e@>k2k31)@S*NtR2J|f zjRpsPn!(Sr|EdE(P#iD~H4iSg3@@$pKW7d>Puby9%G8^( zPU9rEC@gz(n~|5NXP zz&PAcTpAt-wX}>D?a4n*0RMG@7~A^wZ^;_}2XOTT*^Jllg?SnLAxMXva2dMfQ z^uMDO2^oyX|IqTRq>ihM;HJJ0zF<(WZfR2b+)~DFP#O3_5@n3kycOmdh44q?g90E37=i?^L*XgQ zKluv00)*f~X?XB>;g4oTP0JmTA?w+sscl_`K<5?N{D0;yNK)Xj+rT9Xo=4%G*g$6D zA)leXiiaNO;woGN#VrV`s6Vwsvyt=uPNRkKb=tc@mCVdQ7zDkziq{Lhjj(+#;{2zD zW=JgVFM{du?pW?suCP&xtYYq?QpcghY^ASO-tP_i7|+}U+tClP-wicq9^q#*DL`oc z3JcQ@Vy5R@S+^x~wjk(-K^XM=EmvqNo!>a4;=buphK&-5xH^X|_V6Tg)i%;Z7ZV1a zq3w|`{{C);j0tTFeFC=7i;qO#zI8oTKiKG5Sxe@8kyPJ_V7kTN%IfgJV;0G2&pnjL zw!}W&#JI}hqtD6euOrUTVtl7ZxpMk^23Mzh#FZ*uk6-=$iyDhdSPi0xL7x_}FJ9M* z0Hu!6#U7oH1IDX|q4=5f@HqkynYKt+pUb>hw}d%+2flO*(AF)AjQ9{2%rNoA{gFsp z|4YL)_3JH812O6@EZi@4zXuPuYPEGgD6C-JDC@t!?JP;EHBrg$OV@txKbe)i65U#G zsVV7^xl!Wug~}IX{_w*f*k*$%auUV8Q*)K?)OZnds=j!)2G0E%8_Z-2!Fpsy`;x#A zdRXZ!E{-9_Jk*y6ZY@`d-P1hO@0K*QuM+WZ)?D1FRj#r&*HgYj9Fvd@_!Fry5j6Uf zHso{h`>N445Etv0h1X92i(l4-Old^cZnS>+Ew!A=@{W*kQa}_rMv(%3nAr=@Ova|N#r$Z=k~hAyHt#<< z{q=E2q7!mpM*weFi|OB@6%Dsx{5cHf!=j;bI! zy{vH7KTePTrk_z0ZK{@8d$~22SsiV^M>HDXrPuw2=9_}tt9(3mnuT(%)Oe)Ml=nrA zzZ-p)MO~RTB&+5coU2);u41(ArCH7SM8&%9tOv0RSyC9piE&Lptzwr7-_=geen~Ks zn@w-6`&a(RF;6wce>E5M7`H}DRpvK}T=rer$b%$M;$6hPl7Q!&5@=caqBM}OJ;3yr zFy#a?B1|azQkeXUDdBWUkN$ikgehuSdnw;UrR!qdd;N+(Wa69NkAwbkI1JUFue#nZ zB$Z-w)Cr|*}&Y!3HRy$6f#mYBdm4{d=>{|SsZ}Jvx#FZR^2y~Mxj)4Q_r+m2^K6YvP?0^ zA*pjj?6&^03OIGB=T-hf6WTTLl2#S{iWZ0tM9jet!rB|e(%B^16|6Y++ToIM`7+wc zS?YVp=C*GvBTUajXARl4#cF_fjS+gUb6ZP|}(V4xY+AblU$W~1n z@mTU+wWu{1l3~^JVj^HQ;}1$W2bD8A;qW8iEh6IfZQHkdLwT06aERg$sIq!GFew=Z z#mN{O&du+6r(7v>x-5pUIrVe`LiF!V}`t* zJ7!L|oXbe*$Biy#kz-3SXCY#@a;1>wZeDRI>2XACS6lnqpn-La;3AZf5|IyuRz6wT z09vCrhly|@b-ZcKY3lRh6Kmw?=@l3$_#Lachd>*C{cGP{G=Coj^A5V+ z4*tv`N=jV8yma}RQC;-tNCO#63~Qmc8lR(_IGzCGq@l)C&SYYev%#7>s2ej@SBc$o zw2;2;<|uKdnwfW`be^1Us0Xm+h4GDRN^@Q{6zT?*byu`GZpVHCuYg{%#ra)hw%NVo5Rq0Z%Ij7452_8+7O`key+fE}#wLsYBTmCQYdmtB zslhL5#IUZw_j3$U#v9PfcPa^PVBcuI zKT}wJd0GWBqSR6rhcqS>Eh4J2IM<@%t*a;NO}rB|qjq?``Ybn*xQ#CXQ~jIU>9(qs zaEGM90hZu>nm+b>dJcyuQo-jHu@k@Y6*zFC6nB2WDC9db(iWO_u0@{!2O7Q-3e?CB z@)rr?F_oD$G}tu_{Mo7!y|jATE*$8m%mg^AO(4o^gjPAfM5|1t< z-`(C2@zU9I$f>0iysWZny(IBdD>iNALyd0Td?TIqBwj{xKws4nX(|pCwi4D3&kv(q zDH+a%TF13$m|bG8(z)U%{N_4K2@{>(#F|FgF*?;am4ij>U10?NMYhW5BO&cS`k>}~ zUAso+KuX#-NA`y^1ov`vPr$dRBwPliSoY9t`x{gZ&uM=RM!i3sype3RTYE0^e7EsE zvLonZ(=ryr+|Ho-H&U;Md3N7uJ(flimEA*5loH$4z>So4w^-~1y=6r%k$q)g1CjZz zDY=3p*Z_}%h0aQ_62gXQ-XF2)^*p+rTx;%0*2naG2i)HNN0`Sp`(m<`fP_oe+NQO( z8ODR^H&nuhCXh#u!%dcqae$Nn*7CO+%$o(RzP83ot@mo-E|0W8NVUsVGM0eXYuHE# zzZHe?@StAEPCx`0N44wGdl(|`(Ol-32WV|qg%MdeI*l_o{2u!zvH@;K!nP~5|H4X? zO{F5fsp+i3C{bRPN+-g@d?2#C39$!?9ImCjr2*$w&0S>BkT`YQm~qM6L^ko* zewCgfbvCPki}n+M93O^5xQmRKF07pFD=)=__|ZOsg`*gOIMsCsWmMd6H2%(02WhKQ zqp((=u7jLVg+ZlORsyQ`JN?{0y~=0~T#@fdo+dD~zghpAzfH_C0E*p_4Iw8|p+VIg zH8N&!_Y`Jg+mG>PAHc-9$=}J2#Uc^Tlh39Ed2;6w4$r!|xB+t=-`XgPgw7gJ)LZ5@ zNRP!sL<-)kAbz6NOg)heF5CPf*u=BuImxzQBs>8 z;*^W?E}U)tM(|M8Rg88aN3@osPzb33v_ZW3B*p zaKTFFNu$gYeaPNIhlc?@%O*Y)+a;f}y<339`;FRic;F$tb@V0SM()F-9|o5f^G4c5 zkRZ>+akoZADmq@k5TG*s;CSx==U*f_ODN%T?GOf9_)6C`2<~I35TUt&9Y)ehRncEJD&h!tNXx;n0uKE_Y z56Z^3J#k^)k&SWOpC@EdYcK}Yo3zR%?gENR`}@la>0aa~C7$(Z(7hg7j7}oH95b88 z+2$Iy{XE-qNh97_(-^t#!OMo0i^&>>Jo56T0a6~@AJ^^tnl=|!u~~)boa~tXnJcS{n^gAj+IUm9jYpYD*zlzuC@5-zy_<1V5%t_-7N}RS-)nrzuWQ>HJ zz7+^Rce9Bd;R?_+$E=eGZ1x<$hlR*7WmAi81sw)28Qr zC}Em$hFt5t>2e_)%XFCm0noi1vB^6x-vAs+3&K5!{jP}b8CQc_bjI6jhXfkctwY^vASuE+`^D5L9SHY8>cSPM1 zEenL#)%>`#Jzt7Rb62s{GMbh(yilVypYijF~`S-_(g}Xv5y5ng-p5iNJwzKkM zU6WP)Nv^49Z<l&EgbLmBO}hyKD|2CV)@$YIf6Io{&~Bp6c}ygvBGTS ztieELl`yTlpkv2+0;1)qd5b2Y%tg0RgT3?pi(@+K&u6~TA*ek8UlWjVY@kv+q&1419wqBmSy58aO67dS=@Uu$4Y(OD?WduPA2b}`B=v#Gl>(Fbav0l5hs@r6iz-S zKf6I@&8RRmpWSQFE1sNQ5ZM_NCyjx$be}gJZpkm6<|5HI$Oni7#n+>6qPw+I48(hR zWBepgVX(eU8(#DLu*n!phX^9nB0SY3kqKNK%h^+h+P;;?G#h*{?Tj&ouny5U*kWt+ zdh#%QVB!mp7BQn}E_^}N`771KV_hB%;BCr>W)pHeGB{svhNVbXHyF7@0Le{CeK%JY zK>xbWbNusH=TO@`tNP^h8p7mHO`31Yf)bn;yybH6DL0pd2x?`=Fl`a~!?9RtWY|(v z-w`3O_MJgS8OY_nA&P3cT8rCuT0Q}i84I2>&CM0a?WGC$itUj5WcCIuF#B{sB9<@~ zZO%%CSC;WnntQK`_b0zqdTEDUG-^XB_YB>TvW+>3O?0XU1)5uVP3H&^+#fXW!H0A` zGEO*bo>sIYx_bvm?q1!DSmh?f#i+KINZ20T&-LwC7qm2FTdk$-xTyE9my;^5SFP(h zCiW5ftTr6?#jYg7)@kp`9^Tv|@XOC?RpjUvOuCfxTL1FBPeVSmIEUb;`-q+1r(y~= z-XmZkmiWzFg6u2L&pGQ82No29^9nh?re~q-P8-r%#-8I5r80OU`QeGn_~6!(IP0u) zyCFUS8Qr`ehrhiKGF0rH!I}Fr0<1e6Q+zyH@W48(ynM$v zb|fKx6H8u&aZ^W1B)OgUnzxrpdWywy&4MLx@MtaS<58gS0V;6ARWlGYUU0IXqokT0 zv3m99`OFg#dJob}6^r_c=T3=|TjO-Ic5ihOrt=U|-u-Z@h5-pdo(b8cA*(&ukI(jF zmR*)+-6j@BzP?GRoqv4cf@JcdNC8W#)>~6J&7^pkZ4!!M`%UO60wyYV;{BjKB{UdZr(|H za}mvW9rj6KA^V;ZcfZ|sJ&fwTYGQ{G>$F4e&s$$Iw#yW4RniW<0rTcJr1^S9m3GLv z9wtUDI_$cGzvFwUk1Km77-Cc}e_xJLCxH@NBxin|ncetmj-91y>`BhHz zl8AlSX#xZ9E%dx2MV}V->cJ0v>dmmhDDB3TH8q*0+T@m+ITykQ&ptXbB#4ssV%vJ| z8dJ^0Qeny|!(cS3cf{&pcgebtUMrfpkr~$4UxKW(b;fwOakUNTr2SwX)ieP%X1W<0w3T1wiL zk&CCyF(NoYoGHR zp+6j(e>7=9NviiBCwiR@x%qc;i7g9ThXprjoit-#5$|**38xGtq+fF-*xB#01opj# zWt(0NGrMlRUf@kYbAq)&+RR?rOnUuVFVe$i=04eqw~#?nTya(ok!Il35Q6X0l-}VM^1Hd<(Pith#Lq{qI$B1brm8dT zGd%S?tGPe<{Z7c>9WCDptuSla<32V>_q3JQCHS9}B zVLSut4zv!{3?qKH?`l8BRDH6;RQ?M2Mnortwb9m!*E(+&(ULmqb_A4Zx8x4e zR##GEaTUeExfQcLEK^sNh@)9|DE#j3u*WUg^^UU;eY+%AlxsuT^y*i+35 z3m2&qW_C?M(S&cn{R=O?o?IbGzys-6v-ZWVSpx(2ctBCZPD3VCtx}Ef(e{Sh)W_P3 zYPWI^V5XCwj;cZH8XA-~E0S@$0a?4R|+_1cxw__FYSKJ&1cqh`7#Q zcF2KDi~U`qw_yx-K@#qgD35>AHX?g%EM^lj=~=&6$4(9S))FGa#dE>Py^-O~`|S%# zC)Z8FcwUlY{64O}XV1iFJNM3v9^0rJwhGaot7$vF~hZOfj4 zB6(NAhz2|pD#8-1x`=0%nCfM1F%x8bWQCrijM8dR#H;qNvpB5Vu#P%3+o%sK!5QE- z(ii&rpAl73RCD-EDBX;XFffOwaa}Kd6%YK1^j9Ub?Vo%9P4OV3d&{jY9R=7R0-uykDpY1`e>Gi>Ow0ARFNSKYcmm{I+2`K(p#Tchu`@;FP zZgTTrHr56bj|hnqrhHERA>!NUPQ_B%$?Q2QPTKJI6A`6WDMXlEQv$)VG^>sHpMeBUB(3}fTB3l{mxnCh?fvYYJ$PEFM`KX()|izEx; zTmJqcz(B~{*i1kVa9+IAAZ5|R9T_YoSC&o+SIk-76@BALu zl}!#HETR4~{0=ReNQb)f!>;iuuW#P>_0%;Yq0GmAL=f9zl8agOr~bn_hn_MFH+?)y z0fIM~SZvhtlZ?U)gWAa>L#JBkP8St7Zp{5E`@ET9Iq_F)Vip-@ z0&b&56l#K=%oTtcT$95>y7pLkowneB)R~Q~BbEo$b9P{1!DI>|)0s(AYKN;Xg)s!8 zsy(5LzE421t^w|`a27VLUR|86v=vXV`V!9`pJ9@gOq-dE5_fU%fY&SKiA}KY#ALa~ zK57OsN5SQlfOYt+>d~Ea_Qd|NNdY6u(y=aEL)Fm)hv}!zRU<7sQ&XrJZ}?kw;keN_~z5LEa8k(;VQB7=L}O*4+Bu|1)usUn(>;!dOeB< z)h|uF>BP{8>~j&uWXqyer;g4*m)tJpLhVA4$h1s^d)%4$XWXH-QG}rtc7DEk%Jj|L@LXfJ%f*1Hw84}R>9>X2nmx?LeE+yiPn2+5 z11(&m9Rqn@@#-mbPRmYy-=E|kTRJK&D6xAzsyfsJR^yu*W=PY8mVz5)Ln^0 zR8u*b&_mHH@RiK4@+PF4zSoJ@-TO^x< zr3}N*-V9tMQEEK0Xb(ZZ34D6!XT`^&O}W-0Ty-e1y%5M#*LN~joh0JnpvE(fonPmy u;9Kn)NXV|*ptRjM(zTYDa$=_(T@fgJkje3;VfzWr!Km^@bba--{C@yw+Ri2b diff --git a/navidrome/cache/images/e7/28/e7288cdadb7fe821f89e96399cc180e222525161 b/navidrome/cache/images/e7/28/e7288cdadb7fe821f89e96399cc180e222525161 deleted file mode 100644 index 2f538e19ccddbb89e4029bc80be08b42117329f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26153 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 YNrk{brJZ1nYHjU?ksA-3MAqm3*{MOEM*si- diff --git a/navidrome/cache/images/f1/80/f180b48373bcafa1deff21859159692d83025431 b/navidrome/cache/images/f1/80/f180b48373bcafa1deff21859159692d83025431 deleted file mode 100644 index f1d778fbf3febed946b47e4cdd53e227e1e3fd2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185796 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%0D78&IAix5Xsq;6x)I$LlkK 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 diff --git a/navidrome/cache/images/fd/26/fd26b9a68e5b68c1c302bc6622c560dedd6a27c4 b/navidrome/cache/images/fd/26/fd26b9a68e5b68c1c302bc6622c560dedd6a27c4 deleted file mode 100644 index 049d9e784fd3164ee20a6025ca05ff75a788c4f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11512 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

K~N?=*4>ap^4dN4c4* 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

u8WKvV;Qrf>m8RqCd0r!hoZE)KI3IPE}1 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%0DloTzEDuACLoL`~=DK?D;uou&s7OVp%^ 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 z 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 Bd7hf1xL(ejkTbfog;M=B|yP~d^`+;HuI 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

0;@d|3VmE=1si??nA3s)LG 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
e|JRnH%C-|bwu?SM^t}yMD@HQ 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%0Db+Mj-m=9M-aR2exh)*-#!2 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%0AL3jQ-B~@lAMb8;#SIa*d?`Jl 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

bm4^Tx=5$fe<&C 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

R4fC^*cu(^Uy&m(~?0f$?((tPKty+g2xbIkP;o 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∨{GE}%G4fYN{=&$g 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%0A{Q+*^_9qW3QQyn>B*Kt}Pq>->Ib3K(% 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

&IT|tW(AJQ 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 ap-zjZRbPieSNPb8Aua^7AI%>br;SmJl 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 z%0D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 z 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

&+@$LdeL!;^=0!V>y$L^mm!o$p~xVD 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

xS=Kq)MPwQ*})15X2A10dI_u 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≀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%0D=MNb))@E+4OqBOTc^OTG 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¡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

  • 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
      maAazspoMC49| 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
      `oMxqGTcjgfUMAExnjL4XM>2A`I^s*hgl`SH% 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 diff --git a/nginx/conf/default.conf b/nginx/conf/default.conf new file mode 100644 index 0000000..282633d --- /dev/null +++ b/nginx/conf/default.conf @@ -0,0 +1,20 @@ +server { + listen 80; + index index.php index.html; + server_name _; + root /var/www/html/public; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass php:9000; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } +} diff --git a/nginx/dockerfiles/nginx.dockerfile b/nginx/dockerfiles/nginx.dockerfile new file mode 100644 index 0000000..977e2f0 --- /dev/null +++ b/nginx/dockerfiles/nginx.dockerfile @@ -0,0 +1,18 @@ +FROM nginx:stable-alpine + +ARG UID +ARG GID + +ENV UID=${UID} +ENV GID=${GID} + +# MacOS staff group's gid is 20, so is the dialout group in alpine linux. We're not using it, let's just remove it. +RUN delgroup dialout + +RUN addgroup -g ${GID} --system laravel +RUN adduser -G laravel --system -D -s /bin/sh -u ${UID} laravel +RUN sed -i "s/user nginx/user laravel/g" /etc/nginx/nginx.conf + +ADD ./nginx/default.conf /etc/nginx/conf.d/ + +RUN mkdir -p /var/www/html \ No newline at end of file diff --git a/php/dockerfiles/php.dockerfile b/php/dockerfiles/php.dockerfile new file mode 100644 index 0000000..2b7d29d --- /dev/null +++ b/php/dockerfiles/php.dockerfile @@ -0,0 +1,34 @@ +FROM php:8-fpm-alpine + +ARG UID +ARG GID + +ENV UID=${UID} +ENV GID=${GID} + +RUN mkdir -p /var/www/html + +WORKDIR /var/www/html + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +# MacOS staff group's gid is 20, so is the dialout group in alpine linux. We're not using it, let's just remove it. +RUN delgroup dialout + +RUN addgroup -g ${GID} --system laravel +RUN adduser -G laravel --system -D -s /bin/sh -u ${UID} laravel + +RUN sed -i "s/user = www-data/user = laravel/g" /usr/local/etc/php-fpm.d/www.conf +RUN sed -i "s/group = www-data/group = laravel/g" /usr/local/etc/php-fpm.d/www.conf +RUN echo "php_admin_flag[log_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf + +RUN docker-php-ext-install pdo pdo_mysql + +RUN mkdir -p /usr/src/php/ext/redis \ + && curl -L https://github.com/phpredis/phpredis/archive/5.3.4.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \ + && echo 'redis' >> /usr/src/php-available-exts \ + && docker-php-ext-install redis + +USER laravel + +CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"] diff --git a/php/dockerfiles/php.root.dockerfile b/php/dockerfiles/php.root.dockerfile new file mode 100644 index 0000000..51205ee --- /dev/null +++ b/php/dockerfiles/php.root.dockerfile @@ -0,0 +1,22 @@ +FROM php:8-fpm-alpine + +RUN mkdir -p /var/www/html + +WORKDIR /var/www/html + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +RUN sed -i "s/user = www-data/user = root/g" /usr/local/etc/php-fpm.d/www.conf +RUN sed -i "s/group = www-data/group = root/g" /usr/local/etc/php-fpm.d/www.conf +RUN echo "php_admin_flag[log_errors] = on" >> /usr/local/etc/php-fpm.d/www.conf + +RUN docker-php-ext-install pdo pdo_mysql + +RUN mkdir -p /usr/src/php/ext/redis \ + && curl -L https://github.com/phpredis/phpredis/archive/5.3.4.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \ + && echo 'redis' >> /usr/src/php-available-exts \ + && docker-php-ext-install redis + +USER root + +CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"] diff --git a/python/.gitignore b/python/.gitignore new file mode 100644 index 0000000..2398ab2 --- /dev/null +++ b/python/.gitignore @@ -0,0 +1,10 @@ + +navidrome/ +music/ +.idea/ + +utils/__pycache__/ + +*.pyc + +geckodriver.log diff --git a/__init__.py b/python/__init__.py similarity index 100% rename from __init__.py rename to python/__init__.py diff --git a/app.py b/python/app.py similarity index 95% rename from app.py rename to python/app.py index db37368..e3f88cb 100644 --- a/app.py +++ b/python/app.py @@ -24,9 +24,6 @@ def process_downloads(): print(album) Album.write(album['id'], {'downloading': True}) download_album(album) - else: - # Sometimes the records are not being removed - Album.purge() cron = BackgroundScheduler({'apscheduler.job_defaults.max_instances': 2}, daemon=True) diff --git a/python/bin/Activate.ps1 b/python/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/python/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/python/bin/activate b/python/bin/activate new file mode 100644 index 0000000..59b4813 --- /dev/null +++ b/python/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/home/spaulding/Apps/getDiscography" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(getDiscography) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(getDiscography) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/python/bin/activate.csh b/python/bin/activate.csh new file mode 100644 index 0000000..81cccce --- /dev/null +++ b/python/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/spaulding/Apps/getDiscography" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(getDiscography) $prompt" + setenv VIRTUAL_ENV_PROMPT "(getDiscography) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/python/bin/activate.fish b/python/bin/activate.fish new file mode 100644 index 0000000..0be19fa --- /dev/null +++ b/python/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/spaulding/Apps/getDiscography" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(getDiscography) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(getDiscography) " +end diff --git a/python/bin/flask b/python/bin/flask new file mode 100755 index 0000000..f18332d --- /dev/null +++ b/python/bin/flask @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/mid3cp b/python/bin/mid3cp new file mode 100755 index 0000000..6520e0d --- /dev/null +++ b/python/bin/mid3cp @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3cp import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/mid3iconv b/python/bin/mid3iconv new file mode 100755 index 0000000..af9cc54 --- /dev/null +++ b/python/bin/mid3iconv @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3iconv import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/mid3v2 b/python/bin/mid3v2 new file mode 100755 index 0000000..1904b29 --- /dev/null +++ b/python/bin/mid3v2 @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3v2 import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/moggsplit b/python/bin/moggsplit new file mode 100755 index 0000000..40ba8e6 --- /dev/null +++ b/python/bin/moggsplit @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.moggsplit import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/mutagen-inspect b/python/bin/mutagen-inspect new file mode 100755 index 0000000..f15cf89 --- /dev/null +++ b/python/bin/mutagen-inspect @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mutagen_inspect import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/mutagen-pony b/python/bin/mutagen-pony new file mode 100755 index 0000000..68fe50e --- /dev/null +++ b/python/bin/mutagen-pony @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mutagen_pony import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/python/bin/normalizer b/python/bin/normalizer new file mode 100755 index 0000000..f28fe40 --- /dev/null +++ b/python/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli.normalizer import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/python/bin/pip b/python/bin/pip new file mode 100755 index 0000000..624c2c2 --- /dev/null +++ b/python/bin/pip @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/pip3 b/python/bin/pip3 new file mode 100755 index 0000000..624c2c2 --- /dev/null +++ b/python/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/pip3.10 b/python/bin/pip3.10 new file mode 100755 index 0000000..624c2c2 --- /dev/null +++ b/python/bin/pip3.10 @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/pysondb b/python/bin/pysondb new file mode 100755 index 0000000..ae8fdfd --- /dev/null +++ b/python/bin/pysondb @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pysondb.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/python b/python/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/python/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/python/bin/python3 b/python/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/python/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/python/bin/python3.10 b/python/bin/python3.10 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/python/bin/python3.10 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/python/bin/tldextract b/python/bin/tldextract new file mode 100755 index 0000000..8f35f2d --- /dev/null +++ b/python/bin/tldextract @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from tldextract.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/python/bin/yt-dlp b/python/bin/yt-dlp new file mode 100755 index 0000000..80b0c9f --- /dev/null +++ b/python/bin/yt-dlp @@ -0,0 +1,8 @@ +#!/home/spaulding/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from yt_dlp import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/const.py b/python/const.py similarity index 100% rename from const.py rename to python/const.py diff --git a/database.py b/python/database.py similarity index 100% rename from database.py rename to python/database.py diff --git a/python/database/album.json b/python/database/album.json new file mode 100644 index 0000000..65fae68 --- /dev/null +++ b/python/database/album.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "keys": [ + "album", + "artist", + "cover", + "downloaded", + "downloading", + "link" + ], + "data": {} +} \ No newline at end of file diff --git a/Dockerfile b/python/dockerfiles/Dockerfile similarity index 78% rename from Dockerfile rename to python/dockerfiles/Dockerfile index 5edf5fb..aab2881 100644 --- a/Dockerfile +++ b/python/dockerfiles/Dockerfile @@ -18,15 +18,15 @@ RUN export PATH=$PATH:/usr/local/bin/geckodriver RUN pip3 install -r requirements.txt ENV FLASK_APP=app -## Set user and group -#ARG user=app -#ARG group=app -#ARG uid=1000 -#ARG gid=1000 -#RUN groupadd -g ${gid} ${group} -#RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} -# -## Switch to user -#USER ${uid}:${gid} +# Set user and group +ARG user=app +ARG group=app +ARG uid=1000 +ARG gid=1000 +RUN groupadd -g ${gid} ${group} +RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} + +# Switch to user +USER ${uid}:${gid} CMD ["python3","-u","app.py"] diff --git a/drivers/geckodriver-0.33.0/.cargo/config b/python/drivers/geckodriver-0.33.0/.cargo/config similarity index 100% rename from drivers/geckodriver-0.33.0/.cargo/config rename to python/drivers/geckodriver-0.33.0/.cargo/config diff --git a/drivers/geckodriver-0.33.0/CHANGES.md b/python/drivers/geckodriver-0.33.0/CHANGES.md similarity index 100% rename from drivers/geckodriver-0.33.0/CHANGES.md rename to python/drivers/geckodriver-0.33.0/CHANGES.md diff --git a/drivers/geckodriver-0.33.0/CONTRIBUTING.md b/python/drivers/geckodriver-0.33.0/CONTRIBUTING.md similarity index 100% rename from drivers/geckodriver-0.33.0/CONTRIBUTING.md rename to python/drivers/geckodriver-0.33.0/CONTRIBUTING.md diff --git a/drivers/geckodriver-0.33.0/Cargo.lock b/python/drivers/geckodriver-0.33.0/Cargo.lock similarity index 100% rename from drivers/geckodriver-0.33.0/Cargo.lock rename to python/drivers/geckodriver-0.33.0/Cargo.lock diff --git a/drivers/geckodriver-0.33.0/Cargo.toml b/python/drivers/geckodriver-0.33.0/Cargo.toml similarity index 100% rename from drivers/geckodriver-0.33.0/Cargo.toml rename to python/drivers/geckodriver-0.33.0/Cargo.toml diff --git a/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md b/python/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md similarity index 100% rename from drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md rename to python/drivers/geckodriver-0.33.0/ISSUE_TEMPLATE.md diff --git a/drivers/geckodriver-0.33.0/LICENSE b/python/drivers/geckodriver-0.33.0/LICENSE similarity index 100% rename from drivers/geckodriver-0.33.0/LICENSE rename to python/drivers/geckodriver-0.33.0/LICENSE diff --git a/drivers/geckodriver-0.33.0/README.md b/python/drivers/geckodriver-0.33.0/README.md similarity index 100% rename from drivers/geckodriver-0.33.0/README.md rename to python/drivers/geckodriver-0.33.0/README.md diff --git a/drivers/geckodriver-0.33.0/build.rs b/python/drivers/geckodriver-0.33.0/build.rs similarity index 100% rename from drivers/geckodriver-0.33.0/build.rs rename to python/drivers/geckodriver-0.33.0/build.rs diff --git a/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz similarity index 100% rename from drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz rename to python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux32.tar.gz diff --git a/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz similarity index 100% rename from drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz rename to python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-linux64.tar.gz diff --git a/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz similarity index 100% rename from drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz rename to python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-macos.tar.gz diff --git a/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip b/python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip similarity index 100% rename from drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip rename to python/drivers/geckodriver-0.33.0/dist/geckodriver-v0.33.0-win32.zip diff --git a/drivers/geckodriver-0.33.0/dist/geckodriver.exe b/python/drivers/geckodriver-0.33.0/dist/geckodriver.exe similarity index 100% rename from drivers/geckodriver-0.33.0/dist/geckodriver.exe rename to python/drivers/geckodriver-0.33.0/dist/geckodriver.exe diff --git a/drivers/geckodriver-0.33.0/doc/ARM.md b/python/drivers/geckodriver-0.33.0/doc/ARM.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/ARM.md rename to python/drivers/geckodriver-0.33.0/doc/ARM.md diff --git a/drivers/geckodriver-0.33.0/doc/Bugs.md b/python/drivers/geckodriver-0.33.0/doc/Bugs.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Bugs.md rename to python/drivers/geckodriver-0.33.0/doc/Bugs.md diff --git a/drivers/geckodriver-0.33.0/doc/Building.md b/python/drivers/geckodriver-0.33.0/doc/Building.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Building.md rename to python/drivers/geckodriver-0.33.0/doc/Building.md diff --git a/drivers/geckodriver-0.33.0/doc/Capabilities.md b/python/drivers/geckodriver-0.33.0/doc/Capabilities.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Capabilities.md rename to python/drivers/geckodriver-0.33.0/doc/Capabilities.md diff --git a/drivers/geckodriver-0.33.0/doc/CrashReports.md b/python/drivers/geckodriver-0.33.0/doc/CrashReports.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/CrashReports.md rename to python/drivers/geckodriver-0.33.0/doc/CrashReports.md diff --git a/drivers/geckodriver-0.33.0/doc/Flags.md b/python/drivers/geckodriver-0.33.0/doc/Flags.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Flags.md rename to python/drivers/geckodriver-0.33.0/doc/Flags.md diff --git a/drivers/geckodriver-0.33.0/doc/Notarization.md b/python/drivers/geckodriver-0.33.0/doc/Notarization.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Notarization.md rename to python/drivers/geckodriver-0.33.0/doc/Notarization.md diff --git a/drivers/geckodriver-0.33.0/doc/Patches.md b/python/drivers/geckodriver-0.33.0/doc/Patches.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Patches.md rename to python/drivers/geckodriver-0.33.0/doc/Patches.md diff --git a/drivers/geckodriver-0.33.0/doc/Profiles.md b/python/drivers/geckodriver-0.33.0/doc/Profiles.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Profiles.md rename to python/drivers/geckodriver-0.33.0/doc/Profiles.md diff --git a/drivers/geckodriver-0.33.0/doc/Releasing.md b/python/drivers/geckodriver-0.33.0/doc/Releasing.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Releasing.md rename to python/drivers/geckodriver-0.33.0/doc/Releasing.md diff --git a/drivers/geckodriver-0.33.0/doc/Support.md b/python/drivers/geckodriver-0.33.0/doc/Support.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Support.md rename to python/drivers/geckodriver-0.33.0/doc/Support.md diff --git a/drivers/geckodriver-0.33.0/doc/Testing.md b/python/drivers/geckodriver-0.33.0/doc/Testing.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Testing.md rename to python/drivers/geckodriver-0.33.0/doc/Testing.md diff --git a/drivers/geckodriver-0.33.0/doc/TraceLogs.md b/python/drivers/geckodriver-0.33.0/doc/TraceLogs.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/TraceLogs.md rename to python/drivers/geckodriver-0.33.0/doc/TraceLogs.md diff --git a/drivers/geckodriver-0.33.0/doc/Usage.md b/python/drivers/geckodriver-0.33.0/doc/Usage.md similarity index 100% rename from drivers/geckodriver-0.33.0/doc/Usage.md rename to python/drivers/geckodriver-0.33.0/doc/Usage.md diff --git a/drivers/geckodriver-0.33.0/doc/index.rst b/python/drivers/geckodriver-0.33.0/doc/index.rst similarity index 100% rename from drivers/geckodriver-0.33.0/doc/index.rst rename to python/drivers/geckodriver-0.33.0/doc/index.rst diff --git a/drivers/geckodriver-0.33.0/marionette/Cargo.toml b/python/drivers/geckodriver-0.33.0/marionette/Cargo.toml similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/Cargo.toml rename to python/drivers/geckodriver-0.33.0/marionette/Cargo.toml diff --git a/drivers/geckodriver-0.33.0/marionette/src/common.rs b/python/drivers/geckodriver-0.33.0/marionette/src/common.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/common.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/common.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/error.rs b/python/drivers/geckodriver-0.33.0/marionette/src/error.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/error.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/error.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/lib.rs b/python/drivers/geckodriver-0.33.0/marionette/src/lib.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/lib.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/lib.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/marionette.rs b/python/drivers/geckodriver-0.33.0/marionette/src/marionette.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/marionette.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/marionette.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/message.rs b/python/drivers/geckodriver-0.33.0/marionette/src/message.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/message.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/message.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/result.rs b/python/drivers/geckodriver-0.33.0/marionette/src/result.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/result.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/result.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/test.rs b/python/drivers/geckodriver-0.33.0/marionette/src/test.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/test.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/test.rs diff --git a/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs b/python/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs similarity index 100% rename from drivers/geckodriver-0.33.0/marionette/src/webdriver.rs rename to python/drivers/geckodriver-0.33.0/marionette/src/webdriver.rs diff --git a/drivers/geckodriver-0.33.0/src/android.rs b/python/drivers/geckodriver-0.33.0/src/android.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/android.rs rename to python/drivers/geckodriver-0.33.0/src/android.rs diff --git a/drivers/geckodriver-0.33.0/src/browser.rs b/python/drivers/geckodriver-0.33.0/src/browser.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/browser.rs rename to python/drivers/geckodriver-0.33.0/src/browser.rs diff --git a/drivers/geckodriver-0.33.0/src/build.rs b/python/drivers/geckodriver-0.33.0/src/build.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/build.rs rename to python/drivers/geckodriver-0.33.0/src/build.rs diff --git a/drivers/geckodriver-0.33.0/src/capabilities.rs b/python/drivers/geckodriver-0.33.0/src/capabilities.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/capabilities.rs rename to python/drivers/geckodriver-0.33.0/src/capabilities.rs diff --git a/drivers/geckodriver-0.33.0/src/command.rs b/python/drivers/geckodriver-0.33.0/src/command.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/command.rs rename to python/drivers/geckodriver-0.33.0/src/command.rs diff --git a/drivers/geckodriver-0.33.0/src/logging.rs b/python/drivers/geckodriver-0.33.0/src/logging.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/logging.rs rename to python/drivers/geckodriver-0.33.0/src/logging.rs diff --git a/drivers/geckodriver-0.33.0/src/main.rs b/python/drivers/geckodriver-0.33.0/src/main.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/main.rs rename to python/drivers/geckodriver-0.33.0/src/main.rs diff --git a/drivers/geckodriver-0.33.0/src/marionette.rs b/python/drivers/geckodriver-0.33.0/src/marionette.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/marionette.rs rename to python/drivers/geckodriver-0.33.0/src/marionette.rs diff --git a/drivers/geckodriver-0.33.0/src/prefs.rs b/python/drivers/geckodriver-0.33.0/src/prefs.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/prefs.rs rename to python/drivers/geckodriver-0.33.0/src/prefs.rs diff --git a/drivers/geckodriver-0.33.0/src/test.rs b/python/drivers/geckodriver-0.33.0/src/test.rs similarity index 100% rename from drivers/geckodriver-0.33.0/src/test.rs rename to python/drivers/geckodriver-0.33.0/src/test.rs diff --git a/drivers/geckodriver-0.33.0/src/tests/profile.zip b/python/drivers/geckodriver-0.33.0/src/tests/profile.zip similarity index 100% rename from drivers/geckodriver-0.33.0/src/tests/profile.zip rename to python/drivers/geckodriver-0.33.0/src/tests/profile.zip diff --git a/geckodriver-install.sh b/python/geckodriver-install.sh similarity index 100% rename from geckodriver-install.sh rename to python/geckodriver-install.sh diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/RECORD b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/RECORD new file mode 100644 index 0000000..7b56928 --- /dev/null +++ b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/RECORD @@ -0,0 +1,84 @@ +APScheduler-3.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +APScheduler-3.10.1.dist-info/LICENSE.txt,sha256=YWP3mH37ONa8MgzitwsvArhivEESZRbVUu8c1DJH51g,1130 +APScheduler-3.10.1.dist-info/METADATA,sha256=nShBYOJMsJ9iwrKP_x4rAVN87_NmBOwpdPPn85sY9G4,5676 +APScheduler-3.10.1.dist-info/RECORD,, +APScheduler-3.10.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +APScheduler-3.10.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +APScheduler-3.10.1.dist-info/entry_points.txt,sha256=KMxTUp2QykDNL6w-WBU5xrk8ebroCPEBN0eZtyL3x2w,1147 +APScheduler-3.10.1.dist-info/top_level.txt,sha256=O3oMCWxG-AHkecUoO6Ze7-yYjWrttL95uHO8-RFdYvE,12 +apscheduler/__init__.py,sha256=qFEK2ysRBcLiYmm3deyJJ1avUOugaM_nCGHMD42WMBw,380 +apscheduler/__pycache__/__init__.cpython-310.pyc,, +apscheduler/__pycache__/events.cpython-310.pyc,, +apscheduler/__pycache__/job.cpython-310.pyc,, +apscheduler/__pycache__/util.cpython-310.pyc,, +apscheduler/events.py,sha256=KRMTDQUS6d2uVnrQvPoz3ZPV5V9XKsCAZLsgx913FFo,3593 +apscheduler/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/executors/__pycache__/__init__.cpython-310.pyc,, +apscheduler/executors/__pycache__/asyncio.cpython-310.pyc,, +apscheduler/executors/__pycache__/base.cpython-310.pyc,, +apscheduler/executors/__pycache__/base_py3.cpython-310.pyc,, +apscheduler/executors/__pycache__/debug.cpython-310.pyc,, +apscheduler/executors/__pycache__/gevent.cpython-310.pyc,, +apscheduler/executors/__pycache__/pool.cpython-310.pyc,, +apscheduler/executors/__pycache__/tornado.cpython-310.pyc,, +apscheduler/executors/__pycache__/twisted.cpython-310.pyc,, +apscheduler/executors/asyncio.py,sha256=9m4wvRHSSYplllxAQyxWkPVcFdyFG5aZbHt5nfWKIAc,1859 +apscheduler/executors/base.py,sha256=hogiMc_t-huw6BMod0HEeY2FhRNmAAUyNNuBHvIX31M,5336 +apscheduler/executors/base_py3.py,sha256=8WOpTeX1NA-spdbEQ1oJMh5T2O_t2UdsaSnAh-iEWe0,1831 +apscheduler/executors/debug.py,sha256=15_ogSBzl8RRCfBYDnkIV2uMH8cLk1KImYmBa_NVGpc,573 +apscheduler/executors/gevent.py,sha256=aulrNmoefyBgrOkH9awRhFiXIDnSCnZ4U0o0_JXIXgc,777 +apscheduler/executors/pool.py,sha256=h4cYgKMRhjpNHmkhlogHLbmT4O_q6HePXVLmiJIHC3c,2484 +apscheduler/executors/tornado.py,sha256=DU75VaQ9R6nBuy8lbPUvDKUgsuJcZqwAvURC5vg3r6w,1780 +apscheduler/executors/twisted.py,sha256=bRoU0C4BoVcS6_BjKD5wfUs0IJpGkmLsRAcMH2rJJss,778 +apscheduler/job.py,sha256=JCRERBpfWLuomPiNNHX-jrluEwfHkdscEmz4i0Y8rao,11216 +apscheduler/jobstores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/jobstores/__pycache__/__init__.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/base.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/memory.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/mongodb.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/redis.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/rethinkdb.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/sqlalchemy.cpython-310.pyc,, +apscheduler/jobstores/__pycache__/zookeeper.cpython-310.pyc,, +apscheduler/jobstores/base.py,sha256=DXzSW9XscueHZHMvy1qFiG-vYqUl_MMv0n0uBSZWXGo,4523 +apscheduler/jobstores/memory.py,sha256=ZxWiKsqfsCHFvac-6X9BztuhnuSxlOYi1dhT6g-pjQo,3655 +apscheduler/jobstores/mongodb.py,sha256=r9t2neNuzfPuf_omDm0KdkLGPZXLksiH-U3j13MIBlM,5347 +apscheduler/jobstores/redis.py,sha256=kjQDIzPXz-Yq976U9HK3aMkcCI_QRLKgTADQWKewtik,5483 +apscheduler/jobstores/rethinkdb.py,sha256=k1rSLYJqejuhQxJY3pXwHAQYcpZ1QFJsoQ8n0oEu5MM,5863 +apscheduler/jobstores/sqlalchemy.py,sha256=LIA9iSGMvuPTVqGHdztgQs4YFmYN1xqXvpJauYNK470,6529 +apscheduler/jobstores/zookeeper.py,sha256=avGLXaJGjHD0F7uG6rLJ2gg_TXNqXDEM4PqOu56f-Xg,6363 +apscheduler/schedulers/__init__.py,sha256=jM63xA_K7GSToBenhsz-SCcqfhk1pdEVb6ajwoO5Kqg,406 +apscheduler/schedulers/__pycache__/__init__.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/asyncio.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/background.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/base.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/blocking.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/gevent.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/qt.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/tornado.cpython-310.pyc,, +apscheduler/schedulers/__pycache__/twisted.cpython-310.pyc,, +apscheduler/schedulers/asyncio.py,sha256=iJO6QUo1oW16giOU_nW8WMu2b9NTWT4Tg2gY586G08w,1994 +apscheduler/schedulers/background.py,sha256=751p-f5Di6pY4x6UXlZggpxQ5k2ObJ_Q5wSeWmKHS8o,1566 +apscheduler/schedulers/base.py,sha256=M8WWEKjG-VfyL_UF1Wgbjk01yxa45t_GXfKyvtY0RMs,43228 +apscheduler/schedulers/blocking.py,sha256=8nubfJ4PoUnAkEY6WRQG4COzG4SxGyW9PjuVPhDAbsk,985 +apscheduler/schedulers/gevent.py,sha256=csPBvV75FGcboXXsdex6fCD7J54QgBddYNdWj62ZO9g,1031 +apscheduler/schedulers/qt.py,sha256=aooX3slyDwLglojae5t2tz6NlqfceZYCeXAIS0LQVCk,1613 +apscheduler/schedulers/tornado.py,sha256=D9Vaq3Ee9EFiXa1jDy9tedI048gR_YT_LAFUWqO_uEw,1926 +apscheduler/schedulers/twisted.py,sha256=D5EBjjMRtMBxy0_aAURcULAI8Ky2IvCTr9tK9sO1rYk,1844 +apscheduler/triggers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/triggers/__pycache__/__init__.cpython-310.pyc,, +apscheduler/triggers/__pycache__/base.cpython-310.pyc,, +apscheduler/triggers/__pycache__/combining.cpython-310.pyc,, +apscheduler/triggers/__pycache__/date.cpython-310.pyc,, +apscheduler/triggers/__pycache__/interval.cpython-310.pyc,, +apscheduler/triggers/base.py,sha256=BvBJdOnIeVClXPXeInzYK25cN64jAc4a9IiEQucSiVk,1355 +apscheduler/triggers/combining.py,sha256=klaSoBp1kyrPX5D3gBpNTlsGKjks5QeKPW5JN_MVs30,3449 +apscheduler/triggers/cron/__init__.py,sha256=D39BQ63qWyk6XZcSuWth46ELQ3VIFpYjUHh7Kj65Z9M,9251 +apscheduler/triggers/cron/__pycache__/__init__.cpython-310.pyc,, +apscheduler/triggers/cron/__pycache__/expressions.cpython-310.pyc,, +apscheduler/triggers/cron/__pycache__/fields.cpython-310.pyc,, +apscheduler/triggers/cron/expressions.py,sha256=hu1kq0mKvivIw7U0D0Nnrbuk3q01dCuhZ7SHRPw6qhI,9184 +apscheduler/triggers/cron/fields.py,sha256=NWPClh1NgSOpTlJ3sm1TXM_ViC2qJGKWkd_vg0xsw7o,3510 +apscheduler/triggers/date.py,sha256=RrfB1PNO9G9e91p1BOf-y_TseVHQQR-KJPhNdPpAHcU,1705 +apscheduler/triggers/interval.py,sha256=ABjcZFaGYAAgdAaUQIuLr9_dLszIifu88qaXrJmdxQ4,4377 +apscheduler/util.py,sha256=zaDgtfj1TzSZp7TGyC_57Gq96hrcrhzP41pwZ0xbBxA,13846 diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt b/python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/APScheduler-3.10.1.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/LICENSE similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE rename to python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/LICENSE diff --git a/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/METADATA b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/METADATA new file mode 100644 index 0000000..0e60b84 --- /dev/null +++ b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/METADATA @@ -0,0 +1,37 @@ +Metadata-Version: 2.1 +Name: Brotli +Version: 1.0.9 +Summary: Python bindings for the Brotli compression library +Home-page: https://github.com/google/brotli +Author: The Brotli Authors +License: MIT +Platform: Posix +Platform: MacOS X +Platform: Windows +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX :: Linux +Classifier: Programming Language :: C +Classifier: Programming Language :: C++ +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.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Unix Shell +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving +Classifier: Topic :: System :: Archiving :: Compression +Classifier: Topic :: Text Processing :: Fonts +Classifier: Topic :: Utilities +License-File: LICENSE + +UNKNOWN + diff --git a/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/RECORD b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/RECORD new file mode 100644 index 0000000..8eaa403 --- /dev/null +++ b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/RECORD @@ -0,0 +1,10 @@ +Brotli-1.0.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Brotli-1.0.9.dist-info/LICENSE,sha256=PRgACONpIqTo2uwRw0x68mT-1ZYtB5JK6pKMOOhmPJQ,1084 +Brotli-1.0.9.dist-info/METADATA,sha256=F-hhct3u9qHLnoc4-lY5EPl6q2CvNkaqe3XHiNPQs9E,1366 +Brotli-1.0.9.dist-info/RECORD,, +Brotli-1.0.9.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Brotli-1.0.9.dist-info/WHEEL,sha256=N9Vl37IHX_8j8HTcRdLPw1BZ19cMYWLY0ZJat5peo4A,225 +Brotli-1.0.9.dist-info/top_level.txt,sha256=gsS54HrhO3ZveFxeMrKo_7qH4Sm4TbQ7jGLVBEqJ4NI,15 +__pycache__/brotli.cpython-310.pyc,, +_brotli.cpython-310-x86_64-linux-gnu.so,sha256=sNXEfmInKcZvYZVPKgdz987v3rpmdDZDdu8FCvnY798,6726712 +brotli.py,sha256=iwoQnPvrANtaJYTJ6mSjOQUENH7Z8RgAEbn-HxMR-kU,1857 diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/REQUESTED diff --git a/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/WHEEL b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/WHEEL new file mode 100644 index 0000000..8a18a6e --- /dev/null +++ b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/WHEEL @@ -0,0 +1,8 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: false +Tag: cp310-cp310-manylinux_2_5_x86_64 +Tag: cp310-cp310-manylinux1_x86_64 +Tag: cp310-cp310-manylinux_2_12_x86_64 +Tag: cp310-cp310-manylinux2010_x86_64 + diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt b/python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/Brotli-1.0.9.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/AES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/AES.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/AES.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/AES.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/AES.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC2.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC2.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC2.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC2.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC4.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC4.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC4.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ARC4.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/Blowfish.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/Blowfish.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/Blowfish.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/Blowfish.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/CAST.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/CAST.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/CAST.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/CAST.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/DES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/DES.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/DES.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/DES.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/DES.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/DES3.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/DES3.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/DES3.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/DES3.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/Salsa20.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/Salsa20.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/Salsa20.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/Salsa20.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_ARC4.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_ARC4.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_EKSBlowfish.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_EKSBlowfish.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_chacha20.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_chacha20.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cbc.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cbc.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cbc.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cbc.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ccm.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ccm.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ccm.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ccm.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cfb.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cfb.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cfb.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_cfb.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ctr.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ctr.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ctr.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ctr.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_eax.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_eax.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_eax.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_eax.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ecb.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ecb.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ecb.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ecb.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_gcm.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_gcm.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_gcm.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_gcm.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ocb.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ocb.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ocb.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ocb.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ofb.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ofb.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ofb.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_ofb.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_openpgp.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_openpgp.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_siv.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_siv.py diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_siv.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_mode_siv.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_des.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_des.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2b.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2b.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2b.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2b.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2s.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2s.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2s.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/BLAKE2s.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/CMAC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/CMAC.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/CMAC.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/CMAC.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/HMAC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/HMAC.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/HMAC.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/HMAC.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC128.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC128.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC128.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC128.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KMAC256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/KangarooTwelve.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KangarooTwelve.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/KangarooTwelve.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/KangarooTwelve.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD2.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD2.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD2.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD2.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD2.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD4.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD4.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD4.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD4.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD4.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD5.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD5.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD5.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/MD5.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/MD5.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/Poly1305.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/Poly1305.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/Poly1305.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/Poly1305.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD160.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD160.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD160.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/RIPEMD160.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA1.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA1.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA1.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA1.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA224.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA224.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA224.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA224.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA384.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA384.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA384.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA384.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_224.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_224.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_224.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_224.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_384.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_384.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_384.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_384.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_512.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_512.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_512.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA3_512.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA512.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA512.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHA512.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHA512.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE128.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE128.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE128.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE128.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/SHAKE256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash128.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash128.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash128.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash128.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/TupleHash256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_MD2.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_MD2.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_MD4.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_MD4.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_MD5.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_MD5.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA1.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA1.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA224.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA224.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA256.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA256.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA384.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA384.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA512.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_SHA512.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_keccak.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_keccak.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Hash/_poly1305.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Hash/_poly1305.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE128.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE128.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE128.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE128.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE256.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE256.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/cSHAKE256.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py b/python/lib/python3.10/site-packages/Cryptodome/Hash/keccak.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/keccak.py rename to python/lib/python3.10/site-packages/Cryptodome/Hash/keccak.py diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi b/python/lib/python3.10/site-packages/Cryptodome/Hash/keccak.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Hash/keccak.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PEM.py b/python/lib/python3.10/site-packages/Cryptodome/IO/PEM.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/PEM.py rename to python/lib/python3.10/site-packages/Cryptodome/IO/PEM.py diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi b/python/lib/python3.10/site-packages/Cryptodome/IO/PEM.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi rename to python/lib/python3.10/site-packages/Cryptodome/IO/PEM.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py b/python/lib/python3.10/site-packages/Cryptodome/IO/PKCS8.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py rename to python/lib/python3.10/site-packages/Cryptodome/IO/PKCS8.py diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi b/python/lib/python3.10/site-packages/Cryptodome/IO/PKCS8.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi rename to python/lib/python3.10/site-packages/Cryptodome/IO/PKCS8.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py b/python/lib/python3.10/site-packages/Cryptodome/IO/_PBES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/_PBES.py rename to python/lib/python3.10/site-packages/Cryptodome/IO/_PBES.py diff --git a/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi b/python/lib/python3.10/site-packages/Cryptodome/IO/_PBES.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi rename to python/lib/python3.10/site-packages/Cryptodome/IO/_PBES.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/IO/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/IO/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/IO/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/IO/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py b/python/lib/python3.10/site-packages/Cryptodome/Math/Numbers.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/Numbers.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/Numbers.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/Numbers.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/Numbers.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Primality.py b/python/lib/python3.10/site-packages/Cryptodome/Math/Primality.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/Primality.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/Primality.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/Primality.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/Primality.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerBase.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerBase.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerBase.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerBase.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerCustom.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerCustom.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerCustom.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerCustom.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerGMP.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerGMP.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerGMP.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerGMP.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerNative.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerNative.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi b/python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerNative.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Math/_IntegerNative.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Math/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Math/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Math/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Math/_modexp.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Math/_modexp.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py b/python/lib/python3.10/site-packages/Cryptodome/Protocol/KDF.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/KDF.py diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi b/python/lib/python3.10/site-packages/Cryptodome/Protocol/KDF.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/KDF.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py b/python/lib/python3.10/site-packages/Cryptodome/Protocol/SecretSharing.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/SecretSharing.py diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi b/python/lib/python3.10/site-packages/Cryptodome/Protocol/SecretSharing.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/SecretSharing.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Protocol/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/Protocol/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Protocol/_scrypt.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Protocol/_scrypt.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/DSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/DSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/DSA.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/DSA.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/ECC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/ECC.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/ECC.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/ECC.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/ElGamal.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/ElGamal.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/ElGamal.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/ElGamal.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/RSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/RSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/RSA.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/RSA.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ed448.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_ed448.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_openssh.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_openssh.py diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_openssh.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_openssh.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/PublicKey/_x25519.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/PublicKey/_x25519.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Random/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Random/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Random/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Random/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/Random/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Random/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Random/random.py b/python/lib/python3.10/site-packages/Cryptodome/Random/random.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Random/random.py rename to python/lib/python3.10/site-packages/Cryptodome/Random/random.py diff --git a/lib/python3.11/site-packages/Cryptodome/Random/random.pyi b/python/lib/python3.10/site-packages/Cryptodome/Random/random.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Random/random.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Random/random.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/common.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/common.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/common.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/common.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/test_PBES.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/test_PBES.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_Primality.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_Primality.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_modexp.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Math/test_modexp.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Random/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Random/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Random/test_random.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Random/test_random.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_dss.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_dss.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_pss.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Signature/test_pss.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_Counter.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_Counter.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_Padding.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_Padding.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_asn1.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_asn1.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_number.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_number.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_strxor.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/Util/test_strxor.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/__main__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/__main__.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/loader.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/loader.py diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py b/python/lib/python3.10/site-packages/Cryptodome/SelfTest/st_common.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py rename to python/lib/python3.10/site-packages/Cryptodome/SelfTest/st_common.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/DSS.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/DSS.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/DSS.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/DSS.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/DSS.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_PSS.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_PSS.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_v1_5.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_v1_5.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/eddsa.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/eddsa.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/eddsa.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/eddsa.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/pkcs1_15.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/pkcs1_15.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/pkcs1_15.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/pkcs1_15.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pss.py b/python/lib/python3.10/site-packages/Cryptodome/Signature/pss.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/pss.py rename to python/lib/python3.10/site-packages/Cryptodome/Signature/pss.py diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi b/python/lib/python3.10/site-packages/Cryptodome/Signature/pss.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Signature/pss.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Counter.py b/python/lib/python3.10/site-packages/Cryptodome/Util/Counter.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/Counter.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/Counter.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/Counter.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/Counter.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Padding.py b/python/lib/python3.10/site-packages/Cryptodome/Util/Padding.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/Padding.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/Padding.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/Padding.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/Padding.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py b/python/lib/python3.10/site-packages/Cryptodome/Util/RFC1751.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/RFC1751.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/RFC1751.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/RFC1751.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/Util/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py b/python/lib/python3.10/site-packages/Cryptodome/Util/_cpu_features.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/_cpu_features.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/_cpu_features.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/_cpu_features.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Util/_cpuid_c.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Util/_cpuid_c.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_file_system.py b/python/lib/python3.10/site-packages/Cryptodome/Util/_file_system.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_file_system.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/_file_system.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/_file_system.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/_file_system.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py b/python/lib/python3.10/site-packages/Cryptodome/Util/_raw_api.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/_raw_api.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/_raw_api.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/_raw_api.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so b/python/lib/python3.10/site-packages/Cryptodome/Util/_strxor.abi3.so similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so rename to python/lib/python3.10/site-packages/Cryptodome/Util/_strxor.abi3.so diff --git a/lib/python3.11/site-packages/Cryptodome/Util/asn1.py b/python/lib/python3.10/site-packages/Cryptodome/Util/asn1.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/asn1.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/asn1.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/asn1.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/asn1.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/number.py b/python/lib/python3.10/site-packages/Cryptodome/Util/number.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/number.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/number.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/number.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/number.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/number.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/number.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py b/python/lib/python3.10/site-packages/Cryptodome/Util/py3compat.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/py3compat.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/py3compat.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/py3compat.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/py3compat.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/Util/strxor.py b/python/lib/python3.10/site-packages/Cryptodome/Util/strxor.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/strxor.py rename to python/lib/python3.10/site-packages/Cryptodome/Util/strxor.py diff --git a/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi b/python/lib/python3.10/site-packages/Cryptodome/Util/strxor.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi rename to python/lib/python3.10/site-packages/Cryptodome/Util/strxor.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/__init__.py b/python/lib/python3.10/site-packages/Cryptodome/__init__.py similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/__init__.py rename to python/lib/python3.10/site-packages/Cryptodome/__init__.py diff --git a/lib/python3.11/site-packages/Cryptodome/__init__.pyi b/python/lib/python3.10/site-packages/Cryptodome/__init__.pyi similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/__init__.pyi rename to python/lib/python3.10/site-packages/Cryptodome/__init__.pyi diff --git a/lib/python3.11/site-packages/Cryptodome/py.typed b/python/lib/python3.10/site-packages/Cryptodome/py.typed similarity index 100% rename from lib/python3.11/site-packages/Cryptodome/py.typed rename to python/lib/python3.10/site-packages/Cryptodome/py.typed diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/RECORD b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/RECORD new file mode 100644 index 0000000..2238824 --- /dev/null +++ b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/RECORD @@ -0,0 +1,54 @@ +../../../bin/flask,sha256=j5_uZoZtL2Oy-uOdUqnhGvBIO4MiDDm_QplSYEcKt90,239 +Flask-2.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-2.2.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-2.2.5.dist-info/METADATA,sha256=rZTjr5v4M7HB-zC-w2Y0ZU96OYSGBb-Hm15jlLJhs3g,3889 +Flask-2.2.5.dist-info/RECORD,, +Flask-2.2.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask-2.2.5.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +Flask-2.2.5.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41 +Flask-2.2.5.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=GJgAILDWhW_DQljuoJ4pk9zBUy70zPPu-VZ6kLyiVI4,2890 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-310.pyc,, +flask/__pycache__/__main__.cpython-310.pyc,, +flask/__pycache__/app.cpython-310.pyc,, +flask/__pycache__/blueprints.cpython-310.pyc,, +flask/__pycache__/cli.cpython-310.pyc,, +flask/__pycache__/config.cpython-310.pyc,, +flask/__pycache__/ctx.cpython-310.pyc,, +flask/__pycache__/debughelpers.cpython-310.pyc,, +flask/__pycache__/globals.cpython-310.pyc,, +flask/__pycache__/helpers.cpython-310.pyc,, +flask/__pycache__/logging.cpython-310.pyc,, +flask/__pycache__/scaffold.cpython-310.pyc,, +flask/__pycache__/sessions.cpython-310.pyc,, +flask/__pycache__/signals.cpython-310.pyc,, +flask/__pycache__/templating.cpython-310.pyc,, +flask/__pycache__/testing.cpython-310.pyc,, +flask/__pycache__/typing.cpython-310.pyc,, +flask/__pycache__/views.cpython-310.pyc,, +flask/__pycache__/wrappers.cpython-310.pyc,, +flask/app.py,sha256=ue4tEeDnr3m-eSEwz7OJ1_wafSYl3fl6eo-NLFgNNJQ,99141 +flask/blueprints.py,sha256=fenhKP_Sh5eU6qtWeHacg1GVeun4pQzK2vq8sNDd1hY,27266 +flask/cli.py,sha256=pLmnWObe_G4_ZAFQdh7kgwqPMxRXm4oUhaUSBpJMeq4,33532 +flask/config.py,sha256=Ubo_juzSYsAKqD2vD3vm6mjsPo3EOJDdSEzYq8lKTJI,12585 +flask/ctx.py,sha256=bGEQQuF2_cHqZ3ZNMeMeEG8HOLJkDlL88u2BBxCrRao,14829 +flask/debughelpers.py,sha256=_RvAL3TW5lqMJeCVWtTU6rSDJC7jnRaBL6OEkVmooyU,5511 +flask/globals.py,sha256=EX0XdX73BTWdVF0UHDSNet2ER3kI6sKveo3_o5IOs98,3187 +flask/helpers.py,sha256=XTHRgLlyxeEzR988q63-4OY8RswTscR-5exFxK10CLU,25280 +flask/json/__init__.py,sha256=TOwldHT3_kFaXHlORKi9yCWt7dbPNB0ovdHHQWlSRzY,11175 +flask/json/__pycache__/__init__.cpython-310.pyc,, +flask/json/__pycache__/provider.cpython-310.pyc,, +flask/json/__pycache__/tag.cpython-310.pyc,, +flask/json/provider.py,sha256=jXCNypf11PN4ngQjEt6LnSdCWQ1yHIAkNLHlXQlCB-A,10674 +flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857 +flask/logging.py,sha256=WYng0bLTRS_CJrocGcCLJpibHf1lygHE_pg-KoUIQ4w,2293 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/scaffold.py,sha256=EKx-Tr5BXLzeKKvq3ZAi_2oUQVZuC4OJSJTocyDXsSo,35958 +flask/sessions.py,sha256=adWCRnJYETJcjjhlcvUgZR5S0DMqKQctS0nzkY9g9Us,15927 +flask/signals.py,sha256=H7QwDciK-dtBxinjKpexpglP0E6k0MJILiFWTItfmqU,2136 +flask/templating.py,sha256=1P4OzvSnA2fsJTYgQT3G4owVKsuOz8XddCiR6jMHGJ0,7419 +flask/testing.py,sha256=JtHRQY7mIH39SM4S51svAr8e7Xk87dqMb30Z6Dyv9TA,10706 +flask/typing.py,sha256=KgxegTF9v9WvuongeF8LooIvpZPauzGrq9ZXf3gBlYc,2969 +flask/views.py,sha256=LulttWL4owVFlgwrJi8GCNM4inC3xbs2IBlY31bdCS4,6765 +flask/wrappers.py,sha256=el3tn1LgSUV0eNGgYMjKICT5I7qGJgbpIhvci4nrwQ8,5702 diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/entry_points.txt similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/entry_points.txt diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt b/python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/Flask-2.2.5.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/RECORD b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/RECORD new file mode 100644 index 0000000..c65e7ba --- /dev/null +++ b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/RECORD @@ -0,0 +1,59 @@ +Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539 +Jinja2-3.1.2.dist-info/RECORD,, +Jinja2-3.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927 +jinja2/__pycache__/__init__.cpython-310.pyc,, +jinja2/__pycache__/_identifier.cpython-310.pyc,, +jinja2/__pycache__/async_utils.cpython-310.pyc,, +jinja2/__pycache__/bccache.cpython-310.pyc,, +jinja2/__pycache__/compiler.cpython-310.pyc,, +jinja2/__pycache__/constants.cpython-310.pyc,, +jinja2/__pycache__/debug.cpython-310.pyc,, +jinja2/__pycache__/defaults.cpython-310.pyc,, +jinja2/__pycache__/environment.cpython-310.pyc,, +jinja2/__pycache__/exceptions.cpython-310.pyc,, +jinja2/__pycache__/ext.cpython-310.pyc,, +jinja2/__pycache__/filters.cpython-310.pyc,, +jinja2/__pycache__/idtracking.cpython-310.pyc,, +jinja2/__pycache__/lexer.cpython-310.pyc,, +jinja2/__pycache__/loaders.cpython-310.pyc,, +jinja2/__pycache__/meta.cpython-310.pyc,, +jinja2/__pycache__/nativetypes.cpython-310.pyc,, +jinja2/__pycache__/nodes.cpython-310.pyc,, +jinja2/__pycache__/optimizer.cpython-310.pyc,, +jinja2/__pycache__/parser.cpython-310.pyc,, +jinja2/__pycache__/runtime.cpython-310.pyc,, +jinja2/__pycache__/sandbox.cpython-310.pyc,, +jinja2/__pycache__/tests.cpython-310.pyc,, +jinja2/__pycache__/utils.cpython-310.pyc,, +jinja2/__pycache__/visitor.cpython-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502 +jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/Jinja2-3.1.2.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA rename to python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/RECORD new file mode 100644 index 0000000..7686087 --- /dev/null +++ b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/RECORD @@ -0,0 +1,15 @@ +MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-2.1.3.dist-info/METADATA,sha256=Wvvh4Tz-YtW24YagYdqrrrBdm9m-DjTdqJWhxlbU6-0,3003 +MarkupSafe-2.1.3.dist-info/RECORD,, +MarkupSafe-2.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +MarkupSafe-2.1.3.dist-info/WHEEL,sha256=iZaXX0Td62Nww8bojl0E84uJHjT41csHPKZmbUBbJPs,152 +MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=xIItqrn1Bwi7FxPJO9rCVQBG0Evewue1Tl4BV0l9xEs,10338 +markupsafe/__pycache__/__init__.cpython-310.pyc,, +markupsafe/__pycache__/_native.cpython-310.pyc,, +markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 +markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 +markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so,sha256=huh9xBZy3L1q1ar3y-f44Ozfa25Rg6xiomsq8MThk_Y,44240 +markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED diff --git a/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL new file mode 100644 index 0000000..2d1b4b8 --- /dev/null +++ b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp310-cp310-manylinux_2_17_x86_64 +Tag: cp310-cp310-manylinux2014_x86_64 + diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/RECORD b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/RECORD new file mode 100644 index 0000000..73a2a7e --- /dev/null +++ b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/RECORD @@ -0,0 +1,99 @@ +Werkzeug-2.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-2.2.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-2.2.3.dist-info/METADATA,sha256=TIyameVEp5p52N9E1mTWWabY6g1sB0Dm25vznZQeXPQ,4416 +Werkzeug-2.2.3.dist-info/RECORD,, +Werkzeug-2.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Werkzeug-2.2.3.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +Werkzeug-2.2.3.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=Hr0lQweC21HXPVBemSpBJUIzrbq2mn8h70J1h30QcqY,188 +werkzeug/__pycache__/__init__.cpython-310.pyc,, +werkzeug/__pycache__/_internal.cpython-310.pyc,, +werkzeug/__pycache__/_reloader.cpython-310.pyc,, +werkzeug/__pycache__/datastructures.cpython-310.pyc,, +werkzeug/__pycache__/exceptions.cpython-310.pyc,, +werkzeug/__pycache__/formparser.cpython-310.pyc,, +werkzeug/__pycache__/http.cpython-310.pyc,, +werkzeug/__pycache__/local.cpython-310.pyc,, +werkzeug/__pycache__/security.cpython-310.pyc,, +werkzeug/__pycache__/serving.cpython-310.pyc,, +werkzeug/__pycache__/test.cpython-310.pyc,, +werkzeug/__pycache__/testapp.cpython-310.pyc,, +werkzeug/__pycache__/urls.cpython-310.pyc,, +werkzeug/__pycache__/user_agent.cpython-310.pyc,, +werkzeug/__pycache__/utils.cpython-310.pyc,, +werkzeug/__pycache__/wsgi.cpython-310.pyc,, +werkzeug/_internal.py,sha256=4lwshe63pFlCo0h2IMcmvhbugA50QXQvfLD5VoY5c4Q,16271 +werkzeug/_reloader.py,sha256=hiP0z4bi6p_8UIJOtq7K0BV2dqCik5yztWLsDXeI_WE,14285 +werkzeug/datastructures.py,sha256=v2WYfs1rb1OuQgXyLripHQFwgodrfTNCd5P5f8n3ueA,97081 +werkzeug/datastructures.pyi,sha256=HRzDLc7A6qnwluhNqn6AT76CsLZIkAbVVqxn0AbfV-s,34506 +werkzeug/debug/__init__.py,sha256=wfJ2OmljsO5C0e0sXJpTUiG6bwGU6uHtFDDDMfJfQJk,18877 +werkzeug/debug/__pycache__/__init__.cpython-310.pyc,, +werkzeug/debug/__pycache__/console.cpython-310.pyc,, +werkzeug/debug/__pycache__/repr.cpython-310.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-310.pyc,, +werkzeug/debug/console.py,sha256=dechqiCtHfs0AQZWZofUC1S97tCuvwDgT0gdha5KwWM,6208 +werkzeug/debug/repr.py,sha256=vF3TLnYBohYr8V6Gz13PTJspQs42uv3gUJSzSbmHJBo,9472 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=tg42SZs1SVmYWZ-_Fj5ELK5-FLHnGNQrei0K2By8Bw8,10521 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 +werkzeug/debug/tbtools.py,sha256=6iohJovtBSFRAcgX7_aRY4r3e19PLj3FavYB3RM4CmA,13263 +werkzeug/exceptions.py,sha256=8-KOXguQkOLoBUdN-7x_WyHT92TcAmjTWNwG4t8QYIg,26527 +werkzeug/formparser.py,sha256=DBRbbAnzspYUBzgfxPaZC7MjGAK_m5QTvdWoyvrhw4o,16516 +werkzeug/http.py,sha256=NqJjYCt8tKn2XOEKPApq4L3q8zb8YFq3GFOe5gsonI4,42776 +werkzeug/local.py,sha256=v-HEqr4bLpLHl4upCj97MOfUyCjW10Tp6mcNaFRFyew,22288 +werkzeug/middleware/__init__.py,sha256=qfqgdT5npwG9ses3-FXQJf3aB95JYP1zchetH_T3PUw,500 +werkzeug/middleware/__pycache__/__init__.cpython-310.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-310.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-310.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-310.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-310.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-310.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-310.pyc,, +werkzeug/middleware/dispatcher.py,sha256=Fh_w-KyWnTSYF-Lfv5dimQ7THSS7afPAZMmvc4zF1gg,2580 +werkzeug/middleware/http_proxy.py,sha256=HE8VyhS7CR-E1O6_9b68huv8FLgGGR1DLYqkS3Xcp3Q,7558 +werkzeug/middleware/lint.py,sha256=1w_UVKkAwq5wjjtCcDCDZwhAhWzPSZ0aDyUmbjAEeXw,13952 +werkzeug/middleware/profiler.py,sha256=7pWYDYPC774S0-HYLkG3Uge58PGUMX7tWp_Cor3etvo,4883 +werkzeug/middleware/proxy_fix.py,sha256=l7LC_LDu0Yd4SvUxS5SFigAJMzcIOGm6LNKl9IXJBSU,6974 +werkzeug/middleware/shared_data.py,sha256=fXjrEkuqxUVLG1DLrOdQLc96QQdjftCBZ1oM5oK89h4,9528 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819 +werkzeug/routing/__pycache__/__init__.cpython-310.pyc,, +werkzeug/routing/__pycache__/converters.cpython-310.pyc,, +werkzeug/routing/__pycache__/exceptions.cpython-310.pyc,, +werkzeug/routing/__pycache__/map.cpython-310.pyc,, +werkzeug/routing/__pycache__/matcher.cpython-310.pyc,, +werkzeug/routing/__pycache__/rules.cpython-310.pyc,, +werkzeug/routing/converters.py,sha256=05bkekg64vLC6mqqK4ddBh589WH9yBsjtW8IJhdUBvw,6968 +werkzeug/routing/exceptions.py,sha256=RklUDL9ajOv2fTcRNj4pb18Bs4Y-GKk4rIeTSfsqkks,4737 +werkzeug/routing/map.py,sha256=XN4ZjzEF1SfMxtdov89SDE-1_U78KVnnobTfnHzqbmE,36757 +werkzeug/routing/matcher.py,sha256=6VvQYCCOjyj1JKUZKuAiVA_U1nXtvvJ70pSbBUdL_1k,7509 +werkzeug/routing/rules.py,sha256=3YsPpI9ZGcNmFiV2Go2Td1DvZ9ZdaMMnvGP1o17aMfc,31836 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/__pycache__/__init__.cpython-310.pyc,, +werkzeug/sansio/__pycache__/http.cpython-310.pyc,, +werkzeug/sansio/__pycache__/multipart.cpython-310.pyc,, +werkzeug/sansio/__pycache__/request.cpython-310.pyc,, +werkzeug/sansio/__pycache__/response.cpython-310.pyc,, +werkzeug/sansio/__pycache__/utils.cpython-310.pyc,, +werkzeug/sansio/http.py,sha256=k3nREBfU-r8fXCfSTKQenys25q9bzUOvdY-OVGrqztA,5107 +werkzeug/sansio/multipart.py,sha256=vMZ85cvLD55clUTcTin2DtBv2GQRGh0_fExklnXKHoI,10055 +werkzeug/sansio/request.py,sha256=SiGcx2cz-l81TlCCrKrT2fePqC64hN8fSg5Ig6J6vRs,20175 +werkzeug/sansio/response.py,sha256=UTl-teQDDjovrZMkjj3ZQsHw-JtiFak5JfKEk1_vBYU,26026 +werkzeug/sansio/utils.py,sha256=EjbqdHdT-JZWgjUQaaWSgBUIRprXUkrsMQQqJlJHpVU,4847 +werkzeug/security.py,sha256=7TVI0L62emBHAh-1RHB_KlwGYcE08pPCyU674Ho4aNE,4653 +werkzeug/serving.py,sha256=XCiHFbMCFCgecKycgajhF4rFsGoemeN0xW1eTQqNt-g,37558 +werkzeug/test.py,sha256=uMahfM81RqEN3d3Sp4SkN36Pi8oZpV6dTgFY0cW1_2c,48126 +werkzeug/testapp.py,sha256=RJhT_2JweNiMKe304N3bF1zaIeMpRx-CIMERdeydfTY,9404 +werkzeug/urls.py,sha256=Q9Si-eVh7yxk3rwkzrwGRm146FXVXgg9lBP3k0HUfVM,36600 +werkzeug/user_agent.py,sha256=WclZhpvgLurMF45hsioSbS75H1Zb4iMQGKN3_yZ2oKo,1420 +werkzeug/utils.py,sha256=BDX5_7OCMVgl-ib84bCEdBG5MVvrxaSlfdg7Cxh4ND0,25174 +werkzeug/wrappers/__init__.py,sha256=kGyK7rOud3qCxll_jFyW15YarJhj1xtdf3ocx9ZheB8,120 +werkzeug/wrappers/__pycache__/__init__.cpython-310.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-310.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-310.pyc,, +werkzeug/wrappers/request.py,sha256=XmpTThXytTdznbPJnIsfdoIAvdi-THzTJQ9DsvARhn4,24026 +werkzeug/wrappers/response.py,sha256=ii1IaN2eUfoB-tBqbn_46fCB_SVVL8Fu4qd6cu0AlEY,34963 +werkzeug/wsgi.py,sha256=-VKI2iwCgLb-VToIZeBpdutkTETxy9HkIwgcFC5orkU,36060 diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt b/python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt diff --git a/python/lib/python3.10/site-packages/_brotli.cpython-310-x86_64-linux-gnu.so b/python/lib/python3.10/site-packages/_brotli.cpython-310-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..3dacfefb36946e1729c7007b3e77503e5258712d GIT binary patch literal 6726712 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

      ~s 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 )tU#lFB$R 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�d|DVZ*@_TYwd1{>{^c-8B5^Uq5k7=ld6&$% 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%0AD>yv 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 z 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

      )x&iek|1{`r+P5Py+ZFl_iXe8`w{wQ1 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𝔥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%0ABU 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ξ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

      tP z2w0p`l2Zm8ff$JxgHV=ng5i}*#pUXRN}7idOw9RKR3{Oej64f5J7j4Z#go;WpV&SIW`2*jA&vFxZHmBJ_GPNmv3(J@^xrDI0!ECXjY zt2w}Vx${MBpDM}(5sc@*jtIcJdnK%6I~ zY!B{ySzXG#Y~btbpT;Zby-xiPc+^Ya``iz#3`XT?@{IFL@(etw4(kStp934_H9~HI zXqES6UTd!C$F<3GV8?^evr>oL=>@L~!kcQ{KG7j}`5O3vc|mzS^Fs1^!3`6Yh`dO_ zM4jEgT6edeu#W_3mCs)RMs(=)KK9K z11l#rlJY1~QTj)#^w_-dq$cG}C7g~thwH2Iwh-Hjye;nsc6TuD1n$k-m$#qw;k=W1 zr}F;FyU1Eu7rupNeJ$@gvm1nWkngdBPXz>%$30;62>8sPf;*4A7kU4Z_X_!Sr7Esv z!g-&k>8EUk5wHqE#~Pmu3MO|nVbxl=Z3I(hkn`8@+9Ry{bwIZ3XHPv2{apKX?dRRE z8!3Hvca`!1_hlVS7)m*oJxNLcOB4#97BJ6Z%oepAumOl7;po?h&z;yC)Ne??k>C^i z&0%NmC%P-f$!wnJnBQ-a;7ZTpek<8oU#WuoN0qY~d@Ji+guhZg)$a_u>UI7N?@qs$ z$gimS7Wo}9b(clHtSl*8QC3%FZo{r4&=ui<@XGhePXHz%{;ws4>V5Mw^Rq-}4p^>G z_@*hpUw(dme>jEY7U!1%hj7PO!f}+x=TFR^1U8dv`ZdqVpR01_=Pwj$kzn|@dIeuB zn0|)JxFmmR{xa%XMS1l{Bi0IM3)ohnl$o}X-d@SY`(rr!KXMNnILBBWCp?jV7I-fI zM*gk*d-?YbI`KTNq#v_>!}yNy1G1(-{}_$I%nGyx)r5n05Gr1e`R6K68QTO-3wEs- zZ5TTh*b;MO?F4j2xD|LJd$Ze((T6dBQNL|?4-Th?%I#SYTo9$wN@p}VF$GD$WUlrF zrWT|XWRlKeH=8ksFpm|^wSp4x(t?5Hd_#GVs8(zb-s=@iDwt9*Q`BY`%ppFX@>=9| zi1no8aT^LY65qkjucD&Nx?8396znb74}Ab}sNjgIg8K`oV~F3`Jq0|=T)ll2{CvR$ zs$b-;ORDa_ncptBt8(SB_n{vaJSO*rs`d}_e;Ho^Ul;sWVA3CVtq6HB18SKo4*n(s zx*?(&;;a6xk?s0>B6mUPm#)OU+3{CZ^c@NYa3!#RQ2!qPqiYcRLx4k7J;PO8nXMeo z=>B8LA4hpY|A`-U8E%21ri!j<{ih3F(K(yEwf#5r-_!qhRsD4Tt5Da-x!(U)|5yG0 zQ&r{hZ~DJw=Yy)E86ek8kWGncDa&3RW_5*wUqpj99`N-5`vDFEoY;32b+-W?g3B{h zES@UA`+y##f>mBcX9(PILlmW}ZzelVbut~V;F$&*2V9S852K65dRK``^@CBARKLH5oA zFAlh*>QH97G2kY=CzbqX1748xFXjJ4^^IT^+kvB8sHiH0Rat2nabE>i4N;@8j_~kl z8S#dNjfM9GSo6YGgN63RF07N+ZIKG9Eg5$otFs3lBFrhF> z<>9@1VK(a=##~@tVSZtus;>xqVBz?}3FJ*vRg_0M9nK8I%)(hzn_sw~aFys8al zM#PrFpSZG{5qHLd;qzwV`;iY6{)T)AahN<@Jqb@0o(7&loM-<+;pM`=nX8Y)r}))M zeK(+Q7T!X>TX>Ia4@J+5!dHc_S^Xztk$O&JC{vYFop@c9Q%}X~7d0qqQPfi9RLs>D zt_4>ti>$zGifljGiC1FyE(ljq_a){hG`^!C9#ho2D6S~JD1lTWa+0b?S$m(NjG|1q zrA1{_8$@}S=$l$Jt!QD&QTZHhY;+Z8*K<6P`g>`F}T?#9eVIMISBv-K|SLr!XO8ZaG^ zY0!~HDu=y%U;$!4aUt?I?8-9@DjrN~DDrTXKcaXnsd31YiA|wAjq-HLxN|OE!c3lP zCHQKg*MY4^Y(#8gcYEN@57#SaLdP<~qc ztoS9d*TwG%(Ox2t(I6X@m=Tw?veYiAQ&Jz^=j1n}+_ zbxDVkj>6^X44_kqZAoW?4hI8O(d<&{MYSfgPl-5I~zCpDC zsfGrgGOAH&V{)4yH&xZYC~ZcnIdV%xD^;x{xDCRVyw0Wer4GcLDC2rs>JHWg(Ul!} zUEKulE|~25sFZJMKxtrUD4Z~r8w1{3rDIFuN%c{ADJq^uJYD7ByJ7<+uUEfhR;uI( z-A^!mZ-If+pHyLK5wMtesi>C`8z{7X1{sIL9Z!`BpQulQHxDr%u?Vpev9@%5=?36N zM8&eT^as}4OLrPnelGom^smUfOMf${DdP`)Ul3z1 zg54~=OZpz=`;;G0#`~+%r(iEw;d)hORAxB4NttPxneeKY)hhc;sEW>d!mCfL0p*6m zt>|n7uVq<>vQA~TV4V#*oXR}Qy0ha`=3C}RJfN%xFqr)iMttrsm^^#0vhcFrWwGSN zl_iuVmL-*CLS>1rY_MEJURgi#3d;Hu7MGP0;&U|MVCMLwM=*K*p(-^@#qo)&fs%Xi z{ZQE$;f@2FO==G1xuT-<%6T5V1;Ss%Y$@YP!XHIl8F#4cNZC<%$Jsv#JcsxLQQg%T zx3R_=sa61*&zDIi6yk{>T7H+ znVD6S&Pp|;FA<|OpW$1n+L9T<3Ncfv1HZ1+9N~cQM)Z~HVfOk`6@(U1Lz*EqgOg`8 zN;+?5svRhqY9~o%+AodFwKXMk?QCg`b^zA-ucoTxXH;D}qp2ZzNwp*=)ZUm@(Jsq_5h8)BPdjLfAUO{z+rjcQ1i8dL35V>9i) zX6D+{n8Vk!sy0;8YKt+)dW}xo%&3}nmQi)>=bGx;HJTdQA<}1BTWPX37~A+jQ!ee* zjFP$-PmsDvBc#Sg=DG()<8(g)ADZfPVMaA{0a6WJ56v`P3+#n{(kN+*#zY&UDc4TY zjFyfYmFose<+{ZhGwG_Sxm3l-Om_g=J@7h?Ik?+sYa&SOUCBf9eDh^OvY-P zV0~65rn#Q-?`D@1F92lkZHXotutr?~J%XpOTD;&2Z?9cU@Ns_ZvRoBdTymmRx zh5t-PNRNz0NS*Ll_Zge%_TaoKm$bTv8m-O=k9C%jsqS;hROg6oHH}fjG6`HEL_L$oT=jAISt!^6T@zLmX3niWI9pXQno3{~lj3!}!jn=-x z+%+)wK&-bh=DH`1)-}X-UpFz)4U($p%8aJ!T1qB57d(cBW@gfDV>9Us(=obOV-uYR z#wBP>btkc1d75#$RE>$`k7K_D$KeIeRh%!<0VAzcZZukJWLz$d!8uhIej`LK&f|H; zRiq<0$0CfXO3#dRlABRAX^2!!dZei?*-F)M-qe)7kiNxHA0hpQ{T+p4bys7ib=H_` z+u~ULZZ=l?9LJ{-o*Q9iX4+D-s#;^5S95TDhvIw+ld5YENfWfuIF9S3F}fDm)(x6+ z-DEt5tI`+==OWIJD$;tRaZ(}9ndMTs_BFOAM;fUeX;uZ>UsXDT?P_aW9p}|#$p?=s z3fq3gWRflfk9~>pNZn%eeZU;8jH_aM$4H}$$4N(UOow5c=9`a}7UMZ?jPvOY&L=bM z;}o19Gt5Tn{xBOUoiH)i{-mj*?S%N%NULp&ZT|t!hlkky9Ha5r_R-RN9A^{k`=h4g zq0WV!t{{W3>gE5!$bfM(QGQ{=C9AH#gQwTe02OG&<=rupYMa z37$*+actrdKjAUV!ge=BZ!Pq^Lrlf-{8D40`y1y&DzEno0Ut=a1Q>C^JO~Dxpp|uoTO?Lh0+9FbF6bKu0Cxs zr#p_qJA;4&y5LIo3TJ*S@!AleHbOZQpCgOE~7bE*R&AD8zoq zHLZeUQB}&uV{C`V7K-y_G_HBsIOpr*Ic<&oG2O^S+Kc)^;~LUV?6cYC<0WC5V446#yaUs<7!eE)?j^#1V~F zT8VvKgt@jO3a}6RY9>pauz!9;SmF7gMc*=JzO=WcWCV++j~ zT`$c@T)W5WJaJx4H?J)XL){DK&`znU)(qFwUD8DDN$j`Ih^9DC;;`?Y##-%PI4|R+ zI@-^qsoG}pYk@gl3ydacf5r9$W1sfKd41Dtylx4$XC9tscE%%grFhOy!nwHz=le8s zQz;G4p|v|{DZLn=$;#xPwsEY1@W~we6`{0mfr1rjuWNu zAFenTKA4P%%GaIH+ndC@^r4X^jr@%*TP^KmlXWtmEYupb^^Tb~+_)fVHp*2DSo9P6oOJX5Q| z{@G)S*9vK(uDNEMl%pA=J%)4QBDQHNp5GqWu9tXSFvs(@rBq#44RKGJstd$(-5tkc z7p@mQa6B>)KO?L(Riwd)L)e}ooU?ZkOK@!dz&_uKM?3@j!V$+T3{i~Oi1-@bAjAR0 zOFV|#cwRNeeo8_NNBo0uz~lNEaRASahIo8Qh*jWk@qFus$GQYj3%nj8AFmJbQcavE zHKp&dpIb}Qqy)Ssdzosb-|(C?!rf4PTyG}eIT(g(@)fhOQhz+(YGM1=(@ZMX70yp=C`?iUe8#L1z68~Jf4|Yk3F_cD@}ki zM*0Si)duIw4><3t;T)`md)2wv&Z(LyxMwoO`E7>(K>^QBTqmyK9KMF}N!ZRcm>~_v z|3_TA>~P(*lIO&}vB7a2j2MsO=!WCzgJV}JO~vbJRo#5->*2U|`rtSn#(hU)%x8r8 zC7l0FagT5g*ZX%kUV%8z0x`b^F%)qX=Tjl#8sZIN9oF>|_VID7_Z-&gf%TbSKi|P? z$R_NUvDhcMh}(!L?3;~dRdC#^;$BCqTZVJ~0=A)}(P+sM`$>LL1z#7MYFIj>rA@ zK3vbNjLNlJaewcO`+Eo6Z?=@a#l6)SDF&~(F4zwqcwbNr`}!63nHJmL7T2$)xMz*T zb>|6Q>vm(k;W*DyrO9{?fO}XRo1u8DwQvp8;5li8BOQx#sWt9Hu48=*5wmfh(-Zdu zS2WeMi*a9UgL~}PxVGb-Px~{j&0e?`jX}INs;V7?bD$@#&u0*MxQAGbF;#H?Q&Xy? zb;bR(Gp^fBq-l6Ps*BgkQM!R9X1aRVrvFULbs4xW?Yv(*%bG-2W=>e`uCo$(Xob%~;er4jEzm5GlOjA?WSDL2t$93`)&XaF(js)Xe zZ;f+(pGg(%4m?f?=X-s;7Wv~f?iwENF+A2Lzyyd<^z$Dz4#0*su4c+W3BMsJW9wqyw8OrcipL&~d*=)2Z-eI%Ui+j@xQ@)kKAeQtC>@@Y@3Bw)jmF`e!TFE6 z7ve{At#n&6mhMAMuwO!OU2(^Iv>Dh|+>>gn;IY-iwpbx9;W7S!eWk&5L8}>u{WTKz zGG=%mW-bjkGtvEk#~zRU7GqRR_YCL9EfkkIAf8v>YU-hCu3e4yP1A6%FbenHO|Z`GI387T{#^tvGS+EV z8c)z}!+r5@(g@vMj5oo(fG74%0G_8sxIfF*OvG#L2%UTl>5S`~1s-pa*=VUF-ZQSk z>wLWVC|xw}Z?|LLXi=Mv`|H}+r;TyXatzPm@360H;Cy?9{r?#E7i)0b&*8aRh{ya6 z-fwuGw8Zi32HqHtaoqpo=q|vls|}F! z6a5%>Ww~*#OjiHH*F%eZ&)WBkCdsE;vX9C2u6*?m#@pAt#FU|1JbR<~@^p4(I3KcR zRagEWy+7U@7MQ~-aU{oR4eOJi4daB&q}giLs76e6qBS^-UXMk0%b%~Mr+d@W5#rdF z#j6v=eYr7z8D{XwNm!AMo+YMUmoJ)wPgzY*9{caDlNR>8%ziWkaVY;^4sX`P;wJXb zvt}F1nl+W|3hVa?S~N<+rEwZ=k{iD##yp6=Un36tpSs3VWNHTLG|scCW@I9t5Ruaz z*t9XIlbzblT0K4b4AMzku@UF28$JQTNN) zzrf2=`LWCK_u8~A-$+dNC|Ni?>d3EGf7!!#Hb^_do$5eWi2VGv5g&i#C&xK03RKE2Ed1&>$S=QiawqZ&B?kPMTTHVDCCfPA^`2ObEMP3fI?thd0 z`{>$PrP;G& zaESFeO|9y3d|28ui}-&r)Q#>Zi$l~tUZcCC=)pkGK3B}OvGxDO=lifx=aP$;#a0X0 z>Hhd%u|}h!vfpRnF7ojmnfT4T>3R05_l+0ZzD@3@@zMQi8nczz#a%Usd zxD{UCiO;{H)SM3_Q*R~>>Pt!XtaW_byXwtrvN)}Z?|q0*e2@=WMa|_6Yx*`jbv_yX zFi!LH(kvIp=4I<}E&3E~ELOS$)%*Q!;?EVy&l2?WP&wLS^zlEsnTVfGGM2N9rR3SK zk-x>n=-<)BEj)h(<9#P-7vHpo_tJ8Bkgdaqd>Z~tK_7Vcp8V-tGWrGDrKXgRtI5oT{y+(uSXBz z&5iWt0D5yU{e6+W{G6POCbw#Z*`I2Wf8pyTBy>f#{JppowkTptw2}JT{&b+rdL2$S zUKYctlaQHGc8ImRRjlE&+3VuDzu7K6Bzu@Yt!J+es+uZpuH^HK3EV&pjVrD{vBu(yZakT$>J36>7X|)_$716R`ia?tD4l@o7M08XANPYtS-!; z6LsoVX_h59JJ6HOutv9v<@6%*x8*ZkY~F$5&$2^~* zHgG=wGFSco4gTnOHn@|GBNt&SHSbT_X1ttk6c||)nr^v^3G;GfWEzyhJJY@FYC`n-D1tpAQPYS zH6`=^Oy0bR{}Ml_G2*B3EbC`~JQ+e(8qj`to65DGsuiWaa5t z{>6ShBfh_cJg!ep)aJ7*tETAxRI(;AKE@jFOTW&u#{J3Wv*Pbp#oq@OKGj;D#ZxRw z*Pcz2@Upc&g#~|}?VCn+j>V%)9CHCXeiV8AJ>e(i6Nl<$j3t*VRCS4eqI^j@H`{tY z$}T;l*KoV%u4pbtvJH=@DO^KFt|sxL+5UC#`7LwUjcxCyOAXfT8v3LMLeJ{5Md;G1 zbZH_RagE$(Gjh2K+q6_IPO;H_WMv_~{#1EI10EH1igDIp zE#vRzlV@A&Zr`2l-G9VM*n}P0gw1TO?izN-0bPUaS& z1AWkKp^?l@lY8XhW%Z1|$kWo|ozL+2aqIQD@4aR$YvGYTOSlpr7crJ1u00b~^MxCs zZ>;-3`gc6~8@(yFew(f@K}MfKU!cFxD9;~@=33w3WOjY@CEAwk%G=eDGBuVgEaC56 z=GV`-RzokMWz2mgv@1Fabs)9c@Cf+hVpX15bYKa@7 zT~rCTko}(G4P(jqsq}OUGH@yxJcZnz@BP!+-b=)8H&wTZ@jJ5P#Bz^{{XV2aORyb9 zjC?vCG|;PC%=s?!yT#n5S%=?@Wo&hGD0;~I@t0%5Ou8J0foxKlZX86XR;L#$TATO0 zcWZ0&A0NF}lIzcOsa;mW*{K>IJFyiX{RCU_qxCwF|5->KWh1uiWwFXoa#X`!-Iqq8 z#j|T`di0c9a`ifPr(4~nC4bBN=FqR_+1K~H=K=cuUDA=YTjP{(zl3bBfQ zUAs%IbwzV3a-u`|nA?1Rke_eRjaIheHu`oUyLS?sp*AWuuJ`YL**@~vNL0O?xsJk{ zdC?3#h)8`m(rb*f1LRrl^t(TMa<&+BCBq@17N?@f3=LL7ZUGD&Q&A4(VRXD<&+ z+T`3(_K>k(twvv|p5!@dtk&^zHeq9HSc~>k4IU^m?&E#^z3VErVNbq(0>A#Tn#)P@ zwWEChY_|G#yc;GyQM(H>@o%8I*ZJ0SgqZy-{3&~v9$!{rA3u%jviVhwa`+kQZE


      lmDQA{&R-A2zT%t~9tZ?$TEVmrAYf5=X>nqxV9iVr)e+mEDABk-`6uilAXJ(ARl zNjkIdjBmaiwaJ=)KqhXoP80ObJ|ausS4|Fwk zkqbQ_9$Jg7Iayr!t#>sho%vYy@e%g(EjrUpNB2=DZs6bElH1)(W^VMX+tYGByLwt) zOO6+3|J9`RMAPhEJiAYPxG*1elfG|J7g;K4$=5QDv(;%MeEwB@ek>ckz4-D<`gjf7 za#3Ml=;XoPv>KV&91p8K?>p=Jv^9X7;6rNhwUn*H=H9{P4oAm`akj+Et?~3J@7x6a zj+*(GCB>k9$oxfUR8^mBeKnnp@m4J|9~x!(ZFKfCJk{HfBR0#ir>ecCY`Olm7-LoW zvU+uPiM3oct`%R^X19BHw=sNX9nbO354?MXpBu={#+cXiDAB{NWG9n}ad;-z_3V!P zAH3az4-&uRm&=826SG#a^OqY#U-GyV+KP@IXD!|}o-zE-jd&OHhd;}Mc4Gs2#41G` zJtc|ge5$uoi+6lE8QcjUS0{g8vWZ8Mp)bXOm&mhXW3NP6b`;%uSUqJuwWCL^?E>Tf zkX*O;`^I$S7krseR!s@Ju@x(m_r1k5<9$|dKwl`%tJofOfc$#0KUeMHqw4l- zRP_|N8~GvIG7!I>iCSS9l5iD2f4%Yci(1HLC0l_%{F~j~+cT~5-i zk~-@#{NQeU;7xM1S$McE8`4F#PW9fms%v2?N^-|iwh`G|Q(fv?w&8Sgd<_{sNsjqU zA;)s5h2`OEqRaFYRuy{=3)ARHl8-}Ypo7ij_=q0IwQ4e*`2;@x5jN>M@y?){Ha(Ee z{6W0F)A}szZ+ebm!%Qu;PTjkkj*?aUULdaeif+%BA035%$0wP5wX?uOWhuEy==_WN zXR90Ai~41&^N}Cm`E*<9aji3KTrCfcSpUm_* z>hja{e(qDJIlE@Enow)FOHR518QaF%9^reNtDOz@-AQ=9PefkS>H71H`|}0!@$qRf zD*KWLF-Fm6Sd<*D&v$%77GGquwicIPY0VzCP7A~-RpO2s@x|J`o~YTsTHrULY*JOb zT7IlXo`${BO1@WG7aq3WXUZpv*kC2RQymS9c-93;5*|!az2h`2N)D!ygS+u`fH91h zE0yqY0bN;wO(+^^53ayjrzsj`#ioLLl+ODizzu-0FH){(~9J10lL`xV)kht@^qJ6>ovT% z)%g3$0oFnrpiPZ?U(ael{c4)kwWo%YtoieN|HbCK40~~}+UWWIJ%uLr{VZ#HMqDP(QC^~>XIneHu>2!3Qp4`N!)HzPyuIk)8RU`f z>fM#pbn|d6eLu*W4feb9;to0->B*(}py~?#x2s3xs$OG!Lt^DA=Y6+KH!{yS}Fj(!entp7Le>IUh zK-@{k;=EZdb(|dJTx(qT(fi5vW8|d2IqXJfjw0uOk^5V$TNQba)M1Yy!)IBwCq-vF z)1RSi);RI$EbF_qabFO(@ryAGRwA}e!ya)**q>}Sk^gm!2fi)5VSFn^E#YrD>b-2) z_2zwp{Q3rehig*{>A)lX70Fc@l=Q=j$89Lp~2kc|sf3qX=@Oc@$9qhej>pLG^E+;F#KY-jn zYV7cF0X~i`>kRO5;<}hkPv})5W>07Ue2?+!m9l+&BR;~%1^BoC9~a=`0(=~a%k-mj zwOTkR1Rtla+!gwI)->~&k7t{~PxSG8IJp2P7vSXN32kgxXIPx9ifICzoV-Y#TK(mF z<6Ky8=|1zh8{Ni^Y)4iXm`@`;_`IfFueVKX)CqG1r(w?9p^MG?1@UcvasGPf6|`g8 zo}cLZHE~Hjq6Ej2!6M}ONHkNfc!&IKqWED|`6xR`Mq{H4h_hjn}H>XA%%UfW!%zc2lzw0^U z$lMTX+((>wsOSG2y0V+)g*%h&v0}U)>vx^`p33JGJqcL3aCy=rM`_LbdB+eorGehv zAg5f~^I_xk50U^MXRQ+T(^@{bI~*k|KFfF~uw_@X`vu;0TXDz}BovngVlQ$-Cgq3iN*m5B@ zZB;V8nKZ$G`nC5_`Z?<=ruulfDY;;J3lj_<7TqT=A))Gf|u zcgS_t>i37UKew=1Pa5kX-uXt<8s?F$UBn(Y>+jwvr@jm6GsE>XgvZhA2p&4TUDYJM zZwiN?qiNzeeA&nR5>!pL&P+3X_RjDQZC{(-oJL-z%3rUL^DQjaNXS`HU-=0AOx~X4 z&nKYk(5vV&y0W2|YKl0!Q?9WMUq8do{b92gRQ2S4k;8M%e_8Scg9dXnUF{ZDn9cuz z{$9a0slR7Gim{)7uenric9=Pz4ZHS%H5e>bgG+*2Xt2f;<+zo6OcdoE^mqY14sknd zG7KL3dZyaIeR#AAKgJ(et8(_Ke-AUy0^eEC@=+S#!}#A)SetEnOH6q%`@I=nixabY z{-G47Szr0}JUQ->cq2a#-^LB9nvG#4d>kOA*ww%KsQtetmzpoPXS?zN#`GzAz&@A{)v&`V;)=iyZJhO(PejR&LM|X z+QQy=_Bi=m#2V-aX6KR7$U5vN4mnBu@tBzXMWiOA4&NYuouGe`!P#|%Esd+5U--!L z$Urt5k4DKc)z9?Oda^G1bSs~`ADgfpe?NyEYbHOF(Ear8U$~&v>E1*-w*{Z{r|~~a zre@KBfq1rzxj#gnwoEHw-FT{+NCW%Rs0QCe!<)!Y6Q3~2%GSYAPhhKC@}JmKvJzU! zB%D+@G*q%l{u@pzoI`i|)0HYY#WQjtc`_TB=G)7okM(Y`Y2HGvSEi5Wu%}DV$uq3k zk$8WwctoR4FE0(SPT}x)GMP^Tj8lMd3NTLaEDhq$Y5HZ6{RvUFE#AP8>Pyl&JQ~8r z#_A{|#C?CsC4VxDKJ4eQo(uED4|Im>$pl{QIerCt#*YstNV=@tEa2mb!qZTp5vV18#lR7IKL08}P&RKlIU(vf|*w3qtZ4BS%7z=gIO8!k8!6K?3@)ajrk3G$G zC$Z`QY{Fzc-8~Y0XJabz{pXXG>}xW1sC^w{i~6B>=L9k}DDKFo@}o<|6}9p-zzKyn zd~aty6ILipOdIucn!;dl*W%=TFe%=N&;QaIydGz;*hzL3er;e~qNF4Hg|BMy+-c_2 z!$p?kX*ARv*hY1Ty6~Ups%xk>HR=;i z;S*-4F<02%O86gymycE>d6qx>4Ufhrael79Elt)A zlmov&clJQ=DEV#pJJ9c@`QAYOaR+PsDcLFF*9*vhfmzxeZLVf;om}rEHV6hGyO{mi zre>=6pf!BJU+qqASn(p)$V%!!XD3N-O<9jZew1d*@nPGrH{#}OnCIl^JNe?;?AZv< zvwwih<#LBQIH)>!s5*LAr-xauH&ah9>*XH}>Tu2aYJIa&=omTeaI~F#Yj3r`%Z+_` zxz+XfSWBL#z(nsSuG-srWbA1>yO9zW9lCB`JT7cJBqpmJXCl%g~_pJso0~oi@4?vw*Mcw>_BUKk8vDf-bcvs zFO!F>F$DVy^y6bOlAeyV*g(s5RmD4V*Mka?LY}GgFhWC=e)uRfWPMXhP3${`V z``6ms!M>dkC-k75A8!p0S>t8J689PJvY}5tlpibV4p*TWY8J7&#GmFSuhoZaw0CPF zS%7W8Y?q@1(Dv;mb#S zHvCj5_}pYXFi&ubx!sUC987B#*ljH|$JuO~LT-*Y!c zdm78y;*L}OY{R3m`WU~n@mpBypRKESKHDs+Wb?$HH{x@hIbG)&Uz^WIYMrg>2dmJh zIdP|4FA~eeaGFUkHtu2eWK3Miiai^5(*N=7&@wgZq4@bO-e$%TdCv0Wq`(SH_x{tX z`>As-lrI{l!{8{`ZYN_`cMlI+4lseQ=R>EjZ{xnb0j9Yn@|w@!cJ%Zc83 zBE7wpZoV0Jz{Pgk=aQ;V)aC=&#NVo$5YXeM_nox=DgJ%~b!9>Bc*?VBDFj3(u z@#{)(A{F!gC~byKnrs~+IZ6!UtY#v&e@6*_$8_GDr2L(4EwVeax}It-vz{cqaQd8Uj31Z%=Hr zXUzA`ndH9c1=|B)Z$K$;VJmJW^Zm&4NOLaw5|4Y{XXXL-6k6HHB4&ks3b0Qw$_>_b zg7?I5?oqaaJa04p{v;ImkZbU3dYa1f+TfSd>?8fymBksahy^y{_ZOGXTn4kzte(29 zx*@Ed{iSMFV!ogFl;yl1E=iV?sTafNRrO(0n%S7~KQ zIaZphIpk^%{9C8|tuvpdmh?ZpwJpgo%u#?jf~A42#jEq^&!_AJ9|!|j$tTC{Fey>q zsc%2X8r?$Im%*q1*sTBTp*@+ES;w4zMgznj&zbke;++Dk_N!QCOY>^>a~-t1+VQ1& zEE}Sc_HHZzleH2u5BoQo<#Bz*MSZhf#5&<4S54 z9r}io)c`8twFGvW-)<9=y`QvZzsQM;JvTqml_TX!537Bw9mQg(Ec-~!;}DgEz1XEu z?BeVAws?~GcLgRgQoHLi|JHDdxVy=`V3-07lYLo9fME*kk{Grwz%bcI(GXymWPwd` zmu5QHx0hg;NKOA@hq`^laF*hX{pi!p)>3>fmxy}z9N(1MCrvJnV850jPp5h29@TcM z%dh&;;g`g9-;z=Li}Sm!Pc{}a*_Rql zH15C5%GxyPyG3~ov87s;*ow5W|-RLE*6KezBl za^FYH2wn-6C#B;haaU)!9e>Xwrv>hH9sP+B#%yn-xGv2X;d}egC4D<}h)iuHr_Y_@ zl9uq9{Nr%3`+nv&i_L%4?>7{KehY8%qu;%2KK9&`>o~wC1^A>eQNFSs`5%G*-&M_2 zCyVUY>VyNX(8(6LeH6a(*+r~V7u$0WdJN4??YU&DX7B|w(S_&|bSb(5-GFXK_oI2{ zRqO+pgYH51qWjT<=ppntdImj*o=1hvdkMXUUPo`C_s|FEQ}hM;8hwN2qwmlU=tr~w z{fd4=f1$t8zvSv6B!0u=IN5 zeUE-XKcb(|&u9Vq1+g`~c*@`X{1g3!)G+MFoFZz$hjz?$GUA6uEPI2g0Nk_gky*-r9 zE}LX9BH|jc)!%e#CH}2eUFQ(>xuJgIg_>@IK2aaOt(k3|lAlW7&WKvW8VO_$yL~S? z-yh9_S9(BRaCMqw%gI}p7UM0-pIk+M-j$@ zrEzP)A0$RGj=z#hzJ6NCK4y3J;|IqS{wgi2 zGeu$}HkRFi1Jl#!Vh`0KJqHG?SN7HWHA^|GKT(><~T_#xOgV zzqwTH|4F>7JZ>N*|}{z<8JghDs1!rJdb{g zUFxh?eSsH)QCW!Xnyx?D1KU@p?l3t!&vOUy+i%rOlB-0;J`;P|BQ;7j9d`IVwoZKF zzhNfDSX0>DLE`gst>po7co?&M4?O-|-re87;mY7ADr~2^OI*pf)ie1YKX8~eSUGOV zFXPjfI}c_rUsd-n&aSYRytm(YkT=$}KTcJ1I$GQ& zR?VG!legnd5ev;zOI+4?kH*hQV(Izj{~y^@BMES4Fo3nezB_&U7MPk;eAh0oh+xQ* ztPgpgN$#HZb1gNaC+XbtVz;xz60<#{I12){4DJ#ZD@nsa<^)^TyI&Z#EPTv2_L1LC zwyvLwm0`-{?v;EKHG(yL2d)f0u99u!@7sx6iry+`x@Zq3TR^(vsr#Fq%Ou^$0fu#yR%7SeSWl_%W3oj1}(s#!35_42Ca90Jq%iaK~o!V zm!m{@+o`t}7d>~y<1$=H9KH}!{G-S6x;2Lf=jxQ;m=MjrlyrGs_NI<3LQ=J+z&OwVFRHFdp+Fg%$^j^WJNX8Q@k6fxu=V_ezu z7P7tzThCKH>q_f+6O8;4Y>7UK^OwZydIV#|O8ZBZ{IsZ3JtY$RNBSm}{APWX!R8HP z#`ea1q`mdVKU98jJ3h@|V{-EUu$XLhax)h#C!UEyot?zd`qCM5v_oMR%qZ`nA_4i$04M*Kk0 z*EpLmXtB1(T3dP)Mn+}Nu9cr>&Z^1OMV+7GdF^ETDROkON0Sw7*ln17K2 zFGhZE<Rg50{33?a5a-^lwx^btokB<9<(!L>^zNH0 zFgNgWdh+E0(-NYjoR`GTW7w6Ec+@|sWK-E3*tnqQ>EtbY{`55V!H*&i`-UvQ#)VbQ zSq_@Lj-Fs&0zCgF&WtK>>dRY`dHmg0^21ZDjdMIClIb@jOf%Oh6W3;>3AfdSqqziCDj(HCx&^ zUmzD_)%;$ex9j2glVS-qH|NeYX8q;lhvMZ8^3Qwt!Ya?*!e_4~D-+nZYSf87V9&(C z*#O_&*LSC@<0RsnFX{-B@B)?@&sy`H=-|!dVck?ruO3&}E&Cr~m*BQg z5$kVd%)8N#4zkgg+*gtNS?ugoG1vk64b#!b{LwV=-}fl6Lkp`dtYLibkfELRA5ODo zYx&uZ8rj?L$I@lm!JH4vv!#rEVf~1UQLz`M6;%*?fqHkHe6cRu0dKCA*RNrY zYoRhKc(tkc>r(Wed2b>9>Xheifp=|k{L|(2u+G`K)+dC2jI>Ya4tE;Xlb$onNxcX0+&*ffr^8`$Qeudy{* zygcfl-)+6v)^F9R2FgPRT1z$f-ZMNt=l>R_)9UcXU$XZ+gN2@I&TaYb`YbT%>_S(# zhwZf|hTm^3&gls6kh4wcRK<9T{NOV7{tN#5VB;!!#x3Z3ap%_T_c?ss$?|}HYHnmZ zyOxcIo#TTNv1O{hpXM7xZDcpiFHhU^Gx&*TV8`uJ7mt+eW72a(i=)EVc3YpD*^xcX z-JW?qB8EL{ldqTUYmV}ZJo9tU>~BmX)C^Y>)81iRS6G)l&38F=p$T{YM<&;yhkw&U z^AQ6#hXcr?J~|von%zVefAD^JKWuF&dx*?!LH=%_*MIW~5Bcs*;_-*99}Ev2tN1*8 zBOAL6Kf0064}xjlNK6W+$A`Cu?V@sa1$o)ZI7X%I;kufcV!KlQgt%fTe!VST*weaB zBL}c{;(#Q;+KH`8bdL3759eEx%NZkQc{yW7-Hi?`OV$@dCzI*^>O!ZA%@hokHn{5wsgGez**I+H$E8)b%`Ci8Nc-&%tLM1eM&K~6D9Qi`GbuD>^ zdUAlbQ!j_d3Bx!R_K!+N-eR*-a__$dubV}G<>@(FkE|$Z;DOP-*ud4Xp zOuB!fbzL5o_fqlaa`fa@@$-w;Ui^m4dUVEUtBzPqmZ>>T5_&rBmj z->@$~=_lGdl?~y$^y!^V)|t&G8}q#n9?q!j`P8F?hg0(@1$a2Imow)OJe-_OKb7Bv zhjR`}U4Vyk_Do%Xhf^QwQKvEIC<){7;CS-vT$}t7HIz5;|A(YC{2rHK@5(v+c|O>< ze`Z&mA)0@ibmS{riz;LOK8;j2QuQveo7fOmGy9T^{$gF=;KG^YWrFXlDgNkyz3`p< zCu{V&bzfDivk;lznf-YpsbojRd2fFMwp2VW?oN|%Q&I`Pvg1S8umY0{*QO?y!+yi1 zn+sf9=%;S6FWJ4DZP`IAahuo@1~{7|ZrYE$HM8{t&<5yAzI|1+0>9qM#vQ}{Ph;cu zV&e)sHyy@cA-;JJrM!bspu`;la$3O zQFax(ZckNjZERV3Qbw!tjSurZ+p&8;n%k9r4pE0Wot@}1);-zP5BZ}d%(d9ZF<#z! zzg%p(e05uOv?bsd)+Fr-dv~mweBn!v#k)G#2xkDWpS9}XB{_bsZqY;cDrz;g&P!|$ z`-wmJSqL*{C(#RdHCTsQI09!1@XhdQ_B_{#51Yg+WoH3(sVPTl+V)kDu>$Y#0*ply z-M_>;hoEziGc5HNYV&dQG56lp%;hO_SQQT|_%zhIPZlFo`Rpld$z9}n13Y*Uwekh8 z(%}&`(_u8a!r^pn8MTiq?0dMH)jghGxAQR<_}=m{Umv%q9Y^`A;*YcNHf2km^8V4D zbH3-jNoM*Zb$;hKWW8sC$a%yWb@*Pd-_-+8RE85s>=jM(b3J2(XUtQVT8w=@k-cZr zv+;6~yHaOVq?PPlK4mTa@>l5mV64u@TW8kfxAV6rTf+~mM;lwTO_cbISc<%@E(e0mQxh%gk*Ch+ zRTHghgE^G5Teo?1@;`sujGbW%;eT4Q=MrZr^Ec;s|MlXgJ<+Y`Qg-DTwSk5ChLQMm znsuAVf4n5O*^%!)Kz$<!a5ey|2vvF=s%eutqtIb6wWQ zXCQhq^$Pn<>>DD}uyXuRBqoc!J1)-9(AResnC}f{^S;L0;+(Ym_={iI#CmkMn%7|Z z4pXPc9_yi}*|z4}Mn;aXJ~ta{u?M3#%b}T#nnB(VaAwUD_;@Y(dYrA9k5A4xQs1a# zBfM{SamWdt{ULj`279t>RP0u=4@*7sf5!4=5$B3$p2W|K;WYYMm!eL0B42V`+5;mW z<*$gJ-h}br!1tD9V-Df#wuU==pS`<9zVRG>T+1eIO;6$W!kTopU(y`( zwycCEqJ%x2Cokz_TP}o^+1?tjVy!;c2d($~9wVHJ--F`RSzNVpGD!lh)o5M5!n=dy4CDN5B0AJMJYtQ1L_7HJ z+o;!sR`c(j(Pd(qLDmE|F~BAk_{jjP5a1K_ z@A)Ej2R^YlFN+`7Z}vO*!~mZdcEJB}afQv+v#d5VzIThHl6@ggEqd@Lk>|^kG`~6N z>fO)$DBc~#mL1PmpMWN-wHGrRF*ZRJN=!^2Um zz6`IcM|=s{e3j1j&{ud1zQH+8;wJmuo%h#LoQuqEB$>QF`vUzFcQ}uvlHZ5lFnwyf zZTk6T=aiK7G+V@Zm8?Z%+4v6OC%<8HS7yWek%19x!}4;qFRcR{vAiG?Yv<0P z?kaGxIc##?9_9JNes^q*S~a^dgDf}6*Z1S&H$}Un)15Do(uaYt=B+wc3yJEAlkXP~ zZEAy2VAFbQ2=HKXUHi2VEFb(>PDXNZzB6R`a~MARkDMi9&L#8uiH;v@zK7ED>2%^C z^ZJ}!g1^%*>(q;chg5Gm4oyH4$;4rvHBUYC^Xi$_Fe=X27O%oD;qleh6)rC-v*bbpBme51|ys}GnCzeJ5U2EW#`hXX6x5S&iI+n|Anq%`-^kxhtba+ z(0EiWXMK_Et?xVA``IQp-OBfz-H~l2_ufVwPoG&B?}bIyz78JINZ&LUYi)=oM683JQ$OFticc1Z|GG(JXWY znxnR+#!B`Y@w_oSj$TG@qHocU=nqu%*Y7~@qmR(1XdY|1zWFYlR>I^ohZkrr>hamG zg$=NtyU^o>>G3UO>@RC^vVA+J;e8!@@uj@~UVl5newsV*{kOv3Mdjjb3HyrmEfGAV zwYOIY?TK&B2!a7~<}=>48T(kV;_vML3D&5GAG|~lcVBYzGCe(xjc``Dy-;cXqxfTd zRFbEwhlxFE_`f~biw<;w{o7}=r(3YqS&bUBvHi+VKW^-cifN`>1Nh1SUm4&l+2E2K zm@VkPzF{-79VC-g$~BxiFuhe&=g zPwlFf&cIueu2O)v3>pW-+z+5`;5=v8#5Vf@>+R8O%*KfC&Jib!pm#S~H+vP;ygQw(5cT3{j>6;X z(Di)bQ-1$1d%ceQXM)icXKwCQ*l+V(J8e@3Ys=o33;)UP-zaAKM~|V&K9Gm3{fB8+ zcD}zA`#8q=e7iO6M%78leFk05lIq9?8~dXA{xY5=f)+0l4CLO=Xt^_5-4348F!ABt@@;h!h@&e3#tS^En+LWiB zvQ&$jU`B@H*W-AVprWRI7kUoaYmryWk!#QnXb*G+x}7d;j-ThD&rp*bZv}L)*tWn* z1To@hbPKuz-Hr6AofFfb571!GOoRM$QZJ?*E)fRY8nbV3iEMPMy=al%PYf&2lFc@+ zyXn^F@}a~1?WeSopAt{tt1I~*>QVTlPmt=Rm7Iw>M!j|*aQ7q#|c@%|wX zJHZ9-<-DJIvI*N4){qss@iE^|9jpvlKJv&`2wV!wOiRl5GI7$C!7WMz* z&G}sU;^D@2DEs%Ny8Zs1*=BB+!fmdiJ`j7(EcT6^x6%Nxu*6?t4bOzZ(%W~pK+Obw%S!%w0vl24b&L``E%6-;PBWJI`lZ)TC z#^-I&&ZsyC`9J(C&hnJw<~Ohhm#_zQY`~CI%}O2Y7y7=pyf)>JiZc>^r4KMx;Tdx{ z5WmKzb@|f9vIAYdlb&wv_i$F?%nbfZylIXb;}g7g8!JNcn_?p?X;*8KR6ey%RpTZ#;|p!el!BfJMLtG8zWmlfc$+)a`N zxU611gUjm0O%^pzw#Kzq z`)6OIJtNcXBQ58vdgeBwfns0gs(P5!p6Nb{aEg5M4}5{o5?{C2(&& zrq`C)IjEoPtWWXEY2@xhGISZgw-a5fl`p(NzNc4DW8+|O*_%Io?|3|!E5_}oURp!{ zH&!#v`ScULYiaX@+3MZ@0kZ|4G(fyO0DgBS?P^imEVJ7ka)vhhE#ZUNx~=HgC~LBw z{Cg1IsU@qUH#qZ8r5IoO#BKR>pX;b;Gp|;%(i*OaomCWfz>!AqlX34pcQ`9+T!y`< zb+%Q;zjeqrTF4WuGrPEOTqo|W&va`8RjN?f(-1)mVZJHb{A_uWWV9wd2|&a{i2CFHCsv3aL>a7*@7rjg&n=C2`_EqW~ni(jTh zac1w2I5N)VDE7thC1gh27T}zm!{Sa5KNk{9rQ$@GCTHc<>rFH`FVA@a2%gE^0gcwB z5vHX{&O9ZICFdnn^nKPc&ljX8r>fPg534^JZ;Nw6LfRT`j4SzUaoaK0=Xbf#_N-eU z>*|l;Ffl=aLAs0_eJH-Qzc$|{fvHj_8fu?Fz527>MR-0+oK2brm?OQ1T6Iqt9%F_% z3h&VSh0=<as4Z*k)>>SrVI{u*m?R%HKMM27Tpi+;_c^lwA7JG<(?^9|LFoI|UIQi0QM&0b}1 z&XcQtOCPT0!$-^KPDs1e0?Y0IIwD)+JVui|eDdJb zAApuY%cEgv3$zX1K@-6{#P(2B@~>k1W5|ZPQPdY(v&+n56#f2^j4Y=<_JH?YF5W46 zpv771kE=Zo7f&5V=Et*z&xs$`;A@VpF6Zl$zY0D+CGJ?7z2DxP%4|wedmk*;bgz|u zatB{k>b-yOKel~;a=jh9=A75;9&7okpD&St;(XyTbao`YxP{E=KZZW3ej^*vNFEH8@fvPW{o;J~q1d-`INAM!EbN5WW8!Jz!b;d9nO;;V@^<4p zjoduI#xG@j+q3ht(LAxhnfliKyziDYQ|ELRmj70(${!a)scq)#q8m_wN4){vuYR(O z=dpG9@nVi#eAh?Zv8sB>^5W=Y$ouQ$eRk5}>~{Hxdee4fV-@lRGZbKk0?bhOL0=6f zsP|5ZM)K0h7A|Lw*UJkQm@kZwbyl+=&sB6=okA{F3P-?z9LNTJVSUcP^Eawz(&Lza zXmtlb8(fL=TG{0J{Ks3?Xf(gvNgwFEUgZS%k+S`X5qpz3w>Zsu*q$%>hS_}6IPzHI z-!*(ug$=(I?Ja))pJ$!G4;^pqrlGyn6f-&Eg??VlUTw?ftt}_oR!%g9-5bEJG>X^$ zGp=Ia)++c_#+L3p6HzBRjQg0pEx@^9Tk}1i`6=x zA(wlL>DFSe;hXf~D%n%!RWBaim5m!9?mE(*?ZRfmBUyK~W}m&Xx}4p>M#AL4*ms6H zcDFw-!6U-sIz!xZ+~pXq^u2dHYlbn;v&OF&qqCEYn9yEAXURmF`xUdt)Eo~~r8xy}-@(5Ic*%C--%LzX z)Vm+16WfyWm10;9{%CVK#bJ0hT>oQHG2S#WDD05_tMl{NM%W=|omRrNk#j3N=MMEz zXMhyA-LPxgRp4Lq)9L=l_&v_^zY&8@V+X$G2NS;J1nZ?^@hlwg{iUnw~V=GhN3WJ{^uo4%aF+bIy)&!4L%)BG|-Q`@4&sGIeUl_GzH4 z`TnWsBK`rENIukumzdm(d;gqo{{e32C^G5ZMt7r3bdOFNE>A0DC(@^giyj)>Pp!O6 z&6Q2Ql)W8BUv6R3?xD-}@aOZ%;SO=BI133THSWa?j$lV0H@+S=`!)UouBi9yX1JmN zR}{oL_6FyAOr5ZvExEH)@{_!8Q8ND#-8+Ddd5awt^Y!*w7lwx)P8PNyXYOC5>uGN+ z_@q3(#oCwYiyjngo4Y8jOFw^K1i`Xr?qPIhY023>rObT>`pb1{#C3X4a%=1D9!7D< z1UR-b{fgKk@h%$+S0u)^Uxv?yE3#*@3@4u0AE=Kc23(s@dR@QvJoft)>pDx!{Wn{B zD4+45*tyvA^B6n*l{jJ-wrfxP*q3iA&U77WU5h&Ty!r^dCGSbtsiN>a71cV+VK#Y|kou#ae81(Q9&dWA7Pl?Z)?w80$iIu!b#z>v2}FJ~_Jw*8^t*e@LESdIC&O zaW)qGE&PK#uBaWt^f(j5{i#)btknPRJW@IP7@UxW7^Fq>ZnS)H1s5dB7hvxW)1I8vUd_eC9as zQomAP&S5<2U~8tpTD9=mY51BweL;-fAgIb zr~R58_}R*)t3T4C`{~ZoY~}XiwlndeT^_Xsy9jsY%!fKTbiJCsbGyj*80)ln4ZOUh9h6|CObS^ z4)r=YStqV_UPmpgp!*H*-JOn^J00~STloa_N^7ReZ&E)M_FaFjYj?SCM zH#!e9C0|hkWpm(A!hqD-kmfNC4T;=q6h-y~wc1nUjtgn5||7sH4P-MSPONjJuhT;F=Y7uZ*_MArQ7YSY``9J2ilr{f= zu8-hr&L=PD(v|VP^BO;~2pif@ZUMIyeirW@YYzjgWmuW*DC*Q-MIGwAC9+co52_9% z?@}oeN%WU{rI|Y*-Ahx8C$;K=?jA($fD{|n+Uo;LNsiqCnO$LR-?V0TTHon-=?+M` zlxOaM6!*bd`Q4f5N#qVlcMR0&ZPwY>Rp;D;I{TmN)Xrhc>597_)i&zkVH@0`+Q3dV zWc`tQAIV1}S!#5Cf1k{~kIn%pyZ=HzDvGRUYxZH%V(*UFfQ@qJW7b4Y8vX4<^7U=n z0*`J_M%r0m`qd+n{KBNtd)|pViHd$8ESMfA*_?x?OQxOb+-hdA-zKekg=PJlT6F;X zW3AssX(fA2?i}+=clozF6SJnM99EOxRgpV)C5nAY>iG7%l8;aDOst)`ClN+0$4C8l zd~i=<=AK07Z`IrTT`#Y0=*66Eshc;*_o}VK8*!WSMHwElwYYKqW1Q|q^qvgf?c=YbvYon&J z2@LsB_)+Zta1SADQ05-3JaZ4Bo=Z~TuHhi`gTxB3V*GNgI%i2;LuC`*=3@G^wa@)a zPj@1_?kH5Z&ET**vrWmz=5oYu+4W+-chU2>f{x6mBYK;9W6l=x-6jMZ7UZYyqvQ+3 z1+Zc6a>(q}a3_J9##8hNHcSlaJW%;$mCwP21-LNy7I)wvxG;MPJB$5?&K!a<^`1}D zvK%OKZmKh{`5D-+0Q;prS%SxN$Evk}{p#K04g00n2cIPlg8y~Os79%Wg-P}v4wwuF?xDO9zsl;yG z#c%v;ZQJnoaPPZP%mb@uL}})Z!t4t@uNBR^zI%bqBT- z{A=QZ)#V5?)I|oNacI0+b&a@SQ8Y?y;5HmJi)s9&nk|3eu!o{wmAQk^8Ph$m;Lf>| zr>rFgJW)LM6B+#!t(?@#bxL}bCB2kVeuFr_IIqv%5NCVlVy=4Uu++n;*1N-{8LnZf zb7G<()>ezwZ{{NoFi*HIJ&n};I1yjcnKgUQKK#hfe#cjYb&?L_YRTMRsBh59COUUU zJ~f(MUrjynJ30oV72vZ1d{!@JA2ti_CFfhZ#Ny5oh->XRE4fQiFV6Tr#)rMc2#?UO zzVfwq(xE?bka&K<|c8kA{#6gw3=t~y&{}s6wOcr^l>-8-#S=P|~Bl--T zWc?cR+tj;@J0f0#R~hEL?l^R2u~=L`*txuVOkMD@_LPvjfpJIg{mtLuDLj^XVetlf zMK|EFV0_Ckv~BEZt$eFi4%VLUY7Gv@%X#*A4fEO6@bT@)`6Rwm%eK8ve}>`Zi|A7S z{u)mwv2%-%L)90UZs&%T;hJC#JhS4NH?TKnS!d@O$qQ;> zRO;cG`lt)XVjXst{5Y3Wod=$ik1lY(E0A6N9<|Xr`2IS*)jD{%dVRAVxXOxi$(+^d zdCQWOU)UylgTqMi*H-9yIo5Y^r?ZlB=Nd%?zBqFaV^-A4&q$KYJ&c*2aIp^hMVWg_ za(8NW>GwNFmMyk_F+W*P@<;kzCw{w~9&Zs7QIin zCpmBe6Ql?BCSF{E2Y1PdKT(5%v63%$>*KV-T(`M<#r+xl%j;@dlg&*o?QD;F{WSeI z_Wow{Hq37gy(#X~aek~jPSgTFYiH=3n)kr>Px4uT-v80355jGTayO&X{+#U`! z_oc*RFUp-aU=MkAH5>QRiJeR4Uh<52r0#o`v(9|{H+wKaU(DI;cv`l;W&NIdvDiE| zY(4A#AgZE!r^)jkB1@Oz>t%72xi?X~;BEo2A^a9!pcg|1;kVfLZgSnj@2X#tvCZQa zXWzNY#b=!*Y`?fOCdlVy=5e{&Y+tr=clz^4(k>P(JI63`7ET#<)HhgU~1|5&eYDBvjMF|a3Az2tLh8D*^JApl| zzuMwL{u;q2rI~vg=|@S7)5$N`AQE-BV+GzqT>3U%Y$LBMS+f~<^r+u2?eB|-72MaD zxvx3SJ%ts z6}eijnmM|Fo>@CJruyDr6X)G6Px_x&{(W({$m-Q8AyBE^lGG|WEhXc(2Q=cv3{l$44xV`m$S`xWicYIQ$U+1(}ypRIRH7UqcC zm-gNQ6S@z5p3SaatPWGiJ;TEcL1bf;qPxdt#r?gG{yrfV=o@X_Mt>OMjKYM%)ljvD>1#tvH) zoW~wuhJrm*a@abyr(RvM%lXHiOaAXP?_aEcnLk^Y4PKYMxY`=HchNpl_phh!=!rVr z7Zu6D^f-{a7PA}4le-p+UI;q|3vYc!iw!rVcN?;qYtpaB`I0#i#3eiQsG3-7RI&e} zO^v}B-Ri-E>8bOm)p@(~mDqE(FLNhi=1xRd#4;s*A+(K$*}>QOg^^_i-UhbPZ7fxM0cLt$7EWPKd?r7eyL~NS-0ND$70A}hP`c);h_pBH1>JC7- z^m_Yh8(|Ib6$5 z{KPIilUBsn9rha8HxcRWirL-!r$zy@Y0U2ZQ(JTYEk501P2A0weNNYlSlQitu;8WM zyM5iwXOAU4^wZsZ*$`{xZa(KE)Vq7DUJa=ybA}#0tT^w|Srz6Fm!$4H#h$)Mf2{>R zs5Lxm9siA6@*Dj7QP{R(ANuvyuGoLFk@*fl#T~VqstH8w)O~1SHt{!f6?xvD%{mt? z;E&yOpq}Q=LG+A$wJHz#*|B)H4sK?;9+-HYpMlSouXc-7ozG7n*G${UU<8$*@8)-% zeCZn1@^bP#3EztIwbU7lzP~j{;ozM6!)855_fA&d`-ME$;tI^M}-x1K)as`JIa16GyqD1J=O#kTuQz)~p6N#U2@Fjk~XSFrM8( zm*!dn_w%Vgx#OKZIiCH11(MhH6z7uk=EdXKrM2X1a6#(EiP-ENM=h_F>3!>Iftzg!Z(?dNv4NNv6Y9b1|VtmQkO;aiU9*WlHK zc;0~LZS;9dzOfGC<$KXn~W;uF%CUW0j=Dxq|8~Xe= z-Eq&K+Ga`rprp53f;)GHHX6k)jYV_G&~Wnap1o&FziL-GP>8&ehVZtK;9?nTp)=Cx)xX=X!f}>g|`VXA2wb zVQ-|izt3}~ zYO$X_qjRT|3m7T*kUn}hGf73+zPB{&t=Hmj{B|unP-~x33D(y64c7KI;~WbQJDzSEbvedh^_x(d)(`nxz{hN6%YQ*zb-CU z`;A=8HV5}$k`dFaTnSn^OCiG%sLmCwuh~?&Y*L(oM~bF-&@=Bqlz>BD&cjt zGFU0H+bwU4^zLIlVCSQdqg%<)j{NjX=s-E=W%O?`y8A!Nem+{VXP!3G#BUahzgLd2!d@%ZWQ5*tH>QT+W1dZi=%_*u@vr z2S38&IrPMRe(LCH{*e-ed(&W&yPRKBc7}DQGvwi-*!g85aTvKS&WmW^=U(@W>1t*- z@=wM2e6U3Plsn~p?+`MzWHLkE+A6<~)nnT9naq)$Y-N|1^55sH{f#2AE8)T0@MmL< zt;ut`@DZNJewn2A+{@$Ct>`7JPJ_L0P2{{!QP0UgRaOeqj^L9xXhh$*#dlCDT$o@=R5)HK0NIT&ykUx@OY}VKa4zWLzb@d zq&esqvDpXcPqaK)SQ)jUd(b23byS@7ya>H|(m3Bhxv}&`bJ6l-ve+wlFw(EqKem?> z-Hz@;kD+J95O*2((`W%o$jJW4zDRY=+*v-kyXE~3jX|yGa`Y6kKE3Dk*4Bt?&`xL< zv@bdU9fXcRYW!qASAWPu54sZFg#ORbU4UCwm3;u;GqdBIwa+{; zIo2cgY^Jky=hgkqD74md4}WfTEgXzucJmIcudVN_x!9_0tnIArt;4M2tyAP})@Hlb zv8F{o)%wQT%z6CMiabJc7s;vC4C`F$0qa@oRg3H=ac1G_PIgUeTWe=4P9XTi3jS>a zYZGfzYjaBj@1&<-`)9+qSOqQ}Der#)T?qqlF77!yUF@`(43Oz8{4y{l3#o6$0q(l0^2G#dFKm)T5RXJ1tj9(EjC}rseZRwVEH|zT zqu>^1FXP4<1KXuRxc5Pxm+6Q+)yDaqj9K^zWu>iV+vX&o0e!z++UJX@LvRd+bG@ z@Ojk!VP~ur*(zL!Fo>=4J8{mgzGHbYddXhEoFyN!OJ~q;Gt(LHDlIdV&FaaTV*K3a z7h;DBjJw%*zT;fJ#l7^y_V(z%Y|8DPGtNl*njSjYzCIxbvYKaomi}Eh#nmJS_&HrQ z$kys*)F(Hc9n8!n9}v?|RqIXhR(F!ev#J@hIlNF2@FJ@Do8`^s;zd-4&?mr;z=SS=5#!8<*xYCMQU7*E*Je%q7kTW5Rx7UX5zP(p znV<46@D}n{Qt?C@)c#7j7ImSeSD<-JPnC z;jX$Kys77frwe!!#iV+E>8@?a)9v0T)+^xY^yCckWm@X}U0k!R1RhRZwM9oc4aT%7w-gxyl|CiaDgGlL8sfS!eiqeIk;EO5j| zjIH<>XJld@-?wO5Co^oDwT#@Su49;Fv-adbaU=%(h%mGj^B^klT;}JABk?1KFVf6D z=VtdfFK31qNFM-h89vRXa*D;+Zn6fsyO!T`z4zbA`5z>2Yu=_=l>AN$A7a3VXs)|j znuQZF;6&78Fdf#ytYH4ZNAAgbd1jtcj;lr=F**@tuFz+l(ZbK1E4aDfzUz2rstpuE(T@>eH` zzpi5U<4mYivx)e3GV`6yQS$xonKN^R8p-bbzlc@9i>Qv5%FB{rcQ|5~cJWyclZPAm zo^#ZTZ)LMKXH(Ahz3bBDM_bQWk;`iYc6wvFavFKSsVHw->c_9?xf~8l_%3-RGCY+G z<3HzPeeQc6w&xSAO|7Hc5g0(vHmW|D_xS3!qBC(Vm7Ci0jol;jx6C{rE`RFTuE>Vm z7qLHG`Ivs9gY5PE_Ubk7`ysv3w%2;|%%ka)Yvv|wIm;#ODSR7@$rLvQS9vxn7N)!8 zNn;%W&P~5Tku0O$_myYr!ldm+)=wjkA91C(mluIa2vOzNrGc%FRqbJk&8N;*uP#C$M&jBOHFVSD=Twvtz=c!vbn`kTHjmsl^_jv0? zy6EFEU7Q^qeXRp}ubZT%6>vO?a|^i~y zGcC@KI%izhOtRFuXX+{Jl4p8bzU>}o3-`u{5-+E@8cWVMEA$!!JgGtbZz!BDp83Rn zUcheM>zNN9H@;Wfp2ywA-zW!}i^cLV#lqi6N1NT|4&!drYh4Y?l2zP|;VZg4&P`As zQUkBaF%O4{>yqTxG-6>w4an3*vVdnXz^O$H3;7{UzH?)K z!HcQ7H~oua(QKodIJIupe?8z>)W@3AWw12z&2a|QChX+l&S@Xdc10l{F1InxJmtl-s*|m$GB$l7)hw z@FbfspY@=e;LG;>XZGPD^~wu#r%cc6nRb$|#ldg6D|gAMJmriUbOD}6wR*EU?Dc;1 z@~pfap3C*c=6Grg{l{`4_#MSj)8Kt^A3A@0-Qkf;j)HzYoV`55xh~D_P4tZaV;4+o z4C}Hxk-HRTP9H7luw>)lca36Zm~AlD}C# zYem>2{1fWl9dRPgXFBvQ`fY1#Svu^;?*0L0eC@&CiFM#>>8I(w(+vJ{e{!&megD*+ z5Bm9^xqGq3bT%3I3*ES~cYv=GL$}N)>z2te!=abLK&6Ml}{F8E9!+OPraKO&y zBNgh?MR^{dZyBEnkHfF<9Q?ht)zin2o8Qp0dyj>Eo9rn&Q)B%q1QJBlb68c@xvPlOdgNA&z+vYXYNm6@<`%j*oV{k-l;rs2IrBf zj}`g^%*f&6J!t)^nC{F6Vm?*vv?=E~3|Bskiy}>6>&!95qi9byB6}~$2X5yqz9V}- zq#y8M#(IW$ut@HtN8#o89{RXFBfMM!F9*L_^54{RJtw@JI8uK_F(BumUh8)cwBY5$ z2Dm%vvL^ev3RyXs%;L|~vz)_q6}`Sl^QN6^rbYvYP7WUQ_uKQiC((&8b+}zK^))qS zdSo+y!qf3>+IV2}GVz~(OHSM~cr08V&ihDtnH9a;?(FiPo%deOW_fb*p7UAQxo>0b zYVA(99qawyvz{csH?pZuSpT&23!3pa-u;;A_a};Ba`^EgOjirP-#tG&Z;EL%y_)8? z_`aome#Pf6ua5DxJ8&;~`ajS66y1DKQOAK&hv%N=OjA8eYO2oQO|sg^nqmSRDgI8b z-%RAx8N=l9OCA+9eC{qzPTR?&SzF(FQ|_Z7zMR?9cZd4y|5G=@Z>gtiFg)*PFL865 z^k+e?Vd9+Apt@4d&QFE^Xp0HV`}2FBtE<<@;4N7SgP6-A;cRD%{^Z3hu`Cu~_ncqSV(;;w!p#2E@0n{@ZbPrYpY{6kV8qBC-=rA! zjvct~t{w^VBiP&h=-c>CpNUCcajtkG$@g@aI5pb_asTz64Z}q(Q z*&q00HM|O(Z8yBczxI9j6=%T}72*6$-rn=!iVSCn#c)LiT#@4OVYselvMzuAGjfa@ zQV&oLf0)ZX^LNP8OYFy1_U&5sF!t>_8@i{Gz=-Lm9EO9#{Z5z7%J5qjs$A~Zi9SOe zRDPuDx%mY?e|~Er%gn!IBkLztz_REm3{u3-Z%OZ zXJ(zSvwQJv!ESpFSg{0FERioE=T*5jeQNe|z}~@%nM(;{!8eB$OJK!t<;ZkFh+S@nm>27MpTeCm-D#N3Bx7@`3EXhuH=pvb8J%Dl}?%Z_pehWE& zKu-M&GBsqcw&6n^Dp$R`C-|70{F;A%IJtkvb3dD>xJ5f*DqnM!y?vNG?#_RC*1yA$ z$pcms7&5ccHWGF|QE zVJ`EXS6Wp)5##O8reYTUwt1=g+34jReBV9J;WYYqAGU1!3wNk>hCU!0NVxAF1ZEu4}15;C)b2H>ev_8l(4Grvi%?!kBI zvKuQ|GyOc?$MBFm7~V(oMFNa$8Sp;Bebivo>*nx`sQtI(R6EI=auk=4l@qpV%*$D}6Yvat_;jK#m8Ky|}>re8D~);qEUbb~(WMJ^i)> zyLk%uQbf5K>HH%;TF8g#gUnb_nUbhmM%C-3XiFoyIKKph1 zA2Ab?*;2jz;^P5xzB+iaVeECpG~EAn$p}tJeZ2$X6LlXtv&l}^`6Dnl2~3teHl5(i z;IVr1P+(6Yt|#Dn413!zT#qoPRedhvR`w9rqd6j_xfM0|U$dC#`GYN7k9fQqaz4|= zrX%Vl1Ht^CWS4ZjyEi^LRGu>WD*8L+ZrgFL79Lam^Y-~9G0>g&v05LBGvqZP4tGPQcOE8LcIi{8vCdkdpF!CS7m*s=}(~GkKXOV_S z=<_x|cLP2ae-t*XpI;xd5GMI~-oxEn{Eq6pHCVdg5cAfz^L_s~ZZ7e_Eb%}lr#2`S zfs^q35yOkCM}4P|o2|ksmgaPo@I@mL%YvH;4weqz$9_$>UsLid&e$u*(tR5__t(7V z+V0Nz?)_){(LbxbedHa^R_|ZL&pnb)SBq-H9}elYNyR-KIOLX`S4;dVdbBU^h<84q zqv#sBicD@HR};GelFsfa&@i#Jcg1qt0;l zalXg8YQmKmLwI(0OLstAZ=KB#*pL4<;y&X?6z9NjLgp zE5fO;)e*bjv^SBDetq`)1`B7R`9?K(S#tv1W!NF}yc*u6VPaQ{Y0xX20+dnq@i& zCnK(Azv7&hv*^wD$;sd8(u2LnuI{DT-EdTTGyP1g@2^YF{v$5CobI}Wd_Lf__P6j3 z!ZQr1A!m5NaCu~AfcxwR>=|5>h&#{`YLo8fSaHf&d%wciS@7NF>yyE#b9VH6Z^{AT zt4OxX^z1UF{r2@Ja@}uFcN9DP%-!GKdewR>ABY@v<}P*N>*aT{mOI(eC)O#im)DFK z>fQK;FWTE(+#@(XF?c54Xp1#deK(oBSr+su>f6Z!UO@P@(yZJXTsfSRy~hivuX{XS zwO{^kVsGIEl+QoSym|hv_dA`9eaUx4-=slz?PbN@t!J&*tT*Yc<*W;>EBRVGk>-ai zy^Zi;X3kh&TYCM>x-a39%3fR%XE|JJZ9}J>XI*Gr$$n3z6F0Vxuw3Tb)zmZ9P_1$9 zkUn+uBWlUf@@yN@o2OcrS#tk!YIQM59Y;mI$5ZmCKVKxLYqL!2SVPw7R_w3Z%ZhdE z`N{9L)(KXeI%t}>m@+LdphFf?gI|IF5P6^?7L$LcZ(HtPUrglcxQ3kKL=55__-}od zbRkR_96$?S->7P3TK>-GjP>7eVfr8|30zpO{{${fZY)o9-*oK4i*nI{AoE5BSp+{J+2pd%%vYx5IY;&^=C_6&C& zyF3`qpqpd8@oF~sYI6BF$%yl;;ib$&guADA)*%yXxaauo-0LaoZ}RVXOK*46Od@lo z{M_C4;4VM=Ha&PgpBi2Y?s32jyox$RAC8Wx;v5`a^#7>%;3Gcc9el@4`H8WA<#=mT z815C>o25LXe1F*7XW+(@pB;8DisVc2=4NaZUP$w98+^MywfUKHvwVK~FygWB-^n3n zC7yvY>h!(IHT)Ew&I}K&c@EhKj*=pQp^~E!Lz0Jxr-=AJ7%DqCBiWzq?Uc5{^WFni zN=%_9?Jh1#r@~B`8H=03^T12N4OGQ@{H!rUWLnPN-MGm;c$EHpne`JTn)6fj-)7a1 z8x%{!h57wS z*NksT-cW%ge$JsGl?rMyg`oWKkEgE%=e@0IIw%FV-dH|d45+|kh#mpUB8Ecmgp&LU!9R*m}GeT?;< zrTI7bYck zmcyudhnOF{gB^H4zTz%-oqdP3#98Lwmi5fbd7e|e-#zZpI-Vi+9Zm9QoN;M>GQ3|f zLqEh`gA%sL+=$Zr4LDHi3jSXvC-ko8INv?Hh;Oq5pKfXEN%k2>ocx$Gr$gY!)cI5L z)=IYa84r1nK6>g}&%R+E%n8E_>*u1q+KfJU+8+PN9>433?!@26A7{pb=b%gR$C*J; zs^Qhl38wjSk`6Z*CI-80=8yy;m*{h=a1 zjl)E2_m1Cth|YsON??!V57pc4Va#{H9_iDmz;?-#*^l3`=kP~8E*bbEb2jjf*_XZK zu3!YHFS@%Y#AEx7$cykYEv8<`Cscx4?;2WH57?8H`ouXZ|j|b18X9oKMAFI@I3d zpA*N_)zwDy9=DSvpho$JO-RK6BW)nOz%0wwH9zqtAMq^O~K_QnOFRce(kD zX6m@3C&8U;>+E0UlbugiV$a)C_VsP=uoQhi!#i(5w`FwNvvki{?&Irh(n0Rw4)SdM z?&KD}{}B6)R}RKu&}@70fccZtcsYyk<5uATM{N0)?$e%f(hrQA((65a-l;w7`}9)L zuPr=Ct@2iQy6AuHY)|MbI=U1mmE}cZwWU1Anewlfj~OuUBEyf~3@7>%zQ_!ph@dL) zII68#@I?uH5#McC?9t)>_<6Fj6Q2klKyo>Gffd5J5#$JmeO4QOj}PJ8^!$`pvgJqF zqtBi3W?JhmfVo{9HeesRsDDfspF2#LJ-brPaXkGw!}&hT7q7Z6a76s^65e>GIIG>u zeJ(0CxXXQm{YhYd`kv00DD7Ds$!;Eawz=bZtlg;>6?Z5fzR5P zlCSZ7+9`J~I^l^7K6Kn*50CK;yAOv8i*2rmz1`V5om{PFPxsCAJE|VmzDOFNW#2&lNLmssSII8JTj#&gr8u17?B^vQh2iZ*tI++{17E{|izz4EH?p zSIqF9kJCki&K@?#y!VnG9HPUTdMM1Vk{kMocN--ycUimTI1#H#dpQPGT#!&O6~1_ZChDu2by6U%wm%Y-MtAY(A9@sPJh6e{uwVr-Q?LN>4Yy z#gJchVfz6WV}2XFoBzSZBycgFYe3yJ4fx;8Jb{Ptxp%Q=kN6$97xyvH#Y1{{^hAiW zXNYHR@!YX5ct3J=H`{TwbM1&#R$1tJBj?d0^U37RWkfN^aJ2-*9=Usc8OW zQ?|2jm)N(Z)TRFG?^YQ%flN=(gW1o{&1BD}%Zb4=if@b?z%2)&NS+JYUCw`!Qqmx#FuTyk(P zRdo(?cP(6U;VBE396uFyzNbl zE^hCzzvq5au3}B`j~WQ>Mv8`R+tSax%|GP#hZE_M*9twx`5@)GpnK@Ym{Bp3gaK7FTzg&nqcQf*q%A@Yi$DB-u zEXy_@&E`y_FX4jZ`oxFcd4Fegs^?Ag3KyR1^;Ew-U3dq7Yy*2Mcf&s)VW)%I^^j*b zAK35xDr>93WptNWUUcyf+5JP@)vLrhbBW`3vDWe&1J=h@oxWMk`yFXbcQ@~KAJ_J- zACa$(=$%80D*RcMT*;xcW#5zg=fyB)Pl}Jno1rj)pEnZ*j&1bp{q`XGDljLp2dCW7 zdQ3buTOWXVX6h&nSgaYaGNrymeQZ|rTjM-SQ+#338sS(P#V&wyox8x8oNt#xMSi-h<~! z;CakP!s+e*pUsXO>F&VMsH>QDkcJ*!zU2<#kHgtnS3ePdl8Zy#mFP3V?(jifU*`w6 zBX0&*!`F$knkG8mIqt&p6GuhIc!1I}#~ zI`wL6Hof{Ma`Y$XXP!uDZUH;hFzdHb9u7}Is@1j5w!eR}w>Mg^TOU~8%HjP*y!&JO z04o%6dvFYLVBRZo)4&S#aE!1*`b=>ALEzsh;Rm{gTfj$Bx5JFL9?F!_GzC*#Gfs4)gD@z_3?l5@m(@6?-nG3H<8! zJ=cnSl+$zmlDK0N^12y6^C))b9{$Q##Q@HpR{4dWxsOag>RHyJtJZ?wTh*QW);S#J zzHQ}mU!Zf(WM}8)^Zvrw-Rm9UddS|u!X8wB=Ub0(8A8HS4PitQ*as}*d?Q0!mO|c^9 z)3wg#IeDY6e9j`|WNvbDx%ZE=W0$k9A7p&dbSU7uldBmPpSF|J@^;MkyPY~9Em$0J z5d0JwhQ)zB8S2$)U~%{@xp|rcum!1FV<)`hcVpgj;jClEXFCk~@Az{Y@mJt+a8p*; z>mjwRwtljVe)e2z2bh9Gyw8()j=xAv9d2nJd-w6!PV%sL#2gPilUX>$v*LB@%?UuUo+DW_D=sekJaVQG9C6@=ZGTOgR}i9D7|Pus8A)L&?YEX6t)u;Tvwi4mRXn zX7zfAK5f=uff8gJOU??IBECIman3 zkQMctQM7@*uyWdm@(oqdfHd?5+44Te_bg(YZJCJGS;` zjOC8Beq)_5W})cT$qEnp#gS9L!()IbRblho*%Q&#S$9(D(Gv@7NYK@#LhuY2J4$+K6OX@3*;o zrVbjuG7DrmzjKK-+ui-fxn$ytCCS%R_HJvkzEq0W(;fIN{nmD8o}iBwbYE_9Usj<@ zPM}K`a_)L<;q&TnjQx7n`^!D~PCMDJU+{%+w*}m7W+j?);4ZAjpA&=sG!3r~>Kzxq9VYaz}g#J8rNufNeVA7ah4@T~=WYy7WK^Hox{-#q!DJ9MHw zyw_PjBPP2?AJgu#aceuz^~l$s`H;WiBYn$9x{PnMhJ0ejyZoAue2cS)xfz%uHNhcy z+7#!FzRfgGZs1QJCeOGhof~b>V)W38eBszD@Hu`;vH@V50ZEF1F$@V1#% zJzYK(hnfXzq$g{DoV8-TG`W;du$MetpL5>U?>fJ*p8O}?Hnt5Pu@%oAZ<~A+|B>&A zvkgYSgxkV*YT;~){%SCzS&z?Xz?tEDyD(ZEn6ys0zI}OtUbuzanpL4+B!i*DCBna7 z)!&~@2NnKqDRL~2tUm*<6PF zIB`%OduFl%4e}bD6=R~e3UiFb`rDJ^#mVc9bm{Ne`Puxr-96(6);(FDJi>JO z<;+QQzYHYNFUf}Z^CWU<20a^JCOe8JPjaU=^jvaKakh9l(|y9_LgAF^*Ka{3b);d-p;Q5V@zPo$>qb`_lB?zU1LJ`hE+~@)%6S z>h?Es?XD))T#c>4(N-R7-;QO2K6WR6U(%G9Y$rcT)ADS-$2aQkbE{3= zMb5{|Vcp69UdDOC7bUM`1zT6Z5WzQDc-+i3A2xR=g(1f&J+9Nkh{haR$u~1MpMO83 zkK0VMqGPr}YOZ+((>-YBnOS;1H_lqRiLBhmkAT0DOR36n1i3P~AbWTdT@o>lldMhL z@73M0=Gdw9at<3?B=dWwt?b2{_Vs+Z$Mxv^|D=42F062?d{P|NrK>Km zhCaF6voFSm@5#rRo}~c?oL)L}*u;0Z)Xd=u_Id{WD@SVY&UH?2+DkYpx=;PWf}_IG zmB9|03F!VWKCS_W*hgoK*MmA<>^WXMInC@PvdgAiW*<)Vj%T`WaW38Eawud#O{^L2 za^4Yt1uGs_^Rw`Z<*%%Nc<#gC-eQljnPc(G1EI;+P^wDrOP%cj%a^L$`{?oU4 zC#=J_i1;;_9lMt&Ul##x0KT66xR@Nl)+GD-`?uU({r-HUy!ZL+QTY!4;Rts^uehG= z)OS_&wpGnZP;ayruvUsV1!uJ~d$1ATO;38SKYq}8T&hmIx4V3wST5#aPVvr*(F^O- zPrqiPaH;8q3$R7%=Jo-HnmkkkPPvb+nidZCUPsIM#<@W2>lx6&Mx#~9sd$U*JV%D{ zqM6|z_!glj(`)*yN7`0rck{$KMS zBmYF~o4Vcl#xt&C!Fc&y6>jSqd4kB}dY|=x^^66tBiEUkC(uq#$klICF{m|IWO4|Z zyi29mlNo<5_I6+3ySC%AE+j|!jaUcYfclX)UPqr{}8buC?&79e>d>8(+8EqMyTf6)rpJZ!$zBXAplKweX z9v4oIj+!BFovI6T$_gC=50t*J)92suC!d=|Bo}?YwpMQnK{GsarEh?v%9ms&s%h5H*cx=wR?Dm4YCwQKGQcO zS4y8g=00!i`S0K#?MJSHT>H!R4^Ak76XFxQLnQbt_ZLn`UP~Qj?07y?%iQ&L^5d+9 zcfBqDoXL0Q{O??UXc30#JX~q;TNU>epDy_@qc-+2>-p`_%`LM=)Y#*__UHW03r@(4 z8$K?%g%OeuD&50U?zvPq)uUv=2(gbk6vb>XLgK|5+^e~Be74Aww+x+rxBGm6n#{NE z^G;*Ba0g~+dxtyNiP!jd>+>r%r?c*L*57$9ylb%ErQX$=zRNmnN!@(1x;%cvjIxGV zpAB-~Fb}fkmGHO$?AFqM$ER(?U@-}-Urr5oL`O6y z0&8UUa_G%4f-{mygfiC$1zRLnYfd;jy)=n^lFnAs3<J(qn+Ek(v~b3n z4@&=iM9MfO=DWrt9gl+5Cml&qa*TU7l}c=ly`S_?UJ$KQ{}K zUAWV8olmB=V|T~GdL7K}9tm4?j=Odrd#YbkKMz^A$U?6Md~OOSMW06QlS|#BS7_c5 zGV!&aEy-Bqp?Qsru0#*E-KE`quGvxLU+BKa`3&2*Q-`|eY9!?|FuvFFjo0EQobFlS zaT0hOxqJK=?94mfe-(9?ICJAVpCQig_3&RRURh1d{VRRw%XrW(bcUShhcS1_=liGUn46Dx zu;;?NQr@T@@`&f$+r5Q((bF@SEY2n#$DZHjd0&wuK0q8WH(&Q$v37+XT2CFAUgvAg zO)t&ne>UOgn&yNz+11QETQeu}Jm63ZpBA~;vj}+9)U<~9F?5#2=a(xj;KnQLx;gB8 z;+4tzspPz3zmMe;!^XfO)M>9ejIViBCAraT{iPw zc*^v8=C}ifdhy7`_IXkHa9rN%9cJfe?2)rs$#=lA&?V-Zu=_Ye_1X^Ug-_wGGQ3u} zVc6>H$m2il{pNhfvGmLXKI2vTZ44g^2bz9|p->|W3)1bmJC?CIkNAv>tHpkUU7Fy2YBi|_ipdF?{~V(zmspfuxP5oWaWO=1MJ$)?Afbg$?^Oveam=@ zb3a>@Yw@kB{%sBWcbs*$ocWLGl;7BkVR~g1`@tuY$0&O}q?gdW%gPs=NIwi%ICl8J z?ea}F{GWWXhy47D{Ioxl)i22H1o!eM&UTaz#bMT)af`z&;4srqQ`PHMs@)F3Bg$>2 za=7lxu;)9JJbpl)&SBSgBwL?)&QWp2pMC%KV&~_4$C`YPYxB(9R@hOv{XKcT^LUPy z-7l;ewO=JDjc`np_2`DSXCjd%QqcU7k`D`8Yz zk*c9*W=eI~cyn9ahhy>~wKN=wp8r1f62Do%Z^lm?(FfHnBhD7KpqyV`V{H zCV83vt7b!9_2!CQBK~W4`fG~k+)f>T3o&Uo;rF-$w-y5de_*`x<=nZskZD)$c7oh( zDv#5W=jp<#Hp8Q0;wac}LG;31e2LZR!K20vm=y=;Z!1*UhnoX6QsapdLr*X4 z-=C#d{>a8XTh#c0op5n6;QjEvk>&Zs2Wu4O)4-~~mz#&+4#Cdo-GfK4zpyh2?2O#U z0DrlOm!zFsBQG)}hW*AqzAn~+ZPAyf-bY3+7W@9iS#LIO3Oms@>k4+jy;{b!x>!O?gx z{oeH8dlnpxpQ$7%T?|KqTPxT{`Lld5EW$rHP(3Wh3wlD#(N3LBhix7dhqTPBY{5;Z z=DYHv$m_vAC*opoe|cX%fZXa7doah$tSb43gW;pdZTXI$@)coW^bm~b?dX)RrZs-x zB)PV^#J96zysma=t~g%_2N>U-f5uL3kax=86tJ#7Bl30(%dgHSCOBK|=N$IvIr|v( zM(izo+@2k1?%1#34US`*e<07bk>`dtHurHrE*su~UP{F$m(ks?)6r(Z)6o@yI;;R4 zw6-&z%ULWUCcM<=)nS8SA?-`2`~y7Bzx>>1e(oOr1V2#Tb{G$EuCF$ehbq`zc_}_R z-KKB3lcdF{8GWhQ=!JSqk-*~M_^j%G8dN(mQ!VX!ofnS4heBmvq$4sd@5hWf4<9?7d;=sr z(#?5S+}DiqFMr*H*{H&s1a(&Z3~a>(?8Mtv&8)yf_(jjyrxp1K$N9`v?B}s;7`%;B z9@O(=MvS}(?k)BIw1*?(JJ6|Ju|$&&ZkhFnYc0JG6f4#@}P&{DMt+&dPmjhdzjLhkHpo&naTH@6Aa25*KLarS%$ zJq2q6zg86^%9Yx)W!)=y8#vCo{A446x8bKv;6u)YtHTL5cEAj-fFlwI4I4JwIqxUO zayLDUPYZ^#X;$Yzc>})_W(KB3tncUF@tJTk_^wO7xbLvwWY`hkBfq_(y?ZS+x12tO zdr>2-ch2L!fOo4jXG(w0RQDrIZuY(t$gjDYa3whF zty9IUe;}tfi9?^JFU^eOyH{X~=wEj;@>D-e?##$6AG5ZWV@uQ^p5-T<#csmRBsl%> zV@&DwrkV8tE32j;Cr)RvKNb14s`$E;7Z{B>dU@$~d0E~JN6~?E%O$|gBx|RGa3gxp z?7w+`;avAS&OpJ(WsY7Y;N!wyB^DR!&SA&#aRoOX=0I)K??mo}H~3UL*pGSb=_T~v zOY~~QUOeyajUl7@@zr$nzVT~r78Bs@(i2<_Pth;@KlSlapH)r0r&iwRKCJI9{El9@ zn%;|bn2J4t?S?rVh4nKZj4u34o)1>B9I|gy)4@_tZR{sdTTJm-n;Ywn6k>%r-UII! ztdl$x8y))&*S7F}>7R$IQG>wyWkz~Uj9OPC8-)cJ#`B^#%N~#QS@^zS_RJ~azmgxg z+d(l+DqoLN#T{MS8N$>gcvN91Qg>L7y0hG$FLSf?m1qCbyPo8p#y+cm_}oL;u$%pC zj8*61yPx1YB6cmVhuLe`8+X6Tj^LuUuYa=6a1Y>b_-gP;d=vN^v)UTCB&UeSyXrKl zy^+giyTq5}LUhk{blCbuRqUp0;rl!GCt@D{;4DtIaER&C3IT_hyi2N|N#7Y6-hwUI zm2dpCe9()0toPl6MXYVILJw3?{>c5B;#sHK_fj5eM|NhS@1DyX#}moMRC{!jvl_B) z_8Fh%xJcaXI6DY7#;r-=-sG8`3vMqta5YN4%U=9d7#UbMJr#K?`9gg>&JDxy71m(C zcXSRgF=i#hMf*IM7&D4T)R^!ETQ_^Qf7$O-#pT=D=U>Rfs9Wl@ZYRsw>-~!%b=b_j z^&Ac=?_o#BIIrXF*EwXZpY6Mpyy-F2Cx$=EQsWaxkH9`a^W zuZH=%75FP$W$pqzjrpE6K3m;?kHV04-G?`f zJ*%m4)#&4zd@~*dxpuROldIVhxzO-&jz5V!#QEXB^iJk6iS>u%v)bi5Vj%rH_;?EU zUq61TpWn|_==^8gogaC3oL_S5W+K@Gy&>uaWqA@^k&T_e-{`kbGt`$eb1GYAY3Jq1 zn03|`EmYk zF|zTc&(s@2Z{W1xV=m5iExu?2QIsc zUoG@7+7G&8Z|OOj>3O!{7jH{$&MjKx&n{F^iA-Rh<~L`^;@%|GINK-#`Z8-yJ#mHSo?^%kM&Lu`utO~w3qw;hiCpmj6EM)(Y5a} zmwCJUvdg#uHOi9DTe^dN@U>IeLUVxmSm%=Kr<^O^EL`R_`qBIlI$(l-Kh`rWz~{Nm zJH?vWpZUM*ld$)Uu}4GSPJ?c1$ayx*0%#;~Ep+2VvCPB-u0=j)rvIOXIFk#P zRp1i`TvlYdF4xqjXJmr zIeO^;d|XD?=K2_5#`tb*J-kW4H>T&){aRfP@&-o|oz2{L$4~Gxuq(a354aU|_kJ<>46_yFPvNgNri0)UA`Y&+UtUN5jXq2{NdC_s z`7sOHyZ7Zu2gc6gzi0ZFa8>8@ADatbVzzQMfiJ;vHsm{Vxu#AT=f!<5mVhTwzcpu! ze4OsS??X@D=RW_{yT4Pk)X_#@Xfi#|=0#@H`Fv`aV#?WMZx8zbuhHxKgV*T!V(=RB zc2)DJ<WhGM?rer>^h6Fxu!i=j4G%K5`p`A&Sve5`7@lDwVR zQQwj|s@7}n6<#a7TGfEpO5ULk+g^9}Q}k}BZHiG3B*#xin?OEySO1Ba%Q)X<4n6d` zGr7!Onj2jnOjn&khfH-o8`Ha`|303LxXSmwO(t-ohz;uUFEi-lwmL*E#vX`$fMSJE zz9n|L*YoX4W+uCrrxaavhcw{33ak5Bcnx#us{Ds)ueTCj1IDf<4j)M_aVP8KOWqJS zWX1fXs#)YE{3Ks{>@>4e_-y3haPNu-E65`UzF5G674Tr0WiujI*6DGgoRU>x-iGMi zly2)J)wBuc7kU`xw|(EcazFoJJ63b2&%(8VZ>l_>tcdfV2}Tg?~0cS_j*+g-3&-N<3xKnfq#aVD&V2POFdP*+ez+sM(caNy1hP` zJzU*+z_9iD-cIK~FU$_TZT$o8{T#aR3cgvN=X%r6AK*;)@Na)%E0$G9SkLE2KFagl z2lxp!%$x^Uk?W|yeGaG%;X;<@fSE{OCSa7C;g59K-}&*|@!{{YhY7hhi&iHUJY34ITdz!#XB>y0fi}R=8 zA?Tc3&Q-PC8O%jbTuxr5c+MXeDa?JYc2%e&bj@56)7mR&a;KE{cuVCia3ocGvF&zb zC-O4ENA$4rbJO2DK(Xwi<4fiq{t{2EpNErxd8xpd(@*MzZ-}|qa8G_u|2*q{OjBoA z+C4nT9-QsxuTG2d>a=3!E-a(7xeM;+2lnCaqG1MDpWd_a`p_o8VoZ-Rk^D!#4!3tW z+Fk!pY=VP|Elv67nLJ<~{Tx0?ZjKv_l7)9F;GKd|s+sj!<9q0};qUM7?%ZfE7U$P_ zFMS5JaIrh}7yjeJ_UCE$b2eRjrgffmiDll3p0#T7zV#g$_^mZ$T`2GH7|r#z^|5Ll z9D&>%pOBu0z3}&$xF(a=&wIV}7tkeei}2nfWCpCL>>`x{4 z$FQy6vQ=_W=4F}}P1fKe%>JzSc0ccIf8sliw*UB%!Wn5N;71D2q{Cuv^K6|vjD)!Z z!JMFJ$+B$jR^IC-=P0Id79;#ud0g`PU;g0caxky>%*c-s{g*tI>*pgqVNX_Yw<~7`+ww5~uRHFLckZvpy38?*`*MpV=+Tk(EDM7kWOJT6r$~a&iG1u{%q< z8@tgJFZ=wh(hZ1y8?TH z!%5#wlYPb6<#$`zka-U+JY`MXB?Ujho|4Bu&?gI7H_+){%a{I-ju_)TF1K(@nyG$BT!kFJycoUwnD^e;`Q5?Sfvb?$9x?+JPmVp*H=(AT!gOci)f~T4mPknT2pZKT`mah-Kt54maPya}t{-*IkKYkChg73+^f(c@&33`bp@F^#lb20%| zq~Fi<2YgTLWj}0nzvt=?_@2c2{py$#1HPw#?0RhQYG*{D!B}PI8ssd8iod-I?F}-0#vZ9Wa~c znaUYuFrqE<_FyjjT*G~g^GTLZ&4*R@x{mFdY*y2S?)V|@N8*l695)$mahAUHTLu1qEn;qcmO>GhgiPAcl)RNd>tQg3BP}#-!Z3F zuh_)oKtI1bTR+{b)tI}~hc1R3@NX4ZovxZk(;dTZ=X1`ZPZwi%JABmRVQl1V#k+Zc zbrHW;VC4t-A^Mf~wcvK>z!bFfSY&c`?eaYNt*+UVrRW%C>uM)qgrDp^$9e;8P{{*j+ zI}I!B_dm2>>#zeKdftQ0x?00Ce3z%V4l=Pl%%B_;KLIAz;!iE=dsd6S4j;30|8XzL zm-ngvO>sA1u;kme^0{|-?)B(wait!$*yUl)pMCp?e6E+bdwuw`oxyc{_1K&EB{^P@ zP1!!L>e&kLP^rGdOfOt+rm0-6^#kvR+X!}F8w_2D+sK_AmAmdFS7$P086I$c`j^i6 zD%kZ`$Pi3R0@ISfw5VsmqopITovGS$hK~jZ1K&aX$z)7@vvtANO=Kw&x;p zw~oCzKzxvY(0*lWJ~`IkD``hz9Jt8 z|BiWd`Ub5_{r~;d1D+)dEqCQMzRp(U{9qU=`87Sv_(0)#yP}QAa(JM%y1#Fb3mimY zOTN!C*)WdKPI-AMj`hqZMn5L+s;xHpnrU*lb2wU#^JO{a?@0L~?jUT78HWwIlnL;J z`UCAxtOL#@ABh+y_T%CiGB>TOE|QsrR7)213@6ez50SMi?B)Ap;sfu0n$L>pw{6+e z&HWC}p&m!=v+NqaA)FT_-g-Gx=QK^+67fK{(l6tj!$i3}`5ya`m1dRlJJiD6lN-_j z`a}PteH`VhtRy}-gPeRqSALwCe@|D;PFsA?nwj3IoN+3y&eSpTh#w&nmGHLw$30?z z-SUhs$zZtPr1%`Kjvc^RnZ}v@xOvSW<&VL>B(N`ZZ$(dg#jJ>m`48qgx{t6gX8)L@ z!PkX->Gf>FzNjhL4|@Xpl3Zbtby&_OAHn=6zs;t_sp zM`!qod-iVHf;GV%myfC=iCsNcDnGM;{aBaYSl)gV}r{s&X(lTXXWFe4UT|HXnOq@yRbd z$8+kroB2JMc>moAUuOey|1gGZXI%`vk-K@3yBu+p@Fy^i!-*U$9gv4pecl|p?hCe1 ze9w;`_MT>3veD-4$d`3OoxO=Nv?}|yw(rxoko-+KK;Ht4s$4346~DXm3`6!U`qVKN zh8>|-*fM`d53$L8^zmu31MTDr-@m6=5igM3O@%L9lh3c2!!WZvm~1@Z_n%{5Z)bPD z;s3`R*B!7v)7jNed?(%>xay2O!$I#(-)}!oVV@rt%Utg{Uvj5UptJkk^Whs>h%CYRm(O^n-}0efV=MGgz{|CQ`L_Oh zSUlE*|E!qNTh)t!8_}P5eAHG#z~h5|z0SWf6PYii^Df}=;S2S{V^4%po2(vsI-d$( zn*D@zNft~e^4n*@1nT7=M?Wv}qB3mq~u+A~FOQqmOoi z{PINkp4qgPIWY1DS366bKLO{D8Qe{L1}*%y1stB)v1Agr5BsOz&vSR#iB0Jv^%4EI zYBru7w~rWs?{DGr;rro2qBELu(-(V2xEM9huKawv+?=g_j6H;jNv4qBrhUTQqi<5J zNF8G{I@J9R_4u1CqzdOI*z10Q{rruYRum;ZUDJ9J^uhWCbj@H;7)y-eKpe`2sz)C0dK zb4SRb;U0(>QXEtzTwRU68;G@MwuD_JBk(rbjpq~| z8`~il?PLl)7iWKM;SO!g798QZhWzhOboBjsFvp|BMO`zOpl;?z!`!((zVH+n?gC~c zg>}l+)bsEi-S{e)iL<=XHHg|qT5yl~6BCwje4&*i{x2*G>1$s z!hYUBf8R|8KDF@wu>B$Y!9B~SqJe($P4o~ zHt`IXn169O`vIH6f3K(^(eLCKHpPquJr?31*py^zb?n4iSb2DqJEmd}tonHK%! z!gr`$%V(NVm9ZhAN-n5*oaK*Lk~r+!723Ebnmm79QNt%1J3qxQ#$D%R>ya2N|qKUZ?GD2Y(;O5 z2dqZ27}w~cY)bRU^Y~J+sUEq;?wqcWoH;8=Y_4~t>4p$QmY_~op@k~oCCi6FKy3D@XXSj|e;yR9{BVt}|bI%>;AmBKp=WxpMqkg6Cxrg6c zmJayLp1)<``B8(zr)1&z33z_wGfK0^NYHC3M8@^x6D$*KTs3upsQd{(>~@>cnQ_lex6@E|?>B0LCwEIujOf(J4412&dkh6ho*tm3Rzw;DGhx2iuftH=XY z!<*g#-%r5zBL`E{t64X^J%3drc`SW_;C>W#|fXE=&Jy&R5kLhtjMKwzQ@;Qpf!|UHsfJ?~{K> zj$lN3xKtRCUcP=FXS0R7{X;tGWU}?8&-$IuiuuXitvTd4&T72S=l+1d^NM9Y56tZ- z&cz`*u@f$%r&mo&Gxw|NWy5fQ=GLSGdK2))veCQIU(@-QZ}UNqbavN!PI*3c?Vw*V zlq>qo8|coBeeS28`E=_gpMS2Kx*lH|kB~Wg74bqB&y`syc@w`^9x+8`uvX+XN9Dz5 z`F?X~$4=JAYF-K3yrk!VEfJ@|4`zerCZznL%$paq zd)-vd58seHWv!Qw!#4!y)q>wB%E!}gkF!|>O%JhY_7%nihJ4g)OmzYJA!5SeOZdI! zQ)YYz=Xb9B$u@NH4Dx=Q&$&eI0T+=o&*-sCOac#^4!9%m(>@1|B!MF_3%XNopSSft zw_sJ>1hyBJ#0({y^XB4_8(^B4H;UCFuz_wbB!`gb;H=0@Ah_a>~B+>w}ZKWBKQ{hq=vI)@zooZM{< z*R`edzL?A`#CONjhqJv~zRNyN_IYK|pIpKVinG-&_q$uMUof*_FFx~LlVNFa;7%GMsDK0m(Hs6pngVr4d0Nyx*(4;tZ(1**q?33 znzvNwJ@syJ79M;G%x_CBel&SkZsCVxn)*aE(x!uELGx8JGtT&dfA*Qz@j-9_!GoBI zXz%q-z*p4t@R(&JR*Ey+?_wy&>~QS~%4raI+H{KCg`y@W8Ro0B~}K>DuLlHC3K zy|3Or`IuptIJ~j!@}559Uur38Fy$T@UKRTdvkZfl(^CU_M8u7B44etfuzo*2-|A!; zE~M834HtrQprJNmj*Y!q*0ZldM%Y?2RNKiTSu2=t)Z_D5(VgnDIdUTQbQF%VWoAk) zm(z*0eRINLVCl)v*^8#I`WH-(i-rpI@>VEOGtGt)*%;X24rNvhHS2 zhCTNle3DVJbB&nvYc;In=pf#%8JIQPa&`St4gGAVc?LBl&$vz6NnX$3kon?1BMIqn zGR5zV#hp6I9bMV`%&3}q&AD8~eW}uY=UDyX zihJFiJ<0Zibd}jTeh%lnXL;STEFzZ@=R4uTGdrawpM&4sdCPUF-4CeC6?nA*?%vXj zm=X6Z<=dDWk#@?13-h|1>-yR0dI7q6;`LD!{0*{=;|G@ye0`y}z|TCM@#VoqiCvRml^cxH%OS1h7 zrg`LROyEMyz-i+i#$jgvx1kp=bGPocKD54amln5v5$}|>pLMhqG0%h6Y1Wlu+bhJj z*IIwI9<&~{p0?h%zF>WCwC=X{()GX1hs_Vm zVGIY^a=At}X+?MG=UJ1VIBb?Uel+@iE8h=y0=F`Qj^sPjiTHr@Ays?63qBzD)v7s+ zRs85x7%Kh@+lUXS$1iXtzYHIcnd+rEnU#HTI_<+>DYG$$3)VtK!EPO!f@HKtPwSW(Z?5T%Y_<+<^>hfcC@kt#HsvhF( zc=M~&-Wu#dLtU+*F4GA3fMC@dV$DXcu89vwt*j6Bug|~r^ABdKbv5OII%Y4J`{_=W@7uFvyMB0Oj9d32_94>&4?Z zg5+e!!@f*o6EZV-GIQx+bW?LK*}kLs*dLM;yg~Y9s_Ji5wY8wX6tB6pq5Vni>%8{z zKh`Do0cVg|Z#CGIhMY`8{s_mDg)<1(K&nP$;=Dh1K*Ec#(w|SFW)r-?%sTD zy7OW2Oh(tf<+;rhQAZettsLOPH{JP8c_sbwxVyNyXTE?A|IR&I++8`0uKf!3Ya$=9 z;IG5bs4w6@C)+SI{Fzb@_lVgH4G~L2K5B|QuYH#+y219uPJjf%Ng zRr$X`HMBJ5vE!`ya8BNqH*5C#)8>pZ%a9+kUsh9-pQU$H-Q51)<#*num*8@6?3e}W z-ACxwH|YMWQ$Ddf9(z3Rv1f1EGkujXJZ1TBxtdeys{@?vV&d4P=_<7o*d7>P`nAH| z?N84w=g+t8%MAPS51MaNI`cUH^&9(r=GdnACRG!X`z2QiU6^G>*eEaLJ>c-1Wvqoq z%oMI3wrfV%pYO8|e3AN5xu1N@6gF~QHsv($G#A^Jx>q=S!~}Z&?SJ&QaQDFU6=84j zl2}R|D9AYuk-;YJtpOPKhMd_bA83S~8WfKjCkOGH*7EFld%}Cp;I46#}~ zmR;Dw9nd==XIJpKit>m2o|naYv-mnw3oyy5<89z~ckaF2eQrEd52v!m;X z+bm=3Yv4d4Kl;fzlkiNPx;l6!oM%DL_yKnzv0Zi`a?I`~XFWvst>sQ~tG|CoZ1FUE zc(gOHD7lW@B7bm?T!DSLi;l-NM21^xJKe>dMYxg#t|Wmgk?*PN*_y%^=*dclcA4J< z<8*iFdEh5MVp|uYUw$aHlE+I;y;s$XikbD%<%_fbwX~+E{y243BVu=YqLK%EMf|BU ztmqIuCqBZa=v$zNV+}@o8XRw%zg!ca!hK7JPV#TKfZ$KzRoNU|KmivJdz8_Ixx7&> zCMmydF0a#Jg(x*puc&T==$x$noyQg^93;FY_ zkj;tYF~$Y9WruO-&_R>Ks^;27pTjt~^Qg69FW^%2;F}Wj^KdE^xq}K0slMV)`@eQ6 zi@A4P1pHLK+TK|zUXZ)nmS8#6HDr2Q&_Vrl%{o3m;&b$EhX-ayGI$AHw!HBN1K*B3 z;UK>&l_O2X&j;ysI01LsH`uV-=)s$fr;Q)v0A8mz@$&F#GI?43mH9<@c_NNbjwOTd z%k?u4II;%gyU9Q6Q^lslKKZMUn(SPb!eerV*LvP3R0>W0^4faYwUB)-FXUpE`AULenl*|pI%5~Y^`|3s0b5% zDwp%PGyRqCd%`=g>*lQvkDrc@Cmi6M#k|VZbc`IM+z2d|{oLMsJ|$P*`o3?--j}7! z+06Nad8Y-2eRph@YP=Sj&LsSYHCWIlyX{KjQt{$tTXJK31WlHRO8)l^gVSh69Fn@4wvbi_8 zi@xyD);e+k>lbiu_hfP9f#nW#*hEk$X3C|9wO^ z)X039?+Vu?`DF3H$P{XPwKQd~3a;&w3)=a<}a98C4H;?b> z)uU>Q z6*p%SA7cZrVFMfD^5MAGPrC zZhQF7edN4nGnR5@wx@?y8XZeDpQfpJM-T*UAC#ElyIb+!Dg>s{Im59D<^7G9BWdY?G>G;6nkd%`8w=iIJ7 zadx@jQqbo>KQw-U`VaO{%_UjLb3JM3kz2gyANh@+dpG^A^w5@5wpXjNAGgb`%}#c= zH{P*tSL(%}4+vb4epvj^9ikniCmwRISLabY$4`8jzk08@DZY?^--nJKh&oe$pkcY* z0Z}NqM{>CpIh$dR^toWi<@nf!73sp*M}IwM9|lJMf|2A9)Dt+x z<0akcR^of?<-Duyb7u_v(4laUGu=x^?C$SjJc@7l#$Vfq9q6<7*pZ*i^9gJ8Fg^Moe0N zTXtn2Yb77DtG!VMjOXa0OP%3G_@m!Mo8*kFXN>pfcsA%#u|&GoSc8mTZ_H=?&t>2C zGT-B!rLFju@{(k+#%Gz#M=Qw(mc*RObWh-G4Cqs(2NxN6hG_a1oK4dWD zp1x2kS>U;;y6INsC#vq=-Ebs5dU;LLccPUH(NkZN4fqx^E6?Wl;afV`eE1gMGp&PT zi+s#*FyehFo}L^os3hL0w#A)&Pj~B^=tf*dF#3giY*o!MjJko#NM9wmb92RI1fy1C zD{E>-Y5|v#m|HF2GNJ=Vd|n@O_Vmwr+d9AX!uo-imdv1)*_vfAIK{tjwl$j##J z%v|D$49Cy4{S;@MSpcL{R+ncrEEjO^}wz^=IGm6M(Mmb)4eqj8U%)V)@vS=@h04r&S31%J=3|`K^(7_AMrc> z?tJ>~+{zB(0D`^L*NXh~+glt!?ycSIUM;|8=rgY;gqR!*jGoUyAIqZCOAiJ{jdqjX zF7ton=IoE!VrQ|W-ndjONEh{c?!T<-c(r{y$l>fvU#~|Ft}WGJVCAvs#FObmSUPnx zFof1D*22DGRM@%4+zSq}cCltA#{6JvVBge98!$EU3-Eu=BV0}F4O`&HE%3V2*+HD6 zkgpu%yO!W!VFl?B96|E+dhn&Wm~=l(XYO984uSr>-yYwQ!|Tu=1$+gZPO>4L7vqg< zrc=~9rhLaNf!T?CymGkmAN2Y>#wlV8m+`y1&FMjB26iWTJ=H^mj^4nY%(Nb($=aU2 ze_yhu{sp&Pt<$@D8}BgW9p0ud-F?Y;kRvFH8~74Sx?dm5Hhsn}t?s>dAv^ULV>2h* zKYZa3aR1=!E;?NHxPShC&zDj=>hL7`vv__2o*%s#^#Am(@ICqz4(O91erR9o#*l_s8!OUdtP5Ow^fJi-+Xpo-#KWA^51WS`OTH&J2u@9zj+1w90SjPGE%O z#(VhV(-M2B&qFzZ_vvsx-{oDp{SW4cO&;#_OH@O`SFWigt-0Gxb0%`JR=rW|D;^;A z1?pefvKz%2@BnqVVSgv*{t`LefK0wi&pwl9;yJlC55n&ulE{ru3JaQxs(YB(zyEJ`apQo`{HckN!FS82ta zCg{@;;KvI#z8hcb4^an8A7SVOgtI6**?FOrTV2bl5L%PTs-0Qd{_>o)#-r; zi(1^7HrjNy!(i_PMW;uJlgBt>PQ+w|`dd+)}eqXPc+#H=N>zZ56XShfn6ylI6r-cJ%LyvIX0j+n%1gL8^x|eSRB1 z<-XD5`SEfU?D=-=^tSfl_Dq7`XYTUnXZY`1%j*RDc9$~~YvZ5rop42JmDJ4hX}ayh zi{$-j_t+kiUw5Y8^&W6I9V`PJP6tB+hm*kJz%9w`JEL$oa*`1dS?I}Gg{kOP(^XT$ zHyc^gN74J1M>mUw&F4k>e`oQ7&+YvgAA)1{{zOK$pW4heJ@+d1bzc< z7JI4Jn-n384h|5Qch5Oc93Wy0V01bdQy3lhm8ntZ6f5z?w;^j=8JE%Nv-6p8L*oDp zu<12@5U1(a+$#QH9`HEoi%JPRj@g%CEa0B(GdzwMmfntZ9z2fU!~f~I@HlYxEqB0F zF2608ms&S{NaSh0bWWz4({gOuRi5_*z3~t|r1z;l*fsil8a=4i#~coh@j>qvF&GEC zw~u2FGk@ct(o>dn}fVfY*M4sbNF-@;~O;B)(V13CSG^j={tmJ%2I zPV8eH>xmBrmp~4qqR)YMfy?156&+sL$S(|w$|i*4|rVE0W^|F*vGaz@?6&I8ot6} z-t|^~PVD1y(&)Ng4=wt!4*Sz6zNcrdl3R~lpf}p**iSF^WI2nTe$4w^oWhyV+Y8&* z>BiD&saPP#i({P1&x(B;p5?QiVc-Z9uUALYHQk-azl+Dd19yETnT2^tU|u?F5Ay=A zUUipH>%xA*yttdGao|7UeNh9g4k~ZsA?brtuB#(F$4SWf3u5Hohb z#ytMqqz6v4ACW^5Mx|5hc{n+}(4A~YXYFZs=BNXoN@lwMwloke;ZG|Cd^B`}Uctu4 z*8V)Qw4n7biP3H8Grj!0fB3g)^1b{H&*`^Ptt8@Ho@IY-&ES&B@~-@txqbiDsa_1u z+>_4ySH?%?v#3}aJWB%4;#{b0OWR^8dRV)M!l%%=l>|P8{iWmVQ@6d=rz_y3(Ra0g zqf=i>W@IEc}1>VS-!LIPTGBum6aB|kC{)V6DKDiAY zd7GFOpFyv)hT2ZJe$PMC-pI4y788rJ?=|N(_87Weo<^L(eRWDFzYUKPdzDaUT&i|z5z1utbm!x1y1vRb@xt}QtKbC-avg;`WdWaEbnxEzQ;ISCv@4Cd z-8uE9mS3oeMathBeX!Tl>8gmU!c*fOkc(-nL-DTvvrhL|g;<9K=WgG-{kcb;bXqde zb7jl%_2qh{Ud1=xpZv_;HA9YPy47>HES>FVOWZ*nhr2S23Vi?@WPN5MgI}ph zj_3O%dg)^Ogk#3txgmGoOqR{mhUR^qS8-pgTDK}&F3(NhY-ByUMvZ}`7>kQ*ET48P ztU|AxK(Bh2UiXn+`Q%^TbaWn=C6+o-PNzA zEmH^H3@1CwZ?Vzak8Ty4lwcLiC-B`f_qb!s_eXMsuLhPJUQdpB*!Ki>YZ1?R)*6fN z>SKfFB`b>iC_5?0-So{OF!}nh4GY^}~c>e}( zlE9nb#IzUe@!#1W+%&}mYjQmsyP)TMW?v2_i!YGLKRWBL(zQRcw=rk?y7#@9pL+mZ zeFFdNUi%vFSgbah*apJwj{7Ea#&@# z`LcUr*?HHGg6{+0qE2a0-@AS>r4$aKf#Vep+I%;4=I(Uf)DiI0N&z>H8n23eAaI@X z$H%+V!gA0Vg;-}Hhp7*Yfg6W!QPpRzs!pKl&Q*m0)fl5NzAQLw)W#P9 zhmD>j-C~V3K4(q5d01XZ?4zqKH(qC>@#B(-^_{`v$i@B6;pxum1ox*AK8+r_p`nlE z`Sx*Zzvmg9J-f*7ec_zq#+2uqDvkt;$EI#$E-*KC6RzIaz!2YdhbrL*mXq;sa5wt! zl;vW}{D-pov$A=X;kwFd0?K*@l*R7Lu{V%@d1ZH@3W=|%C5JC3*YGyD5O7i%@HXzI z75QDgzsMuJ4WCcEz<{^Ge*x=az}vvN6bZZyyI-*1g;)_T4}brl@f!Jsxl#LDr3dj` zk!6@0x~U4EiW9^8Fn6S$iM?nXV`xCHK|lmFgA+%4wR zH@0s$faLlH!UC{+u~+rB&f?M5b5A-MHq^PmfyW*kYdzmql~HuUNXX)`$zrr^Kg zGxv<19{qi|-I6??x_7z$wdm3F(*fA80h|EM;y$_Wi|NI==*1=E1C~_7mEe+@TV5b? zn_S5j{!G8%{1K~e$c49(oPIjlzP0_^ou2ocyY9ct_9SZxzoS=SAyZqx5e?vj%H>X) z$z1%RC#}goWb{YhJLK%@eXhZ<3=W=(Q$2F~Rq&=J#f?K`Z#(73s>Tf6wrl9xjr@O+H~Mt`=8j@(=Xs|W#1&5F&%bZ3 zFg*!O51G~H!n!P!58^#(hr{TX9&^yI9nM3~Li2puJbyAK(P?lg>Y?=MF`r5HSpKhw zI9)iM1Wt#pcU}xQ9Wp4EO!nb)_*;d1Rl(=c$GvNaFNjY~Ea^Y)v#*%<9PBSHB0Zq{ z!=lb(w{y9q^Y|s(0(YcdSN$`&i@j%WlE?2dr@f4`yx-oreqVXB_&RUE9pZiQF58L^ z$5_M=dBiouwpZjg@pjR7_=Vsz)Z)=S_=Vt>r@`sG6B$?Kw-` zpC+tu1mfzWruE#yZ-j=O>KOA~n??c>GWaAWb z)K^b@CFt=4ckFH#;~_C0^gTQHo;_wX=L}tw>l01aOthYD zYcbCE-RXVb_Sr7)w3~C#W&XSJcVL0=SA~vWKGFLu=Y1|VfA!sZZq<^BbTghJHU2^G z>#BZ8-LM+n>HuqMEr*?XwKG{O`KL1nH4QeBAR6V4K%Aw^(mJ%UZ+axND~TlTx^hKlyqIU!nItELX#1 ze#04C>N|h62JkxW62qMy)=SX~|KoFP{Jww_2p>T`#2&mbH*OF8aCPbsy^DNOzz-Dg z1L@b>7yd|J&1vrVhl|9qTt={4OQ?)IF=*sI9J`Y2z0J9hcj~SP!)h(zbi_*eKjMWk zj@d`&;{DNIuT|`lHuNAH!ZXvP8})AFuhO&ONBcRaIqhWLAE#5u4jxCp8}V8fvlXd- z+cPZ{6SI;YNM(4H3R@f8&GqGRR`#S{hRl5)`sG5glU?`$D#`u(cs&bd;4Dy6Y2W`5 z?-AyIi}!@n5my@!^TeOwznyix%G6NVJ2)Nuh}~*rYy7E^h=HVrTl1I5wq`AAaA} zA`8}y-dUUM;}r^cg>dp!)JXNq+w|jLZH3j+K3D^oV*2wNcjYbI4VUw-v5t1mt~P(T zFDxz(>dpp-u9p&7IU_5R;j;dzcyj3{y)uhq>EdmTAH_>HW>Xdx&-sIYU)R6=KzGf> zW*y~B{p$SAYoFMa;w$HHoZs1n?-hH^9BKdIS32CJi`%F5=|^@n9OHh7zenv>zj`0N zS?F=t7I-2xW!4h5g=A)WhL$6T6U=bGI$BsT`Y+m~Q|QZC^z`{9Jv-8V@{cRhKH>NY zsl4Z($rJpF^G)u^b?i$8!;-+T=yTH}&NT&ABXbXM$0VQdEBwU4PR+yp&KC@edLi6C zWOG5faO&uD#C94TZnyX8VRiL*yYyUg{?`|qJKy;~HZPI^rbbD&sZxjdl1Ur}%jW98QDI zI8r=iQ+se%S6iKebCPB5uzD4-9}AEvJ%7WYt>Sk}v{0yj7$#-nemHA>xq*Z0|H=#*GbcbfU%WIn6elle;n za#C=~e5P4)l96KuM-d+YU$SSY_QCC1@clj0z){53c`nS}vOYgp(&HKy_d)Nwzt5>B zhvTW}MN#qJf$tFljw1cB^fq-CqE4B}X6~HI9a<+?9p@S*m;A!(Bnvuf@H+0i1sSM` z^G?F|&FbH3g z`l;W9^E}KZzU|p-IFEnj=l|aKkM-;&z2DK!(}m7aeD@iAnz7z(PB!@kXJ}crYinz9 zJz08^-}65G6XOE#IqC)~_`)jg*FoJ*4d2pOV=!DxKkrPI-0}EddOI0#I`SGt0;dC~ z*{$bEcLJwF-;3?@dw=73I1~6$Rk7}2aYGR(`eYY(uLH^QcIL8*^~5E_52?W*PYVaa zm)}YU9g{cQ$x@izOx`6ICw3OIA^IT=TabM`L3B)oe#W(GeXb!N*N_z)K>3P0MGri>h_L-W-_6F}D zrg#P2aT(be&;Oa19N_;^NYhf^o6(`IqMIJxBa_?rZc8{fxPC$~H=I7OX3c=pCw%Qp zZkaW45>64L$UC`ucguj!C*bqZgLX(RvVpg$4vVZ-0>47EnJ>{Z*U_J!lW{ydo>_q> z(!1O|W6xYXJMfLeuw*F=NhO@gMx5&VpK&(6^SgL==omqW?Pk^SL$JAXh`}{621yw$alF_AB zaUY)}5trJ^9zHFINdwNy1Ynd!0w2@R`p|=oWSn56XTU|&SGuObnmF|D4tY( zjZ$|(XKxugNX{L9JipIp-)7fv1%)TsC0HK5np!UV1ji!>oZ=qI)V%b?e)KUnFLsT$ zTMlzC{^~<=a#7z#9Q2~j+jw%ks5{#+?%r>?gGX+bh+Djttm)&Re}f)SwB0(6Ob+~jGx>H>P=_wHYZn&aoN@ilffvp!47 z0lmWy*}?k#l@GKp8C#KDtm2LYSChciB#Zj*ebutTtHBM!{E8(kZr=EO;Nsi3uq%3z z>3v0a{J}id9MzN$$Y>jO-gDt>*s+xFk%`mk{p~C-Ze5?t@haJ?XR^9}HL&TvAJ#_Q ztk^v)#@z{y3UfS|O~C^Mb2^#5$@LP@*UYnGuI)^+u_IY~jIXn+xx(hCO~7xGHN9WE zXxPuoJ@CBMqsbb)jhb)#s^Xjz#l%k~_uq~l<8C!3i5!HR^UCKC@md1A~8aVl?R4o9x+mzgK1#_M)p_B5QPRrylV@HV{9N{u32_ zoyFJ4H+~{(Rtxxv0)8U-N;MqpX~g`j>38uIsiEwnmm9@-zE2&Ze$G|%9~9e|O+IQy z)ae0lQTUlphPMdM89&hH@fPV{RKZ(T>D05}E>b72{}MSon-6j)eVfypchRfQ%DbK= zI(8)eu{QnpE?c1vO>_G~FP~vpZ0C}{xvFRBWf$-q!Q~b5H*jX`*<8N!Xf`3{Y(MqA zhr=WMo9ybTCSEgLe$g4ASKyWSn1eAkpUf_1v}Y-UKh5d6K6$@J5y)iBHAQT}gIQ0q zAvx4*R<0*auD1t~GxuzFfMcvf>_h&P@q+P=5p%m$aj<=ShMyPia?arV1MZ?2H|f-Z z4v2EIxso5;NB;5XX||KVj~dr+xSt`sAW>HRU3)Vg{ql?^(9+ zAm?sxIvzerKCz`YW!kyh|C-kM(`i`W8m{AR`7>F7TT140j^K>=W^yM6oROT`V6q_n z8|y0;=f56D7SHG3sH=fr9&o11^k&&RRGgE5o1x%~R_)(p_BoCB+GII?upDi&8=2h9 zGfs)m@po4lhx3P?Bfq#iqJ2!`+{2D7* z00I{K;>u<)`$}%kIH%dl$In&_@?smiL9teHXk?hrjY>zRqIw z=%s9N+uG07b&m7WOm?SV_qN^>=y`I(_rURCpH8J?pW>6eL${8mV}2(4W7&|S}tS;p@-znN{fGz?MWdp%cw>tlvA;{9=E;v)HD`_>f~gA32H@A`||9x&dR9 zz!)VkMmU4Y35=26t(64E2tQt+c?)%a)7@G9yPU$6&h*F5?W&#)w-49M$CVct%(Ji% z9f=D`ZXwm%T&f&Pxp$G ze<79;YuI0QKE{}1?34aqG6I7n{{t&*#QldsN??!@7$j%78|JY`m$_qHTQ9-d*N>FLXZUO#ASV<}eL<5~XT*eP=>OW~Zw*_xyK! z_fx)i9zQ?kS4`$}KIeUQ_AU?5iwn}{PtZYdLB22WIfs*{`EVCTdGeh<8G67KZF+Sh z-+6}b+|Aq$a$b-3J$gW?Cz}qRm&q%%)$r-BO&*@5xA89Fy$k{GQh1Lp`AqzMrth1d zzS)Zmu0N`c+o@6LOPdgtB(b(ni6G9Wd(@wuEB$(leZGgT#>Et- zk=Zq!Q5d7->a-zl(I}p9J{NU|gAHV7#IT*M+xcXhJ4c(E6B!T_7WXyOPOCX7Xfw$gLFa$OSxm(ZRsO9VKu_&Tkd&u$sUf$#claIBRf6{0a`XV1DDR5swOw%r_?^YE8(Z{wL(7i!Y##PmM%PtgyD1F+Q=aEF$w#_lHbuvgr<$6)TA& zT;g}5AN;ieYm~qm=_6iNldi_by5bHAWig7G)&?fLlt5w zmy_3=FLkiE?*y{3Bwetxvv`1cKOwLFytRcfVkh+2F?Sdv?^EDE>~_EF)?-RFru%N} ztNem>fa$|kRdzoe;%lT~UH0j7=lcZnn#n%&<>SSZN7M$o*N9QzjbxKD`pdo0GvS9i z{E82|BS*cjW=&0wI3qjr4BfF2nYxFsCoiThYCsR%wwlpCJvthAiSpQ2Rv(3a*w_^Q z4L1efGuAhUya^*z$Fx@|r4ev90E>itioTh^k7mmxR%%jwL{ ze~$HvnRD}tSjMjAeAB3zY)o1#Oeg6TD~BvDU_I}$o^9)S02z6oKLCegKJew%?tc3- z!FT+hGl82Y;O2?;D|w$@)Yl^XoR$+4{+sQBX zN^NGbIUBr$cR#{=e?!(c^gcf^;m?@kE8gW$_q3JZG*|H+uqk@RRA4yqr?daCDRfDV z&K^rv$MFMGe83HLM@_g7_f4{Pa+)S^DrzvBNyMSNryl|wN&<(Hz@doMOn?Q`MUE`q zVZHAq+kf@_htPTWfZ%g+%<{=1SM0)UcHQ@UMu*PhocGXolg!~{vT&jt(Gm2_p!pnR zAAWN7?;^Xgch{4pR`GF3pK;$Cb9#7x@K>qT_1*k!`L7=L;py%dsUGaDSj!yyy(b%! ztHZs|R%D{g&xK3z?))C(RB{Z%k~}V_1IGd%)UCd(=H5Bg-1JoHnoPd?dLW?=S^8M<8`7+L0>}9nC+xk!P_L+VC);ip5UtjR~Q~86hlFPH%uiNOWrP-(7 z(}9b4FE|#sdif3CLubHmWpW#t+OZ1UNzgOB1|vDWIF#qyZw~MS$vbq^r6oN;>HD|3 zrgVCmU77YL-}*k7mjvd8jp*06K@WSscaqWIzn@Kq|HZh}xXt+7_=X)?%vi!$#)v#B zs~YPXvCe8QV}AoTjXp8f+^8E(W6-$FxZb$cxKljn20q#o#!JS(jkk>tjL(hljGx30 zBCo@f#=neLj5m$9jsF^-8()&oC5$MiOBqWW%NQ$*JVcqDpIk@IqboAVam_(lY_(Qvi6GTkUHpT_^^*Vd=cX^$NN%*%l?&U-O#u|T0md|&; zxFHwkd7o5R$W1Nlr!}ugHJ~)u`1kNXc^GV=*U^?kI z@vc5P12(f5&7b*|K0JjzJHclUHD?$ecy}Bk~sM;Y)LKkzNMDjUR?^{*>S1tYt8@;VLj5Fqh@zY(_zRx66gJhsC=OxyY=>^6Ap5%`F zq&Xf$VqO$`f)#>yFGmcbTBZ>3Z*q;TVu(+MO9~INJ`~n-KjRy7`9EhKFCz?ANxV;e zxxI<`(8zuAM}Ee$*5^xm@tu8miVQSL>P+a!3SD^{8@Pq%?g-m~hf2OIBX#bdbQx?> z2X6pdB*(5MS^h^ommczI#7T=&XZnu7=lI>d>5Z4YWBj=xoX!8S(^E?+U$~(LwH^+4 zAMRtnkLocLE->qs`n16Yi^^AP*?&qLu~t|-fdaBF?E-j$wvN<4quLcnK&P@XVwSS^|8#o&N+SDovGp(7m%wp?ej|H z{!+R);_k;}d9rw#g#-9UkMeQwNrgA<0X`{rh8*W^9`H#8d{Uv}-}I{r#~Jvf^zqO) z)IANKRKO<{@JWf`6`h)5`c&SqTb+Kl-kja)DTds==zRO2J{-oa5T|OuPT*fB6R&&T zht?6tlpe8zdSK-6y2G7V;{&5-(4XCGUe3mr^ajI+-US?)eU14}eJjM&^b*a~x%>T{=*}T$uV#I&aQ-f2tD>HG$oc!b zwVKQMUY4%7-TW9ZMpFgN;9Gfv6 z=5|nSK^}`w$7{?ArzsY;yuL|?znc9H(LFL&`D2OkB5w2YqIaCv1)h5(Q_kmzWwqS`l7fi=o81s zY^&>loAa*!C3i3SEWSp$hf=_EBH4y-T-nONHIz-M_jULJFW&*D2)#df;gk%shcvlhMZ8X!*}djI|8uJ$DN*OSvr#fWfa$&F5CTbto(d%HLL{4pFX94USS_gQNNcNOa$ zio5fEbvRj3k`IctY_F9XdMN1*=J#N*5*RFfxylKB(82#iggOispSi03yPHn!#_QGN zzT8VQK(DaZ3$fSBTKm5lFFWTylI6eIv-8REKaE%;bSL>e-`?$Eo%i8W_F1E!=#i&< z@3rg*T^ihV-3MS0oafjVAjZIOY{Bddg-4y+tFnGE^=5Gp8-5v`F(t*>XFapD73NFR z;$HK+9A2~qpSX{lL*&Ey$XOWiJGidoL&gPMS1_Y_xJ2yXa5iU_GjuVzS{IfK`dCb4 z_F@il5c?KiW*)n;vy+`|aTWMzeN)W%74mh4{k++q)n4IwF4Wb{?DQ#v$4cO_#J&gc zJEZ#Fy65l@4l&<(t@~=$=m6t%=f3WJ=OFKA87+G9-K;8J-QzAkQ|v73_&m$gdCyqW zFXhd)@_l3`Ocp~}j_&;%d44nPRqHw(mNuwUDBMx2^2KM%C*|%z;zeY4J7;1W&%59E zyk|}udH2t}ry8$LF9|hXu-3!w(k;DUoBH(xJ+cZmbZq2qrw@JBKH$8fcY9&XN5m&m zy`0ti`2Gu>+xeW?SAF*@&g;+ov0v=}Ire=;I&4lcpW$?N4oZDet$HH>+SIqBo;>EZ2TJes{c!y1paK2i3(JN!+lhvIeH`e*0j6=M~DK7y{_)H-cuy&m!XFmuIvetu{4(*5&0JNnK0Og9;* ziQV+5GZ?F{(FnQC<$BtB5vUJO>w1~s9Q7_2c#mbpY0vlk$e}Xi9p1AiXL`n)p0%N$ zYq^K*M-G1Qnah0!k5w@vt*e@uKPF;SN2Q^^KSdIJg83j!r4# zE)kul?_uEhUh2om6AYX&-pA^W5L0 zeQ@@vIvPD9N^(%f!=-leE?;dQF|B?wQ=^X#AuDG(4{KSsoB5eP`2A^q_x(~+Z-RQK zPUkebVtzXOi!_6wY5Th&cZj;4m9Ts;1|RZ4_%`l^`clgul)FZf{jDwR7p+@}ZH@5x zM)>8KyjndR%y&7JpLC0JG|PW4&nMoBuA0MMJ)So8`f0%$>HkM>FC{whGCljU^~A*$ zaB&5FkM*^ecVj=kfPs02ecOuOf^{k;rhQImDY?><|7oB8$F^Kyo@b=3_}BRkdkC+y}A$qs(J0+k2dSl4lY7E5jR9I$S<0i5GuLH=Ha+ zb8M7vvOOo+Ude#nhwDAt*>c~uCVyd%_K|yg8%}#1-E)=o*GElkPOlTc^B%he$Cbcv z!Aw--&<2ww{ry_xGU5Nf&6eN;6H~9^%j*vK!0-?ZN8D57;VD+hr;vL!Fc~ZYO%6{&`2R)Ds9ZU}YM;G1d?iu@O9>W$NNbkFk27F=x zpO_wB6*c2QPlf@##OvXG_H-a21cxP*lQeA9tP`@XA2H3Gj z(j1;wKGGilVtuRPTrXL_zqzZk$3 z!N>hK%s|BL&c?>=?OguPnm)z{78_E-R|>ep!eoBqhvYzwk~=`J99U*An{;^U9gAdf zYc-MlZf0ESJK)pRl4@mcEKWYU$i#2yy_A0Hb}C-A_mxtrA8nt!i2X2diiI!oj4o=) z3&TpXTd`jxKCysL%)F+{FH}1Hs;l(wd~|J9%wi4q&R+IuF6V1K^LWa;9N}FLW+x(F zz@qkI7yljml`rn|UmJg+Pvs0L)2HX^5|lD%c=;2qhsSWAx6rr1cV1II$~K-V-q z%?4sWW&Au9a~CJ08{OX3v=#2)RT!vhakT+oqZX})Up0>X8L=)cwmsEnq?O!fUI){4 ze>6^@vu}2necJpMH?}i&HDZt2(q&1Nvg6u{R8zniX=%YJXGybXw@CAs zJM6>O{wV&SHYJ7c4cu@oGHt^})ZtIs#Rh!G-K{TqZ>FD{HIF@s;pkvS)N{D=f908Y%kadvJc};RaBKTcSUGovAiiAa)6fkM(Cywg zq(5G(Si>_;^xpH3i`Sg7CG9sG%0F$<@nQ>}|CRgr4fbU-&-pfO#`~>1Lu&4snw4hK z%o}n}DIc%jIUNokkhoLnq%W)$p0eOxu8yyY-@6)C8$E%qH&b1zJ_7PQlkCU&?(*<( zdJ~rUYk^)4;$3<)cwcxp@7mJKAFk3}^ls05%w2ai?-Tn&&*fe+(Hzwvx;w+z(TTI% z_y0wfVm)QVmg6c5xXSdY9E?3N8CGN5N`A`6!Y4F}8T^Fd zQRBsxXA|F?5ixpdWODJxR`{)VIk%*CSB$wX7KN8A;3W(HEx}M)k0a7l-q&4&?ttOa zx2d5QUWz9sD`4Lu76{&ZsydLmxDW0CdwqII|1k51#gcCc>WPQtG+W_6_AvJLSkAsZ z>n;YTqi=U9fwAi3r(vw@}U)R)Pc{Hw&@eUi5l7%P@5 zz=RZ?ex?tJjb8|pyFMRRKBqXt{rSyNQ-b^-AFGx8$|r=YN`7{J?ixKcEaJHjW`!8_ zu-H_+c$Zu(K)&DL&%jP4uv7YY74pYb>pYoGZzhk4KU|ikVp^G;Y#t8voNl_YlBpRs zzf0uMUt)jXw^xVx{eNVzrF@xdvVM7+nf$0e_#F2+dID!x_@&em>+6s8J;^#S2#=b# zdsM*N<^HMlMvoLw;VxHpVgcZstr;Oq)Gy8_NGy)cKx56iHpWjVV-Euy|u zWbz%pYlCkxo1e=V&+=g-M*j`Ea{VkV?x(w+_KrKUDNA~mn%1zF@5JR5b$zTGcL%J9 znfBxQ(udkvnZ>VPgKVzroNwf_)2&Ioe@?I#n`W)z(7X;~o)yoDn=Rn)$Bl~Z>h)Mdt$(MQ4|^mQK{lOJzZZM+97c|Rq4T%&ez?BiyQb4C zGo0>vjLUR#FAt_u-T7N#(D|CgA3n`~!v1#ZFxN~6^byJR-N`%onJO&L?&kGR`d7Y@ zZZ0}~kWy>57r)|I{=|dU?HS`svCP!E)#MqlA;^Vf@|SpKoQdnqc`N5)VQanzSsENQ zgKrS{Vrul|7Edsb*kct|D}mKY2J>NeyEK8(5`$~VrHzQCsOR->OJsHZr`;i}*VNJN zVm9aN&-4J?lbBWpm&*2$O}u6DtW~z5#s{gv+SQW#jPH%#kkz@#6AYBIQ094*6BsCV zO8+Bg9tJ9bf%4g^f5E8@&k6$tqdv~Pc7*`5NaT>or- zyRp|5cNd&ke3L=(vqlo@DIV}n;zEO;%d|N5m1|8Z-??8eqF#lF`(8w zS1(zD+bkt;R|(vey;YZQf8nn9VMPLWg`0RN`Mc+D%&%M69rSXtwVyh~B*t2;>(yj^ zuTq^)p8BlVh3Bl0=E;3oO-yZ=J=Rx~zqw1^5bJLh2f5o-$=j)B2KOWuScW5M!%o%1 zbJk(C44yzfU{!W~DogP=9g0uOoPs`|19)Qw!sGn7YrFc?^S6ox_{$OR8v8dbXYXFM zM$hom=cXgd?A=S|yCPljjB%m={@C4YsxzvClrgq{rPq z3s)MrxdLu3aWK4h;usrvN4Tj@Z5Z5?-OAx))Ci?RdNt&+7n)cNe_E}3!A9swPTu*t zbnfxiYP^3K=l2`gfSRp_oO&tXu5*U( z;irnR1{_^**k$pDs<`4z_s!J3K2v`}&N4L}-Wx}kdXb8_XC>h13M-Qt99=NHL*h{S zujYFCkVSYcak1_MUQ1l9Cf?GMz-z(Pk0cvf+vn`tR^ne9I$sgrwX?CY`mw8=gJZ4p z-fR}$3tUh*!sx}h>5_}x33j&kea7`hg-tml&*cel@S5Az)@f1pcXK-UG~c(P?<$PX z?9p%S)rP)v3E#Q4?^GY?*;V+lD&19;@9mb4(sSB4Zd9+F;<#cf;|TZcRg5j&BX_3< zuO=VAVV@&s$d&xtKd^y&nYaEeMcsS6=Gn)(o374Ay0fUEuqI^aLFZ#d=Nb=Pa-e(X znWN68Y5VbXHRP7F1WrsZx{y4=Piy!bEEs;Hl34dltEIl%9!0LNNzSSB25SpTWj&U% z4y(}1e>VTv6JEZkSeUGqy~ERT^xJ!9xh3)_mTNrfy$%(Fz0RJlold1c@&vYw%vJH} z=^N$#f3W%d+gn8hYML0e8VRx(y|PoH4SBlkZaxq69@rhZYcSGf;5 z=Mk|hd}r>LgJDHAXA_;BJFM@ar2#dUec^6;_;$Xr8V`P@-k~Tfal9S0!GR`G2*~rN$86_Ini1*jVr9zH0yDVal7$?@uu-#;}hdo^NaRi zePc^wigAT;n>k-=e%G7d!GPg0ktagmQmD1fAUqTHS{S8ycSFY&SFW$g5&(7D`+h<_vU`kra$NZ`z=n$M^ zA=a6cZ#E!-#AQe@N0XY7vYDuWXI+ruPeG|KJFYX?#@u-FPugH zZSH;M5)Xrq!y}-_fWL!}OW@-Y_&BoHjbChvJ%s+XU&qjOS2`DmTFa-r?-g|ZbM|iu z-?OhfRXjh3^J|B#`?_@gMESOeJzk%GS@*6li}UZtMu-)>`f;ys-)*fBUR{X)$dc1+LtasoSMS7HC{^V0VD_o6(9^K;d0 ziJ_%@)l7|O-oX*x=iKj?wTcIEHqOfD8D&J-9*KFV;z&=$;$#Q3ukM z2WG8soOtWe@&hI7G#`7re^*;i53%Y@9)pfQgpSAkr4C3BNAGtXzYBgUfuACIvnRiy z%m3wmBL^erFvy=x-KBG}7=DJk5PmS&;cCDS7WDV*)GOf!3;4mi+}(8b^clVnwR+ArE;0RJr@&@pFc$5wHW`eZVQ)F-xD&;0yWQDp@_$priR*H- zO??WQ@{c%|@>X#jozFh2ZE2fhz0-#rmI_B&nO#%MWx!I|Pd(AB6FimvkYdJuzGVFB ze85yCFjXC29iB@4OQmc8Piv+*=$_qQ|sS2Nj;532Uexf|9KwV7O*)?qs` zHKMp@d@meT0!O7s2R>8pfZr_O0uU=H=_AuhzT;Q^fu1^x54Re>HQL997#Uu(fY&VG zHPc792r!azRW|3s|Sg>`Dc;wqO62Jh_Oj|66G|_G$@NrSR^hM(hb6 zaFlg&CZ{=*d*^-n>^5Q@uv+hCcs%5M_s>nOeXpOZ8as=1Unt+O zwy}}e=6vvIOBgE~I~b~a_&Vd%PK}oX81Focm$#i=u4e{4q`p85uSsSuX5;W;i<$Jx z!4`bzAw2@rC)2eNi-iX*T^+|2j~)3*F8ZbtH)rh4=HUOj&K+f&uSw8BNX zUJc^LuY3MWWbI$}Xq>p-3x0oIYr72jIE){Ev~i-L7qeJ%P&Zn|3sR#$M(B6`8{NMc zIfLmDH!SI;4nIlOV88Uu@Okrs{UW3M5I!vIR|5N$jLGWaGEMz+^oFDp2Ar{b`BW3s zChTFqmzJ05w*C{Wxi=Gs7%v|*-p>)(z;*{4EJo(epsqY^CM#sEX&_q~A$7;9~3a*TBVw2YX1qtIdyUChMnt&Qev~(>V5i1iqx1 zw8+Dk&IHVrxIzqU!GOu$mNRIAiGw-+m z@Ka)#dV+cu{FHcfF7K`mo4vuU7I3SHHTH!a$Yrdr5`V`70RQ1k=j7&uQY#5!EZ2)8 z&m>iUWal5C16Jjq#5l`*WPVBOv;kXwiRV1xEJPo9mUX>@K6#oSj(?5+GOWL$zF=hP zb#wWZ%ztAJN04=&5I56bW9c)ED20pcbPff0)s{hIeKEI)4wD{NEquO%Kt>iPm z3qJ*qnW-&mlIJ?ioHJ#g9wh@0Tc5M|rO)zZSDMCmtBjujS zhbLn&Qq~=I!r6e4^4}xzPAiv-rO`7krZe6W2f5OFJTC_EELlBBP3(pK40qxjmet{m z_50(*m}bQH<*(zx@csJgz{9JRf@!&)>>oe}PV!za#dtcqdWLg+<9kUMccQ z6stRLhw%wsvv+lScdv0EfALB4fKN)`ljOTf32YL(Jb=S`wod(Atc|+g=SKLL_|L+y zf&a{TD+2yAvBs*NJyki-ZWy7Sfd5QSn;fP~Y%g!&^@Js(9|!C$o-=(H@yh!=J~aDT zgaLoXhvs{y1$ap@A@>7k0fxDFgMYaR+54S2!#8!}QSeP_Au8lZ?UsFmZGr_Y^oXj8 z5B2a@#*1su==2m`f#0*Z^EcMnIEVg!%+HleW$}ENM!NcRdbZ(wok9nlnWgIWD}3C6 zaD+2_D&M)+U8C$wuH*d7X78W#GxmNSaSjg7D|)U}^fGiFoQXG$AB^A7>1|`cxWh0X zICDKfVqTXnec1ZHY!vLBe5X5W@R?97ZyaD8ZQzIL@JZe5=WWJ=#uMT&x7jne#7-_g z=gaMF$Op;s!}9v~tqrk!SfZk68e~>Y6CQ8ld!sByFxJ@4*wIk4BK}nHi3|NVea2`R z!^Wk?^~T)>u9f0R@t+a86Nfzi5I)XWTWn!_qtCe8c)<9#@v|`-KWb}ZJ7Y&I|*wl#J&MvTvm z;NR9WHa0dfHZyiJ)YG_^*5I&ezOSY?OAYS1N9?Hwj;BZLvPb--M<0|PwxLHoUJo7B zqmRZIxzsUy!ZBj*W1aP}YHr7}`D5L6$MU^<{d+GwM6VcOuNs(M@6$_1_KHjNid~H3 zZ;q2+9xvu{HlMo>pHUNbo}I}CyieBYi72n&PFa@6R(nFB1gBy{fh52i*kq^Cbii?aN?AfWKr|_9_`baL=aBqk;PYGNc zZxSbuXTrttTJ$Pp({3@2a;{+F5|}tWpMrZLjtyrFE>53?Y626d)}pExV^yx5SHO>e ziKAy~>Ji4uH;*LidX`#8`Mm+PiUag9y`1-n>G8##(<9mFqrLB??oBxS^jV$kj*6Gf zfPqVn^PVvW4m-!EEq8d6VCU3L2k|A?T<-%rr!Uwb9IpFy-pwQENtU92u>vMr(5){y zzpFa;zvk+MtruORX1S18*0)Sd-<>vjILq{L(+`Mk+<`uTvC~s9^)6XBkIm>2AI0w% z9%L(*@lGpP>kHWMSkJI`3YG8Ktu&~~fvHQHp^>MZ9@RUu!^iUJ;M?@QXh+UEYtnY_ z9~QT#AL*4mZQ~ilU6=KXA>-BXJMZSWyxFk%+)JLJuP&l1j?`C3zihFslAJ^(=zSAl z4b+-f1I|7@RWcZ87%R3T_5j#|Y+aFd^Tmf?3URHlHL-T_Pxb)c9{jByBL==bSpOyr zH@|Omvsi?T!H2uM>%m1|b-N4d3spRw_3KZO$yxS=4cUWB{P{6sMSd5~JbaXTm5aMw z<{dWaY6aYRog6>TyzqM3kpD{Er5g6WuhS#yucbEIoWW=CNz?xDgf%}T%g8=C74O~H z_u;hD(^fr1-YQ0N9Ox-MO20ltha_-9>+zdq5n`_kc-6w$Ec8VhaJScQn4GBRVZZcm zAQLm()3#t2)K`Q>GFSxzKb~GS`fEiQ^fUH>JDJacACD|naS3(n6H^QSV9(|gspv7c zUHJ{W8GqoP-XwN4%ZU9TS1~p-_BAdS&-g#p{LlLR*k|!Iwi(_|Y_trQQ0Z`f!P|*L z;a+lvu5f-}?)YUjcf20&*rRXL7&z{;o!Q*|r9^J=-wOc(&w|d0x5IG+A=wRr%jl_1E3TH`Le1ooE=wHR6l$=Y>su z#{%}|F8%@TJoi_4LhmLADG$}{K2-}#82IzVr0|S7+iQ@IhuM?4>GwP7@7dhpW4!7k zy5J7KGm4CF;yG8E%QepOWO{S7F<`t&Kg^;VCiwiGK0iZj#f=?)whrf-;kIkK)1@%^ zdhPMSVC(dZrYIpb2X55HiB@ird=YXy5$CabW@VhbxcPye=u+q2~-Inyiq*=MNH z^m~PV4tz3WjCWAiQ!L=`uk`p95^)Cf29ThMmk#?P0Ewk8%_83K!^p*wzcOt;cQyjzo4< zyd}nUW4-uJX%p8g?yI!Y>3Sw~ZK2_&!*8^__IS>~aF%CoVi7=U$gjZ;Ri_ zrQ6qAeC8-|z6zghbMG1PKQ7sLQySqD`s)IJzJ@G+EFJ)>Q(T<(cXCUo$aidGPvj=x zxks!=pEIRC(b=3Xr*Q$fhR5^%6|r8vCfS3>Gb^`W`wovM=G(1LT~EjFhsQIg7Jsxs zhvBnV^D@R~&+?g{#maFEhB@H^`TugFFxKuR3(!etI>XUW!LSlJ`?s8JjPqV>z&@#YQ4h$b!>-XE4ZJVS|Opu-(2A5fn;!oy?Nb+QQZYEE8%%2yZ6w!%R7Vj&=t#@ zC(IhVsa}<=!>uK7Ydo?(`J)p2vA)@*TwQ5d96`L$=N54;=P{0R_GWY5_He#*S&!IQ zb{^{3mD{Jc_hVlc9o5&t6;Gmvrqes$I@b;Z>|IuzMwdVA zIZ^i&)_a!qKHeO}k%|wj(HwNn^TyX*!{W0Uy;kP$4a#}e=^Xq#o{#@9EbZUm?c}8T zW1V6LYx^);6*wY8 zkob`2!PF%;@G;z3!?xlVJBcmDd*1xcT0eQ1AC5q!qkC?h{TY<|g$H(ymoLHdWqrGwa`xw6Q1p4wu^U-y}oPu0)D7Iv0o)^Cz zW!^W@MbFp|_&b=f61@IYePrw6yr~>GjvND5VYuHt9#>(&RS3HXnYAN6z3>A75 z_n$qxA1$GnS+~=HLS_ zV7=h8JO08^e4kyd&$o2Yy3X}v_T@Q$UOpcyo;Dr!A;2-=UFLVg>UDaF!09D$dg=+u zi+98?s6KYEgKr;2K0YtCiVtB$mm-%hxFg(UF8{Mmcm~7%-W|_ihx7e9e$xSL>s;h{ z23gvOF5W982WcJuTP_cg7Z2sFVv=(Z`y|5eiR;TFu?-b=eOxX-ZGR6VuaEG_a0!OR zJnvaCza_jkT!r|a{w3}L+laex#@!7v`L!HwPu;T^*P%v3e}=iN{S)R1eFJ;|KRS#{`4i_H||9ad+GBDhI$b8qrjt36chP5x{`{cbn~0KJNNad zLubG$%+5E7edbT1$ChQ==JK7edhVtbcq{#X+=~_?1GB6dPQrkbFl*I~T{_Vst~_xlB$LN3b;>!+%+bj$PYa)f(z))7BRlx2L$$2Xx?C_WfXc`YJn* z!!Y154C+4NpZotGYwrPOMX@}5_nb3x!pzyg?!xYpTyl^M3oK#J9^!(4Bnc)!0YQ+c z2qHn<3@j`;D&{~CFd&UUahX%*V?#6-@N5|JCoEfP3P)=4?9Lq||; zbmVei2*BMw8^4FFWnsGq za}~db=qZFbdk=H}+(tjyMpqVdivWHPx!d7jy8;`pfY^1x@1c#~LmR(`HhvFn{2s!C zMY#JBLB}g%qg#n@&Ioy-Ezl|a9%7d`fxE;BHhvGeyPII+_mI21iRdRKvY$;vhpvKi zu#hv1b#g6q;5q7r#S&}`6gthg6PCo<)73(Mh4EAhAG6+s58=Ct=u^&2o$tW^36vsh zEw*RVFDb~xD_B2fL7zwZ(Hr8tpE<`}gn%=TakeXnJ{Gj#AZyt+3ttM1?RPjwTEqOu z=OK40(MRH2@OemoriorC^S2OQiE|>x&O695@Ox;pI@{<*+Y_O&eOM#$dx*a&_(b{} z9Y^|%Ju>tj9Y<^(ggNJ3!k!g7*3@|}WBobi>9@dX#(W;@MIyf|0I}O#1wH}aR-C(G z^8z~`2J`hH=IRx|WbTGv!(5$?ylV{ebvkw1#l3TUIk1lkAiqRkmHF`qfGsEd#$dzE zjNp3;`^EIhAMkm#php`ypZJNnS&OkBrH$LM@A{l^1n*+wKM|X4i@7srsbh?1^cYDW zQdcp4!$yi~#9pI4dyPwwZuwa;6nh*z(4w!NhK#N%a*S%6fvLk zvxmk9qy0W@-oYqx-lac8&-hB<3E&>+)Z55mGC8+=fcL6knHuC@jjaQV@osU?p7oPG z3%UT}*MUJ7(}-zsBJ1XV$W8E=N9Kt%sB4(6k@X= zfUYIF1*G{2-Ig!uNBkzDJL%ZJa~^XS;|HBYY_sAcjQLMbQcnxH6n4dF+e74Q2)+G= z{zCs0IU#nRSu582s$t)3HSNkB1$5Fw)E(VK+KBZPnZ|1RqaS0PI}O}-T}oSFhm&^4 z?;?CB`lQBcY#|~mgvUge(V0LW$vx^Ld{Z0V`zdsA3?6Q4H|eq@D%X_7;E)t_XN3@i|o(l8^-WG zH#1(ivw&~PFgmZ?d!Y|*=8kC(qgaXlWea~P^4mgeJ{7Bvp&#f#BD=$GKJr3zAk}Y- zp+oGY|DjE_p?c9rT`?;K(P=_S)apvrd zMeZr|YZ-6@eew!ve*$FBI|Dx7W_;cZpl60`d@=T-nNRf77-$vxlnQ-HR`C_^5o?g8 z6|>gks{x*83;lDLbqs%zHZnC;7Ig5nUasYTr>tT%02*=$bmLdx1;+O(&ar-CT+iWr zP<#m8O}{1p;)fZV_Q=W;v7eWSk4WxRgAW1jg%;GIpNB&;_Odo`m&wNWq>b-M{I)Y5 z(aCxSUiu(yqjjmE0iv6Ut|dN|Lg;&7Zxfn;t|j;K(FtcwLf2AwMrRE&akv=P0+aL> zJ3EU#f`tv_0DM}2v&Eo7=aT(>P@!|F(7EJ}B=>MA6P-)W#%yG?Hnh`$Z*rLX`1hl~ z(78khGy*;4UL9*DI+xJf1ooPV$kkKm*;K|%szUD)8)#{~Vw@p~zDh~anf70B;aAeD6;pO@&Ig^*u_pwZY|gXa!HxA1wXeesB2 z60r@8ZYMk(zQQRT-A-)_1l>+rnLCTJp5{Ie^X~}XRRh?Md~6zW<1ph2UJQM6XgK}7g|U7D z7!oMe`uxjS6YpdHx(A*s$ecP$e=dPPTge)K6>YYPu{DBsqwgbkrJR$%Ijf8_z9QCN z_B)ixepgN6TPCshx)KoZE!jf^ksAeV zd|BG}!Vlrc68)PHJYbqgdTK=J7Xbi5`{Q}4dI(7gum~QjUP)JZFKv0;23kH zEA5XTOZ-A&lbmPxu|%H-TdItqmh{Wzz$3tWz$NfkX8`@hdnK^*}N*n)`tXYZNjZU)hUuomN5*|Di zxpXS$`70UM1=_9=dZv0`)XpkFF9{t)_Rs%7^OD#rqDzX*(Zrq$I!$a3h5vkjJ=T22 zVj6U$2kY7?_QIpVGuW4*&7t08U;YB)HozJ)jXpy5iyRj{I@U}-Jn^TrO+&s7f0O95 zF2cuZvDV3IiyZPO<6;l}_!4`+*I2`oC|AyV?u16BFowhz$uZXGw$Rs`==XvAa-WYo zq(SFFXzf$b{12e5*d^ya3FpAbRpeY^Cu6SH@!!9^gJ6wE8OQeJ^F! zVI3I{{7PI+#%>1_y;2K1DwO*PWi@3ii*Kp^Jo}wBAfL6@hL&Nsn>$@g;WM!Rz&Dn% zrhN`As>+^V2H&!iwf7tF{?H)$jQr*7FD$+%fbAcAM?iz8z^_3G;7Lr*>)8u&hO?im zYzlc)D&szz^zZZDx9OKYrfJt?Kl3d73H~h6(^!nHh9Y}bfIG*`sl~t_%%=&=g^WOv z^9b?NtwQ?>qTlDyfJ<% zZS?%utCh0fvAN5D9bm>6`l{FxEmB{Z1=vu*wV4j3h}>I zfXz~qGehp*!)MO6!q_Y+Lw7BJzxOicM?5os zpR#U<59(rgrmfIa^toA6!ggcEbP4avW!;{}{%i!YsE+i1B7CDCn$v}Ef1bUntfTFz z^JCoaY>X^#3o^Jv)Mo?xmpN9k{Th79Xy{U7+PMP2U!;w{NV^Q0guh5^`IJKYP5h1& zqOV|LgTX|Hb}{Qv&^Z!Z?5smJUF=(qRG|#rA?|E4PvuVQe#V2J^xv}Q86F6rBZ4hM z=-nH<6TgngW{UAMQfl8y`=F-@?}6S7z*s~FxIC%_TlOZYtQtD$pYW4F#>FU5WVNM>B$ z4#@uDERe~whCmx&A+Q110bCA0b`NkLuoZr68Dp@g&<%h+1^X{_F95OadNnWsn86tB z#(cR8co_H&n1&2x1F#c#9e5A;obT?;oazEB0@nF6nsg3X&0?(SiQ5IzdMPwsQ3QCgZp?^B`o$;e+#$mGr;y4TPO^ghv1 z4s)(q#yZYEkN9ihwPMgY^g2}uKo`H z?}z_=!?HNT4pCkhd!X3A;TwNquDnj!bKx1}Uce#hKO5ezEAwMH`=l(se<)+IJ$&#? z;#PxChPJLHd^LOI6z1?v@XT4Hd78HVl5uhvT3?lY%vZ>onnFWfG`WLFx-HO;lklzo zP^VMS`WJx%z;DPCzCfP9-UHq2D$EI!vkdH7k!MVxSnc2&_ruq(MFt1)`ZEMN6u1@_VDMi7`)BT%+I%Ii!JnPp|Kn}Eq*rOHSo=eo_eV>mp1*0^qKU@$L#xF z^Fvec$0&B-*1&tUf*xH>KlC%vBQ^0Wf*kq;^)G?mJ^-!9x28Q7T6U23LidF|Z~{DP z0_R2v?AgnaOO%K#P5W3u2NU~f$c*W?2kEzijJs!PH}SvoC1U~oOZ@Z|Bd^3ZC1ZTB zzlypHIcq6nX*pwPa3Cc9d+~1$e+Dgl5y1DR-GDQVQr4Ac`37_`#dkYCVoI@Bir+0{ zc!%kO+o2yrX}fjMj;Cb}hi0u|EC{{#!)pwrkNu1X&KTLRIqbhzImy)Z8QMqmWY@u? ze8HT1ig)8r)5d2La(V8M@Gad+?~p#`t~54% zx$n$bI(|28?(JcpArby>C3<%zckC=|*jP6HHf_=2ejS@0<6EVAEcje4E=%Uurc_Msa{+%uGkFHQRt za=)M8-)8VlZ^AF6Ap`b9A2Ml|JYOkiTmjYITn0s>F0At=H0c~;Z#C=hiC`geTx9yJ zf45MNhQSifJ~?xhb%=KPGf=2HF-Fi?ch2~VIR`Gqu5lqWz~r6)_SzY<=s02nBB;=D zn9%irJ51M=las%v!s|+(B=O|h~3R@rOLxotw!p;c#N_;yuU=FGg|U%OePfi3|5o<-#m)+o`#!vT zs%bef_={7l3;5Nvo1kyi4Z6CH-A=g31h}}pV9WP|QCEUd^(dV-4&*+OVeC`r>*KGRaePn6B z^L?|Sv0bp`v7B*zyHRX!2(E;mx0x6CUZ?&em|Mcn+{rk=4=27M!}P0zO;`MFv7f;Y zC;C@Q*asJ4FU%78zrB?)ia$=yv=;MTbl+&xsf_(U*mH{RUlnW_at>=p=!2&88G307 zy)^AB6umU=hdb;)Bb;+BL7r~g`0%vrFjwxSFVH(?--_NoV{-%Nu@>V$jWfmL@Cnbu zC)8&h9}Ax@4{o`0X=~k$nOWhJFVE>%KRy2Oy25GM1QoLb8YUH zFh}nV1fjtt$ft|YzrI?JqIkSAuW4BIa1J(~mm5OWzkmLuDV2?@1fqlkAOcd_E`I z1F~dh4lHY)N?!YQts2DkH*~)Y-3R#cXe4) zxw{YDx{>kxXMpo7^ueWp@M`dh`uE6Nd$TUIgI}! z+$&lK=QfbD(FbYEk%3ZtsF!d*F2K11cWnY?@V?kZ4VEEKBv_F#o_hZNs`tlNxxx##ygaLy`H zO*o?;1pOGpyUUr&r{Gt%5&n+;@Pqql^I~|RC)i(be+s_N;ZBExZXD+#%nh4)xq;tJ zjQxI$`}XkJ{TTBr;H|}v7V=_M7dk2SMXN!hex=;Tz?(oB{rxy{^a;=^&bSLX$4#Nv1uv6`Et(`wJCf85%z-}8Uv%8CAz`71X{kpT!|1o+2h~>Sx1sOn zATy32%}d~pTq2xuDs5Hlyb*wgz>f@K&J1HsNJp+bnKc<-2sUlc87uekEI4Zb-8R;L ze0l@uwxM?);*LdFq1#4Z*$Uk@g>IWdw@v#WK(`HB9o%08&~4K;tK}{TJPv;0`3`j2$dklx5}ZjD z^v_a|wXNWuT8a4b!)~jE94i2=2;qYee_Hf+N511~_*CSn_<^^%b8T}TfS*w2)h$37 z-_#TwzEGb%^$nDve;BlpZ`(d(Q*#U?C(yVJ^w&BO#jqxb&r0rTaOcL-viRe)<s6Q;AQ5KT2agPJ=e4!4p-*zFswW;c66K&7rrD zsiS`!EW}rviTw=|d1kTmS)fQAvP|qETkH=5*rCHuHT!yeexmzjA}_@!XRsKZ=OwHU z1>Ey2g?|ii?zsp*#wNUZnfiwDH=S`HvXH*aG4$i0PuLTL&h~^Raejgw#-*HJTgV=4 z^QU=xG$94})Ke05)3KqrVP6Tphlr4?I+ubCYwdeg9@3*_ZGm z%)`^X_d4d;52zlTe(Z9gY4C4cRG=)AIy1Cr(XFQ{ihEJC=?aN%w#bz-U8ZZ{nLDM#&L*lTYNEve0!RDsN1%IFfjY>GL;flabKoBW4KS57-!@Kd{xzT@?JsL0`^5r#NtRHo+5fznt?q zOQFlAI1h%#anFptLYEC2IbnS#5?wZhE*txG2VcGAtTouNffwb@Cg}QGn>ntz}<`Z#XR{ zI)~hF1$(_(q`d@Q_Aqj`|G+=scN9Cw4zl(n?%yv*Cn%t%A&Ynzz8d?aP80h2ORE6; zB0*#{=y<~8WpFF}pc{ZJQ-GrQ>DSa@6F;xQJM*DD15VY%>W!Q}? zgm*BpHC&ACml9-Mi?P$>uph%#8L$p|fX`6&OAh+B5jy~%BDQ_;8OnW*WOM^7I5RS} zZU0{M&o_K;6x#FxWBp#}PGiQD$Xd{|gJ%z;k3gUCI z*nZx`CKL7M3|!03I#KUy0M5Xi`tZM3@C_#OV=D818gpYJ{Ahn@>;UwdYw~SVQ~~Em z1>CVJa6aQbV!tE@cn5yzQQ;TK|12<*xiy~i$+q;%ZlDEo5RO9Y-TxbUH-_SjizGqnDMIRsEobaxk2>}n%|M=##>(Cx!1I13B#d!n$g>PNPi$X&83wDoe%bc#fuf%y_r z8O&ky?$r0}_kZHMS_Lf51uSfT1hl=W5sdZOtQ+~PRR^H~LrmUxs7P=ofo4!8^W4d_VSUjp_rwln#L>ww1y|IHi;@IChf$%Lx{Ggwnb!Jn1^ z57Qqh0J{6!g?TupgYpMK6GJkd z*$<$Hh@9DGFKcVN)aW5{PupSM%8jCkq6~Q41maPlRuHKxhN?Z$kZR!KaSk8~eel<3rUx!Q8@!Drb(| zi2(4SicTN)DJT~os+?0NaA!9O{iLPB>!@4Uf4)XPwg-j*V}NqtG4y;MWq*KwHgx4u z&`(X_u3rjgQz_ihTZ?RIF?OAic|!x61-RG8`h@PK;%q}b7r@^;JkK3RD9^oeyKD`_t zUWKX|V_)vST^GbYHE=uMaW8w2?Z5}XXTaycF95pM_;`$q4;C1J4Se6Ld>ir= z__`$SM<(%IN$ly9u;r4%{qhue)D*RcvGyLcXrbSPn3rqQrFecG6)IO%rGgRmq zA}3hR*+`MoiGD~$mJ%QzdWM|i6u?K6IN9(^=>IA7|JaX&pz|SQLLv5=4tomj=&^r1 z0?+*@d#ZV~mCd)ULN1$v9Ib%yiEmW=;M$xeI>>Mw?%6o{4iCOjZG59Lw<6f7kJ$J| z<*Y1`^AL1)0DPlj=N?;z)De9__~{DxgJR?o*iWJ_(6dqK3}WjAztlWOUyzo;mlnK1 zB4ctZ^aS6j_{l{^1`Qbw;5(JQEB48$Qzzuj_)g{C68E_%?-#3x^#Z$*q{nxvJ(ciL z#sCmWPNzuMm4d`1GQ0&?{8jTT;i+FncD@$EYsDQJf z5ca@AjO}9k4$DHHlRH1W^KHIAiBYkG`PmoQ9d~1RFS=X2Ylms0Q&ZqPPM@Mnhz++e zvL)nL{KM`Cd$9!M>xs(GxxsK+(EzFf8H}YQpd-*3SOBbNY^Bo1vgfX5m7p_H1Z}l6 zk1>FDdV_Xt30<1c9$*-KFoe0(oBdD|JORdMQ11uDhB5kp=!SBii0`J8>yhi(6gDkB&R!f?}qa25ypUGI72``AwxSDSjsUW=6E71L&tV?&o z(+p*t4L7l|$y_X>e!Un^udvs?mUcZw9`p&hQx{a|6JmcWM9CrU>Vy^ggq)Y)vz;*d zgxFu;y8y9Uhdv=TwTrc#K<@U~$hSCO4BCAH=xWe*_=iQdiH&FI%3Wp=zQM8MVR4@j zI)L6Fd+-Qr@DlD(aBmD*$8FFV&I+7oIdi(5b|{92>Hv*>95}(+yPY*{EcE9wbaXN~ z`x?huhfIcjfaN?%zoo-d^frr~7ujRp4DG%Re&BKHgg;r<)DU|t8$TWn`(4MzpDgl) z1bn@fqt}5xDeo5=wx91Qp`6i-*RAyTN$6s;V1e9SLAP)j=MtRpuzuA;wy}_R;zt&J z;vjlkLHym@_Fm5IhOzFUdk248f(?9p3etY)-l6+fL9gPc9$5)82JSAHjA0WUV0_Cl z52`RX+VReTjQ54ik)HxZ=o^%Zev`cdo-zx*^#k@;T^WzsKP=z1Iq?HyeFJ0R2l(#|_++YyoaG++5BaE#zgX(c9Us~Tf3bEt?J$o% zh)|b#&EaPDteRD9bGtNr?%KH!k(%{nb?5iOawo&`up)C%N~XMh0wb>@BlZ` z7XN|PCi5-W9bx~-{YPlk*Q|^9ghh@Kfrch>|GEnEAeH^cYP$ntRdmB1fp_RapZo#e z5Mu4=M4#?vk9LwalQZI%u%&%1H2oN~o%@bRCeYV}ZZ+~Rk}+-X36#KNo9M}<*!YmO z@gWP(RTVj2I=Yi<(F-Y7Ypg=fi7fPJu=N70=KInaqxC803uIUcynhF<6BvekX=6~zt)_oo>*yMT%Cwf*U@qrhvN`R`;+6d6w@O(5ghn33_T; z_JN+7*q!IDXb4+_*cX>E$1nP6O62|U&=vge^wW4=z`c+}_LQl}n^tn(A3%2( zeM~cqjgku4qrw~8oMTwTF#cx%Fb2iSKnN!%| zK(0|idlz7X!{lx}{#Gatoi~Nfo9svNWfQ^|Bl1_qEoT{=UzIawE%YTU^bgplQJ3qH zVTf*ZPuh-~F`TnT@RO0qe!rZ%p4^|L|Im@6*F(t5(WCG!Wo-?xkH#MZG8+8oa{gl3 z_|diTqieT;7L)_{&$Sma=JB7)SqnDDsXzX6IomDdUT6txP#O2*gWUDO&lG#Nn!plZ zH|yA?$gK`Qg9gA)XHcIz;i>bWzrQihQ+PM}cC0lCv@xgc@GZ@V`;&92KiLaafyYG8 z4!J^5Z1}1^W;Ns^)x>syGtqLeAL}?}Kp}iPercUklrQ=|o7i9c#+q<5eaguoZCl3P zoI6QosVzQ{9zkw>hB+2NM#y=pjUQcjhB9n#nd~{Se+Dm8kM$LOJnoH#(WkMsFAenZ z(DOl;nflIRCA*FFE5v-kH!XTz*e9pW-iK%S8@P$SN9T;Ywk6!}u($)xxitHes+`N8 zp`V{*te|U$4s-!FeDLE7-MJgxuxokeJmer78P_jDSHkcE+`Xes3*k%grNleMCKLK} zoRJr!S5$&+6YPZ{*TknRc7rS%pRzXoWbMg;BKy~Xg^xW8o#j`@0mpX@iWW)qJaGp@5*Ej{>@s6z9ai`&dPw7 z8FyQmw_}*M^k4`bV&^_08ZoQFB+mPA-b z6Oc6~z=I|7)mTpB+yeVDjD%!bC5>Jz;2w;LEuCVg2tK<#Y30sAL+XeRS{om<=qs#b z@0h^d+$4296yOe4yd9!n=1{*$)UO9+UrXI4)9-E27r-|#epI0C0c=q*N73(7BAZ($d>MU@zgN2l z^9Fyf+y^aV4JpI_vWbqqW#i-3=AMs@k5_aqxI4_4^s{z5zSYbj?7>4De_)LN1PvFT zRJ(x{tm(s;+pJaah!O6jBw*hl5xv)?=p&%#9l*vmh^A)?dRk)+S!p@<$t^t0dy>6s0#p+gLpfmm00-iFH8ILv_ z98N0XRK=MNPtpjbVXwX_XK+=CU#*(*F7y=@`ik6FvB_(5hdDu^ugG11MEYYnI*yuhU?ZPm56U;Nui)G}0ozOo=-@yDNh>-r&Ecc!vEGYs?z`ZL zKME8$ix~T3*_VoL;bvo%+y}z1l*RozcoOCT{$;t}k6$b3H~wYqeAbSUj7xmX+9tBi z9n6K>nOi5=uUCiX8PB}n{J}Y9h4sD8{gllbi47?1m@!8Zfl>5fkovs?El+|T?Xs|g z2z{PzF4E^NAF_w)#<-d1PvaiPN_1=R!3GW3#vZK^-w}k*JsYsG)n>vsEVAFDPUsV= z6Rhv(6LMD>|C!JN{KVRi^X>)k;Wg-oEO-xm#)=IBY#Nm!S1|48p(D4l);fGo75YAr zdTxPltIKyRMMn7$XA{MYnSP{c1b;P@`GX!Gb_xrzQDSqBy##(5`+l5_Kf*Kg`M7^w zq>csFijFyYgwT7+nvZOLDD+17uxhNmzcGjL)v9eF;iHv3qRo9?bOWddzFV~{W)3t{ z)`63(GehWeboj87Q>?}?cBdkfX-WS~4wTw=@I7OA=T6q-y3|wruN4{I~$)oHu5fXUVz#>Urf6qx1ukR*#X=OMYicMrya&B z>lrYaG_L^I%jUc}!rC4|-iZv8@zRyCoWPjr0I+w1)+S=ZBZ>K$ge)`}J&_dpaiuen zIrO--8vd!+E`}$+HCT!+CN>9Xr|W1h{K(pyX|J=i!CbyO5xAOtzz)837vHsm?^(qd zJ;VDa;*&vqX*4GvzGZ1=d|T2-_?CqSjUdBHVDGmCyTABUfG5d-7cM|%fUY7khXnS< zLH70~Ha=(3F+?T--LFSHI*G^;5|LpP+Et*JgDCe!;4S#1!<3DmS?HFj?*g@DEaPt$ zKFVahFT`#e_GcLHZT!iMttymKg>@`NT?Vfvd<8m&*s#O@6m$d~Lu~#mQvLacOuhl1 zvo=0wxle>G^dR?MzbPsdFgx?Nu**K440Gx%K&y{U;jpel2AG;8WD=%9_E zJszWN(T%~E5c<7AY%)L#&^yG&H+KM8+t5422c}I~4m1Es34q=qYg-XIszG?pQszae z*jQs{G|hk^gBLT4@O=4AHj zwU~SOf#nWDIdk4&KN;bSewA(T*7nqC5j1@%{1j*8>Na@5BYg8$)F1spXnG2(2>Q~& zh%L5~@Bzy`hI01H#m*hj>OG9jAK~wW=SHs(+a}z#4wUG-EckA zR?E0^YGKnD-V#27dr9hP_FnicWex>x{FX81thoF&Xpiyn<)4J?)#zFg< zGhgmty+OARJ(>_}Q5iKWaKuJVNA6gSW&EMzhmT8a-}A2PSwsG&%s=6|53z=!ucGhX zO(kzn`b})VwWCcZ04-VnP5LE)@jRdRwqq|ioHBDL|7!TB=8U&5IrILVvGWn@%4YT` z!>H#3U>&r)5%v6xwSFq?gifGBClEPe5%yqB^odOE7q2njct7K81oWAH5juc>h(dIL z*i$k_9t9pkCWc>A&ZWaPeofJzT#QUJfIbytfpsgNv5?H(>v6^dzKFTw!F>Xb?Jj=<@^>I(iBnJ>-K=eG_zft)Ka=F!tr=;>i&EJ2~C z$GzSpev{apuY^Z837M?v7CUj;hH}x-Q|RcS9~M;T=%Fi$%$asaM-TmVd>Jw4f2D07 zU@RPk$Ni1{{{rgxvstX(2(Zs)y+XfEO{PwBXX@3A zT=a`iMGiDmDz$1239HBy{!6VEIe<1yDDpPRQZqFYiQL-?q`K5Ac&HQ7fwo<`_qm)&bKw>`vjKUPcN%wZZPD6$z@rIGKhdhDm zaV(()Sj{;09d!-V_OO&@RcMmHq~z^njLezLqsd;=4xko+DH<^&UpEJt<~8lNQr`5) zzj%Fwvs93qHNx466c@O~KZ?>!DKh2c6uPcz_2gfr{CSR2RcloJos25dw>C)4v|0?k zP~@@tAhp7)c|ZqArm7A6FO#RnP(Gzvwe+JrIe-3qlG7?wJABpe6m~Z%rlBmIMMZ9< zexbU$%|np|bXusM*BkfG2Wg<2IV18RH4nKR&zR`PC&U zQy6ri(3{Dpq|T5S6?)5S;G4REyzMry^6PZ(`1g>^l(d)Rw{E4f!gZ57pCRKAzAs!~ zf0BxvVf==hB*=qMq!*(t+(MU<9C^7VNPGPR^J<|3)W3=(%aX#v9sFl?!AO+S8zj$> zax2K4-l&R%-Ez|}b;~8Uv~pH{8#(w(6L1N%FKms9SReU`8G9n{THZGu#FUMQ)(&GaBl-mmEo80A@7S4UiTYNDpK* z)lV`a9qHeUOEpq6vXqIK(L#S|R^$_T(l$X}(^xlWhTCXD>10@EmD;QP z%&g?(vtE@l-C?F8Ql(6H(z{j4Y~)p`fcj-N(eyS$*Dv!@UB4_{zs%-3S$$o<%oZAH ztm~KATGy|Yu3u(*UB8aHewjJCTk@z`dzIPAe+ML#0ReQT2`SxDb`Ln_=xUh#&m zaJD<#2Fn}%zXvvbtH)bYlGSKOtJSEYXZ3pthN`ihSzaSW<4~LPDLr}KxJI+&&!x<3 z?&V=~-IGYnzX56CO~M*ya$aE~>{pJePW0_t*dZdPv#SBS6v2@oZI6vv%^wAej@!sG65VWWE!= zPSwncNHZiy%ITDvb&`cXbkt-nCg@hL*+7r3X^|a#ZB2LSn;j7{T(fa)DVM{~ zPy(bKN|CKUw$!tuU~mmzp{O{+QYZLa^aOS$>Xn-rp~|k zTc=(8t(!0Y)<-V>)*Tmr>$5Up^((LBE%h?Y&_ct1=Q*FMKMKkky34Q@(7YgRH6m>d z(oQ2nHbJsAGK&ch(q1D{%?9tvT1Ejfe;b_f5SgqE4tt2qlm?f{nnW^b%?6_xR)QSl z+ZvR}iUuN0-e8!ANMkhU4O=EpdP&ze%r`^xjPPSrx{=JP(0oI8y=wFw11D5ySnrXi zm8$mXji5#D=QTEKwf7$jrD}C#H>y;V6)zC(oG8muliwx2s}8G_cUdHpYc)=8 z@DIbgtUpg&f~oY1S<9VsX2i{nLYcRyTDjIPUJ+4#$zLm~Uua4hO_QSB8>y4l zi~5^)zjc0o!cpEioF|&n!M67%eCeL9q^g%L@nL`7OCl1?&nUmlqqu{F``{S&hfdGkIN>f$qu_ zuoly%&QykJxNB#ldQc|=^;dZmYLpoR3mESE8cFvUK^H>`H=4rdlT0_0UsaQ0jgaAQ zM4TxPTJ9!$$S@ouc{gZ_>7%%xV>l94t!|e_;w}Y01XO}#co)#6p(!JIjYPx0j5t#s zv^K7m&&52Yk=2?K_-j4F{WUfkW9s=;o15fu7YS~=41;4p+uI(X{T)>mXxoqN0g(-4f3t>&1rqsKf{yGcDW4kPsP#bG+Zfr#abNOoQXab; zkF7vEAzDP{3DrUaqn)tq#tC1-4b;Y05o&kUIE`1oN#n`w`pL(f@U@t!@r-s4NJUTj z67SM@R=aI_XvnRY?=fAz~EJ zexfpdbfexKN~-|bk4gnkyOF-(j{0F3k-a7ICpYphB2NO@kLMBjvrmt)QzIO86v#dx zBl{OOv{KJ2Iamg=2TBcp_oXZ)@-Pwa z0v&G{Gff%TA(Cq6Y?YDwhl_L?eZNoLSJkiD>ydxnmm*F0;#H2?0%Xhf&rp6nHg;a^ zsLeq3aA_FBjZDARQD?3pvVTJ&{chyd*WpA0$nGU|!Q7?1_U7x65CGW^%4b+^iG&m*Vhpt^77|dMAMw(BNt*6%8sAJ(dI`E1gMtbz-~ zTi%bP9sghDnYSyFbUiuzLXyhYDb;D;cAxq)LhYARZ6n>EChdBFO1=wp+Vi+i9gwFJ z$!%o%tI5+V$2n>kko)feel===XoC>+WBInB}gf; zh4Q2x$cF^p6C@oZX%gORfv5vAgurEjoaZIG2|O#vFCf1Y_!-EP7siH=w##J3Di9k5 zvXsCgK_-E`N8l|%ZUqV6-38K>K#m|wK^730E64_rw+Or_$ipDxra(=A*pnc; z32YbSWsp0kI%*aWdj}+C8fsxc>{F132&@LWckk<0tuBv`m>tqScT}qrp#8`2WW;m^ z77)DxWFdk1fa*R4thSfQQtC-E&COUWnHKWoG15E&$7JzhTyVacls(qEBRwdYB_83_4+Xj72O2=oC|&#(BxY4Y-8 z1nwegCJ;LfGHj-!@`0XzgPfKm=Lno3=35{ZrkHPUcGPj8yG*7D-dFn6o~L;A`r2KB zyjtc``&(G806mwkA}|tA-M3xlSIfOjN}ZNWcRMLEo-kkQ?SXrsOr(sWOgkO_N7Ht>pb4Rro6%qf9 zlZNL>`YgboCJpiWS!$WQsv!M8@+ujW$4K=hpvP6Dkp2W*(y&KfE~KFsQSAUt8d?{j z7yxL}koPP}gf#3YW-p*g!`@;??Ey4tnC(@Ojly%hdVTHT4zCu{P^AP08PKGmJ%M(B zOB(L;GAWfOneKL)%PK3R;a1X&luSYzj+LTV4`|ZB;jubbMx#jH24x@65iWp#^x%;*P5rTjHoCGa)UvFk{+2GAY5hrn*hrgJs( za{1H_$z}L286VH}7m3csb7d`sJOZlQ0-;V`E>;T3<@htB=ZLT2wr z0?`VP)@!)<3*<>vVqr+t7hoR(v8o_j);ekf5UT@HxXw}IfLL>o6YDt*1Y$WLKW=c; z7eKF`AhOqp4I6E<`C#{ z55yYKYinV5w|9_bJBxV9-N%=A{E`11|6>!t7^U@jWsGBZ7p6({nOq6tb0wq7< zO`xqrJp$+n^gV%-l18cgF3hgiz0v|IkM!Yh!_n)A9s97Ot^=aOKuQS|3(^;42Z5~s zf8B+{J?rJS)I!OBI;mG0wH7A#S5lplY{KL&d<0uEKvY(;KM0%_L{_pXk2-2JpjWcG zk1^K)y^^gYP$q~lx#?S=Y=B8NV~O|IijgcS*CqS?Vf6>nDmOp?=pp4FL8v8(~^@;9MJoEEftluUP2 z>nxdM`O76u7eFt6;|Yw_nKWnYWrDGiOmj0Hl1#GvEh9}ikS7oH^7kUx3xLZRdl@ZN z+Y7~if(cei!yCUO!yc%c}~~56Y{A@YZ~qJ_I!F>_MO#;4XhzkMVL@{^k=k z8PLn$$Y&5~0DAe`AxUKUJ4wtzKrep>ccC%`=vTj2*)&;Oc=eN2hoyM0Zul%#ECBuL z%Lw!V+)k+3(``?`8Yr38*Ip!o$ldfQfi@Oy4x9(N+ww| z50d6Z$s}uLm*?T20X^lfdI8Y~kSAI6l-~jN0HCLQ_ua^!06pagc;)-lQ4%xdQ>A>F z^5;l$7I4!I^3oY9d8Ii9Y=ixdaAQ$CNUdd-|g)C@pR`CSB_kTjGgQ~nOGG%QDu zKKx+#eko0+eT$bI)eO+neh7g-%4$hA&>$6!(c)r?aQi2T5U8H$hGRd~> zKLkFn%=D`##DHIwOpi895K1AL0x!cu13J^C1eyTuQXQ@o4#Y#1zmGNQBg0Mi^%Z0o zBAMi`XEF2wi!UlxLSO;W^MLM;)4feEi_fZMJP)6#T1p-IyvLL1tNix>>F$$adaoqs zK9WpE%oJM%@;1?L07KwV-1-Kh z^+0+N=pjft$Rq+21;LcOT27!GkiV|;y`u16B}|M}@mXBxva72(bAWQ#+ zcoyi~&>IvYt%^{{1#wi@H-@=ykw+JzRc@0;esx91ct7T?p$1+3)dtn12J?6{^fkB< zAo>!>ZURpU@&riM>qtp~=mQ|j2$Tr221M<3)E|PBfy@Az07R#Od{5xGAlHKoe*;1V zM2CU=o4^Nx^Z^<9CcO(pyMTN^;1wWG>K1#4nA_fR)HERW8OV78zX@_2q~L8w-3Ijf z83d+fNbEd;@H;Fl#Kt0x8DAi`0hg_9K~2~4xl4TZbLouRXNl;uh5zy-I`%rD$?vl8 z0I~fb8Sk<80D2w)nI=h&64*t|lR&q3>4?l|ydgJB$!&Zo(ZfVr@5A_$CVw;%wRjrD z7Lulq9i2h!9VD3txWl5H(RF9Xcv*StNH^72=SylC-OQsmNcg%W&Rvk_S5JEhgKC*1 zyak2L3=)>}=z9`|gR| z4{4qUqJM*=>|-YkM62cc)r|zk3K9l+j=+DfZnY@&>U0I>P)`YAarE6+<Xys9D*<+-uQuwKZdsF1;p+m<|bms0I_8te-ro>=(hnRA=hn~ zUfyqPBazp9%#I0&JqoghzzU%MGa$Lrxh=i4Y_m5~!)Zq5Qfk;odRPsp#{b!s3F4vn zuQA=o?9*5h^4IOhD0I>LTuun3uq6mg96I$FZ~PL7{zIC`Ck#p;Pm;tkcpL+33B($J zq<+f9MIhD&WCDQ^f^-F`{u$F3=$Q{PS~B+`a0fA60r|^)ov*r~vdNE19quw}Op?)Y zo=5c$u>%645$Z9Ez%)UA=E>^>UKZpyNUg&#VnFmWkjVtb19?(fER&4?0s91qH3Yfw z2*V19wFUWyz#o8a*mykP522`#za6Dm1jh2K1jr2^Zur%x= zBzi~^4)~Ty`Dc#Xy$I>OP$d4XR~m`Yb0j%H;{Cwo|D7ThmVWwz-G~&&U$^!#zp4?> zuQto83yrksXrddDt{xB_3UVERYX!*%xtqXxfWKVX*Iwlf4pZ%u0_OR`A4}b3Z+ndrsUt$u(`@$;R;!C&?Ky|&#`_3OBTPy*-1^myM$5D5EvML_Y zfx%YAvpO)ss&JRCk^TyFH2E92fY07kxm?9VUwSb{E5Ef%7LN5K8^S9G0nu`h1q9{+ zm;ZN`{txjqwv+!J;PHI`O>uj7zxu%|6RGswG)1;QcwZe#-p`|bqrFWHW)af|P+IA9qv;$dmWGCy)4?unja@`x-x&zoyJEVy= zWk%~0yMo6RfKr3LCC5>DwAKGlZH9!!knU4O{;MVbo#kvgQGHms5H^N1l9;5 zik1?J~n<|Z0hg8$aJ{5>o16f006`*?F zPJ^B1O|f|dULxvwAXW5!Tf4O66szV;r$TELF)#OAvy)G}hokw?* zY$NbLkr_PMOYCbv=ij{Ca^QWQ3SQvtyH@drkUY8&tvaW8v{kkOZFtp%XPv_yFZpVW zr7HetZG0!=trWibWEsrzp*o-TmOMF1pR3ak^;aZw#{RZftsL0R=i>$K`0s+`)P1mI zU{B<)$l%9aYdSZ-sOpE~*(;Cn*RnpT&YdnwQeBid9xfbdya{SEwTYwKi&s9t8HLjeRZMDx`agJSgz&Y2YgG?DusN1)e|X>+b+p zfoH$3hrFlwca~MaRp9x^Rp1GpLDnIWT7l;ySAk~>k@o|x0?$W2t-zD^2OK@%D)1a| z6?oC#%CSX5McBU@k+La zum`3bdf8=)^j>|CS+P)d?jsrRLsA>U4*X(_RGsI0nPg-y^)kuUeyEpxkk%#fHu`2o zNxTR(bd8tOkO}#yo0T%JP+ed1p17NHO4`i8#3GkpRMl{7YDjMz8SG_;q0?32>mWm7 zxYp&W@WtfeaIM3&+#LeLb=NO8mf=TElhEtn_shC8L}xFQq1{T%D*KtzWg;Lxzb`(HalYno4V3O{JV^c|2L? zt0HP^Ia)huy|0RVO^(*E+TiBth!WK%S0~BUR=V5MR;nkhaF2_O=%}@n9(A>paXH#<`6<(bq^n(d~JoFH3aZhG~VX8-3ZL*W)(sjlQ0`adq2F^3~Mu z(N&w|Yuj92s@rC=uXmH(lK9Q!Z}ysUD(RdYaeLT2pPh*P=A;46g}u zblcn-Zw@O|mwvHAN2w?jjkalR91}gY&QPY&)!fOKSKa-EGA(c6_sCFZUkmxVq0FX! zK-`TG)p=v6FLgB8%ZRvBBL9>(4s%o9$Zfi@KyGXH z3_oOeovXNQr;Opg;N#69sB?Mr9BG~eqEkVtah=ZxM6U!ro-n1|(LqB>k!TMFB50K(ck}d@J z%iqse4@r-I=xO=TLVwhx!dpo3AQ1h7B+8DcKLz;?WCF+tAbJ#}1~+i40(p`*mQ2Pe zU}J$;O_1XR4guXC28q82cJg*!G_2anW>o$;p7e`ER5#$N*Fko84gZ<pY$ii>&Dfke%L?o!rkUNT!@WJ?7)rhg@0B8|I^BwM7serw6J)_Z6ClVa$;5kUU8q8%4}`Vy*@HO#->Zd)+|qH#V8bH+lLh;QeXw)jgF{aUlgk0Wv>p z&PR**s(Lb$8&J8~U{6;j+#v}E`7+HGa6-L#lqWI$hY%vIoT)tTrS+-Pl6J7KPAAgp zgOn%*b_Mi7%8dlZ${V_gfb5``3z6G=at-rU?;}F7Ji)X8>=lx}EXm0r!p|!!t29kA z^!8QP^0^ZvIp!v_LakwhM>dt!rD=S*6>*fi+&1;K)$6EUGA{L1(JS9wYe|d)KzWj* zwZNOZ$cT=U$4wC-yH+k%>gv6sC5+oWy^1IQ#`4VHtIDHo8;#A#on8KUg`t(4ld5pB z9dH+}6-HB8%|;P%70^aA8Y_$*61ka(wUSaV{woc=`1?}uBrTDe!&+%Hmz23gb^_dm zYn7pyf!m0f1+>!)(<(zV1)>%Im9RFe4b60kR=nm0RvT@kBws~xJIxTRF*HNqtH@}p zS%)=7Ct)3)qQIR}s9yBf8fo%8cFl{Dm>Nrb%s`rKTL+tfSeNU^cm~j z$n0^V62HMkTBb4u0ax>TqZ>Jbh@ldxd8|!t=Unn-0va-c-jMKKS>!6xKVF|z67{y?t|VviEDoI zdU@yXZf_50!`itrMp0Xgw1;Sqo2p{T7s!4{UbfZHmuZr#v9tiWFCu1+7l8uE6^z;~ zM(yFPnH-0B^cHE}0HXUqekAZcpmIgl+s1pLrCJRm*ES=(UUG@Nw`zJsr2<;s+lfF& zK}6m=p1@c@4NSkN2w!Dk@j|I*qYtFGCL~)#hEmDYEk-Toc<(jTW_j;+BPlwU=%+}q z9f(c=@n=NTd5}J1K%ztWuNyI4fIP_*Dhg}WI@W4Goa~>cZB#4a<$WF^naW+m_r)Kf;3^;Vjgj<{)b42>t)$H5K=e_N z=LqbQmvobZp0~VL&?}Pbd!t%Z)GLmV;1JM9)GRp9noP!f&bnW9A++6#F}^es`jn9* zI-mc{MlkUJZxE%N8@xnH?PE3>pFvPWBd0GZ8UtD*=WOGM`T}sZSer)Fxh8a-q}Lib z*AmkY&>A_-F2(H)pfz%4d4&g59uo(RoCldZS|jHaNsa+-x;gQhs%dVz_u}d5He*Z! zu13ygo@$MpF+^PhXpNlB1U5<<{yOcun%hjBp$U3Y|K(2V6FfZ(CWp77vX`D0C zMGP>YIfDtv7Aq3QKkn>3OvL9BnIk0Yyis*DC1B zL1f}jAuw4GnfR*+tN`-lrF!DO0QMZfJP{&S*Q*v6)UTylHGTCHa;TONxuc{y4D=E1 z+a+?6MiaR}n}{+2P2_e+tPr_2#IyjU@FzJ%J$lalX7)y-D7?C_K_4mnbskM8*;F8J zG*4n560-qpozAQ&(vMzV4hbZ04PS%rC9mvSJ|NXwz*VvvVGzmtDnH~+QfUg)pe+U? z0lg!!yi|x>yimydjZ>SxB+UoBjny08mhEMuuUbwO*)aLNWHy8^ne$N{~EP? zt*bM9E}}^BM@Sk+^Fg(JN%@jMD3Yc`YbbY>l&vYz^2(xHN$NU2mlEwJ!SjGeiE?F6 zpXRj`8gY^|>G3nH8Pbp%!cdQ-oH z67{D3Q(`^@^rpULc0@G+`pc%izij6F%O?K9=6yF0p9OT=H}dLdsCcNU7ZcySH)$VH zjR5{~g|?3Ko|`Zqd=ch`=gJoeO&vh8et@Q}^9an9d|FL?dF6XrNv>31rasEQj|7_~ z5zB}$prg;k2W31o%Zo9dGHM@_7YQ@^E?M3NG&6dJz;9AUu59_&dg&<<>IcJBy97Q> z@A;c|fE5Guo_{iCALOsh`@No2de0x|2t5LH^Gx%eB9ie!GriyVo__*K#{=Hbj28#f z!RzCD{v{+>q!Z;n$tw7TS4Sj5QpaZvF32+4UY7+@Yfr=z1h`^Kg6E8|=BA&fh$jKf zP5+0$=Yj|~?aQGC0`4Yvy0;a;LmKx9kW*fg4*#z=xs6HH5a=U1sc!0}UTUAp6Rv-g zQLkq_b$?P`b|JOsVr}(Oqj)5#Hyd@PNNUl=x|x*I0M#|Vk(j}uAjbjvlx&cwPUthP zkbAh*I50$%sZawHVXFwltT2khO*ES8m+2knjYd0>db+aiNk$`)?RM0hIj*}$ zQ`?T*K)%V{xsAx#FRbrWx8^xt%ZsLYh+c`OyNFUFe~@Q=j4Fn#qK52&+{Wo+wAW3b z8>g>}xQ%m}_vHT}>?^>dxW2b%U-Q6H0Bte6F(b50~LU7mO?p~mHu|lz;MT)z- zyF0Wv#iieS&fK|~4gCJ!JkPo3ecyBLo!QyhJF|CZ?(*<#RT1G$tY#=mo2ahuJN4_R zx+T>G;g#1=iBfMU?VThsqF|s8>kqwDDV46y)m@ovD8jFse~u}jez#ZmRY8?x@^?@C zUm~65)j^9?bvI=GN3Ep^5>LCNu=r|QuRgu*7=yQgzQ!6J(Yg;tvs8>oU3@o=F;qel z9Y~kx5Gt32un)am**Mdx**=COe$)A#^)Zy8#xi+)+gDwYx;=h^V36Biz|J`N8cftu zcIE}z7EIzxlM>MC$k$6N4bel}IdmtYx=Ig2VcI~Y(Z*6pa6yBX^aVo=x)_Sl_9%__ zQE*Eqh;-@d8Z6 zVfeuLIs859LlEusTppJH$dAb@O&`*JejZ?;h$VfQ&*2^WfKLQ2!~G~#|=)S?T1wblc*R%5#Od%(4nre5@-Zi!U-rCm+E zt)}wT+wJ&0Sb@@PI&I5-N5h1tYR}#0x$4oqbuWYS5^wnaQiRu`6Iu>y&c6g6NT)6I zErOv4SaTk>I#`l^vT945j7O~wao#rY4X_r+=si8mvuijO#n~Cwq5^IE5k7b;ftMkz zXcn}ioHq}A7HKc(?LNlZRq*qq@n_;VkKH8{!#4_8OB`b-Sm_Uz3*$RHdOlNM87|Ul zqKm!ccdayfSh~SyS#guH09MOUym-2;NUgL*R8o|XTBvl@-wiv0D3zxJ_hYoG^XwO6igH~Z z^BgPk>1)O~#<@O($D5X-{oJl}ocwIsMA(YnhY6;`gs;&1Inj6pxD|h{Ch?xneM&jM z@O#<{@5f|S<#%ujzk{vmW|rLV>8+o|AE(^W)YNPh^Wi*4#eBTZW!ws5H1ilK*|~fu zZ8FgWEV+CLZRWAJTs|bWs9D%qn{j`HBX#Yx?M_tz{!=+^zYFmlB7t563&9ZRvrBh4 zi5iVp(+g^e-A#AYHcUgPRP#O=SCUdc3x|P2Pn#nChKhCS~cy0xH$Cbv- z=@Xxgr2QhPo=09%y%;_$xErfinKE*CAJtd)k+ogpe=U@zQ)u^B4Cb?-B@NH3Yp7U> z&OJ)g8?=T}B24$es^L-0VFxpkcMJoN2pr#h*RHf-h3TKEg4eP7n zjPl&lWqP@pqNM?pnkrK1-cU6)l~XZ!e`|`z*%%BoF-6Yz!Ng+dvLk17HNxC==Ke>= zal8}VB16Ywg1TcHmB1@9dehk>qJlVkfL4toQtkj^K8A?n2AqUV=#fFvE8xZb@K0k9 zUvWW{j!Bk4Vkv^V3yj)X4u5ej&T=>aX`&`qT1BHAY_8FX)<}eKDvI4>JRD6e=Fm))#v>7|^Xoav zFDGXo2Ih^&`1gq%8l*QKD@bkU(DW+CMN-$9f2D`&m^VMfkj`@1ghMg6R~tA8(KG zBCD<`itxIX_U%ufPV>k z16pC~>j1u?LTP)D_Jg-*vuy?1PA|cl) z%k3_URC=0AO}$*6QkBN1DSQSWW_n0Z4V@`Z2TBh0w039taBMyo61!x8?-e)$wLiy~p2tAHXuO!}Q$1(SpO>f>AIVG?KHobjwXkYG)B%I1yS%vhz z>YLv*6Ov6!u>~|RkV9jaHZ9Zkpc?i<7D!_eru!yx=r<&r#_1ex{1(^uHnp*VG*pGaWsB`iuO|$7G7ZeTB5KRv6sDgao zWp?hfnh2+9$tUPVg@|MtKvQ2>ND+E5A~`}NHx9zgkhVV91AIq3?Pgma^}A0K>_=N) z6~8qC`>B}rfUSQC+5o0 z<^~+CVtTo@F)F54V;jpD@8ATqWKk&4kcy4Bq@QS-bO%qQ*P=A_EsUV2czfvwjwT(z z`Ql8eR~u(0OKS^*dcvd|7wR@)f$G-Hl~AcSF+rb6H*Wv0%nR5WODhW>^~)Yjx#t$GcespdMzzA4JdT395ZfmaC2!oPC-;D6wR(MTp13kA@und0S zhw*b;?EzX7q35=i0xTdx&ux7Ict?bu+sY`58zNv?)EYmxH3n=1jGxuKd)F^Haw3S#`B78k;Bg`8YT`SFBbE!{RW0UNKv&ZHn;xyy9|1 z|A6uHie~^$!1A6~>?^nMIc*`HS1gGw)IF~_SSDyl^It!&cva-$CvqBr)t*<3sEnWR zVEnvdSAh1gEK1?$6;Fe0h4J%>C#ztP8^+Ho{!$e;AHeu|#m?36<137xSL{TU>3PLZ zP&UJ8DSkn$pB_fQH+1@LjwzbyM*5Qq&aha5yi||jlY_1CPMk$-KrOthu#z`G4ghQ* z@)%@PZIjXuR`NZFZyo$T3@d39g_+R+#uEtvx%RzDIS1>I2!hXNha&9lI#giqQmPJo zxw^Q|3RbEK$WnmCL^^<+2RIHZ-vWfDYML$POvj{Cz2m62qvAZIt zGfd$J(tCc5!%E!->HH)9d+`7|-3avYAPl597IeN;Eeq1z!o=J?H>>g7J*C^?3cuGwuAECBj+{csgqyPDrxeojPAHy z4#u|)^aAJ#!@_g-Y!|KJFFsr1Rf)NKo+INaj3@E%?1AxA7*FC+3?KuBh3D>hD(d6< zjp{#lw)hcSLv!~GL{>MdMsxR=dg7OA7|-1^6re8=n!D#;fQLkA7P{fRF#ZVRxqF@i z+$TbF_jK%yK~xye-E#)u2rP@%$#eHq>4Uupd}T< zfm)%`Ag{MniDo)!kDRttiKa)H3^0i+(brTTQ3*SrD)sTnt%pi9ch7d@Y=vb}famV{ z8|)#B=kC!eTFWLhMVq_Ff2awQ=Be*HjX7xBXRVy1RSor?MysO9R4O2=9E>Mb=>X7< zs+GHg-Qt30FnI2sKOjwo@!UN#hvB>e5nL!n(61@q3A!i*`qTflc09@iq z^pP(lD&a?Asx-$TumLL3ok9U4aThFAqPctejlvK2F#gET8jY6*%c3g$k$(Yp55^z) zp=0o=fbmDZxM<%(If-O^(MP$&Sls;rQ}eP!9~NEQd@x5 zREekAyCW(Y6b)$})9mHV-7^IhexXXV@Z3GmX;;wPJv$(8gYn!wKNz)7)r5A~hPR&O z&|Brr8gLhRx2YL*?jEGX;6%uC_t^i8`*&eHcTXBXB8=zmIWF3?P&9N!D44rv1@(q> zl>LJAi7-COHUj(w6La^p$EMQUJ$E2ogQ;`(kVOc6w@?i0ER6qBO`0BJ9cr!NRZu1T0V%&QeEFkQY_$jsY$Ouz zBk49L()a6wBGE#bK#997Y->{@y@Ie`aK47|E2sug0j5qd{XsVWT-35}iCQ$p^lBt6 zp;|P>wA*Bp;sWC-rZWN3h|m<%KLKCa%#U_8b2qA9rb9>!Bl zw=!v;oRb~#relifC%ITPO)*_%DvoRz&m;RMzzQNX#q<+^M?`2I+30Dw3k#M-4e&g& zZNXZ?cph181vW~JPFR69kL;g_uYmCxToRgn?+MgL6rnSCq3O8pgz*`?GeCPHG>`0` z085GR?0YkC83E%ncujz6uq;|3pTVbrO@#3o{2{pFg}BC2iQo2rkM7eh5yHd@frL)z+oaZ`(BILxCb1@XYdaI zf5Z4>yjZ*eIOb{p4DuS9gZ)qa-SRp3rU~P&>kPmtm^zQ_6j2F(^xGMg`uIGfN^~;* zjGT|KEDG?+IC?Jr<`TvyW38gCq9M&|C*!I}tqjA$XGCrLtd$&E)llz{ zszm424!>iqFg~x2TZo|-SQb^`^XhG|^DsWI{Aae} z*rde6)I4vIhdZ3qyy{wBYveSiJU*}Pq*c_>u0rk#t@2rb(^Oeqc#7$s&RX{n(hcj? zrkJ)`YEnK?J(^;=4M+UUSQb_0t|8(Nbb>JM8nni3l%3SL)-|+2 zyakNA21%%ESOj%GMW}0d4DgT$UEIel!wqRL?i$(v2+N`s za@SA;tTK$dhTi~Y6QQo*2EY{}G%=^|3Y_;~+%;4Os6vFghKT^gh`y14JL z5`8j^yN2TcJBiQ~(?74m+XUmTA$T?VE*N(WYXKI(xNF!Tc0SHJKVkn2@|xQWZ#s1i z&HuzzA&k3*u>hlCYS*w(RI*l9Q>8vW_RUd=x`w}yvksO;0qz=Zf?bDk*PvCjRWzh| zt!uDegKxnwEZj9{+lM(eX;nkLOVX<7piD+qB8(5px&U>k8g~sL-LZ1&8YV#M596+( z=UP0}3gfO}C#6u=;JePGIKsGVa9oeh6~C3?2vI>1$GspvCt*+ow) zjzunyQ(*)PBUzZ_fvy)ZU&M3bG&2gW6v3*1)x)$9)iBG*YH`s-^$&l$zL+8MTea7S z9Y8-g7+dk$IlB(83u`{eYgX?z#VT)BRqr#knm8RRFFws(ed)CFZ*2JgUa>ku%~~66 z&$;x%W#VxQ%MI8Do|MLVs|gpF*jqGRjU+TfO({}gMURNuX9r@GPTh7M1H?b4=pwpt zKc1PI^YTN>_0hUE+JZGa}n@M>Eh39Ns1TquG zb2bj76q>WK&~|*@VLWGJ3%RD%v?guN#+isuh4Gw?S`NAn$`Nxm-beU0jF+O?NG09S zHw)X!F9>^IcYvs0BrJPiHnrlviq}r*|97g=o^GuP5kuDv@`kW|+hC8-^lB+PF!}=H ziPt&;w1t(Tsnu2kEFnTutQFgdZ_+SzOkA7ML7RI9W8(A<@tAlkWaYqkO#C9iK_WCJ zK7AKPC}2D$?ztOd%`hGlp9C|u-?8k^7jK{{i0d#`#aQIR` z^$5e0l>PCZVmQ2XTfBT44qu6!WvsxSoJrW;m8L*U;ZLj@QQfoC4a^&>2A2>d?SSr`w2Z#jW4Jg~eW@C7Gv z*$U$!@N=i|$PA2!z?+}OKrxJmz@yLL=Q&swt)7R#kAWS4@ep{zSqz53cnDlMhsg(s z(De1$=W#I(;~{YG3pg}k=0o7+FXDp&<00^!gDjNx9mEiL?j>{wFdhPbaT(v~U_1m~ zV=y*@hQMoFLHn>WG#=&|sO}{^Qja)>z!T9DpPZ*5r7Mh2&JC|&P6-&FoZW8VU4ms% z6+St~-o#^&Q26BRe;Zd;Fg`hliuUc4fkXJ@e4{wWZOFuqE@18{)|T_yK;fFHYIe3g6!;0!E_*2!1NwI8BM7+)pt0@y%=u9C|? z!Uz(KuaejNjVFa+e3k6-4~FGoe3iTcU;z=jN=|)jQX*h{m2Ce6UnPjp7w9b@OJRJK zJn1Q>S%L9Ya^+{Ze1Y**@)LktFuoMjb`gGIqFvO}c3(&ABDxg(={XJ@7+(s`0+bw{MOhheEqL*UQEs_-MYK<|XdW%eRkEnVRKiW)Ou ze1W$cU?(+Ej)uc0(1y@u_7_Nh!}v1$@k<cFR|IoC(I4*$w{1uMjZ4 z!fzO)^^yaTjBCr#&SKSzkn%f>SA7KF5KMhTmWxU_SyH8$L3ODTy&D{nC}3Cp4?{P8dF4o4P@ zKmL0F*24JXe_gb1p=6EVkN0mS{O2Lc zAOAOyUc&g}pZ)eiju@Qzcq>I6MdI;NkEukUznAINUZ|J9Ly$*oL>BbpdkgRyrVfWszZ{@K>GUO|rUgx5UyHA0&4$BY$!nA> zYyl02&!Y%jOmP6n7j>*7Il?Q#P{&{PY<;m5UFN0D?GrW+0qicsGs+{z(P zjPNuZZut||N5kQ-Q0oP+f`-G_ixdmxB&`C&;R#w|q~fTA!qjc)8L1tJ$`~YKI6RjU z=@m3VQezmug0TR@xfb2n{)ecAaSu_;w?AspaQHJMJ)l}N9A4Als8omXaClFEZbWD} z{4antL})ntIlyCB7PZF1;Uz2_l>#sx4!;9%3C6?WK2h2RXN|?1j^Xf6y|8K;4*${8 zQOSn!nAc2zsYGZv{35_vA~fdZX62|j!Lq0U9`mXTRtv^sUfK#U=0z*e#=K@BJ{`tq zb4loIei7khP=Y2jjE(j{w<391xiaFqH_M%`XC+B|>9fZZ_B;SQf32&*s@+ zwP1WUUkb302%XIz0Nf!$V_u=Qj!H0$&*nb>)Fwh>UNZou5TUdA9e@i&Xv}MXoukqV z#%J^M00)WCnAbF;qcR4@XY*)#N5vn;XY(xp%V7NHiABU4V69}0!~W^xbEpUQKb>RS zJ2)zBVObR5bL=#*DKI|AY85eWg=j+a+BtSBQa8h}@bFqik%wUzTGb%0FSIJ^TJIz4 zE{wZYN0X!C08`J1HAN*0WhYe{>RqTOD$&U}9XV+*J|i{)_>n5{$ygbWEvA$4bV$Qt zd@>&Fh$9xJ{x(f1bTSTia#Xxwd@}ZSc2rzpe4#TzuDa9DSoO@Hm9%R5Eaf642gaYJ z5dgzr>UnjusDvN&sL~vVp>#acdG#Q2{-8=U=2g%YYlZQ7wT7FcQW=&-RrtKR5NrmF z&#M{kj!F!S&#QaoMmHSd7P!z=_7IIoeGm*9csVCs3b2BLgk zZ40R-jL)mf0Txk?co!0*wUf(0e_)DzsI1g(;WG_Q?$ zbwO??t@1R0DO6cqcsM*JR_h*C(|Wbx@B>KOLG@@jJkiThiG^|3&=#O25$YNi0{jNc zqRQMgJOaB1)n0w=WJj7&ueXfnlQCLsVgd>KbeF|eSCcTq7wBd z{gBfKmPG;XPZonMgmHhORkT$!q@}#NabMMHIxi-R0_hlYpC%HQmAXV3FRz|yN0u&j>>TucMbEz ztHjmqWUP8-&>>nibq&E`j!GbmyN0p=rD1BFu3s6<`EFyyqPO4Kzx z4aZtx+%-5xI^s@t>@=#vT|+KdT^M%_uL17CxNA5oH|i#m(KXbh_Ni-F6@?xjrsiD` zdAJ>E3g`9G@*W}Q9_8^RcNU`DHN-?aDiJX58d?K1g=z0X@i^^M-U<2W8qQK{^e)^) z)^!-a3)V4?iX}|#8pg}6K|`9?x`t%rCc?OK9e`R?SzCBG{CJ|eW@|-5cZEX3;SJ~# zhK9rYqheobiH5@$0xY1Giq00-R5YSI6S+KI#lzpa;qZ4nD6I{LzvJO>{x6B5IpUg$ zs$ckab@M@KedS#7@@X*K3*%i_xA|cBNnWqzM4ofOitaPzNf*Rmcy;kIY2Dx0?Ekr5 zbu7Ggh_>72;SHm)@IBZB9{xUxJ#&zD6^(^ULSx}}v5txjtY}+Nn?_oftD7#y!bj*L zy1_ph3tu2Y_;rw0iLvlrsLo^Ih0tgsjK{(U1N4VwQ5uhh9|YSB|X! zOhpQfg@1tZFO0{+Jwmk;Mi%07EWAm)qtXz@W8qp3`VGnvW8o_hUJB!-s5V?lgWHR- zt^9)2v2dOpTijA(H4$&CQanSvzW;M5T+LNF84Ppq3=^4WvR7w=0Rz*@U$7twHOa!W zQZUbWZ-hF8;|Y2ghuY#n5HhdeKqT%0A`6~~d)^I0@Z=gs-_l-g`L$^NS3n_@C46A?{dIa^xTVuoh?25VPRpr2+Z2b zx^;(cidAij7;JuHXE&Xkl`T#11#u=Z3+w;L*;!kw4y9t@Vs!z|a$`!&^!jlV|eKn#@cw$3%^2loPnG;gXLYs9d6*sCc9*VA5}CMOsAlg z0Cc3+{-0u%1Z=YrPx)AeN0M$ZI9VBY7=HqEre}tXJ598)iZeYlWZdOIFU3N!91LgN zZCMj(R+MWRgkma;+x1nfh6CF;QPzHI(y{6VV4DG5c-6Lw)l$j{Kw;l9h5`nI>u-1+ zRt|117I@Fx=vhAp4_>9>yaex)gC`S%8_iPU;Kf^pjiE{o-j>JEgcVhEpMVFG9DLpC zV};HhwXvHV{Ji&pY+IZbWLgJM3R&uA3{b2JfOrPu$vlSuZwg>T=+TmV3;tzJr+5hL z36ICM@-5!XeNhI&@R*lwN!MX~cUS0mprw)OM41EM1ePnf=9((al{QK{jly?;byPZ` z?5uQG`syP6l!1~BVl+f@0z;XN5ZWl=$&FUV=orEA%FoIKoi{AXabXY6OY1mBySZ=8}rhw#rC zzs#4R(SHSa!~VVUQTeQe;4Sz7u{PMU$DzaCgwjzcx@5)KOmhKqg?Ylf3_&s$3>0bz zGlUBznthBRR%Ynij1y`+`+_LT>hdZ8SHvtlT8$cv>Y)7IP}lGSv-&81WTa&^G&E-3 z6lGgjJ6I6FX$m-Jq^7WkH(`^V;PN?u?dW(Oa8k=)Yd{~iwuj| zuQ05|)LPU0&E8vel~o3x%6hF6AvfnJNaIv3&x!NeSuikM3b`IwB$!j}6Ls!fZlg`42w z$6;tNsb)%=MPcxgu(q&v9P4P&i9PxT_FXJ+cNdm!LRFOR zK)Cbds|7!`iDihz1dCaM{U-c;8P&4>fU*j<2DaW}i^W#6jGY#{B;RAPANYXe=NVlR z{IbOr8Nnx1;1BTh%r*9`i&Fc>l z@u8L@Ek_GH27avNIF#dsq9{L0q$raGo@qH7Xg+L_F1m{GYLuHSH|unKhQM}P?qTgD zm!~XGTb{8z3w(|_ZQDggm$OBth< zUxEEAl{c2}1pWm7S?XUjWR8#Rt2O^?G*$oWTs?T6_Y$mBFZffRsmL9sM%Ka zff~bdS!sc?HLMLYs(~X?hZUtKvtCxc;rm+kW7gklfXo>PG)OW<84Nr|@Uc359PrPu zNjmKptI0a1u6>HtG^-g<=YJKU_%c@aae0u-Bf7k!R>znf*J*02igH3|r`TVyx@vXZ z>ZZ)QZ}q_HZ>xUXVhxn&J-DCTmAVPS(!W zE{sU`0`ifJ6mYByyz3vby^Q@z z5z*GUDj#1h`C99B*6XeJNKQ5OfgOY$V)Zze7q~=E#Qw7N73*u(&#hkw^^Nd~^3M7_ z@Mml75*^d_+Bo8J-O0ww#@i+WC{lm%E;cY)r^N%8gq4Ang_VP8OGTT?lHu#GQXN*q zrWVTDtk>m|vU3G$Dtv1h(b~eSikVHoq9hE$9`xWJw%?YWW66l=p7i5HL z+?4E|M0mG=-`jkY$|sx85`VGz&&FVjuZ6a@DAmOXs!46^``AD z8N0{mk>rZ<#P(m?cio7&X*#1X~oxu+8BMe{4QM%ZBF zVE3b4LtU=6njE_(tmfJ^m(doCTH1Ah?+EK8BUG!iT^Ht)>}Hzjv+b6GFNdvwt+ZP$ zquV6HdkMV5ZWk-Nb^0D1R+OX6jtT9Q-D!c&nq?`VAWTHSB?XZf;T*u9j>E1-V`du{jD?wyRNEq&1O|9}mc8HdKUFha%XTkA6# z?Trpb6UUuUI>X$Uxuf)ec`?hY8w?&|3^RtqM~GM<_zJM^jI~hKX0<+-RIdS0L&-2+ zqr(($Y|J$_Gqy6e6?*%8amvYCI&!p=v9qx&P&Zv}FM)gOw7hzR`WX8n){o=;jf3Hb zn&pl%js_pc+IZs(_+J^%K{*e$0=Cll7i;(~zgyz9}1D3Pg2j`Iq@?ly8h5b+ONc?K$PE!T{an8!=aV zH=(-ci+V`zDUmmj4=lhwNNB+_7HS^`91e@Mk7G3+Wg;U*NwQD2F9e(}c&6}QZ777I z94jU=io=(Lm117jz8w21_EqhxF{;ibzEcX1qYkJJte#Y8EsgDSm^aa>xjNib;#T(k zfCs<^vNnjz;V4Hi8jW(C{UpYU@(cVF`>FQR1fOUBhy5yn@m=12oy1!tqV3trY@1Ho z&UmN&Zk@JY;=>Xhk%-zsKW2YIDkmA8mR!v^laG^nR;Qh_zsT$cmp4(~gWYF_qf&Ua zEv8?|INZbdguViYCeu58%AI5mN!)S*wLjBocBBMzte-WBm zZ?eM_hp7(J%ruNP>-bEExnPSN7CS7_sVf+-)G5^7s(c*3MnT!=u!;4}BD#hBUM`Pw zd6LUh4rkco%qqO1Tz0s^_$ta9F#a=l1%FGfTkyZ+3jV!YEck0}1%I)fZ^7UFVlkL3 zOg1K46E2ucPAJV6XDA*pZ5RiB^5qRV6}cRQwio-W-6|Tm{-%O-S@J_6C7;QO+{qAzx*&X{iYhZDLt#T4!2s+Q68&wrpi(o6z@s6+a-98ez&oA7i1mOG}qCfpLQ;O2L^JT&3Hb=`tH(!W}8$9cZxx#^_| zH%=>WzKYE$WR> zxV=ZW;4YhQEV#o4OQd6zqk4ygmJ;KL->?<@NR1_t%K}^$L|MqOC}TCZgbtHZ8N7;P zJID5p9XZlj#JjNXC0K9a)i!WN#Jn%cevSiC4q`qSokL?;=I ztqgDqaSH#2uEk@V5)e&vN^vS=mX!*Y#!6wQGG>voPUR%8=u}B!yuT7x0jlOy-KhqA zO;|e->EP5!AZ`75zRUlNs5#v@{*%b+>(o!60Zs#THOBytbsERYc%6=3$7v$?RHtc9 zGlV`D{x`<+xm@7%JNydRDyP4kHo$LWoz}mJ(H4~3rAGP=Gqw|Km(yXCN1cwDMJN|z zo6zp)^!rW^oE|zo)+vk5E%we1&W@6~19>=mNscp!4y!dnp@hN0 zos&=|%Xq4DCE&_}fA8EtMjAOccWxnBOMzNR1>@1cZ3XY<{F5%Ct`pY}(0Vxclac-c z4G?~y^Kco%Rjl(U=h2dn1)3^1#rZ!KyJ&g%rt4xUm^Hkez(yAn zkSjBH7Z3O##=%_X)edoqaEXK#CG=SKi88BzONvV&$x<0z5d5;sBcOj=9;18$dn)v2 z@XrN)A^aPc_bwk?zJUGbqPSwKT`f`KJ`gSmxeDY7?zMo4T zDo~j4(XL4{mhPGEm=~^1TifdKZ@8GM$a$wrhMBt{b&48M_wm{iR7pJ_o z;2m{Z7vQe2pLCkmp60u|_CT~3XY`SI{apJCJiv7j&|uh58CB~JXFih4i700=n&Ubb zeu?Wcl*?f&V5?w?vYJamYk<}=TPL*jGKS+@;Eg(Mo9hnOovyoF_dwe#_5H2~fDcK2 zn$Z=(uM2+z{wC~};P-^5ExFJ5Z=pP9{~F~Rq2PFSGh$L=dziX70GXIMqI8iujvt8& z0u_Q46-qI;5DqIo6UxqR zz1#+fyg|Yb5q_xf!-S{m!+}S+jdmNO)6{0i3T50^5xLs0z|U@Lki8bR&TT8#+vc_% zeuvwBw*$ksBvA%B_S7yT!GvqqnNt5OU*+f^d9cs?mq58?jg{kSdZnhkS>Snr@E)P zr@LqB)DjYxlt`>fDFvmpdl{6KVcD>H?hV~@+?xUEmtWmyxzEvQa|NC!{BJV$yF?4! z7r8G6TPl^j7XNTx26Z_{R>=5DMymw>(|wJMtaIPwz8!1_Y?n~?$|&xn06yq`2;~u> z9@Rzj*844VHecpB=I7lnvcHlqiuc`2`P=;;_b2Wz++RWc7xvmLich_ce|G-@X25N8 z7JTcRy|{tSRrmnmwXF>H2op*;`v{L{k64)#CsDjd0&tS#T7B}#LQOS`7V#*`ygZi` zJSuurX7rs$OwP^2!4HRxU_OdVHE%TV zSdXbFXX{jq&wBjkG2df>PWv5rp^h*1SfXQUYg8`vSjPHFE?4Et*~ome#}<#RK--vY zmpMB;b^`B`9A^cA_vtikUB}F{<6tK|PN6(2^~(}zb*{2v)f z)$FX}Lj)cUKZ5Z{p^Snb!+5OcIQa35CvmB+e~#x|X7fH zo;w&*-JJsM@!SWrA9g^-4l%kexwfekWqkIQ@FZ9pwM%)Z+@8w{2OR&3O z9$ub6fnGsgN$|-sC(Wy{#F!Pts~A`Xol;riDiYBaRb^HU<#$4_0pA?f!mA}KoxFO8 z2<4kEJrU_`7VYQNAAF$KAgK=V8tOF+Y&dL$*GQD3Wo&}iWQnIrG@a2b$<5cf@PFu9 z)?$t?6e8cM&D|b-dWAp&! zBS!e$%IlRtui@Vctnh8!25(Dv8^+pp+kzR*6n8LhR(w$UdWU&Oz(;$>utxP_z2krr zB`?mXq~u!LrC2GAvVwO-?@I7hMNYPNeeb5;Ed-dv_H&zHLi{ zJHiX6UrW)x|i`ml!q7{^S;FX3d-w@ za9nsl@qQ}s3*j+VFVHLRH&UbZe$g`@QY?IIeT+aRm^&=OCz5rF;p$c57@tCnOQ6hR zRMw}QPkEpU%p{!=V z#%JqS8Qb$IJDBf6xf`~}XD{=!KIeRHF;bMn4@&43XI~dH#Z@vliPUrta8F-vUtjn@-yoEszESyd)XZq#7}jICOprNA z5+(Z6IemQx0uN?B6y+Kb z*#N&$;4Q*$hutg?`7Ys z@K0pUGl^aRy%g*%yp^A=AFk_Q_I{2i-TgfLJmK>%UPAMR_sJKJ%*Uy20l$KNDXgda zW$NO^1TGF=(yy#8qOP%=UwNHY(XWzUb?};gby@wvuMvD>#yNgX*lSywt7FY{7~@dP z+WEB?Y8T;q`t=3sC)fb^fdXr7{x3gBD(7o%L_w?Sz5mcVE~ z%7cD~q?)(ZGtkcZo%g#aVwe0b>$0vezNS;C=5@huz~9UlQ(Jxj^`YNCeox?^eU4(Z3r|cmG~y8U4)|wLr@NojM$NgpR8jYB|z>tS&Mhc(UYE zfM!VctN(1^IsS9~=drd3wE7>fTY|J97wpjETqSb{3Jr*m9M>QL(UQdn6aY?& z0i^=U1eB9%`G88mm6=x;YOai`+tZ7A?|?q+`=T6_FGI~63U$~wBNQJlBcmi512h&k z9=2GjYHLfuR|Txqsq28(2mBSVF<`S)w*hSr*pKo+z(H1ziP&-B)z%c{q~ND?`f1=Z z0cUl}1;&@9a$lea0S|#5NnLIAZykT4!%uZs&HNl-8E8!pjAC(MZxYN=cs1q}=nn1$ z^D)!aD1JB5siBM`bxM>DYc=wGbYNUy0c50dR%w)F7?tA^M?qi}Ms)sKt_j?%%h?LNEpR(4JGk75axZLO;C_?` zSfedDEYXp`V}U1_ost@^ZGbNZUS{Qr)UQgUzM5+~{v_~e;IqINP+r1b!K{Mpg6#3E zy8|q5F){N%=?@El1;S!sw8X(D2&^gvg9?GC!qS4$%_8`fg?aIyQt)L(tb*_rg;!fq zluFF2qO1n14y(Zm#cKv-Gp@&FeJ&et`6HJNxl~)q4Qi=lt%6#Eb&yIYpzf04`z!EZ z=EG19hmC}d4w?`&F=!Idpob{T^wG~3+@x#msvld^@kq-8weX5JXEL?f+qsa5RBTJrNbCK4_;};aX!%T)xm4Q z*6Wn~Tcq-h!JC3N2k#8t6}&rm4`(0Y@}#VJD)@BpCCRi_Er~vwW5yI-{GkQ19>gV!|Dy;M8L{kB z1XJ=Y>CiJmilNL3DTNYGMWL)1Qi(C~DgsrL3aRSyU5M)I!v7G`fLX(kMj=f?nu!R; zDnnX^v<+z&(q1YGmQEpE%{ZujN9bW0IU0IA z^n_&k+><)>ln!e-r&&Amjfj?E?$4TKo(sJYdQmEufUZfV*1HjU8_HwYQxSO~{7ZO? zF!RmVZ-?+WWASr>`A zhxHBX2R1+|g9I8Z{1Et|0uK{j-O}MvdGVe9e8`y`i&#c*pYi&9JMMxGI9wTvVcpPv-c){>2scE$|Unaaa$NGd1GRqk( z*iiPvP>x_UGJI6{xbX2Js<&IGAhTmg! zUuHcJ=#f;Ogg+JdUHC_-DiMYVTqDBN#X7hX*V<(g@Fjr=3zFUMl zGf$nSM!X_?So4*U0EvPn602nwBGgb_G)&@fMiCLwLWz+PwT)Qjab{|~jwMATGbS$ z5+V~NFUF`im!(mbi7YE)SSDMplAW*-WnzSyk}w;J=5}h1G*Kh|ERVEV4yp zOL$sZNA_gYSMdJu17U*%SF=WfEs9)hrs4h-=F1|NN3MumDPpVh<*bSPE1!b<8+FP? z;7yWmX0(ONom}ohxhHZTV|821%L9lUiaaIbrz6iqo|Wu;x8!6EcTaVng)*A` zI2r#rdIICAD5phFM>&J}0+b7*7cpLra%J?Y=+)61nQuY4jSOeJNbz#{;MNiMD0m>hxMl~BTYaElSQ=7)L*D+kRgLO7jdV>vw4HD|mm|?p3aDhj_ zk7PV4W^&9_T?Var8uRHfGuh8VIUBZs8O62bcPI;E{$PC>%H{bo*2nx6vmu{GbvLoL zh0E=__)g$mF}tO*H)bF3e%Jxn(U{{hf?pDJ_>>M)`)9z<3GIB$B}P|J-V++-JdAmv zV=rS~fql{`l%p<|v8uOW?}XAfHh^(pY*1{7h-%q*!bd8RKv9zAW#D=vHiq>AC^KV= zp)4L-QkPjewoGhU@Nz;c4_`sXt23&BvX<2Jt=EgKAKM_dA!3a1ts~08up!LUR)@t7j~yZSRN<$=&xHLd_^jC3v2%gvGhcvmnTX(-3W@Tza;4B# z$=K@HKY`Z>zE0{?=P$6$tn5X3NX8BebW|!BAp$a*qyvl3@vxVoGWfc#zxTj#g?ETGR)Iva9 zh|nU1kNzqLPocAxfHDJ?DKd%(UyOYT!PM z1OFEGUT}4bE#j@>@tbzMUAz$e0rmp8Zfolj~SNI>|vvpZGPsZ0b;|-WKif<;==J0LeJEH6(l;P}0 zpd1YwBUJNOm&e8;J}!Pj{KWW4K$BrpM2)HJr^QbfJg<(1e&xul_&Flu_xMEuEz#9k z8NW)f)$wZ?t&3l;i=&S-W4Pvu-)*Ms0o$un_6fWn{s7}cD38F7GrPehz5yi!C(yQr zB!nhJF+xuvJiZGhBmpN2UJyP-#>xX#7OaX?acv7+E#W(qHDEPGq)x*3jOq&BKzMaO z{Rq}Dp$%(oQFch^B;uXfcS-00-#cLh%8?14wABgQbPRVZNVbE~&V;=Q`w|WSAA_Be(bEE*fj^sYF5#k#Tw-*U%NtVFjtBCO zSbd7}HKR8PZxh~sGxMWVKM_haBJR~s!ERvOIlrg#( zz6UdlPfUPMl#yhC3c?qLr3;=3Uqs+yiNysfk(ecrwsmE|%O+MpStVZt#|o5cQvEKm zrogqNrnT}dUpui5^6GMKwyaT~Q3J^v0<{pVrBqupYLnPDv0Y*ZsnS|{Fzb(UVB#Q@ zgUzDqb_`){XyUNMk&I?1&Xrm782yHFq13dkUm}#f@CS6!LyV6m-q2}kom+`_6YuNP z2LeA#{2S;WU4-(Vnepd>y)aYXB)$dzl=vCt7moag(vYNWas^ViuPIowq~>Otw&iW} zsqMhq!#c3u5oPzJ9!b5Dh9wOL9+@jwPC5g2Q5U@=@MZWLNq3X(CEeFW z|6%+%=_&hXT)s;B#QrmvO0pqY+dCFO#$*TPCaJ1Xr+nNi*&B+FPy>=fbn(#S@Z<;` zS6he^N_=vHK*{h0lM5%OGtUqzu0Vl`NmfcCZ97YUrDzfSI+k1^xngp4&Zw1KM`YF& z{)go3+OO^7}WqUqt z2lIVWJtWa#Mn{uR3+0UPXOpi1T~EG=@)m2aM1CiI1(s4w6r4^A%F^RNxG+*L>M%0Xwh?gl) zwm><~t6rd1f!ewnbqZwbm|CL<!?|9LbUK){NRn-l0HO#@(c%ZBw4_En1^s^⪼)c=_=Ji!vYt2_g{0j!<%L&cL!wQBMED9})^)e{S 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�B=tBjMRIi=E_wWU9o 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�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

      (Gtg4#0ng5kzkP|b?Pq} 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�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≠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

      XpBE)XR&UnB; zTdVapM4xfeMt8&#yUQ?r1W=Gd>~07*fu?`K2dLbnK8MN4~X5?jVV3xiQ>CN z%r{u7PxNHhh?x!4C)(F7Vzz<|xki1Wr@BYXB%nUg9X%N-0`-Y*vk|a>3&yIsfa&u;Sl6FH?2eZbkitFI7Y830ZPc9!H;d?m*gYzSLhQ!n z@c0023Tq%_i6Tv5PlWEGNK-fwVLb3!+m)nQ-qx+;$O`bcXkttb7DDV^+r&om0agcq zM)MoOFQP~^75g!?1{zH}gf_ryaa}Y+IdTWE(PX#`n*xajVt0d!W*JtG0FCB#gzch8 zG^Y^05k+#7)SvqdG@5NLnmQb*1#I8Zx-c5EifA0Mdn*=$fJQM3VTLFY#q$UoMUf~z zMmPjCiX;Ni0{ep_mx1@E#BQ#f6Joc~016+d^Pj!XYyEf~D3L?#zA4O!IRCq_c@3!Z z-)msRbO7p#x3g~8F#G$Jun;oG;vFpB0_uu~2H|jnbaBPA5UPkGuJ}xZsiFw6`yRsE zK%2$uY>12mR+Ah{?6$athyl%_5WC~8(Q^CSl@#mP<8Ew*0v&rii}184GO6Sg!f{b# z?2&ORnFkuxkWxn0^hE*v+_|>i~aMTw;aTJwP)5k=Xs+hWh_a?2fYm z2(eqALi;CTw~?&`{}W0pM@gC?!)>UlO{`c#SdY(3(#Nf~XCY*!>>iIPi#F3GYv0H)#zuK#1MWLnEd=P-6Ee!Xu){jNRbfj1q>S$c){p z_i%rK61y=UdBx*5PAYGY2(kNaOG-?L-Tv6;0A(JhBTNMzvFq%E#ym+jA$B)+=PDs~ zpTlUqTqQGhFCzRXiV(YvhBMRzO6-n87%qwsyU!u47e!|5eur>U6d`u68i61XVs}2m zEK!8mJ%aEl$dD8$vD@z6h$#k?*ljrq{t+m#n~yL-6d`sijgFX0qR5QhV`FHuffBnH z$B|m_C$YQ#uvbz_>}Ed|Fh6wV@fKpY!FXD0pv3OI6X>9T61(3c90N-1*0Kf5?x9ap zP!PMBt!?r4oft7U0k3!wrUK7NA5(aP3gjw?-HmdUIO!WOS}#}0jNOkAJ`hEm^xqLK zfeg7uo%FOx3=M%g=`Kw6QMRGGU+1K^!?X?HPl;W#mT-jF9nQf!fD*fh5#AF;X6z2m zWpDwM*fr~z(cG5u5n{LCeqQU_uA=hZ;R-r8inmHF{&^XEcy3Bop>2biH61ztWQ{g1{TS)8{&!cw$Iy`$B z;W1HUc-Ci1#IyrSlDg}H#!2p%p;`jvp+mLI{D`RvJd)H|#QeiG-mt9`wjIRY61z)m zdIQEuE9?;=cF##PGNc^IB_n{Qc`3rfqDY#zBWwklW*0`NFf@0BG;eolK92b@;HBAF z#QwuIUYg^k;!6Tc><;5ry>|okL5SUE9Ip2QlO3 z;fnwr#AMhAn0NQA4o)_=BYg3n%Rk7d40v{#*3M^|d3MK~-Hq6E7dsuq4CAa0VwQ1e z3D7~z=Lm<%o9bvgDz>^^%f(TZ=^cRnv$f%=8wrtMEeT1)$DVJA@WMovS-+AdGU?lLG5pt>yGn0Ix}i-RD2^ zV*JAXHYSnkO@55chd{l_$RdV6K)uPU5$cH|-sHmwi$oD`@(YB+Ku1Y0+7NxlNw2sg z*0b#RP{iB-tOIxZ=U!6ox4#1OMFyJvABHsmI?&8|1XloP5pH*>F;05J9kBz=w=vxf z_)}u{v^#G)$~}kJEq*<@5MtLXg|fs{iQNS#Q-Kn@Yivb1WPdM^aV2)ISjO}Wpv3OI z2t!2?V)rz{3E&aCW9*G}mFd3r1R%t2l}E7`$c){=2!lisVs{h5dQoJ?ZmGwpUOq6o3u zWCctzP-1sB!c?G7P>lCrjW>`I zA$AvXd;(Bn_wAL?S3rr~U8^Hz4Nwjs(RwAZ#z`smh!DHEa$BVhEB+*8FfhsiI1`qU zDECMWPvpFa~He`&~54Ir1p5gY%Lu!zOzJ(YP7A z`?1&yG>Qud=S7hy%03-2rGZA#5}`TJD4G#~=Hxbx+yeN^Tx_3~|AyF|P?&^VNdm-f zP6u)-z3`KSvKVMDJbEn;G0_XIT8x7 z+qM%46=L_Q0@5W|jq()2BS4AWZJ4g=$YUZicH3@>i zlqf>%)_jgi4V2h@9^qM_tyNzeqR%*~zdK@y-K^(%@eU|RA$H3@PeICz-L4$#tjE8yf&+cbu=YN%3FLvq^mES~^@)c7{4mSnr z6XhXH1pMiYU034FcDLcKbKyhmo|P<0fBPGk`~tMUt-Kilbo=`y+TRY~Okbe=?c)f` zMUfY&?;^Y*iuAYbU*jz`(Ej!dgbzfK7pd#EK&Jq`fB7yo#!0i?5!>Ik+sfz($PE-? zx1;1+h}|(991fJ&-Hq_NC^BQW(>9tRppE(_8(!Er>17uK#BR4P_9l$nj)M=3HtNoV zn?-a&>~0oAY1Eft^a#+V@O6akqDWJC3gH`3lnUJe6$-r8R?;lQZXJ%)0)LAp#$>-h zG!VOKjDt0rTd^7hG@4lmGenVSo=4ayiqfG7hk)1O5{O3g2S+Xg8_gk?VUsJ-K&i|3ZUZa5XLhL>! z%!xSvz20ER2h{mLjqoKL=j?lJHo4? zh%0`@u81iG)D<6qa1+pG@i!YXBY~Glj&;8ea{7Hhvna%Frj53v{jEldb?g!K79$kw zbnMX#r7_U4$9RO%q6o433c~Y1W6ZLF_)JHM(T+XJ?xuSN#3;mWKkLdl_pz(QD4zTc z*t8QnC3eqSvv}LMj}tQ)7p%l&nV6}=KgarCZhW8)|IeI0CnhE{#umbVIb%1Mlz!KP zuw};Xb$cS_8lc4Pb%o_uAi06q&BsoO-Er8A0ZQzyKzK|PnX$VI;SEuQ*!>RSG*Du9 z8-XaXoANg8Gf-l;AwpfC#O?$eBb-h)6(CmSB5t>WC5USZr!1b3=gxC#RVpldch6DYBpyO)Opc*L%R_b0J?1Wk$EV;Fo6l-Rv@AI%?7V)vo<86^NE zb~hj3{sJX-U$VvIH%{7bj|j2*L@!EAh~4wpp99J~mN`h<06b#X*$2)3SI8#B?!qBl zCB$xPjG6-_cBdgs7Db5NcM*1rA~SYlKZuwhP-3?=LUU1s*qwwhP81<_Uqjd=iV(Z$ zA4W_$pv3My2zP=ENr4i(AEP}9l-T{?5d0%hVz=bs2xA}=A$DItm@SGByCXlL%?3*B zPWz11f~TVg-8)bQ03~*RL)ZnB z*xkQ{8O=9QK0@raI7X)gl-RukVGvMa_YRvmvbdGZLG0ev$7XH^Hrs$^?i+;TqDbZv zzvhh>$dGF^b9K>b0?nKYGiaRTeqH9qVmcb|r^N33!c;iP{T33tPhq|c=;gP36mw*&svw~HKgPxmnFh1ku{AzJb6e!%Q&puXL*pO}#X)VV5g+`Fim{hi*I zf|bvq(k{>_0(Gu(5c-HB#O_jr#iEFF^)bRhpw3lk8wjIZNr82)uD%#CjR0Pg5W54v z@nW1~e^W`MdXq!2xecf{`2@l$QN)|vhp<}|@g_5W<|Y93ChtbL1L!E}RvV(vIO%qG z#Cn!rVR{5u2d>mfFDW(cZ(~V{IB+Sy&@2GY9qe(+GrPzB4iGbO2XDiqznH0?ckHxh zcFF##pZ6N4UlbE>pgFYg9yw{gJt8x9d-bE-WuTe#E5jn71I@+=^+C74U!nue(VQ6p zbfEbn!X{BRyeYqfdk(RCwm-QLV)sGJrUE5)ul${!2q>}J!&a23_IDo{S7NsSi>HAS zyU~B}Oo<}I?gW%Ez$136*czt*pJa(phMaV2`AUZg| zjU%^!zeU4WyAln=Ze?<((L9XRVxZA%L)apUL~{b+Yf)t6oDi4Fj?^}q2+xQjQG9@K0BBB<2taf4D@T3?{AISY;r}

      -Ktj+UKT~% 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

      ZsI+J zXZxP#R6gh5$nN%i4SYl0_rMRN@s-<+JBen|2tEyyVX58;V%#N!DkCf78#f=KWTLee!@ ze=TL|+PX-rIJIMTU~ZM`NXmu1E7%R?nd<}ep7JUdivv-Jg39{t)U&?lGx@`wO@es56|N z1z%t-Uth7ln0tx(mwD=nH2pX0JGu9yR9X7~{!#7|N?%I7SFHbKegl4+`(JLUezX5_Ok)D>E{D%i_(sEr2RMvk~-Ri%E8)-Wz&&emLW71#gl>(L~WlE@I)mT**2|f`GU8jGe{!aa!`@3@P zA^M*Ey@ghGC_a3oyhHzvL4qPj%&p%d<0O#(fo3 z1yrTHY9hm{Wu$B8)e%`eD9gP1c@4o$@|tn(LF|?1&Axq}KdC@qFe;LB{Q2fZ361;m zyqLWByu`d@DZ_L3yguwRnX|yzc{zD`(p*0Dz`O~06DgZ6b=0qP29lYmS$VUmw;*p} z-fA(mhSWOXCe+rvpSiP_8F$7);q_+H2Z4w3eghss9iY;?`q!P ztmQw6FX`(>b2s5{<=qC}%e&9LM`Gq>-kZF)?EX_YU*5AMTxlt(NV>X|)R1(|{95@| z`PNcWyjNqS&A8J%-ww(l-|>r+_(_c19pxeV0i*(j$9oi{WAbD3tm8&I22n>pQ4unX#EcFG$3<~Y0k1s4jgiq17s*M(Om{~>pS@Ik>t z;-`eq3Z56dCiS-9BQeGcl{F^75`|?*D_%XS7FH{)iR^32YZKNfG$*cCSfAJi*oc&} zrU|KLh4zIl3R{Ylx6@IpLdU|^x(R2UD;{<)^eFV?o=;)hLO3r3i(GA8rmp&CKpjf!0?nmXj`ckhYv;)eKvepBf1~`*)CB)2ceYQUvdEhf(L{Q=!_&nN@Jj7B_B5+fn0YfOOn;A4A`aX{4(HI@_T@L2mGe%sq2q?mL1h4$Amj6RPmWVS7$MG9(9qX zFNrmmp>7ShNB%zH1Hy-dcz!kD8PrR5c)ThqQKa9!R8i@oG9s&3RHf)E;fg0~h^!{5 zT7m;ChRxK2TYx?4rJuy8v1D>{zsBl zOusdhHFGaf-mFszGqaVbz>;QW^GjAROEIZnW>cb~nTJV5vmDd~)E_35%qE&tHS;q} zHJf4>Wq4LCBZ zV<;+B*6`eAF>O$ytZ8LKS<^X&v8MfT&VNnH8v;vI zG@Li7WbidqF}R}lu5>xm#U|xVtC^UZrWnjjr>H$hUO-vO{bMCWBPBIvZm*-M?mTFrkxF@rUlqzgNd1`MTrWgvrAMo z{o16W=~|OYrb7&0nK~M#n1^B*0Xj^ikp}k>*p-zdiW)Dk@H~R_vsI-|` zM2Sjf!G=m^9Zja2S>eAzU&Cm_R+Cbu;U*(ZC!35hoGdZYY_MUZ*%Fg7hU=xv8p@R@ zV|EDFJ+R~i{F|4hOt0W;pH`x@>6MaYO?Tq!-(6~)XLz8(oD8GQqDzl5 zJSbhp>|&WQX1|vhXZp^hvLO^}e=>|VZCJ9jX}^-=O|O+4Y4*OvDAWFB%9yn_DQgyF zG7jGZqs{!vjxdWg8Ey7g$GuIhaalTN9^L35AIwbjNXgs>t zbCyGU;Kj5g%{NMG@@q@we5iYGO)h`0%JM1hvvn!YFAsVC5BigA&O?2xCg4|F_Pcx6 zyZ2e1JJ`Lx4sH1$P6JFUY4vPxdU(^Xk$scOrrs#`)knd;~Bh0$^3_>$_H@H`pYqpBQ! zs>;JgRkh*VP#eB0)rB=e9l2=;i-qx4y*bRm@4c+mSEVFdzm#SxSgTi)j_haavoPJ* zElIL7l5$o}t}e2^=aHw~LS6Q3=+5@Gj<89%_COZNM@_h;sxzEQ zX08q`*&oJpY-r6|lN#eMhc}FCh3YzTH8E^$UV9n)$I*m*7jvIo-I~wxyZ_u{>FToa zwuee}XL#P4o^MQ-rfp#s9j_)&f03sIj}Iju(~{Qw?W8rl9HrSqrJ8IwdbBFbRxtK^ z=)-*DKenpN*xSOt);Yra7vj#)zf{TYOQY-|e0UbmH^kR=(Zlz&1V#u(=fo_isg z8WyMdjI^9zPOe7KwJ+GO5%~7CH9ExFjHGWzBrRcaGWaTanM&qXBxmb|+Fm*}bmvQW z=3T7M3hueF^_oEzCeq76)g9p}c4Cn4o?`_U^6U%QzQ2=+*=ojiO{ptb^L%sHZG=w6 zhvVWJYf%oznB$7(wkvsQWAlz7^8@JgD)=$ADhf~d{_^Vja6g`1n6`vhs++@0`5BFK3X=li2z%*!pkX_t@$zdyia>4t=veVRE*3;R{l}psG82)OdEr)1Aom=Sf#S z+juUaXKPhA=V#FQ31ste@;)Vv!{K!3CNeWRY0FkOwjpfYq^g?y>C)tUcRYBu)S7*h zq+vz8=&&BUKnFo_p# z4(n8>`AXz;F}8Uv>-SDo98NXopFQgXbRk~NFs>Wfjy>tc>D866wSO;9Hb=2BtDlgEj&tT>#F58oQ=kJTO7>DIMBdHLCMYOAMbCH#3j<|{%^zC@`r z99wG7UL+GA7}I3>y@_%C$}gn!cBxR8*P^e(nuL=DL!*NJ2unbeaO^qr8rcP zo0qLo!gj1ecAD9kBhjhmaldu{0992t;!%@vHihfa4Pl10FNY`0cT4l$)!eQ@zn1!i zjXcxmxzBT-=RUUvQ`owg-%G>y_}l8*e&qgc`c&AHf&AY$bngxN{xIDf$8Wqy9zW$T zs@Tt^>H6ZSIPWBD-^fOuU6Dl-4RF|1bA7FNQeoK09xyn0&FnstfCpJdNgu4>8d65p>czF$YYxl|Z0wrUUi z@VOh{!zS{ATD<-p&oX0Qf&E%k%(^GL^8;V^nCI?J&c=j^asV-`wK>mR8`;1TovgCb z`;nz(#UXP&?{ajZIAliltG<^LgH0jSx&dy{D_O<@wtJ|^x{K3WS?P&Ad%$iJRR~AoNLu++Q z_7VBI)B1?hv$K=-Y;Qi`P=5b~v^A{c`|J4VKg9D9U;8{C+YfJ6#GA?HzPs4@eZOCh z9`Su)I6E>O4=3f+WiCG568GGA(bLn!XUCL!_}b>Yupw)*bHmK{w4^PpCTF~! zpC6r8^1a2k_u@_FyQ$*qCOjQ1W_ghgUxC;4&z}CElAJ5Z;32Bm@YA$c1ALFhpH_nyF>VNn;rpWiKeZOd;e7Yt3 zAGzM0ul~V!`i>Xew28Yw@BhbC_=WFTdzVvj2IQCWX>I89LZp>eX>3nh$R$!xNimBJ*i|)p! zthy(U{d?P_g*|U(Kk9=xl>cuIZ&%0SCic(0ZZeiNsw>%S>-Q-d93|oMI1M+;jXw}$ z9zx%*5r?g-uJH_+nvOb+^PJN3Oymr}nT`k5qMq56!=bJr?n-dkfh} zl28#VtWEcCL0|9%H?zyvqi)v>GM^*S19GyB=)_;_#c}NO%cZuwh!3_BUnlf_&!jfH znob|i7ZpBitEdtlilS^No;+3SS>KqyIKbzplaE#D@)XZl$yz_h z-t5NCKO>*spC4O|-5EmuKTwxx!pp}?@;E$u#yI2)`J-ufSegx)L0)c(Fgom>;ZTk``=GwZyes1t=pUA zEXK!=$?m^+xRdWM$A?3GzO>KBp=HVC8r3!VLHKYN>RT;O7K2X2llA!DUGZf;zD!cb znZXy%3bpJ)9a~(NwW(Vj$v!`gHeo9c_1~9@1BQ}`^TeiC#BKREbaR~bucZg$syp%? z{_f7ImhfF@%^xw2^Xbn>ve6jF*^1^T_s@PY-VyZc?>Nt1W-s1R`#GvKLEWb{JVu6I z7Rx_d9c8U_?qut{fpxygylTkddTi8#a`t(6c{)Ef3xBUo+wzUYbdQsTGoz0Ddi9sR zT(e=?5$;k4nl1J}h>mPvocIxL_1*309do!hZO)q6gWb|NztZ|&M_-GaY`H@2{bonD zb7$AwgSHn7e}bM&%i(tNP}D63h0d@HKFY=U)CxP;oWBq%;d1%bJo3=$x|!DCShitt z{_Yt(9#+-G4kp=ga`^t{*+pK)Sogol{sZ)G54?FHtz=)Pt)ZU(+0A`Fp*M#Z-zVgE zJL`3Tcw|oX_ik`0>4o}Nr+W*Gld#y*OC9ZX+`klQVcH4&v$qrT$kV?$3^ zl3zZ7jGRgy)^^Wn?)_k?TaBqzES6@^lfj|Z=M1%~S@^J&dlvEkBB&cZNEU~xeY`<; zcc2Fgx%c^Eu1&1}FMi*LjXIxPyehU@z)tta|B5x*A!_z{7VaS*-;s&m%$uHPuY2A& zvF*F$ekvc`ueu>yiCx@1^vjM7)6_f4z4`u8t{dyROVEDwW524NY^2YmK(k{Mf4IiY<;bFE8 zAM&aAGZ}s4*?aS+bI9mCv|DvKA6uQNW#;*-p8Kii-b^m8a{uM!1plOQxZ3*9Uq zWh8V3w)}&*9JVTAOSG~2+W~Z-%X%G2HeMCOsgsbIa(0-tyG^X&x7nNGxxd*iJ|ugT zKdoc04k=9$H&^n{jpcD;XpQ<>gTC3q*1GIjyOG6Z;5|2KFpTCI1Ut=qa{IPGTiH;}PczU(D``?LnV0V8*DOsHCIUV$- z1;1o2*$STVWT{cjy-EGPe^ws`WVK;Bov2l}O0z7<*@2#Hx;45@ET?7#QVg4RUW-p-EbIE+Mj>FjQXWjD^ zG05KR-EVTk^{V@XP5F_Z-2Y0on2r4VJ~jKL*rhSnaWVI(vrccw2Vb(54c4bwPBz!? zmNMV7irC4R`{S89cQ%mxzaO=*k9j^_ZQw%wWsds)Tl~?9Y;Y$VM=ruP#y_((RUDsX z9icP(zHRP|_Yz$nO|E8@8jY(_ z-r1xF(6^V;&@YeVW&PQxTdnz7Wa10HrfmM7$(tAUFY$vKBYqms5P$pQ$xyOVk4EEd zD%X0R&uGBEz?PTkS&?%Mx90Q6%CoWji~V{|e192v+<=^@&1YAZChPxHvPLp~ur=PF zeqCUV`;*P*#ow=szYi*WsRfa}hg!40-)M z;V0!2WArkPAeYORy2L+GzBrw`$$CG|EC!56X#yK@jofE*a=9|wv|>`pSCr4~OuoNWGpbn6 z!FaG)sZHJ;=Oe^&ds(9i#<;%P*qUtYtzxGU{QP&uxU;_pMb{20P4ouqH0-1XS;tq>s`qBD(15#nOm3+^g*|W1~NBQ?vaOA)ieGgPfLk+KEvZDt=AW> zd&5}P#3Ox{a3wx2Y%E1wdp4@#3pYmJSoekK--+mN^tRmkUAn#)8GQ!LLw}(i-2VtP z$NH{KW;Z}zqV348yj=|`Q)9`(V!rP(zkbHGDtZ|$ZSE_g-O(|q1F6-9$Iu`6a3(&C z!iQ<-0({tz+|=R4+Gu0+1)hAZmbekxO_gvf+3#tda0EF&ot|z*22Lk~r;*zWJ%1Y8 zdzskn=BhR^en)nKSnhGL-^X-lF}95j>+qYg98uL2iXQT4 z{_@~3gD%HmAvUR*ZX80VR-+dySep+#cUx=oA0NF>lIzcOsa;mWxv3f-JFyKP{S;gA zqxCw7{~4f;vN2oss#s+hIjUx_9!R6m;@&mYJ$gzlxq2PD)2;5(lE345chj#I+1C#| z=OOz3UDA=YTjP{(zl?0J==U$8CNex(UAs%Ibp>-Oa-uPO%$*?#iaNL0Oyx$b~BpGVX6AR_hMNUt%@4wPrL)9?Q5$+=?4lAh|A zq&Yvy_l`itk!WBo3M#BtU;qy zgBKDR_wl^`o^=)5us2^no?ri;n#(EjwPRd=E?a#E-VGO@sNIDb__vU{*M-(|gqZyt z{AuwzxOuTaAwXD5lv#-A2zT%uHLvZ#8OuVmrAYf5=X> znqzaAiw`@g+iyXiM&Mx$U%d;xdMv3ClXPa^8Q*+4YNIv(h)mpUoyO~(eL|MLFHH)E zlh4QK(mQytje8v8dO2XWy0I@(OHWkqbQ}9$J&FIaOTwt!FhPo%s>$<74dSJ9MU- zj_#*UT+hF~Be%PS%-rZ+ccjhvO;uC#8gjfS`>!UgCz@vWEktQ%O!<s1Qg12gs`LHO< zZ>O`L;i=w+9I;7`Jw@#`Wy|%i#Tcu|m({DY%dF)pagF$@CcDG4yN%&9>v*1Le&pFB z{M}G)cCdL(ixNHTN_Hxl7>j3eUH9(D|H0e6_#p91K1(iiyO_1a&d)N2zT|NUv<)3S z!CJg;JO}eXH{xB)AO0*4+Jg<~5vvq&^yDO>^QqoW4c_tPWN;UJT#fvF$tE66hQ1UB zUMA0qjlB|O*)eqMQT3Gd)s7ywwhN5^V{+Z%`%UP`FZeRP$Q{VtcgFg?dkmu&MV>JL zPv$0F*;;bibIkF7eB8PE*;{+Y4oM~K3s-Sq6ldpIvklGt4msvw{Ld=Zcy`hWPf@3* z-<|!5r(cqxYuxt&G1|Ix>Tb_@PF|{(D4*%n`%2&r%JiumRv`~-lqQEg*ou|N`@UkD zaek{epf42XCALQ$AitjM&ry5$q^dpJp=vVRjr@>pSqQ(Li&|kBl5iD2f4%Yci(1HL zC0m|9{F~j~*FCN_UxyClHAz`LAkWp7`TttERGnUScb-{?Up=$hSTA5N9x{hk_gkx2 z13q%q+4H`ZTWm%q4riO@ zle=ByT58An`g)2Su6HD!C`LP;#8um#m`95iFc+`5IEuSc2gB9^kbu=vO zUKb@vcsNP*j?*xh984hx_u}b5V;Cn_D&ye-y0RFXwm!SDIGw9ymujmT<#hezzf;s2 z^@~0CMSMMuE*?%7Q*yExUXN0%P1ul~=+P0e-lfkwPz!mw%QL@%NPjtcf;6n;G~1?p2TaRX3??PYI`3^B4L4 zOU-#{_TqlE(G99wLtES|pXdyqxW}>n`>D7R*49JoOD_iNDKxV0=UCgb;%4$3z(%ReC_)$GoDeAX2A+lLOGMIPy{-d$NuHxJj+_d~4NvOc>Y?x4ewo?MzQSyjRR zcJ-*7yrz7g+(`XYZlyL_&KFX{pCQiqR9?}K&RmbSr#CO~tp}nCIB$|mogfD}-x?Qw^g*)y1Ucz%4tvm< zW61emZJ%7uD^0y=`Kn zPM9k=4RhWeU25JhiEsOh^VdhOp`FwA{AAZx$7S`1G8|6^i;(AApc!(-JLP8+#1E^; zN7+F#8mpDX0VXe~Rfx@Fwy8#Z(nS_y_N7&yNq?G6T^0Y9A@|47;ScEY4@Etg{o6Ha z4Oj5Jr&?dQIW^)~-U72_?gP#JefJql=7w71KH|(V?*DV>%5ISt?n<_g5aab&zw6BR zbUvr(Nx;g5SxJu^r8V#88AI8WdU|(*oN_7mhmF%eNCJGEwMx`aYxv;qaEz?@9OE6& zmR-&67kJn0#34_S(;(95v1t9ahY7#r8xuIfN;pnzIe<-Dg-mZQ&iIrJY%V5#R2{HU{H!O^n-ffo+C$N2 z`BL9~X?AavIHN&7b6qm=B3#pC<2zY@qvH89#M5wKdPQk~0qd>npT};zi~s+~{|^x7 zeQZt6Njt(B#F_N#J?(YGx*$YZN z`CsJleDfbdzF^Q`j;5*I!V0tbKhWRVY?JzX_M;g4DfpVpv$G)DeHt+x*t;~<{2iB@No9n-an`eRVENHnX z4e(+7Z#k^RHoYUJJe2+39IwTRSsnjSj?=8K{Q7e_?$LN7KM&u=^{Sc;VMTl#D5lum zfAvxOe?u-cUvAHKqY68EO2AHq_6V@A_ z!GwvyYuUCs|6j-MO%B`ptCEmCk2h=c?>mSWKh?kMk5)#nh!tOiQ_&mF9@CG7XQ#zU zSUqhEhx0c@edz|VZ6hCcFrMm}!*+CJQ^?#=Vz1b`eZ{91`iy___!_!c)^9Dt1!Vy~ zE5K*5@wxhH9^kXWZt~;%J!^eBu?btW1$$8Bg9Gtw>$s8~m9*wJ$z`sl3#*aq)Erlc zTC!L1WDDa_YZL>+>RZb?v=O=uU8SDVmwtBhg=?}?OXCl0Re-J1mu?G-8nZkne??t# z5}A7mjUr#~$)PT!OaGepTR69f@$@yGC!#L6_Zrv|m|J;TfnVL$HErbd@~ZLq%52Lx ze*fL1CH!Hm6RcmtPo98J`b$}DB&JbY*cZ>9B%cdg1O3440x}v|htcAYQ^X%nh}mC8 zYC`Jp_43#8`X?EjU02xJxa#Fi-qIXSkkBz%_-H ztt(jyFirZP4Q$(#Fp`h>5igGsQ@>B9mn7eRn9HkTn$^r}>!ew4vNcTQ<1b<>)JfER z^bS4$5_-0eyrAqkKZ(8dk-~54B1^gd4diDfzd0(ZWDkn}{xhG`)sar%*LOi*(+ybo zu%v5JzH@t8*d$Lm#d{?D+iZzU*;KCgKcEqqlz4 zB8C{km%=ltv$7F%^?lEr$(QeLY=@%@`Mu?g?;Smbu7Q0J`V-^39tqWU3UajNy$+gx`Ms~*TEOw!ZcE75m0rXt^eF=@%ZCSzml>o}sQ zABuNQB2!Do9r+Y~bcwj4R-Ohpq41XLcI7i+g~EiiK|iN4EGzC>l)NuXig)4jzqAH# z#u+Sjl3j&g8(Nnr>BxTJt6JQ5syX%W(fg}!ir?6wTKheEvV)AhhCJ`3hOm$O|D7f< zq)Au`4KoL}Q5~W-{O7*v8tP3A`h=7Dgz0L`7529heu^sjYe^;BL5&w)D8LJaFWqw? zeoro!k5VIforu#$ z(rg(%Y$SUlZqA0gPmaEmFRsO&jc`Bv2gqD5cc_Jfs)dKDrFXS@n00zHb@Z}M{!yu`egLx*i{E$n#{F=+WY;eXU2vo;D|G_P#L`b&vJ< z9yQhM2{L&od6^84*5}`|G@Owpd5o8XqjE;K*%I}2{lU#(OBW_Xzr_>nU74as6{}~) z0S>C@F$Xv({q8KlLCHaL^%Hv=$RQk*NVi*mJkFm`_n6Q3ysO?()Ggql!lNlnjy+4o z9<|-XHFvW8|Hx$*vbOgb$5G~elpOyGdAJ%wu)jb*J{BYCDaoIHq~EXW`~EE-{Fi); zVGk$b@ofM8SuWlk$G!O|j8uS;G7dQaJF&1hvcL;ZAh#=}U1ISHdmiO6A8;i9w15pb zz?j}-gFfancCvO+lHC5pZrsmDY>n#4cnQCXI@>{Ltp9$D&p3$hIugBz zcICTwrPM|y zg`sTKH|mD>lfl)Z3Y<=wPiG6ZQ49Om+T6*$ofIeZpq(FY4UbskA!3OKjCV-rlMmy^ zin_y9Xu6t3tS<4VxyftwAsg)7nm`s{8}N9RF~dQ@OH}d$;xvEXeQu@CnYqG{+jB5Y z{L%qWUkR^A75GW}%-pBgOLwEVtO~DAHnxGTfvr~i%3+-I{31O1myBJ-Cct!s*P`Zp zo_MCGh_yUx?YO(Z-RJj-JEt1U3naDGIyCBue`W5Q%60Ez%hdb>{8NB`!iU03EJCO))IG|?r$3&9ifl$I~%{1wf@<?N!1^A`_-((K;Frf`%wDG;QfcMGJN_^n);-|IQfqmF``{CdPlaR%&p@IF{ z$}^YuS*>TnJ*nSEY=l_Ev#QPw+J zsR{d;V}V@SUx#&wg z>3*M?2i#L=Wh0B274|8>KEWv0TifxT6T`Vj+4Azd&H4LNP~bzZ!LMm)D$i?!Urw`6 z^kY{NXS^mB*qGm6R6cVB%tn)X>UQdeuzL2Fs#%Hoe&SP>@qD->Sx%;244+r(!=^N` zF-`dlxEb1>uSNf_73Xau=MXFAY7TO&G*@%T)g1V@PWfABK23+T^Wc7hLt0j%Vc;&zynDDTv_U(y=gO4pahr~lZj|LmbXm6ch?oPS0G#UC%2 z_a@?<0;~3`SY~VUYVvm-w5Qtf<$5d|p)Ks)SPUj>MPwfKZ#2o{`ihJCX1j@ZMC0(0 z{jx*hwNyFTtjJ!Kq_;N1AHc?y)hs&n4JWAqRKgnx>@>gKCMNqZY0Z9-6Bm1KexfT! z%atBg`&cWA#ZX!HiJHe@Dhd0rOFOWOZ{pjcN#egNFp-hkU6=W{hSS8|jphZz6kwR_ z%Sr+aQ(%|Gu(bh($v%qu0K+5;Y?Qk+(ZRmG1j9sX`WHLY?IVV>6laX4Pq$c0@wr?g z>fLjEb84S7xj2gbTADna;huX{*{v?W>PLrP5!Zc7M(r=o@3oeb$or@WE?At~U>(*V zr}cDXP5%8ceqv4WdmTO5M9gGgYB<@r|1y`en|QhU`)hKK z)5#g!lH4znTk&a88@Z^E)pCA*;g96LkC_p?5-d+j$IIfb&Tt3*UO-L@-0M2}6C;e- z-bis>nlH@v_MuDqcIptB+DJ~HJH;g};WPQikz)7J<~Ebff8FOBi9x@GH~GN5{eXT%3(&9VH}n_!8~sbJ9zo(aJg!v>uJz1X_EUU;=AdWM zbLe?g*wh!%OQ^s^y@Fmv&Mq*X+TJ~5Z~OZWdKbNi-bWvzV!zKP=znM~`T`Yu7r#Vb zp|6pisd3x8j=o1fpdZms=x4M5{fd4=zoP<=^e6fY6?6Gdt@M35@*(;NeT+UqpQ5?w zGgM%<3XIY`^d7Fe2g_vDM#nYDNC7MqTGH^|@jG;)R-Sy*^PN zzO9LEot&Re-_D9!!|DlS4!eCnIX?i+gjae(Y{T$Qj=la&&UP7E`;e*5| z#_?BD$u~$V+5gy`(fr`Sg}+Lh)tMr(5gW_yz=7#$bg_qOk?sQn)+_t!eR7osam^Hc z3i~X~^*FY?n}6L-ZFVRh3S*d^&);0Gc5;}yDx8>}LTh-JPb{$WSIe(D_}7Evz3LNT zNGun@$4%I&1I&8}8#UUzuQBiYYwyt}{uhAV@g zsIZ;tE^#H_PS0dre&BFxuu|NTU%{s@&IkO-b{@)JzOL?HoLylrd2he*62Dy|iD4w+ z56J8r@)5ZN+ua05HBf9kP^>&dj;1%s#tucp&?ao{cI@cRXm@lNI*nZ$Wz0A8&s&h$ zQ>@EynrcQ*)43PLZs&+4ZgP*}EC|>#xJy{9 zBn^j{6Kq-Ueqq?M@ISt>kNkF$b)73#hAES~SMp8O2-a{7Tp4^^CEM8d+lyO@-YYzr z+_FpWEfxEB!jHyk`H6fsasGjt3Y&6?*!Kf^+eX%I73Z(&`kRgCcD!w{7Gv;ocXSv! z9i4|}u*>33`4T&g{uUQM%|^b;MjpkEU4yQb^WI42Z^4_vadWsy{Ip`)V*ghXz9M^j zSGV#_E%sl=SvUTO8S*Fb=SqAjuxba2&lXY}+CnV2G+p?I9_*v`HPGMX(IzlvGyNT) zF2-NvDLoj+=l@DS>d9Fr-P@KeycIo+di?h#dKOF2$Bo60i-~deWRs5Y`%!u>XV4EA zv;cz!6PyPawBG&oFlYe=O>MkgjuPQ*r`}pz^xPGXo8e00Fi%YJj~>gL)*PNpO}*@V z6Zi4?EOGw&;t@6kZ{-%;Yj^U2lK)_g}k?GMk+UAGI` z70))4<6Vqr8+rCc=zn;(H@?lmw_mNpt>zm0cLiO8-p0$~oQKuW=4dY3z-K$7z17%9 z)A>Wu4QPG*J_B8cia26pexT@UoXZ!qSli>REj2 zleg^o)6>`wKZ-c)8?pc!7gjN6IcWAKdWwAs@cf%PGpfL;FK10Y=kK z=vj4&pXc#ei*So;wSWfr^@NBk~`ckznQL< z*g$5NGS4m0xoqC1=KG|vyeeNmik@6R=T5Gg0{7iQ?<-+9xfDDcyBTLEu;ZtQ=V9Vt z0WvtiPOm3|`(K|GbYc zEV=JietRuh8PB#=p-%J>dnOLf2D)~C*G^N%NyIlNnBP&ZhqZ$*>If6@0+t!iTJv4# z;4S1~y;MxE9#_~c`yXMK;I>c^>u+Psd(e*#veB2^m&pB0c6N#w>_Gj7Y3P6a(Nyu@ z_b9MKgVYvQH@^4C(60IqXIQf}{cT4L?CtktXgPCrhK#yk&WGjM62?AAKjKnU?1gDX z6$D?P-d!tStj%`9n``CutDEDRs2LT!+D!a)Ir`7Mw-SGK%Ja9vyEZxgneuvA=WIRe z6U=E0+v%|LYz{qHT)uZUfBmNQ{K;C^vMWhiQ3vnN4`<`XmS$vir5b$i86IEoe}m|>I=u0h z?LE(6p{JO0TfV103rsq@&=u}ud+mwg_gjl|I>LM8Y%@AlF`gnnxPrZ($A2GcTt&~g z1${5>+?M@5kFPsb9?(zCjcjMvvhlEUd{82`Ox5?(e8Z@X?56pwv^_tIpLh;-+%9$T zNZCFnJx8=CDtv9X^|^%|+1uRhndc*7*t0hIdb54aQGSVge&L?|jcJ6M;i_WVJB@3$ zb=li|mthwgad%xZxeh)2n;x2v7`Q1MNFMdk;Xu;tX0rH$=ga$HYs=XqWNs_+cLTlt zn@@PewKt2$AF+NgJanw$_wbEu?9%+`#(uvfO!LNKQaC+6yftheHD|NQ%QnWbL)sp$ ztDYgYE9Xy%D~93MyW)ktt?N{B0Ba`>NCK>#*t$&TSU>h~zBQS}7&*(!88hl`bYKWs zUj&^>ru&oQ{m5^MM|JGOICUC(zwEuOWEbPfaDMLw`CB8O3=6MDT$h*C#qS}fGufFQ z_G{%d&F>d`7MR#S(IV#bAb+uu-~2#d_f!Y$QPI&FJv!&;wyeJhXNlt&AOc(rP)MwmGMV1Y zSyr&w-&midqxTGk9n(tqFqtd|s*vMKI5}~?m+?Ir zx7eRh2@USE7kN2PzR+!5%bua09N_KL%i;0(xJSv=OYFw4r3vuB5gbKq|14|;KCKp~ z^3X|qOayO{<_EgRH{|!{*qKWFc7cuF!f)H~=2+h!?)RG}ZO#ekP(!ybFK!nfH>rhA z4qJ+SrWnVia`?B!iZAk275|$-_fNL2%fa$qF8*AGp4=vWe%ZRb!rt*ue6!j-S-YNI zuI&_<{%E*s*E648WBm4;sbuII_T?x2M0=;Qp?sGO(#1H0B&7VH_TuNS>W*lV7HW z@;3hekhF&1<7U{q<{bV!U)H#PW>=jdntz*gb>K6Nx-Fw-Vox~Eii!EV*v%AGjqsdznTR#wO zh_2+@S3%43>#c0uaqRz8Hf|p_uCQ~{UYklT^_56Ip9rM7G>JUEwKYZV9C)7~rJ?1;TSHTgc`vYpWx)_xfKa1%LsiT+p1 z?cSkBORx{c`K5F5G-2a!N?M#d7l|q1am)n{*BL2o*3b>JVfChE3nDMcv3= z9=dury|_hgIG;Why`}q-X0b|?UB#~3Q`K7=8$wT-(JFl7qkPZy?B0*&cBQ{V)nU$L zC%TMvZ+7)#{%A3CE%tGYlea!77n>$u-A)~CG5CcwNPEKG9j_)|_|oI?t`;`J8362O zjXHQ)j-RVr^w7PET1}1f65GRQ@drN(Vdm^4dI7Hn>rewn;7kF&8D7nv=UVY$qnM@H zSwLNC%8{D3eHCP^z&pGIW6?DlCCYS_A%SOhpSoL6X|t3A9IoGmW%oN zxJB(a%3l|MoP)P1Tk?$Ok8+<2-S2HO(;unxJI5jGJrhLEBhIMB_d5Nq9(bZ=IDy1o z(KJ8bJw~|4=ju|6u+Jy6_iTDLPA+m!>WqrClD*HTtf^oAI=zCi)BCeePMzQt{3`Z; zz}Pt#sW!ma>EX#QNz2h}_Bi9(Uf$TicjWBfBYgM8Y@xGE^DF7@c6j~+Te_F|oe3*) zA07Ngtg{KKr-PHxo2U<)wu2bVNm$vw_HEfG1LIW>FIBIW+DClcl%1gObs#-F0l)7d z8^zu)C-P8`W_aWycDP)wy`<%$ocT{`ORB_>uK!V~a*c ziQkB&$lGdiAlN)L(PlmJ)ET{MqNO&NLpi&3`8MYAqr!{*aah5WFbDrm4 zFK*f!-G(k_SDsTF7{oVhflp^xw+Z~mD{`Bi`R)VNH!`uR{Rhq?tFwo#K_72oajvvJ zdQH*$%IqI=21E*Ll*2gJW_|nyq9;?Yu;0YKAuiZ;tUOaeP@BWZdo?( zYrHMaNqd05_=QcZL-(qAElb~F>h#!SJ@ho&&V1X*$Whkk7Go{;U=(LLG_g_B$@_uM zta%C_uO(kkvNiMZ$r(rL8I;3)I`{7}!YTN@ zWSlySt45AyFN4_7xg6HcIiJpI86h9JlC9oT@2wuMY76}q)88%T?w~)9($^+6gxk$= z6)|G$vw5gK&9hl#`6qs5zp4hlVuE!{=#g{G$P+xE+I^QE#zYvg!h5T$S(kmR_0w$2 z;%v+AXp$V~SaX<-UsZT_4*zRkWL_bgn~FiN!~Z=ZIU#?0yg8KQXj{^^FY&6ux_pIq zhsYVm`fdUmV;vr|#y_H+{QE?4Z$<`BMz`{V6Y={zc5H@w55eDW#9hCM0bV0Zi__T! z=m9zIRJf2I$>3Q0T*&yhj$?JliDVeo78dd{o~QVqQ)Qi^_X~aMLDT6h>fXi zKUQu(|3o^K=5Iwk`7*}XW{eveBV3?3KQGRUC5tH@wq#|OCML31 zHTzL~w7E6!@*QlSy=Jg?)suVi7qESB!ku}S`N8qAxsA>=o9GM$`)|q9cVzKnV;PK` ziK5n6FV>v|U)su#w1!8cSbZ5@SC9BIviUll?V+#m7JP$qoWxD`yF2f%r8pOv-AFQd ze>M;O6L&a|q>?{?-!Oe@yKVaU&CV%l*3)be=T))>wcpvkzs2|t<0rpib5~-+`;mbW zY{PPLwJ)s$9I?D06Km(rq3$Yhu{msV-X7)oqdq&nTCJMhm`;`(Yo9`HUK8;QsVqRacOYnF4Wu1DF@Q~_FC!q0Y0+~46y*^hD{i14yHH?Zg zw#BRPOL%;>b%o0dL&)Fn&Xj@8EA|BT;@jZz^iyN|&0vHRXNIy{a0hBYuA;ZAH>VoMndkz!??h`f6WxvON3Wp* zQ&3=JhNF$qrf5sljb@_R=x((&HCD3MfaeY2N%Sgu8-0s@M1P>7zkVnB5PgE?qR&~& z4a|3`v=SzzIlMqqQIF4dFKmGI+>IU&qQ|$AvA?XvsrK!hf%moS#h3E_`+awm{WN#t z`)`H6i<*nGCG0EKw?y!e*4|zrv^TyvBM1h}na_CFX6#3Z6@O>{PqIcm{NQDJxcifv zSLx{qY=pDI?S)G7AH^TzqOv?)JxuIT&HwGqUUZ;~?B70@J>80}&Z^a*jqO){`blFS zET)-e4d5#Sd}V;IWP{6cV7A2X_NaDNI(dPibY`OczU<^RY}?xMZ#_uoFr;#l8fPGu z^M}PayP%hMP@z%>I$Z$om1*4V>o;o7iSQV4Xdh4cWosyYs{eBk0|Y z*3Di;HSbPmD@46Gnq%_>9m0Wv|zf|BN@f;>^u`3j1xIYo%@KU~Sola^XMO z{Tszh|L8F^+6VH8wf{Kn$}aR>v5#Y{-?v-SZd8?&z0aV_SyCO@vc^7GpL``Y?RL3A zac1hy=3yTbe+bJe7rIMa^a_7-7TbR|-t}SYhog7-pAE$-~oLp1?jg)1el= zdT&{11KBLjh1$wIw`V(M;_pUcmObFoCW`5*JGsoYY{naG)br$aDYkKC z>pxtcu!j5qzD)mZ5-g#8^X~Z`8&aI>?tJEKz8V0mUv?~BkI)bQpZdz~;)K0;SU2`nm9b$iBhnxwr3>G2t-h|2aB_{>GSv@NX@O^rcFw^AqRXJ5ll;)qtew)~j zgmy)9(D(Y2JK)U-a`lP730bN^jW8o?Iq#m5CPxr@Ri&mXC#LMTFn%hKw^^D{vsdLQi zbx3lU=URQ@TCul%qw?y*j15K*u6iQ>)(XEAv!&`NWNtNcD9-*kFoC%yAIr$6b`j72 z>G~_#l6&#-4ZLcuZc|HY4VT0dod1!8+2;9!c`ii%;0VpV-Z?mN*2oqYXM^4>Hh79{ zTtz&vFyH)zHG?6f;z7%cIZSi?PGu=Mu5TcCQpzGWqU zGjhIz&xWxjA6bu4Y{rH1&b#=WJ*>6*k3COya>P1y-)?7mLFbUEQSNaIo21_F%&dgW zwe!h(pmLuL(#Y8>@Z{q6ZSi>|+7%V&ApeJd#aW(m-24Xi;4=20mJJx1s#&Rn{X*aO zmDi^HQE^7Xuk-=NDm-Tn2jSNdX>GogvFt>b@1m#M`W((moSDIYi8sx06MTZVQdcDR zWd0d44{rsdV~>-y@1fT}u#fAR?^j~U+w?eQvy&f-=iZmgZp)AF?C)xFy(P#{3;Iy5 zHo|k@vU+<4a9IH^%ezUk0GHLPXK-1)xXGgC$<{dcr(16|vUjnPx02TizAj9jCtLqj z=**6V?wEfw`?rFAWr6*g!2a16Y0t=1`$(JfRoru=XrS1axr!cUm3w+0ML12q`3Jth zXNj*{?D22SUsd;9%X&LoI@4>*>>SijcGjnOjw zM$^k8{)CfK|CW1;jc+!W0wZ#~xEbaqdx{L~%$9#j4)zplKVrY(zU05rzJrUZDtZ{5 z`H99>7q@u7g5F9Rs~N+=(OI}DXCrubgg6;)ir!}Oi%#cUw>i@;c9xK{s>J4<;=!%i zQ<+A7ADh3rT(;=794da99L1TvKjO$Zm!sGh!tkJg84ec{6d0r{$kE5*Tl;JCkqJzdI?*uu1nShE^)AAT zQQ~aUG{79`J=Cas!tfX~%u#rc-VaDC-j!poIa_Ui4ByqE9vL}Z#O|(paS<>oclizEsd5#!_ih~B;G+2!8^qEP*n1-V*6vrhIgZ=FSce^ zn8yzE`%5yijQZF^o;ORpQ}jTKv(}$fdtO^SbvT(H#}>XIeq5ceIlihn-+=s8@bMXO z$5QP5j^@@g-@o@C+kODK-kx1^&TDp`wS3**SI9tdzVN|x zb_;rOE1A=O41H4lMmC~>JU+qB{ELpV93#f9ucv2W){vik>F z*afc-j;D$XD`Br>T2Z0M+l}uGa`O-yzl8Da$j;w{J{Jp|t#94W^KMNubxvnt`L|kC z{-hX6Z8KjF-GB-_>J8{Y^^>LDkFCp36m#U_yFTKMRn$wC6GtCM-rpqeHzgg;ZkLa! zH*HTgRwiFCLjh(ezzl^S^wnU3dfzG0Kwdi8!ez|ydU?SD^Mw(z&T1CqxkR_sDdb}1 za1;#4L2S@G>vI;Kzg0DZ9>@Gct9Jmj!Ie0#l}(<{f4pOjM)Av?^nuRnRgQ-rX|_Kx zVs8@X7N=Pc+w&#ga1-A&mONJb?`poN!iL|5_7%Uc>s}}ELnm6hsc2s{#Y~QPvA>tH zSKG09YsrbWlM_v5_Xe^n4dS)`jH}qUwK9G+RNOBbv{o9-bZfHL@J;$~mFyYwsuK_I&c+QCcO7ldc44#O zk*vE~v)^7>)tueHM#AL4*ms6ncDFw-!6U-sIz!xjyvs3M>ALsaYq~LiZjE0vMrS8y zhZ&#uINDQF4_{GFr~1(UCbpwVUeo0FeSO}KukOc|_k#!Sr(V-P^BzZgj0fP;0B1B$ zQ;&_*1S{D)p0$;AyjHE?EnesuUQB(^Iq_+@JJ$2Hev81@6#nu9F`>PL&XS2T?^n#8 zP;)#;mF6_OeGmWY;U(LRe{(TSQSW|~PHaccSBzmf_@gc56o=#4+WH@Z#duT2ps+*w zug=e78)1i>by^A6M$WBppF7n@odHtdcEj#zSAl=c&!qeR!|$=~|BV=QDm(BsKbY_( zCs{A`vivPHMK1X)s+gh`UV)r>>wT1coRrRFdp6NR7@ab?wa=2EpnR9lG z3x+7b5Wyza*xz03l&Muawoe0X%lA(~m+%j;MDn3Nyu_ql-1`@N`wwtC$B;?yZS-!G z3ErcVhFNKa>_qw$anVDA`>BzaskySrm$SFS>C3Hb+I@7{9{zkjIov5O7iS^Cq{h9t z!4d4}lg8J>X1~E-z!mkL-3(V0;EIA+$KK#vkEs*Zvn6+yN`8vx4JPxS(7glMn0MGw zF<)<=br3xK+GJrQIrIKSx}NsNf=|oiTdaLEebIx0ZSyWl>(bBn3nN(e%zGG}Sz30s zPdW2G1O4S%HR4*mC%Lut_8vxY$apxmX8IMeMdDpH7OqH)ZNChk4Oe8(WHX$2Vt=4M zk{EC;KIu*U+6&n4*R1PIG56nW=@>raVXrD(Hz^e3SY4%8(s98yt}dYjJ9^;`$mj)F*{hz zmcjKnD_EbL-Gl3avw=S(PcS_Jrl&X?3;q`VK^|As4q#oKH2llJnP6Ff`(N_{zp@u-EZnG9>y!e^)9YxeXdF?PMUYA<=; zA8K+l_|!E~E!k-iN669g4cUMP4c#r|~AudT@I7xerDWAeVoY>@GI-=iL#chT}m-uI|3>Rfz!a2!8;72Wr~ zM`ugai*F{YS4a9JYKrPCRGY<&NUEv+#_ z2zTbphgvywotnOLyU6#!)@jkm`F(8l;pjTQ-wgi-h?|b34exA9I^hqT;mFs#%?{rrhkBEotP|HbucHQ5(EAPW-8&sK?{w6UY~>Tw zE3MhaWV^4}Pn|+tH zP^&#f-fBCS@z;ed^bSYo+3bW?M&H z-sM>-&f=2Gw0I9ol)p?KFD~L1zw>U#%)1?7YRk?T&NG;QF+d%isn@@n2saej@6!?@ z{hQ(Vf23LjT$Vkjk@`h~*Gc}5xh-MMKced+_?ipJ%lUL=oNM0TCl+Qy`^hcfw!+Wi z-Q(?HfVB)Ou^mO7`m3lzowrPOYT-fEf#h8(MIwp*a<4S=4oL5%slk&PbwTeQMBV`@ zHmtGN2bPi?dk17T+uFWu&F-?k)9}(eAn8(`c?YDp56;SGXQQW)cR+f_K&{?pt$kg! z&ONBL|G8G}9JZXUc=w~)MjbqCy?3bAvs3k1f8@Q7*SBd4Ji0v@X=j1ySC2^Yi<3(4c_-dURP+O3 z!Sp!E=G}O@c-pDXt!5VcG-=f$;YR7Cf3fpClN+0$4C8leDI#c%zF}@zg1`Ncb&Ytz87=0wQk;$ zuB);RZ^doS7iD4?uq*??<%HG0(goF?-9i zym!F4V6|fOE@!p3=5ypL#hI({Y2iqem>-Oqy(ZqNXWTGq0Y*)X?ED0|BaE7J<9cAK z+SS-&y|GsBW2mJc-kpVqSE_}|>H+_~tJyfc3lTmfu{SzZQ@1}`jc~XzpUa+IB%a%a zJ^u}jWXr~iNgL_Qk9-`g869sc&f(F!^IjV@l}%yDkHL>(|A+Sw!UkpDqm^ggL#XGH z6u4_R2>l?j0<0LnT%*oeR@YG3gtxhrK5grF|I*W4$gX!3s@rC8*qzyC*slQlr9N4P$McR= zYXSS!yT=>$ORo<;OB@9M<(&w%Y7TWG*d92NX8mY;2>F1I@Or2is@WRDc**_MN!$}| zOHSXWKH1UxZl;^W2+LVF?MoZ~SX*+wk{D&%0901FL65Y33b; z**rb370kQ9c`Pg5S&0lsdNTSj`7-JQ&YkweG{9kn^AH@CJ$rP*{Nb>|$S4jQ(=+vI zXN1@X%=dW*wmpf?&f}Xd!Sh57u}+*_oZ<4YHHz5yH^c?2$q}Zji!6!8qH$`~)#8G| zXa})@x8bN+Oyw`tZ21F+Jrw<_%sU93G2H_T?wmV$%9>)plf`2{k!p$066iN$)j9rbA;4Vc=fkJ`e60~@5m*P<5FH+!t_dGoN z0g`)X&e?nIrQcegeBvkW7>rf|pOwI8bus&}S#U2U+cLx#H%B0==sBz6QdEocd~eu? z-S`N1yIud=%D#c^n6F<)Fg*j!#UrXhG)JtgFB-fW=D-~5R^g~yUF zjNjm1xf}3UFun~K+75kM5pPw*VEyGz&fpMx`Hmj1)&1-$_VI<(d=kG?q1&Eye^$4b zk6Y*a{}1fxRC;cHvYd(k4wV%;*4Z4ZPtc6O5~@C8y3Gx1z%{`d_{_G?yo$a##W|a6 zBrd4HsMO(^#>oq3d>wk0{Fuur&jZiNMn~N5GGtf1M{cwR-(OQ(t--_9)y+oWD%<9g znbqp^mLMx%(M@`Tlg;>F6Rj)7Sf6BrW+j#88l@3m9PluPm@EHdo(DXPK}|TGgL+ZG zQ&Qs898&K$N0u(uzgQlxCix%tyT*UJ!9CtQZHLISxQYM9s|bVA4ttTQuRM3ZXHolv zdlCcZFhOcy&)JLf?7_`q;y2}>V64Q;!|FIKnClMi75o|O%d>J?)4ZEl+H8-ydYbwh zeg9YM1(@G4?oH&=F+Uc^i5w!`xgoudZ_)g)8mxBBtiPI`Q8^Q974NZ$_+$-n_OHoD z>?QeCVfKi1toS)%b^dAHWxeej<5?bN9c9gwBYBtJ`oQ{xCS6J%VM9JQUPiuhe{!IA zUxYvQxY&6E`jBOpv%yQpcdmN(s?T_b)O|{G*1V7ZrVl2oi@hDutvFie-P*0NtVvHuNP)%z?;Zlz%9Txgx_Kd)MCgW{1*K_Os+@RUHMBg_KU1( z_8l%4KWmn-esMD<$mfOL<084)@pR>H+@HJie!gJC9K+NsoGf|3GsChbE&Fn{&%e*- z|3K!KA@5I+ox|CUAHB(?R_r4^l>K;w4qwaK*E+^($Pw-6DXP|@G9>d^3s?)|pIozW)qwx`pT7(dQlPx$)?T{c<_H zBH)w^I3>--F9J@#tF#>&h+JHYRH8ejhMsQS1cZJuABKj zl})v=S{TpI#tW&p%*+Y*VQ=sMmY~qQg-@W%&&cDH)%|{3Sl)kvk8Q@*iM~Z*Fz|oTq;)_bf zU}_u|uElUQdBU|AYa#R)EWGpCfp55>d$%E-xrY07A6s%$3UNsf-6JQ~O56G`I&utV zbjt@X<(`^HEzdh#E=Ql!eE}z8z=;Tp*dV7F+>{zm)|2-%C$Cs)%L(5 zPFBAx64)bs?&dM_FJO=Kxd(kkrMzz`7m1tKH%8pi2KH@M(NJs5%6IuBn>p`&`E%o( z@eB5HY4`CV-;FDdUJZXgf)}6?a0ZIU2H{>B$zSM+&*_DSi#Gpy zK(CR$iBxTu&yM#`jsj-WGvob}Tf={ApRRKzxcS1n?t1iT6B-pjPsTbNnG|mRI@z zdtlpQANrNfF7}`N%=^w`MUL7{NaaWI`O~OrQ~@pI_os+OZFJkfqWXyLF-|C zwK5Ot*%^Pg1~)TP4UE6e&cJ7jSBLqk=JUIcYZM(am_j9}yZN(0wsf`8;&Spl)xO2~ zTJnss?(Yl=I5=~E=&U>3z2oKg-goa7@qG9|%!{eRGWYns9=NB;W;{;yJGmI4iT|%C z@03?g*w(AO-wD>s{3sk9umF{^q@1q&nN$cyB64#Ezxg_1V_(XbXP4OCBki2p3ZFByhJ^}X{E+~NuO5lRj{cG@|H9nyJIsW%$#~3t4RbHGLW} zzxevho2Z+sQV(W7sR8xKhfP+GGRKYGL9Q1uC3*x}$>Hf#^N7vV5NChqStq*NeJLLi zw(1QSmG8xu3)^q~+_*(5<*(ea#mK;#e&=obR@(E+?bX@#yvLq*+~;4ijpNv`m_PUX z$yY@ahavyZ-P_jM!TpOp2A9w^OS;D=TloG0zQ6FH`}{w52hX3}W>x*5svUm{9`;^$x>s&$EWA-4xt$RXmi>V9 zFP{)6>CY<1+ov<=`+w30>yzU(+&@?;{q^{x=Xi$;Le>yE?}hKL&mAyoIxrY z`reA zcI@;M);?m+3*Em3+}(B6YmS$bT-G$sv@}r!{H*EjK;)FKaa}NLT0=1o^`QAtR zyZgz@t)Aoeddef$-;+7c2YPLJIW9Bd%}p`egkJoY{NU^M_$K!RpPxK>QNAukfj12% zdC2^lh8fm_X2`=u(esO^{4jDI=SB3ebI&L zOZ&WBo|^q-yBJCyB_rG0;~CEWAo8>&S-Qd}-DDlfH+$9k)>@h@tY~$tTdcdS zXRSEvd4Bim0na(dDm}}1>p^R2G8uaX_qWum)sOXZS~plXTlZRz@F8yY+z(k_S~(fn z%hDGquUVSqQ{tBQXV$(}%eu&#Z8@LroZiY9evP%gwWGC%wYRmOb*LrBPv%SchcX$l zF0rn)ZntJzkJ_^t&eok*_cx=^+R#1xwbgIoU=*{PcW8ZMeQ(XhR&8r-Z|!IuZk=eI zCU3JI+qJ$mHTtR6x7I}G@f$1h2+3U}ldS31dDes09P3q!>?d(%;o44iU28jQS1V2+ z_|yviZe!~g*5=k0mOgB}A3f}^pR?E}pW6ew+QXLi^7VR?Ev%ib-&m1nVlV4B>vSv1 z>1tNQj!h)5qpeM>-&zM+M_DJ3%hjy4tnICxtX(a540)eE_j-J?j1}=?+lX`LcIS?j zN4=2#+MM2!=h2@&BIXifxU;L#19RJ3Kt>_Vzc~Soby}Xv7#8gWG`UOl8@M>GwHV(>2!FNrWwj+ z^<)h(e(v)Nu|oyM-E2JHaUS2|KKfxtd-Ojx<#x{*XC!??51ndXpOgbx%d^g*e-}-0 zHOT>fL01j1wR#!#$xUMiGjqv1V)`j+y(!-6cJf44HDfl17b*f?L^Xf2yxCm5i0Tmf z1o#m+5#`6!pVdH)imw7US=!+f!H2TfXF4aiIQOLpyQkz$>BE}1$UeSBRpOxL8b&(|#dEP;jV@`J#@>09HE@ULOu#B_MH+;bQ> z_fdY)`;GA#Tk|o_%)~yvZ}GHFX4p1sIk`_=$1ure?a6`SNDTN9VQ4GnK~&(m%+C`? z;ztZ$rkQ=t&F*nt&I~V*J^x$bId7EZ)~6H$-BG*}C>g82s@yC)mwnR!Y%t{Q#BWZ`ml-3;ZR<_3RK!I3;5 z-_(!~Yr}#JntPqf$z^(#BMW08r-A3uyN=J`vZLK(AI_BngI!b4Y2ot21yZ#1k{9Je z@={mJU!5ZUx`y44GodDBqJmCf3MO*zN+Za|kGV?Ap{F0WzO>CNcMspJ8tqP%UXAHSyOawsh2 zyX2L~@DwtP|D2EYh3|R9o{zUSw~ls4U;sVai27jO<*VPC&cwA;Zf?&vbC1m5GV^?> z{H15RG8=SX#Qt>UkEUI&o13uZESI*Y@NFnC_A%jdcV#H~j`hvYdL~*Pf{#CT(}JemZ&lm@B=bya-Gpe{zBxXrV?pD8HHE zrf!?vJk37ZbH39>_R%a#ey~}Ebnmk2$GehCyo_)!W>gn-etf;$kH7S}{fAG7sjirP zsjrxiHh~^nn|$t)4VZD5nTc#3J(uOk@tm1AA zU(@ArZi4!d8hA~Pc_@r0SNFo09m3~a)xO4Axv!A3t>iKL-H~(6n|a#%oyD)0596n2 z{AaltXX9>(2|M(AYJN+H4QMBCse_zMZ{T(mE6Zz(W9G~Iahj%VK&CE|1w4xZPAy_s z$Pa1qotyCsUQE@!>0ca+W*gPSsdcmd>jB52KGu{jgQbygjx(Ts!A>6Goc8r>R~GW& zavNjZ)65ynBewcbtag|?v< zrdj^ld(7_~@HoopW@1m+E%F3k7iU)J1!&;VZ1RBy&A=NHKj!*I+sT@FYMxqA?&$7a z#*Upw77BjCQ*6Tg)-v@`0V3-COu z)tl8}ulJ{yXXdT&T&^!R$5UJAKb8x@?3iautJfF|EoX>>E;a7ML{@!}(>7&Ta3H0nfqhTNUqWJ2=)HLHWRMnyf zV1@hTw_D;6bK%)_m^^srDlXvA?VEzhOJMT&;XMgV9*?@$ogT+$?n_|uNaEbE4`=Yb zQ+eVH&LdMFEA$DNk;BJ($ogF|&6#&%K2`0sA?G;+S3ZP`B28fH%rV8IXiqjJdoRcb zZtpCQoaiG-Uxu-hQRL_!{sxx?#toCFL zF#(PgeC;0Pl5kvi3!a6^Lt;YtJlcjEm;bKn9CyJY-fwEa&9nh zuvxG%&OFA$FmK5--W|848EN?2>4x{yh!Q9QZp(n%vg^a+wxrkV;)6QfKOK%rf22KH z-`RX^pAK+7lhPr%WE@pumq1+??eCX$S*j_S^UmB{DwbrIK6u$Ib78~tW0;FO&{V;#-H3SA5HlXKKC*@ zq0fFqzjRA+-z|QB{-PguNhZG|w?p>$NMR3k(;MKkGk)dYy~9uaj`=^4!?fh5%Foat zUwpt2JQk2MvR|?Bbfhiw*MaOGoufA z3R~51kM3ftB8TXq-g|NDP`*p-wZ~bEBY@2$Pe-v)r~1xs+37>FqI{l@w4L9{-Ocr zh><6gdL+z`U~l)QZ{s_CE+%=!x#Ec=-_u~?;84x(!3!zY3wm`+bIA3; z_!+#A88Yu|@oaVA_*5iZE&?L8l^$Z)1u3|C~p6)7Gcg6nD| z8}R2pC&#!U^#JAYhq>G{e}_E1#C~jT->zd1W8bc`p?fL`jF^7PAvieP?{wMB48LWe z%H@8Y>@(CswSI0z4!7&a^uj9jChytDo2}cdd#q=y_jur| z`usP&Z}cV3%GzO9_u{*P-S!-?VhOBRB40wzt8#7n)a+-+-oc8QO9^AaH-{BVV8w9d z%%G!N<>_>o*i`H?EJrosr}3uR+c)g#?rO!`us`@J!((}W`3w8AG&|j+k?|Yr2^^Uon-RHkKAe2Y z>U52MDA>*sbvt>Uq8aPca7|_<_^$Ij_pYAvK+i2VQC{ZX?|J^O$sKHkI!#r+NqyUH z!IH&VG7ML{oL#iT=V=IF@E`r z_URM%5e7^SxYgw_faOXeJ{Fd%+q)0Tg=e)US6u7nLt(jKEwgUUeL?#15x*N}bi_IA z>+&V`^IdE5r4FXc)+bZHCbQGY6KocI54-1maYmZo#>aEFa7OA&$jl1rz*DE}J6wWi zev@9^lkd{cZmeR>@bh>d!^84mcpuFd2{5u{!21aIQG-#ho5M4#_TQ9KZ6|NaQCvz^ zR`$DiA48mjxU+YBHgDk@N!9wy`V~ihYQJEv^x-ti*=+BDIUY>*;zIZH1^aZQyT6Rs z%s6kJX)r0(%m1JptEa*vEe1dW1Qx>T?mdvWK`H%@HZht*F8On#DxVA7bHp z#N*W?=QB-gI;>vO3FiMKyQO2@y|Kw*@|4k6(cdX|+lq6w@R;hKx6h}Df$sEot*ouD ztEr?F*U_7L2h1#k^dmREFa>Z zUXpd3MH(KZ&s+T5jrmyoQP{9PetpbBnB?bqk8p4CJF4^6VCjZJ%v;~i_x;P5xx@oA z#RHj~+JIODPQvp?3@@%8^_@a)whF6Qn$uOn7Y#=&3vMPjSUP-P`!&seP0q78W3L=d z_igIjU-O>pxjPrQ_n-4e|EBi#v3EE}y?-%3_h>#%Evf~7IH=bq75B8^kehN|P4TPf z(Z0MZ-uaM@qHE+TGP#9ZO*EI&EuwwF&ldPZrF?_<*k=U$xtM2`&oCFDE+;sm&t_T@ z>&9zDo#E``e2)#(gex(I@a*uG?tr-7I)@*yKmTpmea4R{&Vk{|d(o#QpBz?xO` zm33fk`pxwog40!7r+?n@@AG}{O!u>2yzxK!PfwE=m_8xj3)=I2J=;2-w<_+B^8?|I zl4Y&SXv|Ig?B&ia&ZNFIt-?DG(-C}Rx^jQ-W~22W6k(Vz6mdFu4g;P;{TDp}&mo;T z87?I4))4NqH#iL0-eAUm==xJInE{6(9B_~Qp6oN4W=_}33+b#=VeWd#+BWXWa^ly| z?H3+GvrGrzWW?3%SDe#wHof@)Ir$e|dWiSmJKj?UVl--(7eCrHxV1?wW~ zYQEMkr1@b>ZzFt|nKRZmmR>)z?n}6&vKv>#Sq|4(+tO+0TNhbZv)@zb#Les@ESLFq zHT6t2RBMboq)*-ah+1-tJliJp<|ONKOYUDztu7|15zrh;8)^5L>{P!#pK`V+m`#+7ZbTU{z^`9 zA_j2|{I@)Pf6xHSV#u(|9pv1Cd3zFc_+tp1#eu!!6<-Kg(|6N;D&M zKz_6V*OEr=qku0_oTSdjx0stBx-k7>MnJ%m$WIvzH@G|NunmXgvHJ`LI4fAuLXWUs z5k3-(nECXjnrjVrtQi*e5JpVRd9wcXc5+8C&hMGkoaq^Gmt$>mS3cCB+(yg~jn$VD z`4n&^hF#c~DQrr_liibc%k`d=w!%LZm2zO8KtWPG^anJGFx!04`-{jx( zrrz#`nMCGF`MJC8!Cij#ZF=wmJ~g})++)WKyox$RFOH5W;v5`a^#6$X;A1}H9el^l z`H8WAhyicHT)Ew&I}K&c@Ehyj*=pQp^~E!Lz0Jxr-=AJ7%DqCJvo5v z?UFXb^WFniN=%_9?Jh1(r@~B`8H=03^T12N4OGQ@{H#%fWLnPN-MGm;c#Qshne`JT zn)6fj|7O*X84yduh57wfZa%CT6S9nI5zZ3Nmyp*0CebqVcHF&Bz+1Z=i9Od_V$^5?xHO->QUunp9 zHOyGlKgT!v*fU=1oy}e~ho?XE@PTi#M@xvoergXEah?&AStob6;=+FXAY5_Xo=IGB z;SF*`|A|k`IrO>f`b>UAz!4`N9Kgw$d9PfbQ*IuvyGbvc?T(J5xYXewX2Oq+b`}u> zvu4!a?qjU?EX%*aCnuL)gx-7*PH{%Eg;@Q6-u+p7|5xi8@9?!1`vqV3dH2VA>9ZHG zzgybhI1_0LYj3#L--|Urq!W&`PPING!wXxRSg%@jvC+sC zCyxt?8P@b&wH!vxJH-6p9qhn^@)dWv>+CzMCC)N`x4dUw!SkHv{qA*-*7ppt?`VR5 z#~GLAC&T*%GxS63H7H?=%#A3`-+%+PuH^q^azg+192dA}7xQhF;?pf_J;grbh?5_4 z=5z@Bm^yz--kQlaKI38U(MwNV=h-*OgE?V%Vf|dRR}<-jXYBFn_W0lK=q~(y{BdS1 zcn-Q0f1DWvr5aw%oPe5HaCLfM#N0}CM0x0g$=JC?FDyP&hM?`Y^n!X6TPc-^9btp zwuk=f>E<-?!>P~q=`)`p-`ftGrR{PBSoX{9!y`1Co~=aBmbr~}SZ6qCc0#`vzk7x| zgEu{^s6SNXr*W8w?cVi!57T+DM+xka{GocgJ&gGd*du*971%C$GW+pI_8k7G%OwMU zWX=ZOG5fN&+!c%fTuX=U>es_5*DIG4=MH}FzFn5K$`i#VagHrsxo+=_nScSWoZ4JN zkF40*&n`rtz##b!HGSV3ad|LE`gVH~7$jK4ra44;(qG`jDl(Y4%nZh=^D}>!-nooC zB+jSeE*)m?@z054>gsC4dXHPl((?GHlEEj*)*Nfm)V$WTs#Z~&{Wb(IYK9tY4!n}x z>ZpTcW;gZAtruZ4HVWrlkW~#WayXKvFwcdWNLAccH&0_mw^s=7oLYjKslPiWrH{m5 z7t#5X>Hp*DiR0yazUNhbNY@RE_qQ{XZb|y$V`o#RkCylB|6!*$AipcIc}Lp6rNpmW z6}dUyEpuYcO7;Cm%ZuD^-I%GRK%Gq2}dcBHqDkgvsmSDxw&=4RJMk?p13^XRkQ=DcQQ zGu7-<@m+2{qnSGH=qYd~+d2DJ`D7Q6mDuz4w0(WsJ1j%rPxsDS(rp=?Hizyx+kJeU zO*+^;+)19T&z;=T_aAD%@yfwC447>%9x#7$Dlca-e%xw2;D{~X%6-~PPWr(yle@jA z&pWj_zE3X|{o2HX)GTj>r;GmAuJ(k!qN7W3QdwRsR$In%oF)Hy#i)*X7a4x^MmX8O z;fu`hi3q9!kE7a}1z(iF7xCSO#2#(_kDn(iyYPwd0VG$D7g!;j8$ph6$Y-_S_xKRb zP0vqxHCukPJ^I2KPt;m>A`wywBL|9K*mJ`E=xYz~sO|DHxwI?!DWm;9jJkI-o87a& z!MBIyNnm;GCLh3pg>O!lL{ zYxW;DM{NY3l6(GRHV=PkmJ?6AT(R&u34BfhpJVnA{ucLTKe@|At#z!^$oykuYeDNf z{^#9f?0s^7rsrCQ+z+sc9sVbLDPMIg{WJqUud2@jW}Y8mj;PtpdSSfxhlM%Do&hE& zfyqf=a^&UvVc?qOjdU0eH?|i(j%=SM2Ab&iU~%Aks<fKv)`)ev82Bl6`4hJ4 z3wa2b92l^=SpsAE6=T`#J~2$6eXf{kQw{jw%*d1@c1|CU>X->Oz(%!_d*q-exQE~Q z?+a5k4EH?pS4{VwPtZjJ&K@?#y!VnG9Hhe3$5Px<|bo0~vpC$N><F9GF~1Go%|CE430#cl>ZqHh0sotsC-5*n_b&GAQNIKC;ywnt zcu)_Io(OUFbn(nBo;&sh?@zAoW;?ERu5Gc(YV10kidu7~ZcxDfn%Tj&!>J^2D)y!W zW1n{W+5TN*u$;~C7+nLOlEA0%S0_hYtQbJeZqzJqq!*uWbw=7Q4@z6ff?2yv$<0sQ zH(Xw7Dw;pplh#s$YIh41{uZnhZ zjvNczNdk95c1klBYMyZze%M^GtVgeIuY5u;%t?=V>Am8S$^2v-Sp3D8*^6b_(u-44X5RzJv>s>k}V(=L4M4B+r}Z6)rs2>#2Twy6_JE*v9r&?uLIp z%uWZj>p{7B!hD*RcMT*;xcWj~Pn=fyB)Pl}JnnxQa`pEm;rj&1bpefA*w zDljLp2dCV`dR#m;OCNxFX6h(CuvpV!WlDXC`q-@Kx5jyvruf35^_ch6W42kZp7Lq% zGdNeq^mp;5xaQ1!tC(+5fk%;#;Pc|0lMfE?4?&-DDW7I`m1lfCKC890TFWs$|3$V} z>_oSYsE^e20OO^gW8ht2JQ7Z57@0Y~lGx)1;82EG2kgG2q<<3oI-_G_-ljQb}Wj}vKZ>~VU;+zY6 z(*H;CvHHl%RO_F7U%Yc_tvHw5pUwF&=8lI)$j}A&9p} z9@fFuq1NHnk=D`HaaP-k9N_0!SIH;bH5`MQ$5kC`X!%5jva@cUgCB+ik*wRu|M)_4)^!4z_3?l5@m(@ z6?-nG3H<60JlD#6lrwVvlDOj+&h=iR~C-RB+QddS;=eh&TC?B{jvG;9z5(Trf2yxmy; zo#@PnW&KqBsIGpvl=r|}r`8E0?QEyGzfZZh$2e2HX8wN!Ub4T8KGdGpUe0rQhCs#8hK5ZqZ=dGCU zcRO`JTCh0cAowXV42uJMGT5!vz~b;*a`QAhum!1FV>`U-cVpgj(X4I8XDbZ&|M+v8 z@>k$-a8p*;>p``xmVUC9m^Tki_XuYkzPbTe)C@OGvwYN_`}Tk{&OUYYjWoM)&z|H1 z)&_>hd^*nsYm>m*B(V<&)`mZWzltxkl)DR8lgus}a1?Dmo!J}KvCjV^XBA`Gb*!cA z?Lu_p7p(D8j6_&z*s!Q8k2A3{gv`Y~JP9X8<~=uff8Lt=nC z?IBECIol~Nm=*y)o4yqonK9G5wc-cT0eC+3b9?os&)C!N?3cEZbyJ+vIbKxHjJJ)R z8*66LRC66>sP)Nvlc(GHK)cDm-|IU*&Pz3%(%tH1GbhK{PGq`2#^|1>mHfi}sycu8 zb$QT^e(-kkixhW|yYg@PY$u<2Haq_xpSwOiINNz$@8|WBsAJU4f9ioln=Z%5R}#<9 z=AXjiB(OMeZqDC=#Ytdsd|Z0CpSNnKQmw!z8TxFNC!Bp6^oht)P|f}3NMHsN*?5QbWg;xf1HP|pS?AIV=MRb zV>tptP`x0MvWIQjW-{7yxh+W|80JnGaW@K`gv*a3>`htEu(W!Xf;%U-LELa%fr@@x0ot2mL?~{gG`^6HiXb8|HmC zqm4+G_kLTrXX>EgYqLOB@H>}Uv)tWpol7RZSekrIVehsf>&v8gJ>7vn&~Ghw=1KZ! zA@}7L_hmJ@67`;vH@V0d^ zESvEK@V1#%Jxx9phnfXzq$jIG&YH1anq0;w*jt{i*Ew(Jcb#9@Q2rBd8{3AD*otS5 zw@p5Z|Hya5*#@Iu!foL@wQ#mYe>IrVtjA|0;LPy7{V-Z>n6!4ek$riAUbuzanpL4+ zB!i*DCBna7)1RM12NnKo8FDO-tUm*<6P5VJWAvHC97<|v~<(E=9N_ZDI%?kgn(#0;H;`3sk&3HMPC+NXv+_8nc zFRnE?eDiUX9^zRuqmBO!Gxc@UJ8bScp7mAF`6XF=k^F5*?q;%y^Ro-F zUle}I{JsvJ)`76Od-Zeqjfb4?dUVnSd|5LoAkQ=8GX;Tvk%^d9IB__ zh^vSPEA(eooH!tlJtJ9(26>IniZRh!g*nDz{T<2ilH~R8bm^bi`C0tAJv`%w*1cJ; zJi;{jH94`%i}N+Yun$*wY!#Bb1k+8M_YNEeLIc~`ox`F-OsNsuLTt>U(%45Y$dCwX?YIc z<6Cw2dDN!vBIje}uZat<3?Bnx<^t?k8|_Vog}#|`QCQFQzK@^I!LB`3SzFj{dY zF1v!SgZ#d4ZN$C}Ig>5i!KL|$|13KAe^S0hKdf-Gd`cYFPgh-<_m^9$kG}>puoXSA zG~2s`cx5~Cv>jWu*Qjx7RI(;koQ@agSmP}*&vqb86t^GZY=7-N$N0I4WFg+U6WqD) z?bkT>_C$LEL!VsX*_U9$_u}JB%hG@YPA{D~Y~njyYUXeSdp({0l_Rxx=Q*c0?Ij!) z-KTzG!BOGp%3uf01a$wG9Mc1b*h^=O)q^@#>^W9EIo0eXvdgAiZXYIj$FtnGIG64U zITSLWCe{ddIq!(Sf)x*I`B`|y@^{udp8IgPx7cHB=9oM|DTid%3tx68?|p+fvf^i! zmuq^IzBx7Ob$9#vtetF>Wn$)*JWZ;n5pL1DU&!ZKnBTk-8F<^D{nhWb+>?9wGIzL> z*E_=r^eL`3I2-fu$RDn@umk&qs|}_Lj+sAuQ}cRT4u3xKacJ5u|LNJER5v{> z>UueWyZHq__xrGR{5Bj1WDh4=xBnj}np}%H!Q_4)vh|F3^;LI0aZev3mkXI4zXZOz zSjT`LGT$qQH<6ojcc!IyXz8A(eg2-_^#WKWIbGaZb@|iDl!jO#ZJR+E5&ju2Mmc`+ z4GRRTSW^#?OXt&lLhfF3$5x2C%)7$*=rcAC(fXdxa1TB3PqGthBq!;q*o$53c(?QM zuCC!Eq!aKdh+Q6a)<3iMwZ7xWG}*M}`Kf=PkA|{NxgvSU zeeXZ{Pv7P3us+`+;@4ny>|UOHQv|pH_^VKu z|KCdY|DOLC`6puE)a}-{o^gE(#>?-ja9e+sCx|?*_gfEI&sy+0a-ErZ0Ul` zgIWVcCWny8yHvV8nepdhZ})}1YkNNH!g7?~igoY}s2|Crc*mA~{7f$IcVd&pybt~} z`6~0)@eAWW6T8g=mv@HPCY8tM2e^mtv4xS-C~`kUD1iq`ek>X|dOGUD?Q$tG+etpR-`?y_hu}qX zUae$*@z3_;Eb{9;l6HJoT5jaOzRrtdy zn^5h}z7*3ZutsJthwcm`I3t-vD06*KutjpU=7h7;%aYiq=xjC3knoG-(_j{cqaTaA zX+Up96KAaXp!DDOWMVP*3~nZY@xg67XbydDc4QH7w8`UFM-|Qjih`Q#`ikD z@lW{)XLwe4oCF?6?jAn|JM*shUrpU5&fK`(XNdE=J^Yu6SJo19|4twJ@}7Uwl#Gh~ zmh$sMY7=q(c+H*slY6x+`TBu;t;2VDgWXt;?Top**X>vA#W^u=%E=FO^JQDP8@s1s zYPxe@`XF+!U68hte^@C?5BSNiULaSi@8eFZ_EB>rW(bh@1AM=^KF z=X=j{%)`e!#B@~G$B$GwGl(bF@KEXgJw&z|4rd0&wuK2RJm4`25@v37+X z+E5*sUgvAgLodzZe>ULf8s>yI*wxHDTQeu}Jm63ZpB1^-vj}+9)U*cqF?5#2=a(xj z;KnQLx;gB8;#JA|BywJ{-^cNZVPjws>ataoFvLg3tu35jH&ouTtn5$*32Kj`6;m_g#WJCA}@&RU%(FL$B-F`=W47h~MRpR4) z<;;HVT_*Z2JY{-4bKC)g-FV~@`@Fb(I4*DX4zu$!_Q=_+;yYkj=o0fy*nOO#dTj^w z!l!Uo8D1;gFl_bpgbC7mX^L=Drsm^bPG^r`SmdAb#H?Dm_Yy94ES)kg;zH9wy^U$ z%bx8+L)7G#c6LVBxVN*?)Y;*u&2hDog{HGO#ku1i3;VOPpYlC$j+wVp3pmHrLVCpw zGbQryxY6(`4%PmV}}piD&J(o-{X@#?B`$Pr~Qqreo1b}xtBk8wj*>X4zuozTO4Kqhnaqws$REJ z?RF3zQEoGp!*ySVJl|pD@k8=-F1x-n+4{_Lj)*J%=KFUPJ3r?;*5!L#muKd-!j8i2 z@5Sq#*K;)e?rb`#FVjz*x66L_^*`z&Q|Y5?>;)`GIkuQ;9#7t_ugg`GZ>DD1c*l3V zt2&KY2_xc)R1G~dQ>x9zo7>_(9GefSrQt~Q{P(k$_{{=-Gk)T*KB)dO;%s3H$_3;# zwh$xj>1W|(l9&0vYBuCmZ?4!S;=lHwzb1Rm?bY$O6qEKR{2q7U)}j;e2gW;J&Xb!9 znfA-wj+47h<#C$wJpHh$jqsS5ILi3*MGM_an!wg1kCUkdefINYa6Qj_FuiaWUt(=~ z@aQoev*KXP=!nnB=2!Ft3=%6gAm7!H_if@OEX|QBV|;>Br(zze+N<~#ml=!*{2PBZ z&eMUj3bEgs9fL`z!1NB4^E$h!{GONG`7d+)YWxV?W?>UGVccfwmiSEA`_a}yUgMPHtJ9~r$w?E4RAJ#oxrcA{n073_d} zwY2?Qg|7dvn0|Tp{5y8zFgD}mxCe4r3yv9t?>95ZIX_JA{l}U9&l&FLzQjK37+2%L z!P8ljpQ*uY40m`sq;xz#ybO}AX6 z&Kt-a9F6zV?@bTBZ^6;{nM#t<#c(vZwSs+=Kg$QgV*G=H)Wc%DpeMu}?bO+{+2#Rp zNYl*9CfsytzAHb9ydL6nA}$8^m-poZ$gNJc2eZx0s*-;=7(R;Jmhbo_UlA5Y55chB zj&}KKTH^;!kZYSud^uQJQiu09lfbre=XYAz0dAmHJfOYj5k+)+=esz8^!8vL_ z=dwr7*~h3iVsGIS_Us^Y$9@NIa6H@m6M3#pJvY3uxsM&WYv@h-Q&+s_^@pGU1xqJB&{6KlzAw0mjzS>M4 zs$h5JrTFM{o4)0Ck`^Oo^rdE_7wRoV0*iy=v#S4TK<&g#wY1;!6k>Qjy1hKi{vJW6 zxnpKVjKI&~PjYVSrbBAaMfg}uzPFzr^8R?cLQ1y3qN8q3&68Ivi?(gG z4}jm5FCOtpH|PE0zDAUP`RfMEMit&9sI%&4U@I;BB1pfSw;SV&qM5Z>j&MT^t$TfllogOEl=(V=$M7f}6aHA!0E-oG&J;v&# z{IBgS+*Ua2@M6(rc&)PFdMDp(7Ypuma0wQ-mze9)HF>Ha%b1_46rucxlOP( zcr(n1v**+4DOel$wW=6VuGF3_?_R;%z;V{)Cwmfj8-Ch2KI9CzI-GE$J7#bN9FaI^ z*sxj7d4D;UyXj$kS}>dqvpPHFjr>lS8JHHazMp^BXTr(gyDs_SzQcl(VMlzA{PxQB z?zPn1a{3hRMUAlHxhrroRdXGx{-2JvConH&NI|cvyGKj`-mTJ{Dg8N9+>bQ5+53(o zzvgPfmEf$mCW%@9OiphShdx7JniPN0dFfVpdEN*|(}DBICBV%j z>!ky5BYMy5zj=S*Joh`!K*7glj$S3;t{X~UHG{?AFN_IXy2x!1ErqY*iWFgnBuWEH`W~~ z#0s;$2i`AOCwV9~I`$o|XW{+QKMz-<27&j>jP#lqwXQ}s0t+yN=S6RpJs$0|@O{DT znNz}lB|mVt17ey~z87MK9u#JkU*iG5O_qXj<}jS)6L&5Ywj>0uC{GmsCHK zzB4ksC0p=YzVS2iK`-*LK5!2fv$o9&Jy1oty8AWRvre(^r99Nm?96!IJ(oF-CzFjS z_UI;OHE7-JGd|04k+|D&b`WfgTa&`Q$um0_++K3vYLtAJz4@y!GO%uXD)MIXrTTcB z8;0X6tiyiq>>OZX%u0rf_IWTdW)u&rG2sigZuV^dvEP%#<=ffk9pquuE%jNqlI866 z0mYy?Y-Zki4hNNYv7@7$*NOJ)T(Z{3_FYEa^cd9gK`RRB2AzaI~KC#ceZ; zTYSonUb?iK7lS_uc*5XtQ#?|G(FcHwY0=k3`JD6I-}CV~;2ZI&dA@ns=q>rE8~d4c z+_8-A!yCq))zr9Z^l?qT84rS7yV=CawQPx8X!s<@pF|$w{P5p+C-a!Z`h)UWt@2$l zkp3NfJcawOA3xR4@8>FX{fRmam)yFUNcKQ)h%Ozibx*+BV)cN@)TIfdNKO@2(n(_4z`*>|-qd|-OS2H+7gzI6vSp^5Xl z0YhSboIhKFY<%T2^@h+JI4$^?OR`-H@(+$xqr;;F4_VRIQo_FDxS~5@F3fV!%NFfB z*@4l4%dX;A3tf!%L+;pHdX8pzo^AQX+mV~|il#i?K#bSurOZ6Aj@(ZgeU-8y?z)(N zb0(eqCjI)RKaW__$k}urjAr4^eaRkO)V-C7-u+2YcabC$oj-0Q0fVBiBzmSG-xc%xmWmy$2(8B8hSsI>&@t-T>dhLGi;j!HB$at)U=}C-_t$5u*k&* zA^actz(p07BJn7Y|YwFcAGERM|FW|Bw&wcXZrw5&&p=#gH@=khg%up}`j?Vs* zeEhlg_W0Bsy|e=#m(jJkJ_eXEz8hN)ZxZm0>G^cO)|P|3(VlO^c8_&`;giGac{^N1 zXZ?Y1@T9vByQ0_G%zbzKBtHYY((U_zTTyrK6N67TTS5L5{%SKi2tFa=;K~Q&b@bop z!<2*M|NMm?vyi>}K%TTSdM5up)4znPI;a2GT=){Rm8%JS368Tt-3KFUGMmQdQ^OQf&LVqz+6Q=zZr>lg zM%NdE*O0fXnnx{%=8nK?c%PmGUc)ToslGw}+RwmibbD~N$QtIj^uy6Nk6JIhP zt6HuiZzp!tw`7j0^_qKy*GjKeHQ=?9cc{a**PZ=jy<2LVV$_4k@l(+zkk38Tez@BBwu^ zmQ`Wi2I<|DZfhsiv;pTAx)|oSec!+3e*VjLtmRIhjcWtnRCxhe5$BZ`%N0NC?_%xz zOlR|P(T1B&;bq0$?oEGIn5ow8;`?AD=$K)-lXh}d25-#X{!nE6&34$1{r}M2nlPqc z{-J=`E%h>+3jy178eRLKJ^mTr6)zR;^{N`W8IW|w$@Xv@{|qlxz(a$VdWv|rojl-- zHu8LRdwnW!`qecGQM&A)&n=Cm-3_VDycn> zlTSW_uh+uWW6ra9aZ&q$D=9SdU=K?ekRdf9cbZO$wGwy=n5_XAg%lRM$)~L7?{15e z8r?belgRzCZ0mPyl^m3LndU{4HTVd#KP$f7&pX?n`;KGmKYpZeX4($;k;1d-keJ&% zTjvfVVeUXMCunN2Je#|<_qxeBiYc7MF#lB^m%RRuKe&Y)%qu=K@?%8*B~Ru0`AARN zla<`<3ZHAL`d*Z?htm|UfFCK&!HE=V&KM_B(DNZ@6JXQK&82td^*ht)jy1{X_hb6Y z1>JQR3${G(KHoIY2V;@IScv(D#L1~=P2u{hdJ(E{6zW$NoQ2$|+%UZcXJJo<{k{Ia z%$#brV`XQS`S-uA9{$DS^j73coWke6$UVQ_`dkdWJB;)EX1A`qs_?DMxyhxLwUY6JF>Z~UY``;P8!jcJG%&3&-<+r~R!4{$gI98Th0 zeKqv#O6&;^Cw(^!_7!KB-)&}t<~=m=lr?ad6#N8xN*@1ApDb+MNT+`zU-}~*G0J;f zVd0oGQv=VkxL1D2T_0k@*%@)}{r+qbzWEIAaFBohf$lZ;40l~!P&zDk)e29tWsC8F zW1aBWd@3JlP#(MiPsz^M_kKRtR#x=Ac6HBgv%ep(TXKWtU)+(!>1g>$xWSyhRv#JN z)~}NLnU-2oBUF6vsiRJh*mu3_@FUI>215=hHT#I9vR6&AJX1dLHagF2Np;Tw@lV^l zD>-Sp<{EpkVLDa6EM64x4~{7F({Yo_ufbI$pR$M7`o5p!{9ZosEHc}l&yXjql(~H0 zdGFMpV8^QA7O_44r-1(no~4fWO`e0Ve1ur= zV)x{F`XF*P4f3xZk^dS;R%VbDoKFGg6O5|3(2Adj^9ha{ew6I2XmzYxEWfXgS?$hz z#QD_icf|Rm$0*>yHiN@j+MUDsq>dNx_2G-Ra6Xw?6~fIH&L=v$RC|OAwbbn43jDu? z@5yYAGT?jCBUuJLc<{2N`6p$VZJDRioim8ha%D6Rqv-xGamZV2CVeGA`H!1qL-)!~2Y;-GqnoCf%w0=_5n0qf$hx_zpf zU0Aozb@NE-0pF7xqWO9jOeTM}$Mg00tR6EodIG+ufbYpX!k(~&h3_fgdt&$eoQ3bn z=k~zc^{{EZe5hVCo_gulUhz>cEMG5tSFgH3ul|u<{Y_(oe*7+G1>ci-1>?k0FNv<)vk z66;A~xB+t9mb1aLL2h{r=F7TsYJY3FLqqP)$L?tC4TELr`VCK~?c^H2^KdcHy)%FE zx!{@AG^1@c{3fc{uYW>@{3U#DJ({ zm1=6GnGHkm`g$e!@b}VZW(3mRbu$O*-Clq_^?5*Tu<>$??Cg8?f1~wcvJW!xS|2SY&c`t@3>Nt$xp~$0XoYlE!)@KJk^1O$bb+wLX_&!f@9b{sAm_a!xegaIa#h+T-_pB9t z9X@91{^MSfFYi_Vo9u4DV9B>_?Q`$&+#Ax_;z~VgvCG4pKl}DE`P?vXb^GvVIfLu@ z>ajQRD{{OLo3dkG)w31gp;CQ^nO?ZuOjEgB>nGk1w-M~VHW<1Pw~;$LB6r58TcjQK7@vvt zU-xt(+jB9wTi@OsD85SE=>t>wDRQ@i_k7B^!LHzO#tAffy8dW&7tg%_TaRNX*~ugQV4}qbQU(>^k4-}raU$hZf4iB={ z_UAq10tZppitn>rHiRRzU0#ujV?Fc9(T~ad)m9sP%``c}IUFO$`LZ1I_oRF=cM!J4 zjKdzelyUHc`UCAxtOL#SXT_iILsg^A68BV5e9wuv7+RG2f#E0Jh zbe|Q`Z`-k_TlgKELtT#AIqVv~A)FT_-g-Gx=QLH^67fK{(l2A2!+5zo`5ya`m1dRl zJJiD6lN-|x{h|NSK92BJRuLbZNlrecD?iE1zo#o^rAk)FKSBm!=AvtBv)Ew9hS4fM=<}|X{lrLQ-{o2=-9uUo-52= z!igkSJkoFN>#QyeY=#QuQ zlCdTM-y)Y|R%6yqR&{R%$U)-w;aU>77V{49(pj-yjbkpE&%403;1e&qJ;*D_IeyDa zRJ(J(GIfe}croq7SPGw5!(DDC+luYYn!*#*fUmXp?#WvGr4GLdmyj7%75v*(+<0}f zWM;6PIjlPFTl@N$cQ5EN976hr2a~J$xlfQ^JVI=1zj=1K9P->pTIZ{C33KIKprOf zyxDZ!mu#WjAIzn54MFOb|#g)dx_&##%oFrz$#Y&_}r zpJQKdXLr8k|HmBH9k4#r*ws&cC*B^o>Wn?ZLGMmKU_VY{pPvxR+~7H1a;HzCv-{lj z-?BY}nYlYY0}h1`p?>T0V+~#oEm5<^lUMUxdhxx}gY?TFS%UK~pY=?C;6uO0R_LRE zmum*|ZT?f>CvQRpn-#!y2P%j5L`gM^fe=e%Yzul#!t#$2R#M0g&cYG6hnc!zG zCPQ#B`e?_=FOQe+nMG@v10!#6t+T}W6L9{R!QH@T(8OTh+t zoxNss^_f{QSJyvV)4Be~nGcGEHxlFQ`POLq%CG090fw%Fe^1E~lyp4QZnZVoVl^ucG zERv~3T^+g(cR7{JsG<0IxEmPypr%sFzYp0LbctJo>O>ybemkXlF9U3oc*<>JG2>FaHQuN^v_jv^aFV?$D_nWT{D-UZstdixpTdI z;mI)E1y)dh=iz(0@l`qp&ye}I`iKGU zn(s~LuSI6gayGqbQ67@QCDCmwu?=_fYZg-<86flcgw!b83Cs<>-cD}jM?KBfPotw@ zZPZ}(1=u548#%bT{)Y+to>tk+J7$@|`Lj=EGRa-bWs&hMoZ-@PZFq&k*?B*_aMQde zeaiI27_zs6_l`637NjRm@+`-ufh`+UFKdb6nvs{X+cz=EKEIS#;Mb~jhxswyX@9=L z?sV1Maw<5{_)%H;kY%=KoSjq3)sX8Bj?;GeNBVzJ|9&~;cgnB4#Rl&pN7%APyjPq> zGRGdxCXBF?r?=0Ay9 z2k=J73-dRA;TbM9|KbYv12%>KUQt7$-^np-iWv)fEW|;uDakhK*op7{Xv~NVa4Wey zpDuSYHTuiR#TguoGu7vT3u!8CmBB@rWno>A26NZyFvN9O{kpv0RIy3cZ135;1$HV8h%Tz#^mrX8N^~ z8!`+ze1wMc`riJ0l(xeUIUW`|?o~DKhJ4Wb^wjn46rT|{wV9Xp8-4>8H0XaFG^e*+ zK9)7i127BMJ8UC9_&uGlDVf-p9*SIplj*T(-e;m5_8IO2&h~P1I_Vv&?K?InOG}bB zSPeP0qC3X}RwG%0?80jJQ>7Z;)%N+fsSEznXD>p(-S+<^-36E=)%7>v+MTNE?pr;* zin}ZyKo&JSO%`Lo6oqnhW2dad3tU3Rt70SFdcRI*KeyETq#vRq7?BPx6-K1vubCwDU*M#r&M%ZCod!Rc^{ShY z(u*=HFC`P>J;9g1WAnW2%=8Tg7&HQ~q-UR@F@)dtph`P=eZW2H()d;NZmx`uOD= ze0#0%j?XVl-mL3AH`sSRUwU;4)Rorlj~;N82RbqVg_Md$Qg)~n`5 zQ_c4}tQFr8n{i)fc$NL0LNEF|I@|``Z4TG9sq?-F&CEx4*QZa<_MYNH@^MzrD@tRN zi)lfzw%X;syBYZfGaL4#Gw+GsW6T6L#r*5~0E$C6hr0MnH=SyB-|07Q_r2FLu>mr2 z1M6NatKft38Syp!hUC=+ew==J`{rYRwi>D4Qc3QqwZ&R^@F_6A4ZirnLGLZMC|Dx9A!hzl$(V4N1pVX_wIC(L9}x%oAgI9tYh#X+O8UyRlVi9 zKF#23DhHo^hu3SL7U9<{Rlgx7#2;B&<@7t2ZsyoTJmG99|o z(fMFC_!q|Ei@98!JjR@h<=vMG-uHK7EW6_0?#>=)`%%0~?Hr%ebKYFuGM5GUQeu54 zz3|jdsq*LO@9w<$y2S3=;<@wSwNgg&Hvf?paE=Q8yxO6$h5o>vFDZXJ^R;=#djI zkD^51K-+r!=;Z@nUy@tkGtXpnIkdZ?z5AoPT}I=drlavZxH5NScjtI1dQe*n7Q4-k zlOt17uM402pTF;oPwrzK=bQf)WW&{HcVG7b9t*vXNn*{yIsI;iy}B@~MLsFMF)HW- zq$bD^`=Sibl;gX4Ri@44-E2s{L0_^c**|ZZ$9|0oT!5#I<6p+3#*@Yi#wW%%r0>nfea63yM~%mf z=Zsg3PmRxv|KU1+G*&WJHCBVcP)|PWlJ|754{#_jQG;Y8f0zAznfw|IWnbsnXG1^aFxlt*FCT(I346Lq(q<8}$R~^cT2_UZx+An(Bo* zn+05sdJ4vm#vJ~(h_Sp8?F@EnCwH5_Bc3Rn=mvig$^z8TtW< z!&l`gSA%{)Xiq%M&<{vlrJH}On|;y^2h|;7?RfR8#NKM;K}}q(CN5J8`T@bJ*Vvl1 zPFzzzAhEJhuz#ccZ7ls@Sgfng57bh7LET5^bc(wf`^(5P3E$Yy<=kmHHk?RJeT5oq z>uC3K4Bcot|8&lWD+dGJs0~m&1xu($P`Hsju164`>}c4RX=FmCCQqg=J&bOu&L!D* z1ReV`bfRyNe3^>)TSaUw$S>8`+*sHCr1o_Vd-=U_v3<}pNUgUjY)Xw!rpAAy$CIIF zkX{3+7`6JmKBs389C`)M@0HidmNUQS$)0Iwq=_c_@t)pHZjn1Y2N|~x+i8sR|Ck+q zH+@7uAo0Zz^aFyet?G-`4F@WA=w12&srxj|=hX$kM?O}2W`Z2xh+A5O-VyimK3EF< zemKX=VjvazEqxx%ykZ^t{m5k;>u+QEyN2NI)z`*5A7{^GcPBD0UrLVdp5ycIRvl$0rqPg9kE1ThoKQ)(El85!_d%Y3OU>ZYBSVW zEH(b9Dg3d6D~5}r^p)p_UP+sy?BS-J^F5x)y1mt|MiNYrO}TaYt4th=S_aIdM7{a z;Sp*X(nI#ms$%jpRWpE!1R^EUhE~dlsHh}bL>Ndb-lORFzz)zvq3u0 z06Epm9<6uq$=kEf?h&`R$Y<~KyNL5SoBo8x<+7KpBETH!Rc8F^oUZ263G`f8ujJ`c zFBvMQ552(Ah=rEvY!yB%{kZVQNpkqsad%=Y0FEZvEbUGXpf{~*?)vtGkDbB2UE}#S zhUp-B2s`gDob~J0v!NK@dVB^4IJa@W3o|2@aAxTCZ+IDbo_xe;13iAIj&w!hOc&_k6vU9BwZbpq-Sxe4z z65U8n0^g;2Wn@jPMbC~dUh(~l>3NgrEdTVmCCG(M+yS{0e0C)|SE-nv-t!uJZw6gw z3ZLgK*1BI-r`I&(uJq7fVY}(a*IM6WZs!g^82uiGKKI3r@GbMP z?M9ma7xbk~$g%z0+1P{NMm)6)zjrbGUd&gVXulsq;|FB*-@Q3OwRF<2~oPhO@cf_{o^p-*zx28)~-7xeRne{sZGlV?KNMy|J`2Tn!C9Y^bNA zM|r{a(<8(0A8@Wm@NL~T0&8@C9nJ;-OvEH=A)P zTY7Hz$&bm_1@V`kO0DFvQd8|!`J#MgJ$U(IXP{XkXqdgstw@qKJ@lWY}i-#WKZ+Zd2pTet>IeGyFy@1H03@^;ZjdDIo z@oj5)4Zqa$M?OOtzK73@UZ&?y(DO%+0rcsapQ5!B_;dI4o^!0bFVERl&17wM-9$Rd zuhu)ay}8XE{$Q=^z+LPpc5@7Se|9_&ZUxpH)`RRh8~txXe>_)Ac{|_L|A&p7t4UcZ zo=f}CQ|{fR5PNe(yw(feuNROw$+Qq_6#i%pclq9z_~hx%=vikV7R2|YW=~$}=v{Q- z&`v~D@vvAwYdP<3qxJFb!Bqyk9Zgl#Ggs5f zdM2RHwbABT@)=&YPJKvEr7j zKhf1zbGOc>s;iUQ(qE&M97DH(;}17wt+1XL%8_J939mYkeAxvp(1pdo3Rv5IKIPt` zi*39wd;U%QVp+1sJ%tg4QN({?S~~d>FfF*i5V@xQoOk|_-gAZb{=>7Un(KM=`IXS- zMD!T_0$Y*8dg$OmQ^LyD+J&FPIIwx-+K?A;DQfUdjq!Onm5SIwMGvW-;tuD(W+{uY zcfAPcsdTkHvXs9dXWN!wIpsBEYFpqzy?D)9zCY}H_-&^T%yww-pLp4F#sP+YJK}`> z^sZElH03|<$JgNm*tD;cVYlLgHyTeFKZyanhHvW2L#N5aWz|=v7wO9rafD(l8GK)^ zo_WwCt3S?7{8^nUG9}i@UvJ`x?)VVPpc8<%?2|jY~@3qcB zw00x9(|3o@Q13$X)ptk!YA;-1TW))ee6F#br^4sz4`RTt@a6X63u*MN6)zhVZlce` zavpQ1zxKSx&4FCEZh3h0bp3e3zV2C!t6YJ{h%t(dz+ySiZLH@rboIUGeT(+KDrN3w zP9MxWIT)+Bi)WOY#YgA})ta}^2OZ&n;XzC&Q;2vmm4|ErG z;Un#J?B(+ZHc*Ujz{DhbxR?F-!CpQO50ku>r=7liWPQ-vC+O{?R;t`R=RF6TQEwji zKcf>glPmH(9Og6n@dW*N_|$t~r@G4>FrOJCiRxm-kx=di1dK`@>)G$@keoqmnb}F)4mj;cE%SO=RE&Xa^=suhBsE z@|%;1kCK5`l7S6=`Lpc->`Dh)1-~MOUNVESUTdL~cMiXz7wbSLK66W^hON6WL^u76 zpJxvHb+)^9zwt1+^j)c`wut*mX01q{C;Qwd^(36b-jP1>E`4}9zI1(f*qRl#k6d_o zw_QDRPciRVj3wQfZSbKL=tyVs?|oqYZ9L*4vPK^sJ%-gUCvyhLjD66}X#Sd(*lx@W zd5G*-j}4vp&SFt_!B6fow#HK?@d-}g!|ic5_cEXD(2YJkK_4EySquKMZuyDbFi->X zdewEvtt&4jFfIv<3;$gYzfnWIu9ly5wM(1f{=AOI!Yk5E@8t)dZto_s6aHy`&hF~r zXBP`D1$7S8L!%eS{~!bcDd;-RXPg;Fj za-}b8B_ENiVRJ|E;RBW`gqPcoSF6V(KhL(eQE^+ z?+nF9_{dlId6&Ka-l*egdJ%lZ|ZKP2KNw z#7sH!4Rs`Y?M#a=uvz?+x5UJ9bw<>k&l<_Wo^v$*^{PGF#D2lKz%{7*fWN`IB(N^x z^o3l>LZ6!|OSdXMQDu8~!;y?q%WJy26Rl(bpZW@Iz_*}TaWphEkwq8WuF#wO-rt_!r zUe#c+2ZuSAv1;_r55uz^ztKqjdtz*|hBluc*(wgRP8bxJSUEshS?+IBeFr%)=w>lC z^Sb!ab7&fNNgj6)<5auA=eM&Lui`no``iX>-cRtLyWG*2-O*Fg-rLUXJNNrE*tC;I z&}B<~=vclW{|Ky#eAlXa0o`hK)YONYLjP^jRnyp`9Um+6VN}peQ5=dM_b10Dpan4< zc4fwXVSk$cBYapV@B_W<-BogTadiE;&n$pOc5y#oSJ-*wWJkK?&PK#&+$|<`kNtsV z!Iw%2EK35*qV8j_*hR|MsL#7|j5)=Vo#kKCegwusR}*W)7W(5B`nu!UfuExg zuk5G0mf&Dv1@RC)g2e09;7fBp>0X%5oLwjn0sp+u8Q-46>);;+d`wAps)h(2J;|BOv>zkU+HRh| z7h045qPJbGQ@eUga~Lp(xA9B1FB%VG1VwQzU1ACL_0eS0=j76==DiczsYf51HR=6B z7Y;%1A3eK^PA_}CfBt{Xmr^_O@FeQ9`uqfae$-}A|I=LId(6$?4Nv-tGY)q7kDRo z_;smA?S69I{Pp(ohM|1l1h@({G5BJh9deB6!hKf4J z&TTs}tX=I}g-qB4&pMVK5$(F`qCJXNuj@OL@Gmj%VhmofKAPW=j{MPKR>c2J%02`YPc&IEJ`apT+-te?wVboR%wMz z6Vz!4@Z$v;->qNkl;k4(Jl4MCC++msg0V?pY!Vn7IE*q}x*h<&17nlG*zi9TogP>) zHuO9BJDwdg$l+)bIGO~GMlMoC58H~I6c|#p0Y@YEl<&bEg`-jHxZ8KS$;Cl6zEU|y z`qkotdjB}r93EdCOf(2PlPqa|JK0bDfYkQw3!kHjpEEd5dTi`r_Bfm13wG1R&hD73 zRZO6h!@%&N!=wA`wf5s5^qa%k3?Je{F|YsPQdX$qAm>WFgsrf=xj*f*uZWN7`xD+l zU%S)m^p1tu&*XCFuyb%H_U8Z4)eQRM_0CZ(Y`&-xIn%@TS9^?Z0MFuvsJDd%52yb} zpVD>qa9zHs-O$ty?jpQO0Qx&0`iN=j$!O^76ZG|Qr{&}sGdxpYAF{E=Pf&xet7*bL zRxZ#CGP_s(jHa5!zCZkg*|)_9dBF8 zll{nqcj%g*qmMO=yX?$Z2 z>I})ppF-bkCU<4((V&G`)9f=p;W*W}kZ0xRBV^6>WZRUy&Ib#}xg}?#PBu?hZ#dN(wpGmP9zKyzPnP9>+0Nf5kOf;?+iu=FDOE!nKfjfp za_`9T^mwrf@_cJ@dMoE}TPDEoJ9ql`)AaW(#C3vmyVISCx$%#CCR~wRB{}nSnr`Rt z0(yUn9Xkr;*WKxN%>xdngJpoj>0oH!a1uBixFxZDcN7jsOfn)O3pF{bFcsZ$x@vOx zWII0taN6*q4fX^ zu<12*5T~ox+$s*R4tN~-MWqBD$Lh;47I06_86JlZOKnFy4<5(o^#Al;cpNzU78@`X z%WsS2rS?r75^>e6v@Dr+x%WMeZ#;+(seP&rb`AfYjt|Q9v4;Jlf6&|_24jDA z`#ADY3{O7U0a5;3PqSIG4_7{dlVuRyDvtr$bXXvb_8F~cr*UO{n8e$XqJAdpuaMzciS(uju=B2auFfZ`x zRknm&7xEM4g>5Fsf&QfLiyUZqPQo+9srUl(tMmr3Ad*wHZ7_!GQL0xttc*_(W8?fSXs_t#LXp-#tYg|*pr@)RQ$ zM9c&h);QW){)#@1_rCY&;GcTmZ{9V9Ut+qs@}07W`^72h?pqozKxcZsh~u>Rzf(0& z^`T_HtjbRZOTz!#;3wCQ$eyo{XY1b*Mxx>Ox|+!+<}=Fve`?MV%K<;aCtE?U-F!DK zcSs(Obu?1F3GuTH-2E+#ZH!ny^$YxCbFvXOSZxhBa`#8w1Ae;zOBmqKWP2I=8n+s7 z)g7$bNHVd@*wWa^_@{9rn%Tg){MC5R810-U8vDlkZ9a+f+Sa(vxXHN9cnB?CgXg?v z%NNB z@6SO?3)ue>AKhlYGnStBFMpdZ-b?TBo?biEN+QnX8S>}m3@#Zh?@W)G%k!^D)nahx zo^a>CHa@nV34CerED1b|dm*nPZi1$=hV!F%hUQjDgjU1rS1 z=2V+ne4)k{DSmJCz+MmGRS{REPYpXD=hK#lVy^$QPj}men1=-C?%ccmdz3io^kky< zik9owm#cNcAAo1U zFjh=ptbCWT?2)nJ$z##%I9R1&c|SQlMQ?C{luX{R`fTLyitZ5X30&qN{|9V`=U(PJ4_V82e}gwk z;7#=(GboQ%!k7x4qSf<8C=I%Tn_ zsjzNsbvSdl9R7>0UYO1lZYvMJ;6n@I^Dr(Q9~L|dy-Y_9`xoP`m-q?WlEAizVU@+^ z%k0Fm`>q}Z-3Pu!o>ITMcfEW{DI7vWk5@Qo>)ptmyTg5xM?g<21-)_PcvaK`f$J1M zK9)@j%YkPUe4T|DraCZ&-Z*rNsycI3c>+~7R}}_SZ7jO5J~-m?^ndU86IppTniKDyds<8?Axe_S-Nt~+=Py136hJk?#Djr}xCr%^*UG}N&? z*Ew$CbKcQ8v-5rKOZQZ7OmV(x{7A5PWa^gI0(0Xu;p&Y^2LCo2s-!=#n2f){-KfJ; z7K<&@AIkF2%GOzi>nh6$D61Jz=DRP)+Cb{%mDxfS6km}`4quM0;cfIn(38r5w_%%B z#CO&HLXYq^bUyw91Kvje3s@He-UiO4NZ@VA{et{1_=@!M@cRdhSJ5xbjojZVKB&(X zT86p7o2u|xY#4OSYJe%|R;#N!fxE#gYjV{_>D@ObfxAiIZsgOAOW+g8)~ephT|Cl$?uIABhPoGe;E@MM+s}FNy4X8sOMLbDw3!?ZQ}6-* z%-ti0qP`EeTN3A!_b%4I20nUj+6Vj9rzb$OxL54^LVR&fd~tE{fFZZm6Xyqid@(!J1Z!&ZVG`9i%xw*Ap z>F+1|`(yb18|Y|pe65L3%;q_(_}q77(DFXJ0$v&U?`gg>iqGkN_dWV>m$8rPWx{H~ zNO}H8_-^#;>n|kEQs$ReKcAlPfjpvPq#U#@CTn9I7KQ};L4vw_>8SLqRMjc_}# z6XF5RD%N^DK3BIi?~T|-^V5rj{D{vv!H9K3WB7YTrWV8>bL*FXIs|q@gI__NqbV2>p_>$gY&%SKkvy;Di5vc*) z8z#7q-R|WQ?&DWv3*3=>UHQ-GF4msCUL3#6nsztNFuy%=^}h0E@lD=NXp;l{M?}{b9JKenu+$a zZ7;@o-W}%qw(oYC)1TdgF6-Z!z5@%Se^uz{W0xS`}#{|z^kzzrpELkZjv-cnYFpeKp`iAJ67@S`WQMzH$s5Z*F&JiaGCXjj%FsZgSW7&acX6Nfsqr|6;CR z<0JYR!3mEhTc+95QZZLPAfA+o0kT8U>mA%GF?OGcCH>JoA4?vsny0X~8DDS<1|#j% z8;$jJ;f4~pp(NslW~28-jOj-#l4I$Om)OY)JFSLh;D8c1pac#`u0T`1S`&Sah9m5W zwN}JR^b~ammckbnV!!AKT0Ea;>L#~}XYI=@>^hx(i+}Sw!P~0;6FT)E^gmLQQog?V zE#vz!F13(xEnVjXHq1`m^HEL*bvIM@<6}O6Dw%byd;GP%`7v)7W9U71x-0NL^4r*c z=A7j9zqY-8%{@87oUe7>_m7+=F53gYS%(!< z7Z~5Y3GI!s7mNGO+<9NPnhd_v9t@znZSlU@`84(V3HQ?lW|+$>{;l6n(C@`ddTQjAfl)}aI$=6Ey6`J?Kxf~|z z8_dX3&-~pU!0WIj20JyZm&6zTN9Wkm-;ZPW=s8#XlJ_M`+W+_U8rS~^@2PZpM!@9o zXLhU2*aIu75;*{KAr))(SR(lDj!&gfG;V+DS z%pN>f-yik$TE$LjLk+S4eP)_?quP!1ReU!5>^$eNrX8&NlXNQD(Z|teBVOx5vLf}j z-O^GqF)OKoREAfnkhOtrt}c(evK#&~VC{3`FX!={>_iWcN$&6C)hw8yXMvnb=l-u~ zM_B(&<_V|6uhz%ssegw5cGuM^lSAd~;B@py?3N>2qfZS-JcJq|Ew)-p%gN;EXY^Jw z&V7E6&K~Qs!t2oMtCGBjSFdXPVh*d)-;Obl z`Ozs%4nL^eSG?@#G{8jk6-To7H%1Gyu#M-jo`c1-KlO82Yk{v(2S&{<_6}?f{}mpO z)?sV(;Hq?LW5U*`)f?0sA#=Uo8PEj^7_&l6Z+fLW0bA3_`EUF8IphF*4cV3_Pvvzy zBbAqx(ZBeB@h<(0f__HwE(XFi=KG+v-{SeOH3@7D+1x7D&D1_33!B#Ph%=470cXYI z@1_?n&Yr#$ui6NGZNOgnnBKOjSaj;&Chk@lj0y&|2H9zP)! z_xu}rf?sjJ(H**ub*W%j5*QYBZbtEQO@-CS*a2)z^a;O0PwemHJlyAg!LY~|(%T1Z zE`S$K8+jJrPNUP??R|V$UcJ6uYA(6|>+;Q=>wd3Ew>`&Dt3%BfXK(MmbKkFvGTFad z#-+x8-2Y|W|K*HH#=FMqez%pev%TIOPuSPE(pU|TIKjBwc$K}e7G2~dKTm_hY2X=$ z^QUa&4DRe|%TsVqvWyL@RuTCzKblhWHynhH#%9C(7&7PVbIj{J&;6;p_mAP}hu{&* z;}5H%%SpaZ&sD=T3;Ghlgs9(#j~{MKXCLWHq?cSN=t~szB!aiAu;cmY@dvnwpeGS5 zYByhdjXz*CeQgX~a~Kw|td>^=Zg7B)N8MI?l(K=>_1&lOl$cLYC@TIt&^? z-f3#S^r=JAN+MoI|DkA4siDy0T-a6a)#b(|=wvFnH>b7V=3Z3ABmRpvEB1B?`?y-# zk0<25Qz4tGd|A`U#hgutM_51XO#*w9z~12Ny>gIB{L%i~{kb0AOn)JDimGr9{qQBJ zpXyDx&x2&*+upsJ`*;C8e|yg#A-1r zt9jC$!0F)keEam?MZHhY1bS4JuX~W+kOvAs*@^8n87*&ZEi2hiy@co?H5laSVKRLA z&3MpJd4o-s!t7?^E;&E3yO<5&4{6vG?dubS$5ilVy;kkdmFVM2w4z5)&?AUEs|7uR z^qQN(KJO80)OWyo{|hs5tY?W$i)XZps(rr38kVLB@4(NygZ(;>&vIwy0)NBz2JgV9 zcq!g-G1?hV|Ct9J=>H>;rX{~O!$Vs|H$J>;Cbn;Gi@P^^{e)m`diubcHG`f$;Tv~y zv#hBn;Z#0~yc4TuTL%4nf_^?~&<==2HuP<(!y?O-&|e|S%op*QtMSh-(6~N3-dTYs zQoGzbW6fNBcHkQaVaZY$l1ez8j5yizpLREX@L7F##QzF)(gr#`tlq#M;9$^qneV-< z-ddT@Mg4X1=L>r@DVIa-{yyfMUZfN0&!hgYI@`{EWA;zexo?B#i9U#BtCN|vl98oW zaW9=C;g{On89pVxv>Ki9VRZA2Ge5~bO?8e7rXnJ|@yG{J}&t%j2`0JNw zSlwiNtk5@(Pn2(ddpz<5{BT`-QH^;qwozz#D&K59_Q>IPKqGXu@7;yxJ?jqd_)}J4 zL!x=lI?lKj@0kzpIScQd9iP3*^J4DiX?!~?@^fruzuXWLj zQOXu{_m;+k#N73dr}z2p+vJ*FLE#B<36_VhCYQ@O!SRRzr+SZMa$b63J^C1%=eyRo zTMTn|`s#yXa*^Lg9P|YDZ9F=jz-Bv&?foVjJoaXZxW%i`nmP{ZH>d%H-X@}rm5oK* z8~uOuK%cJ0ve=+Cy>YA{R5xap8a)@HGTmbUn6HT`?I7N z&^z>yZSCI$bfCS^*b3-kB{mXVO#)YwOz_`($z_9AgBynVN=flc>(SQ~k> zeD|;zcO`mMSmXX=iatOvr&GwATrB~0&Acnd+D=Cs+o82b={h@GD{PM31pQ62runst zhV#6{dw=xaCYgFDKKCJBz*jE+Kf`-+e&AfcxK_A%d%X%JlzN?_w z@9~Wz(HgvsoNxVA`8g-@iJy$_zaKf8Z8bWHJqS0UmCw%OwK(+E2zws$PVT_p^w0^h z&mX*vTqw91dKkP7pY5mw-X;-aNlwVbEwd_YiXLeAnchK>K7-yta7Te3zu=?SyU(8J z9TfBqQWs!I9fmYvUniH8^5jdp@+Ekce!D@>prB`voV{lFB%c=J(fp0|j&7rGP|!Ch z=o=*8y&Uun3i<{GeS^HOw}{x2AJbNGc1ax6zZaxq&gpK%JOe$1V7u$;C=_fRbxn-3 z-BV}Ae&GFf*K_hN*4FExYaVG|mJ%W0V-Xw86BwW5TeLM9582RK@$+yw`sat>qiuz? zeFnxnViNdx+4uJBEc)x>C_UJ_lZ*yFd%ZIo?{j5xVRyXxMYM+JcJdJ?lY#mZsXtLs z*O`9}ed|wT&uT$`qM$#Kc%>W;@-$+8R`*$bisVrC;LDBT9M6-7sGf7x`uq7dW)Y8? z5qWyhw6yG-h&^-9WCI*!A7UNyCynQgcZ?X@t@4BI={xkiaHo3)=O6Sgihh$$ zE@&TGh1cdw7zh`;Gx9*`P0iv{xG6q!wF326^8UxI{gSjte}*2h=v+=YPb{CoNb7rs zEZon%+XIh>PZCdTsZE)7Z2RBSI(<3~>)OM$*p|Pd1-PYTUiS#jh;Al!V!#=Rsr4rd z;J-1yVln#bF=+8z`i;CA_~kx#x{Pm@&7tC+1icvwx@gt;O(CDtXxApo(u2illRu-$ zjlJWf_#VHz+&Gjz^ep<-yCcfSgssD8Uhst$@`b8&%x*P}>Os#W`FgP6);SxVa-6+~ zC!$lpR2#8=H9V1=o;2d0gFZ?fyrf!U`X;oJGx=U`b|x?=9c+Bv&nunJ53sN7$WDKa z6L<-3$GTLO=Y;qW1DLeCQ>1@Z07Bw;X!#f{XK>u!(2E3w8Qe-bmM3 z1RuSKEN=Ucf;+&HPdm$1^V+W zEQm+yg(S9+s_~TJgYr4Zs=xZ&&GtlJBt7DK!Yugb<#f9?`8v+MfHi`9;XlORV2#w3 ztBIkF67QOpM66NNZJ}zy(Z>7MrbklPz@1QI817MB9R8!(=$mo|#BEAJPb9faWqs@M zUVic~`7&Y-`%CV}Xlsmh(my~WFi7G*u);<>e;A|$1}T9-a)-NN9!K%qOmQRiT6IbfZ9(_o2mb9VfS*5(2f+n-UZ8UhCQs4f&WrTqnZFonz!hzL zb$!n~%`^XOZTq>e$9j$$Q1Z!!;PWzZg|-|%^|jH%Gx)Z?OZr}hpzl(64=?$g|9z(C z&4=IYjt18q(bn6kQK(CsAeAJsw@>mQ&Z~OV!noEr-|5OT^He{c4BHuhy~#P>jaTc% z6sDuu)!k7TqvVRT!Eezh9(O+{u;E|>$r(Ouck4Df*(UDMM%IJ|_=Nd=4Y|{DPRjaE z2l$OXdzQg=9O3B~S@vz`I+$L$Je-EdnqGdgEd+%+|rQ*zA^YeUs@N#xWJfmCG zZySdnKSG`ilO;cpeR?{vo7!>*`_*79xm#_1of4d*yi-FDC$*iXg(buhA_i(Ke2#iO z-jUG&D+w7UrzeQ56l~-Ip1tT`;NgxExFh$s3U^pd;Eu#OL}c7GxFdRn4rpj&5%e;e z4IgpROS2t5$n_VXqm}Ut*djf)_%84Y*rEissDq<|E$Z}!J_1jA$ypzR*7PpItJMzj zc~~Ryom?Gf{mtkDEw*^<=`b%I8rKCc9Q1w)dOz`{^vmgXKJMmk=JN-4xWUX*hsTD@J z%SSlJZ`jjIXEP!m6&{&xjz;8~phfjh&`lRzKpvkQi5g#Jjn8G2ywh=VL5Ici$Smiu z2%3s=Y;*q&Yt-pkb&9*TJs+mE%46tP3${ep;#bBa^UwF3u8o1sIg=1Fh=H6=zrMFzUx+FN;W2Y zH`Y~t-af$e=~Y!`pAOJ9(y%u9^o9F;|1KBlv6#7PzNg4jdF7!_L zp-z9rhuFxG@5@<}lf%zQ&OD8GtdFMdrt67|$&2b!1Gg<_v`3AOhQ363tShUILN9D= z3jd}z1>G~|H;23lBUIOGsm;FDCxiT5!I}@TuS0m-I@bLry7|ofkH=fqz=xMcH~Wa` z%u0Wb`HGo)^BZ5r&enYWh?!(eS}cSosTC`R%r9U+@3fz7`?)U~d7nN2hhshP<@WAA z=QEpU{GU6aH&4);C(5tneSA?}i|}h&PGE65>xadm_sLChhmYq!I}py3wLo^O_no$r z-<*})%wiKVcyV(-%)Gxv>+6}%FGTp$*7&ly9K=pr5l(X@^MFlJGo}K=sed~851WFQ z)bQ*vXmuPtFx3yZA@8UO_rcyoYbT~@0;eJevzbI3%6sY|z@a2?CzfSC3gbS?m?N5Sd-~oX_#lx!vQc=f;?xzCZd`$<_62`nLGjDE9CW`yy3?y%lqrW4-re z19Ww$`D~6R%Jf{g6mzHd7$>7+7?$KQF&#J-_@Hk2Wi@u^G;32+scQ=Q?h&_8x8L9& zl53nLuq!a4d=l0>Xq@KR@G71Du20z8QDR2#doJ9HIM09>0$jdzJdUQ8a3&|n@wpHk z-r)EBd_s%3zvBJ!f$1{tTC8QYINADd^!B-P{oX#@=v<%o{gdf~ub|5_$*)`StEI@N z?eV~c%?pkNu3mh@bMOrKtxRkqlRH*{I|*v0*I*=vii2p*z19Ffki3IOT~ty76u*D7 zYig&a*=1>O^1bK5yd*F$WJIsJ4Qkl?+zCd5{(dGN{&(Xd<5uGf<6ClQ5o2*p`v9$3Ao`*=Y^P%h5^Jr844Y7=v6AE*K z4>@0$olc+hwtX0fXB>i_d+0-d<|l}lo-K`kIM=J4%`M_O5tHy=dpwp7y{J9@3@x9_ zzPL8$=cOBegm>*_=(D63hgwL^?RD~C8?^Edb1l15Yr0cVjU9>`iRvoO?@RA_+#RTT z&k@FV{{0{CeZ}ZT6VvISBj_^szz4gt{wes=pV)>f$`A;IZxnx5;&g(&IhIw zkK^y^!82epi;?u1-|@qf$g|^o_aJMA;emJ8Lj;}9QEI}HSCVbW``>)`C;a^*+_kp?x{;`r%gTrPX3Xy4Str?;iB8Zet%g zKkgN5d#hN4ESD>v9BKYflPhiU0Je>q3}V%MvS*1u?BIF3&=+>}yuJA=zNO2KFx1%V z=yDSy4R55>H|_XH~h?_Q1=M7c~M;@`v?Tg3pKOfM;Ykkz5EpL-kMTFd{r^ZGKvV3qj$ zlv$sFU)_26v&kDQ)XO6kH4IjHq; zD0{evT>sU6?~C_;?A~0V&i-!h$|`uYn!;?E>2!&Typ<3R<*&LO=IL1c{T}CixS{`) z{GUEO`x^k@KF*Z}hJN|*LR(H-T zqWg>R;)uH+o#n}5X%_aSA3Z|H(N8M8;SBVXVl(7=?&d*1si2=!sQ8m-o^x;K-b7jCZPA!KbE{XeQ6y=Xbz62i(1y{khcrJCCf2eBwd( z?-qMCr~ADOUU8p2yVQN0N>{(cxRm^3C$g&t@p-Y34lU)MM? zV+iK9Uu;1f3tv5hUKo3k>*JchYq3}K7~2;Ho1D@6 z&*HaGgFEf(^m6=+zwqzwOY95r8Cuf=E6k22mhu_+EbrEr$6DdD=#Evsoo+VLfZA>L z!kyWZ{_>i2{f=Mn>OTF~e45VvezvtfSa9x*WDNd%Je_wd&w|4ua|-zog;>AUdy8G|hVHLHrx)=N>6IlmI)!X)hAW)y9^~^UaIkQs`Wvuk?G@Zr z%y%g6%6sMEWJO6lDCV-gT571Fq&k?-!C)mYSn6_>6a1iq|A`277%Vz-RsMH3p4zRi z*C_V#SeyZRg}h#nyk5rM-(bAtp8t%NZ*XSkqT_!XF-PbQ^n0$e+tohrNvG_wN59}B zPkQcEe**Mv$PfF zP1E8Y>$?PAv<08IrU#B_G8~t1El|Ijfyt&lFF}*+Kk8Xm@LOVoUG4 z&vV|hruEJJbMutr)u|;R#|zeakS*O(3%03VPf#PPAVbH*-tG9I?>YxPukhWmFy_Pj z6RBFx@_ju2Jok29clH&}e%XEfl|J^H^FPbEuYiZm!6y`~>mT-aC%R#b#lv^OiZ+su z**XpS(n;*s_fZsGE9jXOQZ#%ixw;A&|CX~~Amf8|jtk-YvXt3@Vh3y>eX;mv3-KFy zC}M11qj}GwZ;K=PoPJpHY(l55c&tZz^@v%+(&iw)(p>rat@}^-=k0jJKJKEpF|0$6 z_xGx+kcsQ%L2hJmhdqpOi#hP)Yw+Q1qCc9vJk1`Dv_Fyd%pLxwR7BhEQF}crI;r{2 zKK28O1;17g&Hmg(zW&X3obWx_v9`QOe-=oBE=u<-vxY)BZ-x1sq%g2ZyJW z^)BI^$M0d_=w9;2(Gv_DKfF9H_b}Gx+k`)2PIjSuGW7!03Ut=6aPEX!g641r9J##7y8{h-cCWKt+u9c(FTUk#*%1%Y!;7qfqx0TH z(;hhcR342Q5hXDwo+l}3=X z8>W|M;%fDanz`)=vx8Nc}&2dr97jm+;w_?5AE_ zK`*YL?yW#I(l^EhU$E^S__Hd&${7@vAozr60CADBJ_gAw->`|uPi;;SC*%9<(V(AL z&`(T_uZo=Upe93~TH^KaK6yF@&B1t)1oC&t8W=A%9LRrnYrMNPd#TPh*stD`Is@d` z!)XrBD<0{Lf3v?;ey$ho-wkYavYb!3)Ts-kuUODiOgs+@_r4ZdRg*mVln?sSOl_WM zPtbAy3o{ULyR(pSd$^bXv!{>Jf%%5y@RfqzVPOir@gsB~M~MwERtzk2mQ6f7HOC@Z z%wA1IzZ)ADc?NvCTvDaXjm6MM7n=AZzL(-p-EPGz&c0Gg)uZhZ7jYhjo?_w4Jj07x z;=-_!h)%|?|oj>Uwic8XCDtypG@^|X+_=5@jaB`?U zKbXv2)4e#qo6t1?zo&K`dRQNwo{aXE!GpIW&tfjQo;Jn$d>wi$6!&*c zSJSL7)>GD>r(*5=WOyU%T~1rU2Cu?ERf{VO_!_xrqv%!R$e&^R(jwbabw*mrz1Foq zUiTN{I6V7Cw(L{Zx0tcDv9l3t)E;ZJjSGyMjN7dLA-d#K#%spA#`pBff6=O!HJ0b2 zn!|{AhaV%|q&@QZ^}j;rQ|%{zhHtR@`I;hja5wx~@3NqG8Tnq}AFp(9=W`sTGgUI`yZvz_Ao8Sdv^IS;rv`K#=E?}dvK zYsC+I7cP#CSjfq&!k%=?b?Jr?t9A0l;o{^rPov-0`8->C-<@gZb@;3Xo|&;_N=oJP z!(@Hd6 zcBn}m=WC9)8*p-JDd=a8UmlMKosX{N%@pTkZF)=|vDthBa4GUQzjnXr4V~N?u|!UT zcG#1w{h9wkZ7k;kcSc4XWiMVMC*H&}9zpvjsRK04y<8A&EKheGZ%+5Xd#vvHO?>NS zcVPm*gq~+=2#bf|Vdvr}5vOnw9pPyEx|Mfq;cOnnzt186o-^NL*wv??+i%2T^ybB{ zGj#>q?lD{@o*46$>-6J)lF?`50dL_im*6LQe9Kjm+lPl-j-DTL2L{OYh|m7ecl1IF zC2Rc#&%V%ecB5;2mA2s`>hLG+ViMhP7yGNnS@LVz)cP4#6@9J2c0CPGdKh0@7JnXz zU(2NwH&f5ep2wQRaC9&u@;TW2Uwfy%W%|UoybCYS^w#!FSUI*r;9oA(Y3POr=w|l~ zsE^kwR`ZVI&3kTi@v1wvg!3jt>8C9`o^QeXzh;kL>s&VWp6}CUv~SrAskLWvR+>pO zZ-_aibi7{obTE8~;!ehszO+~Rlm&LVJie;_-qoGWtcbCB~(v(man*Ly=Seurf#%F9F zuA{HdFrz>!qG?hcVT8{FOeVZ&_H{IMDrFpDzkum(yEj-&8uf zu3lyQQbTxPGa1gB$@zSk>Lcm37lQs`L4UDG<81!6nybT+UnZ;5uM)reG;bv^RwP$| z2`M`DOdsSMKMy8%T{^CKPH`Ih`Hc}%gZLjEtCjptCxoj?eszED962p4?7a_U1t0Yw z-&DPL7hTMczF()$z)mHwQ|fpX;>T6{JOxj0CXezzT%4wSTA7$^9uD%JZoILQ$r-l3 ze~O{MNdCU>tPb}1e`TV{>y7z6$yzW7k61T5 zD(KtAepLs|JJz-*dUgdpyI|<`-Y{a`rJh|u&#s_nSJ1OdEzCjw!!qn?SNLY zntX@u+Mt`v;^)%FGj!O9(SIGUTsKRL`|z%(%yBz1WeM++(;9a7Ouf7!ua9}-Y`_Yi zX|G;i>QK8Y-_h$=Lz`>6=j;3KkUfd^=WO<3qpVdNl-FU*v*KBPv-$mgGUYZda7KI)XwyCQxmcU$V08Q&p1+y->GcKQHH5Fs zaJ%c#FVl&=JdjRf^S463`*jF?_!Q>}``gLGTs`emMC`j&~aR>_7M9i#?pS4-|Sel!+Et8<|z7$|q4O!FuwFi_-_ z`bX|O3{(OG<-1jX(Ni0q6$T1MeH^=X82@R7`{=CCJNr$oa|`?RIUdk$y-VOl85%zU zovlY7`x$=V|D4g4Xy83O>;N|JC+J>Z-UMDMftM0*F1xc89=M8_R&dsQYUThh#eRi3 zvj$ixwHVCzV*Xr4JYBuPfMOGH-{|=}RQ&XR##z!@U|2cIl>9Bb_#s>JF#PO{4Z`Su` z^18xy(G!bq($9a^NMb(4{pQ4nGiZ9(vS)mEYsN zWqSZyl`L(w+!qQU-1+x&FO$m_)T}5oLx8% z@&?rcb?5jwgP1VYa;7TawMn`|t<+K@T|aub~GKt76I7xbR!lWU&K zmn^|;mJ+zD1n$b&%FB1Ya98xOB7wWon|L6(#rrp)*Db^by##ITEe|n?zE=Bs1zO*| zRHu`tzRP#vJ?nUce0k3%4IM087!Zw@c&Z|Ag$1_&Ueh8iqZIqhH52aSDvrjJ>#rDs_ zWrp5dL2oX8Fn#a%F(#QK+*Btw3~tJ4(y}82G?(p68 zR6f?AM;9D+ng5~6uQ-#vnX>CM`6uWslha||dUVMbsqlMNf*xJr4`@b@E*Rbcekk=< zb2WX?BD@yASa$-i#jjT5ZyA-qYr)kIC+peUXPw*T{9o(2UlHH6qp^YfvCG|qqwVt^ zWR|`cdO_(ChA+;Amt4pu*wNYd7}ppTGUc>97bnnz*V?YIPZP-BP4M7TJZ}ZhDvZya z(I1`FdY-wsXRhg)@&moQ3O`oGyQ<>7-QrPdP8-LJ7%QeYuGri-jGeubu^BsZ7kuyv z^sy-U9D9abM!!9P4BXwi)o&^4=JBd`AI&yhm5gMw$f2+&Xy^g=V+HqGAG%~RyYuuB zXX3QI`gAqKma_y-Of9;QJWNk(_#P~n{zfIf?wNK=ez!A(pKji9+y6bw`i0Rhgs%F5fsgK2e-q_gG*v#14*v>f2IM({kVppGS z{LQ$*xW{Q0fJm4aC zdkZwT0lqAEjJ}oP-5Fg%4jBFoQ%6^>sMpWmKsL`x*V)5&VCrB>TFEE$s>ARQJ;y@K zGbxMV$$d)}@*UVZJ6ly#qg%Xj5Z&mnZ9Xr+4{t_}&52%DU}rw&9xcXZsL>bB!2dQe zpE>!%;N$cWP-DRF;NuebxCA~9?RD!fHq{wI|2nUu@Vd*~i-YXtljeIVp8u@#TikQ@ zVpGNYb11!b(7vyY=T8)Gi`e6J>6dkLeTkocZ!&@pnw;uq@3rU+Fsr3hUI(0(yL%XW zQLPi0C)f>p1Lu~&xpnIG!MUkp*`(X(aqk(?&iM^*jQZw&o^zb{jTS4~#Twwr=+uSS zJzb5xJ01<}Pq*8EO}v{s20I4FrCz8t!;YyrUru1hoGR?Ub6(0hZ_mqfC_Pu+79Uzl zSIy*z<{cd2z3%SH0 z?oRvE=%!ygtC$N2SEY_b301){8#kj5n5qP(iZ4v>bR6s+dd1yzy{Y`F=jHVnpF`_a zxVs_w^qGDia`oJ8y~NamoeG;E0b$-xeQn;=cy)|eS)V_ACk}5&lio~-4B?m z1g5H^tHV>tzZ|B&kF$<(;#Sa2-V39Vz)&SHRB)xeXfBQZRT%snt*Pne*}I_OL+y3Z z)s#D)>Zb*-WZg%x8Dbs!=y!yhqE*wE%_lw?Zc26Q4Y^Ms$`-H`)G z$C*S{9&IG(=29~3E%dw;+58;Yxt2Ye#~xh((>T^VpUZmLKv}1T=LzO^q4!SBM)5n2 z_J&d9&{Pl7BO+DTAq(txy^`>c@9_@($?y<0htTXcJ_CcLzM*(H`h&wt;IQN=mJ&ED z*!W5(Ump(3H~4MM9S)1naxDMnEHsT-{dT7RY9?FLLFJygcY|u8Hj~TJI&4QKM^x__ z&xNB(;HcE-(9hHy^fwE70q~WS)RAc=KhP@=z^Bfj!>vMZjq}qmZ0yL_eV%y3n#THk zoAbh>EpGh5*w&EUL)RH6cWS&Czy!-7MHL8ptg>0+-N-_nClN%h{tU#`yj`GPaL zQ%P^4P`pJ>PIhwcqcg~Y9%*!uTyJLm2h+CrtKN+0IZf5(_gpo8>D$xf!L-8pxmpeU z#;Y$bImjEW>I+iCKZfyl`WxQA2s(r5 z;WsR)r4B!d)?mNX&G3Eeg8f3H^bk5M>{kN&m5k2n{4!1TbJT{!6Z+h-d+1cN$xYbR zc`qd{({2A}v*%{U4>4XmXuO}puz~FkHkgl$%^i;L*}8IN^8_AC{du*A z;nkM*x&L%E;GX!zylZ}+dD)&Vf{wO8yKq?UX(fTfQln8m5xRrHVpmo9>Z@XYF+v zl{*1*#jnuRJEf(DZU%eWE8f@+E7*USC~*>bhwOZKDE_Jn+#UPR{=-8ho7wj}=&Wb@ z>{Z^QZx4Pc&(OXuLxxSD`!7gmk2coDY@Aoo;}OOe_|Dnx$~^8tKRUXL%)HO}!%y*H zstM{{@KgNJxwyMLZ1P5LwV<~eUt>?$7G1{tD*ktU0N_8|=^Wi0S864JkL4PE3`28o%VU4*lO^A10Mbo>}HAsmd{_iceMHkgIA#4#&6= z+<1oXwu_JX=oUf;OQ4Sv*kCKrG4xXl`l*R^RMlS@*3WMs8Oi^3*NC=Qb1V7WXW^&d zF*CVEP4rxcnRBO{(<5l$A^UR%z4RHn?DBYxK4<*c`f8DdeOW7f6nT|BhLK`t(&5n< zjFf$cop3i`r2O}Av}wh1b!qgD3-OFM`9Ur-kLUOxoCy95J64)eixla%4SvvW1F*oWy-y5c5>VFmn4gJsD zw<73&#@AR?v!^Ns+6^N#D(HWvrcDmh#kZHY^!0=#!yo&ctv+Y!F6t}q`}(0d&m#2s zw|;1zJ3YWl@(HmI+yxls;&uAvhG_3k)(qd&@khZo$%Uw(Be`474Ymmuv`{0e%0D!U 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%0AQJb0mVbij>tjy}9)5tp%1>#2!mltB zeN2vXm*=`dZsOLPB6l0nw}Pk<%&QPDiz$Wq72;=*l6bNcA{EU!8;YIwLBN~eRs^vc?A9gfp21= zl1scmwox!n9aZHS86Lsw0S#$)VRWMgUtQE5i=1GVr#4LpQ4B`_pb7AUzMJ0l=<`31_ zE^y1Sothj)6A0}=bT<%qOvUYiZ3GvT}E4x7>ej%us!nyF>?t$Mlp3Bj@%^>tHk_F%tH_l zf~LWIFxsL%qL%OspG*T6s323YUvYgIsjt-Ie@e|#*^1HkWOzrVqztFO;U^N5je(i( z6G*s6a6`d?^`j+(en#}$AUYoA+HaYi1JO*FBfev01}IxuOF42A)}Y+HRdfxZvwq<5 z3uOO}o5^jE=bxhY32%`!i|A$|s(!3=O+a)7%zhBV#9RO~7vdN(OJOd7SS98}n1>)9 z1miB?b!$hp}D}%x4fEiFpU6^)K}7pe&+g217I!R=laPG$3>s(L+GZUtt?6 zcy~W`o^V?KY0J{d#fV;>>}~5+ZMEB) zcx7N^@fZ6Ob#pRam3nX*=GK^TZcK$O;E&=pq3aHa>+7|X;w$SzuQ@0F_~OyX(oFrz zTQY@fZY%E|jds)G#=Y1s_nY4cw2zF|N0ka(9;MmYH|?6+>XE-PvcvMmjghT3?NFX}AJ#|CmH|E$m1-H_^_6LN zE{K-_J{^^OL*V9g+HC}#tCr`w_p9mqZGGWiBU@j%PbTdKfOvf&Cw*$QEHga|>)A&$ z+v0%PNX!8B?Bkgaqk<|7uOr|(Q1}ZY(m#xiJ2()iefCT|`^nI^}Nx+_`W!~LLzpKa3DD6a4zl5TTYNcu}9 z{dH8l2c?Y8ChAS>z6_#MV7fI*yFEZO2WBb6sbY?Vc@<(4NXbC*B0^d=PP?WcxfbR` zi1}h}fq59>UNQGcY$wD($Cnv64*95|I{KU?K5ceMAF{L!sX2(x2Cm=<3mLrw?f{+ZG7L{t_BA0)QPel(+KcH^+qRa1be2qKn z;SjrnFFu7eFbDgX>?jbSC^7j@EKc3;T-M5ui?tb8QO5Fa;C$Xl3BwjQjNJ}H&0IOmiLlP9}|MOp#W&@YYG#~BCYuGmNvYaBH7T5{|B zI2Q}B5%RC43$;YG4C3HiH)(Gg_BUGATox~MeSjR^2~t&uuuH0~L#>~zt97W2nxfW1Tn%w(93Gv*3i^_&<6;HxI142GEz5FUm;R)`Z!6Lt94{>H zOA5U~y=XpxL*l?^2zXL~J!#m9p>g1$RcUt+sCS)ujA3!$-wF6Yfo|Ro%$QII!=|X;%#jyU@B42gf-~xVq<1ZG)3dZ|h674I=7DWTt?WVv?f>IUjBr zD41AFli@z%i>KE)Ns4ocsceyU4M3SD{c?Q*^p6rdyu>E__9D6munE735aWTL@e3Nv z&BTUn#&0PCOQfM0zgr=0HVs$!8C^o3no^ugDTXIIy{^psM%34ceJIg}YNZ!?!5Zr0 zpgJa5n50guk~F~b6*S#ZD!DJQZCcS6g5+qJGa=3Z&h=IT!CVcsH6(CuRAt6*MfzsYG{^=C zGyXC$n}8WFYE8ug{q@$2#aG@~4V5~?HwZ zJa!Hv?qCrAg3OCosNYJ!%^>~-nIGSM`USDyg~xpwe9?x*#JptsTh)qw7hXkaGqB%< zx^39W9;75@zY9a)27>%8W8!S;c6a@yiVP^dZzHkm<|O)7q+Y^vhhBGVG26l3)< z4Q?W^`gjWBNx)>83_ayD$6X;qp@P3e;!}`Ps2SO1m$YjI%*Ygo2|#}~4K>pHfKfP4 zjq}&Ul4P9{D$pwSZglRHUddFS?%3tEd(`ZzGkyVBv6heciPl&9h)fs!*G5+ zfK8OUak;Mbz6=>@qI|&qY1a$bMEN4`B*x2-(M0*=LF7;qIj}{Z<#0CIwB1 ze~rf9flY`vm2J(AABVzRQ_>9f<1@p}8K@t8h%)qzlr)2V848yIo56k* z;$bnG!Tt#1LlDoxzBM~Gm*WD}>zFu1=K2lAoMvI`9*WO_&BE>p(MgPEVGn~C1L9fO zpqzApx}ui3l`^MU*u^NECJUN{y%FMiF`9*a5#j|9PdNwWTo7R zUJy^$2j!#-)P`E-7RsEa>$jlrjx1=pK6fmHpy~Sd5W50bsI?cbWpg)ywkh|omkF)6 z7=_RQ($ad16CsWlqxBYRA=ZF+#y>GP_D<3TYMl>}xiUI3oAKX>!UkE;jQ?j4pNP?n ze}lu)u0C)jZ}^^SyQg@YdicyY(i|74HvZRC1N%=Y5lubpg_#~;dqz_aQwcpnF`9Z< z0dc+rMOF!GE_J+Sk zq-C@8Gm$s~WHd{^Nrp5t|0W@?0-KpX)9Wz3G|8qF-r0|gYG%G-B2SPYr3jmu9|gA` zuxW*$m~?>(*D$TH5z!5RKbx6f<&%2OUz3`d{}zEyVxf{wC&i6t`)LK6nJ?75a?Y$c zp1X%E$*UblkXg+o&zzKY(}2w--wJV~7|kVr2(eX+=8|`woOaDXN(OBHcsSfpVDrak zK`a3_e_ZKPJH%g;nm>My*e5_n^T!ipM03V_9iDbwfXx|q^YS@vIq_l6_(7uo1X2pL zIpg=>-Ua5(ppa?On9Cq#b)Y(}%*k@yAJjAnO;t{^3Go6#HxHx`)d zf;nDt5g&(0@Nf)SRy+L{Qkpu9o7JfW{rF(%b{P-5) z?_#v@qti6r%YZHXm=7@*G~LmdE&RBbm^*0kDN1>wFAzg}5v%{OEa9+I0uE@M99h1dx)1E&Nytw*=V2k6?kP z4sR=5!@`ey5WNfdze3HpzUpOp@4%|ORxt{%X_oa}MBe~5%i48D+U*W(mh}vXMPf9| z`WD11ASDAfv)X+ozxBXoR?mbu4cN@;-+gKa`zMH>M*5l6_mOxLWHht-hzw~qb@(jq zbYQcosq9n7m&9|EzJjvNrY=KdDM%^8W>cSndkk1>3yMjWS;XxqT*Hl8eKaFVfIpi} zt@LvH`fF0NsWTCn91E2U{oQWQW>alt$V9K`T-D*RS7#hZX0rBe zR)&m+7$Zh2LoSE71f*oZR))L>_cpMVA&rjVmkij-kdu6BfA-fAq-85Z#v^es$Y^EA z1R2t5kY@?m2y8XTa<4HJf2>l}jV?!?@H$W_v55Az$uuVR|Pw3JDIKEM34eAh0raf#@toWgG)B z8ldSZxfk(v=Wva*XYs!d7{-Ru~!^e?W53GD&Kzt@fby#si+LZ$Y(_BVKROeH+apOiAZZE-bC?rU~4DbDQWi) z7+YM?bVmaLT$L^#IBQ`toR&B}}pSZ@!S?xB6azHc#W><)|VkW?hfY?vWD46*W$B7vPvj*ZaP_P{4 zJD=?W=Z@mRdRgv4hhcg>G0!3Lq;&3qX|aTfaS+`EGZbR5m^Co7A!dP;^pnpKvKsCZ zkbDE?5r~Jxd;s$a#8xqXhq>;Iw7Ui*e}#D);w@kg`+H7^n_t3>P@d+bZTVu(QfdO& z!+vXsmSVJgaX*M5ASH2o*k28|3fLVQ%&|40Hyp0vVLy2$UIg}MZkg{Tc`8vB&dHrQ z&bws~ z>N3W_f&G=KwQR_`#m&Gi=jK{Vxeu8;fVrgf9DZSdxugq3XEAcg7>Ln;lZ(7d&VXAC z%q2HN+$csZHg#2(2p7P^c%Ckg24a_CqLi}BfT+-n@ z`V)|nxVhv=xCy{q63lUinlEU$2A8xuKkaq_@n2o7r>Z|OZml_4>P#OJR#uHi;V@t; ztImK}EJiDg*FpxIoSEA*`S> z#ZfEMZUp$fl~kV-{xN8}qq41}>U{yDZ@^Yk9g;0cpr(X`{7R}T5WO7ON~(~MrYKTk3tb$n&@ramZFdspD2nt?;xzlH#U0!D9y6F1cE|W2x%S%G~4-A`u=tsn+ zK};3%8O(Bs^TfOdb2r4DASL}|T@<&#y#tbsVRA1*4kX*a>;}pBfbqtDKL38A*aC212*muvVwEG zhr>0hs;~{3>Ro~;us^GdgC>QWcC8Y+A$R@ZzAgqJ*9TZ#Tm*5U7}dp}As!H;x_BRA z3rI=d>Z15khGK!$#U2nH#i%aEK#Ufnx>yWxni$o^tq?bhQC++Yu}O^TqI@-z=D_OW zOo-Ef)kVm9p$k;FQWq^%4An)W%XsSsaa{z7vVYb&v*l>%s4l9J?=2mxi=acYN7vNF z5yVdhDFs?xTnx7oSX~6AhX0(9uZudDv!V{zUzzR;H#yYBY$bFfXHDXO9>{bC^>t5} z|Chm?1+DAjF{>-izT%+pn+9$>P7l2hq6Li?FfE?6`9qHJzk?BB~`x z?+l{PVTM5r5%WIGF%U6(D~GblCq=Y)JGa~qtl z`f8iz!}d2Yy9r_+O4fXM06`;w`EWkOabnaa*FvljBOg8m@uV2}@GFQf#mI-1H?jZ( zm=E`c=qW}%ybR(ZU_RWG^1#X=;e(5ZX_qdOhuQ$^;L9`o8HAHVQ&0&s!m@K9O<{XH# z#T3BY32{3p$YX3f*e-JJSbI?}lj;7%yo1PJq|*&1_ZA4D9n3BeZNyZ;><=+qOgYQ~ zhFUfsKO)`$;!j_9vw~$-cgdybqCkq^JlR2mb`_BVaErK`}3z#Sjt(pmzNu;{t%c z%(bNZi0oVkF^RyjafFp|bGD3C$B~DHxgBTvGTx8WoxsXi_cqp504rlxh&{!qjAJ1V z1u5xU8JEH>0anIfpEAn+q;#e1tBg-0vQdhPurmG%_cO3E2E{xVsBjHs?6rWYS45? zqb>9)m<=jUC;CXhpKZ}QA)665Kkh{io{RsrMeiRFJ0I8_3(wngtAQ{xttaGPX{Eqa@)T-u`d zb7Zyw+oCtiXp7#l_c0s?B5lzd-A~&Vqb+)mhM5W?ZPEJ{#7kndMeja;;#CCL7QHt^ zTn$o6)VAnt{{YniY>VE_5YLLy7QL+>WL6K@7QM$o%oU?8dT)ccUW~Tr-Sy9OPr$b5 zy&mEUG1{WH{X@h6+oJath|9!ii{2Rz^UMZpi{AQ=kU3ym^u7r3XRxPsvt7qg(8K4@ zFtnrX{g09;upMo$Sf6$mfOtpS6DW&zwC(U1IR>_)ZI{RSH3YV!?IQ1OCN@sQ+m|+J zaE!0GQxRDRtm3YNxCX>K+TP@q_>x6RYYIP+l6JKH2$`p(q#bRK*uX12upMoWd6MTJ zkdlh+X!{o2bHH}AUAQsrjsdo#?OoYS)ji2}s=ZwHwWDo|rs@ydVe%DqPvgwnk|Y3a3bkG_<$!&}@!3DUDMr7L$hUt$Z_5Hv-#Rc{9W&soCDj z;f`S2#FJ4vG5v*({OSRJd_mb_d1y&t(nQVCn~ZbW2*bhNYXcM#viIvk(NnByYv zYlhrW(m>F+^C*+X+#5g3X9K{--1|Z7EkyqcQjMAD%D)op84U8%cc~ z;#DykNsXST2E=G2^&yxCfsLeo3-L9ukKz3Hf2nUHS1X<*!7)56mUSuQG=L%q9Ck3;-#Kn@bkKEdb_{ zU@qkX6|TW0{a<61Hi-WUwOC-2_erjsjZxj5KOIk7(Q1MDNFE1lwZIyP%fx84z+(`P ziqUF;k0JghMymzNUgw(zU^D64yzK(V(Kve0-*W+`wOXJWksiQinpZ*mL5yaaAA)#L zjAqieLc9l3(zluBk~bL412)qf>=(H$vOg)^SoSs3JOYvZKuQrd(|kJIslYrH6iZy7 z!Zkc3u1E9{z@M!a=(q?wS}pJ+fnUcFR>n5dv$q-|Jm_cSK9zCAoAkH9%6L7*wPIAp z=OLaIqcVOC@pq6~t|T;@-sCN2T7i`@*iX7GvOkH}L|?`Uh>Qa%MOYaxfLj5qj6pHa z1u9%a88;)k34}6Mo$AY&{}=KG__NglV`|EXNLVc}7KuY8sTChfA(n_y`ThuTix`#f zC5RV6YPrm-eC};t>7=6uhZ-JjeWONf0o{X2zCaT9fjLU%N6qtz+7;sQZmW}gIqyO4E@0(+ z58_=hDrf5bw95ll&h`+yf|T^FoMYh*0#?o^ARYxZ zEM^VN7>LmzCH>@cgq#7l7}(;{V86&MlKn~PJ!D^7^*n{hlTuWKEiU~9?k8Y9N>D7x zW-)|>9%Zk;ajyaXGH;OXCfRutVlII*;|MEbYDTyjIxZm(3v)Xx^ksY+smFnpvDrtw zcLFQpAc%otRK}SQM}d^|t&A7LT?FCvPeaa&Tu<`}PylnPD zNGRX_hz$AE zeg+|E4744@E@CtWIuc@kVB>>lc-sZ8?otYPO74hLF|F~l(-1jHIvN9g1L8F?8b5QN zGtMPOb_OZw+xXcCxcz{Qp9T9xZiMVlN_UlgjSpUc$OgY=5!f}3urfZ8Z6NMU@~|+s^J%_}7b0~YurhuE@sSvn zvEG;D16UcmLhK1r(zh~Bf|~%WjKO}=jgb9G=|-}zGG2?w)lyW1mGO1BSAmr=DCW69 zg=;8d`tQ8$fKbNevZFE%Cvb2aVPl}*)|Bxq^5DlnuR>xiu<|_z@r)Ri?;D7(#HbE4 zUojvGQVv}!-$1y&z{(eFCtbB{PfGtB%6B^=w@FbER=&63-T+pw?&0JCAZ6BD(_HYh9NQ#MEk*94RNKIzA#TiY!uT4 z<_n0=KuY?_BM52uEw9+Xz5@#Oi(J*&<~-Xw@-U*ufRqC5JD}xo=K*tEP%6o0FN6fg zZ9?>UV1HJSQ+z>k+-xPZF!#4mkUHPd`vEJ+IEb-gRFEYQr;AZRZi2W0q@-^Jc?Iqz zUGlN=FPQ;_ucG*FOIpcP~&++bh@2}*e`P~jR1vJBC)fc=%JMpkDFvPB8elvNw+ zk$DhUAu>PEV1X5)8ltxt72*hp$si?NE5vfR^MDm1*iO2-%W4Yo645V8Nr6^~ydUXX zfE6MrJT%gAKkVLCwru7-LGJQvXJZken(;cPkJNmW6 zTn6kr`qv>|1q{aPP?ZVU1V)hUM9XADw-lo~Sf&0?j1VDd2dotSoOX499k4PIVz?L` zu(AT;TroPZQUfF0Pfd`$e@K(8v>+a1_a{}-GI%w8XeUSec#3dG@JWbXoq6`#o!Eu7wAn-~1<$t=5NccG}(h9XBKbGw~M!E`dqLm0eADd=RD=D#xD1ngv%L0*Yn z1yBknvz$TnDZox<`3mA=F*=#$(0?%N3G8H+^$>poDe2an%u@AR+BE@oGD}E+uIRj) zlUarl-5(U}%8=u7zw(x+A&IoEd`}gkvsP|GI9cZ=EvUM;;(jk%VwfC0Xx0r zaUbJcpq}(0;q;d85&c#c?XOT9XLUR-R9e+a{MJ61``9wle}<@5F5?=4=pmTR5F5nY z33Ey!rbds+VQk0W%4kSN-xfJ3&F<-%Sjxw$dNd5-%Jj8l2Md$Kvn9R6qKr#dK z7Q`E3TER5P&A9p?*$L)Mh!ezA!|a-uacx22A=KpnpLY&CSKik|jaQ#V-scfD0-60l zG#zFE#5~aQG?lBfFA)CB z6bkMlBlUfg%yEy%>cN#m)!a4^vvX<2?F8(u=<3B78@~{-Zk6AwB)ThRAu)e}-mA@aa4qRpE1Il?s9r6cYu7>B1g?yV6AA6= zRK*s7E2B>9>+q_)PJ3dljH-M5l;cWm_q+?DwqlAmXk)AkqatnTRXjjj==~w8=W?AZ zwypCnit1_0qT=spB#Bi~(VJopl+God8LCaRF7?b}yq#F>nYGH!<(_%GCCr+5BR<#R zV;y_F%x^cCSn6}TEb61&7F!0-iDipl*Up6Jdc}5il=J~A;>%v?fT*h#@kVVBHZtls znjDs{nG7>3vh%5nuTu^Wj7p`^iM{_0iue9wbH$@`SzesDaw_qCqP#?+>3R6-uq%x< ztCf=P7nSc_NVbMFA)ZyFmKu4e8 zfJ854a;K<4LQ!8{68Bjbua2*5vv||_{Cb|ua>qoIsPYpGe?a?v12nh9n?#+J_`G@< zHyt#$Of-oGC=+$+XWY*O*0cOKjVhJIr39V>3T1fMr9K^3eG7f$u2D3U(CB{tbuQ1i zJwTyORtj>g@sZqjIZ;c=>13tR$Q%qxPVlzE$x3ryC$l?0dNaQYzBG;8BhoI3qUZ&J zPeJP>;N1LOy)OIDO~a;Iv7I~^6|Bv;{E)i##k??%j^-{;Xj3ZfSGPZ#R&k5!psSJ- zd{XNW#fs^>cFojazRjU3R2Wsow>jP94A(BL{o=MN>V2Y0?WpdpIX%SC8gw*eha0CO zvMwjy2s5FBlVo9CP7hhAEVd)kpUJT!(lPj!4l=(;2DKAZZ1AF-t}4O1$z z^t42~H6J6sYfjrL_>V~NJ^VJBp6pDdUEMZni6D_nh|H|CFQUUAh zjis7o+%HJQXT0~!u`}K;B=9^CpYgs|j-Bz|swoM8Vmk`FSB~ug8XscXJI9~xzUk=B z9rwv~_1E&&uj5W9<&?+Aoo<=kc^whCYZ$I*ppM~)96Q*1ItC|zdULfC>y(^IRqi$d z-T@8oznVpoDlmUFRJJJ`nUlZqa>}&xHIW-sm2m?>Q~@&wVz!ukn5!Tz74r+$>NLx^ zTo8Q$(;K3lnD=2CHs_}lM6bYn2k}=i8)1IfIpem0!Y8rzwa-o+_a)^?e3&S?{35bY zaxITREqKZV(Vj4$Kzt;o4NQZUJXnIL5zGLHUSbk3e}cF{%s1G+s8z--2GNHwvs>dC z5WNXAs!hiA1t}$(8I5A~Ab#`@g=p6{syS$&Q*;*mMYQz1I-l5x9&LH3;NJMx4*%ane@-m!5`$&h~Q7WI{O$%VsqNOQ|fOOu}r`J}o}&{~UD;@L!lNS=9@Pk4sv+jNu|aANjw4KD}Y06_3nmKNR9`)v=GO_l~dS zt7uGJL*)SJDtQ2!H%*znZg3Q@4kI4Koh%S5br~s(D;WY1&-d>LT5{bkw z4F4@5co7mOfM@~CI}opnISOX4E*aMaMB`vCgg6hRq}=BbLZTIq&+7A>5u0Wu--P&( z_^lxMA#wic6W6gN*-n<>b`mLKiyr&^yKXiq$Fc)X79Z+ zZg*g9rmR=S{RmTYmv!w;iv!kH*7l9vW_8`bGtMoSt(J`rCpoLH*?ltZaFE}+R*N4> zEN9*3t%zHF$*5X!wZh{&@PMrCO|spr(KW$#Zgs}}hV7E$y-2nl`n$>6(K}gvHw^u7 z2fn;xn!fEaWTiVWuU}j|K3732ade`r^Q9C?ci}{m9S!U*d;{V|G3u`d@11eoK}tI2 z(aOFQ9hgU7hImkn?!u4z@d^#>E}Y&!;|>7k*@t}6=Gh9*IJZbPTQ+*=67Sio2V~qT zkl)>lsPxwoYaWbCQ*!svxENW_)V@QH%-Y^0+szvNBiQaXkR}aE{!q(yExXP<`%6~e z?OV&Uf8WuwH^lv+_iT&)ah4bbLMt&lQFh*H@7W7U@*H5EE!qd?0Q2lg5HmnZI_B9S zgEDR}V4kfrIODz$BhNM(!p|)*&#s0z9hhf7^+}s&J9`Gt%4W+(X=OwG+si{UZX?J) z)QiY_zft|>fw(j!-|XmFUrMvRJX^+1vfZrFA;I>vVHr0Wlsr<)b}hTHXIl)2eMFzK zUoFoz^iRRr+RS>^elVs4_owb!Re?$5xydfdJY;{fw&`~5QRSD2LK&8x?a z;Q1ApR}VUX(F|Z-J?ucna)5bt=|OZaz`WXGP@GvS`C-|dZ<5WHjo!J;d$sE!betgn zdoQ9=97wE{{$gt*`M(aVX|KnGxVV)0=kHS!ckT{xFAu4SyD`Lhn{{f{)Dt1@Z}v-7 zvanWM?OL$1T$J_aqTyDH2kCKBEo9zk-Zw%1SGDrgj99Y~+s?nTR-Sr=xHwNG1OG+3 zc3-vdPGE0irR#gF{K2(q|J?2EK^ljGom{D1I8WLEf} zYfs|@hgcnsj_c6n-{;?CKEvKGv1)R~zpi>42Mo$3Z+PXOEi>%!|H#ZdT7x#A4sYx^ zZp%PgLyw$Y$MQO86G)4wf>S_BF*a#*Biz-%CXIfC_#RNvI=wyNn?McK&xa)T$w}p3 ziBTP;-ee4K^&lDm(;uR*7@g!k9pXqaI>~(n#JOU0lKUozr^V9TF1EG&?B_U>JgN>Z%*zV%Ak&MpN{P#fgR(% z0^)ozI>!ATh`Yq-827(Gyb0_W_YoMeW88BN!ymwoac>RL64){BFJw~;RJd+;jQcR; zhXDTa`*{@|)BYLRqZ#F{xXbS7-@Vl|3zcluB9q(u4JND{s?8#{f`wHz|u%zC6l@GA%Gp~?WpT5Kq>##~%cvwDgpY&C&)La_ zp37#z6y!8wnUO2bodQ#sQ!b{{u`W>@kF0dEf|TUc)iE)hrny9E9L^Bkc{pti6%O_B`(m`M0;a?ZEIp($(1Ypeivi*u^1cO z`D>zBhuW0dsLo##os~{y@e>+V{vu%xEN-Jre3>Y@N>RgS97oQ-N~G7rE1 z@k7%1I#Di%6nE2@;5Ugvr5Ts*+k_1wRTekji>U7tm20HMUpl36q$Vo*9awDL2O{N~ z9Kl5?7|%?j;ySFIf$qwLAKonI{VDdy%0&Mfk6cjOBNx>6$OW}MazUb&M=nUz^2mj? zJ#t~}kzF4?lBEBT$h06)N6&5CED0zjkT}?6Rm1m*g=U7YGJ#cEE5N3{W&o9 z=dRT%^Jr#%?{*Gv@GViGucM z#ATGOFO8L1F~;Y{rR^1XM(x&U)~2aS`x2q0mrXFXoyKTOj~fM3m1uwT&rD4@_vYBK{V zUxl|du(&;~K9{JmO?+S` z@@#TzTQgNrUVNg|o@x*cm>BrP4zeoxsudPKt*eq1P1CHzXI7y_cGT48DJ9^_cRHMi zxBW3oGyOAhpbu9lK=^OEJp zl^5z)Xk%GIol@cmRPs)^Um>kEfmpQdapGc{=guXeB4Ot$9-+$W zO~dFDN^PdAH{IqO^E6LWZ+a{B&5dV4byh-+=S+g^r}@l*Hz8m2`3R(z#J|;*MIX?g z)mv329~QksJ=D9{Pc&6zaBscCNTrz9gxK~tdk~QAam}-~$L%iLvDxv~rj+k`lj0Oy z#m?My^#;iW*imi=$GLr%U$AKU$WN?hb}D8| zau+0<^0sI3yY#mB^5^ z=WJF6 z#0gg^v^l>&$1=@X^kRad47imk&Y7-gbHYkpy15%Mn-fhHZV!1dUF_LF&xbJmR1ABj zEP5%?&?ZuKZ^N{;7n2rL7jNRQ`1yWSr@hi4MxN zYj-!dSkbwP96_WUdv2mzP2tW>^o!+oqKhdyOLE%LGB$EnVmFJdm^zs!INhiB5tp~I zHQcxs4~afuPw4UXz-m2eYP>zK<_+W7BsIRP+>`f28|VopgUjpU^0u;5p61y(HOQA( zdn?;Llp1XJP@W2$8r)gVvY(sOkk~@sV|aE=buUhA8IdH;xoZxHuPj&C<4*SUu>bam*U?}XGuESvjC~9LiNfT>R8KQ{>^KILz%HuRRL`z?Wcy3_ZJ?mw1^l+ZPs6P{ zkj+K<#S<0W)1s zBRwXYf;)&5_RcL?M+#pOa|A*YfgOHv1;piIboj*vi1ok~od0KDtG$IBw@4QH=1!J{ z%ZYIlGwvT!x*MhqOe+xG2s0dFUyzbY@=-$O!yN}OszcDXW{qx=(f-jxw_{W%23(2I zYG5Y@dHn3<=pes>xH_?ky1N zsO=i7L;kbWEFY2@5LM8UZO6v(m^}<^&uII`rGzd~jJ9vQ4dPZY+P?8+h|QpBNFo?+ zkv$A|U`WaZD#(Pb9Dl^X_u%)oa%?h%Q6JEBN9Cjv*oTUPvhR+mB(XkXP&o$*XGo&yDVVMS=^zui#s&+@~L(M)aSa28`VRp-&-dY-|yWc z`oHh@F2`b9*(qL{hqQn3Xco{wfntI z@Ea6XtKS=bB(s;GcE9%w{G*^ir%Bb{FZ6rM855&dy8SNNWqV@!Ok*Jh*q+e=Qil^d zNioe}&V@J&xPm4R^SbZNu@F?|`sU`{jk$KjY(VC5DfNf>4B`_p-C)Y6vp@x;q>>y# zNKd%#0HZoQr+?PymonNvns^UJuOVhCLgRs*o%1Zj1~EE2r_oUv*8terIWr&*2Px^> z**Tlxo(IV-$d=5&8NklYndB2&@2`DG%g)Xjfy5ACXXjMyk0G6%b0ZMdub(~G{RhIo zQvy3G+xFq@kIuM8z_t(Hw;X#>a zgahJkNe8>1J~!j$g7~i_G|}JdmWJ~-ZrzeLNc+8R$@-h^x}{(A1f*_hpZjXMrF}*J z_ubMij&4bI%EugDt6S3X5&v1Y)RDI!bxRX`%Xq~ z;crt|t!}B?aXb`&+TGG!@Hc^iBVXYotI+kis*%<$4Z5GUcp5Qn=J9j`wr9>GW?w>w zDrO$cJcv0U?v@_*<~aXG=KAJdE_3RZZbRl)DXCj}72;(v>Xv?m_!*?6V%<`U`7F@` z82y9~(_YRRT_mIZqaXf+QJumv0--^`PGPwl;x;j5WGlIV2Q@LdFbBfy3sTazQ&=8= zyBF9gEZ;+X4eS(_uYF?Oyz^frEjxv!`|-FO*eNXQWN2SZuO#F=U|;Rk^*T%$5l^>t zyE3Y;5}!xpX^>KceYIC~LWV}>yQQGWH&Wh2xQ1@&bVN@D{MjiiO}$(vf3;IsZb9I> zSg2%^kNCZAsdu(p3Z>-qD=&Y&ztS!Br_otY^bzW}UT8Vs?I81*Q# zAZCE3I~uO(mU@SzT%bbYpy}<%mczOw z?Q{Nn-IDb;+jUEq@Wxg!k8UZ+vzt9F70hp5AX?p0!GfB%#DWDiZ;1s9YTgnHjyIX2 zhh^!cco5-Ho|XzuHoCH?!9bXW@rxkulDGesDoH4g0VI4k_BUH z-X#kTi%nDvpp;ZwBB2+kILrHWu`KJ2v0%SJ+1Jm4;c@o$hFCD%-VhltDi~oIa}{-Y znJnmnp=V`C50?d9>t`P>3%YhQqjFb4H_MZhyT{7qvv~I|sPco85zWv>84IeqYdo>> z#KR9KcF;=bydK?=Y-ZuEd~Ro$#$HX^|K*)usgPC@brlJQRIEBKP?R2Csg6rT|Nm7T zZB-pgt$aB@YT4@0lf-{k9S<@(Xw{*I#ZVoV<^Qre#;Q4}I>yM*?^K5w{TJ17D?fzU z>R2fQ8ua}?R>z49RAs9}I~8qT9e2?}@^yFo63Ui8f43Z-5v@A%Yuz3BweF7m<83@N z@1|n3k8i!NYBrs^@*g-_b}H^~OZa%Kj+Z4>a{h$asv2tk#13sGOb(_Mc5dN$||Td_BdE`K)?AE?At>G>UM?!o*H{mt8|^!$!i z4p)8`_fvkx-$F-A&D@sRO#@dAj&%7AZK&RLf2bpZ^}RnTRxxQ3U4hp(hGIr*+deN^ zw^npzT(lGJ7hTiSMOW7JbkS9@$I_{ps!Q3anAINn)3JKYdhfjG^ucCTnTi(I)Md0d zTbI#dtIMJ#T@hIl`)(qRh|bvQIA*YlPM}FdOB-vfzi1Q#anYGO&Bwg?F*+-rpVYD zcLn?^g_(!OSu@H%E#nfPi@9XHxnwT+Wz{j7V}66Y+sz9lyrd#*RYlNk%&$K_E)ga6OlX5=Y-YJ{Yhv- ziy`DZ8coc($Ssp>fev~2LsqUz8JgH;j^uQhz#Yh}lU)ACUPey~7ZJ^3kXl1qQT1Le zxZix0evi!ECc_xavo;397l9?ceRO!d({ht|WX#mLh4}%9Msf@56bZY9qfs@ta5Soq z-442iqXYddybJevG`wCyEi<9A2g1?miAYgI6(7yZd+;{(gnk>OSf&&A1}4L-*0h-#LB#b>ha_ z-N!H#27;zlKDw8`*6u#8Mc`^+ClLfehS79a(|u^y_h*UT2vQ16YWMflnY=3k>pp@~ z(giA9L-#QR(Lo^YKF+|v&)(HJZbICBoJG!~i-|cJxtWqJ&~XYmKF1uHCAo=hZkL?4 ztG^JLm6FTf-^=LUe}(AZ>pqV5GU`6QF`4bUk5g)ykb3PwD|#PS(J6EvgGl=Kx(~Y@ zw(CBc`R+q4Goi9<-+jEKpTN+4$R*o%ABDBMk888hq5J4pyZg`?60vsZK2ERQeSD_q zf6;xMyj}M(pMh+9`WW~$D!%&|Ci=hcKDPYAT`4;iyXfIS-NzSMtEUe(tN(Aik8d&m zKj=PAQ%04w@>gniA372BKkGgo)I$qT9}|3=4&4ad$EfFOx(}83VH)hcpmz7s{4Boo z1GT%4$?#(oR;&AX4*m&HyZh*RcE)u8wY!fi;a4lHR`>B0{O4eY?qiwH@g4rU_SxFq z$8O8mYXdZ0?xSz@*V^63QUsQOvgmof3-ki)7~#8*288~R=$k-Ffyrisd z*crmBhim9Q+MR=h17#?2p`V$rfA(HzzCS;_l;1$=yfH zJYhh8M%_m_F~8S+yz6DueRMLJ?YfW8Ynk}n?xSVsK9-{Vd)AfY2SUQ zWhPXX?YoaBYj+=V$@bkxRJ;55Yc@J`A9M6F5uQF&bK7?x^J;e=?G*hlx{sr_>plvZ z%rDf9zCQTpG+`4NBqc_=QC;frZD|Q@eE&g>&o~ zs;Hg9kBwhUI$jHXoYAg)+;o@;{@F@%*47^sPONzwDV$jIHc~jr@?MnSeY7xsz_*21 zg@?xv`xWQ$o?fUSATrD(K|%p$m}a@ zVf>ODzrq$CY_G5szT$qm^TNGI@K+_M*Ve*bHP5_-y?R;QsMQtr_RqZc?FLiX)K;@a zy_vzbnlG%Z<>a(2cg`ET2+2%W`aV667KYc^j_nA}zRn&sm0eI4Qg^FlN-d&nQR~Y^ zt3{NZTGJxRPOWJXWvAA(h_cf{i#UM?>9(>{v6W1g&A@8%#b9-2Y*h{`n^}|DvRT;{ zQ8p`X5gM8(JG!Rk%VyWqeAzL+=3k&CmyP!|KT@g4OJx&kYQAhjP0g20tf~33NmeaZ z^JV@uui|Ew%9N?*AJ1lZc${I?d|9oUFRNAaWwmO)tX9pJ)zo}h?V2yEsriqXUM}lJ zg5N7a)qGj+nwl@`-OK90%GAf#{4H{7r5~_p$0m?g^JVFHY(TYLmhS9pyDVcX8eR9M z)OK06wntLiHW0N$>Z)x9qLztPZU1)zQSb9!)K+#X_T~P!fvCS_txkxosUfh3jIEhKI|EVXZ7W9@h+0d% zW(T5vkea#ep9i8!sLPsxsGgxN_h()y)aAjV|NFXJr@EA#ipP~14JzK1wK`!pv-*Em zmn~}7rRK=~v${MX)TO5WLS0&R{uk=qA{mRpP%>m*(y5>hk2;_vLb_{foLhnJ2w$UA8-yaq!Z%T20yV zbyicV|0&%i(Rx=gs?E|}3#QxKE8qdNa<(3^u+jQUJrhyC&eS!GbDd05ZeQrdF@3M-r7^uqGH1thUT^4SMpqW?+8$=PWx8mSB32k(S@eXoFD5q6&{wm+r3#p0zX+!7b#2%bv9<=rKrIXE|E1#zs*Gt*i;)u%Qwt8k>{x=7zk6iq6`>ztaB_>ZiCTIea-Q*0Yb+saFvc%8gbn zlw8o|UBWAiZscY!iNED2`eJ|ROYFOjB8|V7TpH8=;HEBF9n<%4%a>dh)35VxRB}a3 z>us*&N~2X#53%i8IyL$G99QuiKZzx0<2h}q8E53|F4~hT?>c@uOU|~X|7SAJ|Ew{zdn;hd#)*-YQy5-&}IA(XM=| zlzTT#+$4W%AIm%w?Ng$FJQM9xWwe>@W6R5n+R$BodxP4$ zGtS@c-ITw|*oS)t;TKe>Dlc5}PAFKFeaGO1TLj_dR7Gwl|E-4h=xof?N+cynrH#*iLIKHC0&P+v_&Knar?V0D`|Wz zX(XTg@&HsLx#8bP?lcR@WX^8!UG}AyBtR`*Ha+P&{4%MwWW#skeEyDPyB|g&IZnU5 z)smVmrkkd7s^*F8Z(lfd*hnMI8N)|_Vx#e1a!g|H&PloDkIjfam}t2n(l_Zcbg+*e ztk0Ok^ksqHB#(i_qu=AlRbRDV&6w3Cz`l2{Iyd9ez`le(2jVm_`bNI^JfXts{$wKdm%TFQNRxMci0kaI?;!M zl%iW?w*+gqk`jWN&58;x$T$aVi;@oJQwICgjFX;W{#QvfYxM0F3Z`v6mLh*TD0yH{ z)q!)_jaKfPU$Z4xx2*mm>9=gOr<^YRN74PW^oRZnecRq+zSqxj>!cqxB>MVa=vYSF zV0|)JbxEA9kNlMi|A4e7EFg|eG8S|BndH9*6V6lE{$*0zC5XGaw@?Esiz7vLyD;NA z15=v=F-we0-3D8cvx-jD)4h4nUd~~z7nQ$Xyb6}KvozmWo zsEd)g5Tq27>`uu4$J=+uNlkrkXLe?GXM5k-+1`6&*=0LY1*8iiy@^N%(Jx4m-Vp>u zK%|N^ks^Xpq&MkZdQp1sApL#L$<5u&g1L!=qw(@TXxS5~N2qxKGj;|Eos2tiVICf$f%b%r9#{@n`ax5KNEns#)Kjj} zm_cKxfK&xEEC(~@fOG(8M?Iy!r6=c;Vo9j`s%TFqfH4c_hdRBbPOqZt@bkVn>eEGdl>2aZWip2-CHC0QoU{OS3?Jx3G4Z_Hb<&gUp3o(Y4syay26r1vp z$cG??sdy;ZcOY#*`hv8C89xR2^LyM^2s8ErSuxF~41*a*gDjYV-_F2Xui}V9o2`T5 zwFK+Z%gHkID(3nesroZ*N+p;p9n54;7sFDPQQc|>qv;arRwLyw3(u@XoeS;PwK{BB zOU;UVq5tm}QFalTnkcIdGoAqH4$uvzxX>$t`bu3c1(bHv^g)*j0C=KV} z*9I`tJ0PzC?!mHafNVrbIvSd4f=v6-rc8k;9{WY_ztgL%_Ywbmy-BvI^>?{EAJ z>T9H5QVDH2FT`x|WJZ*@xAEXLA2S~}yuf(PR|BX5qbb`Fi!%$A!Ps6+P9VLJ=>!X+ z-U?=@YuGH&yFxMSbMUNjMZB=S3ov&Wcb^B415^J?aBWeK%j3(j8jdqY(0PHEs`oANP?cUK#h;4==!JF?kJu}WdQi<`U*2LUkN z`Stn*ZD71xY_c4i11x(Addv9LtZcl4P2oF`)L$`PSP=a}-*cwA69) zw#6v>81)~)!nJy>%Je(3(~ubfGi?Exy8@SLVJ`Hu`~=Y%UU3Y;FvdFV8hU(s^rB+OjF#Xf_R;oX=gycwC%u?G!cLVaC^}TMn=U7EO&F$z_;Djb1vs zbAy}6U)35Utis_O%w|PbRAveUXbYt|%oGc99N-9%Oc1}-xKIp>c?YB{tpRN=_@_Q% zenzoT8eTgF@EWL(26bR|gtlRiB2jv-P}^V8W3}jM_;vX~TJIY_yPJupY8gMfif_fP zRa|ku*&JdEJ2@GbKpugDLDXV4$T5I}L?(g6t;GQv%tH01wNU;C))i*@lWGBWz@q61 z5L)NhK&kT&@x1dfkSF|shdaWIgF&tXTqM#HBySyl6aX`J1{nu12$nqsMET9Ethj~c zo(__|9-pQ#mu(a1Vo&(tmu#w1NkXHcDU>0g(dI%+d z1CD`VvC1N>^Cjx4d?upF0C6<3Lt*^yz_kkO-DsvCnPX_Cw63qAbVAKJFKuRbD$!v^Z>Yo~5nUuDs>5XOCd3ec7Ma<SR@=Pu|q zpv7vvSe=DIIZv;_XXajbkMW|6+Kk;Vj2C4&z%nAVC?^1p!YtH;hi~12&vY0MzZ*bn zm~&6jHx0iEy5-?xM0nX;`sqeKOVrWGTWNJzOvPh`$jFh?@?fLtrh7^4HUiqVJbH;; zU29jKr+SMT|2u)Y#-0j2%h5PqK|ih+u$w$DwgEi0?{~aa6P(<>rjO3@E;vQA6?YQC zj9DNT0rn7y2YI{=2ZJzU5Xh44cq}-~=nm3j2X6m`84Vz5f8u^6nDH@YbQ$0;n1$wJ zs)h8AJMjxJn5hZK_q*`xQJAS6$iCh9CIK`359IP5{E{4I8U%7;FK%sunZ5?uy$|2+!gQBUk>2MZZLjt{RMCYX5Y%B+!d`H?uk|} zQ1nb|Rrw%JjKGxa`IvFWDznn)A>Kg?Kt6-q5oTHmatz=gko$%Fr3KGAlCrS5m^P&<^(>zVHtEL zS{p|(dLc$;xEa~~K8AD|RZCI67>4~mI?yUCO3T$4`z_x!RCfWHDhr~=P|Xr) zlSEI2Vi@M=d!JseKpf$;M}v=HMh}oV0JCA?T4Sw=DF)d;k=YJ&-Yz<##XN+Lv<1Sa zmB{?ZVmcoZ>#YOUTQs(Lt))C9GV^}fY-nT}f0y=P&Z5IF(BMCd8=A(C=#Tvp8jb5u zJ0?0rnk+tWa0svlFY`)A<9y7J4~_0%A#TBEp>$pQbP>|;>C)ZRwD>IT?BFbc8<# zU^Xn8j`U?mN=w=dw4?h6$lrtU(Y;1!ZAI5Y587OD&p0&-a&j}yf*f?#rUbx@-+(j# zc%R5Hkf{J;iSz=AIEN>Yz>J+h+5$8t(hB4uz*SiGVUU(<%}UoNc#j_e>3bgk5)Kwk z*FdzxO#DC=HHO=cHe*}JJCNT7Gd2Oa1#km~oyTId|5Cg*3q;&Z9WO`1?{94HFpsGs zWB09vpQ>OeMIZh8?<}bs(Q>WWWVB7E^uOqG8xncwE(gY+Gg=jX#Y1Dg=olS_I`!NH zYMR3Mb7nBWK$zljRP?JJ`O?1;!#n#+e3$xmsrnuW4!RE{8AEpiTsAz_Bd^FJc zCgaR!V$CL@EP={1Fr3-|HHpwbdja$$LIa%%FdfDN^;$31>^3M{U_8*909Ro=P;HK` ziiWhPt=ZHoIP(JIHQNcG156w61G$`aFfYSGley`0G2rni`!B5V7wxF1AGDFS8k*B%FTi@1I7z~0ALr4 z7k;>yql2O$Eouv2^M*~S2IGZa3GgcnQ#8FN=85L`VzL1PUTQM)8~6fB&QTkB)k1IL zkQ3%hgY~6XiwD;d4fvI*f?Q=753UnH2N(}-wH%y=v}m{ek4OF2Fm>|yQ0!aZ^36(| z5#ldaN;NlpE*=n{)sIEQMKjtJ8Y7Tfg+5onqN(t_R-nwHCH>gRoogN;e-GwyP2`U| z@$rVZhSSPm*yx7SBd~ZS!C+`r4$oMFg(X|TX5e|qWMSz6VC`|c6In!gVn*E9L>5se z5bPqV$RZk0Zo|8{JapO%;VK zA(dFumWo0a!@1cw{YI7;$~i1dQ(7P%bO>$&B8vzL=x;ETa!?eqq+|k+vWWWu6g1Axs~aY$RHkiL&xW(Z;PaMB%|=8-hF0bG`K8R;`gH#t4S z{EVX<;c|n^k^VcJV;iW;Ouk+&h)%U>NMWvo6{m$nBHe-zBAiAOiE+WNMwD4jm3M$7 z`XoVHpjc=)RODO^AY8G~>?kF;i=__)BhAN@Wc(A@oB@pGn+@zZ8*9&G_VM}>nk(I2 zW#%X5V*U#-GqXQEK36fg(vQQ<0dBmAI8BL0W~;F(+L)=K+c?}IVz&9zLanEJJ={HG z4zex+SvNmB%<>JuAE@#u2k;ul^@~6}!%L$o#7YTg!!g=uLf(684rcGei)AqIs{b9bT=aQV(~fF<11MoI_?RpkoNogGl+>-Yu26OW+M`K5iM-Ets{EnR?RY{a`2e>bMKat(@G70>8#eb}P>{v{jJ> zHpPqSR)Mv{-+y?xPvZ;W?pat2cW-XD*WIAFFF`-eqOIZoJv=u&Bu)riqqwWAOWu9fK5)bKLoKd zaa0_rkwc(y7g9!QXvu?%ptm|LBz`{VMQ^won3qHCSkkd^ufeXyp|15EFjq@ucsBzr za$_KO>5y`T;9+vy;5-C?-(ij$-4>%#eTO-2a^;0m90oyh+-z)#G9%Sm=t;?QVLS*N z`Os_ULhmrg?Pk&q2G3Xu{vOyP6}nNEikD#~-nNF*21mpB-Rf(my>{4oR?>U)5*7mm z*+dK<_|P8LaK?~IucV>AH{FM7IBUpQOWC@vHF#U^L0)tpX9-}| ziy#*O{)PooiOnAysLKOncN&T)?HfYNw98;Ei!%BoP*-J0w~CPWsS6j1<=n4Ab?e|-+B!UO zaUJcv4E?YX;XQ^Gzg=DN2gM736~DtJE)sgucu zSZdJpp-rg|^KOez8^aVs+zyC__q_w~<}`dKXhZ*J^omV2@Mg3J$A=0Ui;V2vYh5E(XG^BS889w1-8m z0@;X8&Y(xzI*=+a@sLoM67?t8U8HO~0X9Hd3yZFS&-)%?{!2tO+%e-pii))xa!*k7 z2xe^q67>pK_+c@PL1O#DjSx+K5Ya~esd^Af2EcH#2~r)#GutSdoz%~)JF?wiGzA>PqK(|4u1%8?u^nr3qru4-8*3PQ&mufVylZayV^5o$pcCrK>qeF~GRvuK=rz;3$mOWjoP$kbVZMQY!EB)*-2u7~Ndoy9 zU;&XFkjnu75UB(b8lF*~ z4;>8~H>&IWkl2A@Z}mC0zce27!*p82qgdc=u(ZdtH-A{3@*|ytlrLdvRjHpxrD!)9 zmLT^N%)cFd z`jt}WcN@Y*Skkzy>WG$!NPFcn1|M3ht-OPj7BF;t7abR(W6IVt(4na^8JVFl{}>u^ z9aa3qCrJ4arj-6n47CjoB3q(m7C)OQ3%AVl1FlQ|ktlnPm?zaBL;o7W)j|ti<`-JN z1K3t+50>)*v4i|6lEWW`hurCtFo!<@4|~uno5LS}M;PbQu00Pg!f9@zq~y1rf(|aI zOeu4mx|@T}X|IvPACy1x=T;7HpmSBsGo7cK>3rQx7wBfXP@O65>u9E{>}I+_n`tYW z=@iU#H0la^0Eh9od1zA-XpI(p+@%flGK5p|KJScw=JLHey?5!|(2dxtcS9Xdyc_7dx1mZJ;XvOY#Sf;wL#ig{p@aJ1bx13saa2pd_Mwae|B5tTkMAWn zK-)v$f0D-ghwAY(#_E1SN)=doAnq16)Zhc>k>G<#^CYdNCmkQ30Y3%{Jb=&Z3>-h! z=Y_B9AEZ=<(c9t!R&IeEBc%iG4`b!;fFR{CEDzh)hpc2KuT~ednuzi4_z?teYfS>T zVQ#&xK}ru;;c+kQ-9!=YpxTUmf0Kw)I9jtlM&<@euEDG~K)eF+{)Z_E-+`49jc`0l zjhZ@JcSFrazBJ6b0i-cNLn6O|3CJ=X^vHX+s?> z-M<29e)O770UrlT+P+3zw7Vka_oEkO7{9F)rSKVEhlXNoPPowoWBb_r4-WBT!Z2g2 zAKbs_<{`{#0m%%)>jf)n3NlSJY%lt5igvbUNOVF)J6P-|Age@GV^L*m2XP*>&j75UkMuKz&Xb($hiUG%np0JX)m=%Z4A=X|{_anU*2S!uEPzSlH4O2c)k z?1sufXZn=PnNK_4z#w|-=I~oKFp+mFb1IRZMK$?9Q;p4un&uCoEiH(@gymuX63j^9 zPh8sU#22M9r7=$j`u!TcPjc?im)d$oG?RiZibH)L+N0!rO<#QLCzr-3b7{-N&d))8 z@2Wd5hep1%qOFjQHDI9>x8+!z3jp;! zu{GPBI5WmTHqnVQ!*nEA7I2mV?Fc)tK?X1&s2#$1q=L&#!eut{$`5o>Ckby^YUYCsSJ_oSJ*Q3(YMWv&Mg1qCJIMzxo)9+W~yS6z4Xw#JFngf>0P zbT`^waLUPSB4EMBb{a`9-q_rDV{_w;&5buUH+5t4rj5;ljco~PeQ0B|U}K|(IA{Ak zf<-%LgRSLXa2MKIoTFn&#|h%ucyE|oe7x#_`q7yx7e78{r(PRy@n>T2qiX{$0dBJ~ zFbBnf8o5}F!DwTohW>PIz{Tc6M?#(fbZx*T$hsbcuMI2)_!?E}YU-~T`+->L+JH-l zl@b^T{z^``K&+Ge1olS^(CI3)a@Qo)JFf zMYIoB1igxQm+^i30?8f<^qAvQ<+<`w=CIZA24XhQZk;AN>5I21JT3sdF?rf)bZ*%j z<_`-ngvneuP^2Ns5G|B=jtPcDS)uQkuD8*Y%&`=FC0$(=;HrjdQmMnJKKuuU2KdLR z)RGQDnld6rQ!_&g<{!a#gmr>-Gkgl)9j2c?FTu6k|DgAjxi1X87>_cHHhjfstjy8L zZX7sE{-Z>s)9G#;wi@PhT#SEry8{2EmbA6-f8fmFHp8DlJ6R)LQFaNuTf{wx`*0HX zpsogAgA7OQ_+NsZM5O(cI$Z#|B-mw+R}D7|HyPc-|0#Y5^ho5Na(pJ(a}i&Ph+VM( z7aVxMqV?|W;3If|)Wapxs&JiKYN-wx5>uY8ZD-jj*$!pE-+^_6b>duChi)9PZ{XP7 z;WLh(3l%3sfqF_-Jm-N@8|*O7VVYpGMf^c#wH7}?SqfVYTj{XY;SaltjSh4^<0yegBYtJ1OPgbbf{!kV6lJ2oQ;l@V^9R^GU3MwsW$>$wYjir^ zLtvYYTUa~5{-E)Y@v!j-@KNS8COp&y(+T#cjAz8}M@cK5&WmdNG+j60C$>CY)v4Dd zzGb{4@I4W62exj)jmiq{$Q9FLBW^$B3AZsRxUWV`uQa3{D+<-X%)w;TsZPMolDi1x zj!TbfBOjA5qfq!TMv)>D#W6-OZO*aGu2gO zYX$%flnj?QfJY1dl};Z6{55QXPW#3*QODG|e`}g-`VQ(3Z)7OHh}CWE)pPUW)H^rc zV^Y5j?0ZYw{X#p)@s#Pb>8$Czth;QwV!Cd+A^1&>w*AD}Op^_LpHo|y-N z4HC)_^HB2$#^0J3am0`J?I!#X-fqH=#l`fid4+kU8K-e{6Ry`OxB{%~WOX0=W9+df z;&{@0%6!Ir*L+W?k43~eGxJm6muBq{-Qeip=#Im6561vUt78mMtp4C#%r#!8B?G?$ zs|c$Es|?eos*dkTRvoA|td8UR@by@4z@DmG3-pnQ?PW&m3!lzH>(23WUB&+d?jg0F zK>V{4rN83NpH>gyTqNYTtC57fqubzj7Q0Jc0RSUBv>%3)!!h`gX@167Q5~ zH={k0t9`3}uj78H9~9`Qh{t4xYR^k{Ng}*jz)u~YOXY>*ONn1OzIHS?;S08t6TCV( z1Gzf63-00M3*_e%03Rwesta>U)G@rL>{xlhDoVAoMCx4L10U!#RH!4JMwQ4@)o7`G zCD2%@sJ$r4R92=*eFo56*gUD=!6;5kC0hpc3+z{?6;jjsvX3ie{&$I1Ijsd=FZo8N ztrBl{I^uL(u+vUwq^|Gv9Mtnpf6Lq@Ms%@Ln{GKhbov+knNHJk#qqf=`%;Ig;*}Fl zM&O&j!9u4q9LRVU8dSApwmL`^_7P{nGa%yR5#cFHI$1>ZN(I=KJh+SdbWQJOQ zYU$2=f@P|mKHahq{Abu=*b>V!nO!FlUQ6H&mQAc|*6CYx75V96Z7~$~hV_M&wE( zR)N)WejmObtBu)HyCy)*B*Xa{9j1H>=hn_`oZC5f6nf_pd8#R%x^lLg^QX?A0e!Bk z?Imz;omSkAP#@>M$bHHAe$ImshuGDQbRGphhPAQI-ywd_cn16|*kafc=igYvcL9#; z*sq7*06XY>iaE{gv_!cpgbT1P=`N*#a|F*5@oi%*;2d2~r>O|>9awqhm0T)wtnO07r6!}=?6DUT5nCNl zeOM!@P(LkP=sG*j2y_6%wzNh{o{;GrH+Yo7OYl=(1U-ZI^hLM7t$YTkdh$FO>s~4oR+7 z94^60J)+Z&x*TVAj{SLfx`pX7Gi;S2s(oqxn#&D4{iYqe<#I>z2NFF7dgAi0i^0|C zs`Z150unpAI!UbNEzI5Eee5!RU;(UH?eyYa^~fe_f^@aPt|5|zF$#yLd%t3(j%``u zB%owwDe!5oSu#U6!51!DM7O56vC z?wZq2bi*7?gAj)@9_BjAm2R4#>1)^Vj3&T;BQ!NL(e+!`Nv@OaG)4JN$EUi^1e@nN z-*tgbUCeliPNDvmmf(u=8qef&n|iB5T{!`ir>vG&64CC684g*zVeg_~J$)|9<7 zybB}JJl%Z-_Ty-k8OjFPF;Zv>W;ND5&Yf=IDV`GC6Ty>MOJ$$Iz7%|E_X5Uhby*!I zS@95A(k8U%C%~AIN+V{9r~}of?O*HpYD{$8SW% z6!)3#vw?qLKF56#;?Im1v&S(L;u?Yfa9=0TdJz?6qx&ZJ&CIsD?~>|ni4I7lj^nWV zQC9wPKaP0H{WP<)@P9KZ9`!%q7hsoRS4!ltZ-MessGhhdh$b&Y`f-krhc7Du9)XBK z9>L7i8qJ4zM0iBMMc48P9x2GCdSrT(wyVkl%VwpFM@73#C6CIISM{hSFg(~PK>a-i=vs~j{>ozvD`Ry!_BtNp z!6$i4#?z(M9%mxXX8Z&DIUYYEE`}}j_|4;Y#8s?Q^=d|I;nz!z^bK}wBiJU7UGRH6 z_S$8r7WY*_yP(rAdtC9j>Ty%2P}MEw_oVuqk;T&)x2LF+i>IrnyJWsVex3o6;}b-O z)fSOZqF~XUY4GVXpXFH%_&vct@N6P8%{@Q%Y%AF(0=1J0&PM}x6#R3~|LHQ?ID0_r z>G`G1^b@GRhyy%_$sCSiJx6+ulKd;6@sephPVijB+AnWp)QaU&{}t$W!Pa{IA$6^% z4W64>+v2&+bBE`jy8J2N)1GJG&w8Ho{D(7Fb$P7^E&i*^J(u{E=W7*vX?6If>tz(o zj7T>D(&X&r2IS4m*Ng5Gq#Fit`x<*f>J;G>;}r`nPUwjoQ)N|#SEg5K$+8$76a1vt zHJ}?_H{ox=ZVUYm;$4C7iTK#-sn;{FS75Kb6x=f9;BAD*6>#>1yan<{43Mf#q9B1n zL=5!~lR0XS@8^<73KS(`ymy++<#^{woX@BLzO45<-W3q5d)M%;g;*Qb5~fY91pdgI zZut7xyDfY>U7qSXf_K$v-GM)Y{ZFT9{b{j>cTZ${aYY|l_oa6~f%|(81R4YzBC~4S zVa!Lc9}ho`(G2gIhzqD#S`PFpvlT*HDRbDq1zx4o)_HI6-sru_ zdkeI!Qs3^q19+$8hZvm_{H%!Q5YNN@7W|TkG?L4VuM6cS$4Bswg@Wzb$Jqx*9WZrr z1#)BN4(}y(Y(Em00xAtF5K5s>S)g))Q9tEAA zWQ7=<44paC4gOP~UOxRr-9Qlsi#SBYp(0ZAVZbAOM){1^X==A$31!S189CcGz}G&@ zQT;1yh0h<{Zk^A1#0@^%eReRXCOdt0NlbjVj_m>7%X~llQJ=qL?wCZ>Mw^aH^`tW$s6b=K9X_oe#E9D#bni1eFbK~ZF3HM>zs?YfzDgR5D~RehWkYcC7NT5U%X$UtVxn6*)Ih+O>(V0#dM)& z*=6(n3YfpkzKUN}zxNo`@~f+>s|Vb`uaQo{9t5npUrU|VN{7`sxAyx8T36Ql`VB-J z1{=W{vP{B@K0bbnc->y-I|HXB%&jtMPN1KESalB zlyUR-@b|V;)OzxMQup@{k{I8F1rG5K)v3kp2!+W^6r*VPc&R1$=Sytgt}OI&cDeHY z6$G#7U&+4;WTP)i1s~etRb?ExuOYtb4IP$w`Sjly;fZuKQ5tn zV&2)mi%##R!_@Lq9Um<4FvQ`EM+jvk;%LTS`Hw*y%Xk8Nb^bH_XEK`w{{y4>@Cz6% zgkJ<($?P}yRsI_oQ`?OKZSmg*v>moX=5{hVE4ex^^5^}pN%cCToACd_o(laXqBCv= zb_sB`yCv9HFuwqQpwNJ@fHcH(S(6=5Mq>PqBcKqhicWb?;_4F7h-xsa313U-br3&> zwGH@$m2Lq&MTY9_r!SD{ZI}Hrpda{vfPqpS955tcDA+LA@PHBUqhxMez(k2BNi>Dg zG|BDfIrl$wt!h5!7mBK1?W$KX+hV6tyX^rxSo@RxPWascM*@x_{>6&g_emW-4SX)( zZ&ohAUt)9x{u(1(w+eV5&?Cer0xNu5x4~*ebY!fJ+X>9sPVoh^vJwbyvqo8C5aX>0 ztWmo}YZ7p(~-&?4Cto?xo!Un^J3soD<$P!%DM?oFSnQqo)>~G70NQi<<{S=tL!S)TK{0a&Q4X^ueWY^L){2vi%#9j_)qwqjP_bj za6AQnmJzlK>n-bTf$xckbM*o}us)U=&G(g_1(Mf4g8ytqWlwhA@CybCBbP^|XCq>jm6L*7UUv03O7A z2>f!9`5keUz-vWZkGMf#8pB43H`z8zjL%WqpUigJcG>pm^x|=A=)fDp4Mrx_qI)MTqYNRnleDE-DATtJA6mRST*OUN@)#s~-k6M{L2k zWl$@Q+N@jaSQ{P2c_?O`f;tPeyNF)|^#%G;u>Obx1lIceuQ*WDjSz7p#|gUD-v~TW z#AzJo!!HQ>U1<20z-T-CpFumNT0Gao(2fNC6?9zWP6VCQRh?pdMyF8Avx1*PJYOQG z_Iw5E)u0ph-eCS5=fng8<@LLJc2!gy@0)8 zKCJl$TM+{pQ+;r7NN}iRY7ZrSSa3{mY>AqL;H2Qv!P&uOSkDR0Es>`_@>t6cuE?<}ZOK{iV&w+Xb_p+<#XUC`qn)>V1VZg(6 zT&+<3h~TeunX$kVCI1%aJITHeo(?=CcxLb{*5<)42wn)kh&j%o1TPI<#&|jWN}=lK zrpH@2zx9o(?ND}=PoQV!oojN@aei>{C!PW{ZIhmlDL)>*4j}ULke1RfEVkE~gNJzY7 z$srlQnUd#+6o!-yDHl>cq+&>AslFRh4fs9gwT0SRX4UcZV%|HX568an14~q>bwi*I zeQSpD!(?WpM5BSef{lgEm#W&^Lhz*_zv|Q#z$-(33t1JiMyl(8)`x6|-x2aBt9wOm zpNML2c-E2N2X*=(;KLzDbjmTtC#7;(perF)fv!ni?e)5j-_qgRI;>W{3^9h9=?9~j zTsgW4<}RX|^9c0?4}b;Q>1r0&O>}A`<5-;%r^8x{;us&A6q}>qpiV0u_n^?x(7(0IO$wa?J~ecD=uDx{LY$+knJe&592c=)7P>rijjrYo;B}$v zS=qpTBm7p_w$SbHJ6NNU?2>4A=-$x%%nnKo$2P#nLr=1DO6sR2QkUk8j^7Hs9eOA9 z9+dmA2QX8ZCCnuZ+Xt+8a%1KP9}EkDg~AeHG$kRX2&^il!b*c@!Lq}0>@v8@!n`P~ zJYpr0t0H1m5!GJsn>gk*;A_Ha!|Jd?`MO~Z88>3zn0*uWP1!eNulCeB>=PYp7uFuE zi&VM+^^gqTUx5cP9|}JVHUc&(Y+Ts*un9mD!zRJgGz;+u*c`zXvbQSp$g9SyM!7cd1QD@crI9;RJ3+#%$ItV@TwBq*Wev5GBw_)cppmB@Mf$x zXWufs701@$Z8(tmsI4F5d5Pk3KuUka@sVt?2G*r4zsLLC=A9_Ty4sK04CjI-zA zOYAs44|IH4_^)6qbxO$*seD!V>hLw;8^bq+Zw}wW)w|grkSz~}9|}JqnbylmC}+aY zhyR0kG5nIuUk<;*_<>NKiujDjKXrZi! zv1jo=T%@Q-fp49-QaM zg5wAdIZq{at%nu^Y;W#&PVdP>)OW>EnmPP);Tmt`j zZiw6^GkYTUMedhOUwc5O9@Js2<`8R#-;&WP?Bfx;%A=9TB9BYu1kf4D)OP10|ABH7 zc3WibiFhB;ANNMnyo0jEa`^aZ&M6iBXx7XGuhTWJl%d zcz#qtR3UiTsPa)2qACNu3#%?GYA~wFzP41gvHV}L&KuQrrSiT+^`jaH{1Ia3s4g;t z^IcKhBh`>WdR7W~2YPcOQ9{&iTk3<|L@YoWyUxSZh zZ5I0<*w2evz;R*JPaL&A7lHjOm5otbCEg|x&Y=MBmVAHIfvAIm9YQ=TGg_}&JR&lG zzqR5Ys25>(MD||P16lV7=rQbB)JxV}qP0F1iB`bThX@#{x|x$RFxP*42}_D>ST^_jBx_9#5l9&3hx%<&e#Lq z3+ByCt@nxXW#+Hb)J#B3AZs?636UsVA~9PI5kigBWuqjHW)u?>FO&qCQTs?_o@A#c z>sVS$ID^asN z_O}uW?r+p7tAJNazJ}3S_8Zx6g5MImjj=iwd%pvjov{aH{!r}U*dvnt75fk4i?Nqt zF9ThPeI#>_fnG`WT0?O-K7)C|XbM0KiVGHuln~(1xCHn_p(e#81Es>!VCh25h$|JB zD{wwyk-)eD6<0yvI#R>$2z8j|Q#{p2rYWoitc|Q{%cy-^C!ur`@l%f7;r}O;o^f9= z>Myw3^MJVFaU<;%(nrOOj{7QZeB3v7nJHj1gff%k9J@TOMaBIZw?b$u?Q*|KwpyY! z65;x!#9QLFNlateCD?8|l`{6z9^?;m&5^k4akqi)#ocHA82)+O%eYs}a1|k5-_mHu zu&0i9X2nJ5?udT68f$!Xd`x_tP||go491!8SyC+nloOvDpBJAmHJq!_;iC9=C9A@y zTKs!bp^;X%W4KaKg4YIrUuX>w8!~Ph-;84$_)p?H#CK$d{bT&60;y}EyB+HZ_64l3 zol2D>gffcb7@7Y%ejMXT@RQ@Gz<{C0XH`oB!K%ovv z7^=$;6L>h{2*wi99G>D6dUFLYbTJ6YGoMe=bq6GU2y` z-%DuJb~S5j*{|2-Hv(@;*esQ;3EP0T!*;;-B#Eu^ zZZDJ$h#g^_V4Yd(3O@)on3>w^(8OVh!v&ut;$+0Bu@N&UdNS)gJ2DXNkt?)Z#ZkIrNq=GXAW_&{<1?&xPfQihL0ZIhGYn9hd6gky^Q=@)B1Bsw7$Eq<535 zfW4R0N@}ecwSoVbQ9JhSlR6}IOzOl~n@d-)?n$2|eUUVZ_0dUR>GER)9+&hDqlrnA zblJ%|to5hH?~s`)v(u7h0?%Upqg1h%0-h)MBAxy-<7G*|a9l1jD`dr5Mwq~4#qp-cf^~1pG)-xp;SYvzMo?3oa&P5nyUU60IRMh7&t`7BU0&K zpvAHh56}N0MRt?OdU9$CBL9y%&hY;N0xAWS{)(>$W0z zrPM0$)k|cstw58s1iqSj9q5KGL-lv;_+7#7*{P3HpMbweeF^`HGq2$dY1$b7 z@928r0`E@SlXfWWFxYWj z_JqJE5znPvOuLkJS(m-R_-5K|j(6BUNPEHYC3_{^kglyA2O#HkSLSX~RkI!?ctE-p zN}y0f(j#>F$n@y+7#&x8ND@kNdWt~lh^5lYq~|ct6)N^0K!uW(mq;6Dg*Ox}gR5id zRnn`b*XD}%)9Z`M1|oi#-Y~tTY~5NSYX6a7ZPMFHy**GzSZ7wc2)&z#)ap~<&tbi! z);oQ4`WV5!mg)qFs1?31m*BXrB9y7R%=hWjm`#WO5jL0EJotr-sHa6hzeu(`{nzvr z=_|okr>~JJ)v43^650ml+oZZvqFs#kq#qK>VG)m{p8-0XejfgB)*grq&Eb&_KL$2r zkm>+$$}lr_gm+?Ofp>Wu!WXXzbiL|;h89C5$-_Wr|y`kkxrBEWR zA1#*s&x~5}4)PT0pfrcI;7m)IZ_lWMP zv@sRO-XhmW#J;k22+&Z;a6J!rWX2ewe4Q~)mn-g%&;(uPn~aG%rq+F{Qzq%Knw>6` zA2Q~=k^3=YEo*x-_KDnnS#u!cuZ%O2odr6d@wepv2y_AQs=zm8R-N;k{*I`)E8;y} zi~GP&nEwm^Oqa3m=LIsRQpK91z)qzs0=ek2YMm=9KJfmqfH(45Z#Iz$E)`ayCb9&N zDivL-09rZLE5cWTRe{xIg?g-4sx5Fk=ATMco0mTJ<7|KUfu)B2N9AznBVnUTeG5Mc z_8n|GjHa2TW(kDzd!;rp-okz>`|YK6$h_Ku{7z`QO6`W$TpJt)KZpW<%(WWUiS&EizkXww9{eS6lGTnO)%f!3K!z zK*T`;;|v?nkj$Zy+mEK04MW9PSv5`~tzrTz6WM<&vy&v63^WDyolvG`&d8i8vp8Fl z`J;}_(_wWEKS5b!r~b_BH=(V{Tn)4)b8F_d%$=FLWaS=4d)e>LJcxKgLm<3ymW+4jRQ`Gr3ft*v2y8mOIIyjjg|M{tBagE zj#_q1)yOx8-t8^9Pg(0OGd%?QLMk}M0q$M8f9b(O8_IDQ`{C>-iOggXi|0#d8mn_k zFB93-h?`1p)79=My&G&#>Amp#V8> z(c~?n%6ypl!dn@I>9XO#Nw7>pjHkSvBBmX4THB zhp0`BvRZ+)mP#jy@NGllt`dDJ5$?Sg_;Zduvic$RhYf{|$QsG2HlNX8l@&S zl26I{E^BJm4Dgv*v$B53ngjGBXXj=-FDxkL4V1;ZlVsEEvth8B|@n;n-O&)HJhnI)=n!1J;TN~qXw zgi=Aoci*UJ@P^vz9_@#j&+u+PvF3j4auc&TZ< zYH>oDdC1K#^Ar3cS@kocrGjrp+ydJsxZ3uF9V6|ORL%-?zRcfJ)8Zu(ZO5?%fd}X`tH6OA zZGr{ogfI#fTcZ@Q?Dcci za1Xmo&zvs=@5^z3T~=#@Gca$_r?U3F$jr)_Ezmp>=Og~acoF+0?3b~}nLWgn0^|B~ z&f1)H%(k)L4!yG69m3xfQarXGOgm_Y5 z{JtgkBI8TBm!(E?zRK*H&~D`3Wppq1e(nQC4@CxBg+%rv#`zOn<~i^S=9avYb^pbk zxza7qJTvAv`&&!mVEQzx7$^aKJFAHA*R+$+- zA4RMoqShb9nyl3lnT8x2>FOHiHIb~jL@n~#OWZN<)4ZON>HGddsJ&#iKhS`@fqBD( zG9quJ%#D^v?PE;dxV-VKP0X7la#QkV%c?nf^YRu*hNJzwpYj&x{R(9TY-QeWoco>q zD)!XxYM`~u*0bM~w>fXC%;HM14r8AMb~x`y-d{pJVV6BA*(spYlHpo~4y#LZ9?Cy< z>IJZiuq#5n%JF*M4Z+oRdVgD&xd;4G$6qmiooCI*StM8pEHpnXKLSykB7vjw)1;CP zQ~)cKidy-OTNOD5~(a@^h^HA{MABRBjQ?FgJYunt%7aK-=6kL28w)nE@~6~yNkkR93-*BTWo3Q2Wa)KDB^{6pj+gXc50c9K(1D{0~C?5pizeJZAIRuP$7J z_($PJ_)Ve)+ zV7H`tm(e}R?-xFhm|8ppd&J-I1TBr$#NdjkZ zEX6)cXw)W~aX$M3sTWElIu@Zw>SZOuwGPJR;op^N6`-oj-V<6~#Ck>b1=IKY0kj51 zAHp|;HG(yPHG{P*Y6JfU<^(?R$<3WW~awB}Ge_Efd-X#4R$fjZ%xdL}s_F*eel^f{G3>JIwxQ(J{p1 zj8DLyDmq(quIK`Dt-s=UQROs%+I^bpD;q5dngPbH$dXT-`9GO;IQF6&s< zwX8dHFR9`@cv&AEqe^UxB@}<=0YbGR29~wK2bB#i8-^HPHW@wzmR0s0`0_Aqs-?rE zH4wZJ$L8=Y7`12Lfqmz)UCMT4r1gUPeg*G=*t2Y(vi%VI!v+W)=fWi_ZuK@a^8Yb* z9^h3J-}~R2+>-3ltMp=5L@5H&5(0r#N+1nL0TMzeNk||C6i`wK5Q_AUpfmxgieLjl zMMMx$QBYJs6agC|2M!vu2e|^q5?|IMc?C$iLdxKqPkh1JQsb>jhcGpE+ z7k6DE@KW?jWHs`FU_AM)?fPQZmn_VBg*Ph1F0Sil;k_ccZNhHvx})nZORCo_*q#5L z3e4WFZ*+ZAaBmC!j*P$C^`Jn9x_&H~W6~bSej@QHX+6*Gv0rxmn#gy^MdZh>KZ$fx z0?hbSp*<<-c>zU&DHgf}J+nfJGU3k(n2UX0#pVUf4_FYeSo%u>mP@n}`+`bUexEgp zTdR;e`eFs286#kQz(&}u$Tnmo)I|2Wy2ElKpgzKj5*mt6QlP1m(L(}L1U7x^CpFOO zrCYpF0%r@Ihc2+hH1U}rnWqDv`A=+e;Ion|#1g~D4AxYCPt2Ui8I z4SZ4Z>#-Xo-YD!=p?3uCmh4_>-wZq~(T9OY0zU9=&D!pckXf1E(M=sd;ojfMrAIZeQS7I_XSl(EuoGbM80t4w&a&~pTu z+ihOA#R4rAni)vgjY4njwyoQC&`ufiJg?jC670cl?+bgl+o#>W6zHpNr-eNuwDp>A zV9r)xzpdb3#{aF`@900fT}S^V<2SqAlE}>QpKkwJJnKDdLG1bw&!@V;4TBm5H5RCe zj6EFmh(s-d9+RkLP%BXDpeKXcNv1K->(Xl}ZicJ(KN%}*u zLxWO+MyNP{`w=u6FGDbyiq8rfAC#*+&s(tXfh)1_r9m_CW(j6CdVxR-gBA&EUbh&u zBxosmS5w!fvx*<~=XZlUGH%gH(I|zf!udd_8Di&>J%S zo9eoQ3YF)72=4u$kG&$tg!c*hQ^kL!5NqI|3qco!|D$Ao3c3XP*^=gR&@VwZEx!AX zf5Y5DZhJ-U1pR~mZ;-7!-|-{vkI}s*xQ_B02-LWHGsSSeC-8k1#=Q3a?hnE|Qh_xi zk9Kd-y-oMFBJyPSZk7~53U>$fK!OF+Tk)I)(tfXqe~B1;hSvs7BQ$FFND_#VF8t{}zA?k}ixYr3xmzoh(i3c0V@;N`!H z_fGeNl6$ZF`vM&n`a{W<-;2{CFYcr6M}>b(vZt|UB>qiW{zXNF_{%hb|B}qj?*2Xa z_8l=0&!_en0@@+GofXpVQvMq~-W2$)9`7j5%xk~&4hnln==Z%+l;5!; z`beZZf&Q$==jxg-1Ue=3H$tE7@m-JaRotD+IpLod`U3g~lds9$GMKxnLi(`Edlhg8ji&rSE3hze~Rkwza?=f;$Fx6(~^XZbCCkVS|yL z((ffLGpj=35=930R$QOpzQO&Z7mbYxjt!0r9vD0%cqra5WH>S!@q98Z*yOT=KUV1M z;2dmja9)Kp?rZZauq&j$QrcC)FIZBn30@z(A$X%;c1!+MY4-&04Soy!w(#GTtotqp zgAaN6ZuV~ax)=R~Ky6iom9oMe zdUg~zKr#IlVr^r=@fK{}W1yEmSa^w&OOiGjJ4E6PX+6)EDg1Fg$M?(?=-Hmru%$hx zqh|=llhU-a6f;L5Pkf$a<_o(_=#@RU^xXQNl-n)Lj-I=u_XhTDf!{&z7wFxd2eI!7 zY~JUvLPr$x+@If%D(+~{kHN=;f4t`xiZ4(5gN3`;^GD%b?s*M+z2_}U%yY%7*io0(I*Zq!{M0Ug3C=NN>pwv_v_z?UmRosn?KR>0Ye+ zZQOb!kx|HKuM}hOGJA~`T(*i7N>r>EYfdIEAu_F3DSC!TGqcwm>@s9IvRZIvx)(q% zD$iuxpO@e^^xBBtWQlGDzasoy7M5?pEZ*A^zk}V69O(6~WE>%tLOl83%~lSnq2e_` zwWL>DvHY@F;(M_5kcPrDpT!M`4|PsR^Qdq~*#r02Qjef$pucO>MfSL~CJPeV?@oDuBT=(8c;$`s!T zdnx31>9fNQxgByxc>f6P6Y9Bx+qy#iDll%|U$B+DVpZ^J38pr>jzD$M^#y7yv?uo_ z!fTFxz>D|9-S$yStWD^X!fS_aAKD?bV`yhkU}!hN28D)WBL!w$k+z?-W^U1;149Re zCI}`ubQm@TNw=h6Oc7p|g&P|>&f=N*%XBY=ZWd^3=ni3bhVB-2Z|MHeBQlM54j=u8JqB}J zvL~he4EuTLxzO{{FVEwmh51q9pF)3A?C%Ph*IZNH_0WGLc7;_A^W;}Wp{ilk1gsAid3DTR_{xc6dcS*ZeQLGi+Cd^t;1eh1pYqbzlE_*xs;xVQ+}ohe96- zI~n%*f6`tJ`%Q3v$jD7giod~kl>d)H)+h7{w|f6S*q19D;kvx8GPZ`qb;BD8)L7^y z;Z4Jvg+C}`X3h_Rp9pWIn0BBJ;T^*}38o7=NXA02y~F#3M@j#`&(&W<1_&J;9{WGj znODYz4Zs;vl0CYvORoP_#1+8U-4%6TgrP!A^v{Sg54=k3g)x$Z?NCW=y%edmzHn) z6k@+>!8gKvBg}jpXlH~AZA8?Fs4qB^e?Xzf6f$|wr)9(w75G-lZynJ_;mm*#fcw5Adh+Uw4!h0j)Lz%*J{r|Q{{zuBw5nrpwSdn+tm{x|3we^XMEI;Kc=5yzT<`i0qB+ zBXD0C?I-Mj$Y|-uN*gaNtrs*HNf1nu^G=el^kc`OO$UK?8;I7wA zQtV`brYgTkp%Q_np-UC#zS|7x&#J(i(Zz5}kfjx3%Z0yE=v6|mj(j0`$^R1hYvk{dH}LKtzP&x^`1dKmen=g`)kW7s8VHZS&+Xl$cQf$4z3)dq z+Pj71-PgCoYpa+i6=K!gyMx7hO5jdHcM&>JMI(Agg8TOFCzvSo0D)q9#|vBjq$V09 zxCC?}k}SNTLJt$#Op~gR=?(9l=H;85`!hoD>Ago<;-kPB%FhCgRi1g(WW49R7%Cm!wY^{Jy-r=TL7dlC?SyULr=yB6_JBJhU66o2K`PQiq2NBD3Y$+5ju+9Vj~CZpcmvSUNQ_r3PI?0s zJE+fK@KEKOx#mbOSFuwRGUJ}lbitOP7xh_k*A$EheU=efE}|>YE0I;mi-PgwRMD>M zv!TyMk>X`by3H2szG7>iwiU*ykhcF@cYxKk0L#&!@sOuR5g=e;)%rjeMiH zZ$amjSN>e*`&jK@GeQ_H%sJCiEmY&WXRk{e>QYjJ;|jht5B|zPMVo?}^?O+PX1Z3=Yu&F?zi!|l zq?h1Agbour933H$JMTz=qxuc#7cJQsY^=lsrS&{VLchd*NpQ*iQbZ(8=n?%!Vn-pP zkzB#?-Ji7l7Db{WVM`S6&b8Fy&$Qq<0za>qdHv=Kyi_rsr(%C>;WmOd_1h|#ZT)sy zBD=u5k=Od|>9-gAHu6rt{rwJL`Q3ofM}$5qG`&{Z6a7Aw$V~Y;_$%R`?ss0;i ze!ocX2KH9J+m_fJiG8E!YlsVRfBd5S6|M%Vf!rgRdQtUNj1fJmdDOj8_X*~H3;%!x zdvf*I2csUcL?08lrG@dNdmOG6(k`mKj6N0BMWAj`AyJ_Mg++zSSfsRlqWTKd4;>{? zjEvBd1d5A_7d9~}2|GkZ-S-`apNb5xz;l*sVMc&QT72``QNkY`H6|*<63GN-S^Tk4 zF#!t-ydMm-lb)xs26u>09cqh<(hmW<4eS_oPsyv67xQA^RQqt-;Nje1eA ztR|&(=dclPGqP2&I~3X}&@S|=$ZLvcWf8S6>Y(%w3HzS(J`nb>^ghO(5%_D#xbJ#4 z>RaJojQRa+`iEm9klu*->C?ZjL?eV9*?+9`-EnW7En_)% zNs}wMy#7!3pCqG``#%eMPI`sXdgoZ=#TMh02xgklr7Bw1f0n}DIhfvp{tNFKT?D&W zMV3mmtp9S*ivBC5ze=U3nDc5Cc>%Nq*(#as{dcL@ZiV<8OA9W~Z7=M*$ie=H(H|j4 z`+tl!Kc5JDLV73re3`S%2Z1gM{Zs#+CGWo0)RzTwrT*zMC@xmV!oe`ZGJyyoDEonT@kpq`2 z`8;ev^dyyPvOrU!i=#`TOTlHx9Kk&=G(A6hVe}$_7Yn^4dTI1B&?*`C+~oz~uZi9g zy|Y5ZlVXpBe;vHf;(OBY@7PH8t-D6u>E0&x&RyaMq7NzdJ<$8gGq3wF`iPfravwz> z72GG$CuHn%Vb4T=jr~S)X3Fot=aCOf!M*k9jcWp_oSnZV~gCuusS|v@C_(cX&$r9b-CG zh;&wdmzW+g{gvmwE>8G^(1Vc#BvCNsPoET%1~VdNq~ga&loc~pac25wq&G>}DKXDs z3uB66N@AwV$n(;&KZ$DF}_jeIM7cRt@q{C&(1F&8ENBjz^fjwO|u_8;Z{Yob_c3h{iLv3{{eY!$&& zjjb+h4Rmcw8c$kk7q(GsV;O6Pz3;B+9+m84*sc->SW*UpgJMI_;jxkE-jC%a`?#l6l;1Q7+)3!J7CrzRXz{y&!-O9pbU&d73hlY?AiU(bA%e@W zL^1`=vM}Zqj&@adB zjN4Tq%IXB>ZNVKOFxE`tkTycS+qEu5ElfbbCv*1319qhs1~Cg~f*puD8&A zRlJ`dy?n&I(jFd0aujEuvMmzc90g$m*) zN<1~bNT6crPm^|T{PPm6h+iquDrr|s>v`fe_-h5X3B6gM9YT9j@Rvry-&KL#jlV~7 zuUle!!TT)!0fFB|9}(!NCC1-L<9+SLus(@D8~?4~eu@7z{!bOXt`P0Uf^RAOk3@b0 zITsvQX<+4nwFcG(*G1f)1_K*P+-P7kiDI#FDg|`}9y%};Jw~t@GL|K+Cog{0rkL>q z^9JTCuRMht%~X*xf##zZD6V4aWg@bC;HtZ%SOfPWvL4wuaFbVxeFNVV{#yeN417;U zjt=~I;Bl4elYyU0{GH<5cR!DRS#eiDwn2Owg1A4vAgAzLgQ^Kz1AUJ`W{QTOMo3fS z0m(irEq!p%6N6ggwN;GFR(nb@oj{!jb(Ma=pg>SJq!$t@*hqBLp#JEXL9v4IJjwH)y_!Ee5Sro|$sB@YW34;Kgo~-qt~{ z2((T5+XsE%mCnrJFw7Cbek}Acp}!RRw9xbvY3U<_&JOx+(0Tj|gMJ+JhvNDDpujhT zwhuOQb_i{v|9)J={6ySe=qi@9)dp7|TtoRaL3Nbpol{--1|rtTE5*HD9{)bT;FgMM zJ-D5~?a>`1+jVfDinG=exVvJ42Zw>fmG6FrNc`T4ivkT$o|z&>d2xetz~iO=tm57I zJcmEk!WBwfG`JL0Hh9+H`PhZX3K?-L)Z%T%&}>3Nr#&F#k4$#p{(2D!j0S@Pt^2s#Y;*U zf;SWymXMKKQTISAZVCmQxk_Lrb%q(SpG>*9GRFYBiX{{2t6L1 zpIC%0O`Ith&o#3W=O-?g%xbTQnPLshrvI>>Yd!X5Qf#)QdL?mN;&$Qh5&CuXK1-aw zkN1&ej$)4`9#`>C1Uez~7m9V?>lFTl#2>uaABE?e_}$Kfp|Xt7OV?wpetEeO?|2)S5#pEaB>2EV)9VQ4#N%?I88F?*ijPm?LKIX@G^wXN*=3X*~vKyYvNOY zKcNCgkFqeu;As}05ixl>{tRSh@+|ah6`do{0-@KSwh|)h}&~(yTx;XjUkmROnJ(xg01EitBzM=NKMJr!q)bRyRWVTS6A@&$!HsC+hPNT zbd#Q$y1NDU0Qa-_?0SS3J!I&RVUkY~c9hT=k}H2^evdaK7dB5s3S@i&cCy6J3i}+o zaLBYF(}&EIyqU)wiRWS$3cN_@#gczP+BL#%l-|q2?iKoN$$cp7ks%*pk4nz-l*cUo zaSJx%Cxrj$kk7pMFNJp+eP+nl0)HdpXQk!)j3MU)K0o9~>`z0k47sXezk+^4e1@9$ zun%<%tt^n~nV;%IYYD%e&<%z*^oll;Uelq?ymiRQwsxRHOtcmFx^@XG&Wpt>=ETht5^Zf}x8fUMB5}*o{LssT7-s zZU^rY{_8_8W3M1rh40DHw7*!GUoDu^Vd?!T?Tw)~hyE?_zi8($Yc9+P_&U-AxmU#= zQm8!jBXBK{mLk?(=%<8c9V2akwB=X1QSh){A`)659xnYzY5S^pyh7!94f5g!OD{p# zWUtsz;SEC%7bsmuM@q}+4jMBoV_2qSvan+%&cTjHo|b<36Fg&KCR^}x7VJ(vRWU^h z%}|ID--65YH&GdpB_g^My&74EY!J-GVVi{YT(M=?)?u%}Z1ZB-3E}S;_S&$wuXH&5P%oi-rwqjo zOBtS$CgbJz7-3;X3Y>w?M6!^alyNEJ1)G~PC8bax_PElP=fVgexEV4s6I+%t7yUdk zKV@^u4jD18*`@Gq(5oqXQeKzLn<`?aJCt%*`o~i~5$MyD&r`k-=u5AZX6iGF`7z}u ziLXohSIP|)HPgC3H&gx=>@A^hqn)Ylh%41!B2QW)wGvF_)EelTNUhY`Dn*^tmI}Mm zKc4zTYAeaLO?^^D+bQHu*8%^j3LGPdU^-j)E~&kg7a~xY^dp6hN{vx*ch2$niAajz z(^E$ZI|@BIbxdl8@Z2dg70!}qY-*0;=>4gA7SFt90{%0SnqJ#|Ow82Z=F(OK*zfv>8VC#PTj!?+{A zrv6FfR;oUn-3CGn6WVj#J;NIff7FX{N7@c=C)xJcj>9_%ud~oyWyF(*)dt8|;P7ss zPllgBe=4|>GU7@78UAT6?yU5#N^7KICq)lSs!(u*^m{A5k3#)GQE3Cv(P=S~jg>Y|*nvV1Mkh(W{I1Dq!~eta z&AZ@6R)~zM;E%x{FSuNEoJ{Z%OWLX^#kd6nzHyPO|R2f5yA)#dz+1wF3J~+HYxp zq+OTnjkMdKJC-!QBRJ(p7(<2j8&OkOMoMWtIh(f5h`N%kFKknl=D`syM?5aQE+e{* z2mp6e(R@$=GI7My=x0Vu8ZlYLri_>>ap8!$5-n6wPF}%FMl40Ik?dMa)cSNLeo@3; zvZPoK-Y{aLWHw>9jMyr@ZNlzE?~;r)zukh{BlPPP;&0#|uE2dL{39cdjyRzrp9=IH z`kdm*?{OaP!ib;Hmyn+;q_~a$&j_D%-*nFvdU_RwtEN{|nA);nGj)^nX6en-?@hli z{XrRdIQs`E&>7&pYil3N1N#M!p&!rcp7b)I+Qu9-sUXnf?c7`P~SK{Xt zw;+9C`l9ru!e5@gLh>uq*GTlDO6ktkTfbBxx~_u1K7Aw1Cds~>z8UmNg*4tdmV4XM zcckwm?QUd`<(fAIe#^p`*Su4~=RCy1ya#??`iCt%zxcyDlK!#cjw!@yI{gIR=YshH zeLDRc89gg4qmV@3E5>}9bILoPensJ{0$oF27wGTwTPkK=WsEen`KdIrvcgqHRs~l> z>PoJmin&uii2tPE+M}OBIw4&J<4zH%aF9aX1?nMmPjoL836&^P*uEqCj~p;EW@Id0 z91=frpx}oHZRS4=l!^>jjQg(MI*sVak)zPrGF=XKyu{vV@9yP}%o{mDrl06_-Bi4p zBWHPW?mSkHd|~8EUi>;QZ`;W27XMZ79%MgqVC1{#gNXa{kwhmIWAdNleW94s0(~>` z?8xsVcL945`E}&)g84)8?mX?Im}^E=LVG^d6z(EXptM0M;!fLL`aOgVMu(0H7dR5# z8|i~Yj~XaAPyU0wyabDv3LZWx!@_v3aofC6Gi9u7)Dnr7-Zk|y!LAs!61%EGinYSu ziQYZx)lsjFdL6V^aQjB>7uJ2Z0|Fl$bx3g^33Ocf-cNVxfAC*P{(E81OYaw9e;xHZ z_S&fHlD&n!J<2xPJ7=rsJGv6l$`w*n5q>pvbs4FRtt)Z8(e)*2E^PodaCEoPy+(%! zrZ2jmj9Ks2UvLA^(a1oVB2n6;(a93IuNg9WsPu=8P8ppxdW7`yM^BJw(&)*cDWjhi zei3>aGF^DH(Q`)69lad;;^>zIXML7+Fx!!xDza{i+FF9bH2pehV?Cu|(GA;iM4u0pwxi(J`%6nhs++DeSqT z^O!D@3&3_8(+eFkCKMfs^cgd6%zUipv)F?9j(f~9;ji#wY1v->8ZYmqG3&-`fY~V6 zO)B=XLhgHQRsL>;URB6Uv&YLbnY}Rk$DA1RX@$s1i~l+JJLH_;F3QN|F;^t|U0Qzo zrO>T0cgEN<%sZGLC&;BdH|Nony!gt(tLnwMQ`X362;0~aX##GR(NZvvXSBk$L7o&o zr@R>*GM)l=MFKLqNj3=EJtH_HMEahmFl{(oKfy<-Xn%>KrH#uN2pW_zSfwzpOb}jT zMv}0}LJzg17$$Iv(5Z?ao{=W-2+54Zj?Nf^&dA8h$i|M($d$1?Y<@;T#zbr(QjC-$ z?#~Q`n7J(2jFwgKGK6V+Uxb@b*Zq z{0{s6!@OZ(Zh>!S+%cI<_ceBDP0yjQOCmpED=D6_Q{t+bH9(J8BJTX$`U%Ci0<}?| z8Evn;j-WuKn_z+!-!n5r;84XxNYn@059zNW0|bi6jFrq_X%mG_&K#0CG&3EXfn;W8 z$tb7F0*w>8AajD`Ct?ec(#+|SvA&fX&&ix8V)Ips1q!)SEX-W&#VnEDQta}~6)Lt$ zq1Bl$Wo{PU7RhbR+zEPBc&`inri}1idFK0>N0evY^CP?yf;ox)0y!l-_w%swmEPBx z-+1w!_}%SU(w-CPFUza0WBSPqX;bvt|l!PS!kO7oeBQ_@=B~0_{e>n)RAwUzc_-_T8+5S%;+mVb<}i z6Iownosqu#UVIBJ{qM8RNpxP=AJLa2!>NEm=5?2)cNP1)SA>;E*0rp^1a|{{vqF@y zOfmmt*~Yq`!UyYz7}DotP$4r#L+L%B*asDI=V0oG;2uRDANvHl-PrabO^2~v#`YK+ zJhrFsJgIwGyby4x^!o|hU+4tMX<9O9i1Iiska)DTV^k~yG#<%QjOUJ=J4tTR*ePR+ z!L!CLmCUlcq%ObCM9Wo*6=PQ`>`t?0>_*AFQX#_n(ZcKm@0R{PVc!w@#MqOPwchhv zxF5$}N8b?9+vqz2SyQ#hHoeD$ZYi`iYU0+CeG1zJ2}FXjL$Z^xLy`aMlPcoFvqxo* zRw*+;nabmvrtGoV+1cY@as`{8JrO%arkF15454Rc&&r+yS|nqhJ1@;%W?@!juTtJ> zh4{C66<(u|Cx?o5ZT5@VFNsu}gns!yS8P$tF3@h}xpR6|_C&hY>JEy$EM|s$QdR4(UKh_ZHBN}(xa{A6o4n>JS~`Kgr20L<fgC!GgiFi`DZG?LR6TcYOmx5nL;%)ge1ZM+$?qa6b2LYrJoiE1f^Uqpi& zjDKi+`|%ydca(e=74JGeP+>EN@=rGl-)npy;q|j{%i-gjpKJH)_RQ_?;O8t{BE!KYhGUY z6?+8#`uM#vzHj^iOUiczJ~;k;$(_QU8UM8WnBfTgjC6`sW?u{1g@9cKyi&hO>^(fy&wBXZVSnG5jG$|_a*oxehxtmm~mj&8_-j3|beN#sEOUuewAt;E)vxEubiLb~(#7jl0<|CD=4#;&L|*K%*<-jv?orp>eF z>5J#EFqH+aWnpStaGkumdCl^gTbS~^9)@ipBah{^1hvjP?+-h zjzZu;d4uy3^OEwCg*OB})RM-1_hES>^G3l=$eSo)lZ1XwrJI*GKW|muCgE?++m`os z-aFv^!atCA6#Fr9GVgQ2l)upz6?{+RqTny7=w*ejfUf5KqWnK3`cv5JdH?45=X-J~ zw}#*<%SaVVifZ}QrB_SZy4djvpOLJY z)1>^#!h04y)xsC%PZ!<{^jv|S7ka+X3xsCnoWE8gGp~){mzBR2^a`>a*&*3I`FlZc zO3%E8zZ{p|yZN8xf1@I21^Q0;X3Fn{cTVV^^DhhgtI)sY|DJzcpqu&s2utz;^BNo4 zr@$$&>AOEQ3ThVAfxAcW^@MIv&`8+E1@{X30Qw<;%xfMIs71l!1y2;TQmo9*%d{zI zTkxb;iVj|0dE(9mT?)F&Shs@i1;OB6(htFgN*r0xyP%K2v6357u0uA6=*EIg1ux$3;(jjpMd5!@M*+aLbVu$ZBLGvSq?66SiTuBjumn z6JC@4o(X%sB5zH2Tlnvw_fPo1E9Sob@PD`uy_h4)`&gm!JO3A*Ak|6alt_JAU2_I> zVZu+sza;d}LSGh|{ndouK-Z+lcs0>yqId50iH?a*#Z{hIZDMuhm8Yz&xHAv`fCzw7-1q+RHw6J=iu~ ze@1f|oqha`zCMPr0SWUpjOD(Sj1*fX;{l(_Mi*OUBOCb)`NCGkD6`ctg0<(3xmvOI zn|+#5$ER3Zs&8{ueT-p++UH{mpM1RL_*Z$NT+9KqFk5ijycWJ-dT-tD7 zm*#X<(mvCwX!ju{w(5K*`Rg@p zx}KsL`tv@9{;6*zJw~gdAJeMpwY1rKJ)U`xk4t;Q?yo)RQ$>5s=FsQ)I`zMtF8x#T z2zB`D{WV?BCy!TbhTg=dlD^odvVM=PvcB0?MW3Qo*V}4y^?p3#Wm}Q=lP$MEg`RBD5+-AKQGR8Kp2*E75k@?0S@~NS|YyrhV*FWK7nI zj5Ri=_MO9}`T01F_jvB7eP{A-UfT7qdG~of4*hFim;O5Mzt28hZ^->x+8stMo6~5o zl^F4kV(n*#(>UdvW_<25UB6|ks`cjDH?$J{eqV<^&Uc1>*0;#G?Nh9ecRGzHZ7w6+ zHk~$5Vg$Pijls4O<1611<9_OGDCPNzZI0GS^EaCK&eYe@7XEe=YFB*BbeCZgk{b7yCGjdo+jf6wmIfIgLDIHnNBNJcz_n77Lv&qpQo$*kJQF9wqM( z+T{%&-Iz~4AvVKUr5VN@@g zGbZ}XGn#95qciVN&*{`I`Z~47j#4AR*KP!IU9!z#9Ot>RY%`2Bn_Ua1?sriS*J!J> z7wtVCT`TgLru+C7X{EHOTJZIeOxp2sUq9^#Z7kNuU;Ew1(7O6m(xzyYw5zttT3f9$ z?WU^MSes3)7iu3+-tpAcPd2CC$>!1@rmjA5PS^jSe(KXVqMc5Cg4193rClwhexId1 zMQfGy!&;d>ka~PYD>a(&tlMlw#$4XvJFQfsEz&;xv{!s)Xt}hRby|^rljq6MiuGcr zAJ6Zvo#eS5_N`32nyZEIUhzEpS^FF#ig#b@TWqW$-M{2`+S4uClan$|rF|@P78_qUi?w5Rm;R>BPj7>~Or|(qK;Cin{fJDy0b`YLL2;q_OgIB_XzE*qgF{su2yC=<(|74 zeI6#y0P1ToZDB6`vYzjB?GWQcJz^g+3f{xLmoWC-cFxsX@oejDGd1em=+1RrkzC3l z)8R*5_-kW$$47X#{%N(e_eiOI$_Taoy zlW)IqlkmKBd|^#+3oIrL{coQ^*mUu5F~O^T=xt zl0z8|x6ResP(E)UE$I(B>0Y7@eo4O>!u_}V*y*p^cyqZK2I1Ij8BZdA9o)>z?=V zGv2e!Gh!%%!?t4mXQxYhgtC}UeZ)`}11OdKnxWV`Wn^G>lo&H)Yp26ws#~9?Nk7mvr$D9>po6X#57vq_3H?&#Y zYXWV=M&0&7nlkrYp?&Du^UT79S_fa3@fhv2F=KN(>hF|~L(Aoz|KMI{kR_DWVxDU= zV@DkQBHy<}3jsew+Z@0c^8^ycSeZh*c*0hR`Mxs!qYCYDF1sv;Hi>e$%(MRHJ6+GG zUTf1{{@^~9d>839%IAQCxk8&|G_}ppGHj*#QQE{Ao@pNaJCNtP&b;8F-!|7O8|?y>Lw$@y-a=a1{Ito)VV)J>)v?aFKr1fN~m&Ohx`gI`Cd^A@9*Q>hXRsq85xHgi_{E(zo zrJYpO)>F<8X!EsX=HwuUu6;nC^kFqrhw-M2J{ZlIeAYQ#8%KYu#`C{I+Z@H*8b>)@ zXWV*|_aDX>r!js#&766NIdeAS*lO$`+Eld7q505mj!{QW#*W8nJB5rfBavL*V=wi7 z2J!K&Mj6%MIcsQ}ke9W^)V;sg2Lsy)NIwx+$jM!Ty-8?44! zbs5h&&-OfPCI{`?$^Sut-pM%eJ#F}Vt{=*CZYGBj)c+fdUF{e*Tbg-NHm#}G$;eFV zu`Bf%LfuW!<}si88!IU5sf?W=)YFHoI~tIm5BY1f|3<74K4-kYLw!Zk&LYX*hCGXW zM|;XezDI5$Te;Vpl<~*h_jB$U$o=e;^N-9SJ1Cdwlu0IX5s9a4wmbc(cYoG8y73Zi z{xr|f%4eGP7-eKICOpV`HP2bB&tyG*knyagPm#Wx^?fJS_Z?VoHrHmewkp*IG3R!s z90J)FRHCeJP-Z&M{xIWLBi5{Oj61(F*X`%NF|@NZZ7zEN*09vgv%G6H#y}f=(ubN( zpe;SXI^-PpTZJrPozs^!!C6}+eGTj4)~vB_GPbkk)8Arj4q_}SMQ-}|>yu~$eHoum zB3Y~<)^Lp<>z}GxHN6Y#=}wH>4Ym2qN41zMON^)OPNO!@^tat*jAUHMa#S*&Wp0n9 z{p{oU9z=H9{fwt=evDUDjPcq6qan|@*6z@B`gwD69Hy@Cr`!{LW@(Rc-NWQp&v%Bg ziLx-;PZV`lKwX(*=W@oJAofp}8Iz8a=c}~&bo$pQ+WbYz^Eq2pW4Jco2xpu;K|7gE z8|g<|e}J}r(C(+d&UEF=4c2Pg9)AdQtQhgwEKq~Y8N3LS+G2$DUqi?dFw=>rsVUDdu z**rqo%;Vi-SUaC4{e$!)=02?r4to`!JU_)oC|gNY^L5nr?2Mn&UfHGpr16SK6`>2@QyQ>&oiipv5YmJQyxd?3v*mf zJ(qX+0{P7`Q#W|d$7rknQm$#{evi7ZWuMD_x=853VP}s~taYaSbagmsGcNrJ>d2Qh)i~;41pPW4*~9*M z1O0R`{j>+`*iTrm&SBkW@XSAIi|t65WbWG;G@a?*Wg84hrmvxxD$kny96 z#yXVwzfk+a*TK4p@sGT=@GNb8OZ2tW-}guZyHi``aA{lF8=ql~nL>YG&pPZW&Nber zO)WxZ@SKxvi*!~#nw@sqmoaS^GJ|m{mb!Y|XQuWw?{BU>8gj2aX4`N&wG!3}?dkik zAU`k{Y-L>Dgp_ejJ>F*|vX4DkSNg;)#*0kG=VP{MhPgiI#roPwzmIcP($~?aM=%$e zb678XiT0-5u0KkdyvMt+*U?kiZ<_t%1m_sjs9y*3MKXLo?c)jh@_g>`7S*p$@u&p63AGQiob$&z@xN@XIY!R;FxCoOy7Kl z`maPkc*b|SF^l}w!_emF}Qm14(C3_+J4&5G1l^jeeHTNeQq4}+?jgb!h8AA4m&bNy}_RSB4wG+Jhq1N-Qb#L z1hA$%KwFq-pKfg8{3V`iy11rmyEzA1%i4b^eWWwbNqK17i0wd5@eX@jg?b_5LA1+Z zyh#0Tq`#VbvIos}PntfAo&C7xH6)U?@VCf8m%p}y_F$e{)YE2Y_fwAS#hFt}7zYcD zkF*kP75lA=w1;A@TTLBgFg7${zI&fCZs9YNanPw}vWKtDd(Nc2q*3p;Y5V)=cd?Ys zN3Ih6lB-y&!u%6WzTeVsQh2^^X}=NFS2F974}51EtLf`4*l#vt3|h^2I*vZGnCCyl zvk#zs4Wqx_N4pK?S)Hs>e36>0qcgNwS~KS5v9ys~+CzKtTu9z;*vdF#DrPO_(vQ#v zAEkaKa8|X3a%fJT=K8-OQii-iTYQwWkCXJ>-t>ce$oo0gT!Ga8pQNwO81)?O;uF?Z z*BGa3Q~o8?QEz)8yso`Q`?yM*_>1?ZpX;A;zh_w6eo4Duz#Lu6x2paa<6?|fOV7|2 za^B%D_WPr_u7K;7BMJ161fN-Y413z28P6GeIYV=B2Ie%T@NT_m=Qnw`8?5*HGne&c zY+FegZ{dEgy8QKfnYX_3siM~){|Cu;nJ@F8)4?92O#6$n-O1X!HGQ^;!$Es4<*cAk z@6Whmb5=2uSqFwv*1IX^>xheY9!i_~!dZp$C8vIbdi;`mRpz~(XPsta?tPm%@h#?% zmYlhKPMv4b*xcHJ#0YEA%U!wb|IDFV_APbO#5j}|4d_#){y@A zFMZR=`e{7RGMQ)bC-0NAzlN;QuhJKLk^e(H?^n)J);Go48CRk97GoXdU@V|~<{{s3 z?}5yxAJ9fGBGJD7MuD%+S*Brp!hOHzzFTP*FOmO4>y38X^&Jmk1F65DZ6Y@4?vzdM~gnpAs|2@Wd`2+1_0PU8uLj7;fB5zTyD`}w* zGnSum_-nn)wIve3`CBr5U?%l7lD6>)YdFqHXfyu$aO!S5YYo!spRu01&Dg~pqQAp@ zTAA@G#WtUHbBS?*XF0$#6x(Z32Q~Hj)U`kNil!|-;3(FDI6pj3{#`hmUd$Xw|I?C~ zANM+@YvHT~fA=ZW*&7(Clvx~No_Ccw{h2q}Kd?UDNFB7KE}o(uo}eB$_tD}UcB36- z*?@BVnlgNszJHT+IY?vMY_2Wj%w1>C;nEMW9+-s$^G*wSw*kD@5Z)<__R@*9{6gMs zBW-j&XAWh|BjM~FqFAFep%2YuJ^Ci)`6uh}6O5JS{;{U527TPA&!%5>C;weYZ^qrf z5EpH69`~6}zbT@;*tzHrbB}|zYMi;(;QYR}UPY^;SJD>ICn|An<s^pu{!6{A8_w<`pa-^ zDs6Tu{rVhj-mJ$KjNOOH^EhjefsA*5u{Z4KTV3nMJn}pFzsOlkSMckc**9lgN~0bd zlSgIh=_LEXkEzS5)K4LMvU8+s&ig)XuAO-1+LRgR+?0U9sRxqeePrWdJ^qwjjbBbRgHaT4ZZ`YDa57KGVJWjYBNS{qt2hEP5i)I zN<}R{3v7J0@_X%Wu&u?S;{y*hW2{H$vnw^B8~4d(rK3u*=Dl- zu^Ub3b6cqI1B^=_@?FDD@_m?h8O_+RpEHH^w2^hR_yLUl9Vq8hyhAKwdl`MH3iY<0 z{=|16^s`EOefrYl^rbnB5$oCebf;amWNdoGSz`BJhZLFPoFwbA*8T(;}QT~&7zX7zLd#Ka;thc5!w?0Vwn!(y= zA8n-$bA3MhiYk2PY@7>BwsX4dejsSV?ucJVwl z*bo2ASaFp1Iz(R^YMaad!P=$uFbSYqwgaZky}V_ z@=r%TpnluaW;-K4A`!G*_U)V@>723XT4UlfdB0jb*AvJw8HJD1NpSU zJlgFN?!S<+cO`4Ltv=IO<4@PevX(o*+V3oVs4-)QxkjEy8C0QPZR4F^K}zG2kOzs%8toCe>|%;fB{ zM4RH`jE`|5lsWnkW5sXO*HGr4I-H{fFqVD7TBQZ;$d~bIpUbWlk++}kEWT4JGB~ee z+$rPSrN}tN{a&Si9c6qy!+qYQzh8Au*Gs8m7jyec+V&%)KZ?|#4bS6TdnRYC5A#mu zo+ynuW(U_d!+uWRC}ynKL4RAuxHq0LgR@cA#+C7F=?Uy(?X0Tr=UsbKHW%!R_zuF( z`L3Ps8Xfu&_F1L$@7jzfQ&>aV_)ay=S!m=CuSVJTU>%*~oXgst??dT}Z!lhta86^- zZP(xC+1GJKU*a>Dd^lsJ9@j7?1X727ND`;P_pmaq&i!h0ua_7b1~S*rW?uh}Gnet~ z*T!)D6vpbElwBLvC!F1Biz&Z*IQLpYefD6@KAG|<vuh^=xhhM~b zn?tPmTG2;;V@=bWa~r;M(pI~QSikvk=EvHOy&&@;<3us15tub@`m%Qg4)}H@RCyS|%HjIPy*z4&$^GfO@p0!X@+TndZrR)do=J$2R7u08E z%KJL?nZla18tsfTU1Klv-FK{qMzZF=z`GXF@1JH4{fs&=zgOAC7}=IRN}!$Z?%AXL z=F9$ua(k3#zrc8Cey98}W1+bhdXx3glZ-XFtSc{bud2=&Mmpo;e#XyJ^qDgHXaeWN zRhZvSvA27LHnW+$cDf3UEj|kjKiY94#(&PF`A*cO@1@N4u|BNF9JQ72ea&-`rp_Yc zNuFa0=d^ap`8wO%UPt+ z!mb-T=(Fc3Q@-0^k642}_I%D>U5w>?f6W@>arVocSL-XO%f}sltgrm^o!q;OXE;wi zKFdA7;od#4UD%rqI@^N5@hZr+J=X%s-ncI|uXOAMAr-83SgqRx#Jn^PG12yo>L4{3tu-a@t@N z<=Be$_akHCXxh+^tOHlF&vNkWC3amOL*IIb^OR1U9UY)1L-4wQZBR2 zy#wv;D$n{0d9M+#`epjxlyp& znaA&L*dH>s+(UVNXfNis3{LGO=J`!LZ!LQfZL>swi23j~}=Ko6Ur7H7XcA24557)V;FV8xa@#0P1p_u&InRURN8bTdZqpz6fwv~8pep92h zp&oLPhRjcoaL$^^JQ&LyxRt%yYRa%9W5`U}RzCMV<>SY1D*V|y`s)F-y|$c7U1n^U zNIPCn8y?Rd^Fy;8vzMyJKD;gR0^cb-&f2q$wt#-(GzyTXkyPF#+fF}r_;DsP!{m~f8 zFWafJU!7t89!hu7Zk+V_V|;(sif22<_hqe^Bfp`{7cy6D<$jmgTLjT2Mld#Aq1{EX z*W&Eh=)`xS8IQ>cXq8tW8(ZN?c)HLabPiE7{#@%s(CKG#;tS-yiaa+fy9RbmWsRnp#}z9+GtFxLi; zPHL zMFYN5sK)p{nYw-2QAm5X8~*gsDbyX`g&E({Mtm7}zGBXrPkw{wgHO{Q>AQS)=g*n0 zp>3eQr%-1Pz)f{brw`ltPR?aC^C_YHOF54+Xs<5jKK4eOpR%{&Y}DVlhco=etaH9+ zUr~!bvk8f$-+aW}I)rnECn#rges05g$eWzc7Bdefa+a`$I=tUitUbWlqYwR~59Q}; z=N!N>gFfakYOt3Y%O2!8>e!q|-=J;3OFOB}JH*mw#?a1h(eAfVZ#LSyopabs+VEs* z?LAg!{pmj~7_$mkpRT5U!+7qcj%mz`4t|5>WNq!z;vLhqWZHH$+J6V0hu^nppYwc= z*o(B=>{0hJmTls_UuJ*(GI4&_##zX8%82h*$m0#WQ|s(T>y2J&6;Eb?KPCK zZUB4xugvprt~2+7Q@GbNtb^`%7Hc-n@w4f#&(VK2GUj|ppDtq#NZ`G1Gmc!KobRP< zAK<=))bAB!4SO>4`nt6H13WvwkJI>l9AnuGjo-(yu5&P^JLy+W*6dDt0Kf0ydHJrC zv5&cta^&}M8o!Uz_g3Pw4vIqUJ=(mvj253+-CB$Bpz zjrXZaKls77l<#_{u{N5)Z?5>A2Jak+tl+&rW_??mb$%!01k%q{YK-H0Uxz>E5&ry+ zN9VT)h7pV`X0N!5{n;GW50A4SWgMi9IyftHX#6HmlknUKXFPax#Y6EpO4a64)Yl!$dp$1?s`7uqMi>MCx4J9@Nv#67e8&GgU2U_^NLTm-U(#c zRpfreyKc=6c@&>M?Dt{glBcrHWIb~1N1u129M{qOgT?K|;_`EwIv<#}1f~tPwvo)> zGu_ON{h!~Bc1m9=-tT8;@v&bX)CQZ>MhCPdv-p1Zp=V)dSMYhq;h&51UcNyt_v$%( zsd>fTV}4>fSp}oUZ_MEc8_AJu%i(0&3V3=GcE)>nU=ud+1LA;#+0Sw!O`l*=+MUEa z%O~>gi;;Ufu`}A_GuOfsPs24$vA*NvHyS>F274L~Os=R%V8EJj{WHmp*X;iv{QrH~ zd2c(D(~F+uWb0Yke(%p`fdRv#c>)90)D<5&qmA$=?3cVnW}P|A75t?8J4`NdA?x_b z=S3{rOTPadyJ`or<11%8KRb9=af@@w9ef=+eg9DMXC|5Tn6)0{Gha?SlMnIM&TNmH zJpn$-eC6{c(W z_vU2$GL`>&IiGJ{wnmQ6VtnNt^c{YCj6R=$u0=1ROWl?A*;G^5*}Z&?t?2r5eBBo| z`}+a?%Yj3@GO8|49MTK2fd-@C_2)(x8sgGaueCN^-7JzAa~qYs=_J-qL~SMi<^ z-x+DCv`FB?=-*1RI@$CpoAN;NdlP%jP7F2rp^_D0DF6CHKJH=mhJT)Xk+q6ywk6Bh z$GO=QyZEmmV*fAkrM~3blU?Q9*7QEUKb_pT-5xx}2OVag;lYxH`M_{fTbw5=7hTCA^i7N}UC*{1Oots{Pvy*EJ9@%YJU5Q*l{vRh>C||i?H@nB#a*n( zw^rbSLIR(az-N*1rTA)@z-J{p^N;WLS?jnH8&&l+J|-dWzrm$}Ma zSP5Sj-tq5gM|j?zjIJgUIRp8?a5f%Iox?ut zkbkm29%i#Yi^PP);amBy6XZ_-Aw21 zLndrP-`_!wwd0>j=wA2kPq?6!+`WnJ+$cKfSL=TgPhH{;%wx|M^X~WKr_GB-vUWCA zOr(|kX%mAV?1m4mvras(Fig&6Gz#U-S-<`a*nqcLVh0Q zxiC-kKyPv#o`7pgmUpgrDS>H{2W=zUrY2j_5#QR&!`akt;ORy1_b=Y%c{a^T-fQ!` zE;rekOrzt^BP+y7#C_xref|aR*&h6YiqDzD_LfIVei9d1)bp>$Kg;=@acLvm%l`Yz z`3Gk(;;hFF{~g=Z3HB_rI`H+<$LbonmUb_hC`-doE0UX@cg(tY{N z9v$p6V0PJ&a-Jz&o%f3Q*Xf0>CjRhG-#>w^@upZoO{_pXq1=-_vxm>Qz*--o18d?J zhlzVG;J$t8-YrIcUS(|u(0$rih;uf|&$AR3QT&juINo`T@vfuUs{4@%ljU@G&*h!1 zDf;_Q=N;iQJa(|UjgB`^EC9qCM1p=4swCZ97n zS(4qgAbwvG7mud%KXC@LvjB^ohb!&Zdd?-yd%_QNRfp$J^G^MA^xoo|>^E|#s@|hN z>~HNY_<46Rggrd}_acWO&67pZvfhDg6o;rLe|fIBhImt(JmC~N;T$pM2Kn1a=A@1C zg}f2A72|~$O5lZ(PdsxTdXFzx?j%O?Bz^XiJvued%Cr1zQM|T4ANUz}XLkgTQr=>J z=kdL1{%#)naeHU{KHiD;>v{M;VwQG8n~51*%h&rS83cn6E+l`p8Z?!C(3!kNU+so( zNb%@vgo-%O8F}7}Da%ptkBYDa9kvyD!)^|%cutAF;xDdFo^9%R>Id*#$#?Q zs_tD?4zngVQ*$qC{Et>~xORE9p{&h5I1@r{R3Y< zOLr~n{nqe4;!@#Pw3vL83|e?b&Ur_6?q_7l7(YMO_ijV8e9k!M1OLPxVlP@F{F9o3 z%=20z&RagUC@(71@i>!}22GJ`F3QK!9&!49mUx|wQY0rAd70VE`O`{px5*Omb@{=K zVN2)3LqBDc)UHgGqsqiHvjh$*=9m*WDEaP?z(MgrOYsx64fqfailsYVempB57Wep) z?s-kTBgQS@p^^s*m>e}ru|{oYcFk>M{~vtWd7SNC)-ld|kK^NC$`2P~NYod|$7gIL zIVJwnx9<0g^1i?G2miz$2a|`B?D6IP{T*L?e3mu+Q5dNNM#?()0OZ7c?8t~0o``Rk zEBe^t4e~rKGdkc<`ssTzU|(yRO$NP9XKe2bXZiUU_RbF8Wf6QkhupZEj@TTv;_(6Y zE5_OOM<@C32kDIc>8?Z3(`ZM!dpkPmB+rDMYGQ?8rxMsHwk*sa{~K<~{suCE4{9Ib zrsNrF$yQ`CtW*LkmB31gjZ98PkX4_H8{UlvS4tajIz@R7S+Ipz*q_ekHuCM*EO!sO z>G96werLQmTjCz;T|605E=!NaxWkp`95IVbT;f;n#;=u!Y*V{65ih_t*yGEr84e0w zqEYUf73CYAGt+$z-W7&i&B1i`OAkDKBY81xz)z|(^PE^qcLTd@puIZI+UE8*u+?H; zC5&@fo@bB##A8>I2{2vB3u(Rlm_5@UZ7rX*Mm9d;?#sK_oztx4DV*Br90tpYf9l;g z;_Kc{mWlZ%@J|W+lYOWr8}W^H@LrSA`qq1uxZ!GeYbAM-J5W5k{jA6R5rZMC=*{Jv z*+&BpES|Ec8AVuQp(?dKczHdsgMIZNS_h!vRb^G_K#Oq_FgIe#)8 zJ}*sRq38{~fzM!}#8=@c@h&Ws*au(Tef*nsuAg>toO^q-yZK7i z0~b49ol7A;(NfM$CjK;VFh6my&mPRDYNuz0$q&weW9N600TE*~$zH=s@n_TIW%n7r zDS>ZF&gRp>H{tSdpexF_-Zl#F1D_^d&mdzfeLPLB`A zD`a=MTTvl%d&|FBH(XQ#7sWm=lDD#!1SU#Ms6zI^v$K(4qTt!o9#|_(RB|Qzbs0F3 zhWCD_XopRj>>N@)N(SRBX2Q3mh1AG(!J>4@$*X5#XFWtG{hyy4P_R?^TT?y%QS_AO zE`s(z$BIe3=T@!4W}k7nQVr}u%Fi8N4${d zY;^G_e71o5bqPOaed~f_Qk%dJ@{Zz5$@sh_*~>dd+zLEX0?(v=qcwqNYUadt@{BKi z<_vrvbHQo=)CN?_4zl8AJUmO8I%Nr;50}Kt3F5`@c>{)!DeYuTdpQGc#%(WGcmJxM~5%U*f= zMV!%0cYQJY^cR`+mm1pRNtrdh^LJ=&_QzA+dqeh4#H#(smf75Uwfnjz+D+{EVmX%e z(MYu$e}l=NM6cer|Io3HrbnbXZV3n9BXdoxGRV8l^ziLSUt_yP$9e{=5dfn!XD((w&db$ z`?g@7`|k!!WGZ&o=lwgA6WHB@y%!8q0>h*(D^FmU5^{+RTTNh?)KRo1FigC_!F-o? zcW`KvV3=^tT(Lr39Wk6GJ7XXB=_Y5%KIcoM&6?wX7wV+(#W?b7G5mD0XYM{wwL1T5 zm^=I&yY34-s=m1VkF%VN-*-ykg4wxk&S6!2+Ukz1M!!EuPprm%uem21vYFJSCdXO# zZ{FoJzQ)IS6@GLQ{nrI!*imjyCSEN5{sQ0QM0^If#P>`2R&-k0g)bU-wNjoH^%39q zL2m@F1j|#n;}v#SZ*r^sJsY1!-0Pb16PsGI+DLX?QO-yA4sn;{?ZhF1*huL<_p(bm zk`MSFhqB%G@otxp`7iqZ`fSiI;7z{uy*Ip%ntObmCGbfJd{Q!zzp@Vg-_-tpHDHD~ zS*l*E7Y?}LPImC^)8tdXJD+pvBYW;b52IOynoF|k9J*izIv-txE=HH5>(Q;~Ui6{& zigf^Ypu5oB=w9?+bU%6oJ%OG=PopUFobKk?Q5i2Y`dt75@bpIIe8*%xRQ`X71%J&B@BeHuN3A|~oN^gPnLzww?K=7zeS^M5bI^C_d-Nmv z3H^*B9_d%~8;bApmssf=?#P?yE%Y{e2fc^hM<1Yw*@_sYkI^USQ}h}79DRYlL|>t= z(KqN@GzWc$zDGYGvZjfr{MpxE(Qil$Qw?~l94uYyjvnof9)pfW|3t^56VOTMWONGp z7djQ4hE8{%=b-P<_vi=oGx`Pnihe`Cqd(A}=r1?+RCJoVE4E+W&JO)F?e7TRYi0r99Dn`&ZhTteivUklT0T z^L^1J@Jjdb3$7~iumrz#Q8wQE^vRX(&l`M{K6$A7`1=nIXq0!-M-$jxqX!KMTP2hE zuzhlb9cAfGJORgY5uDcuYuuV1T$W5Zj!n9$^-ZwO(+0K4Be%=NOexpnt6z)`XOJpH=0*z5>86vi-| zMc-U3c5;xoDx8>{LTB{B6t&y+Y1y7x>*(^9)83{s7Ou#2?{HklpQYRCBY9=VmL< z;G@Y+lCdMuvS>rHc58BU2eb=12%SK#?PSgWrk_XR*?&5hRjhBOwH5wm5w`R8erFsy z9i5Fj@j%9IcCO;OkfZ)?$)dA7O?+Y|`+d!rkHvEf6un}i9bs*IR~uL_d+5ihVopb} z+t{k*DX81tL|f=XvBbr#_Xztri7ox5_x}rTijgF6XE1;*iMl&^`wp0zf_>M`uSj9Y z^DqRz&%k&8^K~^bqsQF2r`c|&vn6iyjMxhTwhZnP7Ar53e|RU@vSz(7Y+3Ry-8h7Q zJK4Fu&sK&h96^*3;3@Ntc>fuC=~Zi%^9crw0apWIu)_V0xs&BXF^{%o%Q zftU)Jask`-|J>Uyyf%}azoNhYxAoj&Z`+*3!S-?&bPzfborz|U%j{165;={2XBR(4 zMm|qQjw8peM%VCpZ@}|6*_-*ZdU7NCX_=x!{a2oRiucA0>ZF@G)L&*{y!~M_l#ke- zE9^_es_n-{*8^Z8<{lL@9!k%a~iJZj_V(M}c$r|}Yd<*Z@BZF*Lj}kSywpEf5XWCjVzHz(SM1(E=Mqyt+a32C{Ip%#ZywYe=2X%C~uNi zS<-vMn32619jUh7`j_P&+-jfBA!ADX{{Wk8C44grEy13=gbet^{p)9kO(kdZv{PS} zh8WR!=U%6SifG$}qtqVF&Ho$6K0FIwUFFQTqtkxz*`>c5jdrwW8}sqbw`c47?DNpO z_HK-Qn`PgAbPhAUYv$h#bTxX#UdBETE1^x$`)FO?+X0OcW8cS}KM-Ay*0J9wqia#L zBQ~H1VqW76x}d|^9_4J^qhw@S_v{w_dC;pSh>Pl<;(6V8`*D1I6kjgZ>*`?>7N-+l z%IFt9@B;YvW;!jN<2v#nHF@BP_WPNPee2%~iE~A{`EdrP!Os1U*q&HkIKdr-m(v#| zZ`RF4%niJpoP0fET9P!cmld}20p!X^do)+x2vf-%*tkT_Q|B!;e{vdo*^g+4eU2Ak zs0q(iZ#L1 z$%hrmNV@bP*sosqxRXqPjgxz=uzhOD6ZUNt@(RX{&BIUkGZ?o7#!b8pmfe|6z-!T` zTi)LE(shTr)B1<8HPms7kG+}p_`B)+FS67bsBs8O7d>Lwb#aTjoS)hYvCci+w-Nlw z34Hcj@ZL8C-=075u%Aahde8F*@rfUn|DDFCyOQs43;*UEvBWk!yQudZiOwMNHuAoY zSj+SL^>OaW+3wtN1E<1$cewYBWM{q&wf3oLc;$Q+o0u#s1>ysm^!%t-L z4V__8>wE@Zj1}{H!M$C_oir;Fp{?3<&#-#C8{YX@J{lT5M~u*~+XvmEUX-h?04F4*+qaZzrm ze}r9v+d|RS-@=-Abw7IW#!!4e0N-Ci&Q4{6?I+(b9lc8*O=JIkjS_NbUa^Iht?zX_ zw4?mP$>XD_brkn%WA@j@=r8X*iv88g&mU#)y7>5~@atin!`jX#@lFSmotmA8S?)Fn8jj&h z=4l`Aa;L}h*DLt{4Eqfq$IqC`7uOrhe&6oCtV*Wd?vC6k=JYv!zbG9adoU#%XKA>e zY>s)2E%D-IX^;Ee)x@@bAx>F)!rE9Q(l(AVtFEy?dQ>AK_j z0mH=H@OHR{jE9}0gL1ZIA--Rf>!n?Iw)23pEE3#>Cv#!gX%NXyw1i3KS?yiL= z*K`kmcMrV}8@N5$4?oJI!+{jx-+1vGpU>}yt*wOn@!TlcRl}YFr5qwFGgG|E8^mJ;?qmWnSSzX`JyQAW_w0V z?5}76?{qJHvA*B=#(mvQ9I#(pSDsx=y+h2sE;myzUnMVhXNSak0(iLuUXDLcXV6jb zatXX#vI89}o~hqp3mnrFaySi7*uT@*UUFyTQ4vae|D(N!T@UQ&@Ugv|$9;bReLtvQ zoK<}xc{zu!_`y3weB^ZJc3N75N#w|l{Grd;vjgb*^XVHkfa<7v)CGnl<_lkQc9*j? zHz0Q>^9km$|JUM?S>ift@DKjLzvs!Nz|q0m!wTgUyjt>k%W`=~NlOT@hzh z6U&>MEzl5qgSdsK80PC#mO@_sBrZGxf5kpk3-fhWDtf~!aIcA+!{!6W!+MLa7ioEz zyx=?oy4>3mZco17ySCF)`?F1BJ@VJ$t(&knwEKB1AcdCu}%~=wv!3g|{fm z{XFAy{QF&|rxLv#vC$*_ZkN3|!p{%!`y1t5`ULcdp{vWwy4lC=Vxd!#&DcIut>Z#I z{3~q5r|GJO|IKjsk8`d|!SY_r{#?R6xtaa^taEveyrZA!X0ds^cAa~F|HiXp-pWx9SoC_RWavFY_ z;BQuCfAqj!_?vQ$Gn(z(S77T5$MZXqKab{(aClZW^Bb_G>~VH?kthGo8_AF4_y{sA zVshcy#NO~INZT*+6TY2ll60>_0Sb``wD1j zdcBj3JCgjLM#k+y#zi?d9mZfd-Ml-}vns4$kHsk1IpgWm4mrDeSd!da)*btl1-Ui8 z|37?p_kgajx;;39ThR9IhTIU14`|`Rkl$%z++;hhhyRJX;bmNYQ?cePZF+ zui-YTuH90scOc?7I#nTXa&0Q0lH@!a_?L3c7?Aa#9>Y$C;F^)47vI? zee^f)8tXVt<+t9;7n{ys-C7*&Z}1DN;`W@pJ4#GG>e8d^T@^M$4*>GBMI5}s$1lY# z`rW;TSWSz5iQUOQ><@Yt!c6ZZ_X1uG)}aNCKu-a>8D34zbCrEKn9Wkx3#d;_ITh1Z zSAoYO-r*S-i^1;xMLu%`Iuq$(DZkKCp5#83K6gd$^0;?c!5%j3)3VNeG8x@hsRhXA}n)X9kxJZHaR{RfPlzDU&s z#!e28e~DWTBePGnu5I{@ZFEOT{@qV^pHCL*Wm;b0?rv?*zadL^_kO3qirnQ6e$Lj} z5Vg94Q_yTQgiPC(4W<)T*i+q>IvE(RR(PpavD6{#HD0_cw^+E=Z0=jMW+TR?nL9R{HjMXZV)$=pu`@N^`%%mcnl< z@qu9T#6;_I_B(#C%zHbs_GB)Bde)lYm>*D6#GicqqoG|S5QBu z2SfpDRKhq{!w|m%(G$cg)SIXq!qc#F^iaws%Y1egduYh(>jmcTmL&5&v$wHN+CB8e z4`gBu{YT7eN%tM5PL4g3LodSC-nR>njB`FWS!=Aph`k)z$*6Pi`+j=XJZc}W!C#M% zHDB5%J&wdT8evnPw;Ma;SkHc&yjqz&Sv-x^O6su0GuN_~SE8NEo_WlEUI?c#)Vahs z-Enlu(M3Oud|JN1etHGQe?5P<5E*k2UAHCN;hW^$O#a4G_Tw5daZC3UZZBEYogJ2U zCZnBc^bKA`OOh?ipou6aPe0_B^pY*-!^&*ujF)#-AIXE(Jip%xr`qpDvO+Je7CxF< z2DYKT9L`RkPrX_;<&RuJR_`YF)@rY+@qV-E?_hKHxIYiLukB(8w|K`D*oc|$eT-U* zGF*n2=g=#A4Q!(;COXI5J<`VvKfwcv-S^31Oo9=M+FM-Bx$NPrA0t~9B3pJrlleGD zc!$gF*FbxBI{m9IvTWeZjo6^q+W%csJ|TU3ly?}wN88MO`@~+gIhRlE-9PvYC;8b# zbg*-H&>4S=w)gL2*u4P{9*1VqgOlv{ndI0E&tBaAe$MXti4E`qURubV{T|)J$DIZj z@+}@b$$rjb{hMc*xZ@-|3~LJuc@fPM|EH_0-kGiXl(*{JDA$Bm^xr$8OW8DwI1|{! z1U50^ClgqO1U^yzo-QJH;1grNEP7nN+4tZR6Zphrd;5P<)*!RxEC+fsx_4CG2p_Xk zV-EhG`1!KDC~wO9n)S>N*}KEZvSaA#W6@->_UMyr1y}VTdvX~*sUF1ER8fyrs^_2N zP8H?LX@9wdHFjC!de#UR$j&cgzgWCj*u$uEMg4+ZtN_~|RW__npokMu+lYiwof zPKGb-q(?fF2hvP@8D3Y8_#(XdqC4B~zQSA34f;5-o7B7O_tz2oB9j|=;P;1*(H~il zek6_Z9{UZ`C$`%qpI_Ifq%Nn~!Om-hHnHE!{ro2DJBXhAoXlO03?GIEHYFRD;;Vh) z9N>ug1%a(y>OiFoIV_nPC5 zALV@ycF(7~6aVmDACXJ&ck*Sua*^SDSTcMT@LS-W_)`ks;O=9lf~_vFJt_GSV6y9Svxf&9CQ zjCk4SE`#S@gu~v(&wgaTZ%%#(a$_Cee}CWvx~fC{-sI$Ar}Z_zF3K|)LOl>$5*R|Y zpnOhifgwy_2+3DCbZdekWPkQ2vEP@81^S=p`A_d1L8oVQ`m*%u$JVb8xqc!U9Id`H ze6=mo;rztuVG;5d*1BBZXR3#5;>Xm%CFyGj=T;uc3!8gZS$0_J+zV9SwbP2ix-Hl#A5mOK`GOM5s z&_-x8G#*`oE=PBWt%btZa zdrPP*mbXOkkj`GM5E^6O^az3h)AQNhby@pZw&Ks^|FO=fpB}tO4tH;S^Spa{G#Q~+ zxLT;9{FeQ3YFgo^i-)m22GM_G$cr9yp8D-G$kS0|br>WDZEZi&(~nsD{A`-(&H%nL zfv-&9E6LyrADArhd%F(OD;>YUQ0kee-j|%bnrvHx|1Afp4@1ExY0(3*QvR2XGa5ZJ zaFX6!`VjFiJ`}rZacAHyaaSdQw@f0g3EomJnG__g=0_ut-i7)KtE=Zf|JS`-E@_l? zvD>|^p&dU|(xE(#DdZnsOw9)nH_*=+HnB@RU`>r?TR4DycP2YwQ}^x$=cZOs%)3`_ zg|vyIIouv!i>{*!ANTz~$?G-wKNGAj_T1bf%5U$vdeJ2g))n653;#;)-@s=2Lylpv zI*|LF{o6%fIM>f&9mh$2zuTFPM+5VUc?NxYN%e#!t$luZ^5w|1TlfaCXX*~#Lmd-+ z2+PVBx}9D09DVaIvi~%DH-xNT1-(Z9tjA^<;awkd-YeR7g8)A;pyK2=9rl<#GJH&>5@c0{w#*YcCw z+M7-B)jPiCc&P;qh8bDIem!EZauj3QccQ0|T8nZZA9)bk9_@}UN4L5Qo7vB^(FbTS zA8%=NAlo)#B@#B`PG}~&4gCknQ|lAcDi6@AW~P<@IjML?K>p$++NBp5f{cKLrC{M^H(AACd7x5_jBu`MtrB(DqoXD3H+o4wo9RryQT z&`>vo2iMn^s@`)y2+ri&b-&VP4ZRFh<{S(W2V+2FJYdm^2AlP zx4Kb&^+DDKBM4VLiGJ&ZU&_c*aTGkal6Q!`KlaOEuJOkb{Hf9G`CtA06=cbO?Bh%J zsy?VoEU7cOAe*TFN1j~nJ-_ju^SFO-gxryunX zC>OB5u!JHJv8qz95i({p8FQD^1Lx#a(f3Y<@69!9e-)w_ldq%kR9M&e_#ji~p#3s__wP;=bec^n%X8Q#*OaO=OaIzn)n+p6jNQlUfr zEAZs(_bu)7R%k~Q`yl^i|6(ssK5ltEd2kVVP$dIK6k=B5U_ZF;d-7`w`Y85D_|biU zu}Yrs4*T1$u|>69)LOQ8mv47ZxAc8DD|Tjp|6*@?#|`Zhyp^~jzQ^;A<9T>17#%fE z&c5Hh{)T*9+xvdXmb_Vx<8pHHZT8$7eAzAO@g00!iLbXX9_m1E^3^u=IdECcoB>=` z0+(erNl4(bn)eJYtBIS8F;B8a-=FbvtEt+>M%js98}@ZR{5-|^ui(yX7w?Yuuakd& zm#>W2uZiTJx=1x6)6|jH%N0CxE7m})%UnSYbD(FMN0FSs-~7eCz-O_qJJk4hmd}fO zuI{|`mJV`lLFJ%)vRh!6k2g^>@eElUZ!s zVdABO-2V;5OiMcbIG?qs_k`JM)_=fk!6(hlUY;9%cZS>5A+}j3w|n>uUFt32gUPxr z+_7z)$vXV+MeLnevN(FHo_`|6_GL)cRZjPNJ%hTuS0`TSOfJv#D$07`NK^R9tXby{ zXXT9Ruoo?QTLt>9hriK*pJ1KI#d)(TySEl(Xu_`O4tSnr*#Dc6Is3Sm(f)*!6949V zvyK1lT_Q&0D0VZ_C>khYxmRYu~Tla8LX{Slz*S0~>M}z2!01R?9lfSCCsN zGBIN~ICmCqN^brGlDFh_C^E#jUq zJk|_zl)UcV4=);K<)}3$tJTNQT|MHFsU92+{m;_`rbz4=wi>|{B``(F>1l_0xh$w- zGdC;`2e5a3XEz=xem2tHU+qjzPu0Jrct}1s=4&2u|JFylk*oe)t}kw+53LwV15Ud$ zyhz@h%~$=xeYlDa--$nWY%yLeux`Ft3J0P0J6SW*U5q_d?jh@6w7(tbDSNvi8i^wA zH}?IX8!d*GLaU%rXe)aMO$6_dsiA0;pJwV~@P^qa;)|W(Qtz>?`~3+XSwej5KA(3P zdne{VW3Tl`#Gcn+PaT5iPbCYVVn41-*BmvlUapJ(8usyVcE_UR{dV4|PNu}z`;u%; zbFJi)d+4f4bN=36Wc$AOdK+?0pVx4gvwYFl=kP%6FMNPIJJP+FiRa`WlOctCBN@?# zA0H-X{zT)P2W(IR8-(Xt;Ht;lYq&x2i*w0`ShsU1-u(qHjJDSYWYgG%jb!(HdW=w% z-PU(9zPXQ#U)cJ#Bj;~KAF>5bleZq`^JW%7oKr6>{}!t%A7Mj@ZI)}J>rup`UXSh- zKUvK4$hz_vHb=?68^Z2bLA+!scJz_>eKvl-G4Ij4oj)Spv<==^9)H0MB``w?%uw=; zyc$eUbEZTae(5C(m++3)@e989zA!@0S30{$$X{&gWnD{N;f& z+~bUX=rjYM3$8@JRxpr;ia+MR{N9yVmQ}QO)x3~!XWX~sb!;N&) zN%(P){~kmaHOTOr(Vp!0wLI%sdgvHuHx2D6rWp8$=lgmgd9^i}w>qC_Yd+Bwa&K;O zrH#GzmvzOut>x`k-M)NJ1}tsOF|IYsSN(Ycd~3LgE*{DkJH(l+>fHv?f9&jV3W}KE z3&lF0z?XZn=~g4J;hW^)8sTy8RbvnDLdMO_?mA4(c9hxhNX}iX+3#L4upX`_BVlr2 z?0b_cxjPpvK_kNB>LKnqW;rHT_`BCV>l|zT&>6pAjd~}CgRIXSM>RFA@D;7@)DZW- zo$P4m*R=cnp}s$it{z5~4}%9DCSEgFFvn4i@o@VzT#x4I;<2fiU?aThvqm|`Ys3m( zriC7-#l#2oi7%2nGC5!8w*Y)i)R+IqCR9tPmrNSWR}2q}Iqok?bAr8n-Tt-0OLklT zCTyA*?|#6Y*czWNlfiP(N1O2}4zXuz$bZbw#+$|lg&mTA)jyAHgdNiBw2@qs>RaJC zw~3GH0TOY$$u31-#J`rOxcl$g?~^?Lb2jKSa^N$1FsDn7bzb6S<;!R)U-Eyb>b!P9 zlf)6XbY_#-?z7lx^U?V$%1OgLyX$s`PKP7n!*#OF^x3g47@`D*2sW`reRr&ssfrz| z(?DC&{Zr8e^aCsre`p9TF}aC*|A=n?25#qYJZWyD*(eju(J7M4iU!_EGs(2O++{WV<(K$y`>YasA;F|(P2Aw7ZMZt)91~P=ihPn_9J6nB}dtO%{=S8@bGKkg{|hyv<=` zhfIKDtGiz*S;XEYW8sR}*y?5IY`7vdlXW=pTz#NC5*u)JI%&3i?b+n_3(oZtHuvvj z>A`fyf7#Bl=I3E@`crnq&ScjZ`>{9O6nnZZ>s;eZ$s2s$+TQ;}GW00Cd^h_WZpa*# z?l?TCkDegrrw$m(XUWU6?aB8=5BwX<4&L0JZ*fJD%Q5yf&qyCOF|S5h z%k;z;*ew<~jg6S9TT^>$PxQCJ=bg!??)yZ4AM5Q-q*Kl#oB!hX(v$q^z}G4D~TKl zC;T{q9J}3K{~hm6qT@ecM?UII?qm0u-zay|Mc1cd8ROMF*dH;t1?}zC@=3eZucGd3uzF)-TX3(jtp(@_#U`O!L%Js;Ad-+Kb z^S(S=O+J(jKBQb)9$|5I+c5Rd1Nf)|`Iqll&oHtHridQY=ZpO5alc04*N@!uqpiuj z$1tz;nD;10XBI7;WZt8=sJ{5_!IAXvmF~WIk9teAvTvq{SEuqMVv6EvaIs+kS#X2T zI)gl1iXC&Sz6|D6xKlxYyE2Fw>z7qEcdZu8d(;as(}&YcG4~EW501AI%zIP|(5qgv z$9{H_>Ee&>(Y@}@qGaWE?6%YFLpMKa6uAg@rsqSI4_y<}*S8CQAK;u8O!e<0s}Dif z`u&aV-*9$Qoy{=bzK-DgnDH3rzllwDnByvDoo4F$_4Ahpg9RzChBdpMOzhWVb17Oa zR>+I1$bA>der&1l@Fq-Da!AI9$aUZllT|CA&tYz+hM7%yFZ_WXj&#i{|Da3UHzdbbZw`Mr%H*eqEd6+5w ziWn%F1Ba5#UFZ$zJx)R+Qge;cR83H)nj$kU*hw3^Kk8ZJK#Ou*7WA=}OUI+;c)*K@ zC(+kY7MkIx&#hS}&fN@0IlyW#!%+{>ANsD zyK<_(d5NBwj|?5gw}9J9zGLqmrG^34GFgu7h;iyq(;ji&3f`&0gNg(3yF`ju5_9pr zieLt$xil^Iq(xlN>_KD(B-^k>tq&|EJ~jg~T<&aNab~wW-|6gHd_N2RIr>~~@&QOpOzg2{2>%{%PrLPf7Qx0qSxyLqQvVO{>FMI1nVtn<5|XoQ#e&KbRQ zr~fuHF$_-Y$%_2D0r<|WM7B>w9ACXF{&>%xv9*Iai7;ZNeUyK<59TBWa}xF6s;T|1 z@vB>#n6u4g^A_=U1D(UmS(pBz1P|U?&^rIHPID1`PJsUkatDEKEFhdcc3Pnyu3;MEH{|RkHmYu{V9qhh*OUJ>Qx#L~250BiPxi(@d8^MqtZa-rEhdG3>LBSlY zGMGas=aNUG%G0PeMUTtnl;|AUvho$S?nPAFEbIUVh%MHY(E@HT|Qb3Asz6Ry&l1asykyCFTTGx ziD$xX@#(w7CwrQ+nQmkwEalwHB^28&;YG~DgITJOTX)hMe>&SP`+KO*yMoOFt7k<; zFrzShEa&xi?;UX-OR{&C!^5eZj66)ag!q8I(>}3C;INW25geA9J$J(U!(k;`rCG9p zdnR73M~FILy3Y)3HHmuX(M=cF^IQzE#?FpCT>k5fQZoJ}cEL(~gmc727C|SWQ^l$W zu?yx$+p-Nz!x6KXMqi5A(g&J7#C%mSgHVs@epqmQ?)WLIu>p@`kIliO@1y1N7QRkJ zuCgMRQYo)z=f{41YD4t)EZJN&eOPL6sx>oQ+Tj|e>JyVDY;Cb<`DQv|Kko_mC8trC zkCW0Ry`kOb>_v}!=X-QTvS!|6T^+&vLV1HuGEv_d{?tz7`ikO-U%6v2S_yns0-x2y z?89cky_9rIA6r}>fviQ%S;Z_xxj5^4*FNmQMtIQu8p>aLoexm;v)|b?CtB}P>UB@2 zUt)b;m;3mtJ-kn>A>smeaW}ppr_4BHmvxvOk~U+5$5|_^7W`WZm!5?iyvO}ny_s8p z-Jn?Y3 z28Y_q57l_B;&)fHkFTZrllYq!vTe5evx>cZ7G3PWKeMNk$hrCOa>oA~Cn|KTvpH6s zpdNuGRDHyB>l;>wYl1cK%!X%PPu`sFob@&07qq~r)Zm$hhznrPB@-}d{Ho`q%>2rPrhFtS+ZFDVtKrrn4dwv%ofv{?A`d%dVAF5)8yaC`bHL|5!6l#1P5O^~rVf z7WEIS!fIFb`m3rL6*ECAdXJ6yC#&+acf=pDmSp=v?-6t?|2blH?nMuv51eB>%frx7 zXu255N95LL=qr+RNpXbr+1%zbvX#4&gT4F0?6GJ0&g+qfG`pCMxpZvjig&Mg#)r7> zYm&3-ef*m|m>@5vH@iKpJKwr|PmL}1AsM!gbN??I;O?Ew&$}NlU2I=3&C+0QB74DX z0k$Fh7F{40g9qWa$oKL1x}V+^zr>xFc#;fX z9UXvOM!Y38MoJRMf!p7;P7Zix3J!Y)H zTd+%Cvlm?kutUb7u;uANM1mtUFYH%oE7l3!7Z<%*f3^V~CMC&pB3_6hA4Th-%&{X2>M z(dAs_uGt*t;qeOITGxHM)V}RPSIuGn&U7Dd!3#@TbCsR6X^Lv*(SqZgX__ez_Q45zLefW=iUfUj#EHgIN;c5xBZr@O+HHm?;^S zz$cyfF?7)GOl0)#_%ht66|7KylxTf8SHu1xB zwwaJ@;7nb9CWl#P0?ierJ!ERsF=SEEEUheaa3 zSfOSP8CJ;IP4H~Far)ezs0Y!5(!RY!PL1{Mna|iUHAe|;Nq(+M|6GfX5W|1o{ruTE z?&Yf*Y%>7FAJK&|7SCT?N&M{&vhWW7eXRd}L7V{&TfU|vS;IS;so3mm08?ZZu>7#Q z22%td&2AnzB;miRGl9bqqyN#`VT%&|*b|tcL=6=mwo3NY#3lRmKlWVwf4leo!THze zvw6wjwaJUCoPoKE>PXFBFU;skd(DeV`CxJ!$gIV11Aa1VG3G+ZF<5x#vlH8JefMsC zGILe;>k+!-juhgO9C}DhtTSz>zvvQU(4$*CcuDtEKWcH_@#Qk)IoTJ?L=0vk!Xno3 zX$ChX$CI^^-);IRP2p>Ik#U`HNtr$>UE(SIG(F$9&=*czz0`wH4NJ4H>JHu;mWWI< z50Jbt12Bkp$X8Xw-a`}bY6c)&dQDwzD=gv!`O6}KJyPecA0zt$_DG$3P*+rn`<7yn zX7l>Qh&x)(zMWIlVn-$p1A(<7ZKgJ}rUp+Bj z4S(NnEK-&NnfMdB5Ug%Q z{`~IasznzbOra9w-F&Z?E?s#bzZ^eLvTw1!mN;X~`#XaI4o=@6GV8zY-tpplpSpJo zTc3F#`o+{>nOpr`E8NorJsv0do1Bl(Vg6rH-Y>44(5=^dzZ22_v7^lBfHlw`a!|XU zwTl5xQ6r<*xOv4(+Oyl-rCH9vd_M6fGv3LQW5^F!AbxFs>`T)0i%%k#R^zY11&JHy z-Zp0ssuOUp;erylpad>R-oFYjT4e*OpJT5dgzxn-5~snVbjFeR9rj1PQ3=OU)yuca zFRsB?)S9!M%bPSTH9PYr(dZ`QhnyWO6$5n-#|g;Du~f4PwTR?ls=NK3iBJGLku zSk2#jVBbo6ezmR9~Sz6`TYbN=)+hY_-8%b;D5Ie+GumTKclGtkPQua;b0m3}ib6`AwLhO61< znp&Njdg&Tj*s6xT&7E!&n;Hyn)Q)ebhOwd_aQ@|U{3P{RB6 zN~y0mKZ^W5TTj(kPaoX5Q}6|h6nw}KxtkfdqOR_(NcNO#@iTh6g&b&6r&NKp)xW{n z{$!nF;bBiDALgMq>-KmNyahv*bO`alP{D$!6=OqZ)=+rnAUZMPq3&Z_|3>zh>le)R z3oY!y@95VB`D#DmiyOUzIhc4vp8#@i6FTmEH8RgR>xZ3l#I!x&tYrrE)zZ_#`oDIz z=cWxk{u;?_u`*aGygQ!Xmdf2{a=`kd;G>)I&<^zUb7+4)=cVr70`Bfw@-@ecNiOCy z&*ZbdKqoEX-L|D$KBVJ+$N%F*CKhsUukgDM;^XD{kLR-Q-gXz^rxN(71b!-kpVBKy z9EZ&cKLsP(YqoM-ACexrt4>ySsac#TUXs$K>L0{JpZE7_E#*48^qn<(tAH=^UNA`s zOi}`qBu1q-B!Wq5_G*VoVlif=xPzWe4VZyo?k zu*+tUC4Y&D{6hC%&QEC2Jr}SKFOl0hn(ck0pFN6S?zWB-)Rf0rf6wP;K9Fl8#JKc? z*EdCP6LRqx@xgcO@g44od4A&PMfr{pg}G@k$$k3Q)b+6L)k7XGikx38WryMG*e{}$ zo}29%)5Xkgpr2xYK3F1p%1n8GcMzUhC_jha+R4Aq#ACYTnY<%8*-0)h?BC~#{cVe5 zm$3)0!Jmz_w!xm$XCL8t)XU_}zL!UfTe+98I<0Eq2IKP~F`iStO{e<4-bAhX*AIpf zoCJ$igYAY#C5N}=+bzb2SlCYMS*bU~41cXhsCCAghpXL-Sc^Z}-B`(99%kL!xL>h) zA>s?-8Y=FBnkbmAn)#mMTkQTLXhZq9V5VI7-aaprr+WYCC*a)IDEgA8@W^O;Jk{AB zf}gg+OV@hR9q355*<0vWv=m-g4t1fs(1U0;ioKrabFUt=&X-YXEkn^Pv=p9O_~J$C2}C_UUaI z#I8Z3(avaZv>*Bh8i&OA@q8)%P$vE83iNMuA9@@;WzVKMTX$aGUynkxzI(VM>PBWT z^4aw}M8BXv&|GxYc4#!(86A#JLT8EFtV4ILizY=o75$2~a2~s%I7dkAA~_pPK^LJ} z=waflIXr+Js9-^N-w-t7^l`d^# z>$N3YqFvE$D9)MK7afPDp~$Bzqlg{b0>2JK8>2nZ!RRP-BEDQ1t&T>cUCh{lC_+?4WKK{dzc?-90}!csyCXJX!W9+287(stYKOcUSiz ze@DqFMqCU#yVT3U9HUZC3$yUN$A07qn@8>+b_T6LSDA$fgV<62!Oz*#XDr7@FX;=I zv*ZhU>0I({YB~j8r9%&8y?U}bA3yi}g744*+@nDt6S^KSxsVq-;q^4bgf!Ob#jyG!AxKBEPGThR?%ZN zhZib>xrlQ9dU?~i<|4{Ns1smEn29JpCjTr4awMB!SN4LLi2AGLO+WKca$_915&g_3 z=-k=ts2`ot%&e~dB9HaZa>XrdM14a%^BeYsxrOYNls}OMxxZ4ZMINju#ai^TsKEIL zxm9sK@=>fs{7cN3{uOJ{*QBP_wpNO@h)uWZYtaffZT7fc{$ee#Hbca-hw=M{k>A7E zcXRpPTzb09rPtGRwpkB3Sm<*)*_~>^!`1|;BY}sLSM9*3dgQSYR=2Jj(UNB8(W>TEm`#>;v5DYA>FaZy6I`78 zQiQ!y{Kof%htq=$9)O&Mha*Gej1W8=yQo85ni(#cJREsEvlvg-q_NIdFa0cmg=@|S zfq_%E#vWl`!@%+B%+YesVc^_H@kQ@9$TPNKW1O4ueSF?xX${ZNZD<*>PgTb-$$IUH zftryR%twTwZP5>+1)fX)JbtA4h~fJ*v(LHSJd%_uR&VqkZ&Ccc}= z?zz?b@9zA^ireb9sTU=?6Pbq?%tO@IT`mooi5Sd8RAVq1)V>F=zMlF$ECpPB3A zNcLv`MXZ9ki1K);xGWxaha+}r56^lMKitmtd|bZxZaQmAI^_bNyB=A744RGNEU)pf z(<8~sN%+A`MRD6wJ$_ZqWnWm*XNfD};fZ+I{Bt(ecRuGydp;D6LPxtJFo4$9FF%+! z=hbgRW}3BBjS}rrw}PmXYuK*_ygx()PmZ)9~Y$ zOzEA)MPL%ylf%S73pv7G@y*O^>W1FUlkKBDXFFYHAN8VS2kTWx_WoV|cnrQYml5to zkLsevj<1#fU@y(F|M2NB)h&8osw-xr4I{_az@NKkJ$f8wdLrvbkEhLN3@@`oVdR=N z2aFuMM17@mfsr#mPu{}WL|qAQTpsDO2cy@?qOS&Yo7vG&*V?7_x{hl)f*Fte+(Ilz ztruTn$uw7sOZIv z+gcp6+a0-3znK@k-+AnM@i2CJ#(ox?aW?K2pRkL3PxWuCksD?^@|DH4 z`7!h6-DaAmbU-FAk_B@X1DsmKu;3ru6Si{nvsSi|SZY zvJ93+ygBxO+Kiq&!Z{saZPyjz;bI$u+|$e%%+0s@oUeA6JG3gjxw23A3tz3Nm)~6W z9@frmR5(;IQaHN=&JMPyrnlEH_Dx5*qxYE4Ihf-prkn9SVYl!Td|m8Wp%$QShGqvF zs8%!mFbCis8$e0%$FxqRhixl<-* z_DvhfFZ|&5-IWK#R9~Yk8<^Tb=d0z$>r&JXLu!77n_??Tc|%43o+l3A2kWy z*X%>*Z(etJDifn1UyqwP}j#r4YECW&J919 zeu0~V+3ixR(aA;?+h@1Mob8+L-iiDYb@XCsnR=F7&zUmD&FO)hJ}T6}>yyf^xY&J) z`JzqnK&(wRPcoP%3EvAtr><&KGW`^G-wOC|x@WBbdu0BEymy12Xy!8+`T+U1EgC_F zt?KR{tjE_r?46hgo=HAU_L+L{mj~g4?d15zLAA zdG^7T_nAeJCa`t-n3|(#Pd34OuZahab{2o&y@kmK^DtvRgFjd#_miXWa%>NE+|~#$ zm%z)xZgc~=bFjUz@g)V|M~vTZ0=!XB21mxu9^Ir95Xqxg|F~*Y@1GVVAL|PpHIdo?ioCm zSsu>&C~=t;yxZRN^3BeBKWDQXKKa!7EaKd^LwlmV$+qLX|EK5${Chi{`aJpssTb7a zZ?O9@)!z^0!{qSeMVKrX{+N4yL0;$6W@WpFX*d*QyFuVLbxQ;)n-PR~z-|LEis==bOE zzLQt4;=#MJ6b3ODMKZIUF1p^i!Mwp{!NxfA=nuoZB`}3eGphJ7k2#k(%X2t6xsi8Y z(OHfYm)Z><{76sSM>icnN10I>%%}{Hl6|TvIHF~2X{9+F; zw03hM`A`KvsMD-aJw4g)Y*qd68|6Oi%Rj}D-r$@5Oh!Z-E@I$sC0lCj<Mp{4*n(+kBz;r;_UIix%c<@9Wx?>Udq9YNI6jW6nk#wqk1B} zBdh@))y&gU{FoggMsMyTe|~Dj;>&UHfzcj#X>n&5XIl**ha;9(-Ax(j)RE5Y1@B|- zIlH8TzBdOIW_ELbr>|kT9k~L3)~w5e5yN|IlcLW%HsHRy)kx?cLEj!o-o|&D!zX#u zxtbG+zbC`Q!J+EiV=g3LFR0Zm^&wXS<9E!3#P{RXN2h8ap)(B(Vi{A=*+d5#y5?HZByabv8C5#2z99ArW6*DVmDjD5bP9wwkrhJ$2VpRQp+uT%p`>s9RORjiZ z`p3M=@O0i?Zf1X$qNf{Vk;t(cK(P^bZZdwq3!l#tQ~w@M_1dfL*ieUwRqt&DU*VGz z*!M@^`;V;q8)St*JKVA{(>QM&s&>4 z0dHmZSN$B0jNMpE;K%{a`}KJx}tQ4=xP{*2Xd$mOR(nm$klz=F5UFTifF3eH}^3-Ar5Blqy8cRMz##* zKEi!eVbp8-@Qj!H?+{aMB=3n)T!~j!@VDkZhS&#jSMNAG?=){DmFv^%mmm4H{ernt zhtp9$PWK+1n}bPTToP)jETL25}3-h+58EA^&!uG$Nopm#BjP)Z9o6GOP{ZXIoUAwDq>pQ z|Ml>QnULywyZ9&aK4fN{p02S+U~UqaEOBfy!I{BhHT$8!o^Qu8=M>_P8n?# z^_^n3ow2W$Ii~98?epn;p!@x-Gi#`8t2bv1z)6`4koye%4CT}HACMPT(@8JGO_`ZS zKC_+7a11Z<*TvuX32-g$)1{F&$!9$y#693D?f;v;7x5U+vH!j!JJwYX5aUuXOJtk8 zn!5wD1fy6JW9s0;1hIJ$M)m{$viu+W^op#@S)}19^1PFsyAd0UJqjDv&aRJ92%Y?_ z_Xzjad`EfSDlA=Jh;i%t*uK{cnu|X$oj;I?srB$h;3TX+VtCE!k>4rAW-G9Yr9NFH ze9`!bWigux4wei*z2l6{*v_qV<0I_}OT?)@D0=*@C(UwVfNjd)=Qm%b^O~Ju5@Py z!;CCTSC#A|n58&Rge{!GTIc4Pw7{CRs4MG&wdvN^yAMuRZk_!3(ASH7?sWIFo4@fp z`KP9d4@{om?*;Ao0oJyr^;Y=(v40@kQSx_m6^XgA-@V$o#h%o6rxkeT@ni%WnXEj} zyV+a}I+!hw3j{gE@y}<^;Hqw3$PA#NL=;NcRRk{zKEAg2@bK7{UR! z+V2UT(V^#bt-O@XIuquu4XUT}yUdi9cs~)bq-W6xm>ATboUoXCsb-0rabz+V3R&mXUq27ya_`1E_!##rIG3Re#2Wbe%dRM$P2t=caBH?&FS0*dEP({G-=>-}cX zv2XaSXq&W>UHhR}yY(`98@)$vEsHKgH?XyK$IVY5wTz?n}6&vgudE zUJf(Sc4XSc=rVKz{XLOP9BCh6x%9WI%4f=w0pY#WoCXQQi;*uR)s zjZacDqoUTFQ}VR0ujA8oXr^^hFPed3ebs&_=CK#RzdN8)Q0zLWn>e2`EiWZQ7LtQs zp8XK#Kt(Jj`%c}q*uT1%IIH6(d}=0Q;OD@9tFt5vVZz`5I?U_qm#s|8e|gS8{|y(W z4zeYI3v1S&z=es81+pt7aA9P)K6eN%4EC}Vd(j)*KEQ>^UyGC?xG-4bR(m^{6{9y0 zUW5ySp_*>>4Yr-xBJS~QddsXtJwkiLN9%AcX`Fo&%uD1a$@8%-hO&}qBgTgYt4oRV6wFEtyVEZd>6C~kdnoM^gAqR}TJ#4o>(Cy- zm9f*@DSH7|CV$)RXYKCR(1>`}8=+T?bhp@e%6G~1^%866gZ_)XQ{mH1!~fODV^j&f!&XxPfU5EWLClJom`OD4N1Nk+3 z2=mpnQ@#3Y$-Jw{E6dk!9CBchRDDJL>;BGAr!M#ASKlJFsWs zNo1~+pS#Z<-0Np&(Szsnso|yI9{bF|tEfZt;OLkn&cWeD|Br|dKIJps&3D|GpBVdB zj^)$m#1v}M?&2bJD$JCbvA8Kb54;rIKvlfQ&l)vIrseG2jho$rC+N>tSwB&tIX_kZ z->mvE17c~oFu&i<&4)E(LY7fYqLD1^4$e-#X7^p^(f=3wy!$-Inf4g3o%*-A%;X#| zQ`nzx|05a2-6=M!s_{%QGhu+;&6ACbVc5|A?ks?{{m$y}!HbcvI7%8h+3Zzwc=|(w4}7ydT2u_ShCNu&c}7fTo!sGy3w!f}aK&|dCUM1ux5yFw zCq6Of(C4o1Gx-q#N1S+Y04HbWy>fj{xp}zmCcSXBJ35l$Qip?>4nH>9SwsxX%29v2 zkFnmfB>x7VoLqVldh$Uy#c9c=V)g&??l0K;Ypkoh!*^Ef7kty_Js9t$&z{%*Zf1Yu zOr%Y%J>XjZEY|#(PB_du#rlE_FJP^2y>8XTMmv)2>-ZA4lj(!`lxodMpZ&axJkBR( zSlM^gau_x55c7j~vjY#ySKRBav+uB$ILrLo(w=!4&vUBxd%!(f%QM8jquKl!XIz?} z4DT1r&=0ZKpoA?lH=;Cu0}j->g8!Gv3BB(*&Ueo);@d37r(4o`mVL$%CqL%Q=@9ra zb^esRwURA;#-rY&hn~9Dv#*~AbHeb#`nhPYHlYumx5q2lh!>fxs~dO^3Vs6v2%+aSe#bu5eT^A#9MmN^G=wmR<*FZym=-c z!++n%KGgU%Kk#W{k7~@>Ug?>RB#Wo{w@c}hXZ_vU^v(xl5HDPeH|X*rd`=fHBj$kl zEB~(NYDM>6j}^J>SN}-$`*$J_u^9(-dG=v+o0l@Y7e|e23k8 zISTjxY3Fr>JNG+!<92INdSh?4#Ix!_EyNZ@zz>J_u4?{9)qJjMzz-+K6kufaN;{it z?N8>v^(KVNEc|fYUhx(9r5jl9SoE$rZ#8)Kx*q8|zqgLFsUBcW^sd&;BdFWk2L0FQ z<}~rcsn7Q6GoL2k+X)+{opKpi_RH+UV>Fwdtwhh3xs7#LXE0 zU&!_W-th;1Sm1N!es>4Yyry&6p58uGz83#od5SZbgIya%wikELqtAMW^O})OSF=yW zce(kDX6m@3C&8U;?d)IYlbugiV$a)i_H~wbSc1Nv>YX>E+cG-sMY`u~_wh|O=>Yd| z2YI$$cXBh|e~|sgD+l8+V79$@!2HR{yqtykaVzqGBer~V_i1-I>4(Qm?Dn3%?9^WL zeR`?r*A^b6R(U%-UG%^HU{B~PI=U1mmE}cZwIw{qS@N%!kLok;BEyf~3@7>%zQ_!p zh@dL)II68#@I?uH5#Mb{?9t)>_<6Fj6Q2klKyo>Gffd5J5#$Jmd{!HNj}PJ8^!$`p zvgLoWM_)PPO|;fs0CPJ5HefHhsCQI9K6jWfdv>Lo<5>E0s`Gu3FJ5(D;E4F+CA{%8 zaaOyV`&>k9aIgCY`;)-_$bsS)_MEUk`q~3LYNxzZF6|0_%4ok2qwd|zX7}uG@$F%G z5?CI)$p^4tdCUSTaUPCzYwNM@_>#{UPu610Zx8jZ4vOtt{5ta(_!ICt-C5f5R>|t@ z+&KHIrfe3#6!Tfh3xDo5auR3kq|xT6OMRcGaBOh*{_c*YrsrCM+z+scef&@OQoia~`e_<`UR9q5%sfBB98t5G^}=}Xj|+2*Jp)Wm0+W-# zggT;aGsp6sxYI5eJ+EX~3!(9fK7jr=GPIl=%%$|u zU*%Lc^>>%Bldr1rEy|`w-ronv=jNWLpACSmQ3sitEa|+S^L(&0auGujM+g&};;ZZ6 zyGg~78T%(+XOFj_M!%MS?GfXw>HGK1G8pw--6=OS(fmfX4~JX8;TCYXg{_PJaFm~W zL4M-^_b&2y;Z!$=xhAIo-(&A*&^b$3Yufi;!b#2z8`7{$kMZB*&AOUR9%?pNk=giJ zv(r7Z`}^te4`smDrjMrGoz(<;lfd4PMKW0w3G7X`765xgPO4(2T5>S_;x6vRw)D+H z{J8h`s%Tbq2Xw$DZz;>332?xR*X& zi;jwM#+78^7vy6pYX#rGJ>Bp}_wE#Hx@UmBNnmf}N!4SlVQa*?Obq-iyZjkj^_4sX zOb!fK-7JBz{ED$`cCQ$w*FIOww5bMsaAsu65j&?(NA;NrHo!);ll$eMXLApK^xqex zY8dW$xES->;NAQWE+&DC@mziCrfI4ULP zyZvnM7a1&PD?CBhz^5eeDg4!m5f>{4P_r8~!yDJ#1Jfrv~;1mOpvO9x)Zh48A zo4_Rp_fl2oFn8C&B^REvaLMsgVF%o&L4GGLIrBnlW^&feo*U8Q)hUPaPWesINzRdD zfjddyPRLGa=0eRg4#N+dE0#6%>h{Pd^uU}n%uDYPk4)qz*6 zs9g_wcJqP#-qBfG4KAa*%<`g(7i9Mja#ybs>&z~W|D&~r=jgLOv+DHCD&FsKYl^%1 zPxo<6@A@hE+JN3UxTwOPRmqhcI$QQLxqn#!@c&r%;xbc`BpLCq5_X1AHnCvJ0~9;;2(lM?+UrW_(s_3$>ObeEz@LUa=G1 zI-)*O(*ul`f{uZAf%P<>&pm*5(WgW=kac*M1l}cC&c00JS3F=}_O>rWbk!=p|22E^ zmbJI{Ge@bs+n=w9#i#LC;V|&$q#;*dJlvg|%)XuNnNE}2JCgnU9lf~>{fcug>_-0| z&d2H{FO#i1`M!AP)LL;axj!58Vay#5kCCDC@jJ{#hrAN=C~V5o^v;@eOT^K_(5O@5 zNpuD$-%>tB)hW}ds~NCu|MuM`ubni8`g(%dMjF6T3cDWSi4#W zSO-~$Sch4EvW~JkR^$Lb&-#aa!p-jCE7t$mj(e zfU*JSwj!N+wKaoY{RcVvhx0Q}q%^mHoobl%+b9o(Cp<0gxBcAF+R572I?CrxwWsG< zS6bIt4_VJ!uUVg3|FIX56K@6Ux7KEsnw(kpdikx$Cv=+CZ=GX*|6y-$vfi{lwtkeu zyH&jVEBgQ|6mffS402%JD{|Ao3UzUeutNGwaXX3!o|SWZkL-NR#_d5a;e--6p=7qK zQ~u3fLF7n3yk6&|$e}@Hzy)u(1E7Y&p zb1_ZeSAXQWmgA$Gk@J_t9UGC?P57CAVs{?kuY6bZ;p}OZU;CK{$@CMRWevJ&4fws4 z-MJr~!y)e57C!f1bnaQ~?A(0b?VQ~|y(3%?c^lBrq2HSQyw;tD?cqO~5e$>}N7jD_ zIx}KfKUY7hs~;}rJ@D44b;3wH+ez;4v+nH?&Q!0N|33mR*bSR8Q>{1h36#eqE;?AB^variB{d76E&1*uwNC%or(W8QP2tYgM!I}G^$@#i++ zufXHrrmV2ngKArC{bX%1Zys9i5zaV#bpx=d8E%?Z`MAIL?Ez<;ed^OU((1-NyO9rA z8yFt*={y&#O#*9^#6BQc8~zObD!$NS?k-$SGP7vHQFQopW^Y(WI{#0cRg7s@vlg?r z^V5xE+#S6}Y6|+#`Q~H%?0MD>Fa-yBpJ($Nf03Fx+|pe3?z7RIvv8_s z#p~9c8}KCGVJ8c(TfpmPc4+W^CGLz7d}__|Z94ZXIT<({dtD^3H}VvN$!B9`=zD76 z8*ac3HsoEVcYBCFcUJ=c2XA=j^L=akK0Ix~+_(TALPzELG27-Hw%{M=PqD}&Vt{+> zAxv92(<#oE76Ct-z7-gmF;ly>;)l`!cs})Wd-b-@*v;?kowk$JQ=HQ|UR2MFw~d|~ zYi819a~-Cs^~rmar@Qz-f0TcJz;}F_mufhryVb*HPK>ji$aH^<(LGN)*~tB>I)C_e zdC)%n;GJZn6nBuj@;-gGgU>vho&VD3u0;>dbY9o{dA%g+7`8F^V9h=17_iyu?>r~ud`aVn9fga%DJWRg7~52L5`+-B9{HrJaql+E%+OoyPu!Z zxwr5;w)AI=;ZjDyUNC`={(mVU)S*=|H4Q5k&kp4-)J@Y#Ey6QGavajXAyHV zFhy#DgYvW~&KrH3X`bB3pFTvMad$d5+MY$}q2>6(u~*>ta|o zLSDW6~udAc6wytUtTeqkN?PrPkx8$Mzyo;}_+ z`6&J)-w|gUjD88Xh40kD*%tlPU`DeZpOJtw!}s>XXmw!HI_0|d_{J{{71S{v0}}@OMj)V|ir#8F-!O#7nJ{#nV?=nHtJV{L=Nv^p)1y@YOIb?s>J` z(cX;`!_1^NE>DNl)bwHSJ%5s4O64fwUEnk;{JTmQyL^(*i+wiZP7s-)7`)I-58TyAb%-GJ5H@zNej~r}i1S^OPCB12YbJ%7o-5yy_b$IXV{WH9{fUg!ZL_w=+g{>Xh_lD^xUJRC#c zZ{}H^f{9qw{zk6dRm7UBur)Z^%A@StQEbp>?&L~-ekFM=s9^b$ro3c3St(7+bNC)V zsJqXpHgzvKA1jA-5C3~9=Luhwyp|PgT>(P`-(=x&GuwQ~+@TbP9H;b{P8TB@b7&>s z%-nqb{h&T>GtG*Q*#@b(<{3=)fSG4z>G|9^Yw2dP@*qC~{z@*TD#sDz%H)FV;mveO z#5m4oZRCEh>W(!>PokG|*w`YO*E4NlFW$DV=gU2=L%)xr+vkyoGY2U-(fx+eiZgN9 z6?`4!_d{!4_HD?SZ0Zg!&QH9v=)?b$@-6ydgXN*_+)RD^4VZz=>50YJ z-bKYLTa%})*{a<~jZ>qNHL>D!yg0`iZ;5%f17Q&uu~$;+^}8JNJ|Q z8t2{~YfoV4lgmB(qHOr?e4Hs+8gRhrr89?3e1}WT9Ijxmr_#T2r1tJS=k&I{grlPS z)GsVJDjZ!I?4X%|?*D`_4LHOeI%BLJ)UjgEvEs?eW-pOlHsvz=aGG~K%YBP;=`NQ; zAp>e+&2X>tj`%BB@vw@Yg;y+(w%+yJhrqqX9%D1dewQaz1ui{AYLKFTHakatOn1@IHaJ7Z)*e6_VFkNum>=Ldv_3OHRj|Sb{BR?=!|IK80jZ_V=Wd=x& zFS!PPIhp-}WuWi%ot3-Ozh`6v{Ow9P4_h?J-CRn|YnB}T+~nh+v{T;c*`HB2JvHij zIf4851;6q8uy*`590z0%CtA1vA19hzi#fsMeowOXym<9>cRg`WpCFg>n;pL>zPeb) zfFCm7D~C6cn{#)jq49wY8V^BR{6arY+4+J&rya%KFM>$wTgY z@8m!In0LZje2a)*gW0irdGdV`;0EC9*^i6K5o}Gex4(bK-PP~UN6NdO&mNWU@gELz zC-jQz*-m{|Rc~9>oCNhoYd&lFh*NM@E3gL}@ZI#Jcl+Z9oX4f=#Cy8S4~pet9_Cc< zyePe}F8%apHVT)TUbp~Tq;75>aHz>cHQ3kjcALx;>fk=VEX71-@$=KI;N?T|CxN1 zdF%Lv@t=v^=7h^TLu`}EEr0rO<{Luc%OIZ%Kp5i=GX4x8P>~E z82L=!kX$K!`jq>;q36Gwf3y#|3UckQ+CMm<1Wt%g><*FOv)x}fA$cuzn9*bTOf7TQ z+sUu87T)!?{BtJXne)GM{h>t|qVsU2!EaUESA4qU!;IS4$E@eKLpQg~8c}19_u8NH zIxjdOGj8~}QEH3!3c>LYjCgT&hgnIPu@~=`hD*6 zerhs5y3ad}>W4cpL)$yt%}%_*zgw4Iu_>MPPiOs;=fb-N`(5f?t?9e0!)f81(dB($jl}5{y(?At!z!Cl z?asaw(VfPGfCV}z6Z98ZVeQtJS5pcB0<5%Ps;b^=cj(0mtqG&r z;r!ezNOs{K&vibT+J@a74eNCvyL&in(Yfy0gY2n(P5nG%-69L!8t{23oD_W;xlb;2 zk6xpBhsnhEezqiIk%#6DGP*oH*mjq8^|@w8mABG;PxBeJa;FY<&(%oE7hrs^oE^+3@^*%$K-|gYQRJ^i^nEPmb=u3P44N@{H_FK%) z52;PW`QtTr@~`gIlH}`W^0gY@;mP zbIi%dJJ56CT`6x;4|&{k?&;pbyy)o}NG7m}$FS#jc;46Ki1!l*%*oe1Ppn;`ht^RC zrq}sebJ9yQ_@7Pqxu!YcO?EXi&(_R|JP$b3!WTs@_ACM(H8rh4ehi&u@%iOS3%KzL zyKW9UpLhkbei}Ki*zcqG#IP~22zA=44&!TH6*-FYrQp}-+9IsSXT-UtXQCQ#u641d zIa!f=HP@_P&u1EY9?aD;SA%@Q!0=~r0J0%`1o;57$mjxCmu|l!J_cMu<|^^=zHw&T zdY4Un7oIY`o;mJ-!EQWqv3*`dJ{*^~dWYHh8GGbxmiHa7EOd$aChR`WP`$Q;df`*J zs|>FdZWy-udh+;zz2B7YIGUb$*k`;>zm4K!;Xu>xFc@lNVSc(jcgHd|=W(BLu{`DR zWWoe#y);F*IaBj-FQ>9cFf8&=7Q#C4mnEa{veAbcl@J;lJd5=2BkaK00t$|8%|$lY>j-a`?i4dI?JBz zNki1+mv(eUSGl({($v}Er_FJ-l7*JDILW!=9t-=hv!C-laE_U`Qwuo9)Ixg14deKb zQ^*3p$z59Be!)VBy$ii;FzNK`liuw;_x&Ds`2_j43yY>YOjhn=J86X}OO z3&##0xLv-@hJU~(d(_YWo1bYc5>0EYwN3!*W=Nu7NT<80@7dyY?J67j=T$^X+w!)6W?eEU( zoy&8y{O(LTsW;P4op;K9_w`G4k;(MYRrUgwqa0gIHjgLo*4O1K%C}RqY`o*U-c_B( ztb`G9MXH9LnJLv_8F99-1?9Z*8k>rd zcJs6FGRdp_Uo{)@syA2c67gTV(q9uj=Qis2n~6#L6Mm07aC^}g@CU{_U(T7E3z_!I z-HwyHP33V~@;v>ps?G3(m^jM#%S9XAOPaveBu|m4`F!@vWN=N-d;q<0FJEF+dhkzU z`pk-hF{2~?LpHymCt#3Ru>tw6ro3+pFJWnpR2kzFoH`ZrP}N?=uei)$MBv}}vvHmd zoK=YZ*6bKeLItLGsGQ5$P3HH!;?94a<5%NH;5G~Es|n*aQ@6xt!rqUzeqn9ld!ALp z8%0kqZ~^zGm)KWn{@>{;9f0m zKbNQLzZKIj?VkV0ZXC>Jyc+jF4r{(KgYf-k207

      Af$V>Hj&yz1^4CXC32eJUDnd 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 krDe1msbh9|tUIPcEJ>tZp>-OLO8 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

      yAQs+X4=|t5_F*Y#>JbhF*{T-m&I!2^sm8jHqp@ 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�n`Gt2I%V#--+|5OPOvBS#itE{Tbu4^fdc+3c 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 z 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%0DbKT`XSs)7T!cPryHLeGRqKYEH`drvv=PpgGH6 zyXkNK6Aq?st_TMcJmvsgPbvAobPibX9Bvaf+Z^m}UiC*%A6plTo=4J@V{rIrK0V97I5ENtV_k3zvSon^x$RA8F7vNs(;%A`uIWi zWCmOE4cmv)$+@Ycc5p}!#*)3&5!WffIjTD~a5(AhG%YM6j}S3XeegN@^|(jI1FR%$ zn3|p-w^BGG7x3&w7XuG>l)xR?zg4)yY65p8&mkjYufZMhD=?sujU~v-IA{2XlV0B0 z;hh}603WSPXTTQW*b=*-D`1Nf*rG0u3bv@r4SfWi^qjRmhOFT(qO0`|@_ASz`JG%J zXZ&XTfwr@F8?!DMM6ul`RHo!g8svW`shMz zqH6tz{eHx|=GIC-DC4tiNPiAKqS)pDe|m>Z?#|xFv*bC{3uNtZW2qg+*vm&)$1j|x zm(ONKJSsdg-<*u7H6e@opOBj#zJNMDH4=5P%DR|Kue#F-YC&hn<*`}TVF@x7?bw$7 z8`h}HS#^rN_FFMb@2ZYrNH5qDUrSt>j>Nsh$86KHt>o-fU6X&S!G?)$>Y>z~$ix{Ha*zd`idIP%qH}vKBygzb)=^@n;;}hG;A~G*^e#pcoTh35fv9dVAMLrw- z;4chVqXgDSAMvu9bTu~S6?aG|i&4xX?}Og=RJn{mieC5oCERl_f7_7{RfwrvLSA#e z)B)nYbCZo_=z<;X#eKc^Bl7D1G`BED?1UaW-W|rs^Az|GYtDByJ*HG+I`785%1@gI zm_A%pW#`jjzD63>WuHE=zmM}?v)G6Jd=ByC8EONaYs4t7N!blZB~`&DxDk>@|2Zdr>SUY^|SBd0SL|2ftx zX7I8mZiVwJ{?x+R#;k-%KPE6ATPDKr7D~ULixAa4RLrLIJ5;zpGnz>=Ybde*Ae>2~A zlI;sz|3Eqq9}s*lj#)lgOnw+4<=R$ILz26Us z2`yp&%J-`W=F8Y?v6t1-Z0kSB+sD@RYx8h}b$#0RPv#H4KrYWg6|Fht7cC%H%dOwPO{ylb~mM9Y%7rIEd#w;2q!xk~iq6i%WWd()X|SOzrkG z`%5~IeC>KLFA2;G8!@17gC6!icY@L6zn?*e|Jk_MxY_u`_>vu3!dTi^-iSOZzcSV} zVx86Q#y$pa8hv8SxzR9M#*i`FxZ1eMxK%vp8a~=1#0}U*&ZoCgI=axQ`FLq&fbGET7|iaZN7H z%Qt?H?%K=1vxJL7FC^>sGJCKsSvl9UmhGvv?J20nuEdQcbrtLPsrx))4^-Xf2;(dN z{+Ii{VAROObUx@9zRaC4pLftZPuqj*#yA`Khw({Zd~hJ=37k&?=aazsz;x1a;$8i8 z25e?AmOt}9`tT(7>^R>&$UDREz`NrRA*b_}TCn7mWLx(BC*S>!e*aFK4PPQ`cE37Q zeR#;+kmoy)j6Ovl2IG9=YdZ8g{?Tq^U(Gu{+$z7cT5Qbsx{LkYga1`C_EGa=U%|Gw zizV1{werc4p8pAUr6V8UY@;WGT(y|&neq=ixZW=Og&kdQZ}EyR`LbgSJ@&f3+@vVO zJ+0)5ya98P#+Y%q*!<&c3OJkOcl4w19wUZ$w|=e_F~{IJgZxUNpO0Q%p6gQQ+PL@O zgc3L*a)R^FYCXsaV=Lv@OOd34ZCkY1GGf%O9^|pm&g;_S&UmGRs zHtL@8MDjUR&s$ahS1tYl8@-Kpm|)Bc!8L4yrq|0E7x_ATF zA~|+7$?`wyx%7}vBTibJI@5OqKF4SGpf{fLjPd6Na5n#Cr>B)tzHn0wY9k!#JlxN& z|7gDVrTgEvZ!Xtoe>Zz&H9A^PVP~1?e2I#>l@JaUulgIz)3NmXo!0ws1OJrzpFx~` zO}&sZeYdJ%G5+N#<}>oquk1Y|<^q=xJaseT8ssDfVWw5fcrSRQWOMVrv3cLnyq?N# z+{d+I8qotY}`aW1)9(>kwA?k}c` zBkq1&mM2T4S=g6<^dKJxpHz6o8sL+1X2@~w<^i8nz$X@DTbZB=zQy-J{-oa5T|OwPT*fB6EC^nd*%_x zlpe7|dSK-6x+C3K<2_?%(w{XpFK1&*dV}G^au&xqB^KC7ZnX}Fko9l8>;7sdCOP9o zj*&I_d)MXzybCxo>l*W&`c{ak=_Q(}bNBfj=+0q#uWo)Wwg1jztD>H`&;I+Xxth=Z zUV*N-+nil$KThSVUt(O!{y8T)R}ZThaAq&{$NWpgy9GQ|VKqLqJb!W>9TsEPY+V-% zaU~s&uS&e3fYGSx*D(TfC^t`^!F9^Pw~IgI?XXp;ANQ16TYK*V-`~Gy0-G@kb2}ur zAdf|_{*hl8xybRjCh%I$D>w%2{>NTzs_^vuL=v~nc9GXqE3!(pfet0 z=SyT}s{7tZUi$b&>(LD#(n*h*kNb>1bF$Z%@oIM_&~r27dyq`4y-T_nOM$e;IrHtFOPSH&*D2)#dd1WNW*%!nG1VnPyWkG z-s^w#^{)2QzdcXOy5Hk$jRytI6rbVnn#Iz^XRfOMuFpI{YqzU;-jh$+Z;pPTM;>$CE7=jc zG&t)z55OSU&#^B+jDg|Ug4r1k58AhvWdmaBtzv&Rd^VjiHO1LyKC`qP7EIIPPVaXK zyl5LfaZfpi$cOd5y)eUPa9zoVObEEHU`F$Bk=VnbY|dBq(1qk`U05>cV={~qBd+f~4PO-PeRp6ubP4ULhldsdP=MDa?_6pB)p{{OLw@(>7RsxSD_C1K-A=UTR zIfs96p!fZmd0)*O?Q5KB-#0w(Jmme4Mw^~|GpmYM_d1Ku5*ZXb;K4DpFnFK6{W zu793=yP!S$f@?o-zy8P{`^oyBY2AN8hs`S{6uj5D=65H)Va&zDcfpD_llPrOtH8%b=YrjY)25TJ`qxV%QI|s@gI0NCu5}PgLZ`7g4v3*YF zU5mdhkLYvwu+-UvZeQ`(kM^oDbA{zSgZfI(D%S74H>E%SMn~*pFUlLkI`q5$fW8Wu zyj~vEMi#f4!b|p&`G8`f zuk}MSKR2?k|7Tx3Z>;Lyhtc($n5WIm*8{E(GgqwV=QlYp_d8HQO|O&=U73U_8j+*94f<};Vo-&x_i9hUK{wimUGzN zusZU!Y!r)*2Shp3qCsGyIW`+JGK>+u3>n zdgUm-&7gDEH2W7HSGYMZ>6a2u2)LT)|8@9A)8z*;@7abO)Z>URT}p;a{CT-doL%r7 z>Xq1koL%C#HT7;Y_`Mzd3B|STfu=dT%i6B%-4|gmz7%WOkq*M)#a6-5x$lx`Kb(E4 zjz*7&k{pzAf2ota$yeJ`OlyG5)aj!G$;#>W!&>I;27cyuK0n=O-!8TECTMi)bWWiw z7NWyHO*0spj^7PCLp1cPgyn-Vc#jXlw{b4imsHkM>FDp9n96kG-`NYK)aB&5F zkM*^ecVj<3g@Jj3ecO`Wf^{k;rTunjDfx>#|HC@{hi$pkd!ClIlb1dJp=3ZVFM-(- zH!aKeR`3&4U_6GLRn?{maqrLmkMSPk+1_KUlRS&qUm4z@(&h45S-kioy5U4Inxmt9 zlkIuQ_R0qAK3wk^_LlRuIr%etw5QzL>u}l==$^~WzdmYWb9$Zl%vX${T_sD@7C1-#>Ik3!Hw&?KGGZx8G=4ul8 z-ORYyHQ>|Ll4@mcEJZ$g$iyo2UP?dJ?1~qxeWjG@N82wiVm%C;V&T&~ql?<|!myI; zR_qsvPb}aQ^IoI!3zcra>MFgvAYEG(vslBqvyXk6&;DA^dpzb@4)d%BuoIClV4}6y z$$!Uwioq6CaHHc*=oyCJ)4Ps5Y)DQ|CVMN;!P~QEv6dXCO|hX^2abi}o}TG?nhnN& z%J_LI-d&uGZghHA(^fcxS7D&4#pMQkjasx`e$@o_XNGxcv+b!qBkkla?{xrO_Xp!R zI{OA^*~h)#QpRtLosHO|_E@81TwvU2+~WQ3=Sx0rykxv-e9f=?JFj|0VP9Kem-bWSvI|4mhsGk$p_gufFE8*jKwo}|cqy6kF>j4+1e%1Njec|HdTImDd zg^P1WEYxIHVNYsmU1~65^=`d5T%6kGY5efXG8hgXgsaYYHtoAqMPp5^R8uEPl%Q;Kz0COW|AKnqqN<7bYp8eFGY5sqZ?a-4t zKCfr|n*k@MmjXU>`to=>=zMamZl*Xp>+oaph|LxofJ;%w`MLegZ|K(6$R!FIbi$r& z?f2pjdSh7^xHC5DD0A@=JMk)=@gUhhNgtqT_T{2vVY;c#kz*zeR7|WG_q< zm%w?Zhp>DY9d-_V5^)L_^AV0VuiLoCR@UY|`ulA5@1LIc80YF!$n6($F}Qi@>r7w4 zj(rT5Nhij7D0$Z} z=DJJtBcQL;>&XOO~7V2kMRr0l#v+HSe(gXC`iuChX`dTfe zyqSJ(<~;T!hNFWSQP1Jb|G9hOEyEMvb}za-!>#R_uyW1{L43K;r=bQ9P;>4Z)*r83 ztl=KVd+r6u#f$dXGS-_7<)60cc(Dcd|J-@}8tbx|`+S|Y;`!E@A@%N=nw3`4%A0ad zDIagZJ{<|~lDL!Uq)*Kip0eOvu8yyY-@6)C8#^~&Z0$#H4P6>w6d>odh^1jX*bO#KVzD-TN z@KQW6SpoYNu|V+N)6{`9#C>oFSnE?u`iFUcSSuNT ziA#;rfvsdl)=JJ7!_*%M*Io$t#R7h@DC5rj9X(fPM17g8$-hec?!&yDz*w3oudNY zF6UQ$z}#b9bAq!g;Ov5-$Gu_1x=Wm00cTgh*%feh>4iBWeprS*Ez8*zY7zCNB9m|M zU7LK9IsIJTc#;nrG5RmlmFs6|aW~!dxM$p+O!IKCF>g1lhDteJ=LqIhY*(MCbq7^Wpk}?;537X4>72 z7?lfT3>V^3V=owu|v7BlC&lBJ?t7XPf10P(RCDnack= zL4KHe`8n$Os3!71$3`U^Hs2QZ2Kb)r<9XLhyx(5t>pE)}HL=(xx37xLQbAKGlKynQfz_l)s=a8B+#dkSISH((Ni zAF9P%y#$}uhVEIHZP)6Z__Fv{$EzpZNgmqeffe85cZ=Epwklcyg}M|WR|ISoY)hy1 z?Sz5N+f#+V*EX+?CqI6QVo({^snu#jQdALbeVRhZqH4t9HGftnXK7W|PP6<-71ZtHk-}!CXC` zT9^4)UQPDq9{Co&{%ZPXYr7J8JHwm7J@Ew=;YiwGr<#)&wZqyucmn$YYnj(4n<<{A zL)FvrPKi99o$AJPCQq~DZmew=&tFZ4vzG(jHRNwvN#Ffl8@<3zZ=xfL=DSzD@2Ygg z3+Qs^pIe(vHsYzr(T{~{$g|HbX|VRsC9{y)T#4FT{9x+d@ndX) zN4TjhHVke`Z{^`+#0bR`}j#?sX0PUa`MjBrE^cxR{ea@*Yz#APBB|8 z_S6fBx?G96Tw=c4le76Dj`y5HJY!4#3J5dvRv}TFE17K!-_K6vV@=fPg2OKIKa}_t z&$r%;t?P5*PsmwLOb5Qz=n^kd$M0E}sL_?IPG;2Tg5jOO4<-L6`^ z;$*dmhv)6l?}TT2OXQI+7d?ruBluuv>(dS5$@E7)f-NI+CH3^=jk5kf)cgEm%>65F zjaJXgGit1>Wn)jb9y)%K{6K|EQOP{I>di(U_am*V|#ltw>iBmc8t9h)7?3? zgcvaT8>Wt}Tqj>Ye}lPs09$8_dtmBdN~+Q4?5d;b5H-h=5NA@fhbQ(eTHHObby~J0 zr$*U+V;8wmUmHKKzz=U{9&048t6FD1Z5%CY%}~!?IG6t020xAbVeoP42*@$uGx)d& zJ}!cfBYS1_#U|-P=wJPHJY6@-xHv*vK8N3#bpDI_Z-nO@U`-Xq&r$5!F6};&&R@oU zTfiP~%)V^K>udb{2bv@Jpv_a`t@oaD)#U_Xp;x z>BHKXO%cJ8iPxyh@BsV31?;L1Zszw3aZ;yP=LUS#A#~*-xoUDEf9rAf2MXG0nECdg z+BP{o_^NaEG3fZi>3Frj!~x0Sh`-tFF8HYkev0G`h?b_yU$?%o2V>7+JbN~_md^9V zursWM)CYqdE+y)NCGvY_@k;80CF+BjvyA~Z0;z&yMz@m>n5qb-iZ4v$ zt(KU4u#;djaxfNc$p&OF)C_yqI9EH7@3w5sR&W1r5+ys=1V}rnBjM z^Rw8NHt*P+$_<>67O8QiP!cXz;hyi5dY+|lF0Y&6y zraA0A^1Qsc`6YAbhT3STHo6j~v4YQ+avjz{xh#k0sd&4}?@r1!@H_VQ3k~L>Ngkv| zL@cjEF0p=BD~bO2f$mVBj1G}=h|KQf8W=434ef`MKRB!i4ojS3A%eq#jjzk%_2IDG z!EcLqI4nNP3jb$+mc{^|p6{$R+K~+^_RP5Jk`uKxniV(0cI3o}sy*Yma8wZ-l^h-F znc_ixvqUWbzLJ7GGS%oucI9F8)VXZ9wb`v53iNXTxE_^7n{$d!yatPhMpitfcRv( zHej*TK})VTuJ|^y9GC%j0fz;L4uj4XYh#POjlN?Cof)gWN59O@jpqx_v7HKP6D8?; z=E+0!objj+a)}ygY>~X$%<2!uZT4T)W+cyXEH}UB%JIwIo-7Wgnp}~WtAXG6AAbK; zvi7<@>dUY9vg?Ox+ZD*iSa$qz=oBOuGhcHeZnUH>NIm^Ajecjp(fv!2GngKJ!-8Du z@RMW>_DkLj_j@ncFEYvwVZ*|HMX+B{?_4v#Oso7kazoMyoyOP$Y^s4`6ZX;H%iEVJ zYyW}T9B2Fx{p<(z^LH9-U|WU_<|DIa5LX_zMyuqi(I@^|>xz}lNAOtk&&xdwueO5g zUaxI|d*T!GTf<%RhBjM@9Bof_;joO;x(E(Sjz;lBR?Z>-_^#BYK=CI+l{4?xTn76`)Tkctx=Ucd}U0) zT=6Tks-04mLpKL|+F`%3Em>9j!$jF95qD^v4-ds(RR?!x{iprmp`z`y`#o&d>8`!e z@2J~DUy3u-t}B|umSp=c#%2#|tZS`t-Xf33qW{o47aA)=jf3&z=st7iL;4?niVssx zP`?E~#UGuw?=BA8e51BnqP7}eV|%hQxeW1D{O{@jz<(Iid2(}dp&BK8EI08ZpHHfe zG0#6t2du?D34WGgWd2XuX%ln#)qdv*V67Q#;p(rkU%KQsloyOl{lmNb zPUgS!4o8!9ckr8(?bVje)AjKG_56~PGx@(mJ8V)YcxI8Wq$I|qWPhpzhg^~ya$49o zf*a4#yKU)bd~}PGgFlgvQ?0>PWn-wPmZ+y@ucIXY$~5)-CPcmXzwWDPv)5dWzH}}8 z6g*~5Y*8zDZibmNru5U3WZ-e_b1u7dE?agLx<;Kder$EM%!Qq~YVv8&RoWOv$~uz` zPsU)Rv^(sCu>m9Hd|Fu3+RIg?(QjNuXS~Y~G7BFs@j=WbtA7>~d%0t{6XUQb4yTXn z`|>f(2>i0w)xq$5d3E67#Y(}n+(h;drUQ?}*Q>#wZeBgxxc{qu+>9KZpq=~h*M@f8 zk}cciv!&?OYdi~PDS}zD-yj#UHh^1-V3s17r3hvzf?0}SmW&F182!33d4*RBbtTeu zjJL6Dg17Wtv%Y%(9l~CG)_cGwMes@Xy9yC(l6kpP4eS0{{9K5QddPj#*qG{{C0$7U zGvh5y)IZ~EEXmnZvIkm*5o$=(Kaw z>2$0fn&(bQ;3fHltPhL@80PeC_T?62Z!7N%-<0{I;G4uk)R7~xTlx*Q2^KV!BdWwd z)WBZp$FDsj%PG7HyJuPBuaB{D0sa4!zpEFD{P{4AboE*EY>V-AIvsRQE*7s}$HwhU zjy8tRU^`c=HHyaMhQ?2SegC4rA@}n%6}5XS6h(-iA8S-N^gE znacqZ_I2sf$F=`!C^g^N@3dx3+>@j$ql3|LNPU>Bp44Ccy%Rlxp5ceNQ=h>lW_$5@ zw%izGKgb?GEU)jkM|}CPL}}WJ$gG$qb-d9}sK`gq2knS=}mXVix-*$VBBjzq_!^Uzdu8F~`EgFZl?(Kl<-H*2FE(4J@-`VUHcw-MSL zZGpB%dm-^O)}{4uSoNM)FE>j)+;aopQv)1N1K(u>|4V~BC=KR@2Jv_ebX0>p8olkM z_GT0I=5z03toIRf+sB;W$6B`!+q>fX3Oq!GkFX*Jrh=ae9a-U*sPJ9%WpDPizub?{ zWjdR?T|J{#*m?6zt`k4GEGMFU1#8NpeQdEO^j(h55BTI3<8H%Tn|vDb!jNULF!l`9 zW+cM_2e&`j8bk&+BS(v~*WMx@a^s{|pr7^G8NDX4nez0Jy?go7C`=XLX`As=90l1}-`g zpJ5Lic8*P3%<3k=&WW2&_?KXF@dG<2FW7iETdA64HkdBj|~ z0-jdU)|Z*XLp;Nn7%JaySK~xX4oqFtnzZEOEJyY3=HV0AbntERUbKapb=suOy1$Fx zo_?fP@^PCwgKF31I{1*))o{%Rd9}RFVZ*FTUZAh8pex47Dz4w#RsYVrN8~QlGP;g^x+r_}@7n(m zZFNPQ$mLoVPf`|-SWZHX#{*agN3z3iCtqvTI@XrU6gv2S*-T^-4lc~I*2ZdqvI##Y zuN%iX{!ukNjr~vTGo9}D_9m-&V`v9dYwml*yf>ZA9P$Qys6W?WSKNx1=W=cEM1{my zRToYTRx+wao*Z>0_IFAAb=f{CIlK6TL$}d`~wFbpO8YpTW0c#STB)4Ck6t+pg7` zE{4gMYmW^ETPK%QDa2jcGcKh2vkPXRf3h)DtuP-I$ttWe-@+=!)0_HmCv*9!#`Nm` zwj(i`u1n=}V3VQVco5f<4)^&iybLzaZiTi(m!c4}(~7F719hTz&<|*|cb{c`T?PNE zqh=J^qOUn~V|2N9+QJ-J<8Po zca^^-_;o|P_-=8lTCZwf#dTT!d-%O*EPXtIZZDDNuuuC78LrU9OBr{KXd@O>E!&hw z!oDaUD7|^8F;VdBXZh`}r6W#}ceu=MY-igBj3;~_EWG$mI^XVc1mDLm+-c9f*?xK( z|DC;b{d${wj^*d8W3z38&w&52$W}L{CHaE>y3FwnWchRc09c*$s<PP%Ia6Y!{hP!mgT8y$n1W2JnvLx zkG9ZZ>e-8V>FwTg-SaD7xf+AXV7Nf`zdcbHYwMEXbkaG-@ONZheL)zgqL?H#q+ENI zIZ|!Gb|r_=jPQKr<>IuOw=Dt zK8%ZEpXG7(Y&djv!Ql0cFEt1gH3*a2=s~fuYD$#lh$^!qy43s0@ejj~=rh>2te#X2 zJrVO2Y{u@m#+WIip=czT4Y`4DrkD5hUZIYFT7`V_UCDC%efEO*En>dI96O>A!M(9_ z#2KN#>64p`nR%YsM}J&`9xyhxFivjp>|f+W+Mhl>6fft|H<$T)2pOEA?^idb@6rGB z$Ww_ezczjLWSoz7pyTJp?McXSzoBO>YHrw&JX~f^_Uc~tQLP29EvWNMcJHTiS2hOk zrz=+Wo-k|XP4TK^9d0dxTVs*6+dnG6AIqCv$crm2@+0sUx^D^NatJ!n*z0e+?PGk& zvL3Lp;+)kkj^#I{8`VJ6hw^!vN5|p)3c9b$-wo`y%+s&CoAbNK^(N%*`&@@yV&~I$ zaNcC;VEuTbHdPxj!*lJ+W_Z80VqR;eNA2y?+XtFomaJ*daK%T`LsRLUAB<~*0roDJ zo=KNK?stOjOSSj++WRE$z>k!EqKyX8IWM7aYrFVobM#t~y*J*TXEU9nK9Ap5|1eqJ zckp)hq&h;JVurPS+*}oEo^MMwC)BnDeVYtoBaBD(mlCxRlhxT9o7>x#`$>$wI)UEp zPy7@+)wWp=@elbun7Zg@Hik88vIGCcZhT8&owtaw)JkKIV%_REaiAH&$j)(hhL z`C+bSQx7vQ^wO_O$}xYc`_wc{)HD>k2xDd3PK1Rxha6V)6U?0TyS#bc_fKT%U-YH? zq-vhVVmx4`Ja-$v`J{G}b4ILbYgFSm_c9O7L>~s;ji+ynfiKuNXZYQX?0ttAB~j0) zEz48zT~0nLzK`SLPH|Yxa$Q!FyV%Ct^Fi%{#-dZuMd(TtV%U4LjR(?~bG(nN6W%GY z*PNu=nP*<&zpe4!x6nl|=nwcin6U!9{$zP%oB4TTd*Ev1AhimUhpgk(DooTWgk6M9 z;)hbJFj1>8DbgMPr90Fr6w6#M2f%cFUyaTxv_?n7lZ=T;Fv`_rU?GMpE+qeiYf^hq z?K)Us_Z-+YEqS9_3eU@{#7BSF?$>0}r^`xqFAd0?zl6| zOJYXzVo?i;+Ji|QJ*xJgKB`L|HRi_9c~8-GJFp!-#jo0fuzTahGL_9y)kOV4II1>y zg_s>Bf0sGqPjts1Ht=xm1)rVS3&*m3_S8N<&_N@O>xt%<7agyh@57%q74{*4V^VjS z-3_akVMUiCmoHl*{LQ=kTRW*Um>h(6 zbq2GV@3YxW2b)_P$@2`dv>9EzUrY|-X7%6l_961=WBF=&q;U}PB*O3U>)S^%H`JNe z`{wOW>))~D^$9kaT7t<^es3vXb(nl-W(?Y`q?I=nPne0c?|yXZ}=rY(;Zhqi4eES)10uTgm@pU9=P#_+Fc- zNtmcfm~2U|7DKo3PpL_ms7WZ+Y=V5WZRr}`XI(nCl?}Ko|Eck<#(d7&Y`pf2Lk=u$ zN!GO4mfGxyy!=Qo2M^)*LHh1P{hjB>-?mqaymL8wvT6itd0q{}L=D44+$a2Vhq=F*eH)Aa5Sy6G(V=|8Fc&$x=niss zGrQ)W`nzOIJrc`}PZyp{m*1VAAQwWMUP}j$!^fRy7jxgGc)y4aoo+0sS(vC<2=_h3 z-i}<8xt8R4^7?o70gRw{UGrvKRP#ZNPIDcMAf2f;8~KG1B(L(a7$Y!(u=r*E#Cm&5 z_521QiiCw}o(%hSFoMx+zY8N6>~s6GT_L_qy()14u^d(~=6v4jo$+bJg+$%MWOI6C zd$bc0+n1<&XfCTuHZ@k&J%m%Jv-e&n{yc$CPGDuFTSV#}itR|{u8`vug}g569wzD@ zCh8t0>K-QQ9O5H*15? zt!L|D=qB3-E2g`eCoiA}?#7plC2|b3q|1p3YcTh$pMzf^PwniOi(+<&_iELr_Ds`% zIsYx+&evK^PS!6KKJm%sj}z(VJ!;{G?DrdUViEG`8RYEF0z4L7@Rqr3c1|q?vi*#G zr1On`H4nv9!XtSXH4pV?zkmxhep}c|_KC>OGkh899wuhz1U5Q3jE>#P9I5W1dQ6qB{s=hZJ<%=ba(e1%ewe}bEwAyrQK2K+p>~E`2RZVd6K8M!v}So53IenNSl%@r5* z8X&*f4DBjL0VchOci2R2WPat-n4v$mCF^1u#Jf(^R`PIacXb!po$#bJGvq?#D`aEB zGNy;>qYy{^u6J6+@4im&Ey0F)fKB;0e^%ae9%O6pPrt%6Mlg+0mcM|GTf}{bz$OLk z-<-H3>_b?$RMV{saPaiT1Lg$&o6N7fn>Fhl{I6l(7sgJ^t^E&U1XdgtqYieiE}D&Q zM{l8jp!evm#n6f<hoq^6p=c5bIZ1h+D8u^RhcN_R&8|*VSu=g9H&#YeGL~o(b ztP3tNhTrAanoS2@jc)V#D6+P=b}xsxT)w}=JM8a$jwdf-7SyJ!gLxJAq7RN2W4dWg zH46C46>8i0Z(HPisz$HUA25)7ck<@*7s5bB-;trWt)+j{rU$SOJ7YP#>C*$q&~fIg z-QqU3f?Nyi`x@hPoOa%v+`bw1P4Lj*K6}pTLHwRUe@#Mv)+Z0S_A3o#8BX~-)_*8bp`Fv?rbG=#(Y@QqR&pYNZ^&%5KwWyb8?dn5;Y4(r;;-3`<1^1Z*a(rJ71bcn|qD=>%9y zarrRe<|J6lU^AxY^NF)!%muOQb5?daYlNH}$a!{J-riy%g1NN5FGMhx5zM6+NpU!y z33F+0Ea9U~=+2bglp6c$`{^&3OBm1+eJZZboC$MD--p6ydbTf_=^Mda%7NC; zZ%lLjgb@3rE_%Ct+79c9989Qp^}cFi!jTlMW%$#OnwW{2nCcQ!FXjX_G5I@6$)C+> z_tKwgVj9y8`k{B08vwR1YW6O0n|zG&C$g7r3O0l_u$X_gt@t#*_X3&No<2Xuc(ki% z9I8{r9-c|&cXVH{yhV8W?);#~Vcc?wx|bmjF?(07K!0yUea-7?Uc#Ie`7erew47^f z?gG7~=4DokC)6bgxq)Fj*>Gxwdpc}qmJ0;7Q!9&Egk{*tII7_@(`xo9V|%D#dwd7y zX^%I7m5bSJt@L9{66QW}iIKQOxp4EaE)&$A7SCh+z3aW2&`bPd8cR9k^>q@!VFIHnW_-OV)FQF&cTX19iMrnpqddvELH+-vWX$?`} zH!37*SteJqht#ozzbUdIi{hq>-m3@)T@*7`l#{4v54NZ_Pf@+^Vxo>^0*#)0k3KX; z*4O^(SgH#tC%Ny`v4rQ5OO*_*s9&~6v(R&B5%$#&NF7UvDuP1LVU-Xd%2 zS0?ILnvY6yyqCm4m&{2exw}hh(Ur*_pE**$GEu+MoK-J2x*<`&GEu*h4c?buy088G zY2>;&%WDK@nyrgg%eBEJ!5~^c|3>FESS!Mk@;S!xxxh489tQjK8f&aG$znfxWK;9n zr`Ez_oDZ@tgXV~yv@ZV}xy_qn#_1!zUw<I&)?%oA`BYvy^vJZxWuhQ;pSXhRIr$ zAM!nN@t}UZ-`ej{b9jU2hW(y%>BtHh3bjZ+G)J#WzaFXINBb+DPYh`xy_T-Mjn038 zZk3l@Jc)f^ewDBzSj>U+b|q2Ij@%(baq5`%2GT)I4$s`qpPd$nKgk zTxm`o70-Rmvqq5RP+Mv{-+gZm*wWma&}H&=i|Lxk&XE7XJGPtC-lU8ATN51XU2Zk^ ze(robI!K?nzsvd}=Y8^W|EL{72Oq^=qY2m~vHf~$A$vG431y4;qxzEj)m{I*-+fxY zY!%1J5bK${*eB{)!fA|`tD!YHF)!xWm>Q3MG@cGM76#>8(^)=0CfAbe!hi4+*;cEP zT;}YP8asI3ML&j`7IU=m=lJ_CeoizGoNAm-)E*^c?o;pax&D93Y$TT}-)|Cfza{Ea zniq@*bSoKGr&3Lwlzp7S8l;IDm2~I?_Ihh{Fxyz2$^_2OTCLrBClSja4>0+HSCvb& zHTocKmP18tO>5E1w9Rqmp)N7*`?|kVf1DAwvjbY;s#-#g^JtS;&ZE3qKkT&e>Hm6mV=bMto_D{;S~bk0YvB2M@tw=?<=wys_cnemwthJ!S4|#emyDs8 zmeJ0Wk$RDddXY&7oupo*Tt4k|f2{6E3%o)s2SW@)JKj80NZ&1tPcP(~uJ)S3tIz>E zBxch%4Kb}Rk%wB>e__qDTRsmXB9|e3_k`b6*O70gs?JDza+3Ce(`0+V%^tgGToH5zT$6i&tFV6NLH!{XA&_{0>hd-fu&kp-g{kRYCY76WJtBnsFz!? zKAmD8Xo&U44oE$C-&Ob=r@=zB^VL<;U9BVR!KIhV-5U1jTD05RaxX%nL4EM?2 zgt_(??$aFG09)0Y9QTgkKG~lYwpK;Xn~K;ySqRxtaG&Bi`*~Ww2<|h2`y}}@9K~V| zVXx^5xK9}6I{TU(=5gyhpYO}o+K8Tm>x|mSzcN-H^X${u3?VMyZTz3iwp-u$m|~qY-23lL z7S~`0ALp|f&d1WN7dYPA8o6Q&AIWAO?wZ@R_50-H9lE~1b<78RO(W=#`(iPOuDgN$ z_=Mg18=gL;>+eIapzrt-{>h(U?E#zJ$C!xiWyovgp8fOHXpVP$iCwoM-F*$2SBsM$ zq>wDf&iFUGO)btuElz&Y&SW`bSDZiDg-gW$P5N#g8f08OW^P-NTsPwHW8*`ePJYUS z4@J!gW9WBw^|pBXkZtp|@%fatxIw?R)J);0RcC{(p*AO+dV6}BHvP)=gZ0U))_srG z(kbdOhCFcRv%OZLkM`CN+s1IDvAQDs&>!Q!jlR8xu2)+#IfyQMOMAh-SOb^YsAc;` zWoz~>eu=i=OUr7kz+lRc#%HYGuGMdEk-NLJTd2SDK3RajRHv`XUnw^w8Q-zCPqYm` zYdcw*LWXwC7eoDC_08F5bm4tS?agFKdm8QLmAkwHEM}jzq}X{?*fZyCP>ZgxXq6LEX; zGt{&Hror9CV(fBq*yIxRHj{wievHqqlg+2zCi}CRJP^0=4>sE$k^h^I<}-8DOuBX* z@7Lx1=+pF;u!m<3ygKMa@A?*9xV3lM!QYkXwc*~a1-)$@8`esj_o~1PiPNBu8|{0^ zBcxVMb7Xxlm#5qT-d8QoaSlHe+k@ygBMI<5w()*gn`mpWWe^YH22)^80C#FJ<=yqM=>I_X!kH^cnsUt zwB`)hzdmvq+J{X_`e1}UgG-Cx(z05iaB1ShQ|r%?eXa@o=}Dr7XR@fVa;3h2JGO3x z+b5eB+mFqW|9$bA}!5vwM##OyJ{*VPayn;?xLWr@YMOXhF}iF-D@z(6M}aiM59c z9rSl!KH9$a3H#FDeba5USA+H%rC-OOJIIHcmdT>@K!^5uU4N))$%j8#?zC!hqw!NE zlPA^I!;f~^*A`o1j9!^9(7|o|)2;BAa@LU}b-Q8Xk}PKXK<(M7jh3*F8+<_UZ`K0x zmzjIv-?BU(e3jOX;sNQRhxD_$mh@&vRxfeOUTtdAwHjm9bXz<;tM99HXjsRqJ(;LI zX>FXS`COljmTN*@d$wvzbdqZ(xaOa9!MbQa*R188)SgV#o|GS}oP0?)2mSh(x%akQ zHQhAdmNf8rgjltg%s1bdJAS8Uw?n7tlRe4x-P+(~f9I0#gYlIssQZy;tB@bqIeU8b zusD5aNqgPKz1eEp=LR!1AE8_4!Hoyveu>@wD)0VngJ{@;tG+ z=2Wr!^w#0z`RBa-D}IkdwDW(Bzdgy%`-OJ(>T`ZGFV9m!4HX`y0=%T(sYjcmwaNdx z;)*V0xsA3rdabtHBj2uudYkyTynP3;Hu(;=ue_**4*oQ8M}FgKw2Xe7iH{pmoi##l zzXPwv_XZPV9K)-rSJ8pr*xI`4opa`%R&^+H)?h6mhE(l8^ESB;aem*UUvsU|vi9hA zpg;Ea+g--;r|gy4j{l`UYMs|=^D0~D7V8V~Q|!7_Oh*bEXJ5qFNQ}#i{k@dzZ%gji zU}tYj=BKi)Lme&t;%G5?GUOK>Ku3M+xyzs@QHTD%nIHX7y2>6`s)n4nhw*B#t2azf zz_>+lU2K_pxo8^fb~HqPHU_q$e_`C@kjTMd=Av0-7`{y%)Fgs$gZE4Mj7z+EWifK~ zEakr1s+vBLr$g8yI~X&&niB@{D~~lNtA&tgdwZ58Hngz9PO@3p+g-t1KVRCVAJG1rOx0Chr*s}oR%cN*cGU6}1XZJqCcKP)8t+et6J zsZ(lrPUyIc_1A^L6=O~aH7mtwh`GsSzW9%{<=1595dE3g#;=kCHHPV_K6Gb=9L<1(c8IL zUgVthVO}0Ob*ioF)%=A0iup^`)8yP=hQwlU1kH{@mw zycO}eF1b__)cT+k?#Y8m(V7nEH}pRy@-Eu_))&eaEn(`bQ*QP(0bM~gN3 zW9;EZcF$I9s5<*5znc60ZXLO`<5|YxJimK@adxv9wRO#dN9y;dy~k{R?p6IJoSHq) zM2=JIO)?nrC&Q`9Yto$MD0q}T^Mbj5C-<-$;V;ygAs_H)5j+}ft{8vv43DO!OGj4A zJnV~|NEVhP3ovL|PN;xETd%e&TZ6%zsfpFeU)8MkaI1LH*qoLNb*Jc|LS{EVZcn*| zf2*C2>*upZBsM&?=9F_-emVBo*T((^-tTPs>6Km8o{nvi>qgEjKQwix91Vj zHf8tSqVHZN6EJMi#j)5GdqkT$hg;((lsBW0w{O#KZtoo(Om`oLPPFbl)f_j^J-f4W z!rn+&A3Sf}a|ruG%xLb?Z`f_CQ2lpHS@3F3R)PLEP>Wzw76l-T~^P7JD(OTgi^UCq$U_TV_au-+^ zstuRl!alQ))dXR~fpHK2S5%dMSmsEhTw&O33Z2W~g|M-mrm_?HR>c zZvV~o&*$EEL%Qj2Wc^BdXBjdTd@XQxZ1y@B_f(y=sbnS}wa0K&xemDw^YBpxH5aSN zJ+Yij__hb0`OenC_dduTSh@uJcNgyv8y`m-|Kp5}!`P$S(Xpf8numC|qoQW}NX=rb zn$tJ@PRL)fHhPA=bX~9)-G3K4&e%G{{^Y9qObY9W&B=mx~a>${s7m(`dNR$E9l#m>5KtvAXvYU6Ew?9 z0p~|!waMFHPu*CUt?l>A+Z(0_H!z0ed9psJsxwwdN8qbNd+bU-?5s^5Vs{+JHuy7{ zGv>rn#B8^g=mk1uKk~LXJ@mpYC~rHP=ihYpTXB^i zPo6^W6MTJlnBxN;Uu{mdt34rft^QY=Gg(x79F(u7BXjl}^q0Dv;wC!DeqJ13-uy35 z0)6uo-4}FQV%x0CZ=b5aYP7jr{d|k{V#)ew>nZkhS_7WJcqvAMjA6LD=-<}+UwN;U z@;UngIk`XbS-z>=$@t?z8L;o<0hw1Ty_ zy$iBfCmz;bkK?P+>-y?;eLO>(t&Nvm(8=f)w2aTrM31BI@%o9e(4;*NKMgPVFCZANMxiV{_nWe~-?m@a6Vzz2AQ5IP@@j!MpzG{nqquVQ($e-8stm zU)H+?4B4-Jxq!sX+;BOWDorT8ZX9MlN zC7uF?aZ9@PT=Vf$bYX#>Tip3nv^=?0BQ;qXsgat5`0TmXg=(a#JD%9*O4R|I$|oRS zExB7tyNT&bU(2;wi|56e6w;w|!>@SS4nH;M9Q04Jav~D9U~f%KC;sl!hR@^mHGGc5 zW2_B7H9y>HoU6ZTZ7Ty!ZJXF0xoE5-meq$rKQHa?t~p%O=l>!P%hGXU={~qeHIbnN z=nS~WY>j=rcT;l}<}Rfd%KV6Bd2Q?M`!?9Woty+)bg=bL$va#VbOZjE#s5%t>h9ig zTei9ys>#R3mKv(|9K}Q+HB@2x*0K^vp!It4OXrKpIQ;?SFtx$5us?bZy7ptb>h zq)sY3y-N+RmS{P$AL8E*D9BHZPWK*HT7%q#UO;c4H_@6n65M=AjvpBq(8b>G zVeiJj!meu&AKBo&8m#FXZlT%wRGt8R47;dCWED2lnv|~Q zGvZS)2biZ|64hj@s!!4yt(lLLCc60gIEBfZA?=4!dz4959~91zKhrvatsXMQ!5PXO zQ-)bnvlqb`THjS7I74waQ~hmGgIEm}ebpA{^aL!d=g%UOaE4ipDLBIj&XAvAioKE6 zbRGTBmoFvnJ~%`BIL+*cwsdv&68v8T|7Sf?r00u#LPcxM)S5z!p7rCqZ0_r~FxY^a@Tj%1^d3%Ek>pW}Cw z%U)Z)?Gv~{`GVB+(l>C0k+`J@X3%=7Lp*SmZ%(W#Em|=TZ0ft+*)_-6TY(jnzd#;9 zHuVF1*N+<`aOE(jMe%9v?9Eu*NQ=GCJYP_=y`iFfU`4WBP0q>X;5o(o_|2!ie*>wQ zV|;GScPBQ+@4{~RtvPW5Q`4N@tWRMH<#4OxTjIy^zq}vTVrBmI`l!~v!ERcy2K7gS z$WjAZ3$2UJLKl&(zS=mfxd-IhU`AT$)?8*|jM7d|XxA0#r8BJocGU+v8B1GO4=u}& z5@MWS0{M9IjS2`%yp&oj3ay)%{hdxWl*Am`2-Iyo5DsF7i~S0Bcq?7dTZyaNW<6YQSGx2Us|KACCjl?P``MP;5`azh!^1kZhHQ)zEh8 z!}4v)@l3Cr7q_YnE{{h}JRv;*H)suBG6zo(MR{&|xompEl1KLtbyx-=ENn%N3eK>NKf zc+6jm^KG2%H`S4aCoaHk71X;=lE>}a?P}hGy<^|D$$_t?p!S2kgZ-PVSJkQKE8$}h zyAYG%7zS8vIpd&@v9X%p98KQOHb%b6x568=2Ygd9l}$OE-THzx*81czs}JkFzqbDg zp9HU1XD(2q8NtEvAO?d z0EcUff6%qPy^Fjf){o*J>8j7ni)zC1W0dI7dhyqNjDx<`A2X6Q$!frc&0;&Or%!%l zHx$i1>*&*atNbOu%c>TT9n=2ANJC%(tr1=qK0gu zhAf+_KR@0;*vSjvLaNdExfc6GIXD`*UeFBhH;{}j;W_{0!z%mzIp|ijEC0wp#gLZi z!Gp9@SVu0+7NAAt!4N-9Ztg^fv1_-}U+^B=z@^J8LOxE7ba&W|A zM?o!zpW&wjQq^|Q55A2ueO9lt^$e8m4dVawBTxxysojKuneQIY=+jdx+i%E*xlTZ_B7Qgim##o7u(0*#7 zjxL*_L+-8Enp6HWw#?$@S9m;eqjm5!Nmfe(9uLk3mKnb%n#oQze-(`vwQ1qJ<*sy*5<{A7T zmyqlG=#@J5fY>{2+QKeXOUZABoJ{a^_Qa(iXy0djYval5~9doX?Tf_3M|`gmvZq8@F+-jz$G2!mXN z9V?0-mfPNZDwf-RSPENGGLM$|8p~|3dT%XrntcoTWk^DAtb&x)CKi;u8p`UBm&PVHpzm__?H zQ>@q3K`p>y6x!sUY>gH*HyvzFQu9^b+dg9SrzUIbt$omU+UszA8M1CIgVxoLE3hdC z8}ZO=ES$cM`$qP3eACZSKl$qW+k@-x^BK_yzXh)t!7GYaN!*)=VJ=7Tiedrk^~V$# z$YvO&*czpU-ffm6uZ6G9dO4r)Pg#R{2kQ#^-etL&$}l)|plbsrW_fnh;^zBMoBKRA z@yq$r^<~BPt7}Dnt1p{uY3|sAT&gjf#C)4` zjD^#Ut&gqO8`(UE7#H>*(hqZWSzPB!o^6hl14Thk*h6cH*_Y?;R&8F`q=yq zPbgMd{Y<(*o!I1NzkL=vyh%R{XM3m_8*&iHY1GcI5GVK0BPW?_Q}5G9-`C^w26o$G z-eV#kKy%tZ;DU7{vW!ruk+f`<8iymsZc(wBU8NL(o2W@=2QWYv6z#=7PqBwx1u=90O+ z#NWw>NnX|`%VjdNCbD*;YwP9kXfQq-_(FTbiB$CCwDd4z=;quE_ER;fvdK>>w8LV` zIiQ^m&|d1uCRb>$pR~bg-n$;{Z5=SjyWZ)&=6Ij!Wb_BWf0&vKp_az-?o(SQP%GQ1pm=SbRxP&eu)qL!Y6zt^JubD%oRiUJeD;6N12~KiW7PzPT07~zOfwCxq=+3 z#iT#m=_tBGy;}BsNe+;*IiZ}WSIb9HNz|*gU)e8Nj6JU=8h>=V8gnIh{3-Uho1>M< z_4#z%vHnh>Z-(#(^fzY5m{U)HLEB$@T(50mW7HCY?=8s5Ko`Ir%JD4*(A)-hs0L=@ zSt%XBQ-a_Q&26nPss%P@yK&JTa;#a`!|?Q~rjxAa)sanx=?`^e!}>=oU4@KKH9q9C zFxRLln~1|uKdU9Zz`QxuT79Uorw*(bgf3$~wVo{5qo1DC_|-M=)JdmLWKY>6k4|L+ zzU!Soz(4#TonA4Ez)KfONywF?2CO)SF6-rLdJbLvAldv6`!3kraD{T4h_%kQWw9)3 zw_i&He1uYw6Oj=;jH=P{`|3@7~+kgsW@M)$JMH=-G>E$9dLnC(*@c z>ep}h9 z497Q_Z@g6ub6tiJ|Cx?#w0>G!pUgxdZ;9BnEN|jix+cVct7#f?R0P{jtWr)tPtZ58 zczjWvaZB2l9kZqJ`3+m7ud%0oX|kbqdRYH|%eI#%4Q9R-hAQSifLYSNQ)8c##n+7K z&*|hj+7hM^h5*jeyFYJEf+w`^Ki()&o0vakBpKd<+`;bY>+#mwvAu6~VDW!-zB7Fk zf9j5kwaQ1G#^URRinf_zpBrwIoDOx*0Q%&Md_LrdPQPaJzfDK}Ku4{rPZzV!IhgKS z-gr63d;{ADM^iKxb>OTy4LNew5@U4``GfIO<5KQ>zjdHFlZF(qL(fl9lmoj-i)94Iv!9kHZ|~dl{+{f-Y+kv-8f8~} z9*Qoc%a_LI8|M0>wG&KW1QW=Q*eV}v3{Mnib@7(*j#rbj-RWoj67+!j5G^o3)|6!A zI`kJlF?CJtOV=gpn!-GqbrS{OUS};#=|J1?|3-m?fq7Z=kIU-64u(jo4s`N;7HFr%lxJ;D}VL` zbDW$?WVeg1Q{xooz0Mxuc)o*nI-xbXE!P@7Z2vrrUwe6UFnvLGS7f(rPfy&$R(O`~ z97WEK&BxIbw1fSVWDmCU(ympHl)X{nqwfm(L%d#V)XWZiQ%vN^#^y2BLJisv?$5fo zP7b*wV#CVYt7f9VbLs7a`4ex~)?@hLkIxTaL$s?sJziY2_SXh*e<23cK6}pIQ=Yyn zBOk_t^({JPU zkk>=K!CcVSd{OEnXs4Zxqf3p^#f{l}tXn$i?y+WRII6eEfDNLY!1u_q(7s2VtF;;2MKy`sV^%SBPKe^WS)3P<^;IG}V5G)%GZ zw9ATvvy)Qc%9WfnmhSaU@4{2zo}qo;aL=H^sw12XtBk0LqTz+_*K)FG_RTVd_re1f z>-&z&RPrjW=Zd6wK|pmD+a1>iK8lOi?(O^dL;sX_UL}g^1`M3zlHY&-y`j%Dfv5QP za7QIS>+4=oWo)gJ%J)*o)KvQB00b*5`M0*RoqyxX;r`84s{YMauJLc7@{oUvm3RDG zS6RfpN#z62Oe_EONvX1g=aefO`?tO_#=i}fGyU7Ua*2QYRPOO_rLu%D-oBML9QUjA z@`V1CIi4_}a)y85iffM85HH)6YqrJM+!a06e=F=X|8LDDH7~AE8}<8fZP$!iA{>9W zQd9H=>bKbw;j;}xvz@$hQ*6rg?NPtc z;WxKm{dLcK#QB}5|25&>(G7u(v)62jwnPI)|7zc0aBb9orE7h;WA@-j*KUd)L<0{# z>Y%7*r#|6^b=GN$e)idbalhxHF9u0#aZ*&XOYbxA_S6QRjRua5YIf~6(#0EY)f7Fn zrB9BEYIe&$d1X{nGz$$p%oBIdKDup(rsx1PU?k_+hJCPb=+ao&dq8-?n!6~hh6WxN z)$BVcw7^%pHANeu{`vJ>wO{Y>wu8oaQ`CQ_b$vD_`|M2TqtU>z2mAH?v(FAZpefn} z4H(|r2>P~HH1NO^j*n_is)UEkJg_Oc8uj0Z$kv>kefA&cpP@mQtymjPT4jD$DG2BG znp4xkbA5W`K~2#SXz-&>rZ|`sPVRDYr-R$W$&F6lbMPi=4EHwu!zZl=H$`WoK_{*B z$Fmi~3eO%|89d#mYaY@Rt&RqFI62e7=_vd+WK$0~aOG~%A(`&kr+oPLy`sS_zPZI^ zGsAtSI9ct_P0ftbTY?v??0>j+4C|?1`d56=xmY97fTc`8N$-$ER2O{;Y7r zicSt2OHk3^C7hglWK(o9Y7Cb*ZSIrYQBBcTK55#~$yZL^LPNfDa!L2IDU5odOHFl+ z;q8kn8#hNcMgKwbue*FfD~+3f-NrrFZ91+g+5kmE_w~FvzHQpi!E_%@Moot~dCkGx za81_gK?+{zeqLSlo;zv|N`DQ{3zD$iF-_4nD3gR^9gGVnK@t|61WCBir_)hmxIdGG z7oEL;GD&!OL7Vk%_(Kx%$2LVV$|PZ32Wun$4GAoLzo02bhFcC#C;iaP(*Ca6FWeS{ zv(-U!I0-Dxc5q!d2`qi$;3L!+?$1~nd|ViF-7Mw11-~Xbdm)xa`+5}0SgJZ`L4l4eJ9;ie#C|8>nz z;ie#Ciyhw-4M)+i@bXu#I)4-_5zP%Fr*}=c>&Nc5-^xW>pzQ6(IT#yG!rR~M;D&G# z-hQ5gFHvK7K=$^FpU@O7in0#5srv`aS$+IK_t4ze*L$Pv?Jsn2KI-X^&sUqzld$D* z%Y*5nKXtS8fUE8cw}lS**uneZB(SvPiGCAhEFI$DAk-M{&se&^*$kAilv{oN^Np*8 zSbD+N&!LQ^{7D1`^{}*P_bt${;g*NXxAm~JoU2BljHMkMY#&YnOQ$(FC7gs-n(5$L z)EMs1So*uO*HOmO3JX|Tsq#lF^**^Nsz(`1TR7MZ^{_N_t@&?J8;uFKoR@C#b9XBp z>8c~bZK0K>IhYhq0!uGDcp;nwminF26je}TxIbfQb7z~PjHR`@pRbh`V(AQDpN2A) zZgX%e>S5{r?pyjt^TI9nHoV!x(wnY&Bit5P`rW~=;UuuM?5R!B(kNqT7Y93`#&Cbe zQk%0@l(F>80+v?l`$sE1=3Ro$2`7Q2&m4RdP6A6K&S;93L5<=5jHP{??S(Ry zHt2r75!dgJR+{eXsVHOVIS0?69+vj(z9o*vgj-%MPwipp8&`c5ZVN08I@9EjGL|-W zFfyD3mX2~T7Bzeud8TFq6fpp2zG9PAcOLMxr;;GA$0Si0H4Y}6R;&scij*?TBssj2(?`qu)Mh7b6om7enT6DVUTIkBl(BSs z_w&ipLM;8w*LS0grLP^#Lp?0L*nJCG3b(vj4qG6ZX*Q^8+@p-8^&PAmP6A7Rc5rYw z39U5M!DQ4J?$20y+}WcjW9gj*EcG7rM=Sm2>t9gD(i&||(Q2rNrBgPU-%1kMgj?E% z|EZ>%rM+FXC(2kl$H7_QB(QXYgX_XcVCi)SucF3qf5uYMZYZFPrPl7}TgffN(#F0X zi87W>b#OB3Vd;_XThzu1x6B%Te-BGnxazWSTj;pQ96Svu#nv(%c0s&0C12R$n)xjHUY>+>3fxI%u<=RvJDSOaBz5-`z?dy6XLKTVN^e zv=~GgOIthGJe&lUIvup5#&Cbe(*4fvMHx%SbU#0e#)ap1n{Yq*`UjM;wAy$&1@*9W zXZI~yDco|w@DF=f+S66Lql~4q9GnqOLMvV8U}iW8EWPUBWz-n%&sZu>0CGebOOGyK zY2HFCjr8>fC}Zhl2PdK)miF4BXT%L}#M0a1i@RItGFM#^Zp%8(!9(FBuoQQ>A7w0U z=3o=l81BzlI?34yC}Zi+?&oWz@ciypy2aNwql~359DIg)SZZCs(wuNhYlA)6`6I5+ z#HOeLWh|}XV6|`(SQ_JC-*6IIX}p6D)EMrc-*L|FMHx#|7qB#MA(p=L^*1PEX}L+v zSJcDOhuyanqv1_hy0XuuJuL0$s?jK8=_Cgygp!~Gdc(PR^Z zPcoLiTENnn@ciypTFWJCpp2z)4vs=SEN#DKk9bcCx4fIKltah(tS%I z8a@O|9m5~#VW~9LJcKfqR(7yrI0-E6omM&kw(wOl4 z?pFHR*Yi-u(uiq{K-9z1oUInLQn+Qt@LluWtu)$Iqfo}u2@Z}6CxNBQ9b6ht0!z<0 zcnUR6>S5_uXa7YROZRm@pYLrUmR6f?+@p-8BODxtdRY3g`<4P90hVrT_^gMe$*!6h zZVMfEhlAU~Nnq(c2k(TFz*1?3#zc+b{;ZWYbhbXqSjufZ|COU?WO#meE1l%)6Hvy| z%?@Ux9+n>JzC}gIaLc8APA_z~(yOj|IouXl`q{yc;UuuM#Q9CpVkl#2w1ZKoG2EZA zbgr|rQO45q3s{=75KDLa`c9OwG|$18sE4H?+suE9IC?MK@}F}e1^jX-V`+T{ zYloA-(&-LP4kw|N?sM=r)EMs1SeobTOO&y+Z1?k{Xr*C)w9=n0Y>Jje8B2#aI0*Hy zbY=G~ViUtHcMZR)ho$kZ>Ik=mR=UN(&EX`l^p=Cahm*ik;i9G}hZ@8E8B1$BTN7n0 z-L!zEISa8g&eunwjHQ_lu0=g8z1e+BE_yHA@|WSO*LAnjbFO+O+!k2++QGbV5?C5? zF%D41(v}W34TC)534BdrTTKrOu z4wSL9uYfz&hg&`_f7!#*W3GB6 z+!k2+mxE8kNnq(um-7jrjHR&-4o8jQ{*0x|on4ADmS!(t>57F|dehf$pp2#dS2RU^ zQ4dQSg*^=a@j-@LzH2xK<}_=ibzQYK%2+zU!M@=nuymz^OT$TMrS~1YhZ@8E8B6`I z^b;s!X;k;~jkrbsXrDy6OjKhXXO>6=69T$&Eb~Xnuc}D-OY5V%PtQ0g=Tux!Gqx>@Kk%P z9}Opgr%jz~j2goOGM-Lyb^@9&Ox-`g6j+F-TYWtTWjy`c!565fncnQa1*U9qJUzYG z^F1u}{R`9@%2-;$WhdiO2)Xk@shR5PrpcQ;RWyX?+zUudTH9Q-4k z1fCYT(T}2xr!fxpMUCMB8BbH4O-30{S1sUa(n35v@9Sq###7yFt3=ep(>vX_6r#D| zmb#jTn|pX#(Phh{jHg{4>=;f0PtzSt4kw|VUUTpYY77s^c&fX}Z=j5)FBb4Le5pU$ zX;WWsj540ia&QLnU$&JvbjKcP8WV20WwA_oU+api!!4nSo_6qLI0@{0>)`8f64)7j zb5k@7HHLdLc6M|&8fEN^=zg|YcOiD#eO*NvI}bXzABF!K$JOMcMJ@f8OEbKTaOLhi4cK9qO``YQ4oU2Se_)K1NL=oUD026^#~M!^ssc z`N__3)0$3(Kj1~t{4K@{y0=tJR`hk*kU~UQG2my{&hEXUsn^2nSb52 zJ=fjinmfXE*%sp!zRk86|Ldb4P`1Um!DCI)S}6N38%3`!*m0Wcj+$XLb$j&f9!0mi z@UJKnkvAQ@5l(`LEI0`w^1DxeMUCMBnTV|NcvG|z%0%Ro1wSx6=Ld#X77M%0nP?pD znnRKQGG6xS-q-PN;nL-6(pP(Unc}i8v{(?=#R3nRcs}c+CsAX#A^Yvco*+3W`|X|w zN+&q~x3it@bA5d#S}g2z_xyI(f<2`u@3&X1Deuv*yB*$h?K|Q6|Nq;$C!3;L)EI8a zetRuvYoP46r!RQmnDD@EB|Fa7N1^QfXF2!_>fzy|HRlUEH)ObFshafd9v+@|*|X?> zc=*XjU!lfuL&n3SPnpe8#>3|e9yoU)9#(vsCPEnxe|B&%>fxc++Vgp+fv3TPbPId* z?{0^QF6%`9!^2ZPdJHv&8!{did4{;5jE9~F+ARqW>~4p%e0>`Fe|@lO_ix)o3zv?l zDZkzG+i$z}t#JMS?}J{?;v6-G8?xVC-Px)r`|WiWJaBmNkKaDh*GHi2{jYU!HR^f) z3m0s@j0v}_S(ENRp!@xwaoJPoe|Y%TM_;1Ga6`sJ=X3NQ%6PbJ!2>5P#KZT#{uX6C ztnhqOv>fW;;oNSgeN8ks+_DNe=;2{km+grDhlfc%8jl*o4H*v~J9{5xJoG#;j)vF$ z(GHuxVAeqYuMcituwgJRT)J9KdH;dk?|+SJuL{@y|2}xiM^B)}a6|Unzc~9DWxsvz zf(OoB=(ks!%N2sM_aE!vaMbhuy*KU|2a))Unzd`vk9v5R;<8ETe|WgtN4KNKa6`t! zkQe=apn!Pkzuio!MAE5u? zq4W}8Icf|yWIP<@>~NIv(DOhu%tAc8;p^8>#zXIy?O-GSEgs+on=J5;%ni4!S5wY@ ze+`$chW_XG_wmsls4-le{r-K$eys0fInsDOxwhy+Er zqF23Q{NHoBt7pJ_zx#dvJWoy6sq>ywr>ahc?&+%G{Cgo%jKH7xZ(xDPo_=w2hF7pe z$E<|kkU9gHX$Xmwm}H=Ww}RS?P&Nq@mJ)I~F_j`>eF*^|J^}O$0)666W#SZ|@>rUk zq;)}|;8(x=XW&9Wq~<=0#Abru5v%+O9={@_@jGJ8E#z}Zn1K+NTLEhe=t;v%Vl4%~ zC01}AUGq~2;4QIMg5Lmp^dg>1Bc$O)t=3l3?Mry?1|f~!6Ki9o{css+2yweAhiS*t zpcM<04%Pyt=nCE~K;Q++;OdsI8rtX_RBJ~OQIrHfp#{nhzC+r+u+UQ*5nD6CP$ii>% ztOS8qA^*C8l?4K?LSDOx_YM#e3C^pKg}3l52Z2{1i~oTq{|LMaS?}n+4KQAGl2jO4 zg}nY9d72Y|1+oqQQ+e>mZ5}rro91&#GUx@rc z1lg4NPxJ_cL{h*u6@%(dsWd9NoS8wz)K%HH0?=g$Y~KfnoJ3IeO?7@09ZmN27vA#8 zwtYVV_D_-{`x1Xd9U!oM^%1E{1lczTkpT#aq=4;P18Nll+c)3&2~x$>RoQn2(2o(= zzQ~{OgDV0)TTjZL36*!Lh4y?+c9uk}fGT7_x1y`UqK)Gg=xTdL?x+*K4L#A7l6<;Fq zg=Gcz(q{H!U-XEoFdSQE7vSY(?xn^rc!rI@HB$+Z01;F(9S~_p1lcwbk?{zLq=0K? zJE-RnxMn&y&y}ZA26oMS1@@N+Tr){`5J6BiGu#$=z`lwRA~FW!^}nr|d%?k)QR14W zV(O}_XoyVfQ|5Hn@DL&sEGx38eG={GPQh5Jogy9(kz7Mh1HO*r$#;$*@+J{fL*F2B zod~KS->+B$AY>|)N)gvqV{jTGaBC`#rm2{^Dw`hx^dSVcc`qWn5$KaRI!oP%KVsd8 ze+$kh2sF<X@3$9{ zx+Cy(xE7I>grN_2w8RE#0el-00{?6BGbyCbegVMq2<%1@+YA39g50P+h}sD3Mvox! z5JDm;VAt6R>Ujk2XlfwG3pJI39qk&}R}k1;Qg9rBA3@o)!Fg?GG>J?X;nU05HZ=jP z5dzyZ6p_J1kWC8_!TvhSroD*lMo1(DY|}MRR}k2ytxg8JESrK43Q|nif`AWCEyd0Y z4JxMI>JW=X$y#NVT@Y!6VA+MpU?Rw_Wr!>xg1X#(L|#V7yjL09_$@f!AaIxK?PRQC zPR90NRi>n0OGn^3EJma|g0efq8TnN#Qw`|Y6a0g+dm2QhkPaFuHY2i$2(tSmBJUDG zcK?9LZG_Bwm9gFBBK%qz1h!jcqiHIpu4<_01!yq>+r0vjWeE7NKW=hvL~c{ltPmw9 zm$U2m6~GRV9NBsak&6hy2Q(!jaZm_CA_=lxbwSle;5JuQ;P!;oJ4STSahas%Nf8vBssDr(&yK_2wZPPh_oYu>TL}oPa-6e0=DUUP`41+ zCY1r+><|M%^H=O#=|Q zj|j49FCx1U5=jBubPd!M1h(n4^Sj+>%E0!ulo)gi1h%OQBApQM;VJ2`^NW#+y=|w6 zRrZbKB)}ggd9rN-B2N=Res&a*BSesGw-EUjA@g2EY-d`mUrRxtPZ_#r+;2bl!qz0* zk>TFWx@qhNOc#ViO68lzDWD!j;G0Gz73RpR6m`?M6VT@o=o5Ds>w{kdxM}43LmZGt zyJ|iI_hSU>{&0(kp-n_POZl}Y5aOm*3)7ZBgzgWY6VbGbXl!XT0YXLGA8r%838*6O z3%6TQz8`$vioY0-%n{;7*9g-#SAZ7m<#|cOQnpnR{8}yo-?I<2pBo5mJ&@vMyQ;f_ z-x-0|YFx#WK|PGXReTVU{RoL9#MOEW)VB!S{CUoNaEX-K%^yhgYZVZ<`3EC15P?2C zVIK~@vYQW?U83a8Ec6qauvY;07zxso^GZpu3V|o=-H1F(1U)$)<%dcHp0L+L2~XH} zka7!wC+wUQ6dQqWOniPol2?D@N{ZZ&|(VEI1z_SiS9t)!XvR zqcpQ^B5$z;^6MT}1n&7Ia{ZbMA(7zR^LK)pj=(*CP8H1m2;8H$Il6td zxJN%hg`u85s;XZbieTY(+Bl)Lw{Wj1+?&80A{_rPwisOQ`K7Ai|NjuU=Z{2W2m*h& zId2DR5fb8kVQs3u{ zyE^Iwfj-=;!)&aswWnr$%kI?yU@9OaQY!cA4xrj0aIaQUIIY;0S69`mrvf?|fj=cY zx3R;ygl7||O67XvS!*DJ_YBJ>usxf12nQO`F6_$a$Q2`K*3527dxR^dQE$v{L;HX$ zX45>Flgq-w4#~!@cTg3B;)!)Ao?W3U zr8nm|Z&^;NOk0+7capT9H>M63;*i_PJ(lwBHn ztXFwV9uk^z0mf9(WE@AcWd-0$*QH!@w^v0xz68fR#P z>gq1oQ?9$>EpuqoW3|4VK;~8J=R~!tMOlm#R_)SmS_{dvh2*GKbqTf}L#K_TZLa?b zdE5hJu}BqUnT$o(t2UYv8d4O_lZZ=x^_}TJbp?v6j1XOI1pX8da$4JB{EjcM-&!+o zqN=~5Vis9L)w0gkb=nFYf3D-cK>4gC`_7eainyC<%H=VBLfyMu#%55uTOT@dEdJsr zYy7?A{;VfJ}_a~s_l0tmt#rH+ry%b+zB_BX6rqq7K zQC#|bUEiIJiy{6T0bgiRQqT(v_gaj-^hc4Uhxwzgk8g%I%`tlMr^xps;sl-A*qKO-@# z4(?hJB5x1^kyS)o1hKlVUt5ZRkI(ZIzN7vm#Zi&$MM9!wqdEI%9I=P^skY!or&B#d zFUFUM&Y{MGFj=Q9_?A3jR8Q2{9MOIus=UlAmMds2!w7KK=jxLg&iVlCgSGk12|=2K?29eok4tI z62<2UkNNotkS{Xn^}K57+<;3I#m$yCa457FO^|*dg*6D1uSZ8dhF|5+>-wHGbVBfld! zjHv^)#ETKB)i^;O);L$&S7{p=L<L89;kI)ZAsM z{izU@$qy-&nw?W`sMHv(+km<7{+zr^(9%OB6Gw=g$4-GPcF3t11bsaf>Gd3ex+wfI zqM2X7`636$Y)69oN7PZ|vkBBPLbz9;X(Bf(YR7U=TNKp_GjmjuN#z%!ES}G46A-#< z?(t9&EY*g&#}O}0@y?-HqiaNv`vCdv$3#`IsK%a{{&L;pnsyax^!~^> zWFdH6Ejl( z-jbOh2O;M+j?Bauire`-#035e+Zxi%!GOj*td|1P?St>~ zWavUfg!2W?awI$^9v5TA4$y{Z^>84HjGf}8^2yk#Ub0!n&h}dA^Sr&8|G0M&Ul(}S z@^zv2CB825zR%Ys-rxAT9KXzx{1e_Pd|l;j&)3!7k$hd_eTJ{=yhr)E-g|?u&v->` zl6%%0#n;W=OulaMw&3el?=ZeT=Uu?p?cU9Nect;4UvI~CV!MBe%d10revT7O>H14t zDqru!P2%gXaRq$+Ev^S&e~(*_Yi-fD-x#gbAi3@^#@#~H*K0byD5iLw)ZPkpl>t zBm}#HZD)ae6}*`Mi$TPr7~}>F9k0dimLDFp98b(qJPR;3?gFq0ElU)}Wx2giHPf`h zxB&jN8j*nL`6(VS70XLc+vRwTWVswRudDnPJTAw1;&C|w;>-cajg-|fh*;$hkz?Nd zvLSd@`Hi4l&FPSvCTE|sws@=3fEr}pe)&9jEPO->~S(?GSPl`Ya26=?L1) z=Y)I+OqTpJL~?9jNL~}N_?Ru3gvFL+Z(YI6%R&wWlO+p?NinoaG={>s4`joQwqPem z(B{1>TZ6}PqaC?$aq$r34hvZWBQM*!z!9{WhlFedCQEJ$kzDc>B<~2h0V5(y9t)9V z=1)RC4<<`qaU^StffGk-ahGLp44W*7%@a;fVBSSJ6g-ym6OUpzF7FN!<8pnTC8xn&ShNyvB3+v0tcxI+B=EOay$@{5bMj_Hn$2~dGt7*Suy_FvdKHaR*NQCAEf zHCT)5BIG7`G~4lp(t*ZjW=A1+g2^SgsKlXr1t!S2p+dfZx?{=T97&rwP{>!nWXbpv z!Lpyb2FXc6zIxP_tVK-LF|!rh&4`KcI;=5Ryr&WuO9@d|j2<;Xi<>Ltq7}A|$&L%r+{Z#*LrFOISCtMFkC`6``8}9y!g(bQ51o!dA?`UT-?IgO zb_8wSvoZoamW%ePk_SZmlaTvKMq%~O8CE79+iUZ_mwxbAuB9UvF7n@ioJYt~pV@+g z9YLGv7BU@7mYf+P`N1Vf;x@VFH@4(vC28dwE*Mc-$n!w3_;Dq!d=>w6ti_da$wMeL zxsAB0bfBJ?nc|Y$6cZ=S*<-rROmNBf6*HBXlnW#u-UGF@T=Kpfns&K0((4eDYr|$% zcgc2&**!!pOIC5o5sEoJMD2x7ptiG19{bW(yDUU4Gn>2Q$BMZtM6%H?NREaE+%F-!;tQ8- z`L2yPac?d?$yJ4vJ72UBH}B1b5r4Skj=eS_BJ!THFyf9&E`7;H||+K93D=E8^=Dc@B(o*+bME@M|BmwYKNqE~av?Y}n{M&wCZ zQz6dZn+qedrTiKFnsxksZ!S^Wk;|KId3dTl?j-o^vY_WP^EJ184@@?#Ix+1Q{hVg; z({8!%d0Vn5M3R}O-103jS#orU#+^mOK_B$;=hHjU^w(sUK-iY3FM?rAedgz54@)D??YAOy$g3p3Tg z2M1|!DZ2a;t;#x@DjkZMsLOA`WTAda92NNq)&_Cd_8)e{mYm{9+RRG2i~^G-*M>+Y zV^)l7q|0|_*pdfAB$-)HmuJCb$+IDn=?fs)NtbWH)7jd8hDb8Ay)I9J$&$Y4V9TDR z_8Fwh7jZkul2wSwG5SJz7|~Ccg_zY@yps~QyrZrdG@`E-_pmNIt10x6yL4DXiwzr( z;$h%mMH}x@q!HTZkr3i>>kd51@%O#K7rSinw zQz}M0rOR2UIo1&%1jpzLI_jN+j+b@$5X#N<(fVE;jM#&gR;!tj_v&bl&J=e7UbM!Z zr5{r|kO4D~>hhLiZdKx74ncdweXh&Wm+ai%4v}Q$r@AZ)CYyXYL~_;)!Eo(Pd_F%^;pVY1OPbz zyjKS!HipS3-?nv3c65*;c=dERPu#&UIqIx!$Fq0oP&ZKwdpS%Fz%qqRc<(Mn3O0w@ z@%=D)9qSCP({GeEWW~%AVe$tsSw~oDyFg&3P&-};PhI*vO!Yy|$nL5qtsWalSr9ajlqmw=hkhU^C>o8XEMmi-glrpHw<q;b1n!a>Kiv%hJLG$G8MFsF2#Y+83T6P1am7j<)~ zrgbCn$@rRu5H@QJC;R-;K!U;U!atqWg&W)+Oda)kHy5eCvuGu*yIsO(XT2Ie#sx4~PX~)qVil zw;@}cjD2>3H z_Rt34lB$#(bR32ES1b8flBNwlfw;%t&WjBhntlmw=kHK*E1?$(K|Ftv?<$-{h(MyI zRYwRrPKFA`G!b*w1Jc=Cdk$%>!7XwS_;B-yRx8qE2m zOUwsz2?5^cil}bo-p6?UDrX1I3qf(4+s|l!nz%>7`N-jl)6jr})7kuiMm{=~5Z{3P zQxJlenHFf*dD7BQtVgr@#~a%=P+ZQ3n>Vd)s@!%rqXr&ly7CoD6M;gArr`{<}kL z#%SYT?0aB|y`)ED0rVjOt@>LmL_?VDUu9gqf^7wCIkq7wwifjZd_wwL_zbEE>93hc z2}^`Hy8%*7J+oh?+^L!bF|_=o#duL;z9)GMRQ1T)hx91CL!zY?PDeDQONo9UCJLfb zx<{PAjUF7k2hzfBQr_sNH9;&DPag-MSK?}1NJ5Bw`W-QOwkNS3<#Oo;h&diVO|VgO z05G>NLl0_|OWKZW{n;iFa~wZxM3n$~kDV$K%?daOl)x3_s; zGCit%595@#fB3@(ZDbNsOB77Q$drSKqkt&EU!)3hB|m1lIWugzA|-eB!B9D(1b?wy z)yk9ZsdN_&~4b43!F7%sxG z$Tjy0V*{qUuK^aNff1d^ge=6g{EycIFhf)#O;Nu?Q9KkhK|X}&RMiR6})@AoS}Y!>Cn`Vt+nJfVn|`Xk1ic-g^>%K$O` zJQ3X@&ZJ_XWWL^eC3-}02};rQJ*XntlL?Q0csYn(O!%4z5|zDOQ;;ZH0NfrS>_MtL z41Ub)?<%(rr(ucw$%w%OPYI$oz6K%K5>3Pkc!K=J z*hOWY1jYS%)dMBS%yji~nitqDp-Q++#rm`6K>KhY>Del>Qo! zi(r3uH^kCp;|yUuxE;8#bo`o%U|Ax#_H9TBVVr*+kSwtCgOJ^1j}5`!cfE8Hkk(-L zx*MW$TTaDJ5(d3VBE|wU&B57?mHz&#fMkf+JMd-vlb67M3ThJnjP~Y>nns=|wnJo} zBPQ(f9zGlo|-)NO)2C5ncO z;@@AQ9#SN{eJbPkIEpNSI7i4Hj!=0xLJq`{A7C>_nj+<4Qlz;u#Qhk}QD?FW#g|uf$$AQ6!Svi6~;*a!(86_!*Wvi^S_e zIf~lCG8Es=O2;5wT@Q%5gX;qlDb}C@N=G^CxNjd|A7#J>n@|mH47%h4S>H7<`60J;jQwv%c!wa=`5Lvf2~2Vb=r_SE~DlZ zr6m{a8U(TIj1;S>2BkDo smf!!k%GKx$yrSa@a1sMS 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�)E8Q~5sP9lwlmb};8k1#4M#>}8;w;5FK3+9c#V3K#iOjH=# z0E4Wly4)siqML^SijDmzHe2;8I8InMo35FfF89`5-Myr7Fg#8_^#O&GDTM)nyiw^z z?vx;e{kRM>l?Qu$fStMVK>p4=pcf$ou`kv$sN);6nAbhNF^_M|=V)V2QX~xGQb@)^ zt#t$jsGN5{*)|ACu5kBxi*#`Ruq{JE2w@I)FEl^!Y!Ye~y04iA2qE=@9u$H!9(6?N zxec&46MQAP3Kn&sG%^(Q54Y?EhX>5_Q83S($bAVcK1~|SHV`>_Lz7(nNn|7@Fd6)SS8t8g4#ekGY057B)0VcnhIx7ZWt60lO~uBRN?5_6ls1Ldgr)C(9s zslt`aoVsiJ1Su(s^`j*{vU@wT_PL+^(~jGRyhQkJ`oF0Jv&DtLHeq4?_o}7Ec8{2xvqE4U{9WO zHWzNrhPve)N!{}0N!{|cT;1{|((p*d?nus+>TkuHxy4-uC)@}p*ul3KdjJHBLM1w) zU}3OdM05a@lz}r$F;)Cb@EY*ZWA=UUZLv2%o)sc!`Deka(b3GINEw9_R;{3Mu_+@l za$*sdlDyH>t*~=i%7Cg!EFCOxyYqkHrzO1kNwQp^yU~w8PQP9H(`n9sX?G1uVV%2a za4~jQyZsFSz;$ivN6gXhMEtbGlXdaIzc3|-341f$-Q!xd5KZo%Zpo5R$h~P?kGA2~ zSPoMNje5bpELE#yG}Lz5EbUevy&Q{JevdM(ypiv#b3a9YA0hmH-n@0H-38gK;TM_t zXK+<3#Y(dDr$kLz<^FQ_pwJgeftQwWHcN?rk`}Yf)>$f^2)){8t=A5BevlrXl#0{D zIRb=8z`@s8|MHgWgl*?D1%i$4J=-PJRmb9|4BIX4K`FT9e z6e{>@P=hA;i%xR&YzwSk%ofJ4tYto_bZ=v}>Fh+(P0~r~;7pmUC%DgwaINLq5^2(m z&MW~v)n?ZECAXRR=e}SfTH^kJyJ~m)B};wnQ*^akv(SqNBnS*sM4nLyc&YD2WU?3j zbR2S*zz9VfW<~mCkrfFRGUuaojLk^zE#31mG9yV>2ZOgQL}GA!*q$dma~M`6tGAG^ zxinGoNE%G>9J9kEIvLrD)QK}&o*Bv5tp8nBr1oJ}Bw>j$SdqjtnI*}Xr(jJA?385R zm=iP0l1|5HT}q5g5~gLD%IP^|T%w<}8JKi{k;#4->_Q#nj7{MrXK?BlrGosV*O|@+ z2>rG3SN~JYO%GvJx=B9$4^d6NmK-&5@i`g`6Xad40Yk)Hv|W^ch_+)GX;XyOA0dcl zWzou~@?1nnpX>fut{d|^?8vN*f$IBu8H3Q9Wo2jTE@5)YTxbgryK(&Qv^iaVL^h|M z<2EO1IE>Zi)Y*$8n_LG_)I3Kfr-%NaY{8#BzAumOOVha@zAgB$_T`vt!KF-2e9xsikv?=> z)MI}$k6O^wIE9L+VQDyBtK$%5HSRXw#97MSsPL(j0;%w{)89dRgaj;mbcU@)Kkgd} z7q^B(|A8r=8R2Y&(ufo<`;`6VV_wl+_JQb~+x>;N`Pzg2Le$LnGgXCZ=Euy0Wlm;$ zx5?n_+#Y(uUO?c|%cLtKv16la&&(9RyjzwLJHTMuNco?KY0|x7rF*?1?{Z4xj4U>M zQcx8?oP1JaP)HXln0F_t<9^>PJB4||;s-09dAHnDzmC)0EcXG08%A4sU#0sx&Mmd> zcRTvXg~Qf%z1Wi?_n!(B&Y2IH8R;70sj>LlTX{H`d!9g9|2G=dWZe&px_6>2ckb`E z^*(jmV%|U)ETKO{GwWJ^a_x+lN9~V1N-xCds6gu!OKL1vvyB}Rx!Y))p#<7-T;vJv zdM?TuzExdeFyxSM5q_&yW$}~0TH*Vczj3HTY1m5p1vsXDk(gDiALx@%8anbIFnV0< zSqeO?ygR2Oavl9P^%WU>y4eBiFkDP?FV>4=J?K+%3SvpeyKE14?5S_ETON}!UAZN6 z$&xxYy@U%>-KTc-(v)#uEjwW6AF}f%_c@$KLmChtoo!uU#u|FfWASU6u*dh;^ZXU^eqD8N=<0W^wOlcbSgZ~_pxZQVqXdoG@?m;VS*BPo=mUo9!Sc3SfwQ@C_Kcd!0e2sNa z#SFu>Y1~rnZdtyFQx*PAvmxi?H`*QGpm0qVIvwG|ANPTHWS49-+Du{CpB>ki`62%!#Uht`4Lh>6M^D$0eV@YQ2k9s;fEXzz^1l3Bi%nVrC7Z{XWqM|-F z7{p<2aOCwT>3p&qvMEz{hCa9QQiqg-|F2l-BLS(RUxm-@GaW{Mv<<9!2cZW7`U zqCt=lshXz2L!>Z&EQW@5fDzWh!z~T5LU-j`dBl>D)FO#Q&$sdr!-HENp+O`dSqx^l zm4I=G&9Imub)cO)c_^BPPKll?)#-2pPrsj27=u)*Kg#m*25JNeOWxt@wFXPHOE;w# zVtA%-C>!*C@sjlg0alUw5k5Z;Z0jAei_t)|m+qwcX!x0q_eey%gv#vF=Rw?R_@K;8 zN}!1UHIJ&yUUTcR@x=yWg$!9{Vmj=GO+`{Fdav7v?4c5 zh$-J2!invI`&PKyLMlVc!y&dfcRB9jDeGbkfBaN?)CQs0JDC`mu?M!fn+;7<0j=Hp;nU_#6y5ENmNpiTx4`-c(Qk=v7zk7 z-^MMs=Y;`t7kqyMY}I0sEsqRO`=?l>Xq;wHXlubi{#YgA^qA01@2ZXJ7 zh`?fn5C`~pt%Veu`-k~|B&|mlQ%o2!IZou3OtCVHDYochKp^o1p;aNpRapX^IymeO z(Z!GL+80}q2*b%UAB`!Z_~ihQg(?}+lT0N9hS>;C>)6E=|IhIYIUNG_Cc_+{(qZYC zjykS*M8A+_lI#VCNHZn;LP|y#{}NakA-Z@U{6KzmahheNG@Wvx}yvCpCZpLjO2(6|YkSlH?4nKy+ zF$JVMI*ECAQ}mFVg`nvuJo0tL+~MXJxex46XvI=;yH!PvxBI3Y+;+FnE{YTm3H~IA zbo{x#>QnUGhS-CB6$uul$_g6pV%JRcZCm~Pt$wOk@@-3fV>=BmHQ8Br z%2|B=vTz&uN;zwkTIS{4^a$OMxQwceMB6XT>s`-G4U=sT;MjceATw7PlH|prvJ_lK z<@a|U(8RmNC@6&%GCZ$|u5=fq_GPl&J^Q+sz7QEC#&r_hVUG_n;eT!x)6P* z#ZChBO2p%h>~3;cLCgPQJj0%JKfANS9Yn%x+{uf7WzBKWGP~_y9JG9AI;(vQgehpb zk)VN!e-9DMr^OM=zqBVyMl8>8w;RJyP9#Jcm+7I9Wh)$xzU`QVEVoB;P8&UB8R$VS zxfAbjrOh~a%RsMM@*1p$5TE&HaDyRB)+BALAo`!x1+{_`Esy@(pT&+h?*DV}MS=U5 z4g*a0DSpI!H@WfqdV~LnyOPLdxI7$7%%6n0)EO@DA%;1e!15s@?bn97W7m>%fp1eS zd$w)!Uvu^t$uog7B?XWUmQOVWGRk9X*)7H8*QAm?4+r)SZ_Bi1Kn-TadYNUPk)nq; z{2*|abk-RuU0H3UJXy6FdDhg5Db4$1N|M@)a+_tMto@b1r^l-8vFa#uKquA$3&_l& z_d$jqW_rr>D}dHbItC$3N|6cYi99J6p6N;n(Z^!UbWh$QtjAlPz{qd{C}+|l5t-c_ z!zcrHgq!wXxF+FPN#(4H%xClrMTYM))bgB=vttz* zo)E7wMutlQX48#5GW_to0hD0r==^k$o*)RL#D*W=pnpIclr4GYkvZxNzVNqZlILNJ zTl27!HXP>Gr0&=uw`PH-4!8dnb!;vAsR}G5t@c;P2y3uKh+2kAUVBUb;l*oL2QVLZ;XAr$+dtc4@W zk8dg&>1=|nbFYU;Q9UEmabSSd?wu5X`_{IUa(P#{Z#XRUi&4EI8LQNWM`O5uulQan zufwRBq21)<3#Fv2bZ7PW@#l!|El}V_vieoJvr}ivV(&f+1SpJFskO+trO4iFL4&CP ze=YN4lv$xUHbK|SvFHT4qWaq`Dc4JV2DclxmC{q^nv;_Ig-;ENEtUnIlA*ASyskH- zFGFM|Z7p4$<8JKZdn$U<4P=gg=M4nKX)TpzhN`#Z72%=m4n=#CvMb!4 zSCWTXIwO_K8LE4eUo9sT&xxz$l&phe^>mU7J`}~tuL46woHBm_HDAu}qzH~`zL2*n zIKu#Viztx>Y&o|wq^PrePCfntcLP>?#G165ptN&3l31RUzuN-_LewMIo24-iIrjh+ zaFX<_I>N-tQMGFkSG6UidQ*J4L%p?5BjB|Z8J;BdDrvcS3yI1FUp)eLnwrpwMm6h! z`%7ApP#1UL#-y6H*lIft_=;QT8=nyZ#~T}EMKjsX5t(03H!V0Fpf;_r9AwiRIuHcZ zh(_6fc!v~DwXOx3bh)p+mHU=kUGdruYMNT^K}KlS7Q%mBbU??Q=~Lwa0Ro=GRPn-- zDQ%m%_JE1CZn>A2)41qai&`HSEkb<-J_bL-%_>BqB6^ekj>m#bdQ~!kyH$vy^A1=} z%n2&8T~3|=s+rxuTPCUe50G0eW4kmk+4=CU4N^)`B29zRl@d!+I+JY~)td-vHxr0FYn+ZYvj z6W*v*+14@aJ(XWAdMLc9<_2G-a+f9EQvATtyoG^14{tewZ@IyjU*c=7@KwrCSaRNq zCp$N9@q^Ohmzcfc$8xjxKj)1=p?#W_SpXwMt{NqBoRmV)VXWld7;=*jtlE~$`rh+k{UI8R@ko%%%c`vJMDORYCHFDXC}~e_q}TPmo^$4mmO(Vh)8K~N^+w}y9To#w~EJjHJQF5I1A;q>_)BLMp9h(uDT^0?`D`27pfGa<hF`;+i$@h>&V=@}H69~mprRQdX@LGkePbTSxJ>b5BKNIDc++S_) zJOEvq%+pfD`RdpD+CTPH>DESHeVPs{qReMZ=~1OsT9)bo1m;6fc$tym6wJBOyQexR zGb%P;5_z*gtj9Or=ucYeE97z2CbArc`UTgM8|mYWbWT*?qu^zY^K%sVK!;6kkyd}w z3Tyg2nfpVN3aXe5rBbDIho&o=#js#sM+VHg^ZNPBi!iib5V>{fxq?#tJI+xY=O~1> zhH%_*j-r^^$x->k=3D;f(06#h=b48&&QSyhm*X78Xk5l|j^a2+aa>1nTt|_JhR1aj z$8{8b7>gP>wBsDbagO59+KS^G#S5OJNVi~`dVHbGRNFCu9NJ7(%2pK2RYOLr=fYUE ze&gy5Td!TycFpEZJsZ{!y{oOY)QDuO8mT@1S?pV-ELs~jt-fyMmRE0B-_x^Z^N?LD z&rro&6Q@UOkI(gz1DB+XtY5uS%_}!-Rj1?2%EAMi zt(BH4>~56=CzLmB>Djz~<68RRqsyo;T#>F76!MQc)u!FW!8o&jz|Tt0B}Vxz z6c=^WAS-v*_jYvqsbt`OFIu>+*!DVQC6-qUL8sbU8b$0UC~`wD?&%#VEJ7;WSGAJU zD&mOT^{qU)+Z1zF!U{J{SEXcEJyPxlyA;aNP&S8ZerBL@(Jv=^f1@m1vs@=>;rCz& zA5UfsH?@zjOXcsK7rANp1W{^h0{YK#TF9R5#9=x)IO7pAeEmTZ_BLBGb~X!F5{$ zW|Vw=Ik%|9PrZBF&aC`d!$S;7PNsaJVu2L-)CIu`xy;-y~xk6rM!qRaiZ2a1r6( z7xSc?#ic%0$ss#UpIq-xi!aR8Z>ScE0m0PEy8mP~zt>*uI{p|>3A^2mXW7n=pHxaX zQXa@n){$RXKbpHVc7n6@TkjXxkG08I~t0dq6RAOn}mxE8l`rp{tS;4#M?~HdQX& zKFK#Pq~$8cZ-I4t{S3X22b$ICl)gca{Z|2Zv-IOHA{?t8qezWgiE);ZVx7G*(>ajY z7j<)%bN=ll&@+Q>-CTwvx&GD;>Q70(;eP9aSZ%UV-qC~+C(Be4hy@&X8497V%9%7y;VBEVtj z%w}tvzUF``s1^GHa1Pk@E2SJqHz(wUQ}+ynN7Q z8ERZa5*waKYtN-SqYGu>;sc+ttCgTj!wy&!bv;g5FSt>8UOqAWSx+o`yt`_$dN-uZn+a4p+J!$W7Znd7rry3zs@|6W`XiBMzQR(xK~;IXM>{C z{&e@ARENR?X1njOow;C*6k-JwXvVFA(t?ypg3e%nY@h^~21e1_KaHL4br!qf*V>hA z)E8wL+8G*w(y7qLgkC?F_s(*!f_6@GlRErd($aGZqUa=-;-tNO9i&`@2DRX|W{~+y zKk0H$+1yFzu_m{7`l*861AeA{2Kuw@Nii0kc#vJ1^c6sp#)Af3Sg`=-iO4?<%%_xdTBulN}|7}6DoB>C&eRoX6OH%bOu?MmAGA2B4$lPZKA$%dyq!Pe*>IFs>{ViOF_IjX%ub_&t8 zty)0N3NOBbbvqjaAx=3YqM6J7fcR`q@X5L@G!Z0(c6e|=D?_%AYLGke&tRz^Y zfERjFtWdwPLVoI%1-x9`}A>jaBF9NjKctF25x zw_sOi$~v zVR|yEL?6i2$UKh-TOQAo$!7L~Y#@x)TzFygJgtY%^Hjskg?;!)ZXZ4`Y|p+iay`Vk z!c4?mPtX5ut_Ko!oa+f(Phf2jZ-w|%&lSgW-5&(UgRj5pnCEG2Mq+vJEk4fiz>6On z&ChX;2Tj*;j^~KfJjXen(tKl)mghLf^M|eHInMEz&>=m~agHa}%#A_EGbWCQjGFJ= z4#zWzcqKIVaxQPVz)!fypLjLNJ{R~C&$PcUyVTF^B>st_EEU^P6)ls>anM(ti@ZdX z8lLGXf2x}llz26;WIuy*0dV(?AQF3t;e8n6EQgw5!Dan2OAQ2uj+-#Z}P#1EW zyAs3Eym8~)$zsw7kC57*6a|Wgb&DmVF;XruXkD8`OHK4T%cVgDV0%kL%9B=!3zN{> z(R7Nd#yh_!JiCd!yeRO34t%Tk7FsZ<@Uxjyl-4NqW(AnJjY?Y7Vh;BW@y)v}ZqrO4 z=QCg5IX-i!-2eB@9N?y8w}cX*Ik1%X0CoU5e+qWO{V|*o4U~hkJx2;>><+U2K3RsL zhPxPtf{>9M=+Hfyc^JApL@zb%~)bH~%dlhrkIg?CSX1HuX z6Z}pk1-I=(THa^K|49rEQH|*p)t{L=gHl^S}%25be~E->NjLH zK>^fsg|C(Yr5}q)y`PQkPG{}dl@|Ni=lSvuv-Zo@Qv276^O=O*h2pOnWt_*nLVGz$ zPkZ%bc^@rGhos8XL&G5#cSgCT8Sj==#D2jU33E%CJ}|E zp<)s0H7I{c0!TH?9eaYXR5pbbLU!(YthVu7Pkq!^&Et&hZ1v2-34w~7k+@Jg4siSlLF(y zlY{s=Bu~CCesaI!eDk0DSG+Vj{VBYv$qZxm&ToWwa_6%{?|6;UDx|QX`u|p9dFQ^F z!d%E!^RG28kCvbMDZ6+iE;sHQcKen!oOhY+aXLT$psSWKSo4B8cfao->EueB3T~29 zK|8gg3Gi2T?)oNR)IGZ+)k&lrO0TzLU#)TXYncPgtPdd548+uXd%^Iy2q-lT?3D*mJC%$j&Q;Oky}wBpud0qrjOp1L=$Eh}4W2gL{Q?B!s~1DWtXX zr!xFCJoyPOJ_FErcR3?_kbAVGbgONw7;>Owyq0CE+p1E_TzMsc8eUlWXACjqrdNPt zi0Rg%Hn{2ZxF%EQDi08!_bMvAJFJCW!1;P!N?3YF{crrK3Qy<4YEnhKL|g}K;fucE zPyL`j?=StVeg4$f4r=JvX;w5bvs6lc8G)eDFBPEbE6FCWG>gGfS`kr$K!qOa7Wp|B zlVQ=q<(c=bs;)3zNwD@%8a(A+)aTD5J#vSiEK8-TP_r87-sZ5rx~t1Nr;-pjNu0{s zdfX!#{ORZViEa4itW`a(Q^8gzE%B$n)XzEBpY(tHsr)@1nBLaWsp=hAOJP1HxS0pA zimu}=f5rI08h*UWvQU#Aw;n#|B=A$^d}}$2Z<|ZF;Q9Wni+%I?{v=GR7yHWd^?svI zRpez>JgP=`x{xY{cDI#^wZK!q!4rw|7%yHdr#9;gl+zb%sEL~W$t1<2ovraTVEh2h zB`z1))4vFkKGh*X_l>6x6R62vE`F`Jm z9|pKi^@ZUwf3i~my(|Je-CI(a)TiPC!&7_Zf)fq&$|CLS_xj2D8Sp2BGkijHhHHzj z&pgFtDqI+nBFi0E%A9P3r9|O)aqw$N&kx3EHQG_2fJlF|xF~%=y`O7GaH;xDA56)8 z1&ARxA2i;JUhOeU`^XyBV%oty~xj9=4XPnLe|pwMdS!&UMIM( zmLzT#Xh?!N)Xg});nYnjgYh>$4C>Z_bvkl;oY1-QR=TK(kr)E$lffMu|6x)UZLNf=95g4P zj)Qqbr7NGPkTiqWXJ(C+mZVQ*rv+ltPySLNYBo&)EdfuLq$MjdGdnZ;(u?Y1YJz{o z^Gr+_fvfBnF-fyGog+Of#KiLTKun%w;UFNCQWHH%p9bi?gpZ>vjr|)d>8Jsp6X+dC z2mY5L7gft!{VA9G7j+g;4KCDB)9DzK40e;qU@NIuh7rCl5x$>{M);D^vpcFt`BxFG zFG0EHSmg~!7PJcrcIqyF(v2cq(oGdozM3`R`zSFCK?94cQihw}2jP-u;P@^-K{P~+ zH5FAe^$>YB;&V^l&MYEtoqqNk3h3Ln3eFxL^I4#adBhDH)6;>tody2S5jSDun7By{ z5pny?5OKp@(uiA@wLAoM%OHXsK6S&>ss*_X(iSU0MkH;pZu{Y>@+sTiK-mW57&k=O zo-Lqk;-W!?5OlXKOD41&Kh1|`o;6Me|5kY!Ari6SgjL4*%8BNj3$tCp?3@KmKv1T3 zDnm2GEnO3>G-C4c5s3*&B($CLh>3XM%II#BmyELzi#4jq@Sdh)16*Wm#G_|1CY=wVBd=9&z8d!X1eL= zu!Wfc6K1l$*7CU^&}78$itxNd%+9MIpP4@4?j$N8h%67XTOJq-<~EV#`Jy|WL!t_D zg6K{iDE#@RJNO?S1>Na})@_#OX-)V3!=OGqaiqf48Aa5mUko~|d(8Iv+4q@<1k)aW zRuOR;jT{vdAonPlirfcxrFuG$n%vjXrX^&kGgR?Q$dGS2SA(d01+UH22V&G|l2(f} z?Gm)E5^IM4<-IeVLA=nFF{) zH3#Fv+}r(}rGAoDeXCVF^SEXUH=K-6C*TNv`XGjAP#K_}^Hp#Ki%+vZRgbmR|PCaoMFxLb-K_k|s)15!M=Zvm^OTlgZ8EKHOgqdn-NekPay z4(nHz>8yF8 zqsWbGHuh}Z^y-^e<{}J-wecPW7}9SpS}=(&Buq0j7e_~i5XWoRbcbj^LLWo8BQcIi zxT7Kqb76*zF+a~IQH^l|P#(yQj3)|W9|?0D9{Wh7V=_A3%=;NjF7}bH&&59Sp~GSy z?Rw8DYv)mJDGYcl^BsgOe&DNIP}t(HK(A?#hkM*|*mk(jQ!OA3Z}!AaMR-udD0i;- z0i7#X-E!_}aqk1H>zbuQo(^`JA|6jwyVQxwt5(yg(zmr+Ko>|VME<=Ow1~Dht<6NS zIU%gYLW_ZS`DO^#9jqby_KSoff=$qV>8Gkz>Dw^IoVFX8;(+n8C*BNxRH>T zU^Qg4EM;pPjDHlNx8Q3Y1j!>{`{o2)SQD%o}{6XCB8w&end=0)@iR@IoZ-gbOF$l;isIOesv3RH;Z2RUri@F59e6_4F zDp)iZsY>zY|$*u>j1A8tB`=$>jRuQ*4U30z~{+I$Cu2 zBz0!S6{?sA-D6p^uw)2M)&cR41sxprl6^bw=#3+GG~$wl?^62N@Lif+w^{WETijcV zx*G#9h7ZGRWgRGXH-Bcv@L|RC+}hWT_0xTGTp9-rctxponznetfW>0TE?T|SpLnTn zTIj2n`3ZzI3zW99tAKjb1O;A5Z71qkp^>e8+&?ik*G#ut*=J@BA?Xn51x-Z2P~JdP@58CvHY-pCAa~I-=Y@PsiuFy*Kag@n>a->|f$QU5g{P zPAu${od=L` z(BYP|+*zh>bIbMOg3vB-cmG}5y*caFLYbyrc&2L zQ+_RU0J1e5aJzwTTWn)snER~`J1DuZXXdU!n=png&13@Eh3lGTUs_??Fq28Q-?mxQ zq6dEFuA=S@bkFzG5#KM1Us8Z83n$ikO}Xz&K5+YXb^A8dk>^J4H5t5MG)0`$z$H95 zzzZ|a$a{jMfO5txYQQa#&2;?;ee43RE#Zbg7;)J z>(zRU+o6mgIBRNl-@6fil=-w4&qhqyo6pmH)m(yVwaVRwu->?soZ{M3b5P@6HH&{il3F8l;zXKj5SFi3}VYJ{1q`*&hP%Q!ypC`fPg)xZ%iivsM;IuZ%7i|)OsRfb&_HL;%DUSLr6X1A2P z6vgM<-`=RGc0Me*=V9tOF&k=(+~hsh&@YpDdG8(pL-J37b!ivit!hul758I}0ai1(i1bSoSJ{}{1rveg) zF>ZSiL!U!}LM(!Tb0YWtjFfbjG2luDoXvuXnH**E&w0-onZNXP^CE0?L-1MyJQLa%%<7&>ht=*r^?NwP*;cV3P z87lc;l!p=sZbG0uTf!p~q%Fpo#U4S0>?wYyCpPB2rpnd!D)qHz3HYkZu$JEx`w!U@ zUAAl=F5I+*w6aJR1B2|PLtLEsWjy@At7bn)ZRJR_5-0h-7}vH3qWb>A=Ot^$EKV%_j+y@q_+oMB_R-?6He%@ zj^P`}pY31bV7taYsbBdt)DrBf96FA2B%OQ1aV2g%R#IEwhKtKQ(bh8?Sd^=@eBNOc zv2Cw}4Gu2JBI9oZ!14YrU&QYO=?Rm{ZjXpguw(AlOH!G;GIL;wekd`b5g2To)F@51 zY|XziRd+j>2>X;@q!Q5oA-Wg2H!w>qAkJTBy75}ON9!30j8XJcTl{Yn3QWPcyF8Ys zB}L$dm9N7v*2jluP&w2YDa4YLtY!CI92 znweKIm4C4dYgv=V2poM7<;rz7Cm$=C69Ag`R8aLiV9x<5fRd?+5$K5XG9*1{F#`^B zdrh}QDvx+hzP2;K<%i&$#4&xRjP=-v~m<+@L!p5V=?H zvsr%#Ra!oEmVpG<_E>DcIAFCdTU?;o#NiR-8*q7*K@vJdGPa2o zcz4mu5@9?3EuzB#Zlq70=)Pni${kweW2 zjhfZdL5+l}Tu2d*bfy<`wYlb34#2_Rzyit5fFnt7tf&2JxFSq^^p1cu!KgsT8=(iT zksGi!(KVZTuEpgvyW4gR1rgl}&f#+878z~4a4#RSfWjZ8l4Mpy56e|EB6eF6HK9%Cb zTt~>77vq2*ZyS0C^WWg^Gi^q-_^3R|@CCw8^}_5D*zAm8uO+D%~I-04+tE>C5MF z>s?X*5Xbg5fa4zP7!_8*AV=T`6RzX+zS1Oo=iX^tce(qXX?JYcf&!X*@kgb9C>#4e zniB;Se@mMI`ruY@|Z;x9)Lz)xM(nQfN&etZ=BCLuy`fP97Eyy&PuR4 z7}iIFhN&kZe7f#Ve8b&|AZAh-@{G#yPHG<;+nd?X4sVj{^Il8j zhh_RI+x55S;fMc*5jc+>XWFE@ZowLEl0ar}dY;P808hU_$tGM;0;|Z=ud>>%&;)A6M$?;w#J0V2wD)^554UUM86!Lni-!W}r>T^B7yQJu#Lew+vnZ$q=%E41w%6WPvPZnQR1`1ei>~ z&PGGvcLSlzdE;D-7U#BBr`Ab`Ck_Gz2}~_PMxYcb?Q`^h(Fa`jcPbw zWDzB~oRX5~q$whP`rT(Q_J~b0FOb+^YE5o?hZZRr=Xz243|pN~l&(%m1fo7w?#;IP zTHOzcT?7F^E-aDmCuS#OB0{Yst`rnnIMG7-stwpCTJL_`RJme&)V&P4c}t| zK?e&A2sbZ62V_64tYL3_3@Vv}z^ukynA&l`FO(3$Z6M<aT6Xr6 zPg0}5(7UTJ>3CoxNB+-Ku)Wit7DI90p_jd!85rkGxtjjbAe~&1WtUOop4?0i+#Rm- z->-_&1Urn}6GUtB?!C|^wvdl)rV`Ypr~yum7l4VroPC0IBcoeKc%*zpk8ERW)LO&b#)J*6VI z+ey%LM7jyiW=8iGkY*v#Dr2MxM>B2cBRGS(8cZubgTW%UOxDptckwArhx=rZN3_x5 zq)WW%5I~Qi(8^ZNwqOlc$C?5OraDikxz1{z^e|>(`654?G;W7e`QkeK>9=#}l=}wD z!nvPs&UP+($M(L(7e~7@!ZeBQD1IVYHl1#l%$|3RNWs&U=`5cZ*1{L-QuN{ssi)Av z@AIuh?pS!ZR+c(1!E+zj0V^XFY|9_%h z?I8Z$y5a7~60ui|kdvZjxO>}TuK&H1v(yDa|is8$is@R2Ix?koJxa{=_^rMhwR7 z-HaTsRCgb7fvxqX8;8iW%}76ok9BVC-mC`Ov{!eC;rrcwdbjW7U_mqu(+Sx~{5pmm z=G4dIhIDS1&%E3>X8rLm@)<6?yCGHaQWhIxI8T?TrUSJ4Pu$eC0o<}B8|&GA!%bEy znLfS}ls8kO3n!|Cj{Js>U{K2NnzSWhDr(c1oSx|ZHpMv%Dd>+3_)i{cVlfwUXQ%da z5jEOiXohupaAR#Szo(MDXMlN~`|K8F+a6~dDapnu&;Oiki;rvw6K8`4mX7qlEF1Tx zStI9xm|TQ1$Fh=eK%`DxOj=}kJlB0t#zkX2LL&Y*tyY-On;nvf*mV)w%Dx9c1coZ{7?+DySCn z8h^3v*z%>Ee+E)c9aG)4Q>5^!a=+iiL5j4-KXxJEjf8Y8sDXbdVv{k_QuT7t`nj+2 z)7S%Qjm7ddLAbbzdEaQT{qd(s3ACBn-=~kT4 zB#Yg?qdqnavw71zw!3$iwVg*BZvrZ_1hbLfD-9! zjzYQ>&6a~|JKS}f_vV23h>#(2zjMPjqF^r|_&ZIY^Fs(ZEJ9U{>WHo;v>&#|=ah#@yI5)=t!0T0xAx^uW-rv1xUGxnRZ znF+=a)7|eYHO@A7?G^;UqP25m=-@jzBty^*IDuBLQEDT~wr)c_6pLh*eie7&*QH&M zeK5RE>h*HeE*h24#*jdKiOT*H!XmRIAyY6y-VOsB5u>qrY;_}>_xFp|z-#^lH?>*( zY3VF#qi1Meka#EF(T(+^aBM;&R`nkbQ}r{FB=hDF>Ne}_7ZL)32=+#XwHMskJ`pn7 zFdA5n>`;%CSO}aph5~j{Go<9&&33{DgumkOhX0&qpJr298-1KvLaJnI+T^~3qP|j- z@Hogq|3Yv7%>_HXo6Dycn3AKxJ*kih@oB?oS*8-D9r>+#Y@f<>d4c!@i4@+=i4G|CHY%%MQk3+8Uc-<9t ziv?mf$0bLCg*2;vfUL?^Rjt-X{N;lfPG`B7s9ricdevU^LOaxod+h_4>!eq6Cz^z{r~sN~?0Bu;P7h}=Q+Su@=Y z9MdX@4g_32khaBpI_bB*zX8cGlW}i}Ab}@|O1qy|9*611pe8Q#LUU2)-mHVB7Q#Nbf46rT z4e~x*xqzqzgfk$Eto=wjPeqQU_)&6(-mUM2d_!Fwz{u&QUeH&>Z465NF3 za-k+ZV_z#WCLus;mgq!Ps=3}O8c*M10+L@vY?|L<`Pu_7vJfx1pY2WlTX+;?fd zVD+kIaKvMuTHRAuLSH93+>c2qLMublvEB|FVilDYHUe=)U{O#tr=OQVi!4m1isd|V(9n8PJeI=r}QUyZ$MV8Vp zBMQm-Yiv{x#g<(d4_J<1iK$0+5SGF{6dJMsv zWXP~5C=pNd4KL(v1bwPR{n~7AXLolF)-e(eCPtXY^g`Z;P?;m-U$C3LHufq62;KWi z6_li`@!JZGe?4ye-Or%${^GW2TAo`ISbKgnjqY8n zU0iHa+Ugb~l1hhcX(x*Y1~XDD8y4ir-NbvIK;S5scKc#_b04e~u|`dzyvG94tUA8w z8*b5t?J6z^H@M$d;Gf9-Zfka*pW~{ztG>^-?M-*@9~CczwWHdfi!S^k>&g2zNVDPH z*CMkvb??Gn-|jI~yC)GMYOyx%^)oq*T}HdxB%rWQeK#z*zE^fiwG@;BK*qG~?&eZs z|1u#`DCh2tP5AHJFzOqY2POI420^yo`$15x=PKR0Xu3U);c$^1OcO=U!n(QiY&%ne z7Alqw{>rM2L|tN0-5^zZ%Z4oIcsjma>+WZ#vqvNiA^y+#qnpn%gA+KF+_P zehiNsd?BFMceIYcO)3B9&H;vzHQ$bG41fR5 zRyZCjkCPxeO87Kty}+M#iFaEW!L|$<)F!VpnsaO|ylVs7ObL!(XKY#=?}lVdOm!I8 zn3Ajvor|bWt9#D|j-`;|!Z~HhX{A(uKQcM6-Ca{EKL+G{R_0F(pipm(yM@y-Lm+0k z()~--uE@fDD#S@<$Zrq5WW4~@%Y z&gum6&yqoNrMrA}?zfiF#&&E@K#{m1J=!e138vhuQ>ndsnQxHq`YR6_0{G~c#&G|U zZsZy65!jELu}QEWkGV7!g?Q10QFa$`AE z8>q5fNW8{so(?wF1&>a#n*x#ak8QvV^%S?4G2`b|g#5^6q~vLJjr%;A>i>2exvmN{9tL1rw6Sw;ENQ6eFGs7h{W(SP)AdCeR&W-n z4fiE9*lHV4?k38&$R}m@!4Y^E*`ph!ka^B!mK5*aKEgnXRvVi&J6&I(&mCYzxELOj zS)HOIPq1w%xe9hD4KG4R=>>~J(Cj>Wj(;cA5Hhc0N9TbeqOj!# zlZWc1goj|B(JKPMqWguhn0EL332HVSAa0#d$K`LT(~Fn^);~|H38_OO;z1cr(3h&H z@^p))DZMLh<+K6l`atj~8T>(&zF{X{c^saQGtoJf$6?pkKrtiBk-NqWFS&+hQVGg+ zLy{`@N4u7aeEbUnCy#>#tbLGf6`4;@%wNf4DoW`r!2>(E6GY&?e~2OS^D>Cka3nqH zW#4kuTmB>o&4ft_u`sRr|4&^1Ps{4h&t-fvkoTETUUQHSu-5cdGB&r_w7GP@#Wv~9 zh9*CnxN2$Zi*7RJ#m=(%jT^v2yyTMz#4!=a~HT$^&H#H9C#Fx0fkmsp4M zRz#EGYN->5u-iFQ8=CwQyp_|J$`hU;;sR-A`PCc4eWTxcLJ8j_Om2xPI~!?27e>~T ziH%GtE>D2Fj6ld2BX#Vs-EzaFEJ9obk`r7Gu5dk_EXdhUZ)j`r_B5tNZ5<))``K@5w= z)?Vt2(_IF;a(%;QsOjlP3*UUEspOr!weD6arqF`#twh`khL9rcka-fh8&r!UD(S$7 z*dn{SgFLMpo>I;8?N@}o{135$;xmO^U3N;fd*c;a+9$hjkxpT4Z7xtjLEeNzEXBgd2xGboGqgF8ZQ7Fyv(>TYC zmSbGlXX^MlcLVF(d!?b3F`}k6k;J?E*4?13kMyI3%bVoj z3k&Z?sV)$k`gLXGie6mK_2QfAi}7Xhx6-j<4iZ!>HSURYw|jDfTxE2)&+EX^Zh(gq zvBPsi!Q(6R7)_D;+J>xqkMwXlvZ!-kfG!97&(yUt039)=SP87jJ`|bG1T_SD4iNVDDDrkSk>_knyWTWcX3V^4_ z(#T|XqS`gXNa55nOVIZDu$DC%UjA|oH*&X#OgFnvR|dx4Q{!yje!ly_&X|^By=qqQzwlub_vVP#|OyWazE^SHaLb z2vL(Q+Ppw}QSlXqydhS8Db}+zbr?`iHpT?#g0O~}cYc}f#Kg)?vlS9O+H)66rvOO^ zUX5F#>nZLbym-MVPL7(yK8O6t*Le4!9Y^o;x|CeIfT>($x`rRG2VZ10h;(pEb?OpE z+3tQxVi|vsrBYxAlQ;yC>cf4Jiljjtxng%=lO(M99c&?VbcKX(NYF-d;f4s{o16gh z)}~)Zq?71#WWf4Z_g)CYAfsMW*^StZhJtEu#l*_IO3u!7Bv%)*)Rbv0z|4+2~+rdRKI5#>^x?p^bd7@q2rz z!9#pt;oYs(TDT4F$Ln|aj<=87uI7bX`L!I-KUXt6Z1j;YPW)^QPZ51e% z?pC?Nhu<5U1+8Y*47XZKw-wuoOCyud&y0`b3(s$1790Idd@Z#5+$;+=}oeh9vr9-28qat)wm7 zj0_I@%r-y$8t?80mpF{fe46lS$bLk>xSzFKOINe^3W8n^Nt;pJ$(_~oob(6X#^LB)naa}$9ydR7 z=c(rpRrF#=JU{;uRE2k~m)P&!m#e$clfIkCDeenfD^JRcPaGX1KJ_6dglq`2cwTo{ z`v#$bEk?Dg&`=`nf1JGCuU3a6%J*??dTbAVsPWOI8T2Ty z#!>Ssc20gSzGzG3ZDFb7x#;^?k=D4kA$~S2G_1fkfpoI&DL#ld%zl{A2OJG@%LF$Q zdbT(T^co9@^;&=p?qPEZcb<(z%kxDop4;)@Tsm0EQQbb;r8=@?+uP5SSS7+}oRJE*;&$H46l*Z69#ik8Il-fsq{GL?VBwJy(xU8rc%GJuj6kD z54G}An_AX|bJniT;BvRr@oqjUDj&`3t%R2L^Io zL+b{+Rd(1oMg)kDksDlBXMWm!JC zD>&6H?$1O$2o8da`>B+YI=ke77hkrkht}o#2A2f?xC}f_z*jF&De}gP-`gTjy?CE3 zcchEUU7Y6zN4mkOZg8YqHRebc7rDj0b4&c{@)A4JrNDS+x%k;#HgNgnOV=#N*)8sL z3%+rA&UbmGCQj~#mkq3wJ6+yNed6MVc-5K}e4z<7wruI@)$&4&C*BH7qN*#eZey7I z;~Iqt;wdt;s*KAlyac zu5(Yjz52BmV~-knW8|=BhMi9jFGoo;V;|h|Zc9?3M&*zZTcc|W18&p}-bPeYmM2b& zM#7u^YSTa%HDva5H+RV5N+Wlf+HZ^`xHd)y_j9S(rlt8H3C$wWb8peHqS=kBnT}xWqc@9Ck$?SzGF`IClN z@1o8rHnb^`@M((8!;}Mh?94{P+)c&{@oAk0vi|(x-TR|-x1s8e2>(3xPt+-B*F?I% zUXvE))@W=s_(O;%fWBTDFtbK8P!ncA>L+1l4R?w(BXWnt0f9k(jxa|C1r(hv0Mw)v zXRJopK{@_5MQOpLPIFQhslkTc?5=1B53Pno)95KL(=?_w8(*8sg+EqBn`%4OiePDA z&lQW5-4s+dTU^&%krMG9Ir=?azr;^NC74Dk4CLj@#y%AHskRGqc{bKi6t* z@Zcs9?KI)SafESWg4`n5B~xVMB?={9PO{a1k_L8?H9TLB^Hm7v3-(vd&$m&|SO4Y< z=<_kAJ8f5QZ?<<%w}GxjC0aD17V9KoB~P;#)zPwpp7dhQa9Wfi$j$lD9Qk3{-|b%* z5u{;)tqEnV!r%zsc7_J|N{ykC4GYwzaj&{)G_oG|Tv|k|7ybfa{pE7He$;i({XKrB zTHmLph2mBAM<1(feydcbT7ayz;A+S= z<4P5QZN^oYw+HC1K-7Fq_!!+~1-1OFF83BRDZ>I72l+8LS>S&nmUx_HI{q?qaXWnZ z0}iIu%yfZ~XsW7QHUO4}k!E<;s(D~+)u^fI?oaR|exbzsv(|d0Rz~G;O82PerH75% zL_~*(|A{(T>429^a|OD&wk+lfNOLWb>9S-&Y;M0_$WKbR7e~ca#+ZQ_yvqMr%_-$- zG_@CMs=vp4s|j75#8nG zX#03Hyp)$VBb;rOryAikw%TUnYXc{_^?X9QSACBv=Qab5C@b#cUQ;O~nCpJMrE^$B zlX{+8_9r4bsgkXe&lRc`<)e6m2y-nO`Cve3m7CO5kd`zUfbAsnIn}}&?jboav87`+E+|`}# zj{2j6oCHnwKd~rq1UC5}>YEwuI6!$=pH1Z~4hq6b#Sh18Dn&kKsSE5|^w<6<%%uT@ zEWh3|mL5LZUrtANNm@$prtZ;bN0vXkc6T#6?YlLFxE7}ps~}G4)wVyRM0>?Sj<;bS zZ^ZosL%(x#NtY2!Gqy z6Z+x2C?|dX5s7l$u_&i#Tz_q%oQ74CXX-WXQkf^uMeG$A*cT|3U(sSk)<1H%@*FtsGu{yJ>96gnAAmzaghcU^$fhCN?#J z{3Zz@FTdGltwew`u|vFUoP1%4D%@z2)#2qg*m7?{e$y_bU6q%}Z|dTt@|$GCGWpE} zd}KDhl*w<+iTswxZ)1X*NKPWZJp+AQBEKc_8*3)0;1c;QQNcYs6kOceoN#x z6rv_IC;B%j@cw)BZC^)r-%($4<86^LZUThvQ}) zVGpd~0C`P5z-)Z1%!ktB?D2=poNA99GIO4te_5u;tQA+kS7Z23>KQi%GZrZB;MjBd z@%(>h)ZTnA%KK0-4=9Fx-XLJ$^0k9~>((vlA6&ZPa$@d=sJ%s?!!Dr65`Y8ql8C;* zuz%H>?nE=VFcyYqrZX0tQ?~5Ag9L;dDQRI|xkbeeDQ&k8&T~qEnC)NWvP;O!30~?jhf1jgV2lQVh6Ji`~J` zNqUo6n$+0X4Sfj9BmO3RU4}_W4S5|N;ivAR856c)$)yPf17q4X?nq4)cf`nmlZ>cAv$ySdb?jr(;T_DEYQPZ12| zY*!7OH{aJT^5Rz0T+ax(uuCrdY( zztX9%Zr1s_t+F?|jtf5|rtlUr=-WGe z3eQ=m__;ZsI;WG1*AHQ=k>R(&Pkp(cak8I!t#>@gv9h~fzbO7+%8<->f1{szm3Pbjzwa-5&wu~xO6S(C zpoAW7@$j5pEafmleXFbxr|CjGm(w9SMRtI;Jh6Mn$W?awB?i`0u-GdLEDFA|$llCi zm$gz&WI-Ik-A72i#p-{otbQ|beTmAs9b7P=PWMfGE6ZfB;6At1&Uy+kS2tzbSunNS zfwxa}|ML@6AK!NvAFG$!5Ez7?r%UtYcBE67O!s9ftH=3xRSVw>W~8^pO?|essWOYn zJaBx?x#9Ar-InIC^Y%*a3D&s{{r*DitSi!HxOEKBx^N-=U!2YQ3mwb$n4^Wpa&?zw zq!+q*n6EQc7co;U(7;Blyl0-{8(-|_5FulspV#T<^jHZ@BFV#Hx$J-yH*S)dout2l zY8)lDd@`S)1F3Y*M{gG;KJ5_G>C2&rEl{Y)uQ72@F{$o6c~nO;H6(J8ve)3x#d1?yXzwD*dst z>?NU!1dMBo(DDHC03K(9wQt_4w-+<(V7R)|yh{)*XVz?=T0Ez-pDFv`RoQ-)r@Phd z6^$o)Ih@^n2ewfm}Jx^=;TPbEikwBhw?+t4GRu1)ZVsMy_<0!|WP{2Wn8+(_T<_cCdM!LuXn;Du zw*`WoabK1ALe;;=S=q5%4Z&`ZVV_1Nr&FPxn-Nr+&ZRY3o69NB&Gc3NWhd#j!c^ef z)O8cuvYCt;0O3DpxIu`BT>8i%^IUiPSPheQ(1JAJL)dKS>!PQPZP!^)D7su5(rYY2 zLd|G~9wWqD>`%u{(?ZPHu-y6XCQKo?heEq4BVmslq#rVfXmWdFpxE;i?;Zf|>2m?d zEzE-xLOdWV9uEG>bni(!SEq!d2Fg zZ!{S?17dKO66c5`zOm105CQuUH55sRWpV_=%BEx&-r)WSi{ZLm!^fY1L6ebEkgEu)NT%5tz5)n>Z$1{`A}3y#k&>R;v4z$7Cqg?%uMM{rw>TLRR;F zVxkKqAF$wv-hGu=0+M0w+M1P}n|EJf?I^?hLC7j|;N>00jHFdrTHGzx^{C<*;r|uT_)lK~($WyxQ znJwKSUf(}OuvkRN$I46Ux;-IhzD#f@~p=lt+$B~PRM3xHRHZVE)@Z@u?Tnd$iw~60{0~8a{9qUq})%o z#*7bad{c0Uw!=RBV5>mY>fW3>h&V^i|Byh(z05bULnd?G-k{uw+>C>vs(+;_a)3e) z19<;c%)7(R#klr8Ks@c{%T7vCy7W_0?p^v9h(=tI!n;`I}m3xy9E9(ava|JOi zmft7d?iD1m5N=bEk$mN`)BLpbtLWz?nM)x3)8+fyb75FlAKWXT-^vAFI@x~nk}q+6!)~tNIb&T@1fk3bl2K~ft>z;1#+0h7N~s<_x!l2cD5D2&WcwR=zW2R;sU#f z($moQSoChk7MNrah3Dcj)wH=c*w({{Jl6xQ=0Nw4gwEHypPS=}av~q!b{88Oiz6Hp zAyN1&ZlhSpf*`PL-mj+vO#C$B{jz`O=EYYx$*-6Iyw9Tfh(U_hKLLY`z32&R?}UlB zgbQy9x}~VH+IKc%=qn09oir`_95~wT}OWdr%-6^{c!1h|$r0CZ#14C_4 z1oV^L8)C3Oy|q)aq!I#2dzx$olJ+`FY!6kBIa!R!|H?s?Z&*lx`afS8?R~I53)ZPMp|n1m0wjOpCsvH#_#Fl)@`a zErAlN(J#THxdu7Elks(`*7{TZ|GEf=z0aB7t3tsEvfFS86oTXape8O5S$;Icv<6q zM7s?H#OY|1&d6>)*PPlbtwR+KdGeQIZ?#^xyZvRum!AR2D=!jmNIc{k3SFoH4unTI zq!dF5+in`WL2iX6tU>+5;;xClFd=COC}HxIcftwnc7F^v5^gLPyc^uCVO@rFtw%LxlB?t;3=#&F%?U@Szd)pG(oEeA5juh*cvh-rzpDmE}>h z4Gc9rB~+TA9WUqyVl=$Bw7vowYF8o3`;fHG2y73r{W#Dc-FrXg0JDX~d5dghQOHT&F>6$lBXXlTh#ez)5yF#WX#Kde<8C z9P52+3~$OF<#LbeFqYucyK*+%S(sCARvy0a$`!5=S|eB#lnJC z`fTI^7q?^6uQ5rfu|p7kcuarr4O>V5R<1s{)6@rdmG9Xu z)CXTR^}z>BeemT{^})3H(i(sU=z!Jq;j{+nPVQpbO09z~a%(;>Sfv+*m42;n{s&D6 zOMABajeu!tHgge+uULRtEM<>u-Ej!2X{6Rpu4=UN>~uebmErtYDD}p$nd&T1)myi6 z?oqU({b9VuhbLU)-u;xiI>W-ciDfM>aK*c-pTsNsjfZ783QR{V>JqoJsI9F$$EVvR z4&x^>Y{7qKlmvcpO{w@}Dr>QxiM;F}0cl%32?E;58ySfA%=ibE%pzi7 zfDAk3DtEA0MA1fghdhl@vfX{UbebmOIJozZrPOayPsf5I6jI+6bs4JpwoMt7?N3Y&w*ktuSxsrW}E;RUTpKtitC9AQ&@72pUplRT#&_8-~z8N z>(B(!;C)xc%IzJDSRfq?PQJC-Gsr#_%U^G^8H(jCj$93swgCgUKiDk)vE@dN<&L&=T z-?K%hlMz@7qtfx8qI~FFyZS|PYS>jKoOKr+An8aY?H=5clF}7yjW?i#ev75nx2Adv z+wYQ5OoWDE``w_uyC_-1VC-`&Y?jzrLW5p(BwKLplHM94;P(vygD?5K*j>8L#?J-1 zUYru($==-K!ECFC!+{!OT;bD-zKq42lC+!8D?y)rwh1C!RxP!bR-$w8otbF2M0Mnb z?flGjpJSTFHmg8&G5YL#&>BzuWtKaN-8TVSICz61ydR(S)3HRE8hs5)@OtsGRvKG` z9`_gg?u!XT>C6av?}?%JHN*Z=c-c&&&(*{>xUWNA@_X)3stSFA7QLwgG-IutAJ(+Q zJMT$|28f4e{(>u0)182X6Gr$QKVgA#)Vgm}c8i|6pK_RItoO#Px*qS{!BqFQt2A1| za&kCSw4BNiG0(8A)URS1@Vc$Tf!rQ6u++Fw1{muU6iL<$lj8CH+_Dhm0bmz3GuikI z#qG?neEqft0x>4_5iP;$h9isqh$Bl~=iRUJ99idH#cjr%cyc(#Ou2-$F~*EGmAF@& z%TCFkAHa4$!bwrxWneR$cx}9K`OMZV6E1njyN?(M8{9sKSQv^(Obn}!1V;6$KvW+o zrE|tc-WTKHr=4qm+Yvb`yYL;-!%p#Qn z5&-W*TnS2!(w*c^E#npe$xL~KukL|Zaknhs8$laPr`xDqM__F_S3Jx#AU{!Ajr+vb zy~5f~_emRSjr%xdB|2ym6qEn(3H1@3DXLb*BKK%OH+R47Av<|Tb`9Ig`{Ui>qlS9* zWYON#bajtdsaCg#q{AGB=jq0$3LUiL1+Sox457;HrpGZMiBX0xxFz!pZwFnjie4df z;y2H+jFuh=$MQAb(Kf1~yOgq1)xJC(H<~OGyh4Vu)uQ!zGOZY>N0_1>b%|+EQCTt7 zy_lMMwJWZ5k4_2H>$O|5QC8MZ4eq|J;aK_8so|K9-f?(w?j11#2zq%nc7y4p5n;87 zEmC5KIc|6FDMf(15O2nF+Er-qlTfIL}xKM}zZU?H8#P$u)1hY{vZU-6? z<~*@|tH&xX?0yp4H>0sP`jCCAM#g?VDF*4^twP>i+DMDIZHhr+A6&8=LgR_6@R;*uEvUZ;9<&V*6HN zPi6bE#P-b&4HDb8KkI@ID)qeiH(KGu_N`o-7`8LUh>L99%HPqXCAM#9$2qVqx}PUK zGAi4#>v@UoTVngh(m~yv*uG)KmDs+aSLXh6V*57UQa-VLOKjilygadeOKjf|r1F*o ziS3&VR1({_GJOEnI*ILDV*6HpI-A(OCAM$4flF-PN(|i++qcB_EwO#$Vrb&`E%Ez? z9xCzsmiT=uT<}c%zHz-d@%x6^TH^OD@%xteeUnvdk)?Cu_bu`JR-|PqvUk=+qoP}c ziQl&|e+jzLcsOrfXfPAMZ|;4;jNS-N;`gls-)A$&-RVvIzHtJQ*uLp5?w{w}I$G2POg)fr%B9H zDG8I9r-|*`A;?8y`$8AZ>(Vy zr$npn4bf7Qn5Rk1(T%RJhVQ=K>Izx_O5?eLC561&jp=UHOTC;)a0t?stW*QjRrgQ1tcxB&R*;tWE{pZ^%Dk>}fwz7if z-`CgiHvIDGtJn4A z<}c_P92m%T4XqpOTD|JBt`*CcbzQmO%q3@@K7X)p`O2la`Kwp08M?A-LD#A^%T^C9 z@2jw^`Ilw+tjl$-1WXnEOV{O=tR7gwo2#g}VsKTi zZ;9#&U)Qc)n(H4JyqvcwvBuiSQBYJEwy^c&xc&!l`34Vik9Y9EnBjD z)iSy_q{Ny-4$TIm$y>T+Ihm(cR50?vfwdc!Fy#Zw`$F4lY}wM)tJSSqKw(p%@h(}H z8|+)EaRQU>%Z661&dp!7<{a>*qQbwRqPp_7`{+9VxYvu$Wc&+=6H?Oy;Yc5iyX%xc zAw9>}?(rvF>?1AI+sRPp>reA981Sck(AQrRV)ULx&SrgoTxKa%6_rz5wA~+LzZZx1 zMc(W6Vxwy#o3rN=hx;hk(U~IwlJQT9fGw==$#64)u+V;1sRqX!pas{1Z_uix~d!h`0@CM8N|Y^rkJ>GzuGxlVGRtA|_9HsY04@ED1SznZ1%zKpi`@cKu!HY+>ME{wI+{V=P z(c);@%d>7{cKb~?zbZW|8i_JDy@9{eZur%LXe2W-;{D4hb+Mb8bwk~5YOh^=Ye(CPkC-?5e2hOD%Ix$k&h;jJnxwyk59FVcGJ_Nfw=wOqN-}*&o$3nf-D`sn=9L*xHZxDsh{WcBP8Eq_1|As zzt(BZOH|H%m?Ji@)$QG?8ha={&DV<$OpF0SZwm^hCO;gXRex-P>RA>wr}~Zs5*JHQ zjJ42+Y&$WUv8KKZn$`Dq`>Gb2GHg>*AB~&(XlYa9mP!DQuQ@ji;#^}cDR*BgwZqqm zWn37!2P@OY*6Q5HXls%=061iQ+OVn3yn-l`Ml~9JTEDfYp>yKn=f@tl4r^tk+Jxj43-x_6XnkJh0IQX@Z zpCgzPqt`}_I)E3=xYt3ZS}y>A$HoAxCrJ>>Z&W58mf`0wjVe^R*IR)C>ixo{=yAhB z0N8`!F6hh(%d&$*+97SHpTTcxk)Ji&rxwrY%rg0Vwq&!~4g9t;osClav&aqE19T$2 z7?`Hqg{f4O&e0~~(-|oci*@-y;fJJz=72yPD@2>k;T8 z_lHy}gT#2_STz&%la4+G0H(U1LHz1zypEX{@vMu8%BOxKi7LIOAE~r%)X%#}wJ*%r z?r_#ke%{$rB8kRd*uwNqV`$Y##ejT;0eVcu(;Gv_U_B*r5727*TpG9qc)`j^0TZaJ zI8q=qEFUV6`@x!`5GwF!_a0#0xPZnkG*Vqnwxj8#U@8#yux$mf?I4n%7-QUaNqX5% z(Do~-)IqiRuUmImDfd7swKL;00CxIqzV>3dxxJL)e^T*GETAqzG@k7q4mAp8nCA}n z2>@3cR*{%OGdxKgN3+`KJI?pb>cZKyW?g$LA8Vm&C*|@AcrSpO?LJeM`p=}E zXc<=Ubzj-n5ApRVqJEM*$9=f6n|;w|w{-jYy=EyeMB;~#*q5_*_*mWQrSjAYX5jlX?!(>Mvo$l=XXhWTFO zez8fU_YC(sdvD`CD+vfWq2onC_cKz?Xv4*N_`LC2qg#OUMpc72Ty?2GBYl~#Ixo5@ zYV1@ut5ZU%YPV9LdJxK5?H;bo_CxyFVN&w)gY@I>&FKTSCOrcTvVM;(oVQ#h_*g45 z-480XrLJ*rx=KX7#eKh`8xfO%hZ0?2c?;|3BV; z3U?Cjr$BPXVyk-lRarZ1h}=&q;6{9H@-6dw{G2X7!)kLmtq@WFhmWLQtMsNxDxJ~g zkw<29@256*Qoi0htls8*j4Y>xJDVXjW6*w~_d|a63#Fns`2ybzMnr5X!(x9+yx2$G zSt);tyJ_pNIGB4IgRFLYE1?9l*mKOgXt$qrNrC#__-v@}bC|P3QC}1ZdFtC$Onn>O zcR^;6-oUMTJUSAiw$}%88HDKD3P3fI#-2{(^A82`$%Hk#5p@60S;zoa1i~lMX_WKC z#iE=i_xNTIjD<5*!+#1|+iuPf3Pd^JR)Hw@YRY4xJYV$IWU0xBa+hzDN@9huI&vSG zn9QCBb|KmYdJjc?2o#&`ZYiUg{|-oIyEm4l{s*a|v-91Xw)8{$egHAmbFjG*CH;>; zNhy0%S=k>_7AmZU=C~gj6~3jE3jeTBcC@VQk3-p;x4?_%xS#0F-7G>kKUGADe>{#7 zy9+!0H22(YQDeH@giPn30X5bdb)Nw~@iNsSZt~Ms_>Qcf#+qvuq0m||RQO&gD!g4g zvh)0NUU&#>=oV72SfVUWI{ya3K_{UaR$ZVknkZ1*eqN3W|bTBb;jj2&} zfBB@n=i}+&W4xlR*)Q8DX!4ZE-Gu}rs`llr*;sF|3!KUzcEFK`{3$PD^)ED}E-d-1 z+I*139VpSqCj%Y1nhQOP*GgDXzbfj$>*5alYHObMz1BK#3e%8pI=c%gt3h$$w63bV zO=J@s%(cW07X5Z56-*pRc>38UXh)p)SW#L@Y&g*?^3N1}4-#F5ETnFjDDmM6x~v=B zCl2|>a|G9B^;KFFVa3IiiN7{?4@;no+^-occ)?>nUZQoZOhhd`g^YX}9+#4Yfr{tZ z6+VbG+n5^8B15>S-T+Ncx5s*)J>^hMORejxOCf*6DW$NUsMzGd229|>o38?PNFLpw z$NF8}0AT8{_E@#<+gvS(Aiz7fbZf%c1Ku}fSF!~(xkIA(qylQP1x&Vp$rdo#0*c2a zTfk%sm}~))Enu<*OtygNHIgkLTdSR!X!2c&m}asCeEP^Yg~=8$IR!+?mYf16r+~>R zU~&qGscCWwILU!satavRU?iu2$thr&Jw|d0n4AJ8r+}RKWjXXpP63lsz{C)gL-fQD zG%*BC3_&raN(@00Lr~)1<}IvBtxFR_P?_B)hM;8znTa82VhEZTf`xmBIq1$4<>K(3r6cL56*M-xL(Y-JNe z(8L|gMBZx>cQA=N7-WXT9gJPpPTavH?qCvkFwepnS7Hd77=k8-pzJgfcQAMWN!-CC z?qCvkFo{P{`J75Tf+ik86OW*{BThVmCLTeHJdK*Kzr+v}Pt1u&(8MFC+*Fi%K;M;k z1Wi1G#_leI*=MPXl43ujiAT^V@d%m(g-C)zaMXP$x8zAsh$JY)A${&9K_Ofc6e0-< z;gX;b^3RPST@n;RT3nX|g*bGWnItGg5)@)w+_K~p@Y$UL?%)JDy^{zVaa_R85a(l} zxPXe`cqDfL31RN;Bjinudz#o*$1SwVpCG#7kwgU~I^JI@Dq#8re_mL?9shM<0g3wD zyiO4SyV0yD1Rx>p6x(RU;UfWBJT)Er=R?i8pAzvigamx*P$2=e8~KMg9^eH;q=MVV z5dn$c7Doh}DBQ|~5dm+0#+$#z7Vqa-MFgygZpw$-IZPy>5R|PfHrXP=i7o2&dA6a5 z+Mg@L6+B>YFN!NzyVy@(>@yd69{xI_3-(MBUC`AiBI9hgrY!Ik@rP!+PnJ10xF3fo zA;Q%o7U62QMYwvTD8kkKg(y`ImzCWUqE!7W$@7T@JIBK89YxGN0#y+$a6SP%dwrXt zWbGkRRk#^LNS>1Th99SnIZ^7o1^RB?UQyQVHg#L!CX2%&Dk{lr0-BblK1?d{3qL_} zOD?qhaH042mu3EB=)GzVz5iDw&{A3N=eb9yqs{FmM%x_sNuH+?I&B{K(e!-ZzQ9kL zPs0DT*oSe*#6sx9{g43HKpY@qyH%dh44sYKpBPvnvf-Z<^3bBoT0Faa$U~2Hfo{X6 z_p|aR3w8*FKO+PtthyBI);9N(O})Nj*Iy*K;S*!Q4HX6KPNvhs8g>`OHB1vn@xLXo zVQIv~XS0Xh50m@|p~Wq9rA4kJn$yK>g52je7veIOhuRv8tTz-m+H2wqqIbjOcL%QUUl7MoLKLh}&>0uUFi+6$Q=rV^P=@;~l;P{k2;0vYS0L#(8cF|! zk@OpjNcztUMDev{WecMxsvwUsFa?jwdb)1VlISqn=?6uq%%g8TBp^YY;Z_Y}e;Jc|^`r(K1xd|E~p zQcx*6mRwBTy^$LnE)4{D*+gRPa7<&Ab!696wAx(&jbS&sZ^pp`-)XVf^U)6<&rjga!ufC>?$07++_7?luez{k78#GOPbviW z-;c#O?6(+)*}ZfV;Qy)+xO96S<-yt6?wJPIG#C>P+oDj~5+PpV{cd+YUShH}o-|xy zvNaCuxrl}o9ONWhW7~y5R>imC7|#n?(1(uk+~eD{>J`qIsPn(8I3i~|$<{d88h0mK z<78`$T#$){u5l7svNcY&#>v(=*&4IgPPWF$*7(Sdj+3o%RI)Wjt@5DTEwyBC)MP56 z4{l2LBjESC&riwv#+{PgZ5w{~CdvQODMapz{7H9mX5^!9L_0Xga_Lr-e5k#L$$yKF zO#QK#vx0VaC*_)3{qY&!k@0?}9c6ZO`_^-O$0@$`0$+c&X-ss|iRL838B)7@A6h?` zp*U)guWmtY;G=V-(9zCgj(c=UiccNxBb-9ioYzenqQE1T*zWEqYpykFA;UbkZ%TJu zsN2`8!X7(Z74ev;Niu8;W2H4aElQm;+}YWwrq=c!NH@Wv zRO+89Dk>@~mh(52`h9&Je^V*F@L$)^y1}khYnH7ZTHaT&tgCO$vaZhXTT!ttw|v!_ zT<1zk=rGp!mtX#ToC5e^e6PHyus=ee|wbnjmg4V2od^4S0%LXpLd|*w! z!LCmIoBx{sC8cX%ZLVu@W!Lh)^|^t8)$96l^A~gt4h-b1^Q%`~*0o~UvaTx^oVn!8 z)8`NNEnm4bH-Gi2HA7c+Ehr4FY@G3kyDl3X$gN(LZ!6!U{CijD_>|IK#&5;7cU`tB zx2~cBNDeIT>s%(_tzEq|*FP|Ld4QVWw}jUfeYyUj)k~JGT)Jw_5<0|Jz(?sN%Ldj7 z>_D)8>AKvK)dMTSx6Au-OD|hJuw43=XUYZY#=COG=)3dg<5DlUEHbUA-!|A@owSx^&I* z@WtBB4bV%&o!nqwQOEjMtyvy-Xm#J36*-|5Aef-Pg|Q6MzsrXD`}+pT3xL4U<$e7; zM@9HrRZ)@Ku(nTNNf&0qo|g@*S(jV7#voQ*QNe4j?@Ga%moXIQy{4i9NU1|qMv>gA zWlNM{$?73xpPH|B&{9dMWtx``F1=ihGKS0hE*}_-0a8>ve7tPwvR7WQba45S!9E58 zru3~_vhr1YV?Z{)OV+Igo;e$&0J3UbZeRtKkHNlgO>S^t?S>^Wni)Q5>IeJQty|JR zxOBzk+{yXpeu~JBU>TM|lC7 z_Gk|j?N(DU*SNYIlx)BnNZuZa9(>iG21(4EZR#9^_ z%{M-WlZlO;)HWhcz;BOKym}boe6+>S802w1o5hT8Jm06EyH;7I#jI$%Z?dc#%+SPf z*dP`)J?i(zhq~;22JdI_eu7R5d;Bp{Sl4oT=TC6!vwm9d-YJ#z_9s_Jug*wrhfylw zTUT(nYANqZcU#IguIP>rcixpwMY&NSx<;N`C1XNJeN5a< zPZ@@)J~^zy@=2DHuGp{p4ChD9_Sm4m{a!DDJIj+_Nhg4#GGFiWjXNe5hf*Ih{0g`SF@QDF690KxUlp8 zJ}zLzG7c9atXNWeOh_9L90Po!gl5$Nw*1ou1>5>Cjm7n00Y6TGU99`|$kZJ+P!F7R^~`sz-qsfrpA zF>BoQo3rO5Qy%3yI&&njQdwbDWS6ihN8_Z;!WselJX>X?@8i@vrOa(^HF>xB>c!o@ z_IZ4{06DTy1VULTvWI$}%5V^;7LG-<8YxGZ%eoN+TOAL_FG45Tqb?6P=>iF6i@jx zF@thS%0RH}TpGBL_%ldPt=qn()1S$6fBY;VnvXxNOzj2wH*HBD0Fo=c%s;00`uUyu z`=Wl2^&q`)(K(D?=J^@woIxHJRbJ6z9Kl8D$AG|Y(Y)z#3dk>el4E*()XOF)-R~ZT zY#kH1sbCaC7~=Fub!<1qWrXb#43L9kPIaC8!lu#Tz$@;XvNuCgyL(g{tIW>r+kJZ^ zknNH6g?`D`5V;Stv57#Y&u-dfACC?n{ml3`G`45ldwcwy%65kq@3IQ9^%B-^XRMkU z@t*qmB>ZF4>yLFWO=D345cb z_v|?sWj^3fiZn%8J)S)Fc;dK6e-h_FbO+4Q{z?O`!#qzQrHz|l=n{cDZDbBL*V({ zR)7+umYOJiD!BIn;odaYoDxRLb}xO;^myxx4!A z`1AdIOs7P>%>GZm(*%Lv$y#YcC%D<-Prkv|o#Rh_vHqTQm7lSQZ;Snl$W|SllVLXI zUhJz^oZquB8W|AdeT_soA3aQ?`bB0d z5VLXgFKc8X(7)QVef26|`zp#zN&)u)?=cFP^|fy@lG1OYL3QOk)DbjV3(%&M(`at( z0Z|Yo$27N;63U2$*#mcOcPS0C@nXsy<$knzKgo^m76(R!g#PTVVXch4qTG9ndS1Qg z8Bp%p-D5;Bdj#E8L#2e9el@#yL9G2Rfbn*|&vN@VL)B0~*b;A$VEH#O{3qr=HJ@i8 z%2h;aR~ilzKiZfA(QbpV26D~lYur&lF`vJaY}2t(Odq5tt?o{GGJV*$roj#H18hAY z=<~2s>sSwW7$s?RSM2vQU3I^ob*(>Yv7fotpV04T_L_l=#Ls#|_NORP&u$<+!U*;; zpm`F?JF)H>_EU8gc}UY#Eh=#`RN|~Y|J)1wiNpR_s2DhWezcR%RSlp3n-8CZNM~7P zk871pZ*9v!uv+068^v~>Hh_7hiKlGL`ID|^a1B@v=NQ{8%pTF%T;or|zAWcwE%GP5 z!_OM>C#}=#Nu7FbU*~6a`IF`|%Ee8Y!oLvqls_q_e88cJ2z_*wj6R|)pAh`TQ)mp# zyKl>mc(RHYOFc-PN8CL^IU%kwf18+%{df7==d1X}UVt>g8nZb*5azhq%CZ}%zJOwf zlrjq9LcT2*-8KQ97Rx31-i_gDSXPMlSRx5O?~q+tz)uu{fikf5DfD_w%&B>ZiP>$v z-fx{2KK4R=HX=z39m$YEM8oU;{FtjQu#*2hqn4ZpL3^fy-JcFqR5aR#^;}U&ted&2W0JhMP@~{+YwQ;2BS{q)3)YPdv+2?!#N8NA7W-W!boBB@A5} z-C6FP#j_ufwO2!l+~i2kgd?kM^bMDlLIGqigF+Eq53=+HehhSf59nYgR;0cZa6+=t zU66Mzs{nV03SvA5IW(%rP-t|YHe9cA_Zk!$-4`mg_*MO1D+Izy*&n0MUjYcl7XP2I z9_DCXv+=w_@>u?d!-obt2-XWs*I1 z$rEcDHUoN#WescP^7>J1OH1;RNb!=SiL3K9GiW_tecIs!YERGUeoVWSoX5`n`7Ha> zlJklR7Uvk%Pxp$eykEKFWZ)5tEH?6t8QLCDEB2J0qed)mdQQ5Z=NOJaXp(e* zQtz;IpOTgm?loJ|y*7jCF4MwAM+1(#{Ap2U)Hhws^U#!P_JXb2a8lwlv@!to3g0fP z=L`8(r%NAf10*m(g)-a%N=>QJew^DRZzDr9;z=(>0e!u`)VZ7rKuv?5bK7*0TSQjV zcrd%wy<)Fawn%2t>8Qb4S*Jpr2SVlc_V!cjD>1vuXL9Ze~eGIE5X< zzkpiJQGL$OcnO?1a>pP?Ow0JG83rOFzZ_eqls|UVpT>;qHJ{9{s^6dv(34i{HycaW z5)i#Ey3D&7+LpTWQBAl7+U<1Hk44JEFUlKrLZelJ{-otXp9Y4pl#QXDu6Ik|4Os!R1an^SC^*Fc_5j57TTDR`Q@nBCz$l$$xkYy00*%Z0qv z)v1n?IPf|8Z>W7p1)+aZcGaKBe(_4ll0CkQ_Y-#cxjp{4#r}k|Nn2#wO#L2>wqjZ^ zOg<@^;inDQ*Pz#1q5b19gr@=RC(X@s&@mK%w&^3e$*mnGdA4h`OlRr&?_xsBu}=}9 zZ3z@sXYX9|9;37SAy9$9G8mm58G)@~!xs&WGUS!o>^8d>95^7_*`pg%=P8p8Q^v?F zrqbNjWsv0QPH`yZo-h5wx!wLO_k1pycl#L^0$AYM*vSMm1d8egLKi2XsZ!yhn92O>7|O>V>pcevP&SYtwUK_A=AO)o#a+w`$$PBh_{NFV!aFZP&e$pmd! z`e)4k`hK5w)wv<^yu@m0!!rFG-*%D5 zlBGdvh#o^x)Deb;I=h+@t?g=5MPpM_8 zxNA4*7}2@kPuZ;m-ev8g_fFp1BX`dxcr2RfcK3HeBD*(uY(7snd5)z_)}JV-c6n+2 z;KvMdnkk$1+ko59bftGu?}_fWXm3*Pk(6o&05@+;XERgksQoe9vq_6>D%$+b{juMb zrtJ18y*p{-{85jnLpzNeMuxiHB7spGD>%8olvJnh-`rv{5Usg;$e=4bERXgF{LHu0 z0dxXEJ(BK>ywcabm+FeM=SRX{e7`^|#xqXT@Yhd%JAuh#ZH-6d%5@ z*g1SDS?s4WF*BVw4aac5LI2KVs7%eJKH6$XbRD>vj;8w=YpM7)$%^}ZtCo$()04b% z>^F7+(^ZdFo-h-vo#l31scEKmqd(eJL1jB5cbn^lwnizPLBMZ7o6Yf;w>YJ=kihW# zIqo}E!z$uFwkbz?Eh_Guz2D|oWNz=2e#^b{%3N%P_N^-L*|use?qgSWLuvL_=`7-0 z$k2z?o3Pb8&3(pB49*if(nxal$Br}^&bj_H-T{LC4pT|)fIr4@Kyu=CNX^ak?_Mb| z#Z5II?g4a_yd4(w{r*MWUg~L)1K^IU1ur>zPk_&1%TF+Mm=97#IExz6;`uBztvVVJ zd2$~O^>RX$&WdhfI7nulBY|e36^!1Wk@LsG7kj7Fi=e&dN)3g~I2?GgDn;US_de2Q z`~$_iu$F*AxM*8}*|)pDq2g)q&R&CvVGb%vUDT|JJ`?|bI{tk^zoM9tn=cG-FJ~FE z0e8pQ+e!$rpMh4GT~4(b8$twcNXt+}%YDe`zKiZLrg27u&EvTle;$k#QqmGNV$`@^ z)A98yp{oUw^LZ=l-oZ){nEZ8q=3A+3B%p~5WWr_9eH>4wkMaIhQDrZipwr3AHk+zW zbPxMpf4ch>yQg{R|J*6HqJAQs1%^B|WnoxxCLE$3;VS*yFhN)X0+!o516N)uQj z2*v#>X1|9^-o z=g($Lh%oKF9{%Go)~U)!iQv!c76F=WX&FSny6sYs_~;WOHgB@k)aDhSiK=8r{W)4L z?q3)gFsk1lJM-;A-a#= zh(MY`|3s~k8{TS&R=j4?bX9TyH^#MQ-cVRGV#&1n%XrBkc#H?2Mw=DkyqP1;Vi{_~d9K^7CZ+sElER!Le~Ao?XfGw7Sd z2sl_7Mb38L(I_&N&z&Lox$8EK0=@`J4aro(^-x0K8M%X-S-G(?0lBJJm+&|==9%ge zq(guqNq=yx9{a~M3;q7IU3tXJ zi}F^F&bG?v`YAyujeA)cYyd2uXbEtuc1MXQxDokTz!AJX)_q!hWi6ix81oG{qOa_0IF=X> z`h6A>YD8HVsq9NkMF#TEm{*5f*oLE6>ZF727n*^nx~KU}U%Qn8Y$g&0rE=Tgp1n9# zg#dIgq)!hkLrU1vmxBr2EZb0>t58v~yHGn-iK}RCPM#u~LbIQNYsleChqH_)(p~YT z?+kqDGXN3s>ujF9(MHTy^`g@&+E^*KGC^Z;@|O1pX$fF;_&DvG+=>?3{rJ{4f5KaM zK|bSpVZ8gWCNQtah^ScZ>sI-ysYr+h{|9M$9Ppjg?#GGWZ)H7I`Y9`Xg=(8GSx#JZ zt$TBu5Legr65CCic)+H3`S(=b)sR^=DJ?0gM&9LS>C%R zLFguY8$;W2UilHdslxrfBX{g*9Q?R-e#&}3E+_>wd^f{apfyS4F^`0ov6>#gjD3u+6QSvUss6Vp=kaXS#4Kj@4`i*UV(rbXoL`=+)JDYh0 zXW5FkvPUZ5I&v>gl(~C=PNlI+TKZ*W?kfhaQ>ix;l;JodA?@8p9^iAw2hUEP$~jZs zoHX_*?-b*jL6Qr1?N*q{%MhXwyks+f&sNh{+Fj6HD;db?e#$Ansl(T&pny<0$#i3Z z`&xhG%ZXcpCk0OMC3w^sZ-!EbH^!^D)kw}HmqvZwvy{Lkj~hYPNw> zQ18xs-Up6@uKDdkM~dBl6?8BhFe1z`v;B|HF{6EO;AlnG*ktwxod5cv;rx^{S@YU$ zp9A7+QJj`2V--9HobQ0{JYfib zG|OL_gV)pDxnYjQgXJK%xFBN?4q;Uv#^BhnA7dm{?z*kb5;bgCJABhzX8J}&A2qq( z#3Svn?Iiy|{lt@e@mpfNX0&0W$}ZzDSWPlxiV+!NiI8QZ?8D^eb(A@ntbsvlkRQ+; z$78dh38Qb^dZ3|YRx6{D7G%&A#;BX&R}O%?seJ*x$-9`#F632XiJeJZ&H}fc7`h#j zhZ#{GV2smj3yG0Z1=}WfUYj3#4&S%J+PY6d%!}MN;VojG;ykR!IPo{b2Y#af4R4kE zPhP1z9k+)EU@-8aZ_1%BZ-Bnk9&+;|wSBA*=1r8O$ zti=5^DYmxWeN8fe7`n&8E_efMDX&~%(!*#H7ReiR3Dc8s-^C!nH=}Vtg^LU&&FKz` zK>pjem|tP}yZvzY@D{OsOZT(2eV(;F7Vfr<_(Z_k@S&d`gC7m z8!B)(-!{-Ek_P)ZXeP;>H#|V&*U7dPdJQ<=&E(Ch zmfB%BT;YlH{hWnqx}hJccriMn|h5T`CQb>Xm-BqLG! z)C6@Ey07x60$F?V0_i=Lpnj`T%P)*hrY|G#Aw_O0j6Q5~&{XIY z%d!X$ZQ0ZTAM3LPxO{^(UKGvXid10+Fm9bv@v+R$Mnpb?C48h-_t_**b(0|8Al%tm z3AYs=b>0Pb=~PP_qzHg~R+$_pz^xwjQC_~A=ZvF>GXKh95@SBhNM4X*4lY3bFOy?B z!|Z-<$k{#0j3+l{W;bg+iDim^&$iRv#|->yw;gmD+IFn@=e+Hpg{wsR8MxQ9b%eS2 z)sS;BYgi>K?dHr}bh5Y+vz}yKn|xO<=OEhzZ`HD|fzFM0pU+TRG+WBw%t9CE*5p=_ zyVC83)Q)%Gm%_)@rJ?F?YVlLo`KE35Ou-#{A;Tp^qo;lGW%9J*WhEWO(P*BZ(xiAF zg&iD8vDhE%a8n^?Zl)tOy6-W-xK$GZmmR#-sbQog?xQFP1~!k90Jl0dk2WCBfTQM^YCbsRT#kBS zUFEQI|L%1q&ia2DjSHKy2|WK=8W*$H{}dY6d{7$q;pcH(R7Y;KNF8F1qzhOj1Q&@n zqoohbiZ}I?65U4Zo-%EGwSY4jAXq3}V8_KwL`l9ygQp4|Uo zBTI3JHPU(D{>k>qe@;17y{KR#> za*iK;yRSW7t|U^zt+(j!2?U{@;3u5pr=H{|9%IGwu+rn;ZMX|ALjG^^2Z-KbQLf~( zZ&<5WERrp5AE^}`|6#B3pYYl91if-CX{BhdUN4a1%HEE|TpE$hJ&>IM{0%b2`NnQP za=vdgK25&f@hJX4ceL15jY07k-i0O~4VW$z{1g%`$IZ$+ebd>3>CuKtuk~OlC;i{DnLI5X^9q^cm&>QsvHQ^T)jw8G9OnI-AOC z`6Q#E;MZcqkL@IorUDhkJK3QmRCie3Yblm83DUDU)H4aUAJHp{0XWUSNUm#bT;{Mgl(Sa$6e&hrur#o$L99`!Ky2>dF>K^0#$q^kW&D^n_rOUK(uD z6R?O;PlM`dw+S2r_)C^kxWK$9rld)GF~1XBt~HA~3+5w*O6ArQ{e-^(Np@{ChbOf~ z$}wux8ICf6m$_2$Q1dNEPDwNGv*bp0w6&okjm%5{YcK&w)$avnO`;VhTPoHcSMWa; zkj&rP;ki$5Nn$Y_9*Bzjv_wtpi!86PC_wpgY*2TLnohQ)Fyq>YHV@sqiML7E;E#JH z{(0n*z)1wLy9{k|^b&K_qF{mgNqA^fxum%lEibq-Lp!#K)DuwfruXl|Md1jkWFIv1 zE?}z>7YiB0Q5d z)iCJv&j4Nw&MMZQjdZCjjMka}N$>d?*nL6Fl;MgP8&>3oW5%i;R$QmQ^2+@hL&Yl> zfB=!FHh0ykPN|o;%>e_hLRGGMKd)g>dWZ<->DFTE4b~~Sj%e(n0<-uXEh@O(X#6o} zfSjkRU#gLlC*ah^+9_8oAyIPjV2F;Oo45&3SvTPRGehmrP%*t2b>qMbTOb^nk;T~& z;HhVIx`v!9l^ae6-Ax?IxSm8$A#V}s+1$w0k*7@Ng9qo?w9 z0i8jiA>5q><00IgyWqvB@q6r<|0boI!QkH@kjBaZYyLSa-41T+X%9XfgKa%5Sm!=e zXzo6DZY23eX32?6DD<}^s<31PD*{&OI5wk%&7$)-043l#H1$7b=?yjakx;hT{fX%v z{Z%G*3y+ZM9Pm~jgNKR#+mW@SSjwZ3rvAIU?_E5WUGHT zt8LUxeDPwW=?>ASQf)dVE9As`JPA&UbXeF(d{8eTQtny)uRsLVeh!-s%K(!+ z+E+~R6R&`yyf`>g_guh2!eiwUtSAQ2Ung+5Q_*`cc_}B+ zK3J>c-8VRLQl;Oz#HcR7_>xcP+eSICL4U*7_u?<7!pQaD@~O`s!78S=-nT`4INp8I zD?(zV`#yb>Ys^oRJ($EERyx!mUWgcPSI0yP>j^EPTY?mpss{jmsk>Toi@L6V2qd^7 z;=}b0KW!Ud?%5@#X)@W?#$qP4dMCRZH_3>6g^XPf%ULma$z*(Mml&CJ(QU&@-LE#t z=GN$X9q=dxS9>-kYQ3+m(eT{$MJgQao`m~>Ur-JOvCYM`H5q5Uc<^^PI9ooC+=H6} zY$hmIDpd^crB}BP6L*U9h3k2%YNE%Up-dof%16%xGCP`FTJ95kBOcdn@KrcW?eJC8 z_;3gA=|@Kos0-vhg>hhsgv|$EpGICEG2b7*jjG7iVtv4+TcG@%K$#6&3EQjXj&-#b zeq*t{xb_j5(nZ5Xu9NTavOPhgO5kH@I06OU2X9#NCo8<+66HB6agX~BKHx@gzWvT}vAe2Q7wHr-c2|Jak!ssd4>qLseeN^9>~p@}`0Of@GFX^T>hw_Z#&8=g(c|j= zf0iJIgwG6|dWhNC>XGR=(pBUzKkGuU39&}*A^gi#)iAmgijps@)xAGzpczRT+W8aDl4=TFD?18w;TJqNVq3%LI*TR!`ci)Jz)$u01gL)q|S z`FLjhyP`U4%5RYc->mvwx>9Fvw1Ey`%V$H+W6Ph@>`!b(9x37sZM`tu?SR_HhJE}D z{*{LPwya?vW1PY~W5YgoERYBR{W;n7D_bPv$kHEl4H&6%4EmDAaDd-x`Cqs^Z2bq{ zTw@C?_uKMgMYW4sOm`txEu&?~b9@*>%hg>xJy4l3s9=x1p<4USev2!yW`qhWsv~?A zOfz%kK{Yed(Vu~2_*ypeX#rZOW=uDe(aAIjPWUkPcC?}J=`Xb^HuJzzEAHd@gjO9X zn^$NRO`6~yPbJ#gELoV?E(t;@69T!IDDG;6+qc2wNB90B-9vMJv4M4!Nk;hmggx!o zOdcreiM|p@@)Nd;rfu}1$lbQVve<%F-=olL32DPik)H1=CT)j_mt^FDwYaz!%JxyD zK%`^RrPR3l!Uiv1K*4~D@;PE3nM;yWt9bKM+$tcb5{+Qt)o{glJ&SY`+@K%)LB27z_cC93 zC1sX2*ZVj5sx5r7(HCM~K~&>ONHJVQ^01ERK}vj`A9;fJC;O4F7I%OQ&wk{qd;M6n zQV~(DDn;lI6=-s;1|8-*3g)Rhybf?^=veZajg^+b!Q#^?_@P>N*+vC8RJy+uN>x1H zc%ZTfU5xPq^?6YbvE!NtRk1?{lx^pIv z>)qq)0nflx{3L5zz()=4vf@VG8t0x}-$Gt~iY8MOavwfR9KIys@;E1Aru@G{xtOw? zoQQNvIS~mlGhUqA?Zm;0XmMHAYi_cZ4D;dji0%@6Zz}GH3lw&#d)Z-9a5IUiejGxx1003@Wzr1X7O+Tb3slmW_}N#T2~aEyC26vEaD?1OV z(RdlO`Dx^mv6!^tPV4#CHK3a3lrvLjC9+C?M5I~@5o~_ybH0SYu8+kE-b>-})94MQ zapu~@Y-6ECst7%T=bWipBmVjqRZafX(2)gqD6$^6D)KS7u(^&k(2q< z-Mv0X8m5tafiWFa%BzTPMj=XwSXJN5&P){i4nDgc@zPP^r>guG(1jgj7vmInsr>poV=-Dq7? zKBAzKTi>UW+f8*CRHTyIn1N(omE0o|cTvgRhe{5y!+n&g#w1j|?T3Ek3V!wm4aePR zLwguzlQ$qBQQ>11t*4rPv z2nl;Y8iWAHkSJt-9zgZW6Vfv{U`eX3BXnLd8tMs|C0WxAmLFKDew$FOpEg+^R2u;= zmVPu7tZUpy)n&e7D?>osj@7|m&ryA+2dKVxTFwg}-S*s7-wdY<`NlF=z~HbKOy6&v z+P{gtIu3aC{sDN;vp61|=aYqIOP~hY7svM{bzxqH&Yg8wru>-nT<&@XIyR7JPOt%w zf^Wq&%BN9?hw`{fnPnaeo22IsZv8iEih@S6L)X!v0bGv`N$C40r)nQHeMBu4mkH5rx!{?9S3)l`6r;z zakPCvhYO~rpBKzPWI5B1*@=jQBMxUMGm81LL%m4bT7N`7-0Va-ZZUa-=Tm#Mw43+R zKTxGydw8LHESYLgrF-~452&vBSFW}$*@#S6Pe90jC&hNN{SjvFCoB$*^Opg6$;l{m z3*7~&{nl?o$~_=u%$-zqi#RE35`^HlMG2DHh*sA12?)Sml0giv+c##sLU1{$74PjE zclZk81JFv>7^7} zTIQ}Cr;qIiaQaZVAj5v#tcDr)olGYtUM}aI%FWp>_=#khp6APs^`o~?nDybQeUYEA zCF{ep-F6K58O1(4as@^_>L8jUxbDCmPR=^LprnE{Wn7P*8vvi<_ht+IE-^M)My?ts zZ8qN{j4P~r9oK=Q>$4h#{jvFb!5Xz&)+pGwb($wvk&j&3CR^TE-<(+_w-@e897R)}69l&muSLhhGAtJ_zT^bfhuL(NM#BqF!`G7|v%TDsYsCWy!C`*fA*7&7;Z zk#dIhve8%j#lW86oW*mQ0GSD|iS013LU=Z{5sW4$jGzy>E~T@LLc*Gm>N8_*U@Gym zUyK=wxX{Y4`DvH)nT+QIT`e|898e4j=_^k~Jio9JnZLTjS6}RFFB(=wo!ytn+CfN{ zPoq^BvlqtY^&P(Qick8Q4ZiwzKXNyIbGQ4N+x^&Gd{BvPLup1vxSwOwsQ5SrrPbY3 z{1&m4FNdL&A3*#saA|mQB9)NoG*gU;go^6jEi#g*koRCje~k4Fg^?^fbUnHRmOKGZ z*U=D;&`aZ72UG~TNVt-2BplK^CyvLj!zo2Wto2xMHB|mBZMb>hv=d=m@Z{WEKyF&+ zP>+pJsk}VM{$RhQr2JABMnuh!)asjX;bIuoZNuOu$*MxPpY~nMunMiqS6Y`v$tp1&m>{;2F5A9IO)YHea@E$5P6+0iSG@1_PSL-!< z=xx?epCnCgsDAdzl=~7j);dz_Dcrx*g8MUu$>7oQrtE^BU{EE0BM+3dR}rv%Ura#X zgtcXQ3oQVfTh%pYz$UlW{oFd9+X5#4>8hl*5yhXYR1_ZomPEOP?Ev4@OS#-2w5|iK zr89I|clGWmp;C>Fe+pNY!CAvpuCcV*1GTU)Zh}~&V~Qc2Nh#LJ)A5eAfD0NMl!MYq zk*Qx$z)xG^$E#N>G=HEn7+K|~xu-8_R#G8`_0EtPMwIMKs~TS-6cpj1@^J;AUC*|2&B}b_}r{TmqIK`-B(1t zMgRH;gd3yD>_1XVGHrPc<-!Q`0l3Md4$@wFalgs=x}a+@+<7 zeKyq~VU63Rd8ws)w%T1lTW`3&-PWKCUos7dVkTA1JsZsU4u*ZXh|ZaP%%@PQ$YV$2 z^3g-~TPSxussFejS5z#t{*K8ED0Dx)|D(98u%@DRp`IM!Y%Yg0$KVl2IKllC%pQy9 zapP)V+3rW2C9( z7J(_DFWbf0O7p9Z5@bU*7M`CNsKj^Io6iLl=sU@9%Hi#s$w97xxjR^9rS2yAxwGjT zMZCr+B6S(fz>}_4(cZ3(PIbo*LPth!8Opc30YD6pP zT#pE;>_l9TH&)p?_<77NqDNvywWwtv)dDO|v-Xe+40Xr5nuI@Mh95t-TZ6iXRc&BL zD;mIVtNTWJUgNHpcl8LXv+C{edKb&%XuHwkdpJunv;SH@zK{y6RychOMyc~^UwZY` zX!E{Z&?)V5i_G9M#XSW^F&t5vz(Oy< z)1?eor9$Eq0x}Tt!5FI@)}Tr^TxrK%jEz8}*MWKZ-EGn!)ci-JdOoCNY0vah;d?;6 zBKK=fkJD5cB|F?SX|A|8dRP>x*u8_=ocm+C!}6p7`74H#njo{b%3#Th*7{>ooCUPb zkDkEaD77lGNPKM`;XM*EGa%7Z$$W*;BFZ_K2^xM}wQpr@%Qa6gtY_)#S0{I}KzI2% zCW2B8Vk8dmYyz77k@i~gS^ntL{K%^*SRZ;c5>{dguL^`}xrSEAkz%@*mj>^YYc>Ct zEt8@Aj!kz;w0*``Kfos|`cGEqd0@z({H~@uYD_hEMJX8W7LEbMT^0CdvZD!4$a$Pe zofappE*Suj{-4uqR^g@b^c( zB*sFN^f&cOCb&ahJaIC?n0#)aQs~?6;R$Uzk(;OF*4pYJWx`PCDr<3y`+bTMaSA6V z{E4a=aw-C>*a#-8Ta{dqOh6)x%KayvxG>8M`18Vt8upTj>R@m9fjC{7yY=2Ts7{oe zzlT$*ayxO%5g~G4hk#8`i)jfEf4CSvq28UY%FQm{%psEGpe6|J6vnZ@K*4^GDSA1D z!{IdiyyzMj^KtqF$g87|B;Xa#Kdbo-mDO^^E$7O>cVLqbl3y;68yH@ zuK>A(F!OG?#-{P+4H*Z$UlxVUVpnh`VA_6Jlz6(|g423}h}udD>ukOjkZ74x;yl1t z>b@WLNLY@&*21^!6yD+Nbipm^GZ#tn<%|2-gw>nT7MfEGCTKgR!%AeT!XaCuzX&0q`NJ2rPkXR(!` zt>nBkAVf0aBbiiVbzjjHd@Mg`k|6I_xu3%Bc}R62Q6D7ZCm?e_+Z1ND@4iLn?AZFg zvQ$jNNOwaP51!!Yl96W&OS*S&Fs=bacpT12YZ}UvoMv7+Tm~B4hY~AA=cALT)ImQi#=#9J2msH=jNb&*@u|4}zx1#F5PP?uv!`(rmlOLE>*lkE zUX6*!^x!Yl!8YJN!hlD(AHKCqnR?lpJ~FIZJg=*3OTNn1&mN#Wjjzn>;PDM8As`QY zG{an#l{oVWb8?#It|M$q8Bi5r2OO+t&kX2Uyc7ol3C0`G5^5zaDI84MY2E|b)2O1{ zU2zfNTO)yBqaPXLGGRi}MLios@#+4JSO>}%XmZBQ38#Jrg(34aU~(96)}uuhZ|?sC zPEMR`33)T&$gWb^@Vz1o5BR#R+<~Ahu(~ts5(gq}*s0)@y!#?a#G~AU@%={)XLa9l z|4qDa(K2T&*$10+Z2~!P9~a`DX=gbejNw+ zA|y#W7?QPmWg{0Ye7SUZ+IW^2bEsdKqDAr(Q~o2(G^aN%dHTUeV(I8+mBOPU6qU{8 zDf1uzLCa?N)LdWPMA=T>C5w{eFu03o2`_MLP|TrkH}Nym*%EiUv=MU}TN>;faJOi$ z5xDAY)DzftEkCf~Sj`zH7bV=WZM>`f*1bxuwg{UWbD3|-zl%qTX>o4D7Q_BPL8rZW z+s3q}PzCmeyKSRn2;Hkf!V&4K4t_{n=1cYST08ANDczi#*p(du`lC*b%-%PjHdKYY zpOmL{QY)8;EP7q*OHTEPvrJL`=KTb5>Is2M5rMGBQr;c3W9AOH60w!Sb4WB@~A-# zT{0~c;YHAl%Jff|4iaeA-4|T)MKlW?;nv}<=KB+g^Mzp}sTZF9>v*E9qoo**t?trFafJridl0{aTKS>)H}Lpm&1W*i zjk?cKQ$L23GDR5cvm>KVsk6M9j0)f?3k!;pPmU?Df9?xnpkZMR?xKO!gSNxl}+a@-;iFjX7#$|>FINt)~;ETZd$)?ZPV&i zZ){qzY+2LBIkT6}K7RVz<>#$DH$8pzsteX{Y?{-w>Vjpf*Ppk%z+TPVShY=!O^uCB z%hsHK{+bI4vL%_T%y0IM0(!FMyya_`p0{dQx^bDhw=R9&dCS`ySJHc3ueu=3wJRvl z8>`k_aPHcRxgVxy=cZRJvk#Z9UayyYLI3Jj7DTz9EnRu;x|O^};j%Rs@c9Mlb)l;B z&rRzAjkKS;F1>X1niZk8oF+m+Uk$oix^~TKAhKd95D3rHYtOx4UHh7~=W|;KwEf9U zP{W<{mVZ+FGI=MnmMTd$Aj9Q+(*cb}4gV`YdVwGR1vW&Tb|JQ3s=D&j>)j>NK3{K> z-bQdnB5_)cX7=yYIK<4xV9x+MXF~p2bDle&>9uPvym)Dt*D#~YFX&fhGkf9cbJH=P z0DE@MZC>L!XF7A|iD_$o*^G0)F#Ojgi*li6RWDS>Mgu7#@Y zB!p*eyH&4{8igyRGA+j^I~pbA_LaMQA$EYN0GF)b6v$X?0H#-qt5F9DpM~$75=G>L zn1JY|`U|?-4aR=`9_NqH&uc;{N+^3MH+kN)H((j2>-M$rv&C_-{OptHBK1R(0R3pS zvDZrnhGMK(W{k6GoYF_*zHpo71bK|uf$bp4N6dB%T*n*Zbv)!U-W8TH2`#mZY1Ro~ zVew}_TH3d!cjQ~sAa!TIHT{38z}91yK4li@p%lb)A^rr$-eE}Su~}gy#cTDbSHq42 z9`}mmal)`BsIB-7B|{}nLJJ5E=^Th`jJ>7qC?OpAG7RzHu2=^F+g~X;E@rf^&3RuI zsm%M^bKl2O^uqg&6ex!epR5-85aD^?_a!~W8X&&D&x1;cI5%Ty^xY=Mwlb_8ln-6u;qPoPz|!Rfrk5OmMU!7 zPg5UuN>n>O(bXbR_vZx=e_=O~*wlTJBNEeb$d@cxSl0@%T}~3oPaaXpr`3K85u}T} zlT0J$*L($6c_%GIc&x<6$p8UgQ_m6}thd#;!oB zPg9}TnNe1ai#~**qvRzJN(6jagv-n$0n$l+6Xx|S0ldv09eQ09Jz@A``R+fa1Gp4o!-@k<nvgC=IqB|wXcH=u+nJy#gnZ6Xord1S>9FL85 z$<9+G0~qJHc&Ga18lkC5F>Zx4)AK@H1hh@sK+Jwp*$tUfQCW1I3^rmG%^G+P!lFcD z;kXWuAo-kI+NPY@<$L{zm-?412Gv)!`^t~|5%eFeQoEl>pAXbusqQ)Q>PTFL;`1Lv ze?e1c*~=wj(|%4zLnrseoh-kBp3GFfhm=rod)&WPm|EA`lWOeM+)NF5hmU2{T^_!} z{GHAZc4B|EzT~B4J<2hFfwI|8Zq%mA!8DZXAWluxUHsPcz>N$CaGZbGSm(#um3Dro z^OaCu3piuj{RDUg;iyzP2|wXPU$a;h7QHr8*37N>B3#@h(YNv{$c1nyA@jW_a^E`1 zA>)L^rHAO2h(i%g(5*Ca@w9)1=IS5rNiPSz%fG^1jE7l;`&B`k!Z}Z&oeCYFdS8J# zF+f6UMM6Z-D24EGo@gT{$XwK{E7_Yf1_R)eWMT{hBb_svl+Fkkvr3ln5(J~mlt-+J zP-W~ELz*gx*{z&iC}W{?(7}IkyO!;#&D{Zq-9u6gpx%)!;$bup6GlnwG^K@mdr}Dr z{$vS=I19}>tej}-`1aPmE%rltzr7hH%wMU^yUVvU_gW+cZ#tbJo=`pos`~TheKA=U zVyGHhhoOTvh&3l(vv8?i#qkjLW^CEKHWS))k)L@g9c{J6RoE=$ihGH& zM)qA64pAB`huiR@sgorh2D2ms?VSFCkFN>V!JKXg=d611p+Ac4;GCz|*$uTV!wXUi z>haFx^R49eB+ zS%5bZhaBVKGZ2qjqVEsHc{=hwKHW8Nc8KcMLi!zO8&Dp5BZK>l`6ZTMm{ce^j0inw zXxrBztGbAHCA(cplL7k3IA^7cgcuH;VOw*$xf{Q|7SS)E^1gVIcAMpsmqE!AcTrs? z$N_2MX5)&N#Por;(rjE1OOEifPt{-C^q_4TiqJNC+Ww-V((m%niM3VDT+VLsXx>SLj-e8ScGV*cs02)CYDg1{6@(I;Kwsxef)&vA z4$Lakn7`df)(0ETIZ229@JtkG$%5D9(H64tkJ+SnA_{sb<<5%yvU}R#LEX)w=YW6>HBuKd3OXx3R95 zu}a5%?gi(e={Ci=|u@{Q6}qs@$gh?+ACHq#pCXq{ulcB-J@jjPuzd-KwD7p`8F zPA^|e1@xf6H=+Q&^c%5yd1f%Ep5KTnt-3{~v?XZVP*%CB?lP6qX(%nF2?0yVZ$0oDK|;UC~CEhHkwKVQBDP&s){4$cs2v9Fdqy zq1fvV3LsfWFxH+FindBuVmAEsjcWUxoVL{>Z7*b33{5Xl)3kgIigi}oIn;L+JOta% zIJP7>`_Z`h7M_HsIh;z3cwM>J7NYNxLqq9_oq7*9UetbH)$tp@kbCeC+`G4BQl-Qz0M!Ez!%9$hVj2dvlX5;Cv2`>+RoSkhY>fV zuY{Y_jjZe4vff5bn{fk&J8h)mXvC4-ot>SyIsgei&+~<+``T0O!eZC56C>NTbp%l5 z%nQJ_d1>ovPI~B56^krcKz9#HtFp$9jGg6qx2oil-ljLMO0O#@VBIfYd+zF`%hs%m z?PNI?lw8VtKyuVaa@MEY=PX^HUbQ;VFFjax?&{Sth(VePd<&H2$#2J$~F~maeOR;ClG+>2)llzd+o;7^gW;?N} zgwSU(6QFr4K>7yVFEo+gAx`KHL0vx|_a&(#+ewt@RKth2_DHADgPd2P4hFQpUu8;X zQNbyLsLb)H-R`TFgSf%Fb~t(gZOU?i)^AX8<5EZiN$yAM*R7J9yRJkbcE_R#v_sNM z5$U@Z`l4pbFA=;twJshS@X#05n6G20d>eL2@4!oU)Ag~AjG~zib7rs>FusAD6{X}h zVH|Ps-c)z;=&E#jZ*$vT1ye9;3|&-=-w%7Rr1I0pM(>wPF1=2-b#m)xfv~`)F+!$!9<&A7^)g@hmKK;zZzo{$%9(5)@Xl#} z94VDU6UR|72gkHbgLmdOc#|6RL8>Xc->0UV!a_%c&QnA4m$yYv*J{d?&17ba6d$5# zl4J~O?)E{o_3QrSekQ(oR0og5iQrq2gBb@oe*j&;%g-n9ej5QU)9E0jE}Ut&KG}{cV}Ak2fUl4-|`TB#$ZNK%f&?Ig*nu= zS*mPtn!j4b9H1|uUxXTYH!nKJasZ*aDC;_v@7BwunG?yhGJBm|jf&l#O$4vFwX!eY zj%)a64IzG^(O&qhPTtNe-LJ~-7Q3hI(J5^{7?_G>W+^##!Cqe`{RBC;0muY2bvBPr z?_>b2hSdz9Q6s<@6h;t`g51~4SCg2R1_C$`-|$9CVmLr*TcI$U;AMH2SuV@Wi+F{f z!`mbUR}e^f0IFuYKY-%uwfO8r+8Ev1qo)~cz_^*6evG{NRvZqxAt`}w3{XzHvvKx8 zv&W^O_3<&*X-xkntV6o(gPKE!r1>awpWE8G56p*~8_V1)vH&HS=cvO2j)!5w3A26qkNmi+2 zMxLjpsB>|udB3&A2y$CvdKprd%#|bP#1t+?G#F1YR+VR{Nakss30Fop20WAUsLa*( zB#Yq$R>2P>3qGGuKC<2ad689?W&CNH-ne#6diAP|<3@k?nu7C}pT7p@mqAW4>5DI1 zu6-LZBz`6Kk2wz~9?B6g3fSC=l6U+l-p|L|dX$nF`hwzL9^#e0{5D@L%f=2YB%}Ft zYt!)q_D01getJni0Hw%GM6a{IUF;#WH{-{ly%G9k8lSlN zoRxE&9=#}jRI5jFXOd&fmXieR-EcDp6BiK@`^jvXyUcHn%S*ravaH+l&aw?PhZ%`- zs2-WL*{_eeW9x?jF(-Kb^7OeT4IYAI3MemJyS#nX#(*9MG9X)HOWwLF^;8 zvY>>1o{MBY5a$`}ASt<2Ya#K{gxHv$o?w}r~p^DbuiyClqeYJhBO<5 zenpJX?gz#zv!iQMXREk4NJDpT6=9t1?kSLiigR~w-K$Ml1$qGq>MqXAGZE_Lgos$7 zbD!GUp8M8_;MVfFW+`q_{3s_M1pR@61gb#jZJC=Z-rBiS$P34r6-wrfLx@~p#v7?q zEGsXhY|9k44eu*iP&{c3wD>>2MeI3;j`evZ)3^^*olNNJ%EkP@= zW0#<|ow5x78U)!R=gHVMt;LU~W{8`dS^12tx-5N)HrBD-7$Dy^bGC+b| zuW(_QrjM#qI1Tf{1T^8|s2qp>HOq-Od?fWaOd%0M5+B?elYpU>x--X{P9h9yVPqUe zZ~2wYfaM`F`wSV$6tM$6MABwBQUG+sT6sK_h$x|E9oLE_su-^%a{e6;>@l8Jb5V)6 zI$_w3P>F~Z_HJsif{&5aJYoa<&L(Wz@{19}%7r})!SXz>b>CO$E#C7%h`L5va1xNf zC2now`6zcUw(_9AO!$ds`dax`&u0d!c?*7e5nurq#)k7jfH$Z{eVDGO5Npr7e9EZd{iv__;T$`1Quaj``v1zpz z64!Jv$wZajy%mEOkM-J2en%)je=+-hGp$W?-(jj!G|E}fcK^+S=Fst%u%qSaIDir) ztlv~~NvGxpO<1P$Cs_0(ZUH}Cq3k!c+f3TLr`xVz zKQ%3qJw}2-GSOv?{t!ZE#X!P-AB^uS8RuORU-$PioKQ1Uq$x8gn)B=8PvUAqX?wrI z(17)WfrJK>I-FLO4&1my=Iw2{^H$G%Xl<;-qD(?ptm=D_Qy_B$w|7Ab5W-UXgZcb^ zKc89>XZU0APGhBq2u05E;X^`YWnz&uUAM>|fnNoPf1K_(O_tq*C2m6nU{((!g>CP?a-)ETHv6A=?AWfLAa6&>g{<} zMH`q=tl-}qT-3ElFnB3rLzi9dr_~X73Z(Yi7g!tmzm+^b2ISnT(C_a7utr8aMS)EK zhxI+{Qh$`u38d{N$a*2CZp{^{R2wr;n7YW1B7e%(UB2l&eI(cIT3;ux0*)5z2ekhQ zK%1_8DHjc6plt(a4Llehzzrp#`^9eC*3N}#`p+^OXNdvXwTtT*Nlx#1SSmnqT#`n- zmJu`NNQ}-e7?OxxQM?we9BM6yhO?7@k#j{^sV{8hhq{$(_NHO3$ZX~Ld62`{%9-mi z?v(w86}AHsM;6XO!gd?GyR&)Dtv$j@(}m$4gY`HzuCRXfpTiJq;-#I1Iu%$ z{hKTjFKpn0h;r`c^{?B&W6Rz@Wdm<#n*YHKJXG=AH}L6)yMZ@pbK35wYpZDu8&Jey zLuaL;=|E*p7bG|v`DWj=S=M$o@IpfK=a?MbVX|hO z`&&WBlFXj22N655gvL7e_X0C3#8LGBgPRq?cypA}VT;e_zJ9XYzHMLc9(r4kSI7(7 zdcpH6p}(-L!v+5D7t3GR)+G!5Uz5vU*w*{Y{DcyP!mL>##qs7Wg;0T#@n`G`|1C3-il0}z0s(0b-#}*N88Z`9q9ARP zM^|MJ7D{CeID$5lsVT8fo^JN*PY*^%=$6R`fLvG zlL7QWu8&T>Oi0mf9(xLNBL`D21vkY7dsMJLU%~Q$ZwxG;FAk3LMJnNoO9L|&!%bJ1<8v4L)nX@o_4H_-x zJmavnRp!nL=yzVgzJpl4a)){lYla!Ox>LRML}rV2j)zv;Id+TglwvC4e%N(#w%IVc zlk;O#8DJ}5u2?ouPj(CPd}BPoFf;<6G#MYKhvhpOV-04Wb%1<(u-jSOw%he_F$O{1pWu(t&&$Kp zoc*aMvp?BZr;Lq3_Kj`d+hWV~ZmZOsEOg~Q?-J1sAIiYdM$^FTh<3A;YsgbAM=}BD zqtFk{TBk>u5cUZg`s&e#7Bv6Y;hCgw9YHDKACRJ&hp@ z*ADY(yS%8(t}LIZ8hi2%(9vvB>Vpw^K- zi1%y6N4rz#Lv_?E(lJ;S%J}9`C-o+la6}0I_>k-js7^ackz5tkgsX@=&z*3#93GP- z6yOD@|0|&mxj4q1V{n(pn$q3KL1MCU2q;&a4hlKuQZ5(NRM(n2Nu4~W8ZPs7%lv6G zeeH?9;Uqs2i}+m4ZmBXI3Nc$1@U{*SvB^(zC8|q_MZ_z(4LXu;hU2g&B$e8XGs>3~ z=SNBuOWm$>FF4^r`FD?Tm*K`(1k3$YL4ykMn^QH5YP55;QNFI7+*-uD)KR^h5J;Ih ziDjTm4l$}xe#Z(wj?}8F*;_a2+tVcwHp@AZ?p%rE4oq*GpY#%+SOlMV5eJveM$9B4 zk1T8=>pI*x9+r6yb834LLfTIXl1D>D-GokhvDC&^*Ic82I2hLYSyTPull&Ap0-Z_9 zDOwxl{Zb$-6I7S^4CNH zXx#7&Zi1cuVIq<*Pl+4e=$qVnWD^}M)a2fxD+Mw%xwSpIRN-1+MyN(8D|ht-W!7oV z`aO|j6D4mZ##s`SNYP?lKk4Q9uc-nI|u$dnY#ZhP%;8RQrbMOua$r@d8QC zqul$p2B^_{^3%peXr!?@egJ_sP7bs#vxt}8UH`!k_ zXrx>TRA@9Zs7WFW>dQebKPnGa5kf@NJTS5VNWuvXQ5NyH0RTjeeMl7WDF=yWDD|u- z*AVz47pRri1M>nQcsfQXWfPNuPKWDQ|1!w4-eM}r_$ik{bJ6(?Ye2?n$+d}VsF1U? zaG{cXn3`!%#_0(l(2t@@ZVwcDin~zxY{+m{!}(3#UD(lUF=TkeRkiC~ct49Ii<-ED zEiis2=~j~@e?;)QVzn0cKy zuZMp0)m+|YU2&fc%RZi|d#H>&o5`1qfTlr&8*5a_5q#6I%^!hV=1n}_V3pJ_S0#SB zy-^sI9j}>@L!i!3ahLnick0!e)UT_%z1WY;Ts*|Qfr#C{{Q6W^iu5o@NXzXcs3P=^ z3wie3e_P`359^nGVU9f0LL!l(D2Zd)Bu2atm%e$R%lkz9Np1lkR6JpupTsGYpUVPb zj6pL7l>wq50K!dJX~ZNOT)%Qi{@} z(VC9bPFZ`rKYD?mMY?j`l`FJ-kv76vz-fvyaxBt>5)JBLc^otD$>e>-j?fxx$WA$m^P>C!+7o-5m-xin(_KO8fy?pl+(r7%X;j2`; z_S$|3l$J>XXYB4kB2y2?s4h7SI+j6n!?1jazMtGHY-|Tp5T`msima_Ch3mRf61T9f zHjp@h0P{V=WD+6ZV_v7vT{NFE6&Nf0pHmp$n(|WmY zq+dA5k{0zih&Ei}Ke%vxf_Umw5AjknyDRF3LU(^b+MU}07PuXb16t@V ziuG9tJe)Q*>uTx3iDbBAYx}-7IE;oACs0Hv%tgDZkY5xjjC&`y-M%WV(*rHf-7b|_ zW`cv1$h8uZM+yTx<8|1IRh-6mAIZ&=#=g|;5-2!vy&0KF29at%f4d(&!;iesx;h4D z=uw+}-DkPmj$}oo_5;3Rhp*j6zsUkop%aD1?AYP!IYPvJBhe!E8$w z`nt%4E&Pbw!&`LDLc-mYXtCr5Y{dJvBszPd=C+RBu4rG>0i@6bBF?3H(VPT%F4cm> z)Z7*&kE(K1lj5GmT&uX+Y(4P*h+&y7yAic=u)eebJF5U^2eEMd$H+o^_z&Zdg0*FQs9!kL_ECHr*l7jNxs9R^zn zZ3u6QQC?Eb>!t2@vJiyz|2xg78CDQwb|w;*T0ahB??io*=xpxkXoq+!Ls}vHA+iF= zG9X$znH>@Z(l_UN@Te?>gX!q>N0){yeq^YtRYDVs4X>4wfT)-j{}N(>koSq7LK(7v z+fQ;!9DETzqFrz-xuv}5S(}E5_?Rd@(;37zFp9x@vs$wnB^$bE|O za6+3guAU?;Ao<9!^}}3@e4Ww~G^_&xISjy~W;2MAM~xsBsoI~KlE-&*xW0)?$cc*o z@yq+DjD-BE?0LA<(UN7%DdGAcMTrFvL(o+Faz7WM*200f?&n()$r;3Uxlcnfx_W&B z#3&-U!#|yl(gxaTNNHGw+ceoDAVZ>W9Ia>b?Shs|8B<2C^|f$+Uw}q(yar@+<0 z(}rp5$WY2t_>wf&qzsVu%j)^SFul$R#BT+yL(qvF%NWNTmIp^i8%V~J5`4d?80Eiq z5XDv1$rD5riS%e@^HgvU^SxJE!hxiaha4o6m*y$sOzxWLBYJ_AMeqPQIsPs~^NcDW za)kOG4+LehaZX3OYaIq5wf|dEHe?7`?sEN)c)9-Qtu2;yC%0*Oxyw`@h3@?}WbgKE zYKbL$^v{OQN>P-}P}E1xq!byNoE19Ga$;^}!(m=lvCE7l*9Ao2iANr#zwE-BdZRQ= zaW)ck!kGBxm?j17?ej;Iu;L#%3>>hTB88PC#XA?qT19OoOuK407XArYSs1JM+ zIId$*%DqdiGI5c`SnXd7vnQLciYZs}~aBuJy@ zC<6cG|0|LpFVVdtjL`6k&Rv_ z`a2uFPLz7TcyvA=oQsX@Nd3+%8JMyyMB3*b1VYGr0dOx$e!Gbl_y;p0YNeDq3zTZn zy=*^6kI zwWQLQSl9Ft5;g3Fixq{r6&6fqjJCo+R4B|+CVTUN@U0ZXiU@I~_<~WmE76InXQJyA z-07ssO^17w~vH%^DQq%eYn667qQ~lXB{%I5#n5l609?i*uZr0!^da>FifylG_@)$nV1h z#ZMJYZyY!9c`}|l#0tI7$(m2bv)k!f#Fg_7d@+q5aaQasm--vu2mdM*pSpG*(CBrg zuGpe8rz#Cw1@^~aY_@Ut3?Q&{zGOMl^Lf51{8-@v!9e%!N=`P6UG&@^@XncHr5{AD z(NSJJ%)I!RlRt;+)E`09+`M#Xi50~CRt7=cGZvw{D-9O)7GHmkWT}88wxnV$i`K#I z%&&le%NoBd$BM|!?-Xmp)%EeOD;rpnd2&ts#!$cSj-OwbsR_5}Q1{@H8|{fsGFMkj zx6&01?xe^*mQemZ;ifv;Ql3ur=GmG~2_-A{dJGhUO6mJ3RQTkgv#nlqrj+ ziyBySD%5lg3oF&$c@JuZFr~xXudQF2@nLj1%=oa(j1OZ?TJP*JJ=8BUn|{#lnTrn{ z6LL|%VaqVh=Eit7!?}Vsnk0iRujSx~`*1I2t4JlBiTi7FN+)orxg($(nIJYD)8FHHF76WSzB^>VdaH=CS z;qK*V@j=8Xix)gV+dGJ<_JHrek>_b=4Zf>ODV!+(rvJynAhQwTvtYO*+-A9$-d%XKP zJr~C*?pxyT+`=}vQ+ERVMN>Dsk8G!b1rnW^n{Y1+l%_^pm^M(8prVa?)X=MMg2=MZ)CnHWd~J7 z#v74yjTOkrp7Z!2txUOXq=>gh#Tp{F%c$5d2T`#G_ZcRTvr(qFU*x4?`!xYqf}2wV z72BVWip_MlWT}{@W(X?w&i+*FXW*?$niK&=o zT~)as_uGw`Bb6Fb*yF%|4Kw7h0z(kHS{U!m3beqP(O7qKS?y&Vl>1`scCB18se@$! z*c7NukOj0!mb))A@YHMh<{A^d;&1tM7d_1tBM$hfa-|esZ7n-Ig-jR``C5^&0Fia2 zDAIukyW*0kpKE~)D{mz-gYK%1I;BvWXlJ%+2SL6QXM}%#DN8RAZ?BT&RglN_bPy7)Gq*1P*`nX!l^G~H?J z$^Cuo$(?~cc_0sa^39k%`Q*Xblh3ezGYmkzyEk6g!1J@VuzLqB>~UXrg~FKxZa8LnaT*@JL2* zzhd|~q%RP=x5YRHvHOGJ*p-8Dtiintm>98pM=p+Kn(o{m^bGC_)O#YR=Ku2mOY*ni z=Fsd6%*8dX15sPHvN8(;l5+rE1+v%r(l2y&uOrDZ20_23A0355bxvfry{ zg5c7Hm?u&B8*yhQVXm~!e0xx5Cb?dazFLIfTlw1W+$VTm4&QN{V zU&4;%ltMR2;^0pc&9F-DlK_z^m<4|gd~r6b0p#)<9Qa$#6zCPxuIRLNO~Jcjy2Bx^ zPa56n97J~}y0-xcPVAe4c_I(V>)e~4R%X~L0sWbwfj$&l#le4^MMR&bu<~L-@x}oY zAg4rj%tx{l@V*01fT<=Ni8r$F-QJI-$|EM4(owBQ@u*)Ce}+aM9a6z@2Pi2r8A~M? z^_h{N;J6|F4XP=rk&K&Wne&P`X7R<1{30d%eG^^~K}p)C^pNg)s7by1jfi*WrVi<6$fhLL9PU!#){mwV;5>GS{vy^)@*6yTiL$jhj+)FWd z;T|zsrTVeZ54*6cB!i-Ud6bSxhCO^{av9$|M`p7Br_$)7u|WW>!gwwXOK{2!Cl3-V zIgo{XXgw}6LJme>tsP|#Wi{?AeLD&T+EMP!v!i@3run-MzN4tA44EXQX5Ws2 zV-B_7Gl+xu!^a?<;BJ=70YsKVwtU3Oz*QwBoA?q~OhhM6e3EI_U*x+0d3!*403lPvY# zVbr@^u{lJ~4_fT84!ObMpk$lhX<_d*ksOaQAgJm@L}s|tDQ6aLbzoJ};dY4-2we&M`o@88oa^}RLvhp+~8 zosrxI_4Jm3J$*)NL!TV5r-7ABx(_i4aFa@bJ>Gp=P?vIckeyWuOSt;mjl=)GaroWl z+nvMVpJV*}w@JDT$L~Jw*ljKrQ7@+6PK(;LQ|hT|BxrPr!u@a_?#J?fB*XGQtN?BU zO&`mDJ1qZuak&gE|F5zvKWBc=|Ch7;D*;(P-TgRsD-az{?ours_~aITqhi z;+0G?KQ)kv;nB_UYrE-GmJ52v04~Us1!k?tstR%~J50tfDL82OC!k!tEpc%WSRcM( z6#K406g#$1jdAzJ7OD@~wlJI;Bns@wN5$LHCIFS0UnQ&Q@pzFRbTxH|2Q`$@pX|E- zi@sM0kz1y3(e;q4>Dqy-X~!Y0`+ZDsUOE3C5*WGyMtuc;1WH|bT{5Y!Z=P@v=-ZE`#8K81eK^405foi=5w~Z+@mCL*Hiaxe& z{4E#JuZwr@ezKO>Jk;AkvXNt0koe^~ z2lGnusGwbJulgHbLI;l5t?LvIsjIM04s%y%zqf*TpOk&KpZH@+jbTzB>a|{5?YC~W zPxQeKTGViXQW8^kH?lh4o(rRTwBthih~zSpUbnU&bb{T_$~& zaxaGK&Rm8oyJ47qFto zUkqyX%(~tq$+X`}Ka3KIK}|6!$^V&!m=4ME?Z`iC&t_-sibI&Sodaj>@@kXDMRGFd$`O>FgNzwiuy}1GD74bm+uo;n9+oLB!EWOL-JhzIdI|a z6L|E=0VSATVawaq5_8tSTh9#W){M};y=>k3(*e6>ue+NEcI%Ia)Gb>|LKH!IfHYli zYF6P66Z9 ztl|w(1yyh=*$pxF`5f=Cei_~SGuiMVK-_CXygKiK&~o0NY|N4>1S7HA<>b0c*eOFi z{|5B0>W6^O#bWN zm19^^>~_Iv>;rv0`lv(8y@Tak$o&+$=ih`ifCbGe$F_vXc9bB2Kc1}^td4g%>9fqeN>28Vh_2>XvY2Yju|#4dQ+WVQYkt3yTpDvL6c>7D(-YAx8yWX8O%afA>mL z7Z{??@@bXpHCON4RWQ-LBH+*rQNv323Y@OpeKOG4w7DRb)wx&7EAGBcc*TK6pQAFN zktsd9{e)c>VMFUD(Fs})7S}Jwt+RpbvDWV$)cPd%>e%4=m4QtfuV@rTK5c`j==Sv8b z4ij*NyyLC3^AJY@qw_>OlKzf{fv)fDL)iaPhuw8UBkXTug#D{^sNC%^SN&`ABW!ld z)5^>+cl`zptOgdj>#~6RuLAo9m-haZWy2RRXAa23>bo-p8>(i@N4?g}l8@|VpwtcVJS+51;s^l2r zSI1#@9FK^BC&X;|S?}`26X*F^^Els7Gx2iHLT3gl+vhLTZE=V(tHizJ89#v-%gBvN zwMfl_!xd?*4Jeb@~Yl<>~o>8WQbP_|crCIL}XM z_o*4ajCkwFRfH2cD!Z_Vd_V&zP1V>BqgkjNFSqew^+G>-CSRU5fBjm2Oq-vgu)Z@b z8BZ#$D)Ua5zBUy`PCf(^ps<*_?6v!XJ6L3P2q$ib z>!xKF9yfEwbo-kH<#oJ#Tr_vZ+&>=7htQ4~)S5KUhx6r31gu z@!L%+mMv@AIA`|K*~d>`yZpSB=ccExUUk9xjWih7mgk7)ruFOA_B~#6VY+GU%BJ&{ zZ%D6MvwGd~^z=DRYuBtv=e`xjaFFiw@BVqq-?)CoVSSNr7#tD3uKx(uT}*-cd`MHo z42D@9bbfZh(r_61|Hs|C07-V8=V5oYcLocPv> zA8}lgDp9PsqDNE~6-AHO5?!|PegEU!b8p|7T|SglWw&bjKF&S&od5jq|3CkIvLPQl z?`?m$)fi!Ot!&Eeq&INZ8|Y@+dZ*KC)Wd1Fbu*1Go#Zy&4!&gF9gYSE(g|3FbudEr zIAeo0KJv_7((U@NmF^sL8}^0i_@=&*SL&VJ9$RKt4!Z4bd(^IX+OM{n(a=)t1_qqG zVYAuV!7-SUe=8e%ipj-#xQef718w{ez)V|%L8m?B)VcL|Fz8w{JfYur$0H3rNkBF@ zO6%M9vIf6w&8vKq4MQ7s(tf>d@N4w@Y1F{SS%ip>7T^-(K|6fGyLGG4>W|vJZrUGt ze~&*7VDGed(E{J}#(MCb_z*cJ-tM-VX|HeN>mKa42JJ=$Agq-vUG7SlDS82naf*&H z>)qA}h^EK5*zVeK|FGX17_JZi3U5G@c+cqd1MCZqN~R}^0zw)@j1HeA2#a!A$rxNBfN1WH+Jv=dbm5je z>_NPea}>TOs0wz|8;~+^29h2@=IIH5Jv``VWTsqvaM0D;@hLiO?^{b8Z+AxRuCA50 zZIH9z1b6Xr1@fD`%mS|Cm`jPblhxn?I8dW?qu$XD!0osMyn!ArY#+2cqbJ(kXQbA` zJJe8^?uSJPROlO2f1 zh@m0B^edvtO1-!25?kH3GFf>%G@SUKVXjvOpO}2#ROJJIKuEmrXh=LwNPOdq1_=}~ zMSB=dNK~1G()^aU!Vd$-&C`|N$7gep7>BX`47OMNjI@(tLio1)~f<~n)bUq=b-(`Zx~;ZYVOo`62fxxNM9ov7UR zBrD|Y02y>RpNfZbw({$_;jD1f@n|@hneQ(h%QEu~2w)E7KGZi2r5GglRUWH)gj`_;ZWaGf*l?uK9kp~F& z#Gq{7Bnp0Hg8`sHJ^YMvW$!9Xs;LS-p>D8&O|dV4S;2N`Y-0p@(9o{@o7X1r3C)Sg z6P5o1fxnZu@+b<#R+cp#06qQl3O2~BfL#CF8jxOupXtlqQt2W*G&%K?T7a0yJHblf0R5yCeVm*)bqjUBF#6A- zkje=Zv%lv%@$G@PR(}2?zrpL3pTItDJwGi3^zek%Rp7mU0J{56Ht?aUp#tEst0(WR z{0|910Kjk?+B>Hn+(9=L1m)m6`P9k#(DOh1*ag%Ky$4$Wf9Ax*$v3d+ze9fCy_N5{ z2R0-&;MnunkmIM?>OX&V0-KX*3HB$@(HmJaOR@lVACZlV{$`^sdT}A8^SZ#79D8ruR-@qMwwBVk@8m ziZyoc;m$xHk~F&0M6td2UTji032yh+Phx+vJcI&=cZSYYZ9D(v7=^%6wqZ?GJ_}Mg zG4|I7a_*<_6Y^S&izw(h!@Ix#pHui>z=X4Ce1!_5NHFc?;M2}xv z`JWKUdIw4*+oQjUh56FaMP4xZ)@z@^E8c-}nu1fn#g9EVhEyM?5ARInKi-QPGH>Ln z{_G9X^$!E7--V6Y69`XyKk(ygD!&Ksey;E<+j4zOODZxx@Jwga!d2;GOjICPv^dW<{Co7+uy72M*U@KD}LblBVlV?}~@fr>ZyqEr(>~5m|rmP$f ze+3G^V>ubr|G9)ZUS)=hdk=DYkCj=ZUB!~`$CnNwEMX?|1eZzUTb02nDz)ESGK2>v zKj3ok^QfQ-e#nY|kMhkN7@&6&UmB27^pDEPA8~*@nwsYjYTlWy8dH=Cnp|xaOyPF-#KE-Hwm`P$&G9B zt-;BwQy-8627ys_L%#0waUNS{{*-J^y{(0+v{dv6w z<*kaH2=l8(1q4R&rRr6m{@8PlP^wrRgQOLzT<=$HFRyWZeqsXE(IA1a%wL0Lo0$5P zC_m3neh^;|(P{lE>=oiGr-&_(*c40%eLdz<`FldS|Adr_2|Zf*`x3l7d5UqvlPth> zQnGU|OfF1Ss#@C-hYG%b@fxZ>qO$OR>)`w2JAjYb{{-JZ3E)F^wt)}TBp;E1uNVaT z3c&{yf+*heX9Ynd)F=dB{WwY7VD{}OE){6}k3S;BsZhB(xiwXpH&|>LEWYV=!eR?q zi_c9ywt$1fCnq0!fxkd|!u^LPjzg`-n1Cg)`TT2F4YfXwy3`K}jaH_<{aYpH2im+M z+XJWGhY!VLv8M?$#$w1fC!f!F)Mp@O!ubECk6*{~(^kn~;?{tjVcw zll6RKQ+V{w=ag^wSX89fXfC~zFVf*7%h~PPBY+Uk_mES-087i$_HhiS&+xHWjt__T?LdEj@(K=r0mTzp`xrWsuZ+mm2goH9DSiN1 z9e2qjp#G3EXpPzLfBmNbNTOiA|7_(4qJV)0E<9O=c2|7_Uji3I+6+D}f~?@5Ly8Je z?_oGF?*E#}hktVN{%ezuyfk_L-vSVx5wFiza8VB+{$QQHg_>M2fwB1Dqu&U*#{KTX z&xNvnYU*31?eAGzw0jV#(OAzD2=f04QsNZ#z8%t$xjXcAu zVpyjed-Xvw+(V%0bhyT$Hr|7X$$qbkAH*B$UBvww$pP+6pG!v)k2&4!9c*`6$$Lio z{rB|SeFTPId4gW+<`ZYnKfQZ!?!z7HxY(cg-x~oM3+jd6ox$&|s`boAtwgYtYtQK24nPT48DmDQg&dyKO6U+^mcX-nmM*# z8G(*$v9(h_=#1tWvAqPJeo}8X2d&{y0VC^O4$V;2xnZNQo-PeqE$L`q;)co1-k@nM zHW8;9?(_!x*$iLgT?8V5MCtHg2S3U1db^(>*2IXTHXkMzH`X?nm(ta(m2`7sezkUK zZ39Qw)~mH-i0}&*-uggE>7=&T-WmBLS@YWErAwRX{PMDmhOZ7I+C;!({E@Bo_3FmL ze66aF=^%-%`na1%%~qZ~ zYO-?ksJY6`qoyi1kD966JZhqH^ZapBISL56tka2-t>BoEX+|N@`k!|awe}JJda*v( zKj>dsEKvOS-}!ja;+a5wo z>B8E|`bM=@t1hN1)y?^f%WDhIr-R4CInCrEh zZ4~}@Y}4*HH>%b2*^RZW^>lS@wQBRoFHgd?Ttvn~z1wIlA?!WqVoloJVQVmwK?62} zx_t+r8Ouf;!$8)7D{I|v;dxn5c6=_-oQ~-7)}>1;^Q)NgVl_RJA8qblU;!o11rAVh zZx#%?snWmEJAjVTw5dVnwOYxjH^Soe4lr01Ioid-+UjQY>Snq!znr6zRHX{OZ7 z(m}hsi+qJ05bcpeEdVK=#Z0n4+DS$3rP~06D+=+VEp%G-?m>Tk2aCSaB60zbY!x>S zy2$X_6+-9bW%;0l(j4+p>Zvpa3GLUB2-e*dCe`Tm57Xvwl)N}V;>QLqU(^|}8whFS z+caCv+Ts3ouY+VHOdXjdH|v9D>Z{~)%|o3!$^2$oTUuFPuKEI{wfPmGbi9lkAemID zXSuri?B-=f`~7xT@z&^Nsf*l_WLsF5X3t3mT)r(c6nMOtuCGB} zy|@9qSy)@YmhYlS%PDBQx^bntm~R#@Tj1}>Wk3$Zy$P&+cF;TM`!jjSC_d_xsk8}d z){=$&=JLU)+7WJF{-nXwiLSOjzfesKKWzt8ceP0(8&>v=aaqz4I}slXjL6nEKkIUQm|tGM zJb$se39*SR83-&4%#b?W0|H{rmwUT2mpZ-Pz+OzOm$%xSh=wsSBR>(e0gkb^D{GJu zr3xyYm(fZfq090zr4=ZR%#su-CTvF_@!Y|Ff3rtna*?zN%SHLf9+?ybP_uO_+3MZ| z6^&Y5HiHa`u`gyQik#OMpfc)kOyK1Sc?;=b`_MXvLl9sj&5a){4YzQ^Us4L~7nfES z*IrC7E^XG1Z5NQd+iVYzxe5seuF!$_6G;*)9`^Ff_2CMH_S(Uy55~OIz0n#BTPwXA ztWoBh4cw3P&xR#zb>b?%qikkReYivS_C4uPf`Z6@}cnsY^we=}mSCe~sQ zj}h-oqN@WqQs{zXn+`JHZEmzi2Lq@L+JS>_wOU=Qr7M*1ORMW!n+XiGMoR>)nX@Y( zEmto{Y`WCjXQpRn6Qp~pz}LZvRoiWEL(wQ8!#LNgLCT_p^RUizMjw>|EfZbo^4i*Z zQXjOs^#p_sL~R)z%Ce9;b2v8!kQfOw)Z1{0pmS*tg$ij`C&NJ_Z2@w+2(C-yVFv8k zTHZ{@K<7$}aVSWbdOs2{G-|144Z*I2_t}69!-VCKj~U%xsSiN$ThMmTC)>T|q0iJ; zPKCX(nV3IsRM)HXn?Wf9D}g&A8EmIu58WnsTEDP3&R?kjELX86&YSj>zvsuv;VPAa zKek|P9=`%ylEwMWd9mpOt0LA9MZ6+Mk%WgYL8TyldH|G4F46&$vGt+Ln#iqUJWW|e z#P+y;3RI;rQF?Qu%rGn=(Q`C{^7ay0h1>&Uh*ev9Db`h;pQ*-S^HCmY{1^O|GSGbi3J1CXj7P1OcV3P^%c)A&u4#PU z+Syp9dkQJT6d?8L+zf$b9ZX-dJ2_T2ea^;g^id{Cg%5)U^RIUVHHE2mZRO(Ha!pMk z;sebg9fb2N2pUNIeeh?z_4t)sUAlO28J;BSe>G&rc3Or7ssj#TXF$}Y%~l8O;fCmt z`oS@%@R{albINprSetO%bv;Qfkvvn0b@zyx^MlW6bh?n~^3rB?V;4OxM5hi!2Ou5?&=8Aq+wu)hM=s=s9G(MOZGec@&%^@0hpV>1AhQ7 z3Ad&I9dcScY1+5XfNRtL;lqU@wx99V1iIaDB!+7NB_hFXxWJb5Ex2Bt2kjVTh@*mY zHdZ{&1_L%VfUqv#_VAV-6u$NiYTGUgZSE=!Ww^vJ*#Kl%$8`L3ur1=!M+z?iY;b7) zu^Ytb#q|)uFc%7C+-7lUVRLD1b$;U-6m;0GuuBS{in-Fp((1G6MW}7?Gz6>O$?T|x z@PovhaA|l6rucA=dc0gGOQ2kwMZ^3M*XK9pSJK6$8hlOFG=4cG5M3Pe9DDI8BX=2& z-%}Y@pd}ID)b_CQgAp*U->L(9h0Di_799^G5-|tC5sO*mni*EsByN+Rslv`Qx$4!e zi{R(0aP&ZPN>w`LXW~*oj0za`5CAb2L?%q&Wf6fTaDJ$Y3v^5kWpptX_F9eWOI=tv z^ZVkMDlAF7$U#QI^8_i8pOLQJ^8CiL)l_XVZ=q{pqDvhY%WJF8V*D^-_gl?2ZDN>! z2ukH2InE7vac%KhX4;z_>{Q^~A$A<7vS6k}kb`+#w)M!o9SS2LD{;0p*y_?%lt=GH zFs(uFa7iMKFr&yL%t8)A&9p)Vn5$PgM-A39Bd{Y|%mkyAN?%y%0S0G|FI7Vwj6S>C z*1`h(xPr@^iD9y>pua8?Cc^AoWou#gT7Jswj5tZGsk{e44;VcocV_L7yK(=J4@_U_ zD-yYPJG@DROSmjw#=^f@w;;6vBzrkgGREF-v%mCgH`9V9sdT%TWD zB&R!q#Ti<7tC>WVtP+=jC-BA^?JUvUWLKSYdHwi>!X@Ifg!Nc>_p!5-gkV~c7x zNLKYqiatWgAV{X_2~UT~n63sloAU?JuZ=(oG;5sG(IW>wN?B7>#PPd(0Eeh^aMghp z)V++Tpv*hbnd(HXrI>WC3#%QMXB)Y7$QYsXKoJfoX(5c{h{wGuIA@Xkd!AYl7-xa#NviX}2~6EYGO^uViw zSctilSfM#0Us_$-T$*3bOkuOg-GCAw9s~L`?d$tlLPVenbwida?urass{q;pe5T7) zLN0|jqYo_&Q4`nzqBJX_ArVBCZU!oBf`AW|x&^3U%VMg?_DMBXGJ+B7pL%-c1ck0u zAPybO(&`n=b}@xq+gd?LKFGa{X5+Y6T3uO3(4IoT=-#_6w!c_?c4;-Q=OT$?%)hS8 zEHaivUCb@#75F8QDdHdyHC@AB@YY~ov|EY!2H>8NZf|hQ+l-)OT6_93TW1}QxTuuq zGZP}FD+~L%Kvpc5RS}0pkiQC*tyQ8G0uV;c8-miU$Z$;5?l!fWhCX&X!`a=f@3scm z%wC7_a1^91Vi}o~pgnkCEmwsC}ZY!V?;rv2T{D{^ct7y3C~#^jm? z{aB&oI-p{XfvN_FXh-o~T|pqb8-nk`PuzA;3dm7%>?bvivXlbCTrrAO1Y?-qBMt`* zT1r%3gV%fNJ4EE#P^Kj=bBbsYV5XdqrmwdSg|_hvZM+3vCCX{2K)t>ZJ+=zXR+v3H z5j|SkF?>SrT_5|rA>(x+cYCm~WHgXV(8+-L#*~P6i9BOLO=OJ08d1NwJi+bx=A6`a z(X7Bxurs^?)eB~wT!%f=Tt;#nG@KQF*8cLw+VV2>hfBy3fj1p4*AxL%3+$(tQ3hoj zZPQ@`;RH~lCw7?~g7OEAJu?3qa|ABWo<-dQSnRA<0Iv-$iR!K(MNDF^H4yF%cOZI_ zbSk7xHG42kTL%LWa=S4!H;}pLTb-SR5y7Rask_u&Ltdyi_T-g(n_x^X{;3Rr>2|yD z`fg$pB>HwEOXpe|wf1e`b7#nD#5q?mbW?0LZ=vYQZn9nPUPs;&ihGExb@a3z430n+ zKm^Toxf%xpfD`a%PTvtTm^or%2^|mSwA0uaXdiq(I1m&7XUiWymk{35bLDq2-_p+J zrjNKjcPIy6I*TcIs__n@96Py zG&EqIo%4euW;Z89xra(1h)x`gU>1gm)-ZYH0O=B=L-5_kbvmC&!)fgbBw=!qYj_#6 zw*zoAy@F5_u}CRMiJh)gpfb`Bd|Ys@f`4X{L7+!zGT^wk)ESuJNXd{UDKQGM zm-NF3yX%;8bgxl78*PSkpzCz0icBAQmVqxZuZJB7P{sj(5JZ3NFnbIfrQYv%;0Z1Y z3)K(Rg(Rfxv`x$(K&f?Q6i?h8NW0;eray}(%JD#cwe@%wwT#WTuNk36d4r} z6c6?IoI!OKum;-0!s{#dZxZ@=iy*>fFb4!QaEobAyfK|1J8;BD^w-aWLbk#@F{Wk} zp$xJ`A6yjLRU}bS8`Q@r(sU+)=1n?V4h+wRk>e(uTtt6ZfTJ)AOQhLK8_p(bqG!O1 zK&2zeWXhT7csfB8>0)}Nx>2J`wGY#{K1xi5uK^auRWBhY2J&*)s-a2}68Xgb%FAxb z1|-xKMx2{XdKp-&_7_{H$#u4d5I8qSMXLBL0AJ`0OH#Z7XIN2a0kshVgTe;yZlO8e zKZdgBn4o%txK1jNgtVu9C?9baYiC$In=WKtdKowZ zsz;SFXfwvpi-QI87iW)(-OJ9ztv?}HiCxI%2i5IMxRdgn>njMaKu`ef;0#0hWQ2HQ zAOS~0yQl?6)*9%{k;N)LT4BQ`WK9(f8Y`qXb(S243{yldz$X#y_EC!7OwkX=bEb=t zZ52QPU~!PrUWfH!d$gyvy-Iua^NkS!*tp)uq*bJiO%}^Eehsp4rQKB$(#d0#R6BI3 z&e$)S717|Ls7lAqAIg)uR|KyvA-ywO%YNrzn9j=lm3tW#*ohK=o#X}FSyh-}(kKCt z{fte_xh7X<{B9X}0PE`21Xlu2VDtD zC%r*?S5#ui^C8mH+K?)m0tW3lvl^5Ld>lru5dg9B@fkReqH(HfflEc@N4gRrU2(P7 zeF=rslA|F6+&Sjv^l>-A-`@kJ_dO+wBCPRf%)U;YT^Xd)Jx95zeqyS7nf@@QP?+wR zwJ?xm7siz6bHp{M3yR$o=MG^V+2tICVy$Jom*>FpBqf{vdA$Ukv&cxuc9hp4O9B=| zkth0uGX^Ir8Pq^{40ce44Fxoj0nMm+Y2Wl2AZ8%(k#WAcN?Co(O<)N1iViFe(ZogB zz!6>wNxBVvaabz)bU02HW8>4Y5dvg&&IeSIxo72=(aj!n@2qeW_>hmD92UyZ zpCVe);ED3(jK!A0Y!kJU#dx$epvQu)28cdvS0g18Xz4MppE>3pwEnAW>($lco>zZ` z$_OlC8COeQ>h*Uz?FGz^_HhT&-Z7Wgs3T{Ftl884hzRQ%_gex1)>+oH^QwC%T$Ay( zS@)(>vUkV?W0#RUU!c@iWfePYhNIptqKhds^28F$3SAawfM^D@Kyt64gN4u+EEPJ- zXc^u(xTD%TZD0bJGeQ9H5H<1QRE3y3AHrCaP?2mG6p_}DK0Q^w#5)5hWV;4j!B?%L z3Y+l&9>i5n6U|6BAo#%uX5lswWEhOxpxPqXM;ULc*MGxEHe~r(l~EZ zR*6VTqeU`M`Li)M7X!JdS7 z3C=`kM)DG3t*Cec9v~uA85(NX;f^ua; zZOW*vLQN zsMJJjPJjYY1dZ%zYt3~e|1kPjQbcXtZty|F*(Q~SOI8%%=4vj02TR{@%=x}M!d@W< z&p&E)gQw-EBg+=%pJ#RJ2T)K5G|ht0S!2d59o~Y=8Qd^gZtWD%F&M7OP+j{#P9ZQi z5R7sG(vtCU9x6=nCo{xy zeFQj)bJBBZiCnaKa~=4FRn53jXWvxWMRJH=>>40HpLTM{xXLY z7r;IMcwto5v*=FRAO~_`J32t2cyfR6e$!5|l2~!_M?9M67w8aZ;?nE-<{qSohNv%N zl|=y&NY?g{JKO745gvs0mRw)!mNp}uNifv*aZ0X&Gw=0YpIOv!_OMIi+kprn)S00& zI|FC-pf!T70L9ZEh~j?vUJPNAUbD#v5vra;{YqQ9uMTM}oVZ{vlm_7f*nrDiuN7N|=B}dHGS~-LqY>Fh1c~ZfJTb~W7t6xECQg09jOX*C1nTExrm*}Z& z@e8(TzhRr~;IiZE&>`s!ZY6waZ@(tHt-@Ur2mJ`zY$&_48QtS58W2ODn7u^iRI5^= z5xy736OvrW)WKjFCsRIv?|Klla-vs4w}7io*`aIFg+rhTDc%_yFv!`0K1M0$LluC~ zpQ%L-K<_oj9afn;$|y`ly3(P!u<>+9>*GzzsS1s49a+E zm^xM@ykArqC?eSE3A8|VKDnnXuUrey$nYH2C4&hay31D;P+gVKOJVJNy4y@=qd|GWp9+LqnaLLfUlFlMHIP%SP*~yRu4mQ&W z4it?$$2(3#SY@L)VhB)07X#P+XPp zKJPrwos>7gF&nnT2LJ+0l(Yd_l-Xh;3fQQ?a#W#t%n-seD$1Fw1tqeysShh62cJ}E zuj;cfiEvF=q_-@v+>9SzXD9$UdBa6|4Ag0+(v}fB^LxwQTOvPdw_LaMJW$}WOfX8< z3)eK9rc6yak}l4Cw<-2hEdRm~t)oq-^#Biiu>7VJaGm@3VND9{=quHWFXj!X16rBE zW`$l~d4XHwsv$=`C)X|fkQ zaqI;#tK)|+r7OsvgGnA-oRy*jpr92iLNCb>naVKt#5JgTa#mY`c!I18xSHeMBlyOb z$vavoNrNo78-O3)Ab|5ZMo)!Rp)Uoq?H>v%((F>Nkf;O}cT&X@;6_FP^RE0WvBX>?Y8RE91LHKpXV&$`~V@H_j46`i9sJf;0o* zm?Dk*B_~85MATymTR8#(0o?0fM#Rp~bb5lh@d%hY3Ix{epz=0ZK>@JT=GxOFWO1=5 zq6Wk@J_^UWA)}I(qP$8zOaYwMX;5dT*WhI2ULXLfG$DNk0$SnS zVTlD|5i5~LqhxhOHOModxiU^0q^uV~Ao&$T204>ew8*WodOhj657<*%dUh4L_JLo^ z3(4bAbV;67hGHsO*%~b?{1WU5SQda0o5=o$*}6b5=>BnFmmn3L4U`17ntUYN0IP~9 zA~JM)%fuYlw>B@KSY3=QF*+32R^KmI^-%h<`Xq83yonMs6;_!w7lcyG3p;591(9?x zY|$&;>VR!vD@tx}gaT{@>k^kG61e6@F3?q05z8&~sN}ALrRlG}`G|AH+sFeKV>$+4 zW+by{j1Me<%tP#z3{y>5IO_W=!C_n+$y4MF;>9=VCyxcB4d5QyL&lJn$&i#YfQG$&umqdR9zMkOEI#PQz;tg=-_7mp*SKuFyyWcCEvOGraY?>yJ^{FEgZC^) z_hFoQ%u)E0W{G`*YfVvBbm&|^iD#hVja1fTz<{I!m;0DtQ~*$f;4zu6apc^JN0Ske z6V@XXXOJ})0I`q zLyz~w-O$_nUX;jT3(3nWQ$^xYAkt-;`W8Upne86Zv6N+7l7g)dQAc?)XQa$3%q<|E zr#}@TxVBRYPHCoMg#Bk+RU`+plZ0Xz7m7w93?@i*=h|q@ZS8_r5d#VHHmw7gG_F%d z@eXxpgXhup&9GTeI3%e7Vu8_|&7Q=t7mfAU7Et33`u2dtV#>Sd(0iB+Xqts=qRwoF z7$DVH=828qphp0uEI2e1QtggQkl`u5iphga2?5JhRZ5VZdve*Z)>T6?E zPfhl+Fj<<|!CEbUwa?|4>H6rlGe@UYr+ujr&mNg3#9-AYihtJT~guawT#>P~Mw!VYv z9Ca*96S|fuZ2MEnZSfR?M@bdC5XFJf>gIClbOV}+9fq3hoj@wmdWsK(?y|0IcstRJ zcP`ltwF1DQgccxdglMi`f}c^fs2Y2v1Q5F*8i%h)Nry|Y-Jeb%_!y8!N(91wD=n1f z5#b|qS@Ja8JM=O=EzJXrG9)Tag72K3y;FC{IAmoO1hsa#XMrjzJZ&(FHA9%Oh@rgE z@GAHTv1b4QELA1W#NXH(L;Xyu@9)s5v%FT3D=1gCWSu8N24C2n!QunDk4J zn};;>qTA36at7uTStK+FiEL~zbgW?B8n$xpVyoj}X19g=1_o(b)%9%E1PvfDZ^BIU z-QkvIzBH8a!Y#vy{XXRy&6TPVoyg(LHt`!+2e& zQ`imW7^tp98>_8u|M-$XoNgsjl)58V&lhJ`83JIA zfwD$f^(@C^p2fq5*t1NBm@JUqqne2Hk6g7ET7_x-Dk78!&=w=Tbe#mbc+_ArqT;L#a&KJECT;|UG1QAqVcyT{R z@t?TO++DoOxA7e}=FI(ZBrK<&%G6L`iR2Pzsf~iL1fiEZK+S;_6s})gs$GV0yq#GX zx)YF9tT%hW;2Ts71raZwgG~sBHE0C*uKgfGb3=+0rI(hsYL|srR$BX#G7|PO8YKCK}#0DpxZLBu11ntjt(a%CaAd<#n+(-1V*jf2a5L~5s;0tLwN^3 z95Ml^8X!CjnVfNSEE49L%$Nxrm%;NTyIRN*WhVCY0lrIZrm)xH681)W>CEYr zCFV-Of~_ZHSUGT7QK4s1P)NgXVCj%bbqu$!wcH@cz@T*JKw&?uIp*^@#2j}K3bxT= z>~cBGux-pr$foq=XiQrUozyNeuMI2jzR z6ofC%qxJ^3nWN&jpchWCxKh)O0$t?y9(5T{{pH>bftCtvq>bvwKa3}e9F_Y!P%Tl7 zlaN$rC*=Xuo-79=)4|I|jKpd1QD{6=(5!cvdc%Af5(~_bUXjX77AN$YxLHLhLt3im z=WzG7R_>;RW+I9SXpsRhJdU6sY+o@9;8M)QC$sU%TznEXevLzXePfM9ln8SdkVm|k zx&LJ}J$uA;ZZ{}v9|lv~RPIEUf@<9_Y*lNlmXQOZ#RVatG?hmqZd5`=cO@uPc=_r8 ztPu9tkBjWmt|TZWgt{%5Ks`boGC8FF(gOpRwu(`TT&27gc8HBoadxX4&`}giVGg3} zfT_3zX{#R9g_Ec{BzhD=4>q@WrQjQ{>}=32`&w6dVOCtnwg)sFh$7b-!h-nr8iE^dsSOU0H) zU}bLGLm4m7J#1s#6thNgFVuU}&dZ)WCqrLD@tP8H(5e`~+SJf5j8lt-W#B;(Y<`N! z3K3v8MyIol?D|9(oiC=NSrh`e(ZDXD2M`1q`US>olov2e%Fbn_{lx#ZNj1B`S;avF zI-#y6CW|@2c35f~dACf2T|tGd*j`aAvmIWt07@w@La*=Lj5Jgupr}F@^b-0}u#?%? zfK3t}0i|KdU!qaK{F6N5f^yeM)l$%{v&+&Uk(EOuHiN8WheO*}L@HZCa9u8u3||OA zb!61)7%crpOMkvXS~O zDx<#TT~X>xuM$b9iQhUGwXYbHkA(SB_rnM}UgB!54d}sI(^~OuvHiywkh)@p|Ma?u z!R}$#a8VyflY`OD`IHqeh?2z46gm3-$qK^lc)GMrPEs8}_ZVBgyOKMk12#uTMLDp# zoWw;a59{@2lW!8WRD}!7Ti8jRLm4!!bBkL91sVK;T27uJN21a()1keeuiWGh<|}_% zePevP!fFy?yFCl+cZW?Xs4@-OB>aN%@~WJYTEPwPB1Fel3LMHQb|5Z z%L6ei>%Q)Wy_i^F{GriC&;XM_sDHq0QD0JBD{hMx8QgHlEBg}7_8218J$N~NNMtcsDhr_HZaCbH z-O^ye;;8v%7{jlpu-3V9QCS}1K8XPCCV0Yf9eVw>JZk5=d|_)INF6@JqVHLLR?2;$ z5S6e?0*GrZ^e1^#&dm!~Yjv~)&e&S#26KsagX$p}*AOuka014oO2Pupx)kHhWo*1{x08d|C7(!jgoRm~r`Bk2)w>Pcbv8e5xKvK`tF0Z@@7&#}&~{y?iy6 zl7Uk27;_2^X_^vR!lY&4?1j=0UOM|OkW5GcP2$T9G?RwSgZ=%(i2JINn`_Kr6lf0I zg_19za1OUjp;)_giKUk_sY0Mp@$^l0gozq-`a1Ea1w60;ul2Dp4C4=8^^EYrew_8f zVBK!Zrpi6W6O)cuh<)ySg!cmYk3*EA3NaQ^guFYA$_~mJU6)T5Aic55tv3`ITn~th zDyaGJCe$kU;B`%CKcsoa5KIFxNPKkJK2?^vP>S1V(XA+J2v?V8%a^HyR7VDQJ>G>1 zNkM7L#6y)|BXs4>DNu;x*;S3V`2y8-! zn=yLz0F{pbXnn*D#^_}@wgTcyl9^$2B5JJC3C z%k3$+avY~5CJDnw^0pYA1}S4Z)DYYl*o<0ImeZB84Yph9dp;~WbO%j5<0cye8gVQb zr5*qi`At1tSb=U7WZ%f%s3}T!Y*ys1no+jEcStHY($B85fWtPDmF30a;SjDW=h)>3 zXoZ<%l)KSs!CX=66!gy~0@EQKU#RLK8$X$9zAS{^y94$uZzTd-F>xLs5xVjcQ z(Blw}+r?sUK6s~CSWte$0lrEIfz8WFb$H}nYq5dCYqU8>D3K)I3>JdERrNu<&k(NN zXF=_}xglK7k}Pb(K@dZp(Gn9)5U@qkwV8605R35LqV_ z{kn!5$h*z$^#_xIe5)Nd^WlrSvfyd(+rl>bTmbx1f z=JH~n*aTdIQ%JaY40Om%YM8=vee^&T_HC!Kf&mr;JDioo%ixNDe2lxq<_dfbLoRvm z3o5yeYNp6}hcpnOFow;0ZVT~_zx_(Tj_)gQT_LV)NX>D1(J zQjvkaN`K`7qo|JVrgjtK;|Yfm_(MnBc4#msB_0tlM^eYbddWa!gRo&t0KbNTZ4x4> z^6!dZ9|nWS8C|vUh@)nXR%8%5DDpk1PGjqi$cZqlK)={25r1$}cnlFoI*>qbHcK&j zZ8n6s(}IH5R?Z|eFr3~^?1&js>4Vs0!C?&=(?a(I3JMIsUh@<1&=4EvxLw~rzGhh* z5Iy|*FeLYTgfSkB+MU3()>-;*ekiO@lqq47>;uU)Qgt>-Us`>>HkzJgy&=dA6#`4^ zd(}B6J5+BZZO9_T$*>%Ce$o{m07^Sj?+XyQj;~?H&s_+go@ddVcRz#P(f3@c;!B#= zXO@pCGwKHjTb2{BTlh$U^+BCE^d|$J7vw=djl$Y}8**Z8Gs-UnNJ>E&y4{HbX zMoOxyj{e*YxWIaYrM+5xX|Gzv3s+bt6I@F8Ms*)u;;T+5n#dm%@#7DwO7aJVdH8b{ z^feg4oIrI>>SHbrlhj(cS{?(;dnoEE``eK_ftpmD=+j}e(@%|!7RWQ!d$r%G;+xz^IwH11 z4AJYjeu#o02iVS{OL_dPPlJC9NALd9=AP`QUAW5eW~v{uhc4jJ*qEo!0*ycqSS2K6 z!jlf9HB1DAW{`>tQlNC%)@%bXKuEXY5Nhy_2#K`WYbdN|&ZJ1)!o^^lP(2eus7}xN zJ)x4N_2>6MeO1r}zVCD{t(`?pQ=tDGT$?jW333SKXs|6`D2b_SyRhIu?gB31vkS#> zGebGP+8li2Recb(g!cC2ts@gvwxC`z4@m z)cq_q^FS$J91C;RjpxaU)(=e-V|F^S{f;7zQh5ot6#Q0h*B8PO&OFZPew#eu8oQZX$685?9t7jAQ?m1F*OCwwzDTwm%w7&*o0gf&Jj^ zf&;bDEWX>lgYGDzDU9WNOn5u?>2#28(gTYEEVMEMs&fxpc`)2jFepwGZheWh%Da0_mflPykT=|b${deJ-|ds60)_CNpieu zCZ0i%=izD_kwQU(QmTQ*(zs3>fireA8VH0UM#Cr&0_U=B8NV50`{$`En%u_II#7Mq zhZ?Ih7Z9HwwhHRN(L5BKd12o5HwUX;M3H(wpW1-fRbJ<8^ z$U?acirNmSMX~G%?cy0S6OEO0=_HjaqcrS@xLmxrWhI>+I#hUZwzzk+-tWes@?y9o&MCVWD& zUO~-)HV^PXw9q6Y<7&3H4>(ZZ#EdHe?z|KXsV|lCeysGKDF}0EZ8qJ2-V0T_3a1bH z24l1j4j_s7293WwD+tKh0WZtcSgeTh+B-5PAloAK^X|?4WC;GVjYv?R)zrv~$)8I2 zkJ$oqJ1{;V5zaQ-H^{FnK*+5CerXRC=7AfmsB~ zLR^A1zK>o9TYRoGQLBw|hC|m^psGlDvj&VqD9NxNcKD~wKb_>+)vePDk3T*=cl!L3 zvrkT+o;fr9^qJY|>C^ArXf;n?u8;Kk6SMC+{lxz0pxb)yZmZiGv>P~O?fLiKI)Cno zb91Mk*ggHk+U)5kb{KZPf!}r1W>MMJN;F=H5HZE8M#Rz$l%_MxA7hP~ey72T>Ye8WL8V%t5HK7(M!-1YhprCSYItM4 ziKu96)Ai-r=)5~(fW~{(8-mCp_rQRCVoy=40CF&}qe6CRdwKgzwR*QeFXR2fbDJOD zzBM~rPo|$5Glr7a)DZ&~f&{%%;g>Pp^~2TPh`UKz+}Q>{h!7dlTvTvyB43;~MB8he zaLzVZWlr%8s5u=eo^U>#snQb%<>MTjW&8qJT|PM;6hmq<)${%gJ!|Wm>H70fIOvy{ zOHuL@DR3QpTWr4$Y_WJ?X3OJ^<){{}iat+z1W#$vz#>c7X}0&tk>PxSV*r&A8EWU| z1)1UWk&Ap*w)<8SdT>$44n7As6Gw=9kjm9YrhIv|)m66>Y8!8hrh+^Ul%MT(4nf{- zHshtZ3jM)H1cr;c)~F&-=I^2IgS&OA#q!A6y~BQQq;f^-kjd5Aeh)kDjB|(`qAVxH zClH+#p(q1FSf-AG$6!(^zvR9tvr-rowAxu!sRu1Ycq|Q;4r#T2Fn%2jCeQ^kY#)M1 zsQaiSvw;`P@IhQwKtDS<>7 zm`m@A^5u%Z4de;vAsH3p>DC8_f^F^L0h}>d80?i4NKkP{OMEO>B*>7A29QH0mQD)m zH*O@(H58%qs?`P2JA#19&#kC(JVQqjgaFb=kf~7mmYMnp&hAV+N~Tk^52tBn)e=)2D`jyAIx5!ovnyBxDCO**gNDf%q%gi(ups5>&gu2wi zl%NPX&8tXeHe_A}&M4UfEGpILUhhh7Ay9$t#zZi@=$YdO^viw)K;(K%(s zddwOlbOPMy$yXbx5vg3Ah5fm-4`jmvAmBD5YXBu09Hta+=JI6K}`TVm-p0u0&9oY zoaXL)r(GY)JO#IaTEZHK*jt6gfCCo-POj)kkPdstp+JB^69H~;yMbbc2(b20UEheV zP@egzqC+^{Np||k!T}4}LGgQ)TB>9?9SA1j`!lF;>Q4OWh?PqSLv(|{w8!lLdaH+f znBsL7r$8n#)=Xa}v3bbGr8S=@#_G}v0vYH4M1blbQ@l93ERnsNjXsHgM+#=O;*k(w%$=T^Gm|vYtc%A)Unr!Ezve!MrHig+C+3PdlP!`i=X7*MS2Vt2 z3K!$!dUKA4dNl_ZQSRJf1TU>Fp`a$Xk{}`&6wGtsdCGy1`z!1R-?u`L2Z-}36vtg@ zTPCN@X&_P-+#2pD(yVj*q{PT9b1s-%J-CuwH z25VQ+L(&Z&4E5) zS$uR5L-i5Cl`^#gbJjJO#fKrXBQD0cD8ommn2rzv03JUe|Fj^@(bm{AFjZ7l#30N! zkCz;$Wh^pk7Q9R}RFoXpkVwHTNL2agP1pot`I3o!bQ3-@QpB<84Il_QLZNr4OM$2Iu^UNP z1)RD}b5%!oK8YfE1;KZbX5&gFILV5pgK!IwqQwreV7SB0yd7`^{*_lH(!)8<^l)4TXS?-Z7@N$KgTn1c+7oOC-?XN;boc zV&+uwf$#nhPDr5;C&DN4rps{wYKFgaQNpoDixyo67FWLjrz3pSGf%-s4W+7I-(`Rs ze$?33fH*@oQay@L3(o}+fjuF!N@+7cp3Kh${7^wo1Tj4j5+25?pJlEVjuvQo2O}Ql zzbar~Lgti>?@P-e!jgc4B0>r?2=;r>3<^#e%qI^jQC_My?u5WpdKy^l-mE2(#QC&}H>jr@a6NoT zv)_8Bh2Y+0%&*{?pZ-!k^XrG4vYBfEf_ZEU+%UiLoG;QKnEeUw2y4MB!>GZ0R@EJM z?uK|uB(eC)B5j@i@PVm1(7h1WMaN9_g(4l&etEp(YZ_82p}<7RPB}PB1|Jm>oj+6v zuqe8CK$+!asa`K}6lSR0dW9@|T%D+H6KRjh2dLIAnsbH9?zpcct*b9nnWI@l`L!93 zp%&0mgb)l7Wihc$Qwo=ug$ogzOwLFomwHf;WpkFaqgr>L(E+YhVQQ*96y{MFwktcq zEXX&fzEd(Xscv+KmCx{jK_#3;MguHJcXz1^ksL4YeJafOtc0k|raz0spJ})d1vTYZ z?d-E~xFF=C*X0=3sUhxb*`h;~}BWP`YqtlvQJ6jsK!%=~a)*YFjw z5HafWix&#$OeAH0& z=F{Xx8+9iMR;(S3-M)yyn<%&rCd|#Sj1SU{W5yLYv8Dc$t+lPR3U-N`9OqNOW+*zF zwSTyX%wBP8GKDio72O4ks$-)q(}pCmC3e2pzL55iX-tymO5}(KSU+m>M;U10RD;St zovPliQb<=_`JG-_A~Ryfp{uYRdT)d%OP9D5U%3*wRWDg-ENB);Q5z4g98gQlO(1OG z>q8Ycsf?T%$^v2B1Xzf|Yvz&LH&~0I4tHh%D}1iPZX`*~Sd1JqR=bIaOY0)y1ZG$= zBD&LHN}*^VM-r4r$kFVMcv{@b!t8iL^+*c1BkpH0ndx&3g+fW*tF@32Dw)glRKx&) zKUZf{D$k%QW{G`ts71b=9QT8I`voWH&QbkPn9HGnoaz+SddtNv1BCG7NV~zFt^q$- zs~Z%N@L!xGe6v6ak%btvD78#pCW_F>DA`!7Gc*`&qljKQ+(1k)2!6X@ zvv=Kh5XhXL8uMD-g~4AHc%9P((^fm#-k}-?5HR(YuVNO>t)SxGIny=x+O5wWtXgGA|^6S9(fi8iibh+NoJZ09bgOPWH~B7jg>5VOU1;j z0tet;)x=U~d65jb!kuIWfDIJz8+1j>kU$O~#Fo+|;xTi~elXPLq4}uGM<)2JOg5W{ z?nG#jJXg#K1WgK?6H#F`k8r^oq-rBMpSb-?0w^|G6W_0<%^|+Q35>7$p79L$fLNfC}--7K;d zc~~6IFp0`EGm1H+ap5&YFN8+s!;U0HF-;@NFJ+llZaSb4gGu5L-~)MoAzR)`2Z}6# z@m+AU5bfCSLas8`*oNCGJ3JPZMRr5f(9vn>WRM#DLu?i6z9&_Bf3ne_G!N`L^E(Sq zrSL|Dekf=)usl>w@le*N;+S=&MhH<~0Pw|)Q~Xg(RqAw> zzyX|J1C)$(AWtZ#9^S1pN*n~F|5cXa6Sk)~cyU14vyNg7ip`)(RtN&q5QBg%Juq3K z%ABWA<&MugDl@9cb8{xP25Ks?!u1YrY|pCT=BY(Zi^-E3lBMJ96YMNO^cBW7m@POV z-?k4^hvW-~i7`xx-|j;tJ<=J?9ntC|O$X33?l`?nS5vUgBPzd#7q=Ssam~;- zQ^wLG9njMWF8${4>k$bIVer4L7@3fF?A`%zYnLBoUmAS_sR*ObHB@2iC0FUUs z^Idqv*a|COYqcM^g1Wn=m@6sl>z0r0596xX`axsXwM2dr@+`Pmk$E=e_E}&=A43Ek zGyN1Ucux-Y@tjt|9oif=7LGneRla1DK7UIGQmdTX%XMn(v5Rx;(dP)~I_ z1KHLusN-il@FR0$Fh+qbdT{N6-T7uufCEE>b&RrXP^LsgYKa%ACQ zO<-kiuv9@#cHE_VOXuOy7+>Jm0s#~Jr7S=V;K)1Ujv0BN;6VIBB}u@g#~&xJ&t$OJ zc@#-mi}%_P?;vVKeHTp$Tcad}fK>!=xP!!a;Ij}Zrdk}i?+F5y1%pdHQ}ep%JHN9D z>$`aX9bHivD97}vp~2M{N{r7(M57VusZpT{S%;P-%AIs4loCfNSwzh@rft!A~F-` zh8e+RbASgRG<|P&C=44&_yrk^;ELSbQ0lN1=ecAvnJR?1GTak+0=k2%zmPrF5?xpwL* zDh1!Am1od?3)nBrRU%)a+DOWgB();9Q~KFQ5j~Mk*g9Ym4M#NF+*UJeiZPP=N=tP3 zFJfEi`INz>V(3L!dLgtP^r(DzuMm(COpByVne|Z?1aog-Y-W#1sw~4D3GTu?Ebk98 z!c&IGchf5z|-#xLyI^vpSCRx2^eAzcB8B1cMz9v|x>aJ34|8YT8L z0Pa(SkkqA+Y+B$@wg}3};P?#LlTcE# zJFL-5?23r<2+;{wOCgaSnO+l{>Ax{Z5-Nhcqe2i+lWTzu&HBtpIhw?lE+TR|F6gFdtthzrJ3k#ol zV^384{Ek-J(8~2bO6-ej;lVJjEVP3tlZe?g2qgl2kdXx2QZtb(%rv-?xr%|F+>6o^ zpHAeIMCz`Dt2A#<;#DxP<_Ei}RFM-M51aC#$lSyhuVGq)LA@z@`q7*++qGdHBrty4 z1`qWgZgTk?mnKlsod*c9uqSLNVdkOSgUdTv<1Zq4;u&hPR0IUR1?K2wV}NctYnn7R z${iRfG|~pWTm=|0X;8!IN*g7l%=-jWl=YniuYn+5+}rUSGA&EABz+2Xo{KFf@``aJ zPLGM1LM?)Btf3D^ps`VAL&_Z-zo|DdgAH~7_s1r(`AAE%DbL8#Z&1OG**AGUbeCKn z7%TBxL93Z`8m>@EKdG;U4@sL)Uy0LB`7y#4_<)F3WeFC)N6fQ3q^HSv5rrhSrgCKC zt_j-_3q2t3^G$Mot1gUZ@tEPI0DR|QU-FI7M$*ayqXZ?}Sl16d?VbKiMvc}7y<3uN z#et03QlceUZHr7~fWNCrE|1(r;;WbxvKNJToKf$(BvP+duWlOqWQF8KY^uuJ=TFm@ zBgGpbIhh$TtkYzI%;NS)PzCl4`wq^cI8$h^AKEGy97?9@H3-0$%IZaxf+rNK={kv$kTKj`&fWr?;y3#5>x=+ULz%%r9n%uTqR{7IgR)TJz2A8 zGtfcu!`fuQwiI4Z#O<{jCcGWCSEK|caK#@5j_Fx1uK)}}&C6f~=9SwpI8jT>!n#bE z0&gjn#E_`5)vSwZ?ZM@Vea6DEP*3cZp$*S{p&{77D6@5@h9cQxcZIA<@^EfD5n*Wj zva#;?C`E!VFn9MTfMT(icJZ24Rd)`szJl;x$;HYLOA@6}|D<#**rbtTN3!D_Z#*)i z0sveBBSJ)6c7*~t;9Wj92fcJ$t*0&nl?fj`P`a&dY^-gd1LCu=5d(U@=w#_Q0cPm) zs{KI4V@{K)csx{{>})5~iuG97_&BrF9Z8~i+`+p6A5GZH4TlPq5EEefN-G7}(p`i{ zYBHHygCPyfMfjWISE+lelV%NbNm)@5DMR6HDCZfNdYH5nW>TO z`&Yd@mygFyXqJuf`6ZspQ-at-)Wov3t}^nyTx;c?%}fD}=RJ z04)@)Rw=7ySl-48l}gA~M86?pTV2?wUJ`o0-gy`%tWHCGkTI_xEuV^eVvnGYdsPQ^@y6E?d`;4-d6 zm6vgz6MU3(lO>a+7M2*L1DlZWt>|9FBj2aVO=d~gkjEWKG%UXac@!V@7drKXfGKvpN6>Rc=J4~m{_b0V(@!f9d@=zb8DnIO6NPOfupgO8= z8c4BCQpg3LNW;GTo=`_{t%e!D7d9k6K4noepj5Yo4QWiWaRV`1lE`0vyr+&inR!Q@ zX|{Xq4!$@g>C3tX428_jKw@(z57RWX;XG{Q_BP5>XsfbSIeT}h0v1cxg)PgKrfW_5 zFTW|JYrsO%5PU49+lI?9r)=rrB!l2YGQHbr z%tU3y3KU%^VY?($w^(!$$ufz#cShS{Tnbx!)KNB1T$bL>%5F#G2C8!|^XtPd4sL$9 zH3%}>7j6oG#Kv}!Rn6c(_&Dkz&^rKjSYz^atGU*XB>}6}2pf_YB5_c0giauoejAR4 z0ZB4)VyaU07J}7fg7&OfbEZROVb`Xa&HBs8)3Qk(U z3ql#2HqA;0IlBUzOM>)L$CBc_-xsHjB|nLWDatfF2OmT5%G!wt{tQA#WXO*#yp+1$ zfgUew0F%tBSSbt7&Q%G`ph=T0=RYmO@)BP+-siO|DC=M)OOA%byD53<2rC!{Y$8h$ zY*3efT;*q~4wZ*H52K9O#OE$(C;FaAEIBUD>L*pU8G1jWiUN749t8sKa*lP? z{-JrLSj$Z?7+haMC+>Bcx61T7LaewiBVNz8>dVCJF0u4;ZhFu(LP~!|PA#MXBL4!4 zrlE}qpjZ`9_CoW})>%wNRE_P36C4CB6+&4YPsre?dIEP^t`d9)W7Y3)IA<-f415b% z9_C{azpQA76zm`h)Q63BJH5FF$mu6cSQWpGvMQNP4lXrMmtDA zz6;h;vf?VnB}Y{BwvgaC=D`e~1(70U(3M0%E(13YFj<=#1`~v-Cvc+B1 z6!YB%9Yr8?1qsY>cnE~-yE&OxNt|SzrhIH5nquC@f<>$C%6)0k7D|At;F)+jRL%l3 zmg;xWavZ_Q$Lm!@P5@J-OoR5K`Wj_5y-~k1gpC@=ds&c*bB>A5-=)5mtT^hFBZ;Jy zyarc^D$M*q1Luo^Wg^dyn-a>-fnPJA1|CPN8Z}JfU0=4!kSy2saPllbe`ip8h zex?G!&s58i0ZKF)D!rB-<3ed6VsKrnD<>OUaC)UR*hZx&bx@ROm{@xCCu#+k2ooX2 z_=N|73QCIU&ORMqIMo4$Q<&3jd^!sW*Vvr@Y7|oD7IG1;>|c2L7stM&Brn#31;3aA zpxr^?ReZ0mU5aqMfO$GoVSS#Kh)P|Z-VlK&d{Rf#I$_uPhYjYj&k>*6^?XN=DwGst z2-NYtQSydaU~7IOsd!A<(T;%r2bKBXhv_`e(D;`7<8@P3b zeUP)Pu7MzPf*UAUzsT{Od#7MS@=HbZ)W}ZWi%Y15e{pHXtnqeWZV1zBpBKSQGyBn9 z7ff(_*79mXeka0wtm1$TX<`IOX@+^$`oY$gC0hHJ;RNB@k5SP~eT2MDDg?~wh3`g; z7q}9LM$Jp@7PwLwkB2V=J`UDzE9q3+Ck2^gC8$9g**-*3S-oh_nt#^l4w3@K?AR>0 zSyJs}29L29Ty$7Z_-6%6Nmj+SnjwsthO33nsO2lHx^4;ny_tXT?*aWuCXy{b{3^S2 zGWo-at=o2z`|*e08Xn&C!}#IN(ucjLN_cq74^P>pqu=Zg-xD6*^uze!@;CqRgg*6) z_KP|D;k!=it%>CQ{)+ssKRY<#4L3h)hd*q?pGY?UnH_#UyOi(7&oF|C2>{)@{kbrt z7yR(=hBwvxO~0F6`oHY(-Qi6&KYYS25sEL|_Ot&!YxuKvm`%Fo*us8hh!Dx&dxBcuw7~_T?uIC#1Subnohp*=v`q{T+4gJv9NXO`Bzn(Sp z!+)FW(a-J=n6lxA4oB_rI1rA5?rIt6t_IL$xOLSJeZ+j*)!TmdNEp^tKa7WUb&M2c zO@M>hKOXx4|AXB)k({~h#}!+~O7hCY?Qjy-_65K6wz%E9?c^ImyLCVObhvco`|R*` zxb%V_{)k<=FZpP4x}Q9JBY8ML$MI$&x#DQ?g9?|fsNjOu>^jYfw2Gj7zp2x z^pjJ6`u10nhh`oMP<(S(_E)&Sb@FW*4;h7-ol-fF*ZPw-tCklDniC$I+R zAC)sXe)zVxdC1znjl$=VcTUCaUr`M5Ccd^0moyCzTlXAJ@!t;`Y%>g6_d}<^iR9(t zQxl0lmo+LO&(B)tS)-EGN|I~V%oi7n;7_=$DqCmccuws8JCR)VL+8tt4(2ymnz9e-#oV5_a+b7?H{$@H)9D7lQ;e; z{=NON`|xM%nI!oUYx@)S3k0?S#y=AiC-5&^`O9|nSL}B(x$>z~pZY34_1{yxT>I3? zPrb#j`0tzi&dK-V!Bc+uPp!W{7vFyAQ>Xm8iHM}|xL=l}Uf6|CS7F@?O8` zza_6baneWazjxVaY)mIko(%4-H{0r+NM>*QaWh;SSG_0i@mBs@GM|Z)r>%>Z?YE>6 z@BDyC;lFObXy%9CyQhy*o|HS;K4cHw${zN^Z?j8BJbdDLyYIi1D$ol2fGgC z-)HO>L-oU750|d^;cwX`9e|%z!bq?9;Z$yXpAIo0|gRc3ZkLg76$*X>xjqeDj-p^Xs|1!K{-QW5r*(L7|oAKmdnJJN5m;d)q z&aCJ=|4aJ?%KG7tg-fX)e)X!hhF#`|?+lkxKYYqADPsHCW@xzOhwl%UQa`*MF1_rB zpADB%Km2Fm(v~0oX1MgSA9mJ!w5cDyVwdhoKKY5)r_Mig+b@i4p(n5f*bWcvH?;K& z?>5a5ZT)c0E`_#!VJU0thu<15z3hiyWBeCA`r*6nQs~hy9A<6(@DU?-EQ=rhix{nv=!6|k*>8BxXOM(v~0oZn%{C;h)&0@OHm2ZDI*9^~3KBmr_4`$A=soFZA13dI+jc2T%P)K?w0+qR zPj83E{qQ5<(#wAMP$RVR!^gv=Ek8_5FThaz@P4}#hT<3geAdsJEeSYR#4WiEvorP&b zKXWdIhJNT{(uReR6i$6$jWDnm{Llvo$Gso==-BfMxBbiqh=zXXqtk|d<^x1SKa9tE zynn_=>SLKmHvG^B!nbXd3~QroSO}0An%zKXJ36lDvNEwx2jzSCZFG-S!h_Zqm|EoZ6>o z-am3G@H#ginr#e&QTKTKb8b5z^96oEb<Z{OFwZVLNLTn+>DTxe&UQw`t%bwB4qG>;;c*__Y-Go($Y^d4hJat zi5nBr(ofu+kUssy`Jc4(6E`WOrJsE6L&`^_rJuN2AuavHO$wQ&pEy&M$Nj|33VGa5 z+^~?Ae&VKuwDc1QHfkN`%3QiZhh|%5;m9$?Ly8S)%#= ziQT_HXcwkOWP_PV77BXAiR8JluBab+yO*r}y~*n*KYjAP@0|DxxBb%fOclxAFn;uD zYxXzn_a0;{NI!nzABBEi@I&V~_fc1|*A~@`(2rxJ%l!DEzhtu9Wq*9HIMfN%d-3B# zc5W!^>?gndqCP0NQyi4E^a1@s-CKgbizAViB}1@FJ_HBSTMTNaPCt6;^w-Wj`uZPF zOg((t?>gMx%;<5hh2MGHM*Y?dqWOl!nUueG%`9d*8u-}D8sv1EOedoiMQFwVtldq?um*|(|=1}GIheI`5iW!@@CS#H@##{ zkHlhcFtmn9U-83_giB-k`xIW{uW%TD;Xo(aY}!j+v|mWeTetnhM{pmAUbDX*8e6#& zp$mL(LH?ac&fi6=QsA9P{FTSTI7xn}uJ8JB`z;Y`bRX1g-5vemC>zIe6K2|>{Kb=3 z3s2sIWK+ozDLx-=M9*6%$qDbp$q>=+&%G0Oy_3IV!}sfV(?>K1e;k+Y=1Bp0@ztg4 zaB^zmq>tTyrQwenSp2v2X~xl$*V6D&Kt{RoTFsW3g-f3YC|CNT{Vi*0l^y!JpL~^#Q z;dj}^@3G(Vr;}f^mH4d;eP4NZalvptG1jt-H;lI`eeJ2c>TJAKX=fFT?#C=#@sI6y z3c~5sH@y9}pZ|~H`arIaPjKSo8S{e8*{{6pd+p@^VeU=f>@2Fh|K~pU_DyGlBtQr; zU?2(L3JJ2QNZfGO?oOwtn{24VxNBI#PMR5U#BC%d=ebqqc5XBCnfKpH>eR1Jopb8cspY9>xum8AZje02VtliL z?{11rb+?KSs&!w8R{r8y4@lW0pL3SQ3EBLdbD2iBhfqsuvJFMwVx6Tk=Q4%WZTgZv ziM=wOlx~Dvt&m9gc*zC%!Fog}NA7zyQn`#2D80}Vs8*Fyx2fu-QS~@vL-oyu>hWCl zc&<8|zr}#EHsZUgzNPAii^pGBtacA#g1k36VAnO%IADo7pk@cDT{Du}S2L$()+Jn~ za{MSW_BGSBxq)iACitbm>QALDR*BFWFu!-*ugEEEg8~iQaGm)0Q|a?FfgZ-WE@5Z_~%J*S~679xv^r ztf5UPrlO=s|EE7qXYK({?F3KTEHGt^k%f6e~*erQbpEvfN$P!wa)J}?TVJ|#o-lsB0)UHC}=+;I7XmA)c?-$B>ti9 zoMP>cV)fb;Sx?1+)ZAE5iw=}LP%cCW)>tNUDbqZub1ZZb?+k8%JS##I9NRx#S2Q&-rTFySsu`yKhp8m^5#R8tvZQ%Yi-G3r{y z(K>vdt!dv=>!LVWSstP3kPOY^)>LF47vZxVO!f?ghl}C$@&==nG`y-Lyci*md8AD3 zXenlxmdaS1^Kcy}+{fv;sWYjC{Wr059-}Oe)6`9MCoZqZjw&n@4kSX2&1qR64kmk+ zeS%6oPgA*UUUY2g1j)O}242)RETOt#NwcQu8tR&^8Jde$Qe(nx4^c?!eV;a?J%lev zO_l9}o?Nd^F{R0tsw~^>PG@MS+nqDVEBlx}xIyZC4o&K|XV9eX2@7aa_hdXYX<0nP zz>YVt6C!rI+Ef-NR?xqX*s&G#N4Sc}2SHiDbcP-_TEXNz(AM%RRhU~yWgk(If2ZQZ zGKT$`VKyquC}SpF5>)d4SL%fkccNtqhvXTSINgt*;d`jyNsc~;)wxg~BZy_4^oLN0 ze2t1Wqe=GHZUo4RjkRx4t4q111&z7#nG2+zqf!NeJTEG`c)B7}H%K=xqD}vXi^($r zd8VfONq?NpTW!Y~C+$Tm+Vpm{(>JSRW1y+o)^N0UJ?(3<&esf%?C({zJtp$}n;QQd zO=XU{b8RfIiJa4otGYZ;IhWZMnJmr-6-Z6Cd6{*V&Ya5>Ru()d@ndzD`Lc3Rd`^qM zuIUmPPT^I>o$nj!9XqHF6XI{zWaQzn~(63!IR%FI6F_Gg4de%r((7qmVdDK9usJ3U__A z=7Yq8PIR0t#SOjQYv$6Z>4vxQD;!JUfYS(K2OQ%GA8?E%g202Z6xJ#jgx}S1*)M=| zPAiylE>mrL2(_dp+q}#=OJ~ky3X{3F!@RJ%xv;!aGo)s1x7T`z#rU@hR!xyvuy>~Q z`uO#lTK8aD8JB5FdkA5qCR^D-7pbK)=dy)qi_!-iWy8dA(l^csJOXjj$U}Jor4QH{ zJ1vgJQyraRr#t|Mn(wHZfTo%PnkoyZHX%!H(1+4Lqp6&#LtectaLe__71OCM;Y$^H zzEpu*_W48C8&t5o!vXopsO#M6ip+h_2sPWqrPI*`c-n)xRU1;PL<#yy!?q4<-XB%( z+PgCqC~exiGZpDUgjwlF)S2InP91^#%Uatt(`4}U{9>(p2GDI`R#%v^GM=E1K-Qr( zW!RSA|B8ovGLV}cQWRLaTFr9T+D}n>i>9(UhWzsgjYB?5A@?|5*tLf(`xWyjd69C+ zcB@s9*;z}vL&@)H>TKwo5&Sw&Q+G%FV!2;I{!qn-MXTVeS``RE<4WWMMN-1xA#&;x zT#P@R=G39q>4OU({D=n$S~p2U&rvJoJ8~F~c><+&36vYO)-Wi)<<=I1!e4IAvC*7b z_hhbnGS@wrGyKfuclWrY*OEH4)*GQUN@x)naxO|B+!JGD1hP0I2$xuzuE^k92~^1a zBAE0>W8d2$ETOd z-E>N^-EmE4T$Iv`WpXL7_NY|`C$0O6I;KBoZG520f~V+@eR@F5MUrYQW$J3`F5l!p zob3J)_9y6Mk5<^7pv!$psQ`k~c~UaHXivvJT}KYw#_4(|wgVH*cF5SCGvgZq7pbY{ z*}V6{oGE4592>jcovxETM`4LqNQ9agx)Roip3Tdl&hAQXjJK6Gn z`Xq`QX-jB$v9e(>)eVDl9j2?=Lx?9e*@os)Oe$71?DS-N2;Y#JvO={h|2(80(p2sv zKz>;v@!i#bMrPHSf#1EbYJa7rD3EzWlsOKG7?F9cDbxN=aV_($QRXP*N;OGdVTNp4 z+3yu*to)}aaSXCy<&CD5_WQ?w#9`5(k+zZtMQC&IU;gjN@d4YVsq_ToT@l&<`BQ~L zKahLDBZCZkpXZ{um_f}QwHgF&tpz?)$(eNYXh59X1f=pDmI}14=)~Z#OLI5g+wGQD z;M@2YYV6I?=n2SM6lxde$yQl2SR+w_G54J8CCTn(0HSgS=ZI&qwC^ zM?^lzZ$xM_IW&}PWm@e`?^#N41K`PVzgJ1Fewlj5RyuDarN(Pi5p-x^(Z z)^tUtcG+m_#31cWn#zGA15*@--3Kc9)Vrt)ZW<4;2?j?~mpkvW*UTnsPbApzBWB zmUq&&Aie%qy2keo-SAEIxr=+~+T|leDM|(%GSc}yYM4a)y;L&jkscb(2B!zp26?b< z4Akx{rZ!SUDnnPdw1aC({k1gBr=RPeM%!Lfw2zeT>4sW~1@ zZSi1ghzCULPF++k=X4bM)59Aoox z9h+{RL;u%w>UP-ol>UC4&Nu#&;y9g;U?r2YtC?Gwe{HZR7U(=%&&qmN8>6$dUhQ<6 z`GQU}U(s}^7}?$0J%{XV3h(dWsokx!%iXPUVdzkBhcYbbWf-z{0mn^dZY}(V1V+ z-m+Cv`Y+1WMDG}zl zHfE-$VYZ-Pgsjo7m(^uTcN0C#Ij1@2#5$d0RNz}Q?G(Finy$#bOHsLshkSPrV>;GC zbw=AAYGOd6(k2lNK(4np73;xN>P#(*Vli8;Xi}j9A@Z$is6dd|E?Tbedzz-z?cxnu z<71k}S1p@tj+PgzqA@tzTmEWwB&pe)Z~=0X#d?*3H)!hXr)@NamYu8AYEqM}Thhpe zFY+&!x))Dj{8H^l$lD^69Ts$By?uL8l>CEA`iQ1-L;r$`3~J`d-TVIUr6S_vD#CjA ztc;4_GQCq4sGQL|vMiKbz%WKV_~45?Y$#q)hE#!D5%M|SOkB?1%sxy+4NcyY;K-f6{p z=rB!b4ShVNCuHkPCSQKcC0$VkLMjWSK#(Ys$+;HWpfU}iv5EN}L<=JOxTV#>!nR8BjN3Is zYSwlUet^Yzp=D5`8J;YQ|6Ct1Ozh`gxATM-PYvd@T!-0^P8ac{CR=wN#iXu-lRr0u z{ce2#XJ>3X*25vD6-Ds?okSm_sXXzS7!mIj!n!%KjzDr?BuZ`^BJy8W2f>X)QyTUh zjd;#fQ@AWZ4?@K;sYroRfrk5<;!jkgpAn7U2>H?ojYGaxp@Ze-tel7K=^S=ev2L}r zt$W0(m3ulzR4`!U%E;*1`CLn*M%sh}rN(rT%FSEV=ThnsY9R*5&DT_eK)JZnn@(xc zBP#HW+8dCyj!n6aO}UOuO}UN^8$mSG;wE!(lexIbOk9W7lS)%lCYPr>YmMW%#>~ON z+Pt=eY<)EPhUlhkknf1l2wK=E8;_TYd7U%$>if2M6~6gZdT{zL@c?zR(Xy08{qUMc|7$X92uP@zIa=X~AH9n+i-%Y*DXVLOoRkKXgN1i64P>(S1 z)P74wS)5v>^&K`y-5$@O-1OYgoL01+p7V?!)25J`wcP@DuEqFi1^-P`yLOxQk(zAX zk`^?&%)a)JPp4>iy`k=K$WKLR6!P;CGA>9Ewa*A}W9wR#^lnY%l>35;3~FZnP!1w) zR1x+CNy=rqtSnGDqszkU_Z_{5^qF{jX$xfc;UU^&y9N2m2xTu}GAFt^!zyf96gv7; z$XY^6NrcNi6UaZSxgehxp;1VzarbejgRQ;)qVyvuuUm3N6ld%u@2mXlG(AL~n2^Uo z&XxBbE-Ux6{0|OFW>4#IYd{tUsO;l3jk5>9$+4i%C$Gv*tAp{RzOUb=7Ll3(;0ESq zi}76w(!+M`HoZVO4(vH+reuLcH(#;4u%b z*33i`+@zWRXo4I&a<9>}w7&^*6CpJ~pj5p;sd9l*)dCgC-_Za2w)Zzd?EQb!c6ak6 z)$Fj;?G8)*?y%JH4oe&_zp&>1h&XO^cZzf5k!N&s?HtflYCu!DEiRZ_<8zJAR(Ei0acglP%Q}=PJ&$(SbSs5zV|Aws}!fCE- z)Q)?SFr^I!Pn!&0%MFw*y=VC1OAn@U?LjHBpT0gQxJ=VHEdsnW7W7$Q3OS6vM}11_ z)jdTWOlsQT7MMS2?Hqt$uZb>t*(bm{(;tCj_ql^+Akgt!Bxxi2p z$Iaf8Zh<*hm0YN)e~pdIZUtvvU=VS+a@z|`%4K?_ENJwMjw|Fq`t90JN9oeyE>W71 z|NB#gOa8z^F8Mc;A}5;+onNZ}fgq77osCkqOBt} zYrB~KxYp`nJVI+TJJ_}5tTeO+6Z^T$#S6T+WH9fvVm)-2rnH9;PinFa&83*sJdplv z(kxR}t9Y6evjh-Pdwys-!p7ooVrp_s9);gz>cFRS<%hc9gnwo~?Oyjwvn^nRWHI*M1&wn1d zRpe~v=4?nGIV@1;Ybv1%`P&F>fNbA4aEE7z$?Z5gpvJ|4jFFZroI%a6YBdP_i(26G zl$=RNj|RlK=Z8{x4od|(ESTT(uUlbcffM_Co*{m&8hcwbdNbs=6p|mUp03DXjl>kj ztUo*`5(x513i+yJezPj_L6)ln4ub{|-{8ogvK%Nj?x*77%BD4jvcKqhlPsXSS z#z+r`nJ{FX%lzL9)F0PHS4}{EFuF>f9VYXW$Ty0s_SbNe=a(0*3{s!3sX)U=1n3)@ zx`(orETZp5pQgUR5yJJYBSXa>Xe!W2M+N8%O?RiGzM% z#MV{N81MK}>#ZwN-}l~f3}-U&&k~clICk|$NE+jJ7&Hg<9!&L{dy)1qib>1j$=UeM zxy;W-&W&L+nI}G|2!+( zEg6H`Zq>f`w!6+wn{5YxTMTLW(v_hrnzfl59R^J=8vDYs*s4O#(A2o330fNeiuc{$ zH#K^`tLad&#XYY}_6G_taPX$xt#jr1*xf^*Kh)9#8l@Bd0ouvkC569HrX|WG535EV z%GxWvF-3#tbmUNmrxw?8V4>((6|-N1r7fm_k2lLl!;{CZ9Go!p^~C`9WU?!#TQAh1 zWSBq^>sJrUgnOp8q=>Fetqd+`{98UsUH1h|%@HUSBI8?>QFg|Vjk@`BoMnNED`ryB zi3%=Owz61XH7xaH&Sl!$=^}*GWGhNcYP2A~0~(Bg_0@IzAwLkIO^_dnka>-Tu(#E0 zkk=|SSKjCk-wLi$FSs@PP0IFRP20sq7gS`>K2M$->HnlABG70bjHO(rC(9v(ka~Mk z!^;B8_T}($`N~k4aU+uwp9oPIuo=_YP?Yufs4(lyoXJ$!YClM2 zkQ&B!3KU_LtW~evSmb{lf#Ag}gE=VIVcOdrMm(v>HoSmhQgiJ{oo&i$#VL^W$oL*{ z&Sc6e%J=FtTFc71t{WA;Ntq3WIg_cd)qb(cAT=D(DNuw}(!U4&S>C-x&S{vIGnuA! zhtW!EvJEewnAA{N7P()yr1s}brb2(YUL2#>e!q;@fLkFCjMv5EM=HtXq47!E@5oGaz_nSc7hGyAOh{6mRJc*yi?dmzip>(z)EWd*Om`cbVS&$~nZYlJ2t?~0Id z!x2$m>d)jBx6f+v=QZ`OA&^1AJo)}d|HTavUr`bE;+Arm9xV%0&giV6=y+ObN}ChA z@%_=Xe4~?dnZi06*Z89E*km z_wP+B16^wwKUqaRH;NpCtQC)6mnj}c@v5lU9EC;kMpcT@GPPcPy4Zn$$EpDE7wT~m z$4lVB^z>gt`tCl`J#I+%cq%vKQ|Z1BQ^P%&%AKLN5qkZ~phQM3Dqw) zbr+7Qi4H>`esx$dp#HZrr|z$JsV#1NQWs;aF>BTBaSfGC*L1}Q95Y+ZR^7ohmmTzx zng+T9+3%`L7&L@t>TdAbv4QF%W5$3TM20swHDcga2;=RgQ9FM~SYDcz@2#d@kocu` zV=`E;!bRb5en&#c9p~IcFc$^4N?vWUWq=-lt@+ z$hefrRanEaI~VyYRlYR^1yXo{Gs*63wf#Kw#2+K#%6k>8uhH&-ewD%G%V-UtdJNjpZ82{6DT)i zQ&X;^LpY$J7B`uTo6N=K`=<`=A~kkmPA`2^YaGutW^N1CQulq)9}|!ti_i$-8V?LO z#p&NOb%A3&l;Ouy04K+1EwaTpNO?|HcbvM9i*?5#pQMo7L*AZU3ps&jW#T3gN8LUH zII%$v>uRBTX$({8uqe`$>`BfD%0mR?elAE~_*3`KAQkx`s zfrjVJn#w*3l8DV-tVoT{7*hK)hO{XeLv3K7$`V6=qlTITp_I#X7->eMMbzD=x=!@V zJ7-eYjmqAtY}N%%&Sl!(=^}*GWGhNcqBS;~_ZzJ5uX`8r+Y#CX`TYo)iwwfP7}>@l z|3#r0E?M1r`Eg~tLsOYwFQ~|%edasFh(M!t;Z{aPaG5SDhbSiX_GF<~VA;$L?=IHy z#`v?g8yS;nS+Nj~Q^ ze33JmrgewWN@}tVFQAyzP+4}coOB>2Q(@Tu{aD?`LVmB8SC(++O@!`M;q@y7AgGhO zP?yG)>2q;2At0GQDp<>4?mZ@MGlZQC+l-n$?cUICX813uc=tL2H2W6`A#@?uerqAE zsBbN}ZTZUiaVpKQOJK+=wP|SC@-TgkuS8IRV+PFk_Q~!DwZBl z!O&5g4wUmJ$8~NGSK65&e_N(^Jk{%dgiQ2iYK-yYWFGs(Ao*#UN+>{n@JXRa-s8V< zI*``CNZ1f1j6=RgCCC%ykgrq7y;m?^k-M&DghYE_v=j#{S3ipSJyGfwNEAA$qfz~P zYevYX`hH)DcLwC@$58+3D0Ks5Q~g*}|Mr>@vZ>zwp!|>2-7kriw;}xlHI(|TU3@_6 zeN$6&%9LvDcF|HfE26xukjE$_zaG%4$ULj&OZCc`ffmBlPj4wNnJeqEC~qSqs^oHb zI_iB)&6nyeJMAIFk$TMtA~nrvwHK*qQk$(fLfMdJ?R8oimnlqs>sEW_jhb4sP@|pq z+$Us~uL!A(V939Y&<4mW6bkS4klPg*H$uKSLK`68+Ece-f+uB1UtmjDIi;KS7O4^s zrnN)bB7vzT(3Npz(`S{3~ zs&UN@f3s8c4pY&m9};AVMYk%sPu=K6qI+Ef!;$B(RG{@*hul7uZ37ZjTD$JIWmXMG zD;OP~IaOE3UaGKD?6|SaG}fX#G&RMwd`}WKa#8k|X9} zTm~%}ESP!FB4V!EYY*C#%k)%PpmIis7R6)L+)bKV7br5a=j(W8T+0bW9@68!d(wZ( zgS77bHJu}eB=i3Cr{!^^F@j^kDQXO(WnQuC!_#|8UnvzYzK1^C zdEkS{Xta>(#<7c~-FHZ;+U%uHx7EQrq@HnyHiXoyEh}w#sKvNbK|0HRx@aXe*}C&6CN)(OytH5-CR1Un_*-=vJH>t*x17@ySW0BvGd~2{hZcrZ zE|Na1Z>h~=W0o(xInJ9Qo%KUs9*oTpE3vPo41G_7B>F40b=wlS5L%EDly#ai8!?+RnF?F&2dE5Et8SXvOj_R)G?t*d;+1I#*8(r35=3r%tU)0%!d%VP@!dd&u`Kh`P7Lz}hJ&8pc(F9DE4+e>L}bjq8Bc z+5*LCeX7$BH=2r9{S^%vv~pTco>(?7f9livRH5u%-&e*4qC}3<1SLlrPV1!ro%C^F zPrEswR?DwX!baxOt<%DYT-pL|$tVh>;I96@OXZqAa$WLU?cf#KiSg_S;D}hz?{rU2 z>%XMUBlYUmYJ`%SHiXmq+qHfV>qE8vl%~Eu4ZBuuGdiKtDv&jCcyn_r<07SJItvF?VY=jdT-_~+gKUxd&&yASR2sP z+<>MrV9S-YClxACD$!V>+<5+_I&G;=#xbM-R>XpS<5^DY&(k4C>b?C{1xf8Lkkk4X zTa4dPaJbpknM2w%lhjnwEotT>wKX=I7Z2<2)H7juB6mL(AcGciZG=Wr``n;K9uA$o zhh3P?RV52!1LU-x3>M5hXc2LUim(T5%4K>=_FpPwMu!%~nd-!gH8qZSWS>+%Ks%Xn zEvILBNcTCdKVIuTQPX%Rj|4_=EZCyPyiC)5oz|n_t*Sv5-H*Ij`UC|pR5{>j6iEM- zsfq^iwca;Np^CH0Jds|_JFYrE6>Q!K_eDM)9TwaWsx)4YD($vF*2 zd4P8Y4DCR=wN#iXW6f|nKy#AGUL6(3Tku~Y1~amzVPf$q$G<-8DRx9MrLT+)0) z$?w%r8jMy=clMoD?RQ#_)>~DDyA;do=D#B2j*HW}gIR3V9MocWT7RVa35%s0Q-h73 zm5TC5-G{1-`f3a0^;#lFuyRe63aX`^Z7B=bdYzZ*>_onuGl}a)trsYpbyk{lnYMMh2q87u ziV~A%Y-wl_tS?vdLa31YprUdj1^Lkkjix?vdE~vVW`n#|p?#d8R?7AkP5l`v8MM!Q zT8{`c+PjIA%XDU0pmIiMc1nu>T0_y4R+Nv{V%UtczTqhAl$m7BD^R&NddfVlhwT^2 zW<}tFs1q*J{!W)-Qj@JHF=@sYxOnMk6OYtXE(IVT93eB(P_e9LgS?MI`-rq9%65>Z zKGMjbedg18M4-`*w3N$qT3MiSW~Y^pS950wp(0~4RTkxoGg%|9SDJrAQPz3NY{YEN zWGZa6H>nI#qnM~8V!)PTn*@hQTOlqhsi`=iqX?@CM zDx}#X_Y2fcO=W)q`H}~OBJm~UYZVHI#N;l~qbbAb9HYwbl*~%eOHD;Te_*ue*GleF zH+qriHg6b?Jcp$M9fp%g!}IM(#3^oLhQybsSq{r38ei9QqWx(-Qt|%G9f9uNjzGI~ zM5^5An|`gS{e!$g{S#VpruH;8%K3ll9)WTL`=0+J5Z6dR-_s&<(EUU2h`-SC*%-JR zA?Ikn$d$!CVVg^zdjFF#H0_O=hEDucGQh|5TxDg0C$zjdCg{C@M+Ap}!QMlSm2dY2OBv7L&S` z|D(F^JDSFmB7lF31^v$AJ3C_V^Tuo>?S4KMj6IemYI!ynPsgeh2>Zb}a zSTOTcfryh;ggsTHT&A1K0+lm*vnbZ+IDA-K(K8>pqx>If4>OkKXf2QDK1ccgsdeY+ zJP=Rpk-)%>1&69J43&Ky<)h)5szGM8H}8@@LBWGn9=MO8#y`@3Wh$f5LaN*6iCInG zA*pJ!m)uc4dPzOwMr{bGS=$}u|3Q7*!?;yz(^+QivcT;$ub+2vPQwv7lc}}SMJuVv z)}2Q&si~6Sr3C{qnF?FQ4s{y)zkVxY&S?s47wi{*97k66VwIaWKBvWB*K~=z4;enn zd-3~*y7EH}$1SfYL)1aV#n;I%*`{obi1wrt|F%T@p(6hHHKFFJ_qEoozF2-4Vi;MO zrjAgrld2+zKP%4|o z1C>0ah6btWu4mJ#4omC0Gk3JUcWx;C@6;X4Vt319skRlZ67H$N#t3jxP}jY`%J3JM zWd2$~`FLU~(DQ{x*8jRA4~#*EFz#&`wf6@7b>*TR>(WC~H@_%wentr`4i|8#mVh=i z1hTb9dxzTQy^Xcn_UmfLz)+O6Rhf;L&6!Mvt@fi; z2B~og+$m5*3uSNi$E(umSMoWhVOq{)n${ggE2+sgyntd-LuFayel_lDq)ev5cJW?y zS!2tS`ogWbKUcQjYg%tCcf^e)Wr#Yc*immRYc@;#7ZUN=#&So`#xm8kGHB}ASoYRP zmAdcL(R8HAiVjH=#A(;nw`5d^8_;Q8-EOA!<=Kut+s)J#9Wyussn zgSS`>9^lU*qi5IIm{wvD?YD+~JR$!iT?4YJ0w|sYK$Lx;LOpWfT3vEQGf{ z`EfzO8JbE($TJm^Z?8^QM`#m|(NxYi<%6u6IayOt0m-Cq3<+a5?`)tc{Tj68`Pv|& zu~kgbpm#@KO+jM4JaTcRHsmLpD=o` z{QO%iCU6$T!)G`sp(mWsi?kJ_3yWPhP1iz!nLS;V4cZ?x++k_QIE<##9S%$TAvZF# zzwz(zu+J>g{w0-N9wb3NT&&$*$cM6zh++Q_tt2HoLP=^=U8kYalhP$!Jl0Y#$;Im1 z-z23p7Yo1#ks;s9zG*rY;K9La%U&U`Enr%ENTy)ye~pHYpSymg8B%jXb5rn}Eymv~ zND!H|;B~jX4M0lYHt_2)wt_5jW^a))=s0D2P?A-kCCf|5nB-k zK8TF6I5iqeeTNNF*9SqW+>VUlR_r7?%QG(2rjVMo!{b>uYbW=xF46iA)6~~zW@J`0 zg_a#GCpFo+C0?oH$cTil_ZO^hP-{Z3le<|_IRJsYHA2}LVt4S^aI4!pRMNXN^}oMP z1~v1F9W#7}2oX1^2>W0*eO27>&GLSY6Xci{e!5%OfW4#{6&BzNlKfQm%O4GIND za%b0!kjE?ubps>0&5DXd$b*+Q8Oa^4s4zmlWm%Jv+`AMNM#z6qNJe?9BC~vXvo^UW zDk`-hpQeznO=fpbZF2kTFQ7njKUQ{%_uu<7rpQ#{S0XyeG%gp7eZlKTJXwCK6o&@*P}xw@~OrheK+ zpvVCyJ`2D*D5lXB04JgxN1WN0MJHro#_EN3s^K@6h5 z&0#1zSlJV$LPMmcQUjWb?HAR~{Ao23?~4O){qth1Zv2SGDE<^KSGoBovxN%)f7su| zQE+wbjb9CsskKg`^$AhyB;=?cOL z8Z8g%Ojl%T4@{;pVK~J-8l3xBy7{s$?ZtQxrdmAM^roZb!opqD%Ku$x5EzUse_ct2 zu_gC~AurW_a8DJjT~m>zn}jnBDuIY7hKpB1hUgW()YNcyV@@;@BU}$b*P1t`njIUe z(c-XFja#Wt&|W1z#2UQ$sW`)C2A0JGwcg2^%30B;-;pVBn}L+m=AW{#ewcRn_Nm{Fik!AVedIe_Io*S*bTxCett$1guMDjVOeawdq$TQW>UkDqi z$+jf3&eEB4nZo=mVl=D?{p`Sy8$KwcZk#Y#{Za>j!=R5j1irNu^dlm+u7Z9_#Ez?= zH%IIt74-8Wc6y8TtR<0Vh^pLKNYcuRnXsz*uyL6 zpG54G3c95mfwFi+1$|J&POYH1RJR^L4}G&j2Pm_;+aP{Wd*s!zN7lw3sU_x*;)IRl zP{BqP*|HmatcpamKuG_PY7uBi_lk$~-!pcKIZ^)8baU%NkGdQtnDIDN3}>~&CL^tG zZ$11@!5_@dEgqrT>sC(C%1gAh@^C5S%N1%D=S^2+YHv*B-k89o+8YziapP&wOkrqc`#zv{tDLWlyBXtYL zw61`p{VzP-9_VmARYii#1#A;&qd;^Gm&5|G(4s~lE;v8me-a53m8IBUB&Mo8m@4;R zs@{XC0Uk`9E8P+%;704$)Mv|(IKav+x?pMfI$eHVq5dZW;e#_Lszn8>@-{SDq54aNjHUdMp%#Q+$^UkhWfj;6|`V$`X`{5SzO zhRl_E%dKW!p!VhSwT#Kn9Z+EpT^i8TBLPjV3MgZpxjUe>1wB;x4DF`(YbxBY>{jId zQBk?{guF>1_k3em+Ml+3-RcYE(L}=>5!ItkGXAu%_&+M;51Pg(q5WUd{)h!X(SRe>O1ZzYWa!^}#s%`lmfapOac!o}A0P z7-*Hx*B-n^Qt|n+>6|)e!fF0L}PH!wDGO)}cLUU2kAo*|geCI%R=Q=2n>( zm{>7eAgo~ZF=h{2T$n*pi2+T8+Ov%i+7eZcGfn(80AtudihmfUIMGW2#)ZQq|VKa<)cLr2CTYOnJ(DIeol#RKT{H8;z z7*^jN6Ma0EniBGOer04Ffm{`#2}t_KpK+xEJMj`BlyL2IMVvT~t#&K@?Sli4yYPX2 zLOcpyTS0SC>G;x1N{6KvlnzU`m=3#5FF3ixbXaab$OqKQW7Nt;#Rc-RUHIVBy4CWE zeYE*}wK?a&+GpyaZO(!1>(#cLBego`z~Vgpl(ykWZG(JL0jFN6Mhk?MT&4?zSr3V) zE2m?}cWNkA=nkQpe{}R!YDQOX*Gv~HD)M(JF4roM|BnmYl$ZtM^U69^4~a5}Ld5Kbp# z1;QFqH_bjvn@p$rD^E1gtsbNnsZ~3y{Au<6`+-!ubZ1)GxEk%F`S(NF7#GcgVlio- z`d4(V`hrrAv`_uZ&H92;kF-zy%gp+MQjgTCZx2Rlr0G{R=6)SxZw!(F-!3jXJI;>` zW)Bis3}+9f8d@E6kji7-DO1S*L5*O*`e-AfIqLHunu%#ME^VP922-g4O~u;rYRi@I zOoa-RN;HDl7ALCr4n?=q_<*KD0~+L{|E4|_UKt3fr2#eM8iS^HYUqU9T7h@-8>iIdLFR zZyj=UH-q5@YKTX|s=O|sgu}My7)20c8L8NUxV=W3yoEv2xS3&O=v2_*n z0~M2L1Haa)$8y!#@WL+kI1 z&pE8ioRxE#!a7}qk(z8}2VJDr=}yjN3M=F%25#1tl6uCY^tm=tv$k{I*R*yI(R90}vJ~H~ z!{-w@FpU_mGL-bDST21H6YpL7a zdrt1H)RPr_gjM(~1$S#I!rr6ghc$KIcag6alf9+p?CRTF^EH*qiT6mWV#|V9r-prOg;07=%J}QlzhJ26m@^HggsiV-W9Ds9rASwwTla< zD>Cnhd{eZNrinDjx|P{eCasQs_Pro#?e9`wTgk%y2z&B-0*3DXGC! zcCd)l(wB1?qTD1ss?Hvd{vUs@lB7mWH^)39XS-3Mx-+vjx|gP3rw#vmO+^6%k<`-J zd7JXjz%;j@@JGtruitV`>*2+m%dl+zLX?skOiMD$EPXkbAby;A z)O7PlCuiHFP(AZ!^GB;QrgJ-MUq8p@oYrS1axTN%_7F-*4W_b#MWmL#oXZeZ$S=g4 zqrM;&wr?s#YSeU&eR0nAeT9Casa3Ohmpb-?n)Y>U#%XQWS{aw2v^|7UQj4izPlIKa zzIMiCh;oi?>&A;z*v?dl)TrqkyMNC1JcV{>YSb)?3$*ZZP5U`E=d>D{a~VqIH+EGS zslikhY(}xn)|YY_qTF=Kj`r5t7mGENNR66uJgEFLF%?Ty(u#csXUb_!Z>>z8VOe_! zQKS}A!R{T)EPd^a%Mhg-7D?`Ta-fHw5>mN=2e~Lh8z2vk&^Y8Wg~BU*Y}hI~bYHbA~sq0l^XAFUZ7 zKi$Jf?k6>4(}tYJs%OUvv|ZY zGfd*16#+iu(2&YlfV?e26OeZ(II{MslYehLQ=$r$nf)OF|tCorucD zA-@%&Es&Vz3>`NN-C`L!Ugd^v$qmi6iNV17Urc>|v}+Xd_6Ti;Y??Z1n7Y|Abu^kf z9340ciOKQ}Zphlr*+aIq-Mx<95ltO~{BDG{K{l-)GpyfcSwCi2KbBj+Ew?^9Zf{zT z-!WJ2Jwv`!EtlIMH%*hFw_T7-8YWGqCI!aas_Yhbu<8M-^y|@W8*tapY6vUpF51v+ zRFi(N);cNH9)bK$gtnsN*EN*u$nNO0iiOIL+1B17=aLDdX<{#ZsEWjJS<)eyWezWP zd|vJ_46j^0yz{@bFkG03`RcHSAZ+^TgJM-}6chbS~8kKdfMrXqWv znzLVn1($25qIj1IzfRMxKWkr6k^f*ccm%Tc(Ih_lQq2XqFxoH)iPiF0&-%0Fu^#gG zS6279kHg8=p2=1cXZl^L^hZ(oM#!HiG+bPyPgAFUXmz@1C6(~7zGBuYj!}*iH1!{{ zNd>w)9Q+Lz$3801Cu%A)>^qcvkEX-!Zo*0KX2Js>9he`gshdwuQ~GI|x|bYJTwamg ztgy@zXDa#p8ahwOD>R)i_a@`53ydTcS9W(jGUWcKsay*m`z3)EsI4>yoVuj0JCN}S zl~KCScxwFvG<8_|Cv`LZGJ2_sYU9#Oo=EJVb&qNlwqGepYSeV+25-sPeyh-2HP@=y zp)DBJ*C!dLA+9}yI8uYD?4XO(U~<>`BWm}C+J2&r)Tr6&Y*zjmnC2eXDkvtU<%HXX z8gAfePg^ovtf%#@_0*~>ZAq&d&08YBg^0zZgKD+v4yJYf!uAl_NEi~wOL#!nLO+HAQ9xjfy7l)lES5AO9ArxK^3R7uCvHr|}ouR4W>(&rV zq}J;dIhP@-Ey@rwq8b;(4w38H3beK-8@HXzo>;yWFRa(6 zYWBpZYc@h25kFcy0l7vYH<~wA8VTZ&BMVS!(FwZ7S&PpcN7sPU2`qu9lc}U1$&zpBx)A2Knp=jX)yKDH+T9 zvTXTZ`3e8}XUmX&pnBWQG0>#$;T-70V@GYkm2YZPg(h{kkD+gLZhEj@{1AL zkh;j4|LRU3QD^WCZCTbJu~e@AApa$**$jy~;ey1QBCA%^OKn%R@7L6gcIdB0Y;6U7 zXT;W3(1)rq)@IF3Ve%Kg*XaL6W zrX`LKx^7kenI89kG5@270ziw)lzrWH{WI|pQ?;LM{e7fH6^$*LFIafh9P&ZcOR;#g|l?)%? zm#_Tf!9ovsRj0##k>L)_Mj+q6!JxCyX<=*X+W6V$e~aeA#2@z z<~zP;d`#3k28j&u&J{*uvR&Vhe0lRLDrS-P%WyHdyS2MDwY%hw_~W!Si;7E%UDr(S zX|1S~BlU9`fyb*er|lWqfEPsPZ_b7Fou-22f3IeLNmF^q zHT92dv2oRdV<=C(N67=C@~PB)QV~xQ<03vcF*~>QGn~w9!KSi!ks5b}rfx=sz9C}g z7tlXbY+-S6(Z2dQVFa(JfPbOIi=_CH;)n(Z9%Y=C#rXwv-GmJ^;m5J<8-AuFU1xL| zv68l?T?}6qn{&VD;msKH=Mfr#M2m#|wLEqlBT?4}J)o|`gobpAc}1%tHyqn=I?bXj zfsx!Vl~I02!=Lk#AJ+NAoqW6VU-AnTcbx^jRIwnL9IcVt0kIKE1fSsvZ1x@_Q}@eO z8c++&uA!VSL-(iM;GPm9sOmW1nCfg-se?K_5f;#nGm(uLPdW6Sy4)dF5M zO)KhIpzquqyIj725j?j|Q&|BaQ6j>xjv7yj!8HN-@Cc1QR>|kZAeo?{pQ|By_dxAk zxrEHSb|P(#HzV!u(2yA#@gJ(z*G4fOGDYeqW`id6$}!RTbN^J4Sy#IZ^7sgiLOv!! zBan2d%y(GAn$|8vLE1AI?? z4${1zxX9>RqH=vU0(qkH$(#pyYJ^50AF0rS;;ealO7|r}_izHJ9=|!Ukfdets0x}* zf&1zh^tmdyEY?@he-p7&E9mz`>=708CnI)B1^u0fJ-mYcb;KT4K`#mmlzh48p%wJ~ zBX)8H{g{ZIR6%cz*ohVN1ra-;f__cJj<2Avi`YXd=ub!NxC;8th{;)k(*G5)wH5Tq z8aQrqHmUTpG?ngvBogH_T3^vpV%^nL2Q?E}orVgeBUx4_$XzOCVR24#YYx0eix)|; zoW?e`=8OVHyR9G1pN(xXPU>NzNyeML`^mjP{cE53n+g%`n5!-8#b!B2D)ED=S1(-&}66qh`u3Fy};LVH%bvfWo(nQe#4X zky~};?~$6yx&!%y2u(rmP$(SbgqrEUNIWf8ABTKFgf>7nCH7mNkcbs>(hPZSl(-eL zDKTHPg0)Co8LN*$o*khrkWGpCNpr7643h_YAh$<}n<1MLC(S4iQV-Rt7&ostdv6&& zNL7Iyr9AVBOJf<>u~GF1B#mmagJIS}cci{5N=ti~JQmQ<{c8)(E)H9_x}tz)HyAGQ z3>09%(prK%Q5qWR1W}HGhx8cO!-{de>B;JdvFMNqNNgCAN#nTH6h~NaDPdi60u#Z4uq)()Y_cqun0o$BmHP*n|y`a}=6sSRSjAPOT+E-Ws6| zke^p*CW*AZDA*~<4NbZ+4Bjm4o7|GpdJT?Y$g+ie* zR}`|e`9PlD}ctUJb=cn02;6I02;RfXuQe;Xxs{* z@hT6XaVvnvt2}_ltpFOY@&FpQ0%*L-18Cd|pz$gXpm8gJ#;ZJl#;pJvukrxe=giqZ za45+GXw(XzQ6qpxtpFM|0%+6HO}X1Pez7n>uWYhrZUGyXMD0|gJdFeY;@2MYc@!xF~>%yEs0lA z8z7m)92*_^(3%aBDa^6axzDKCAeq1%8y)`gnhlca%drszAE?-}$;9Q@2%yC^8zf7ku+{G(&OVYFH3+JQYA1>0WzbKG9XA2l2&zQ{)j2gA zWFx2+5maxe*&rK1wTPhl=b8<&5mbu^svp&Ckd2^PL{J?Ndt?H#5mbu^s)yBVkd2^P zL{L4mW`k@5)gprG6*U`VBd8V;R3EI_AR9roh@kp*%?8;Bszn49=MZ@o}$6g6eqfBnhgO&`*gSw;8e#RLcme9W@(dBdC@URBx==AR9rojG+2d z%?8;Bs$~S#Pii*EMo=vys1AxfvKjI|3c2A!P@Ph~W`ZF~fB+=p6pnq1gK@uH~4f^2d<}Hv!hhu|2wPu4P zIvgAHvuZX-qQkL4zq)3FBsv@$^bIu|B+=p6pzo;JAc+pg20bT+z!pfN!?8gxt=S+O zk)rSP_jG;C=!<3YEXGF2hv|G34o@RzO}NLH!e32++{<(+0*i6To$)@-X2>5zXaw@O z_{`kqhbsB12#r8KH$JAd8S-cGp~Vf5$JUShLw-$uoYMWt(_z={B=cJZy$b5YF)`Q;`bndj*9JR%SBQTjlm+|P$ROChg<%!g_|$eWvdWPVulK^_o) z4p3T4=0UnA61|Z7Esm{)+!mqDkk>|N1LVgdv>Ebq5!wLxqa}#n4EfCifi^&XUm@Rk zGDqs8OJXeKu?l%UGN;shkf&+jiOV716QRwJiw};5K#oOdGvv`aghUo3qsp5RWc2^{ zzFH*r-5}S-sGfi%;N3tSt;nHBp3>{Dpjq;OsB8@Ka}nAK`P(@5HbJ7%=^u;w>1%m* z2$H^*-+6$ntsLMw?#yV;B&7SwhWir_L!wPQe8o;O=o3CjRC~T4rT@POmvaY5L`(hm z8G5D+J@4DuU&CM}D3@t}5j6cEhFrOm&bUM;F%Od2S0kX+dd;=3t8(Yd;Q4%Zm}Kwp{y2Y)eM3q15c1@~T(y0HrtYPdOXQPEbwfVB(;vRQ| zX0zcL(@>D3_S}~N!7J}q26;jR5-B3`o=eFPP{IdEXL!C;kIPRhxJy&nPeL~9nsN17 zt@DOhcNDTwcduDjt7OU5iZGPK9>}AHLYa5tX*x4Lv7R9zal7Xm(OnuFIS(3B*Ht^& zud!M3oar{ngSo#q{%UcsjeU>jW5>fz#e?Y{#e?aV#Dm7nbyeoeR_sA~Lsm@n;r~GL zQcO=a4EWE6_6doN{39bfm+-b=}xqM%fUWPy{)<|<|`SU1L<{C9P<`RWWWdewt0 zMD(f$$*>>^xc5?HA=-N>YYsbX&q;ph5>*}~ z(+IJ>my%&0?K#P?llF?pu#@(jWEv5=_fj%Ms^=ube%i|&207VeBqhbs2xHONyljHnI;2pOb{2$j<9+H|r7nT%zXnY<+ul zTzps4yq>KO{=;t<^pz#_#Fq8MGe!474MQvo07!ANG zk1;=AFTw})C;UtggX)8y=_J=@_j@|y3|cRplm@MrPEmu_OJ}h`{gO^}gX&A?!a?;h zU2+aFXg&CuS&u9(8E72A&*VF3``|y}fG~#*YA5{X#(L>|X3rDwKTl6w2Gs}u<+0vi z`rv2Zb96TE%8yc-GgG=^4eHT!{Tj4hy2K6YnRFE#RA0JK4yrF*O9$1*a{D4Z;u^ds zsPQ$eIjE)Z-#u%Mv4)<#4XQES2ZY72D@VTishyOePd?o(++VJ4+g87#WfJ;iKV&Ax(lcXoECYwv6{r|a)*>ZWV(?5s{#;@N0U zSL4}fPS@nwXl7mJGI(~H(*YbYBv1f21Mz-~5*~lCcK~$8-8_mD9t*=YIB6ma*N#zMKQ%Kk9+8Z84>!ON!iJ%19RrPqZa8oTB-9K(Jq6 z8O1T+%e34!hEk3vRMD=F@7z7SYtOWE3`LxIA0Uc$T{bQMG?*yl+=posfjy&6D&uQ$950Ti)W z=@kIVW+e3iIGYsHkrc8gF|447BM?&#h3rmxO$BB5VTz!Tt%)5$l(HG=RRqe-J6i^& zY)X1%fO5oY%b@fR`-S-|3lIv}y%?UQh)s&EiBdKrrt>Id*I|pIloMW46k89r0VWfL ztoOD)O4$vVq9|nXHylL~2gkNHO4$h*f+%9aw*^tk!fu*PAuG5oic(f;Qxt_P$+jp; zS+Gq}6mrwc@WG(#@1K}rk+n1Y9khOE=fs^j4__SH=+<@oK4S4R{falH)c<$VQ z=gtjy?%aUq&JB3(+<@oK4S4R{fDh_iT#FxPvja{8c{X*^{+LbOw9jT!H|^Ki)J^+- zHg(hZm`&X@hGtVYjkDR*O=EF3b<=pAP2Du6XH)my#{HnDv1!Z?S}%?FLF=WlK4`r( z&IhfR#`vK1()b>zKdmG384t*M=9!w+9gK2nq zFpV7#rh(zXwAVeDcBu!`{_h`F!0>4(Fnk&c44;Mq!>6IZ@M$P8 zd>RT2pN0a%r=h^`X(&j2+V9!B)TiC>VEaj_OTkl*f~O7zPyGp=x)VJ0CV1*h@YI*! zsVl)#PlBh81W)~_r#C4aS5ejh_mp_*Lx-jQb6Dy-hoydVSn4x}rT%hQ>MMt(esWmq zBZsB_aaigbhouhCT|o+Ge(CyO`dFU%20Zl-cX=yiI~ z;z@ha;z_zjek92Lqt94#sooM({9U3Is_!^~y-QMShCFLH=idnq~BpyldkB z*&@T+)FC=`%wZ+6Zlg{B)GLW4a=9R}Jp0$dvk| zN4wZ@X+@@6gO^lfRw^hjj6$BQ(2(qV*FLx+dy2yDC%m9}!o^L$>4fH6&Mfnj`s)>Y zFC{}dM>_q)<>EYmpDXu}FQ~{K7{6jM1-UGK?c&1eiVP1|NSo4m%o~*kxbJm-2gRic z17Yz7EtnfO!dZ7WisDl&9aySQK| z_8I*nU^jNqUupG*tw68PB6+(S^3@UA0Le2+;>;U&(!+~lPY6h+?ukjGCyWmYMAzeU zhN4XS46S3LMWboV2^aR%sz+1R!j<%}d;39tmDg)`D^U7h4?Ct24lejHlT@Z6%q0#S z8#II5jU|GDQ7*5cLlPPy4U%EsF3v6E96+=PA0#t@@U`Q#KmZ9JWU0;+zD}Geh$-QN zWO5L`p^6MKCw!3148qsVrU~Jr$A~!R6=>p1JOD|kNliMIp)U~RVR2#@&-;2qPv=Rd zGbGP_#y|_D^eO3FKc64BMkXa7ezzh_-p8$}0O~%UqR;;_j`=A_x;$3L6Es!ke#qUi zQ)E^nQ@dgcSKO`hq*Tq@oqcDuCBMx1a&0$hV-9$oDt%*AE(1CBojakU?yFRm3@7Tm zMeDl#llAk2?&O1E^Cqp{EiNd|Esm-Pqn)|#cx-(xl&no=s@q9S;9B8xZX*O z<~xaOhG-QZ)OysH0JIEr*iV#|$D!RgPq*|AOSk9_OSjDq8&nU^d!@R-Q+?p6PVhnX z%1UtU&Qz%fQ;i->)p>AGU9)*aB{gX_byLe{Q#WnkZ0Zi`2XR`T4=$vZd(PA(4-TrU zF-@c{Z4{+?8%3%1M$w=)$TXAc7AVyzP^wFyL3POF9Bw40nqon!FBYU)V?jUNMX_3s z1D~R)Tr)$yL7{`>!#sOB3qJOa;}1LRQES$&)@$6%*3s-iIx1h|Y1b z862CqB|SCJVOYbtmBUii4$Jh+8B%YM&JaCA8S~<}TgQ=^hV~GWNoUZ|E_e^7IlHGu zyB($bJ3&pS4l`@&An?>l;Hjg)gOee}w3|DT_s`{E%#t*k_QLX)d<*BW1}e5+bBx4H;OVF5`Y+gyvF(>Id5CL`kZ@; z?h)bFa4Slf-u4R|a_7wdT5bhCsuEV3)1JtTHQ=1m8b|c0v7=!HyiBfZ`qc4j!1ic- z>dyhI;cF(}0js6`FkrQ$OWY@1{U3e9{3DkNX?q01R;FfwQac11R7YI;QcbZS)fWp= zt+620tzVZ*U|LJOtw|&C!s4(Chvlc!Z+EfT39IQ5S$MAM4NtAKqqkBTv&Z*|rWmuf zm^6@2>?5WT$hIJ&``J1oPU<75H@b0%46Nu5B)sC@NZQeqgak(1LuX@?yhPdTq%@fR zJFAC|9A-zUHG?~CyHHKSw3#QTQg^Y!1xYIB+^vcXccbO_7xE~rDog5@cak|x zL78K|yt6B(@c?J`6s%iO0bJfwaNLRt;4M7`4_Q$GyuGL3_!SkvhqXYym*`u`b2|x4U)87oZYI(j77e&MkfW*-9&Lz^Nieg zZQg;WGfYY4q6YGoc(QcSa7BifQ-zOFNv{b6`S9qQi&_<#O*L3nWGN=e*oWr~S7c~}@L@b1=fpuX@Fc)*iKCFtl)8|oX~)RG zlm~cLm2qIw$HEKA&{W=b9IJG_@Io?LmA4azFA*WUkPKku9f~8GKoMR@#;WpmD*%E? zcp<;v+qO9s0KF}32X+89FAyhA0p=L#+@Oc8|dv?BzMpu5xYi|EjhYd95B58m?g!rOP8!&e)Qa8?V6>lT1$`l z`JWC@Nrvh+zbO9WS~?_ae^D z&{|Nj>Q5+&whBsFl(6=H&&>Uqd7gXbJ$awt@4EiiKi8Er_k8D`nR}b%+2$>nx>w~) zc@$5K=vGm0rZC|{1{oJnH8GqaC}@1 zaF!Oh?E*Bf|G7EZzI@`<=7p2X^o>dnk|A9rG4G$=1ME<4_x`|z%WJY%Dl8KmMY%ZBqt=I_TCYhFKP^nd1UgHEeQb8(TIe{CQm>T5PpD?Av$84)@ITsCR>w6?w#4AZuhwS z9V#HHOc)nvoos;HK`VQWKK0&}1}pVQ7kE_O!wi3{)u&}ecGJnDYmhW#^1E|>r{V zwsN*bRXDXYei{ zi!$a@B6F*!tmf1rnkQYLn|{UX=S*7VIGELdhpQL|GzIelabQ^`4i;yc^eVnJx-pL7 zLLB5wg*eEW3UOeW7Kj7O+9?jGOuB%B7A=N}bo@A=2I&IbOjNw&&u3b0?adEEp{UJ^=q5zK?U<;6v}2f3DJSL8vq1*~r#WX0zT3=i_L1Xtl6ARp43P><<3w%a4K2S zV?C_LXabU+;0l|kXj1U^x^GzqL-Tx03OS|Go?Hk{x~Mv^R8Dq0FwK#Nq_!eQ9{!O2 z(oV5=3NKNn(t((ik-Bp#oti-lf5aq3q)VG;X0|vuWAXUF!5NjDt9Z>q!cxfjiX~w= zU2(I%AX(I!LehuHFGb0rnn|f}%%>dy#kTB#C^9iX?$o`V^%eM^X}Pfu@IPtsF(C%L zVZj)CF+Lc794S~7%nrRGlO2jhCWa=5?iHEr(9;7&TQFy+Gce>ul=Cl=)rWW{g1`wK zq5_;qU`hnHUIn*~1h;ksx26NP)&jQ%0&giVnelAmAF^gYmnz@AyVuKRa+?G^w@JWr zn*=2d4XXdbs7am?>D zjjJF0%*^BVXCr^ydN$_Atw*%;J3r&rgP-5|8P_iG^E*G|_6I+|^D}OL@Uuf0|JP{j zNFG;GJBG)t$LQr(aK@LE8vG8Z2GeSm)=V28a2?U?o; z1D1j3K|88EXorjk84tvZ2W=>L(E8bfIFTKq2kop`(%SOmGppR4vXf?CetfUaO(S4# z8UZm4bCa|PnXDyzxwQn$ttBAVVm9yskzuGyH;{~C&qszKDtwSl>(A%bm!5O$3yAd@ z5YGDZWQca(HyHxibCOBUlQykmO3q^uWHEEc^I5kz%zDLPI0X+l%sRkf*8UE|{FuvO z)>;m;#&Q_8LRp8|f8*#Xr|(%+1+tn7WEB<2>M4*_Qy{CQKvqeCtd0U%6$Lsv4Y%YP zZpk&=l54mn*KkX&;g(#(ExCqUat*iS8fNz!$MK=ufec^lSUqEb)ixGbonwL3JQi5} zV}Z3oEU>nS1=b?5z}h7i9F6~_a=1@luudo_SSJ(|tP=_f)(Hg#>x6=WbwWYGI-#Io zolsD)PAIU}DIM!$=emI&$7hWLZfyf@O#^N%18xliZtVhY%>r(%0&a~0Zfz2d?rEde zCh~9%b38+D_6dX~xWy+BM%WQQb-vu{FI-l2fvna7S%n3%x(Z~~6sWDs__=rJ{p8=& zRG!vAvQcqo$jPIpnmh~SKsGLNmQ1#H0moG7eplefUTj-vpFE2w?O0=iTZ@8YR<}j!&+hZ@Ut@mijx)2;cvb#wwfw0A)26=WlsRjsJ0cwmN z3T@8+M+0KLJ`->sr@OQL$bVAtW92cr{779mTn>;BIWdHYymk{=7*p5k7;M!CWWW{b z6IBerR((P%g-{Th5Za}0mY@uIo*cCrBffr8Z)Q`8JWrNdm2B{}3W-1>hZc#O^YoRJ zRwY2*NGjOG##gI8L3UR>&@b48JR#Mp1V~gNDS4u-RjD07RaHI$FmMrGM9fKYc!7N? zPN@8phDwQtaM%-{3+3%l#zeGCLbml_+?_f|=45WuW7YfMS0JYe2CkqcNb?egVZ|43>ae{Y!fh$Ab;p8rVnWp-ua&JfQYr zc|g0^fX9J6vkNU?86KDi)IKo}=+W4VhvuOLYcF+v3&vK&i)@Gp7M2o$h!mC%fe4fT zPwm}w23kufqr*co>~rN)h5NMp-{S6g1LWzt|B-i5vEX0D%Y+S(7}fvK z;H{JC=tVnoXAG#wGMzElxi({H=kdGn=^+}yK1+wuikPTabY^(}ogG`{zXaa0dSKl06zBTW1 ztF0;dg}>Ku71H}YTAi?375mx%i5UKNGzyXyLAmMSUZ74lgP*JWU(Zcui-Lh$zQh1v zcigLXLSCi3^1dD9&9Tkld`;%f5uBT^$s9`HTutWg1P*I5pHAT3n#`9J6mcM@bRRWU z&A9^_$u3sdy%!J7cFeu3W<$Z7gJ5`{Zo)lChE!hN7K{3iJb?a0`Gfi7D-D2qwLs*B z{Bmmh;5?bHr3MbpyDwn?zLOe&oQ&V5?to11or!1~MeU^dv1+@dBHXyDTO2Rg;sXT2 zq)`NPW%S54$TvjKUEiz8{8j=dYBHZlV815wKmsRgGPt#0T|X6lj6Ve&M2B)|){qrw zs4*cQ1wj5xgtkJm1r+DsHcv!+F?sE_c`}$^+JkI(;J}ljesf&@Fc4!1HcgAQPz^eu-?)RoNUHG?RiGW>;!Cvw|$1 zkVJvB2FZ*d-(63{>4CryK1e1B;p@j4gIEzh$h)<7;hT(;2;n1qkY7rCQ#BdFOZXs} zG^D*jHiHNs?jg9GRiFtau>d4dB{lIPgI^#>#<*0p5hYwL=SfCi990-^k}i_v(|_>_ zz#=l`3u?0K(lP@{K*$g{IFI`;Qp1UCka*woVUTNeNO{nT?7ky;oOVds7^$z(y01-b z}5r8FNdSx(^Zs#nB;o-RF(X*lTB=Om#6qrWm_!O z^*a)v=P%sCPit}7Pi)Bd6WM375(8R~`o--^&XkAF6ilRrmYS-+UOQ$R<_0|bFfKV9 z#)hBGt;6g#-(l=&*}^)^-dS>3QwB?0nRrXl$^~v^1Gn;lTN%NvoZwczWOZENXnwXF}DdFv0E zS?`#$X7-@9o(HW_JZN?GpjE+xO-U?mC2LIOR=!4&m9kM}Wo;B$i5o>$?naT7xS6-o z%OYZ>7RX8~kd;y(E1f`ADuJ54TiQw^7ZXQ#m~SPEHLQHGz)BeltgNxXN}17ZtE`CwKe33 zHmzAluvw!v?~GXUx_u`0#Yzsd#&8&#qmsj{2qJWPtQMVP$%H6HD)vjA@YlCjJt);rv9^amRIkjf;pw-@kRw)l!Sv@$u z2#pbC1!)vnaT-Nds78?$tx=Q-2oT3-8V{@#OXZ?!-RfcE$WlrkrDJ(zaSdtLf%hV< zbH<1|H^jqK;bbXVGopqcP3d4%*qLC?SzzT_x7t*;z8JGl{KV2VW;NJZ7CMP)17OTP zZE%cPjW}tfjgUz}b86gaTn33FWQ52qJAH!wpPI_eYe=qCJs%c*kv=IGK1i(P`K%R$ z&uZxT8ghHG7o}$nN6fh6LR9361;~aVvA_xw3#>@7z>1|Sdw`>eiHp?}+q$#1TI1}7 z>a-i=DA{5AR9M&gFdrSEX(E&n^u)2`9ag6e z#mjR|OVYyEbXbnEh*Z;C)(l=v3a zWQag9tc^V95*u>9~S$vwv3)hg0J-jj1DACphkEB=aK)w^CR?$xw$Fd@)BEt0QuAZd1ubazw- z6MED1->)s-oqB-$M}-FRa@Do+G9LLS>po`MM~W)}VfzzG=87jKAEUL|4HX>RpMr_B zz|^bG)c0h0$FdmiM|cO%ynlDE3P;n@E2FSe;+5!36 z2Q&4xxm2V!>; zP-G4%7{X6B7{tVTlJ6ugr2qhj$puWq*pPaGgzf)P2dvEhkd3i>+dPhFgyn7Xh|ma$ z+vW=)k-vS^c)@Pe{tO&}HAP^8#f=#xC6y>V7$qi793wPeD!M^PI50Da1t8xUgJuUL zapJom^M^5LLJ|nSV}|`!$(wrpl1Sov%!0Sqv3Bw932JA4=wFF_Y=C@Mgk~Tcp>{Ba+6&`^ zGy};b<_$w81^&+C8*E07#C4e*sTk|2pyk?>HA%S)n* zH$W1Wo(}`QAsV`{4U;zk`(M%yNgFfDuWMb>IC+>sCA&FyznT`lt}Tijx6M-*w}d^( zZh0pVpx4sEhR0yUXwHVBd$w7U{cAv{!(p`RJPjd7Ke_XscGRPW3{H|Ll#rG4&(kG?|eGUeyZm%CX#>FICYr)$j)K*-&BPp8&s#W)RZT!+Q+}%p6Zm7 z8`*Qu>Q$#K%Pig0&-Fvg=qSG2H;0m+S7qf~c}Vp3d{%J}qWO3AD=n!EnGX4tPOLS2 zWor%(T6;8ZtoS0t{j7>BX9@LdGGB>0%s`@p%tG?RW2^eL)kC7*YT?_odc+2-F0sJs z6AP?Pqw@b-#YdfK`Q4hUsudzM2wJ&MtfZtSf1C!n%!Z<6r~`%tLfIbQ9!9uaCtcbj zPjow6YSdWhu=+Vk27ny9 zvrGjtZyX-}xHkAnO+83&PtniRJ;;Z&_oNNS;i3I9+jH6vvps0V^&q0z6j6UcEjn3U zb7xhPTc&oAiNd`vy1qtUtP=}tr?J3xnCB7Uwb7}YAsYtVKUXl|{y8gPeHu3*#sb5=dE>HciPGT|2b7*p8J-LP{fn^;M~ZPVbnq1?r3!87~CGt)Kk zkM{CQozrn35V_)&z}>0wC8frfjB0#Iw#vKC+{-D*{;BBb8AyyJpSz(5seE|sV~?NB zjs2$4o$U&3kN+Bb+z3gJ+Wa$O^YlxaG2pP&|Hgtj8~Qe8D;gyod$yvDMRBGoPH7)k zMgLsW#qya_`0?c$2*nr6Z!c?+72gFKE#aZ#t984p)$3Mh6<}JE;_Dm5wnaBEY>P`< zEnX!@J<%vi3P+<+$6?zI`TwKZemS~%GvxOalHo8{lc9Zgyvz-5aIRUGH|<2G;jhJp zw?d-$Kw7w7mQE{KuaC<}3;TPX$A`*~R^O&s@0#Q4eAW|?LH?w;YzRn(c~1xXadkfT z33opC37F4)0%n>u04wqd5^u*m)L%ZmcJ1i~z7pIWjRf>#lbSK$w{z5Q83SI#JQ;)aX~tj; zHd_4u+o82k&$HH45>ObYFq$w&*U|KvY#48TkA~03<7kRoUc4f^VCx5gF4ZX|4dcz$ z)*=50b?%xtI5$9^tXCPmvkStlZ%Wig}2Kc4K zn~VAaE##Mf3PZZ8wkZ?LV=`qYUiSJ|X-lNjaxmeZ>hY^fYd<`sg*%t-)-uJ|;cS|0 z-byn+j&M%6l|~gTb*`GOSySa}-HFrc)|&k&3k?iSX@A&_DLZ(%)Y29! zc+Mn2H0r2YD_Mu%N}D`}%A}1a3RbA;jCtJON*hemJm~`6xNg_$J&xDLdmWo0S3fq$ zHCcVFx4E#sNGb0W2F5%OeuNYuHbo&eL9Tdss4I`%AkTUP&`!w96!K4<$-F-D%^Xnj z_6Y5Sygx!azNF-jtcV>zJ~u)$JCwZsk#OyRoH;E(a_Y-`P3Hd7;oAne^bGjqAvu|g z6_l|K`RNGlg#5WPLshxbg?!^mpq-GDtAVybZi&!N$lr+2HpoYz>1<67O9~?-mh4qqAd{5Yg4GZ)P7*&E1=;|4TpXV}A7Dz;JGH$5J zA%&O?5`h9^Q-(xiv3EpiwnBa?LK`7zQEs{2ncZ@uQJO?viD5{DbrNkWh`y~P`nK|P zNp}mTRu*}PwiIFTxhQkr5LbUV&N>2;`BMdDj|<7{Bb9F%l3~X1Et2`rsvx1~By(>9 z?;Dc&dj(~C2>H*6@0KB%D|M>z-H>6@@!gPN+VPxZn0P!V873ajNrtJ%bCSV_o|6oI zbM}R1jC)2hjB?*3nMPRMH?;oj#SsJBp!(L2KdfJ6Vd3r)xqsH_GB2&I@j4O@TnMgO zn+2g~MupU4U=HoK|L)gea%&teGmumlW$(%KYPa%>TKm^hE0B!GiR!wg&YAm{ zXecM)-zgjS80Tm#QrtU71`S~*-w^rUY=rkJ#DvZHyRAqwheN_W9ArmMIpydq-6XKf zkbUmW3bD%&=njScNK^NmaVWR>$g}G>R^D6~4&=i=SICZGQykE;Js@*k9MC%%yX+jK zzYER?N?fd|Ku^_i$oO^liW!b<3S{QB)-4?7#r>?@8k;Z-t%$>J86ogD{pu$!;mZS){2B2p0>BtGVh7*Wk(;2&XQVc|eQob%eAh531Zez~ux( zUS0x_5_w7>FB>uTxgJPT*vo-ba;cdKLQhUxg6JXTX!Zm~a3%RbxQ<9Y5r70=s$&=J zW=|~Bgkq{?FA-8tgeI2-&Gu}prdswQA@yW044UoPm`?54%Y@V(`vhV>)d69eNp*hxJb8ejtl|sMJ7YcdrmU!Vm&7rV%Bq#A%Hz68Dh?Jl3_;l zoWve+<~hj_VxE%>5#%|^5Imlf3~}Q*$q+K0lMM0WIc>;HD&W$7YihKdqw@q6Q{p)? zt;u$5u(ElN&;?2B2BE&HM>L4^#7`L5- zrV``3lh9OR`Rmj(l~^A;`It(~Kpo?YYRpxgw5Ae^bSJH;#LC`LaH_El=+rlr*uHkM zIF;CBbn2N(>`XdpO*K}LPJL5}rKgjxS)$k;buyV<$~yJTlE=kCN0U*F{a7cHQHd3{ zlh#yXCGMm(mAKUDs5RAC@H=TuB{l|~1g8?aiH?HX-NRtfqUq_y@?^PrFhF49S&{pw zwcocDkC|3`V2RU2|93csLCOC3|I8A|?5Iga%lst+LPl2CmH z8Nk_gmE@$1o5|DFfm4G9?7P^`mugeSbZ~^km26BcR0f``Y1&k!urjQ^dxp zEEA=R&kWivar%pOXa$^YP;MVe*z1%WK^a?`ycJ5=cobYk5!;JWN0hOP$UCBhjY6pv z%GeL&tx&?EUuuOi*7m#=N?5*2tx(q2=b6?);H=_#FO;ypmji)?oOQ7z3uP>Sd0&*U z#+6#3jHRqB52dVFrIsjTVany9gw?0q7p1ICrM|-ONPqR6kq9vHpAv7xfAx+_<*Jye zfq^E6;(FW;8*m%t;MR-ab`J$^tqg800v;7n;>h~>Cn?!01p3fqCf6_U=lTUa*Dv6? zegV(*3wW+yz`N?#X>((p+^Mp)RHw?;oSiCLn|G>g9n-0@^8?)$E?#mXr1Xn>m(0a<9pB=)q~bp9<)aA;E|L=HS|a~i>)%L#A=jEtXiqW z>Xu5Zf~mx6nM$mxsidpE@)*)8Dv;GsAgh`{Rwse1G6GpG1hV1_)KzZxeX|wZVODa7 zS8T{-9)$+gE9DFE{8>npnUtqQ!$GdktkowlT9pEtYc*@N z3XHj8v$pQACkeh?N+Rh+ojgo?NW^MxcC9WR>*Z{1);nIWG+@vB!%Qoo#(To zt=$`Dzd%10@Kwlg4^5i3uJC+8n)G)Ok4_RalEO1@iPQcD$b$+U7uH<;5+C#(T6%)a zp>p=hE34(oFst+Kws`3<3we2jW*~1-NG=8s4&|Vpl_)Hud{)IMz+0)-%#h#2% zmm5K;I8biZh3)k*u&=64l-JoF`1X5W|Hco_pH@>qJ15A?IxPmO+jT%S77r_NuLUrY8IkVjWOv9Gc}C#L zg4;2=A{(Ec%Z$(!@k)fzK_BE9E#*G!SSfSa2rYB9RF{nSB%G%_YBp`0wtT&s789pi zTg(Tfqf2B#2=5eMxLn@bh5y|;kI4I_l-6MH)iPNG_RW#`u!3?eFDIYLDZ+oQz-JQo zgF`a^)#8?emH|%Ij|4+Aa?mos`K^Kr6Cl4BeSTf9CUZ>m$8{4mnX?nvugN?+ zfs-|vD-t+Wlfira>bgO6C2kXNQS{qstAj1P=w#L^D567N5TOl_JQbFzhv)G27n5fW z&&5pq&U35viLY$k(RbG^!3FL`l+yoJ73&-qn2dc=*_&H;IX1k-ICXK3yBL-7H4Y?B zlhz;^qVf&>L>#a9QTQMkvBKAn!xz^IA0z`<_~Z<2^)B8PK1jy1@J+?RO#lcVBtu;I z1~nN1MED?oJ_gcNi?X3Ee2jF0#90rTkZ_+eX`m1tQj^$Vpb7-Zn3ak)GK8z;WXVj% z>oGh|8mAC{9x*6`HBKRNBr!pN!<%JR#bz0*u1*8y!8t3S96emUT4xASKeC>rwVsk{ zAI@q|N^^+(i`vRSmiX)BG+^>?Q(O#YJ9l}Ce@)pMKlcFi&V^d|q!y-4Np_q^ulgNj zf_cmZJgZmmaDR%%Nylw`-x{e1 zEf+1Mqf6RWhyO8pJ>RrC7*{*qo@BVzZ&u){=ezMFftg6^Ndo<9_k7*c4DZ3ny{{N& zO330C{x$a=V6Bu$eDN7tq1sF+5hHRn14)cXmykQvYogx%AsJHPgM3xwyS7)8xjlgs zHJQIiV815wPy#1wGC00pT{{({051zTh%V;>S9F1#)o2kJA-6fJH4?)G58 z&-;hg&(bgM{qJ<|=Z+znZ$_VQg2cVvuq~fSMjYHr7*2fI83B_C5Rw_@Vc~Aat&`~{ z#$GvA9$znyns0!_jw5PPjDe(2%tLSsgwiNen3`pET4+<2v~-l8VNsWubz>VnNoATw zH-gu(K@+`hsvts{>%`!<#EFkcmG&T+`eZJ=MLva_h;tzUEWD7+hRWNI(<5;$ypT+g z$~zfnOu}7wA(;!6cd7vbj-s@g{@A*$VnHjSX)XGRf`RaXSM+nzP~W znj;jx5<`7EB%?qjoUQ?w|N7O9i)%6|ma>(2s_{gEC?SnAx8KTv5<_t!maQCtLy$Df ztf87^80^`}VEIhYtk8~aiEi2E&7KiZQkgkkpzXaRwR=Z)2t!}0QD>93A)}2tKdE&G z@?7;s8Tg@-^w;eXvBgWZ`apJw*UBD|{8fq<797{mm0EnQrj1{W02*phVH&8a+q5w4 zw6b-rSN*Iq!7Ra6nSVXW^CkC>>Mb>~A|wybC7ko4EPAmfY=!rK`qfkPW;AC>O;i_V z7Okr18LooXld&n7Wemt2pbPWk-*Q$t*6PHpTX_ns-R{%0a7tW>DSKO|#FV`nlQWHa z`C@S<*u&+C!|rOitV4qn8+Tx**RIL5>Muqs(#5fI#=IzFJ|!}@ddg}}EuwkS1-c1u zlfd{>YV9de>50p0ve!o^%tGQ9o)79D< zGi1+>PMC#U+vcpyzg}g(=5cGYVe&sv)WrCFhsf+#)4yBul#Dwc9^_^qw>&(^JsTEQ z5Aq2EcX2$(Emigu9%Mhs4#I=%0{9BRgH4$|?XJ5gWo>JIcjndy_fN_K!QX3E1d4RZ zeO+_lRI;SUdRV`_0wg`b70PE*@sk`1zNU>YgQ59>5QV+df&_){X(&22vbfL4T3<)S zB4yF9z~a|aCo2AMOsZ!OvuA} zkw&z99`lTiGTdz>f!p8#CkXg_3*5Q~+-`3cj`nDeF*td0D$LiLs&^pV5)&(B4hV`H|mr^Ev!Xl9%I+{Lyu+;Y4zuDr%>Fyl$}8b}=g=zP zL92lWtqLBrI(X13;X$i~2dx?&?5c-+BV@G@$m$@F)j%LCzd%-cfvoHTS;+}=T?Ddf2xK)7$OP4F3n|)&ON!<0&yQ%$IFgcNR|d!RPG$g!D-8DD{U&VhE64@!zDs0v09}P zYyDJW)lMZ=`&5$Yd<5W~YKr8hO^{s7%M^KNNQPAQOOTk(^I^3QuMQo{V*p5w;P8Cb zh91OxU(jgqAek@45ZMHYnLQsCetvx4YZD|F&YsWO+k=?;_tJCMLqjrLFN-eL@V@d9 zOf1D8Q7b=`0uK`Fg%6!DAGVT5J=Riz5mR9TVZ;DvE0EPS)J55(*R0h`>WRPLoiViVyS&mh8xHAq9hew!|>b6U*=Iv5zgm$U5M;ZaP#OATo-Eq>~4Ed=D zZGij-g=8s|PlEQy0=`cts9WMhH4FLL2+cs=p-`yrK0X3jt@jN_eau2R9u+?GX+!u( zi6QzIx-=$9L74UBdRTOjGneJlCVc+-HNiefJ`fJ28YQ2Ni)QOY#p$|eCYeAkeN5=L zSqp4N%Tg^6)}UrB8)Kv7CE8ein{9xxbfunc6gF$w$m&&Wdx){Z8v^cP7Pfb5aGfA8 z#5SKo*A&ps3GxiN#bCScPthi6p=-BhxVM;C4Zf}2yQgr_KcMmIUQU8$X?EWML378a z^aQV0-K(uIn--oA$HhxzVo2Sl)dup}lluyYd}?MpB%|YGVa-1bqLi`YxyV0AFqu$Sbx0C+U7Vv@fsN0z9ErARq4l zY}Eo0bKg9fS0wIz^X^4kfZbZ)0u*{r#Mai(IJIe3y!$(8^1*C17^yWm_$Re)+vK2s zrKR5FWIm^0H2M7s@T9pZqaE3PoHSphO*hI%m$<~J6d-+ zHoV1%brFxd7@u-M1&Pz7HAn`ld?qsyM=pL8K1jx{@b%+B#fZBwpUxDd zescJ2t@V4U_U&11w}n9PkH^(|kF3^@uF2o6_=t;ria(`njn8?2{$`;TzN3Zg1d1<# zeO8%ZF0JEL&Xl>eKLrzMp{4i@j~J-zZ7qQk}oyFzvlh{ ztdSCqTrf(E6HiZ6ZwUl>QG_-_zC1!(AxY)#CgdBGOTLcj)nx8S;6zR4pAy)w$($U6 z;o8ZX48HfD;gG@6{xcjhmuYp;1oGt(+6sAPgf>GGF5;T~Ln7sM>Ov2ad1LY`B(9X8 zhQzBPh;^oKt>G9?%A6av97p_S*s)t*y1-|eA(hRJ^{->Y!Q9_=s^U4O02zn! zU7mc40)Q8V7m`^)dHZpiz`4Q;$wZ;NlX2$2=fVs5NOhO;PSpT}g788zB`EJ8nct5W#&rEH>i-{kRwOQf>>+ID8>^-4_(JF=-L7ot$#y@|nV)->cW zUZ}oOE#okB+$)x zgBkg-K2)MzzRYor@D0vm8x7MLpJ6yY?8LUjVLYee9*D!ZS97mMp~DcAZ*m+~(7XXz zN#%j66;vQAr$AOrfvl7QSs?|oG78j?r$Hjx^G^?;%pdM$y7je{CKlMHV?m?UB1u=D zjBzjni3?@Qy>Dnu<3THqOqA9*p3j=cgVsPEw0d~Z3ht)+H07fK;yTYGZSzOPt+0;I zO6xEyti!CV4zr><%t{*G$GBH*+i>T7vd~P|j5G#;9H%jzwJWX++?^UEbRTDn)E=0Qbod?@=Ok9aSYRiiSYT(OSYW54Sdhe6h(g4JD(VRmTgN=qUp~Ed_1d$= zh&2W1@USoiExC1~#l|dqaAoK%Z$}GIc|jW%%1t?C$Q1M*iDk|k?UlfgfYCh*A<)!5PmBz|ac17UgL#>yB`pr%op z^lzG>C*$;Os_M6+6=wIV%SbpDa0&z%1LffOW)I^147&9YAB}Q1G7cC>$tglC~jVFr8Ot&4wsjQkr z3+*)qfEBqAQ;7SaY(#DTlsfHSW4v#EKuJs`H!jcD;hsiRcAGl%ajcs66isCmKrUBk z+TY|@DVIMWsiVxtq18*Z>MLTaGmzIP)UU3esL5QH_)tBi&)32aMW$@W)~o0d=7Ld6 zOgmFIf$H_QYB!|QvMeuV{SuHd4o zqVV@r*MdcR)pc6<_HImtGiUOaF1Lc`-HrN|YjGx6r!!}eg>-?#U=}TgiFEukXQ)BC zKsVvc85rNF*48s;$o@)n!UjnEGU7xdXW_Mv4R${6+>pwg1^I?&257SST5oejEUVNbVhy*?2yDTOg;N0JIbG zbrG6@d|QNeLVhknJHDXg{XZDng4}i?&P2lS~r(Fwq-ED=scg&^U#;0uC@_cnEjW2$D zXh#IQZ%F2N1!b9oWZn?I!+Xgv6n$kf-%Nw`@Ln=Yf4I>NnUfWiZXi$9LG8OCb4?o7 z_YKJ~mOUpKMza@)4CC2zl3_f1PBM&W&q;={;5o@K8ayYNhLi6rIQa=0kgyG^Z(Y5t zU)9!;vW8Uf;wIUbuC2+?fZX7@LmmK>ZZKEX4cgmW90oIx)ED9JEXe8Pd6m|BZK@54 z6cg2TF^U>3-j#)DFSZ7o3qY&2%TE~4S>k|7@YW;=B$9|8(*xGJx9b8Z#@Q#g(|a|* zpQe>@-;gzLCQd!GH!8{6CmX>-3jMyO?t!O!^^!bm;qm@+DJgMXuB=%E&xniQ?4?Sw z7)s-NHTsEicdrd4n;FRFI2}HqQSsFj9gy>B2EJ=Z zhG|*e#JY1hc%}c_xY_W^s*!nYxbr|2B5a+nj~JYarhl878p~mZA#t-cg7|RmNF|-l@Vw>$M@n7(EJ+ zsLF_zcJ~j-FqEsP3}yDjvnp6xouhhkc6REWHFl5QH|*dns<6g} ze#dkcl~_W$deuyaQ)E- zP|~HowE3$Kl-#M;^e0D-=I;wo`uWENv5%J@Opu2F{)Y%A4@?4oQHz&Wo80e8G&m?B zT@pBEXaW3d+QLd#J|~}L$O{3(Y9+7kt`MDL9eB^v+YCl1VD1VpLFPBzJbyrh2Ip47 z(rTmrBErrC)7u>fC2Z49h#bm5!N2OmRU-lLe`)d3YL_t!CC6S6?0T%{Q0D>ufEG?y z2Tm2&iC`ehwPdLnYF>UTOIp{ulw4S981U6u!yvb4iTkYy_i>DG+WqQ;bWYi?D32&T zEx+)ACxJhq#V5GmnYeA37$_iJ92u4Z{ioJFjw1PSjsw%6U(-_O&}NXbr{&(e@rK>C z+IV17`pdDF;qle{qQ+1ICT)#jzRihI>6b0 zW-3v@2GiOEoIPaL00rz3Z3E!{{nUa{0IT&Fbbh{J6kxWHEu#RQ8|$_L5||xiCO8E* z#rmz)2zcgcmH$^BG?czTxy+yeW+z&1gi^Mf)`Z~fD3kj^*ecqZ;Oqu7BT&F@&o%(g zhOVptrR>^lE8uL*GBGG%^HuJKQnqHco8YMQw^#9uiv5Y)d&(bF=WK-^K}@YSsq1yW zvsyO~@1D=~O;JFC{o|`b>xd{WFn=s(H2?L&+FyOff z1D=~O;0u{8m0>`v)#=j4nzU18Yxho-t#dk6wjS(M*}Az?Wg82fD%*hRRM|#Vr^+_; zI#ssu*{O00)P*P;#QrgX4Nec*p!1*&CJ)*m@t}3S2dz^*Xr1Lj>jV#4<9g5<&4UY> zAeC8T$l7B~A&@nMK-LTbStAH!O(2jpfIwD#fvoZZS=9xyiVKufTZpo1yQ5mH-VU>h zJIreCFsr)5tnLo8$~(+z?=Y*r!>s-evj%Y3(fq?6+#`|quppW1C8!P!t&KcrjpRXV zB@bezU)HNd=?0QLhUc@U^Pshz2Ql7F>x0@JBy&JP=?0Q5vF9W6vZsa0!UxG##q(Kj zco28on_f&lG$g~8R9dty@|8n>NBWCbaDlupY#ktwHNQaC_yS>i>@1MAvOw0x0%2h+ zB9OI*Kv*Lwez{d#xQ?W7D7R|ME0Atawzam(#{z4DSYQni3#>U}fi+4ju%?Lx)1;d4cg5g3z!Em9VV7O3FFkC1o7%mhP3>OLt zh6@GOaQ4;Qa>U8EDb{2HSz`%g%_NXDkU-Wn0$HO7WX&OvHH1Lc1Oi#*1+r@UJN_1| z>_Bs`?pnPaW)*js)!boLb%$Bq9cGnxnAP54R(*$A{T*fv;IK^D7VtWA zle@C=mNFy@NMN+?4XAZ+Krz%!>w~fZCC9xi=?aqdIWUq-3(<@XkieK*ew`$=Wuc)}jHmb_^(yox<4Nu(mb}yw*|y#XiJg zK&{pRwV@bL8;t?Ac99!-&2KOV1ItihBev?H9dbO5lnv+My<~XaC~*vlg*_hz=AoVk zt$jUc&Fev|%R{3e5jma&^{S1K1an{{hjV;ZdKwTGq#uO10JyQq*OlYvyVmx`e@WX5EWKyaMww0?p@a0 zj*Xb-xsf*(8J-tO7mz##>bplrWJraN(ZW*|fgpL3B30!G4D};-iG|O4(}`!@<}m9t zhuOj8u;7#Q*A1P8r#c5Dw78dhNNxu;HD6^1nRp>Z5 zI#UkG(i6HsvH6Lznu-esE3S$xoh5V@q%|O0YA^Fhf!My`_8W+fSwB(fR zl?=zZyr!H9QTW_1C^cT)2z<u6Rskc;? zVL!QBGr-6c5>m?@Q~I^M6-{1vn1e^jW~b#*d^fERfx;b_f({fheHV40kfu1Tg>v~EC8=)708dX0KB$UAV1Cm@SCjy`Smt{ zk86QQdCMG`&n9m9aT59UHh_Q90{7Dr&`kSo=-D{%M#SyUULTz1K{BKb%K}}Y{L!)i zKb0D~Ye?pX#2qYa2`Xd^?oY+R&YR>R|@VaWSm zHvu9T!jPArHo^V4Iu=;XVgc$sMuT4>{hlmXd)0a^enw);W7_RB5b1V}(}66|H_C66 zkpFGP#Tr(1m#6rUvNe7#4d}fKwea^^n6?$!eyCS{P?=yJbIHu=72MaKqH)sk8c()( zp3)v_Fqe*ET>tN#9a^nA|** zZ)86Bt|y#!+QnAT!^y!s`i%+B_MnyBgH|RF zW_>w8{ajT<7&E{!xl^-lwV$hY4_3N!_~n>>3K{=viqk_@4R)eezN{ZHU1U|!nfYPN z9%08+9eT6|9kWMk@-eGrP8l)q50SW4B2jc1J^l4)U>BuIrBhmQ8E)vS= z5lL5CVCA`}t8lH>tQ(JBF6;NBZ^;IVtiuz_br-^SrSepgXPcw~*_x7{dcD@<318!3 zACr*GiMJKbF#Mp_u$jUe5F+&w_5>D)U8#hA-7ur&TSRQ?bb^anAKEFb$BnCD_Y!g zR}}!4l&*M7vrxFx*1U7+K8P1XV#UL0UkaHFyPd)Hj%cv$kROW%llz)v?oZ%EO=eNl z@Wy^k=Fth9tjS!Gz^Q1UD-t-!?BMTfGSo=rJ|rX$;)QRzCc`ZP;R_*^{)%Zd=rB-E zW7X|1u?(pUj69@v5mNX{#s%Vh=c%D9@9fm8g6Brj1_&2I6%TkqVM#*GP9Koi(VIO|L)iq-yOc zC#_q4*5Yd2np0NwPC4%@4=vN5>uGcdId!pi_+m|E@`GgB9LNv;%$I(&$~6)j_z`X3 z)au3us=;;D51tmT9M?=gb@_GjLk=rzIB5S7;kx)`MP`@~;!K#mEX~F};MzwgQWv@h zRjR_Oz_edn75Y=uBo(vMFln#)fIjZ$Ws$<#G|`hOE}Y@v1hW4q^EfXW(5#4d@9?Je zp$=&gY&?a6@3mS_Cjan!58#bjAn$)c^5|cFq2PD4^ba(3&-I}HTCss(ZUG|y)g~_M z5BZayR{4LPUzVS9G=H9^GMXSSQD{o;QOgQL_ELr23Iol(dp8I2ngQ<+c;oQS0BI3y zSPZ^GbDgQ2B0O#7l}+KrGeji!~VWRht&1$(5wZuum~(0Y6P=4lp^ z(dJ(Xxovpsq~bCN}T{LTRE!Ae2c$X3tvO@}a9d=lL{K z~CMF`&@n=gb9uMx%0 zD$rNQh~5C1B6=6jC1Ry9f);+noJ6e?4o8Wd({}%lZGkGKZgV& zD#A=9&mnJG?>t>qzrNo6t*TgHO%V%ndu+!ZuT&Gs{&l`4lZ><-BYhwa`|Z|9v6~=H z`rE7aYU}%=BeKcTy*>Im4g5EzkxY$OYfbm4(;Z@zS`U;PYgp*lw7Pq%_gdMikxyf2 zgRSoKz2DM`zprWI!6?xClW34MyGFV@s;%1JYny4Sky%IHDpMwyCH$-s6O){SK`P5* zejY~7Chtv#b5t|4PE;I_#hI&aC}bU5pn{t>Is4W0@76q7C89mZ^L?%sJop;D6yqwu zgO6Mvx_P>$9wbD$ci};fO(AGK$XI3^dyqlOks}_=v~fE*e{!2FJI!4kw++I3TvF)& z2}jmK1m3PEiI7gYW0nq_N|y9k59={qfTaF-6?d8x2S8DjKk> zj!DkLJ}@mOnT3O-DB2WRj_kl93hq#bW8z>ruoUc0E%Qgyxp8!0DF>J{ z8x@3OZu;A&FJMp#?^mWmI}~vQRMDXJ_@_cUOpB-M4!qb7g&g!$XvfZ^#ddb4_d={&|1xd)?^;E_VS=L zmItk+JZR12!K1ZN=VN27Jv%pGZQr>8>!;2QSf6%o!1}*)12$GVH(=wca|1R8J2znC zwQ~bDwmUaq$3f=?#vL<>kC~bu_>nJYAlb~xXiUHL!;CIZ`p5mPA3MH$dyE-=8OMWU zSOz+DVuz4#&khR@+EDkP4c`tu6S({uif@k$+l>zG**Ny?+1TvR9#P3o!M8_-1*=1Q zHb{MYDWC#1?tC(^9A>TJFl!cv*?;54hzz_#rQbF?G_;oS zoYpiRw6^h}HI4_Zbv$Uz<3Vd54_X6x&|1iY)bX(%YzG!ztU z8VU+F4Fv_8hJu1kLxHvFv;{QJ7L=`}oZ)4yDUh|JK-Pi+S=$L@ttODQmq6B10$Cdg zWUV8RwTnR3A_7^}7aIT@a4T4z-R3sfh<4o76E3v7PwxT>gxuV!63E_?5(v532?~_U zojvV1*2wL$$jHJL}1J)(#%DnvQx(MdYDmIQhwjSwQnhbBBFdH=YM0xyU{4o3(hULXyOg}# zTCWI%ONiLe963g~FhVZuJ7L6eM0RMA9PSiGJJRC|E8@ z4#Lk!jgp+G{11JJCD{&y3HTU)f|>{?XQP1;%cEMiQQd5VsAb1Gstw}zSbe;lBm`lq zZnh4_oIR>_%D_w{f5;QVPd1q_oTob|={_)!gg_jVNYriiVpq30s@_!^qjo%IFH-qW4+1^pMX zZvF;VuX?nOC)OodqO1YT=0%Db%wN`~2h}V6SzqK+W1ArvmnREre*71uj9SlS#;ts- zq+^h=Smt6RGT!7(Y&%E#!OJ3%fh+$VOViriCw@%LUiVbWZUv z&0n~@CV!3MvQ6JVM`lhzxqGx<4!n|cvlRG+#C>p%%pEOmc~KwWA6f&AH&*cL6F)eVfB17X!H%zQAoe6Q~C-l`Che4Aj zvx5Aaa${EVUs2qfmCSb)jApgb;`+?~HQ(fKZyhWAg?r@dILP-zPudcd6PBXE-)!29gUz zJj1Y&7x^LakF*BK7?LBeCgOm?Wx@x^kP^Or9A9`*_#hc!!Z#U*8;%t|NCuqnO~uiN zuZ0hiF(`b4nhfq2K1hb2@GZ*5qVO>k2@+>LXhK3P1xa*BO=5%5B@iS7O)A>R5U!?= z9i5Kk!sDcVy!$udL5PL$?a`Wey8%aoTeZMZZMO!#n;+(_K)vc`wfN@~+rf-YZVFV$ zbE?Ludq@2SdGDP3BNZ1**j`+o;xm-3@zy!e>V;bP5iMkeE^JwP)w#+9b7@U1FlBz~ zPtg)-p{1ndnYz+*b?3&Qz4CGx(+Kwr9cHhi9L5fi>sE)Q-YjK%=fyZH0l1X{+)4s& zr2)5cq`Z|#LhsO=6~}{C77toMJZPoxVCvFRR)o&4|5$N5H(*uk+<-Mh=LW3FIyYdA zn)24XZaZNu<}hmnhgrQGW<_<_=zq3%nR0CB0@=O=vRw;gdlqQ?j^i^=+kGssLc{_q zN-VGf#e&gdxsok92fa#DnI9paqPOKn94AFFvzMG>b(`CY7f!~qYK~~pDm{YDnqUN* zHOL4yYo1;NFbxX2h2Lu8Fe|phtc(t`0y!*prbNHudxq3&VG@r|Ctjv*qZX5_l@r{` z3U1{Ew=#oUxzq0(Sc&|EYsK-PmBoWr5D!`@JUG4xohL9WZs!K9YMmRfX6W32HCg8d z#y78-$x z&V0Abmz#6IC}g%9^RO$}8JF^M=ZMKMI|s~~a?BpBwa2Vx9WrJ$>$5SdWp2&fiNWNO z*&0G1tE50y0fDS=0*&8sTsLj^vA_xu3#=%yzzP%#tXPd_NSS2_=QTFa^-!*B?{%Rc z&kTc|C_l3u{Zwimy#*^V|ER)%DAj}iZ93389gTHuQvzCG_&ll0F=FmcV8Z~kK}0=e z>>SelLO^s(4=>A*`bBnSer7JApUWWIm>#9A^Rfw+cY9^ z=GDjPQz(HTNxdP+a37*@gpjvne&1MKgA@Kpogp#7h?$NG&On}}kn9TY7?QbEL78gr zkYDfZ)c`MV7fjRuuW1+bYk+sQ3npuTKWP_C)d1L7J0C=&V_+><6t5HZJ%iYqfh3i~ zf*@~JE`N?18NTBeK0AC1r*=)aTg>iX^RSgBEk%LBI>BA8Fe*qJj=}Jb4Vv(mTbhu# zL25!W9^_=4i8wg$its@)M1-#&#|uspKFHUqTZB)3+d(tk-P7$CWD)07I1+r(YSiYNj>zAlP-?R-rpiMoj(Tp4GHY#Mfl&i%HI?L%pdzgb)U z1x*X#J1Gh?D||?64&*VlJ9LixpTri6Cz(+EQDti!IS2HK1zYI6MUigTiRDiJZRq`p>z8N33!Ykh~`ob=F=0@2p4E7dj`lKQ%D}c z_G&VF5;#$lIgr49P3HF!I9ZdyH`3-*O$Mj<2f$y^YX7CF2n6{9(RAA(9}%I;Ab&VQ z+i?U2mbR>U1!~ztGLs8G$=(bS7f5T6 zj4#>NP1I!Yits@)+=Q~C?4;j8HU@={ zA&AqRRiJs_N-O}0*QF-p>CxL8AfFSVO?KS4_U)LF#*9m={D?Ehfu~8+vt1Bkzz;(? zgV-Gy#7nmf}N+LY=}aA_rWd)qtTGZ^yQyxGRb~5^d$~c|lUB*gk>Ou&Pj$-4jqJH+^{P{r)rh%A_3TiU zDrgvfY(s3^?A09rQS8^4qElsSvrd(*aXVFB$P2k2B;xlEvGAK>BwYrH)&u5kLpcPgkz3~sZ-k@^H-lJcW`L!tQ3?#zJ)^@+#ujtpjphh&y6`vK? zw`m2A4OpRLK|{&~$g5RGWS*8OR(|PLBm+V8fn4dh-@qmR$68ZfHx^Yw9Wc}kW!L)l z(Ddc%BHAO51spClYRquf`XGLi3ytm;`X4&sK2?08*>pi<|1y)MckN+xG@)TV=iL$X)(eg z+`H8;GIh9P3)a`jbFP{!7SQ-+)qk?ub7xhP!zz)Tjz*`5aC!`l&5(FiX5ssW)@U9? zOoB)@F_1Xh^I2PZ&|1@j)}9_jY1H$eRcXR)fnr2r(SaQIJ}o~pg`^l1+%^qvTjyr& zd1@xw7fatK9-FSuR8OJ5+$)%_$$CBFbk~;467=LhJ#LOYZh}lb?i|tMGZyGEyE<(5*O(h^ z<73Z_wDHSP_TmJ(Q;T1y>Edcnr9XoRgsO|>mp8P?y2u%emhj2()wUAr$3NWon z@pX-2+oBslw#B8b7O#?T?`RYyg`?4^P8MS;S+9@FNDEg;&d{U&eV9Ja4;-Swadl5KOrSc- zj;onOYh4^YHyKvU$jz+5R2mEHbQ%koQg7EQ?pOeDmlpVr$*|%^ZYJSFPYp`N0)UTb zfp3P)$1OL&-A!&Xtm(0BYvF~gURBurPu2b>$PhZ_q5ksewX4^j?IwH*@WqMMwM*Rl zNDUT>aMQ!WTyEK{(+VwF7mjGjI&=h^b?*o^>+BJ1*7XJPZ6J(j$%e%UHX9^`4sFPc zXvqdpp(PtmBU>~kw911+%7EBlR+pa2Z#C&2l+=%%E!a;))jwBAu+n%muxFSyf5_QqUWTNJU87BYIC%=*z4yV(!5Pg!BkD!fKa> z)d)61jQ|m?J{pytyHJQIme90bAZ`8t5^{d*#Q>I?*5$4iklmgREIw9@#Z`1Bb zr>i+x;~&4ebkP70Y3VH?Z5fu|(B{vk+2-Sg-R*}O=Y)qERQb(D)vKIDN3Kd0tbdO5 z>TVK`Rhde7=^Sxcv&-02>xqa8jX_EK6&9emf*<8wBh_(9baobE6BXg|4P`Evy~MN? zSx8Gvms3cZGs&e&`LxGlGRYn;SDU-5hKJ zF`p8dTRmkp2h%i9x&>`%s~U@nAJ&LmIMPs}=;sAjaopVqV(SUJ-+6eBIQR0u5F(gJ~HSsyMp zGR6)pDwDdKNuhFPgXv>nB0VKCA1Sb?LApRUA+TWFrRLUfA^VExg;_`(Ga|4itNVX2 z_<)0$%7OK5!&L~Zsn`_E;+=!T!G-xckh4m7EzV3kQJtZuLS3S1F}!l7LU`p&h48XW z3xtACSAbq)5pL>I(~RjgLHvzLU_S=o|;>OhU`Vr3$u_oW<+=~y!Y!vmv=rZ zAhOwjTz*-ACabUYHrM2?P*fNpU-gnEBQ3YnaO+F{HV-0c(rxw;Ii#J9(r$wMc!YLB z{_1l=Gjf3M=YBMhZ+#xn7RV1gA7}^UQoX2_hcbtTD>d^$O(oJHKN9(N@2$z)o%kUC zB|GPXdzTOn^qGG9!5ke}I(7&{<8uCsuz zO6Hgykq`0-5!$j@$(JQ)-L6n!y{4iR=}CNX*N_aY3m+tU zdcN`d*;eT1@ZP+iZH0ag?;X|8k#VcBym_`1QMNue)E89_56LjU$sG3 zK{Edy=Y?I6%n!nM-(E5=*U7?HCUZlaL3Tl6AJ0by3prJwnIt?T8KwzQ1(M78Fg6AWXCWu{-Ocb7v3{!>l3(2tcd}IhE;maNQ9vvSr4XSU=pV+Um(B|O~{5ZE? zUB9*_gXv`db9nDy)!J+%d2WnJmytV{uBz@<`92-T@eCyOMcISHQr&?4t=9ZpY5@|t zC#vgWw4#Hwde0mgM0SkOjqdN6v)%V9x`oY!k>zsv2@i(9E{CD-S8>0X#D+v{5pjCJ z-r-+#47m+w={L{r_IU3T=HxWj<4Qy%Wxni zuFI7*`-17X-p}S+fZ5mU;AN1yXZ;LBmUPkV!EDy@>e@l#YM0FVpqlOL$$XG_MB2Nh z7&nV`$yySZt{KQi-TN}9J2@`UIv1w8kd3+z6zi7saM(rK)^k#ukbkF}NT{kjn8ZA2{o+ApDmF77wA&dE+6|2d+0w8t@t~d6 zJox|e_Ac;x9c8`$diT5c&Q6n*^a7SxBJ@frm$m{`yilRXa_P~%lbw>ZX%gW8auL!? zN=f(oW&>5Daxf)aQVzPJ$RThJl7n!F9MPb)7777`~q zHv2DBn5z7k`s+V(jGSz!@TM3aGidPWsDXCnB(p1-WTn7&pnj-&qY80T6lNN7ULkQ= zHA#aQc1)gUE&Y3xYVZS5lWE9CQA}T|VNvW`D%WGK39Qm@AfFte>mZM$E;m0Q@sYTg zn}%dsBibGwkYLRv;QW9&PNQ?q4@l5SeQ^>jpL}r=^jyzLBCV#TA%8l}h7J$t#JIuN z$gPb9lCO~j(;d%Af(ei3B*BEobCO_+;yFn)28Q_o3A(-KB*7ZR*GYoT=sB&M`xf|j zNE0c0qPu4yS0Z zBw#pT&qVZsWXEJgp(w_fA~ixX8Ciy$6lDq{UWJV7uhF|yvqu(-Qr6^;i zSOAiF)retEF?N@hArwVFw7ryi<5<`$vB*N)hgxpo&WwtoEB%MF5Q+nozC?6e*|k&g!}bK*0#6g zk%Z<>&5sHrwajJ(3*nIpQ-~YAblwo0=l7aVd341X#h9v(q_v$%j3jtr4lzoA+Bw8X zZQI$yNLm->8KVep=NTilZD%ASX>BJSBNevui;)W3nZ-yt+eySoEpun*$E=YG+k5&* zVi)fIqlAgQ`;XMNohOW>wY_rKPSimGOL>ir54D0p7N}9QnX|sXRC6osrIjJ zhzR^b&3;(5asSkY{ZljOKnByTk`&~&UPDRqWBT_XP^Ap=-MRr3VmSWj0Tsoki`s5jt7Yq?OzLewQiD>v?uQx<;i_O z&b7*6d;rY$O9}yydV%K2W0oiebNahbY{o0uzpsyPHrRYPsQJmhU)j#8Hs?Mflj|8R zrcKWBWN}^VSR|-?TP=>i(3VbD4hcS=56-N&LtwIBq_f=9Td}u)3Y^)m*gkdB{Zn>+ zTXL}7iRuVRHebJ@kG)t)z?l^rNq~P!C(CQ9P5Y;=cfHw%GVsr7w!F#f;xsXk!Hl^O z>tr!M?ofnmwz0|sAi2z!J1QgltNLI_K`gSEJh!_bD6`{21!OS;E)NFeGCwZ4+D?ND zjoHa=M_e+gy;pyaXe$NE?6uGiSIO(vouIG4YhDxFs~lda{{fmZ~C;y{3ZTWHH(75S(l_k_t5~J`3#YOo|zYe2t^p zEkEjUpFU0R0^oLd2e(5UxE&+FZKnsPlhS*@Z3u$nJ>FyH%Gv8a|Ap$N5FG)1UxrKz;km1JU2(cb8`fIDdvC&vtWafR#zB`+0jUaDMZkP z{hB53%UNfP)VB55NQJFiM=ET6Kcd!z2)C}0+NKaUv=Q5;7`=6*wrvcLRG2_#WFDz7 zg&40#)S6<9IU}`AFI(!B-pJ40@=FIK9dv|WmFb?WgQPY{I^PJjQKZpdWxL+>SNlWn zQh%eiy-?({eM_K1j~S(1+he50LO&R#M%xdhMjPD%*_aim5Q(F-Ya>x=Tv}WaRXlF9 z@RK(Lntuj_5W?vmv_r24b7xLlXL>&CP7mTFh87Q6qk0gt(j7gxG&2M)jDec+BOOW- z;Q~Q6^gf(DNhEx^);C(Mg{z?R;Q=}mjlu^>go$#82PCkK@L9_Ugk6X+fgp(+UmFSR zCw!w=FU_N{pL>)I12VeEIhc?b(6QOL5jJZ-$7T)aFl#}FO?B0}G|T1@xfO$cNO!K}B??FkD&9O+h{&zhqEgfvR3K|l zUt4a_t=6EPFSqDcYf)(egJLm(ATgM)jYP6u_U_+8cFe7}4eQZ~<^3echV_mVthX(< z-nQI&+X~h@Qs~dy3f4PP=+E17>ut-ex2<5kBZJ&}*%<)2^{mb0X?C~p*<52e%oHnz&!x@<2s`0e&*PX0q8D2He^O+?vH#ZcPHS zwFtO12)MNexHSj3wTAh<&1V;^alFeKJ36efqr)0I3f4HD-RV@?9Ua!#(P51p9oE>< zVT~Qu8jGh_YJ}XZzfsBV31o_sxoRM%Bw`t60Ky8%J#4ZHtfU#8L)OwHvzs|}zMv$1%^I=7PV)P)vOo)2WTGoS0 zGpuLDg2bE$ZIF4;TGfLXmFV)I4JQv`LauHgT)Ls%dtlbg^1>rV=GSt8auaW~CKfIX z%ul=mS@Q~HjVq8ftrN^ftgu-9SbZ(95+#1ulHS~vQY+*IC)2j>)kb4z!_b+!KFlnAt5mt11M?7R=1`;(_ z%572(?VXbfth$XXt9B#Hs^7@6W@uztb2PFV2JvJV5I(Oe{7Y2j2FQmL8mq3zbdb~R zZGAGrjE(jC1!ITidisw{5cWQji6y8jP!|&;)h6hP-ZP*UzZxjEK0g1-V<#4v{^fhOG4?yR~ z-Kq+Y->U&NDQ`gUlJ5ZF#1*PFIBEPT&7PPeaj7!*s*RA(QAiday_&>J5-6W<)x_Qe z_G=RFOW=4-0*^?Y6VW}mLcq!Bi_hpz2GW!MYsE!S$P*E|0g~C2=y+^^C%=?Db8J8Y z&q#f?m;1s6zclXo_~7HQpU*(j5m(0{YuIqkJ!%~p_8>7syMT>NDS$pn^cgF7l!~SovqZXm%Itlu4m9dIQBZwRu^rKWk*XM{R1`Rov4U)K$+8`N0{D<#I z5Ng5)$$;WNd`E)l6Fx}B7vUR^gAD;Ge2@$y!Z%TqAYg?Lk`YAsCbQv0`0yAJ>#PDz ze2N7i2~{bHV;MCBg8V0qT`8FRT1}l?DBq*?3H-=43|IbJv_QC6f_-1SU*J3sqR)fc z%{-Xe3Y7b-?EAD6eAo;~U(Tzr-4R^-Z3rsCwgssoet=8nkAw^QtgHEb)j$`^Hone)1Bpfxj)JI zLVuF;Hy%1mj|Ml5O7b$@ss8@BW1V&0UjIxU#EeV}P8xqtr(1s(XJXTkEYr@E`~L7v zsht-S@F0<9u@_#1?@^=+tJwf_U6KkO%g)UX5gOPc|dzECREdy=tgble9HsnsoMi==Wp)O0Q zy*P$0GSzox@{@g3q*AGDJ|35V&_%E@U4`#c>CA$$cB?o4hv2`ImF3#C#RhplHm4KI$%&&0=R?@ zDI*u&pmBk0(*n_OY9qVzkELllhku3@f7jnuOd%P;;^v}A$yEYkUmQLN495t~XyAGi zQ9|FBDJtZOWO_)#$2URZY~|}$cZ}5}E=`3YpB(u_J`&#-!8`gji62jeAvZ@pDNJH( z1n(HHN!*eOLlU-LY!dUS@I+1Gt*J01;q42P__b7cvL^9=Qenu{Cq!%#_oc!sY7%r5 zS+_#cEu8P5PsKKFfJ`B|F%QX&gybIW3sOHM!6LM!ql!78Mx2t%%obqEj< zDwQ9L(MaTZ(5mS{^gI!5B!;tsxW&nr^!|QQuZ$)CPYaIeb0<>k$^7gyS)5Rit8`z= ztkAMSmJ8t5Pn4d8vuFlN@G$LUS0~CM;7O z_HP=zER`LWTC+ClXvHAn_otGx1P@{KOzjZ7XxeVCByktS%Wt zNuPwF*|j<_$|@cbi|f*Pnx6Ox9Ug@hlF8=mgMrtKVosK>4?RnEg(8<;zFrp|M`;r=Lc3QUz{f5wWF?*%coM|HUSkVh_t(0Cn=`da#ajnf_hHWoq zSPR7rYmmtXU=4Gjb>6Mj`dg>2xM1!9=g#r4Pkvr)jrRmw%-eFk|9gI3+}ij`TRfS3 zeIg4LSu34yD^l@yivy$Z)`CkaWUafTLJdQEvRD0xMin=f!tu{l|88aCj#5~)Rn>22 zHD#+dS^v6!*Vo6EnV!2i&z46yr#B#ySYWe*wP9?fufeCW~| zbIl8a6~z*eT)iboe0SuVfn<5=1yWz6i+k|LrLx`N+*2Fy6jxboL*5xTHg2A(NpMDl z@X-lyk3f(YMuXklt4Um)z_FUd3li9`NxU|J<24DK;eTZ(fzAC->Lf6>fGe^UeQ7&E zcVn%2vild7!3Y@xCP9LX!HxkLL-Jyv+%B$)mp^*p+#Fn8A^VfGGrEZ`9g?ez6u5D3 z^zH3aH3`%bJ`};Bt~zLXo;-^QiHoHqB;8QH!#h@!!0W;XNv{;Xe(a(Ig787oNri7b z_E=&=_#j^&V`tAqO@eR{K1jN;|4uLoB1rfk?@9Ho$hx!eS&s^2edxC{qZ6y>D}1&> z&WHDpRsfu-PMq)=HOb`1?L;E36JJ2SKDu_#o|;5*?RM*0DT)r4#*t>b)xqtAo}*$t zTCdWT-l&beO|PZiB~?-4A}yJPJ>`E{>v0>Rw|8ua65>~AWsY|s8=|DIjN)ZGl};7!Gn+~Ao;-4z&2(0VX`;)rvzXHxGewv0T5A3yh-~ZU zRC6b)$(yRDt`F0z3#XpG&VAkWyxI!2-gA1vn#>+>{0NU^7kGX@3lo8wMZjDsxS8=j z(U(f|E>pCX;mS94babyesCH$JQkcM$nDV|iK}}o>HH}p~RKZbhrG0`*Mq5tQ%H^XjpAn%AkQ{s^ufOKjp(>bU@>6~Rt*Xw}s$UeFP|LP! zg^lK=BSX?iQIbb#wTY?t`pgz(dr6dH7BZF81E7;&6N#+sG05&6VD_tUfy3-^SPrvC zB00<+Z{#pukKuSAhuMEknW{{xOJsL)iH9>IJjVu)P?RF*9X8mPc&@WG&`5=?B}Xc3 zO+Hd#>zk1ZkLE;~RUaAP9?qzf=!eAYp3j=ogVsz^*edV&tWqAd!uq*<14Oc)(E+Dl z?e5nk?vA6-G$i86AR!y(=l5$wzBS&ory-eFL|&_jZ_Mfvxvf4iqapr+B$16eQ`K&{ zyPqpUgP@iBaF^uNq(7jF%e#G|WheuN1w!7fzCLRN>cbMZt8tq3fnlX)eHd!5PMwnE zAe_7Aa)J!l@o~=&MrpPM#u;nPwyc?(c?+61W^yzmR&_Gn+-YaYiFQ8RvU4Z{*0%Gm zmYrW2XLdVXOEqci?d&flYSL{Rhq|zF(~>~~EO}wek|7VQZOKq$*^(hI8mmR{mB+i{ zm&j)L{NgU1eYnX3N5{?SO|391XjLl-YQ7=XJPpZ-ukuWVJ)BY?+JCvWFB1z$j+qoL zdw!!p_J~A*keeg#1hR6r(@4!bSTcmkcD0_Ixm!Po=Rw3oCJ(YO;f(+f@?<;bGkVY- zpy)v>t_Rx!Hd6@uIyLclwd-hAllrQnGHSWs#jdKY#4&?rZ&&YzdPrfr$les8Oe5F} zqwi-S8-_hqGVG}VViJGy3NvKG)~5yqTb~*fY<+4_u=S|{N~50G`c(GBjJsKd8x|@N z!>)t7-Eq=bds3c!aX4BKy6}@m75J?<;JJar^!t@+TG|!woDwfj)wgK3!Djtx*Hle{ zRwK7{e756u=2#1>~EQ;Rorw0QLbE$X77Y2jvjjiK09zT}~pI=&EPFK!-Kci5;x^-BSp#D`dLwmLB+!tP+SM5Zm;(KDnn;=nqQfeq} zh4gV5*9C8}EA{moMpNxRt806!iWzpaj2U*sj2U*+j2UICI@F3K2hqAg>2&wAXMf$) zWfxp_i5nZOkR5DRmYE=3_ zTB|^QM4^7QbF$87H`AzjW;`xrI-l@NTP+KZk)X%*CWa*7I0yW>QI8oUMk3)t5}NOf zR4hc4iZGAVny-#6M8&9Xth%PqaX+KxVP;j@njQP3GI1?PHm3LUszQIH6zR|(=LrP4 zJU?PumRmcuD8vq?_ zD9yDj%JPGvtG*f3XoRs9xeytM`HHMxYL}4UjKYXv*&goF}t(kkn8%W6?(^P(ZG1{NnF^HTAyQenr89Y`<{+hX?tx0B>)2 zkSzw5vL0l3pj&znWAj+O2RZMZ2kSk^f|Y5Y2OD|>(jELTK0cv)mFWjWm+K}U4hjGD z=fhAe_H<1)FaN5KcypboX5E)-NOE1}Vf}CoAlHYvO!rk9zSKg-BlUB!XTi|?3<#M+ zWh#H$f!rg?C0#6j6h)phr$w?qwlEvn>z^BJkiKsMvPZvc+tCi$KdWr+9aRxRzw{Em zmP6j_mB)W$C5a0BX3c(Bbwm3*H)QZ--40R6=F2kWPfd`^b*200juS@O)Pa=8L_6AH zBmaJ#u6MAJ%{Ocx(Qs7L?d1Qn{-Dt0^Mc7|;oWCj$RE=^hqK*BS!54TO|4wyay_%n zJ zxt7C%Ef~ImQSN+&Z(x)iu zHVC;trd-W$LTG;>>pEpQz18>kPk}SAH@X_XJn>P~4pGVG`cEu3jN#{Tw>^ZH%9<|5{GrM98zt)D-cRDItv7eujS$B z19EKSQa?s+EhIHs`v_#MBapSti0xuUMiHqIk^y7H8YxEbNsV}g4l58OeRIS{C`Kep zjmd{21o7cg5FaiD@!^4Wk;Il9=V8`Js_JZ|}4s+{i z7g@-9)@HId9p3%3mWvtKk5G#lwxh=kYqpqSjTbYl31bF9NN~jrj6~?fjHG;^@&GEB zAUrfzFhR&Dm>^^nOb{{(CI}e?6NHR{2|`A}1RiqSD)K&|ltYV8+LYr=q9D+Uz%VUU1g6O;^STc_~gN3Lt&LSy!6Lk*1ndjup#^nBKa9>j!1qX)4dTVx(wngKm4mLj}7XyeI)SdTFB zpp6?3T8rjCRJ5)6+SrX}a|7LA4J2=xS@Q^laeiku)GZLE`2$@(2xJW-kPRz=tW5;6 z77@tWLm+Dnfvhc72+$Q>j@L$*d-lV|m;81{bUh`SZW`15YJze*O=A@HuB0w&6xSqH zd7rL}g$=8`TPJD)L9(O~?;qMjf`}5n+xiXt`Wj5z>Z_Y)`-s)()6BniZc@^|cdX)hJ@}NQ-`AC`{ zgM<~GZipvy%s}$9$I9w9j*z$NHnObRjV!BvBg>khk!8)%$cnlv5qifPRfYc*Rkoy ze;7S{XYB~8xWFHhcuE5I4N1%@D65I^5;4FntqgYk*beCFiT}`$ z1S5)6vTtbP($`#-|25x4HXL|-sL?uE?U85d&Z}|alxhu58h?s8Aum-{IZ+PsISR>< zfpQeRCSH<2If`BrdlM)}(QD#;36!JgHGw~*&WV}?ju3D%dg5sE68J^xD|qE-b~=p+6^05Su>b4gXfXpxCtMu|zC8`cps@^| zHu3}_?viLTRy5%X=1G6$nZP9`2=cian^G|M_4UEj=`V*o;zzDwF!Jw1 z1L0!n344b)6z6#meZH>U$b+e^K)H9AU#wyNO1;uG$Mm<_Nxk|`XDe`N3f`<0NEB0M z6?MpCuX0>S_Ke!NL^rCuCboZvybg15O*%!cG8h?pdlml$y*6H72Kq(K644;3cG*YG zH^unt=Y-TldX@VK2; ztbURbn^A(rvCQyuX*TE5Y|f?GoJ*6<-Fp>F3F1h1@vcfz2CBpvCI^9BYKrC^?4<~oFK?=D#SX2^!jU2Xa>u^I<5}0n_yF#tF*>r zv9S$*t|W_l8EvVQz9UfXt_``nHstQgMx9=DjY^*y%nzD%ckQvU_Jf8=4?TXqsvfRY zQKgKshX+W{wFow*sPMg8O(^{L4N0)-cE1bw1L!}cTz`|ePYy|(qu=cf+%mlfm}zCm z^d8{nTNyIF2l%~Kh8#c-@NLZyG3WP?c(m>WNW=4c+yV3ekJk)0C4t7R?j~*h>WzhG zUz~OX4i89hZCDWKXyU(bNa9`vqXlh{_$HHcGb%h-nx_02Ly80TVCaar_D*#cIBC2r zBAl2b@mtC)D*;HH?nK=~f~)jl$j`^1kdvokB6;%go=N$*Szm!4Y-fzs0K3{5{Tkrc z+Zp3Ez~8hpCTalUK&lW+2|`6I56R8f*H?<1J%w;+EJspooF50xjgS{bXa=$|k{lWmKCe#^0g3rU zuJj~EL-|8Ply7KoXjstT(9mkI$f|`$tmEj&C`k0XevKYnWhsX?#JOXGW|;GP0je#7 znp1I4OlY7As3(2sjy!|*165+xN$w;WY<8f#t=!F-O!BKf9 z;%G@f5MIb{r@rFkovZ=qE5ZxOkg4^q$i`6NWeBCCc)M!Ppr^O8t0>Fb-BM+k9`&Bgok7S+CEs3g%`N<{PzZgpH z)1nL(G9EzQpK3jv)mrtdin_Q;^M{6%`mC0gZ%@mwgdLyds!;sb?h*PH`ehEqh5Qp?eNsBZ42DC2X5O0x9yR(?Mm#N9N0!ZXj}B4ZO((#ZLfv4 z4wu?GJSenvcu;8T@W8gwOw%4enY**5<=1w%vj+5y*-&5=zoNTLKzuHXSAIyBrM8@d zZtasXSot#st4qev)T2qG6SBz~)Jh|eZC@bU;sT3T+lGwr;Q=PwQp~XJ#SGhO%xLP= zr0-XUB>kpst1>j&_5`vm3Dm6D(Y=b=zoD&^dSq|%ziTenM%>scCo*Q~0r@U)zZ$zP z6g@+)ZZ=^nb7Q&tccwnoKpFb5H3Yb|2Dmi|cxa{Zx1(L(nQfyUv@LqjHs`@cD}n58 z>)(GY=x8hJY*xpN!RnhaSlu&*rP?8!l)bxg9=8=P=djY{99F!XBa^QI5Rbp1aVZZB zK>mwDoX1W2|0&)&kK1Y@^;ppbva%K)Pw46>adfdQ#SGhC%&@J-jD{UN*?id18YY~_ z-EbZUTDQ;Rw#EzRaW{&Y^SF1ni(4Cq^SB$u)0vOvJZ@8wwNf}GyHSyfFP}@|#E|o{ ziO!M=S?eyTkhOfT+NDv&AX+#8w(9?(GBJ9}oY2-(RbS6)%I1=Ox-K`3`14)67LPwe zt3fb{Rcq8nkpJC|P=!E{T>UB3Bu+)X8OXKi$Ci^r5?3lHv3k;PzyWM&WyoF|z#Xj& z*=qy1yOkk(ZSPm$cl7E8^C5{(x430X4d4OIaCbN8(v0}aFNl_ae3u!K;+Q$1u`YeFcJiTr`-R$4%ne1di1t zUXj3lO=4dH$7>Qe!~YaX0-O8a9Z6tp0as+}kJ2)y7mR1klik0t3`WQpFbNW540a62 z7#eQ$q}%IJ@fJLf8`)n#$CqUm9g?ez6u5D7^sSu7O#-!q4@GdOn zA?b$xJZ=(rUHBmBmHs?#5(I+qLDEV6dE6w34dH|Qr5HPM9ybZXMff1;#{N8R5=4;j zLDGYTZ$;Lfh0l6aAnQYW9yh+?8qebf_)&GDp2tlx`7yo=g6qT=kXxf`hjtt8}I3E8|P`TIyX=2_>GVC9|-n{42GdNjYJ=>pX5k z{6$)s<8|9Kq+b@rE8O#{itJY?TVtCB=;noMa8@~>EbmFIkj!j2kDD}8md1J9K+F`E zdLFlJ{hVrd$9ddVsP&$+`#f$d>;;~mv$wm>ceBY@RY~Y%(m?eqEI@Td7X@ZmE{mZt3;AS)sXY5nq;Uczjqf3ou-Ar+8xz8JxG$A z^CHJhhJzgRI#cfS;j?S0mSl%OjYn&sX4gYJIj7sX3@T z*jAmKq8_dbG~4Tc>qmoLTssDDvbh!xUzk`yCf8zJIa?Ux2ZiSb`_F6^5xQvlJ01fH z4|fkj1Pq*RGzbpQ;?xa7u2T!mih&i$h@zAqelx$Le1P*0(}>*Z5=?)!hztMqcnXDcMVe3%J17E8ib?B!IS zm3b5h zFLWvQ6YwU;|M|KAjaUEB+m!V!$I2}r@Y%mq{fDvY*{fe3n0l|!YqfQ-Gmt-W6VUYI zZw}-i>s7itNAM_(Ptsog-ckdKMb*5@es3kiD9Tqy7v zy~@b(PfD)QWw}5%4g=TA^(xRimHc3Ww!bED?b54o?S5^5-k?{3?pAwacYy*=`7h@E zwfLsX4CEg~i*JKWPS_5KX`Fv&YEoFIS8antpukv`CZNc4B+9e_@}4Nuc1Q#f|3V^# zYidJ5rtKw}HWY%hEf3Yp1}r2k$&C2ufCRM*A0*0qzAoL-o66-r21(UY{=^&!Di=P; zMmr}o&bnG#7`L*>xlwBo=7ZY*M3_?p62D2OtfnKW{Zsgk&CyvmY7g~=@74sp(1RrC zhrT$8f78zCIZ5ULWJpAoR;MPp^*u*> zn^^JzvAetptiTIX-+W+>yW&^$?kKnV%e2R(8|4f)%3-`w&K%9|oih*9jz>pyzt_>P zxKoOV4`id0m)pjB>4`9Bm48tE|8KGbBxaTRP8Gtss#fd0;f#2Xn1*bWeL!!huC?^< zN-guWR2H&P_IR;us-;amUF*6w)d_j#O9HFtGC$m_F59P9xsgHsZW=7-hxm!vi!c0< zU7@Bg>eYjcp!mmwIEnGdgVrw|WXPFQbvW?5JMP8=& zemRs`#BlrKRvdwHVQi4gSZYIDelsSPxg{+_Yl`l?HK-`HLf)cK&|1#lYujd6D+aWoT{tu{30R@iJ<)eSSor+tFbe5-^s$ z>JGfQ3G$^nX&X@}iZLLGr68HfEJIF;GXD{;Lb3{5My(WO0wuLVGITDZR*EvviUlB< zl#LkX6k~H~8A4I?oOv959prkQ|BWaV#h6oy@gTXIEJIF;J}vH$ZGwD-LL&ww#kiY^ zJ0O|yE<;X={(Y45I>?K3M{h)XQjD3m*b|Z)@G|5K-cEn}ybJ81u(VCNj$(Q9F1=aG zXfCgL%~j_$pXAupe(vN6;XX?d?u_z<^t`AW*jvwkXyG3=E8S3dXS?05!ra)tqzmB@ zgr*2LwvmM9*1~r5NQGINv+NtGFon1?Nwfu9pWkabs>@*Z?ln@|_Qo?(VS6_isjwaN zM=ET`_K^zPF?giH42=8~Fj8SVT8&iL4k05IZVwDqb=s;`t5>gC6X5g^x=Z)XI>6>w|ce-7WVqxR}-j%x;=4}olfZcuBoq;4MM%YBhdd#Jy zHb~|}Bh*F_qHx5GC+jj1#(GO2>nMS&k49`4S8{ie8X>unj94SZ=oV6=jSGPY2}Ue| zAQ_xSY?oqmFR8H|Jyn(WEXP4qU8F0og@0-!(EN{Hgb+^mpmn7Ob7xLlXL>&CP7mTF zOzJ^vR1acSjNrkgnE@`$fuio$XY{0h$Qf~vsP5RT=E7$6c5GI0hgrQHhS~(AR0m0r zIW}mlBW%_-jt$d%LwB$p22JQmQAoncu|Z>1VZ&Nn%b^u=twrTE91O~+ArK@671tdZ zEr>1)dkdZRU{=gTd6qqV3sfkCmDK#&;B*G3{)FMBU?H0y28t+%~k zy+Z}-ZO^T@J-6QWg7pp!a_em`Sntpvx8C;LdfRjBZ7*2w&>*+oc4CfeZao`u@+6s? zFl?@|96=T{Y@o#qYp|GM%@#AP@nQxBq@%_RYo3^akqDibf$ChBWPAN{CIPn=0dMH-$ule<>4HH{b{S-6he39B7-VOML3VZ+WM_v# zc6JzKXNN&{b{IsLL&*wfCNiTi3_&5!=Ak}At3Z$pAM#;AdEMJRce1XwRuOh<5P_^M z1hQsmR*ESYXoVe;VYbN*#t0+q)@TA@FUDJeAQ^3&m4Yz{3A;7lSr&+ahCRdg12HM~ z3#heRK&|ltYV8+LYr=qHJggB=Ymk6q6O;_7RqJd4^_Ov^vQ54Qzcfn2e3}`vqfr&iKU>EJe#QIGvos5L}Dk zO2-*KXb9i?^%oK0KRh7u=>#4ckoZRhWqyBX;EqEAI9nez3>k6?Bf$5zGUPpRfGb-W za!drkHJTysOhR6-&{*}V3i=g_O$z3|bVB;($a{GW&27PreKsV#kqCyKKKSK95?mXW z1G*^jA0Cis+(q(bp|3gfdH~Y5O)~%E@5gC4xuf*m!D+bgUFsNc(s)yvosX{lLuHnS z(IEdWdi%CsP2w~)r9a_`#N!g!uSv`#aJ(jgN2K^fbPui&a5DPhHvRPq=}F(IxCjcl zH$odB-=mO=4jg%&I>uqp_(f{7J>0Ps{xya?9Pp&r#b+StgRA3c*D?QTQMkLWFOk zCPB0cA0)$v@J(i8iSXeu!qr&?n&1=*KoX}?62~%R2n2bBMy?dheVyGe_~HkCZVH0V$NQOb-yE`$rIvWc(Z)#;NqHe3fv90b)W7%SqomN*T&h9KtGT~gQVJJ zf9&urT4$Z=w(|A*yEK!l%wsK6clwJu?fTm|Bb$c&`v}cI{#%5mA;;ma|JCT9b=-<#E?ftDdccV#PX|APwHN0Ai>y-JW`Ub^R;Wm&QrXEl zgymWU8*452cBWTw_YO(ip`ffg_xkgBe@=k|iF@CW#7A1(vPuQ`Vk<*dsS(gOr$ha+ zN?oDA<69Z>T~2@*%@DN?4@tZ@aUT{jpI8Iz)C@OyhTau1Ion-n9+LFNvcB~o-hJLf1hyTzq0!aPf&DF8*9{*@+w&#b!gXLKUyGUxFRai;}%zl%~fK2Z+sh{SaFQd3=gh*5jYG65?+w+ z&t4Z9K3PTckzA%Z;rNaH1#8*>cNFvl1Ch_f5c)TWYW^~zg zkVLXCOyV)h*RO7ws7YLz3PTd{zA%X&O@$|G67&f%805c7y!xF|zlH`P7^U(DV&D;E z9<*wD5ItWXZ6tAP1#t`OhwD(um67BfTJTV+;6!$Ci(6S!@SHTcpv-%QBJNwNO_o#Dto+Ph14ENabA*huKAo!|dwAVRnJwu+*BRZ0kIg zY$X7OmNc5P26iIN zl{A_wX*5^TNcXsM0jdfS_<5WWfHZGO$s_(e(cylIIWLR4jKNBmF<416hLXGqL-Nn- z^DOeSB_usYp8(o{Nq5{FiVG_w9SK%zXkoRA2xLVUC<$gM1Vt*Dmvs zC}kVdM7%E0*1!Ak)6rHo0$3e02CHwzV0F(JqW%yavW3rj-qQGZs1+{f zu+rrmR=k`8u}W9s@h{{4=q%*LIx6zzax3r5> z3>$}!hc=2Qldn(Y`BPV1U@Ed!3ZL|BRHWj|7w6N*L#+juRLEL)Nrf7Q_GGVmhXx>n zXyH-Fs(;Fio`ur4A~F_I9;b`p@eJ*0$kF{kPX3SC~&P_Wia16 zB=Hk1ZrS$(c%f#vyBjn=DK*yy&xyYV&q8wbmLRb?^36c3QI z#StTcZT+0;mX42yTA|i^&hC$gT468n{EK}&)avm>UnSsHzw0wNQU>+q^RTbYz@{ z{BVReKyrYLJZ%u_Pk(zARly`vneq#1RrPwU`U|m%=~PpqV552I+mJL;l;q7?ZDPva z_;%XguWWxArI>|GCI3qjCr}d&z@BpG-U((i2NyWZo+;xndzOg9?6DvY+pXi@8}#Zh z`>!d}cXak5!gHMAC7cJ?JPojXY$HX`d!#estbs-H*Hd!t%DcwVOcJ8Uk4z1+tP0WaW{OrS*^I|DSH6_NzPkHHkA~ADV_lOwWg)50Cfc zX-Fopp3h3}K`Xxptp*-!3A{k!i>d?SPgQrw4g1{lbA={lmqc=Ew0gWMno5A6ugkgB z*JYKaE;N6n8Y9&Of=yCg80N74442A)aQ09tgWX>CnqZ1l283gVQW)3Uo-mR%dCW;-ia7ilc)EG{K#(oMUDny_ordZBf!_o9aN zLJmmNdZD(G^+Ha=L=BSfDE(_ZQ+|fe8=axQz`MIX$0WV;b)jtGcHXG8qSkm^VYSg7 z!X`gV(-5bp31kl?6UZL;B@ohZXp=zA)^i$pcmqpDv*U9}^pGA4=Rqrz2U#cZQh*2F zqf07I8}pz&49tU8To2|#1_V)`r-wl5ZsS$8l`LjZ{jaER#;aXNtC|!xitJqtCma#} zD8|I5Na_zJqQa>`!GNa*h)MLwVKK99&k|Qmq>W66uLjQiXYpN!JF(S8ZHfD_2 z?&+m=Pw#5?^w_nrq_%r{w#;&JIE~TwER9h4{S6Wm$a3E*FN<6Eo8wh%7sqzfkW!q2 zH(MNwEzUxw7H{Zi@#+Oy%-+&%YuFeRZRJZI6shA`QTF2cdzEINu2;7l)(?*Zq3X)& z)nwVwaK@r0e6psxd}npR<>zW`z|PqFjjjXP8rQaJyh+|wrBaj>jz*=9!`2(p z>s8xJqj6>-pRSM`3^J@qQ2#2K5xv@V;tMa&t9Bw&@e^akn;=nqQfesfCiHO`*9C8O zx6p!)jM{xx*LHM_8Fu808FuuG8FmDW8D*Oh-k%Z;IxE z&Q;>#!+Q$)UazVoyXQX$juAUt3*L76j#W`d^+ZSTVb?8Di-z_MgdQL9amDT>W@;s>%*>;1DcGwGliGG-^gNxN3OF;g zINqRbH9jfe^T8P#x@2a!xLOCV4pWhRt+JJZh`br)F+l{(gewIyD_gGRuwdJSL)gom z&mO|wp${V(dud(fVUO*c`33tJ*?b$Ut2*-8sOyl9UAou3CbU{M2)TQet9cT+_7}3= ztSqOu`u_eYa0d29SL4SUzV6i_D%pI+t4nk8*|g}WF6f*7HlL6SsQsp;Jc#;Sp+T>g7@Qwi7kSV+$%EES9<+|~Am+zd9>iQI=fTC*OB{LpZ_VR>D@qdV@?I-s zL+=AatGDo3tp&0=3slhfzz~gzGU0C<;ER&Le!`b*6R12m z+8ow`?iqyKgj+Bn_Ht~wxwcqyIW}uAhgpL;40}CcPms`I&=^i$#(~6ajtx4Qa0@2H zM2-#mmGQT>Es%FAkNUcFMMq{18WN(B*yl9B$DNC#PUR}6oteAz9uoPs@8~eM-uA_Fw5HboT2pQG{Qx>Rf6mXcjwE(y^0Jzm3+^P?5wFkG#gInFft?J-b z(UlhH(tKx!<~uty-`S!0&JN9Yc4)q{L-U;-n(yq;T;Hq7)a?Mc?~J9V5Fi;$-2p>$ z^5dd4jNG-b3BxF?q!}sXIQ0|5NtxfsIq}wBQjIm0K-NkESpzjI#Yl{-!Vbw@smTt; zU?S|8lL1yBNQT#D4PcBq!fq`ro3!R1#>TSYfOKoufMQxq7*K1xfLi+n)S57$)`|he zei$U6*aRg5YLxO%f8@FbE;MF)H`G9iZCaTEoSb84mVHwXl3=e?e#U^rh@Q{d(1Vze zX!IZ!WM|ETOEaKn#ZrWq2W>og5bF^}9<*`eL2J?c_YKE^Ex(`}%JO0x=D`*MSxX3n z9WK?KU4gK|HM;F6khOt8Hi87Q>I-C*7s#qEkX2kDtM&>3x&o|R?KF*1*xi!4tWjK(SY<|!S`jv^@}NGoDG(&97IE~UJtPPo;mfTz zZLQ~vVm}rsQWTOkisvK2DnEkzr3I&4Xe1?^Bo0Df%+_CUh-A0yGyOCwp zZ)90BG_tHY8d*_yB|`5Q)2EsrqgQ!30uoi+vGC|H5&QV{w!W%*s%AbtGGz}=_4?;% zCf8C-E%AVPY>o~Rv-1N?%C!i}8FO+L#FgvL@73_l>h6H>?;Dc1ErEN7B;Kr`EDpk( zx&R+&WyqVl0H11Q$eX$VpKWExo4NpB)(m-07V=vPiGW9jBpx;&+#s?X@rU*SoTVA= zHVH z@!Sy|yX2fGocL_D5jbi5DdvQHd9?5ikiQTud`GV)@ty>Z)g(Taz6+&SDe@Fu#B%N?|9QfP`^Ed{LWu&x`ClGO$M4Pdq373flH&5af$B zHl<+h>+I&j33&LCYZ#3D`FB9L*bOm59E$Tih(4ETH}as3F88AF=QPa!!VEXh)PmQf z3X1)vqTm-(f1%8^TGqYwySseUT@O{h5!=5*URk-gCY>TTf4(>tXF|5dMzcZ7i+ zN}@qh?XnM%x3)~_@6(59enhWw_lJCDgk~T&MQ9q5x7@P6Ujw1FoM7GY=oKu=zToe`Wa zy$CxC3pNE7VNY?i5Ou9aO`x+8wm0a`(I_<3qs_2Nyo5u{#79K5W0t=pwu>so;pa#~ff)J|^OOfP2BMP5?LExtK7*5+K# z&AEu1a}l$(W3OT<%gCjh!dF>ka?aA>@i`aMJzHN$U#ziwxn9q7QM$8g4th0tPf?z5 zcD#w?nq2fKth@SAS(;ryIDL|Izc%{aFAD<8Jnd;p{%C?AHz>r~n)Is^D-M24+!2{6 zn+EhPD#2y3jtxJgy`^#E=9#OR_?gZFBh?+KZLz*2H~sNaF1Z25wox0^HNekR>d@S6Uge zgatTTR}!HrIei}B2Q|Z~wTHw^;-25*PM-(ZtQl_F4UH4sMAUlG8w)@F+G|6Uc#s6w zh6RB>mH1B#Niaf23)+zIwG)oTYja7f9jDDl9I($w$HTQxR4ap%eyZZq?I3ZyNOfpH zf+!F^$ZfIc4UmL}a6$gOa`}_INW4FRa>lqOKA*sTO=2wi`lj)k#N!e;QIo*m($Hjd zK8_Y}Mf5bgq1b}-zr+vN0|Yaub{aS$PD?rO95q9$R=7%}W79ZEMsbT3tUx z1Fo{YfF=Z?V}m9NUAHFI7=(J&Hb^2)YJ+4%lJ0nPIC=h99HIzB;e}+7Qr>r+Q_C)ZciZF-yK$`JC97G;QNj236cO&J+2QhkBy%h~+Y zmF6%TDZ|yhk1pqK*0#7i)gPtbq@qpvu)fKi1E$E`dKIVI3S64(w<}v?jSqBip&CA} znfw-7Xr@=aSD9dz>64YEKLHch0uzPo>dOW3oH~J50vu)+w+o(IZPA0aIS*2|y%yShha#L(%ljW#&hd{P{fozKltYa|^ zZMacf-r(Mx=^Zm{dojbd8Z)}|dx`FB(6)?Vxqj2OJ>jw~31r*oRn(4$OI@zFV!g`1 zwGkS&%886wj%Sx|1T1hoJGF9MpmsUqQs2trEi5<9urgFKdb@vbRIw>T-?sJxw?+iF zmIM#2H2!w9`yVn!bhq{IKSp%4mGx0;*o?tiIAgG;&KMfj4rGUH;q3I?jT73fa5;yS zF6Xe~qOe6IrOpS}B~H-l#~$mrn|F0M2>Y1ZYWxtaX=E$XdQveNzWU2GPQi zz*YYm4LwHBQv6geSEf``Hht6|nOSFM(zxmS@2WruCT&@x3PjLdIv*+#2$HM((%Gv? ze1GKI06C+O8y>92ymVG<8l zP#b4u%{6Db-WV|{{kT@gqZGdEw9Rv#1q`z*L)1|Wgt=v=b zky|__Pq{+Q>&)LDw?%?wfbikbtLI%~Zo^{J)$@+1s+Z0Ciwse_dNqmvn!vG|#QPH1 zuSwjW!10;{&X77MqGzzVfRoVy7+b&<*}A0g7_SC-7RcHC3(H`Hi~*A%LB?RmfQ%v7 zE&X*HL9Ubef6lF?|B{Jok85XifkubqDkBAMyfgY%PG~2ATEd4SSI_%~D_0#fJx`AI zhQ!5E5|VBxv%ayK1YQ?DNP4C4^Um00*DY7)eb@Ilgz zg>SMZK{yE?Bt2O8R%G2-_^d|-3MNZ`?FsGpit7q_*uXz50dTK6al&WRB$FTGdq}uW zd;z&Px>inTCy`tmUroZDQWPB?6GxiuN%}y!2QU6e#rmXPr7OKb8+(ghOT9}bd6eLq zg+1lpru9t96BS)2v=icgrD8ZflbCh`5#Tqw$3a?w&%b+MK>5le2$OKu8PHUBymYCwDo2q|E~zku@aCoB+Gdlns*=#EcD%@!`c!>JUB-zn&W?BgepxmBKT+cu z$a@ufgxn)bbQ*O5I=*%XMt=Ua?ZO!M}n%%jj`qjDz> z`jamT6>u%yUnW+N&9%tZuil}N`~5eCTF0s@Gb>cpuN$tyz%U-Gg1PX6)>!owt?4pt zudsn$Vk(RQc};~ez%nf`23XeaF`$F9V+>fKnqC++o`rm}LT(I@$JAWkme+k{47kIe z{acfda~@IcoYOI&#b+bRrPpfR-=){JvSw-bZ*sm{IhHyG*qXn`)_kkXz2@FD9)|(j z&|~spz!tF@O~$~%oZTYlieVYJk}fp;GlIk2;3AL z+hnr}PMt;*To;gNyy9&$&eSY-+aI_&Gy_+m+fKx)V3sa&YHsq%d@?mw4Yj_bdM$R| zoT<=xbEZP)wM+|iUd!6uc{?~eI`3Om(+@_CXCd!VsH^jmkMX7R4wu?_4{F`-(rey% z$@w43vDD6MYhJYT+J=_Zc`-WX?C!jlv)Fkp(*j+^bzaziPHolQdEr3LC3jw$;JScB zu1g-)4V{#v+#&wjJZv$s)Z5+= z$SwPTu7muo2yKI0^~S&@vx>umM`_|)dX-@T^4k5>w(ZB2JpD~T(~uvH&~=bsh|spT zyd@OaeSm`7Aot%5blo%G7RY<`Dkro-eqA9iEQw41TPzB>{_O$sd?cQ%pqS{nO5PTs z>t6B8p~yh5((1dE{78a+UHy2EUWMy~l7|i=#x}?Y74l+`_)_G%ZlDqJvwD@<9#oRx z5hzq^{}Kxyi#v)lki>)>00l{PE*58sv6w>n&ti=mAgM-nG9jBaZYb7>gp`ndTSy9v zVU87cXOb)wkf%=|8)Zv7JJwD%ZKaZv$JSEynqLguBG$eki8BXAx5vn6);P2w)r+;k=7P#{xiouwBl)dyB%k^7Y;d3XZXL(zY&Y$&_tq#5+(A*K5U zlak|_Jg?>k@TPcAnEAKto-lKs4(Wuw`-O`res2oxLz#z~R>1`FP&Xt-7CrCF$~wzl zq?WuiSroES_EhFaSN0k$^PE%`vQc(^kK3nf}uk#>xyDuFK+I!I6$2?dV9S&tC??q=} z_`EtLG%aZN%3}VlMTaqXQhz49OQK!R^5pC&BH(bCPJp&G7*VeC;_& zFpcqbl4x{|qgj{iFU@}oaN*iC$-UwC)m3-K-m(o6mtF2g|4Df_S_Vl+H8%SL*Z>|M zcK<1QSDYu`0Lgs$5?`xq$G2-7R(Wj{VTvs$6+3|r%l~#^2j#_W3@t++8*%b71o8Il zH`7hFK@xQ;=OH<5&d4cHE+@r^PiX}5H5#hR5Zwm$GODoMU_|@d4zmmi=w2*AMwEbJ zbV#u*Bx8GFF|!Og?L<&&wfBi-)XJohyUU1iMKP9N%aDMg+{#9jfMSe&%aDMgED6Ph zkPMz91_i~wbTD+_We7!4?%U#SNS30@sFkAcimTaekjw=}v_HkTy(~khV59VRMb+ok zz61(oXXdTU%HDwFoB8BX5TE?oXlI7PTG zg?3HRu68NJZD=H+Db&1o$^AfXR7=u%lP(9Y*K257enMM{!MO2Vs5?g^7>pv^_(n1q zg}6nIWH5Ud9H}t(OLoCV5}WlE3xbgfQ;6HG>!Ch4&+je8RTSe^J5t*e;zk?VUUH04 zjGOF8ZBvL_?1*hsjN5T&dx--A_ipaGBMENr%Oe%Gx73jeb2nt~bELxdJ{Srw(O{)J z<_Lq4y~P;7yL}nKt545Kiog{s!F~qcW}Um zy ze2-=)5kOcpmkmWOTT$|Ptd=?DTfFYOaAdOy*}+COTanV{5%I}g54b;v<yNaKvM@M{b5T-jkHajGDkq-%>1qFh}cuJ^%SK zXOrEVR7;8axc)N2y|Be4OURB&iC-jFwaE4^YMQ}R+g4}F}4!k6L zj-k!5^m`iQYW-0_9!feUJL=PK)E93}vLD`X3SQv%L&`5!H{mbSJZscq|^kqTQcjwrbG_lU)9WQ-)b z4WE$;+ZY>B@I3ZPh>b_t`6kNvO-&$3VrUsZuQkJNgrC=J*oiPUm;@??$Ow&;LS%&E zHbg`q>v(}m?i`_!lJnXauH^Uhg@0OS0FsgGc>Kv6Cwb7C-h zjGM=^pQ77pg%rvmw%ksMQ-V?;$c7$=2UZW^vswsL(Bbd^9q_Q|aCkrh#iTH5;bVay z8=4+oL{qDy``jiAVhao+pI&3Nbti1BvA>!f)fgsU9YfLKy|JL_k%Fc-=9=DE(DXN$ z@5Wry8w;8q88Q0g$u&1U+gzh54vZN#4r7K@FlJaaV+Kyee=!5ya9PZ-ZfpKD_-UPV zvI{BCr9v{}tx5vfaiCcPLjk%r^S~G; zq$;blKLz*Mrs`9>k4o@Ocou@ty~* zimNOjX{)w-g4rr9&#PLM1w!Eu>d!I)S#<@n$_j+4pVUokfvlneq2`6U{V0%CQXs3* zM72_XT0;q^kmV|+DYqs*NIMJpasBN}jCyK7f?h78$jJeRy2aZ)zHR5CIlE52LUd;txvW*Kw(^yHM)R0mfoTb+nX!CE0VKM`Gw?gjZ z>6_%^kfh(9SRoH7w6Yq?NAAwuBi!_`=jac$a>5Mce^!W!NlzzM$gK)BDz+NAR}ZS{ zm`cE}$g8^vyi_Y4L;YaNqjPaV>OAB3GCM- z&WK)^8?Q-Rk-&+X1fG!Ng(jn0aDjj;q7OchX3Yl%B>q4_5gqd55!wjZaNpiNxbKl_ zZZXB)JtXjf)Cbvc$KL!^oY09Yj83PLL4z)JjjAnBJ{Zm*4XqT;vyyJx({5clE--uY z23ZIIcjHAat}@CXA5q}gpy|V|Ul0=XS~;KtlE9GKAdkdwknb>(AXbDAlAbN6g!W@M zCwzntlFlxCRqffY+o!rsxAVR+VfX}&x;m03C2t+tYydRC@0YT8< z2O$p~&uUdvS%`}j6$v3`c&T=SmHGg+i)EhIK~9G;TP7GBMqnen!d z=?-Ij<40S%GIJ?t?=TFKKbh!PWr3*vgQDtpPsR z%8-Mt0Um5+$k*TidIzGI_YFy$qo9a+pPv*1JVrCz%^&)rh+S4g)9<{o@cQh**p$5M zstK+Q3j)11@gE+Nc!Pq`f(I0!U;8Gj(!T|###M#)cW4wyMF*nyai9lD;5?ZTLSCRAg@x$YeQmV z9y~i#A4q+B_mIFbVjakaj|%s5KZ@Z6`k>r;=}|N-5Dimd;Rfxd z#_>e$FcDt(Zx%9$LO{5C4PtQ>jSpu*;uwh$dc5l~1PT3HR(p^?u09qgK@vT_2@>04 zEbJbuN$g66A&D|yn8cl_aK9$;-%?>nqR|&7@t#z8ye9F{R2Y(|^@T|sONA$D5`U8l zLlWJ-Fo}Oog(qtgYf@-J(hGcH66eNH-@T$HLDvv#L(&VJ@1Ti!@e^c<@WKi>bBpBhORoic*iOT$AmY>Ei!nQGQ2O^TCy`wQ|iBJz(b9fMY z{Ajdg;U?=Q^Uu_w^T(P)=#5(H`KffF^UGwOQe34|Q|855)=kj6Ci5uw0&RR!rt-UG zGEe#^6&Jf28~P;KFH^RaQdmz52YTf~HM~PJnTZsJq+azpWrDdd3C)>&bXbx56V%1E zP}f+6G*`wWCAQg`N=)0A!gQl$8ZR`LeRX;wGL?QFoyunZD;DI>fAw1}QlT~b;_V%E z`*TM-*DAH90Z{L9Rzr*&i>-#Zr7g4?QjyfBXX|x^OwQeboHf8X(djdg#6je3Xy-|p zBvqA`!$A^&4-809!^IAqY`&Z+ZI|9Vwk@Ref6@15cs0b0y(}(y<-=k2$3=(n(_+({ zn2sM79banAQnqy-|Fsf;TPeV;B;ZyWa4SbjTZzQ(2ZmN04_a9~Xa(`0mBNFm$(%w6 zem)xMiB1af($9!bbbd##Yg?O)*tWIah{dg)M=YNE0R(^0NyLF2hy7RscuuR92d%Ik zq`~}J5aB@SyrBbwf(QpnPk9{}6ht^M$eRX1gmjMB7CJ^c{cDSDUN*O^{sP&i3tM0` zTU9iS`DNW19vY*02CA50g@_qel$c=!iWy0aHpMH2Jg_FWe%q=*wmpGtONBW@ucCH3 zb7>gut$4K#-drVyatBUiY-=3bLf@IBKCZ=j`xWmk@)n|7U$u=SDSZ|BK^2uUjKtPv z;MQ>9)_UMeZP%$Xw2gYuw&+3IoClZM)`;Vem1@M|R{jx-TTMqSzEqot0gso4sNUe30Dm=>l{}J~l@OItQz5l-V+{v*WZU#c)q=sey!jyzCltN!Z$pcDTxOQTi*m2xH zg)+31j6f2fW4}U+TWE1`3Mr4U&D0pma2Zlen9SG!4Fp=!TLO8GV7twGw_+I#B^i81G_T3bKYbU37~@cWimX1}6o-C1&2kChzO zDJ4f?_Y7dn4Xz5H>{>&9SfLqtt-}3^Ci#ykzEW=7;;(30O+=3Exo*1F58lo{HS6U`YKRa_`4FQhfS zzfvZy5S2&mO>;vbseCFJp2Q4)(MCG8O2yDIiB)UVEXW_OA2bUDNh(j4CR#F2jC|`L ze^()yitgx>dA@=Yt9SUHvjTWcr$8Py0DQ1hAP*Y=zR)ReZyq#s-QM3 zzoMzYF`Bw7ICSlb#S>gD+7#FMm}!&Wb~E%Dkhoa zt8=ZdoH(4tNRrQOAaR+r0LieDUz40{$>2rdgJhHmUoQ?h94mZ~3_9VPiX#wT3m@c{ zVl2q7Vv@oA!UxH)6nXNim^uWB2;qZdL<*n$DyH%gF~V2I%eiS}1%5V?|i%xgsD|dxvJLJy-5p%KtI?ZR;<1&sl=GT2_w-_*!Z0WU6)w z>c52f3biZijLITpqA8im@iq+;X+_fXEXO;LN>G-^Jd|wmi;>~X$-+~U4g2jJ(^T6z z;7y+3V>r*#Tl8Kt_m-9|6<#p%pnb#0gKVmE4fY^|ossTA`{I!YSr@R^?!i3xJUuzt zlPQdI&5B}u%Ev8>Vjx$dx&PP+q|b{$QYbft&&9Y1$d8$#@G@nppKeC!6J8iZ$?+oH1GGe}93n;W#?fpPKS|lrF*hK0|BI3BP<*1Y zB>^DcA1#35|5P?PtH3_PR7sSh9={5`~26m#rY{j?-X zNmn&;dQ?2Jj6raQo|-+RDT+B!`>4!)c`#7^1btUB=ktxqJ%abMmT%JZNEdqPG&SX- zl=Sc}mp?R&GSYbLm{YOC@eFOt9yY z=vAU_eM-NgTzWiFen=lhyfE4w54Z0QCga4UA>)D5k~jx?2ph$mnlwzg(B|;JU)0&1 z5ik41kAL@6(=d7oU2uYs&;Tbea2L3B7Pxf|`0cwxU$GK6WX zT9y+x53I%>wCZ}$>gqwOs0Xc<9=v^b=o%_|(CX(wR2Y?_9=gbB7ihwiDG(&?bi3B_ zmGGWr{$7DKgGjVS5XhQf%toxS#;kt(?qDX&DjmY83>JYPiK8(a8RZFAX1yV9+*kj- z5^GY=X^rYZYgP|hV|noQ-L4N!g9$u{5zyF!fp7F*tBZWhT}IXuZDfh~Jp-$pRJE!J zR8eftprY8G!R@<4S5ZtVqZSSo2r|>O{P`TKv(?g_w}P6C7Kd4t9AQ)?9<*vnWwgRQ0zsmvuX=Er zZZ0+5T+wu~qUq*R)6Er47i%%OSc%EarKX!Jnl280mZsL9@nH?R;=)*9qcav*6=Q)_ zG!|I5#scfwSb*AiGZt7q^Lx$xdO7CyP2OyPe7N4WaBPcJ4&3SnZaWH2Kk*5;?PmT6 z%yv_cg|S_g_wur1VQh!HrMBDMQrr1%sa2s{Y84rl|FPP>(Hm>`YK4;AzRHNatxpDr zzdzJA@e&5cB_E0u=G_h(yzU$)(R+B3tt7xy-cfk zkPH#gZQ7b|HUlsrfuN_&kgZv4zOY!{+MZ20J<$I@dnIefqrHwlL zNJ7bZhxv2VA(Jjj+78%`dydrTh0PDF?YF%$a@9>hv)0C>@ppHw%{1$poVd3WuN{~p`+$Ah*<9<+V(pzW0hhj;6)It{Fe206!eKwfIG%?o53 z7sxg(kZm|cC=K5=HoT#1cthFnhO*%eWy8gH)0X8hZMIBPmF6m+ z8_}oQ^0D^0(J20M+2=ktq6QOGcWPtEGgEa-tx~HkkjekQF}V;QZXl1ENN(R9I_mgp z6A1%$)I<^_+*4!aQJT)my8`|*CVh-XMhw1p=sA*ONv{{SXqW@yK8Hjn+J*$F;xC~@Pb|hy-x9@hH zY#J^AS&<#tSy8By{!TXc*N#3`)5>vd6V3H#qrDf)SKgdn=BW(NR$&MgVf*?RfwT(B z7qD_{=R?=XkJH2VYF$9O9u3I6SwY!jxy_%-@E!#|nYfn*WPaG;mKP-f*6Qtf5F;;2 z0zA4?ATLS+{86VsPGtaisTN2#_iQ8cw~2etHg{ARz&o_Sy+H|0bhz8{8Pd#xK=;b-^#^25S1?-8#*~*H8Z>`Lp2~plTa5t`b4~O;?(-lSTqmDOLw+@S z@sf#_%&KccKYGn2lP#GCC9v0$IX{6@Et%&haJnUfKSbtCbk186=WO)E-P2ypHGMLt z#XFg^As-x}O^__oMeDuWZr>fWI3YP@?=~_FbumT79ecNhs-3^tl!obF8wdJ&NJiqS zIK}nlfTcLZRAG4+?$t^XjNJ-0ETzKjyF+(U*Vo&wS6;D`n}y{a^-!FL)-6`{4jx@}%{smYdf>GMLCf>giWFE9?dJsKNO0!FO*>!KS{;`hfzsRT6hik1fQtiqd zA)g>oi&RD=bxZsQpxmpq@fkU2;Szb5l{}+v$T~%qU3m=U(*+Ar{5R1&(=YHKq1c5 zCI8{X3VE|aZtbdv^|JqXvA%UEdjXJ_DTHA1&rPh5&sQiDY&8lO&7WuwcqdY(kJ7T6 zN;4KSg};_9?Gcp2 zddbXb#7XsjOXj`_+}e_Pd;+g*$y^jcSpk#z69r|N8CJjmf2IZQ0u23^5j(ZD0qxB~ z{QkNItp~}FX0`%)dW`ptke5Xfa}b#drGvufMn8~baurZmFrsc4`%;Hnq;1<_S&k7%S>VeN+9}^ znqFs{7OvQi5^n7}&I!JBkEn3#8)g7fnR@6lq2bt|8Q5;H>{Znm%5uSkBw9ooBx75? z6q}3#od6O(NQS%c_2Sqkri2fY89?}^;&ecm2_Gbrg78hp8G^_YK1k*X;hSm65RAeH z$rK@cv&DQNe0Z1Wbk>6=7R6GKgr(FZ2$&cIf@F@6ie+3BR{^(PWX*`rNwXCr5aHnF zg8|Mb&G>e`sCz zvD2`{BzpgwHa;Uu$%|z%Nj?pUVzCxx;O}U~?`xWU8U=Jfi==Cih&@RfJE+B^Yy4Op zduhe6u3Ry!D_0D~93oy&QHYeV)A=PPvkkA^@T_*kxhG%0I@HS_Q`u+gZcx}K>JGb3 z=VP9nJ1q9X5VjrOK(=jx+xEb1o8YFon6>Rn#NRxyje5|w=t0|@2cvL9RNC6tue7zV zUukP!ztYyezG)(6D{Wm=QVF!uA=3rh zYR5L}kR9ZaR^|5Omq>$A_~yo~7_6B%SK}F~5Oo-W)@I<=aNyQ@;LB~-k44+42W^WU zw9R>NjJAI9Ls>40?w_@%bnF*Dl!vqxj(WKwJ5a_NwB)eXEjg^IOOBv<{V(=dr7-PAs;iSYX?W1-8{#U`>+0O=}Gk z4wT89$B8W617)o7!htebHFKcM72WFA#^FGjta>u}+C;hoWsD$erEttkCP=&g?EF9( zYr$nzvesQzC2RSK<|du!m=r6olr_B*H1wDaD|dcP^H^m{lFCKugzo@*W<_sY@yoSC zbWCE^8Z`^@n{_@VoZcyr=cEAZ zI|cHb6yTYi0(nmQrwZ)UROY~a12V7caLeORfY)n*yIMiNIbvyn`c7S_iX|XPy(P$e zB=W6;WNqs^WSt`SMBzbGvAt7zYCWDJmAga8{}s(G2g;DSF1ls?dzJjx1VJ7W4JHT5 zkU2SllP#IYCa~9%d1?ZuS~57p--MIF=KhYG4951i*LKv2f)#^#$eQQB+_#iKeu^*!BA&(TQmS#Aoq98Gu)+6ZJqDvdNF}V=P=JzJUC*=vp~YhD>tp7VFyV zQ>>50nPZEMdAD=&TJ6>wHIDfOXiYy-sPhV~JJa;#FqZm(GKBT} zRDk2XNcK(0e<*gT*llp_Q~Xh7%XUqGK0aE4lX8c$OzL$|E|QR}PB>78Jj;&kKp7xb zdxvJLy-^3s*w&A3t{8HljP2A~&pG@+8Qa+tJwJ!Xm!;QTh^`|nf|AcL0XkH(ff)%@+GZ2)-0LAK{>K))d??aT`odD zRgt7((W~@k|8<&Hj69tQX&SnN4EJd(FP$UIVQ)&6vacumV}!&y`3druHMIleQRyVL%NSLuf;GZn=B8Em)qbsA zYqqf}TlV)mVIw)JI`lr z;z6sc2dxe=RLws+{6DnAz2?eZOJ-fvVgV8@WR{a3OgN#}qR9>M(6|LiMrh=<3i`&Z zijmu@84IkcvB2myB73}QhNg3JnZ2kvPV@mm;ThR%k&>4DA8JkcFi;E->VRRKPpON1Wnf)92Z?n%hqAhzLs`d|F|+!`fjnDNx$>T?YX708?uL!K{;$PleRXk+ zSfqYGNx5`(012@^^P_TU44t1PUb83+~>^J z_AC}4{wwO6sphhMO-l|NMfPD0C!8*v7`?XvGBe=LLB)VO2XvF@kp&|peir?A4k|X? zIjGol=b&QKodc9cJufq<5U5G{EzQ!R?m@Xbe4U=sEpRIu+)8(^Ub}w}QZr>9+c}sy zVXl3K8A!e6vbok8L;MoBZL_gp%ytj0wR`BWb`On18%t`thn8!1>4?)9eg7ba#{wiK zkh>SF{9QDT<7dC`4(ByJO$0 zGw1JV@$YNu?($dtRQ|1Lflzftb2&w}`_5QM!Y8Yn(=KdIJncA@28=W*er{H5CAtA* zCC+ywUL@aaArvKrBNOU4tlW@)wrcylXqZNksVAO#vYP|#6h4H_c6kV!RbU94Rc8pBRmtX2@npTI%gY9+ z^QO4SSb$tqXsWsJqfPwC{Fu1TSb#iUp}0J5#z29l~ZkHiQkON$XvaKGW=&K`~6;I^<*TXH>nl-9Y2GRg)HBy~@22F+Cm1~Y@^gzfyBa6p#5-@WB{ z{v#@}EI*5@Eu0a1w*ivID{o7tdWq?Rt|?_5*!wLNN;)Tfy-W_FuN-4v@QRtN!0(9@wN)=ppUuSmNuUS^*QW2CuT-C;@8f>rC zj{ATi^EL%#yh465LK`7h#}Hb8oR8sm;kK5{n#7md4^-If`#IXE2}IoWvCHcq>5@D$ zENfCPF>SU?GmT{$cKqHU1*aTCk)5t*CC?Z9^6Yf`_Ep6YJE~yJ1w{-8%xG)_S+a`s*OSrqD^U z0?$X*GJgSg>*L1RZP!SVN^P7gN zGV#b!+)>z>$}ZayTU#>7sMMWo_zBW~(VEqjPsy~!DpZqH8R1sauuwUq=vY1w=L$>B z7yQ%BW%UtmyO0a6jqt10GM|VRIt9 zH$+2)IIt}b{anD zaeTG5OFGQocZ>dhht?P|R>C+&1`%bNR_-W15s zzZvL!$cMcJXba?@E(S<$P4@J!(ahyM1!g%R2U`SA#y|7j(^9H9ls-+UXgwm?q5 z9cTgan-Mx6viA#-cz3Ak z`EJt80Zql+kA7b$zd%!gAm0|DEs!6G(E0zSKA4O=(><2>W zLp1e0Bl9=~rRpjTL;_NvP_g@$s9GDNY8@msrG?$q7u?c7I5O5=4@n?O074?rjSb$* zt@nl+@@xr`%F>>Gz)JD#-VCkXhaO{!F(QwVahMFN4h^ey0vF>DtZ#nX46)>n$Xs zPWX28$q=``G8rP*bCUV4hO_4+^TQbK3y>>QZ13okA;x`WGDNv=h73{eImr<6o|6p0 z?>Wg3{+^Qz1Hf~VVKjJ7GK8(?B$N4XN5%I)cvbKiY%|S&{LRWp(hrQ8Yp6=ixv4DJO;T9RJgR_Tzd{b;TA_*5H`xS4F88)GP!IB@mze-lv}Y%ctA z4(LgUm`-@=iQ0>esW*`HMs%5*;aYKmMz0uXuNY{e1$b17^}X@(@O`~Z$a>^_o$$F# z2z0GNdo*>g(rlGiX~=Wgkk2{g978E_O&;HtmymT_Fa9E4Le_m>Nv<2x-VJ&sVBEM( z6^6mDr?IiOZ$q}W`{K-p@vxMc3nKJ}j>NETq*d8PkmxQi*%;@^ia}uP)r*DW1%SO*h=BP9^?C%q- ztQUQCGF(1=buwH&Jtvtg)|dKZxF~u~GF%kBOfp2W=On{g&~uU@ygerwR)wCE458>b zt=Gd|vqcXkPmHAdkaHLI1VOWLN;waba5&9fPiN$87rEp(Dtq=7zzoobVN~V*MFuA% zw=(iWZBFVQ`EO(jR7xywRL-?=cM$!wQ7Zi;M$d>hHs?WJu8@2LAYI<-|7Jbinm;5| zLr~=tdT*p!@0K4?F#`5SOx=z)lxCe0_ zBvHpK?F%c`(toTMJ~yck zWKv(oM`2XqDi_){Rfn}pC9a2Kb(%`~Mb!Nsm)x4=4}6BT{e`y%({V8kZOic_%c)Ey z?)S#(IM?c5(jCMxtW6cJ)ni$kN?g^)>a@Moj#Zf}Fk7Evb(_0n?$ySsOeHShZh-s9 zK4D@xex@21@3GpZ5|{4K_Ob(%YFxI*YMV-2w8w1QUf9QK+g`uNs%)>^q4F~4F?)?4 zt7Ut69;-4})|q`_RvD|Zy?~CTbM3l1#x!WJt7CQCUjN3b91NBI9IklypY+=XTBQI+{G`s({Z+>C~<%P||r{>TAw*IsQerC60_7 zhkSKbS_oW}UiI40?<3tW6z-aPPP1!H-V}q2(pQh(kKixVxyjfrLk+M^iXWsF2w4mfc%CWlHHJ>R7{4gy}&4ZjXqIt@=!>=2X()}t) z-em5W`>F$d=Us}~e;&d{F}u*x=92jAsyp1DJ@V&lCydhP=mXEgGA?DIh$WJ|BM=4c zng@NLJ|3;BMky<$tj~GCQT#~VB+uBqFVq4Q|F*In(VUxkT$v~&J*>mD!6{D>>AYiE zr(x0I*rY8TsvHtMz8svD-;fSd%&y(M@$9ZSw(wZal^m3OLsyG+LsR-4ZE}}NMA?c%%g753PwB8Vs4f zQv#(d8VfNLuq+&+55=$4&8}`|L0KMFw55n8;E;AG{+zyQ&}|2l-JME16tP+y(hkL} z3%l)rvhb^iET!z%AdzC}umP;`N~O=)Y&^@`x+5oIHEZ&GP(;i{5sqFuQ6ZelY%t3< zyA4r+YJvCjJzBKkB#qc05vb<+G1{%UevInY_0l2hP=RW08l#cqicu79;)R3k-2n1t2nGQ%BIpNo2*e>O=}g0S)(|tw83U(OiJ0%v=IN zqP)c1jg^qNpw#{XtG!6G%6n;6dk>cCUtrZ2c~*O0bvf!=<)z~8+B~qk(A9HVZ9Qo9 z^3#=7lfwe>| zu>Ow)HU?sWwMs0omWc&jJGgJ1@_&!jWjqstJR^r>`7Xa1$5I#OYj4&@i&vmGVS0q=Nc&5v}}e4$6K z<$P;Z>XweuZobg2TX&SAiwWhF*SUZadH?!&Paf8OSG@YvK&W z^$46iGnbqoDPK3bC%bD3oB0N;sXS;cgmgP+<ATLivIc6Y+pgAjr&Wi*ad{S#2>ct#}?I$}ILP zR$Gj(ZSyq4b6TrO+ZCHF_N~o?FB(LN>E>#41+9JGVQV!-EqTu#bN;qIrOpIeuAGW(?kH^2tzs4Ku9`3zN=YBm`}yeN z!HNpiSMm4PM#BEu%6Na#bKj8daLVHrM!$T9`+9v6e~5ZYAlp%atfd9AmJ}#8q|`+C zmWp3iq4`GJluwT!dkVSBfjbeA{9Iy%JW?U|$*~;XI}q--EA-LC4f!#J5KR7)i52p5 z3T1+=MnRunQ%2r-kd-nvW8ex@+Uz_lPCjX#m{`V7dZRiGi<_7Fw%Z;=2htUebLOFI zPqCUX+^SQK;}Ual%Mn_b9MszEt!iGxV0s7RRXVU$t*_j zs>K1B4=X4)FN^XU5D#bpZqx$zD^AciMNEG5SRYttGsRLIJWtb)hrO-HkY=_5x+;Eb zyb4cmdq9h(iEJ#{sD8%UqstqwSPbcABZU+Gk5GCn_@?7zK#&O^BvXR$&9r2QJK=-8F$SyrdN zQuuHsf#|FUP1uR0Ad|<>!{f{WA`Fu0Kq}hk6D|`L{+GM?^=^Dl8m6DqPm-w`h;Wec zvnS361VP3RL=1R-tF8yp_qa4Nmx>YMeuIju?A`Mz=@hMXda7L+U%jTG7O4yo>imk< zb-&(ydF4lNro?9G{QzxzMt))768RM>@~10aS;RVvQ~VHRTOrlw?s4MWJ?_~8{px55 zO|w}U(lvfvd5vFJUgL|YV4``Hib7;1E@tEA6*ngpCa2nkxg0`oIR6tHUkaZE?-Jz%AVG>fNrq%fOAqJ^wDWAHDI z@_Lt8fB%4+t+(w9RXzA`n)y)11kNK$=f230SrP z!hKmkn&X@oE6H7r+|qG>#?7lhwsC=M(*n^9X^0OReOxs7hEm*yQe1J9k;1KMF4u13 z*l;S5zePYe-pq=uSF16Xv?fH)AgNmZx)k1=` z^3!E9b5Bn8dfa%?0I9p%@bvpt6e1-;m*RaVwyJ{JDjB|e=m-)11AQ_WS{CpJ`tJ8% z&r+_l6Zeh*nZAO7TYeN4;EkOEIj{}j)=q)^C@jE~4$dIz!N;`#|3eF;n~MW77bNa* zp8@bxEpY28Xd=Z;BG75%i3JIXKiL;7?kz}$G_xSk#}fa6KAC@3Fj~;Yl$RbFs{C~^ zkl%F_EW`k#Ma1ohF@PIANCuxyG#erDs_^X}kRcU5$lr)wzha^#^GC^tGN@$X18{A( zV6p}Hhi*Zy1^7v~V5$W;B{|r&G2H^-XfdxVm}vpRpNISbi6TlJ=ki>)3WWHm{5(tvnODfus6|Ro^ zCBsco(+~@!*=-IGVIqFr69bnC$%9rS52Dhasrh_Z*p9e+pO5HRxk*!D+|hr9)_Ps4 zT^)A~wLY6_%cBIX^#)DlM?e?*GqoQ9bt`og{ECWjzruTk-2af@uejLO_TS|x{&!_t zA(i$12k6_QB>a-D$y~j zXUxcM#$Z~g-LWxGI6f|1qweBDN1v*`zEacK=E88mGr$XDFsy?lJ|b^NXUWKts6jAp zlMuM0PX-D1a^Ote&J!pIBLEA+S+WvXacFu!& zPb^K(xE~(t1#K$vN#K|-X#ZSiMOd4R*|xRbnANSF$EkmvCTV@+I`PDNw$&V!X$ zS?XK6cuuRW2dxes%zI+#O3!x0^V+hW?dVr}wxiaw9ktgdcl0YgtDXPZ?H|4Sf_}#& zTaS>OQ>icDJ=TsqVWr2<)_q-pAUSoC+SbCtYV9kK)j^-%oAcmu+ZuC5w7nX$y6yj%)vcyuR$s17#DKr}33^D3Nn5}8DR)R)^Rl8n z?ZhkZXl9Ogzdb3xIceQla#)X*9M&l%M`8C2V9edAV^6m5Azq=->d6SMK7bA=%QW@g7<@chmo;%l)NxnMQ`pSvJSqvKaUJ??QNehsSpkA|W zG7cxaD149%DB7$50ddEd{c3-;cMZ8d`^soZPP6o+%J5Pj6jh$(~=<~gb(s9 zN#1NR5`}M82Vfdt#XRb_-=h86F4wy5 zou%gvd1r~RUQ_{&*S)hu{`%OZb+z^>-m7fx7Y}vM9_T%zB{->HR+jH4R!Ej1GvYD# z%kJb^U#yUqsb$&bihx+w9hxocsy_;^3fb0=Zm!(l%v{twWNlaroiumGnv3LDXOC}f zr`CE--?5z81CHNz_C(K5hx006u9nr~0lrpRB#AD0)lPw{Z~ZjU9H$Ej78I3hRgI|} zZ_`L3tx4)}bRVe%b%Kk!m{7G`|9K}!!{1PoreE{JH z9EK=CF()$C4`-v4bcH*n()D839AoAW-!W2GiunzMqcY#+kwE!&{f&g2&$lQanz}<2 zDSwgj9qHmu?o`xx%0(&Z;ax6&m?CAQ@i<1OUx(v=Yg_g>MsR+hVOXCj|E$Ux;u4BK zr);&bpzN#4W5NQMi7bT$vl++!4e0}C_L0`Zf(h?kx*!}PjN>+oCwuS9|))8hoX~|<VEL(Fe4HbdArwIu)XmD#;a7>Afz?Wf?$bxMyP#ekf7swCjWG|1o+>@sT@|aOpTKfms zkV(gbWRhWngwn79FAW>;(y-c-_l5p*R-|v#TGfN4NrQyaqyfjIgde(-$JAbUG~zM{ z?2Pf`=^v)!r+x&2LC z0$~-RMA$l+kmxkJ08ftUJP>Z!OwpbZs zn@dA&E)BK0VyMMsjWHWb@ewJ8V)VoUYlc{0jS&m1Nn(LDOf0Zb6bo!5#R6-lSb(tz zp;%zUsJ2b>BwYrw2O@7`L!O}%l7!^G0U6eW`YP0!j6IC#nXLgmXpQGVYdFMOD|lvW z0S}@*@qq-ZeEtBOGOPS_bA>xf%^E=7+}|gkC%7VO26<08JA=&{Bdcglk`-CQWJT6I z-R7*3vWnJJS&=nZS0<(zonBr<&Dj|3uJJOq1rnphPOKVf$5pMhqwE7)`w3+2CeSE* zt!k~kq=L1RK%?yQvkrp`RF`?dj@1!Cb+Y4wz@-ibkC6M9yod8OU`E7EB7dJ zpR%SfvP>>}1~%$EXbtN@Yf_rD7l6D;dkx6TY^?f5toc1?4NuEVh+GzO>DKxyEFgKD zfN{eiY?zk$KA_f40kwt-sI^o;t(^jDEfi2|n}Ay51QhFFg@9UhhaE(htibdZ>XT!y z-#MaxlWzF4fA2xI?AcKFpxs0FAeJRaJxHXo@#;ZqZ4Y8>b~HU`ZS6s8J`Y;!c@X0f zN*=VfTWNuqCxWn+Ji>=OS8XK{cMR-<6%S&~d%hva^WbV7{h5h(3^4KY-WWKg8EasH zta$~(j;r)1YJ3ycWWtBR9=tE>O2uG12G(FwIaEo1ryKiFs`j)o@#hpZUlr%Y4UjKS z^WxqC8HTQ0;uiN2(k~J9Y)NfqQh7z@Yva5_NlYO@G1|T9mX?f)N`19y6iC9e|_&Y!t|eE?CLOz zAN0n+Ci~Ki;#VgKYoGC+$n~}N2C}Dn#8MIR(F%!C_ikfsK26`e@!&@^lg)5@x5a)M z;xT6Skyjni;5zN1Kg)zprsn0?5}Hpf4L!?*;rqs@_c>Oiyn|>33S{~#&+Oel#9bT3 zZ79WUD8+5C;wBqBGNHd`EPG$eVY*;BOq(s!RHeC%mT5XNac3$sMRrSO`DaJ+mkZTZ zA^@$KOS*FrgN#X~TWZ^{{R}7a|8ERuJnx1a@wwa~PKda=gfTCb)P{Y~{dx_%k7+t9 z?`Qch1ORS|ak&sljjzaS&FDUUMKF$c1A0J)2)&nI;vdAvuVL(@c0Zqp~9{CC1!*tpg{yhUS*iiPp_Q(mF z$F)yau4g9hr2(1ODHyorHFJP3cM9Y+bAaRZ0uyS;Yvuq?>J-QUJpixflGI$aeH)ou z68H9P?jTTrFKdB&{~VeiaKj3k;p&ZLz3o9vAQS0YiWLNX~yT_>d&v80(U7s*Am`*v-hfJ{YGrwwddFbqk|CcE zp!7pkggf?hn|wk*{t=3cy{&Owp5il?;d0?=e^fGc>ye3jX+Y-53I=XjegnLqQy|N4fH!msWcdwnQ>Q?d-vD=LfvB}(8<{DM zWodYaUw#A3X@R>UL$lB9E;}~Ny|IYuY)g25pA2bcL7?;Yg@_O#y9Z>RqF}V39U#F! zDV7qI7Tu0YxTo-azS$mqkNcdF`ebmOT=gJ-CmK^e_9b&g0w-HC*Cw#nlG&HQsg}%F z5;)zG!5{uKelj@1pT>_TZb>KC?dX&FcLk;Ekl&8bMo8u=ck#oA8}=x=dU+ zHfYAX8!rS2qg$@Dkc5gzgJh`7$G?+t+!H;*2g%46zFwRL2q@u$WFip0sW>YTW5Nf? zydZqjagreHgb$LbLilD{GDM>AK{87S-)u2u2p`@hG@bRJ2}H3JWD0_f1OYRH2!mvj zkcwqo6qg6LMrECf&q=dYDiGlylfjK~h9C$sejsAN^ILU2h`wJ;W3}8^cMDjq$-kvn zMn50@Kx_S2)9RR$rwUXel@UUfJGH9&d{s_@Xzj>xt1Z;t6tDE*cz*J~8?W@$bt=Wb zr)=3e73is>B{a>SD??fktSc7;>&gW|F%wKQ7pf>kO7K{v$seYV{%FcYsC@$OF#G)7 zVcZ$d&Ymb8O^W2YISOG7;??kU2*|iBx$7UY@N2 zT+%6!eH?(7bP8l22jESe0@=s;r~)@@>Ki6=dxu+|mI8cT3*5B|`dbl8%hUZIh?amP z^_C#RGPdTyp{I3~PFasrNaa2a@*{B*Ury^H!>6pmN3`El)es2saSF+;=0r>8=?R={ z$?QmAuO)L`0;gIs*xla_lfk_H-j@t^^*6e9cu6nq;PKBR1hnS)@3^+PosYQdGUE9i zeffrtBexJ^ERo6($1NX=zLL|r$RuB#YklR!;VcG?d_(|=%cKQJMv$C_H5rE!UKBn^ z29)si;^@M$!UxIt627T8*zmRRLB2J{f}GYx2KNgeBqLDd&9r2Q2;qbLdXhI=j6~rp zD6Gjr{jx zmx>(&rwPSBQnu{0E})-`mf)oPvR>#;*Hq?GNR}a-)m%bIjzffYOUuSep;99?1`SAlezLEx4_(KTUL(;_*!X^WKQeq6x2`a+N5@6K~cF@ z$ydV#Q#szIVIr+aYMLMFuTgNsk_2VtK1Tcw<4@!7TDTvBkyQc!5@b4Xank*Fx<2Dv z&{Uc!4+WDS!8B~OcTT5}L0Xq3*Ni{bHw#I{0Dt!O(64JXt=MEb>-p~+39>iY@bWdH z9QNxsgi7f}>#G`O8>Sk^$3=E#U*LBbFIDq0gTw5Oj0@?n^2%VyA6nMyFyq35oeq!4tkLe${ki5!xmX@2FZO|;#f)qxNJ&fn z$yzhj06||@a;cYPl|~ktpRLA7vOus&l7(Ro=t3aX0bwFZb+Fr=x;#sDKxXy@Bc(bv zFjC0~b7n&T~o*G2}To4;I(%MZ(!M#QAH&^-67%BPRv=oSufpi;M!%8{YR9C~v)_ z=?@<@$ZWRMr$=wl9(mCA$%FQjBoFdU68-WZA0@H!_n_^r2g^kQ$s&A&6%l0)bIcyZ!hc%pVx^P{Li4BmM0e2262HZKIn?#SiPX&peMgN_HicNP8 zDmL9YsMvJp0HsmS%S(Esb)gHSbC?N z&@k6dF*j)1Yc88>tuZ3EZ8jE++3umWb`Kra?xAsLV@YlI(6($hXpFw!is7*Ui3wzh zZI!=Ec$#)*{PGih)09%Y^XPiuY)p$^h%KH2nOfX5q{XvFw0KUbW8PjiDO%yno)nRB zLYxY#_rCwCs(oEkcPkpscW!}DbwzVIMYj8{^GL!ctDDm=R%|7@ zHJFt+-;wBEb3`ag3P&c?aag$_|6|p5CK~4)$TbS}no9>Q8RV~&718Bx5TA5fDcW@z z!7HNR4Ui~4BND22@;zKeI`U%ocx{21QHRf}_-!kfmss$8bB&7ycJ_+}b_R?Eb*nnm zc1sSrbd%Dd?gw#tYvxWp@zj&u9B8NTA#AqGL)feWL)ff3L)eBZM+r*4F?x9ch0co0 zj0MQYC^Xev_|YbQX8a=chTIQ8{#Bf>FPv%170Ci>epXi|Qng&9ELbfoPv+61H8CUs z$1>^4sK+{-K#zorp3wZzNX0@#sdVOXD*4jbLR1WKlg(o)1NTiPervmllh-K|X{Bf3 z>g;TQ{`69MhyFNEAjpIBBeo`;=$)yGlS*9Nu&tu+OH`F)_wrf8B(XzU@wU@;>% z_;-Vv^GDIrn<4L1sMl!v190Y_V_BgLp9wufQciU*W!uW&pN);DR zn*exTY-c?r){4AVw0kSz>00l(vHm*9Z3>+vw^RABS>{i&ubjuXq{G~HH|ZEW1dV&T zdquORFINp9Y_LMUp3@?$(Xk3xX@^B=@pD9^K2fziEJ}?m6rC4svmTPZRBG8i9dj(b zA3a_tgNx-mUDi$F#L2gN#bu$%bE{K3BU@ zU9px-l@VStooBV4DViG=Du)!D`9Pd2EHz*7PdAs4?5f zHTEaaC!5oYaBZ3`Zwt-vG_x`|r=uvCWyfbkKcHUZuj+gT5Z zb0V+xV;IMu(3+$&jv+s#Mavw=u+#8Ck7JBYI?Ug9i~hzwBgRS?$B2BLs#Y116zxeS zg`}BEEoHS6}|0qFQZVOzO zX)0Vhz7(KWXe!W?)!x`$pup4pi&=j=nspr{HD%l2z}9Xpa@2lQti2vGIb|~>0$m8K zZ;_Fw$fJfl4}+w#^ycP%UI)6YdtRmPHI=%yX6;2STB)ZM3G+1mcN&t?@x22wHz?@# zpiIaL-}XN7dq4xuS0?kH3QA>2qR>|+L(uukWQah|NrqVToMZ@0&q;<5^_*mgSIGB0kgc;Z1CN3hK_|MB(}y`~Z?XDH`0G?fdzJ20|bLpp~&OPMawR1616OVZ2w z>yb^fU2E+~wIT8GWb@qU?@Zzy0~;(w-KL<%T!h>Atm>oQbSC|MqXs=@)v{y0@e)G1_5Z5vf zR_2eT%HYCT7{2n#@>GKj34zL6P_q*-{hF?1CYv*hS*YZyh!SNc{*QX=Kag3DphT=#rsGFvvyL5|79d7!rR77vz27z`p3hpxDzHEl|8`; zUv^#zc`t9E_6{3?m*xnm)gXjTOZ@euIH%R8=gOEzqC&v5b^B|ef$BZkgv1&Pp zPEqyVUyiCmviup-{#4`QbP$~iT}gj??knB+FQ)^@8uK-JsgWzd9fKM3F;V>!CaQ2< zk#BO!s%}Q@Je1b&pFVGHOhRQjP$J)iA6EH)>P-n3k+CXsO}RyHWX8~#DqK^>(wJ)m zdr@OmW);s>LINw;`h=$$ag6NFOL>&u*AXl(Thrq`4IU5{e>+VFbYmV&>78ey3iZ7QYe4AJ{u^ai~{a)D@LY>)!VSP zDCcIiB8npJJco&*oZHbMmZq4c;V^NOb8lJc8AU77a;Ga z8@BQ~$j!2kxj-J1$fokX;^_^{)*ha@G)9nI8YAG=7+wgLV4!=DOfpZ9fO!Z)xG)^*8Co{4)7pmCAK|?WwHQX zsy-A(EmG9uMohkEfJ8m_Qi;`0*sN}j&8jABRx!tB^>P?$;dX~XqpFCriaNIC{XQV^X*vGbirpmzr*|no3oxsQ7A6-)ic?Qq?V}N{EX*$jr@qmf>bpzcJ40 z8z8ZUbmG8PYYz`%kxcyqTdn$@(;C2o6%!oTiV1M6=S1I3xnXZ_C6A*TddS-u?&@@I zYjueQR-ag4b&3U6uUKGpiv?D{SYUOG1xceomHX3gR_DDtI&lH=SiLlhH1{ge-Z=oQ zBKBP@W~j)GMV_E{&7QkrjUc;XjZk1iILb$9qBj;;rSo%#Lzz{2y18)s_PN$7z8b~d zL&~|Pn3~oUSxsvYQ`4Ho6kFq%VrwE(YzhNG{&md8bfM~G{CCj1(wnPP4j*=!3Wa-fxK0%;@)w9u9{_j zxLM{4vp8u(?J{53#j%ex%zR-OS7oGSYA?UnY~!$-)Gq&+>;w4%wU3*J`(&6rX5@pA zfgI>zhmL1Pe=d?Rljo{&h`aLnmm<~_hVg=|We{ZN*jy0PEb)|=f#sK&zO^NdFf(!K z$pu++hL;%=idiw&RO7Y~t+4`%wXjM+?Eng>HAq0MIRc6yP&S}wi&gbxWE%YY$>SqRWGrj~zk}TI+eR z5)(U$nDCs|NIeT^-Wtih$7xL@KZIiqBoOAgQJ*>pWQ`*brrD#`5Xc%vAZr$ZFv_{Q zn<|hsi9psM0ueL}34yHc)6I8v3PIJ{>#Md_Q`C}|SrKq!nt-+s$oxc2Bim^2>Blpj zK-qtgeWvZ{*GL|DlAd~m<+AwMKENt$zlg8553F6f%~=!qD%MEdDpvD+gkd?f5OMD* zR%RZo^z}V`+gHz7>Ee58Vf~&Fw+c9dNR{tj4%dfzo8yvVgEgvf*=`DC`y-GwNjyB= zJz$l8H2+k6EGeHsK|VtvH&?rJrN}=ku|i&{ko(q0jzHWd+{dXBr)VmIAs?s^g2_KL zu|hsdp-iyVDCqH8?E%kEFS|AjZ080^=;QZh#sV} zyj{}YxCeT&sw(_@`egnVeA=@IbA{5P5HTq2ebeW)dKgc4bYE>*r_eP$tH`XK4JWFeP7R8 zkPK;NL7>+p{ylv%dlZ!IBghZtd}KbUV6^lt3UF!ny(pr^0V98mlNfo42B?VH9%BSI zdyot+makPIuTgKvxwjK7nRg~|vL$m%0(&i)A0%+9C39qS{BQ;Nmq)Sdt%Y5l;%k*H`|VAjSB;j?G#^%mv{qR6 zGVM8r6{X6xLNOIgG;dH*h^)lLY{Om}TSf8_l~v8HR4HbUP1qpWVHvuC*ECCdXTUnQ zvi6&jMqs-&?L|ORbEPcd;^_`WN2icLT4|_T>0-UmJX=$_5<_z9F7dl#z|9o*=pL-B zyLSxiy}0M(R-6ItLGBm06Zc@ZdorCXKu38F<0cX4+vDBhg6)#{iDuHhTj60E{Y$k1 zf+f-*f2wWB?^JDTZ7UwM?RXH$HvLy^2_ws0A13BDULf0!K(-Zutn6SiTKIM}&W2Ll zhEiN{S2Ed5tBAEpRN3aAXd(CO;?2ra829U4y`J9RSRsCK@4-i_FocS*rFff%8dWe` zdct>=e(EUv2l`~LRZvFl0l#>EqXO?v+}8}q+}7ci#XG?CQcxm@k;OZ}eL4lQcn5ew zr$83(0GDckbo1r`nLkh5H~Ymqz%DIt%MR#kB6eyE&8tw}Sa`enQs}h@$&h9i1UfbG zALx^Lgo4q6k5+(z7Ni$W7GUI}9N#}nV?e}gkG{u!9wdY7@S(sjsv5jr0-bK>@G zIPreTDciS^!3QD_GIPiF+Na4AcnHH^8i)CMNXFqRf5ed6L%2kaC1QYWk3C)wi3Pe9 zK+#7QZ)ig=1)@KsZc#5G6SCp0^ZMT*Z=|Ca0p%_oC`2mpw5JF%$4HDZU%2r`kTE;R z9T4Q-Ylz9i8%UzhH$mpJF%++yY{`5hRfZ%=ePuHLkt+9EGKWPcoDWGf`^seQu6%OC zIMtGQNU98ZX5qNf=_pUk}@-zG?AKd%`Xra}n>JL;qf;+WL`!k*6% znWWjR1rR|i?d^;KN-%oRn!|(GV=>yYay54M8|!tjZ_H=gk7})tr`px2qoLO3G-Xid zQ(D*EL)4DMl?Cqv%3ZA0XXIz{-2Dc5MyJ>n<8{)B%eCTGO|v@=pzWz^kcd4=8aw>n zGtCimXP$C+bLvrtpSI@SE1J_zI_iXpqfYtGPmh?p$BA?IxM$@t>-8#=wN7QynrN<8 zCYURC7A2DptB#J6=}jYxv?^ zVh`Qj&R7YZNA2l-1msBY^FD&@_RPw8VB}Rjf!WqWg~G zHa=9lo63HWrn7Q3pFidh;8&uX)d+Rq;x#)Bh1C~%m)4Rn~j3v?LQeQp9BmiNKZwokmvYx@Om`vz|N2X6Za zZu<#t`{>1{@%UEFh8VkyP z281u&*vyivsclst+nzwSrRrrE>FndwX0(afU)I+ONhQ2Xhff!5at+O%>lZU+ZyI@| zRk?EZmwtl5hjH$hO{*=tB})9yz-7_=6LrLNb=K1)}SSawQk8_Oz*2uvZV?6hYHQewzvD8Ch`|4zEW;2xr|HJJJ*s) zzBf*KC`NqYEzzA0z`z_b_mNR?6@!QUx==tezUIon6vU)tg*Gg+9(Iv0i zDRA|3|2TT0IZN%z`l7PBdG1UsvZO0LtVd!2lHSD?%IQ;b z7)v;Vih{>{EVOn64EY&96uwHC>c?hLy5ZwNlx(BNV~70tMWIECpER0{;-@HEI?D!x zFc{Jff$>Q_Bzp)O#s8#isU47)-851kid$uqb9J9qAN`fnTr1 zsSh9==sQFSia8vren1VSq$}JRU#=Is<`^(f(NlYdv_tVTl&z*KWtS?C(G~b|El#?E zaKO-zK5#hDk$Ob$5H^ZAzE=)DiP4zHHs$xwr|3DKH;(KxyHlqqzn}7j^Q+?7T*^f$ zX*jtS(MT~4ggbcjJIzPqy3d{5cQ z%42*F%n3-z_xALlA$_PE4-}o6JF9ZEPnC~zdpLAUN~`R^`f%(9vN= z(SBt)v@=)ingi#;lZ{Xg^5M|fAzh`I^L&PdMo?t*-*4&#hly5pXgB;=9_2E#GV6dd zi7=w2z<0P@=`4G-T2UU0WujY9H)b^zNvFN z$LWyAh;D_yt+ZeeVlC*IOY;Th(tH88=JP_V?L1f-E=a&|1R1)J$Dm$FZm&@^w#0C9 zx;8e$HUe482!v6X!3BaO((WIQnP2W%?bf0q(Hc`AYsWDgu@)b*y7i58$ht)!>ya@V z8Raj^tl!+mopqeUtmhnt>+qAqtnnRYt?w{veur6`I?Ni%VOWYlb=Y$MS$*YIE~~CU zR$GBkmf#c!68+tP8CU}dpVeO=tG=&l_4lAPfK*0*!b2cPOya8^yiGQjHrZU-WOHeg z&DJLF)S}WPn@f{ywkB~ktwkJG8f0^6kj>U0%RfD-Y04PcQrcrnX^$4_0h*U~9!T2ew+<`07|E8!qJwb2Zao2(*rm{H*4&z-k{0tOa6$wL&bg zmWTz`8nM7yBo_ zc|2%M<3X#W2T_pG;6bZg{=hbrS>^P2Caa*l?a?J0&K0?;>2VV$jl~-(I#xtNgoymWUz@ln_{aRV`0O>Gh-00rZAJ|Dk7&D z?UY}1k~@VpHA^iHtfdfSXV6@boka688)&|_*1R;rl*3gg7lcho^ZjKo?2U25IYmSq zh771RV?ePZ_6n#STLHDE3aB+yK&^=aYK;?6tb-K-ijJh^<%JTgz(#ebPmT>|am3EP z-DCD3_96g1$SyH^xE{3IwjRW=?0|aEZhCqUV-utv#MW%0dC;2LgVuT;#CU{~2eAyP zzUf3ZOReqX4NwgCZ5_lSaj9>2_dSR;_vv1~2P@WG>SN89>u!lOV{IuAM*EQNA$xfk zZGZeh=ku&}q$;-Aep^t^SKX@__W3+$4JMT{dw6oXu}?;753y`5m#5zOaRS@`$rzPR z?28lNwdta;Z$O4|D<>;$AMnmpZ5rG+z&LlRak^CqEjHqO)7E(1D%deI*}j1_S+|O{ zgB_^YBs0MFXaIDTu5BMMlGteUpjFX>70tF6Q@Q7?D73v$$a7jf^8A_Vr?cWhW<6x4 z!OrN9JJcT{c;|o&PMQyXJ>;hoYxKY_>l0tiTHS+rryOms3UrjY%mprk?>FP%TVU{A zpCJ11gfE0P=`s8Q*&Jfw!a zQTyk=vZsf%?Lit(^PhaVU$)_p4`@3#M5WKMBIP#L3KYnS3r0uW`=huGrML~HxZ>0M ziRQy9;+XhTpXZltmP}iIHj@NRc^}&=8gy)xue)rMaj`yEn0Tg;8JWv97@M1zAg4>j#>~Z?gb?9L27KL~P`>-E!Y?A(-a^(uW%d zWRP$#2hJSCcU&P7Q@dZ+5TDZCuJG^F_|xEkX0^zzK`)l&HF;)-tP0`Gl#mtKsUa(} zQ^X~P8uETFz~edva!>`pRxOZj-Zmi9Chpt(K@|Xdw7`8~0!@s# zYY;SZcfM;+FgT1L_*lGdJg0#sO(q3d^W_j0-lSx>B1DtgAd30$s!n?AHx?uU_cKbQ zrS1KSN4NK_N99dGoQqGT^4@J^NQDpb(&+PxCt5PENUq(xO@8mW1^9HgV6p|6NzQUL zdM&`iy9HA%z%#oA(=7mQ7F#+|Gc5pq)q>gRXl4O#C^EOIeEHHF@{1AL2uX}c)y23} zd%XsP2gwjE-k>p)f?;vc)67au#mbPxhp(JG9Vwk#@%)2y0uTw1%mpH0DF(wYsXK%Z zGE-=&&lH$7Uw)l9=~i~(edpSH&f%@H*wdz=lZ2-ma`cW=CO;dnj?Koa8^Hu3^Nlw; z8RAalK{EYF6fDY*WlzTWh)@(>NM5^HciO}$I#eF2sW5Ku z->$X3m1-{zY;BjP))}exQlDDi)7o=x$j!(%Ma4qYok@U#k5>_#a7X@Z#VdAnJ)roB z%9fos0kmxVN~pb;B`e5h=tdS>6#}uHb9h3c@1qgcL4I5z zw`zAML6iSfVuf5%$SukBBvKA<&!O$2PCl9l37ULR7>Vr37l@p;EP^! z`ON>%+?&8_c9eDg=ic|;w{Lekoz6;VdjLC$A;v&=!lK}?$s(?|SF^Vu3=ZI!ki~58 z?I6Oqfr*LIgXn3*2@zSMD7K&w6`h^|G^k+Xpws+83@8v$h8_ODs`GrS&ihoox9?$` z|L1={pYHS2ub!%Uwp!jg=hSIQ-~@r|k{4c{cfW6)koZ*tB|79?3Az{(2TJRE4&cE< zX6*=)zy+!g5^qF4XX~`lh|%e38c8tuPng<*d_W088d?$L+X#!^`2mYwWFY`TC?~nh zuNr5Nk0=Oi(DdxkGYAR#u@(oA1cqvZq*KS2GD#3C;)A4*i*J-VJmDigNV>fE^n1)q zNkoYck`X|Bi)lC@$ixT9pdh|+OM}_|_GJgZOYIff%d@P1wm&kVK$L;&Fxn zL6D3HD(It6Ts|(s(w5~dKIfVjw;)7=md$vcYi0()|6=xv3PR6c%suk%175nY;AP4^ z)*p)AV5RQKrSB<9huSFhkvx}E=69^@YOe&M@Mo;}xVcdqd*`;KKbNZA6f$fVpO!RYjGRctDHavzsj3yAGl0??wmA--`|y zzofY595CwjSKkiLmHW29eS6@(O>o~HY2R*`%MSQPBj{UdM)a|dntuQ6~rUK?$ z3Yc$b=5($`eLF#@iEk)^zNHBIrXuKdA?@4Ju9I&`kZ(tjZ$%Jw`m1k4Yn<*#B;QiX z@a?4x-)hS6ZIb3yDB@qg)qJahe0zd?OMs&+aJgiXbA#>~g%=#eLszVkFw&VPk z8!b{F*J{0^hIg%ab1KZ^sF1Fsj(VIuGe{Y_pSKyfHypUP9(ZaGVn(|`m4EYYJfp3D z^KLw&o#-BK$Ow8XM$nruf|xB`XSCHFJ9K03a3kMv$>F6aIlM?EN0O^T5L;if7}M4R z4zJBLUWT&%(26bye6v0i!R8^THENDVZ1b`_?A+JZ!cx|R#S$zNB>z_ zZ$70>kc>S6^k$6=fjO$ac|@9aHC%FZ1RU>G8}H?D)Lt9jvVS$ zWa8_bY#!9vR;)MHRLEO*O@+MW=bBer05TxfmQSO9b|Ycsw^-9W*y1zSR4yNFyT|`B zH?j0n?mt>fh^0vNChdjz%Kz$03WDSs&-Eekvx#pfICR z^i74Wj?`;bxxNFz~h%7z?#zCPvXgZCK!GXkODhWvs zil-Toz>DI8OdTqmW<&zViVu?h6;CrFfv?2}xh=(lPBS8b`^5)I4~(Z7ksu<(2TA7> z-@2kFiqCsdkoRHSl1NT$(pZPj(rHEjKVnX_(~L-FKc*MFaGiVs`R&QII?aegcI|%e zS`|fy?@NQpey>B=ytu~1y4kMk8c(stzRRw)-lD1~v0^1-s8i#ll=?E);rAz=)bI9L#XAQ#`3<*3du5r(~L;7zUZB11jMp# zQ*T+f+G$3<^)s6rXPjo_g?dQjoPC;+7xwJP&&fsoBZpM@n#!o3 zX7nYqD+`LsTs7B}Ol5ytgo$gVrl$EBcbv|w-3a*ZG=5F_N8%@f060RY@_@L4#!7wI zt_uC~%%qY{FXo1j>;KI!PzTp)U2~(Ku!lprR&FSkOuA40z{7P&uQd#(eDQUsOHueGWG8Q0qN#u-%Dn{iNK zZ}35dy=w*)UfqeM8`UN5nc$#*G6yL%Au)X9^9GF|hWd|bO4|uZ2u40{lL&fUBj|Nd ze{z3bU@hH8Eh5k74hD%98j8X&R-yc1c|PlX%pono1AX((Y4r>0h_j$9`dNfO0ZX`uWqldzM8$doVvZbyt=)* zyt=(Q2@B&y;H@?XeJ;KGu=DdrJJyXK?5^Qw3cqx(N{iX*lCWv0@2WrV3hPZ@>O0x$ z6GU~K`X{Jkum4Y_`7}bEI!3j3S+yD!?w*tf4+`YqL7u;ioZo085kD;>=;exFU8aB{ z*T>Cx3(a-+HZ7^$W&-u$a8u$*EfQmhltHsEH0yTtkitlbeYQYd4r0AK`E(Ct&w__n zkOxO=Ndwt4>fx1&Q4gfz$i!})khBa&mfadS;Pk{(I19JsF< zytGjFOY!|?5$cyo59^89rFMe_5&G-n4NENvT20)(*_1J`-A%Q2H_d8yQ|g6S(%RkB zmhER&Z)f{_}xy8$7wD{CjTHI5%7<`I` zz46OezUJ|ZI-Z)WRUPEkS@s6IhM%GKCLs{2uGhl=mgU6{!c!AIIkDMsRde=^tyTn> z+LV1mFWc7`RzSYS%~LgoM;ECSCB@OJG;sKOyYv>*_S|HgJ&=z#Xw+Q0(vqP56EqRt z7&`GeJIbnq$W;8zsp7qmC?1}vsQ!u{;WDn3-%DAY7g-Aog4TUDwsdety_DfczLeod zzm(xez?6~2C@C-4Ns6cqUmI;%+J5%-^TJm*5b&36m?{{^Km(m)7zVaY;rk=Kdb~bG zJzlSZ!RuErl-f-r==$#D?q#(5j2ISR9XXOg`r3BB_+lYvu@#f2m^KQlft2eBz(o@q6| zAhodUtDA40QR%KXnH^1!a@uJ~fv3a>Ips8L z&2?_{L{prrg5Yhnw~Jp@*uA{FFi)FYB?c{V4f@VE=!hqZ2*)pXn0N()_fo+?gIwzk zOG26&7y`5E+ev-Bp!LGejL@d}i=r3oSvDIyH^u0l=NXB46j&d#&X;>ZWi}7S_;D-y z@>Ja}$lDEC(off`n{8T7gXD$^kIprR>~|b*G*`B;7829l#ysCVspwWESEZ_TMOBq; zLcIP*rqQR8vdfU4HE7h_GT)N8;BUH;ii`FCt0Ny|*Ge!4hW~EWa8j{;W>J#Cuky=l zu0b-&uaW7>PN@9<+~{vi06S#z9nx(sqk0@Rbi|1sItGuc-8bC8jh?KW61_P38AMzRI9;v_;jA|22NT_JqxZ z8`n|rVQSonlOIGj*DBkY$#=MBeRDvA{FX`Ow&m7XH}yTm^f);cNbjeS^|Yk@E=ZcG zl=3QU*-BGfSCMVheBymw1%Lh*-F3csR1vC8^99FM88{YHp2|LD?4#zITUrv-Q7Nm3 zTdeta*tIf{)|e{&-q)n9oANx9acb~-YjD&|%5d0Fu&oblvwFU7dS=hBGS+(jUXu>* zRPQVX$6aQO&q?;%3;A;fxt1g!HBCu; z@a5sBr(1KyO1Q>U>F~a$866(BubLuN_ijjX!M19Lr%sfZ+2N~uotYv6*R0x|x(-i`?>FmJJ1&_=lLvP}(p0sax8|0uG{<#S2}AK) z?WWBUyDE4fk9@YPf1&x8xxGcdjd}Sw#QrmhU9mO%Pvie3HNFS((vNiI^)nUn*1re3 z67shU($Z|MCGjtbZ~03`p7^m;6!QBLbj5BX-<+T;-)ZDK?x)~>$Y*~7XdmPY{}Jd) z$lDBxl99MC@hwCC`ah+jkRSgP&_2lj{b`{6kdJ-YIcS9mVka1T_3MnKbBm#AeHCY0NJXEhc zb&%Ap>G_@&64V~<=vi>kP~=;CJD2!&f}odFG`hq$)G^L#X?5J|tAi{zBM4z2MUGDJ z{`QY|6-JN*BZ~Y2`J7Mo_(;4ejS;&c-)c~-kHjBlKFEzWBt$+E3?XV4k|8AWkzf!J zA0&fFh^ zgw5s5>4F|=v-CE*jVR<)z_wuPyRAuF$yL{>ZCj~Mb5b?Kk6%06$sO3!+$i>#>gfY8snobbdY zGZ)uf280!~cEy{Ag$lQ|tfc8vDx?o898h&kaIAZCb*H<|)RhUs;j{M}N3IRzqn4vb zAJxwFdc1M21;fd?l%MQ!j-TFg4ig$a&pCcstQ<2cy@d5|E(5|cxXY2;EeJ7_%PiSi zmMF^YfDlr-46`Odmdk+93v-!z=+w~HSvdW6>W<5h#F3)@PqJZJuTn_o>zgU9ubI9>YC2PdK+$UjWzks%qYwc#NM{N$J`HM_LJVO84Ms6W zx$~Rr*Y0TwF*FWrn_`TkgY>2l)9k>uDaJ@WsBH={n-6T8V$21D+NKZ_$iTKK#vnJS zZ3;0m4vKO{Q0AVr%?E(UIZ36?vm=6cGPBBLOL1v>6Gs7UWQHV)-px_i^0vaSZ zg_x)Y2~Htqw}FED>217j-O|$f^^FeA4_V>p{LBJ9H#d!Ej^j|wmR!gB1*Xr~pGlhQ z#tz@CTz$eFlcbv2Rqt;Ta| zv!`St^WPiO=D;*n4LMISjuRq>=>y1hQ&)T$8Ni=rg|~(L6+HGMA?M>(L#-9^e%H2x>d{H=yNs(=6L~BX>NT+*U}~+^L>@C} zsTny;ll8X9Wj3s}MIMu0*%mp>Z1uLtW!|f`2vMAfek$XwjZ`pT*t_5J87|L7{b`I1ZUWykAo9bxEb8L1l*esyeC>DSC=(@=V7^& zwZltUJG_*&!%JB^yp*-WhsZi;wd55VRM=}hsIWK9pu*mMg9>{i4=TKxCz^&BXCFzs zLXd=g+=B6DkDxba1ihIe=+%#)S1W?6iHopEmUq{@csa+*m~*_KImb(zbG*noXNcSy zcf7!YyrhD>h=ROqg1k_IhDf7(OT~~DFfUKQyg&i-5(UhQ6fpm{+VG`2^QDFMdx^y5 z1rp@t5#+@YG)$VyOKC1IrMbM6=JHaS%S&mBXAV}gjc%lcPxxG%w)UBaQihi-WqA2g zhLw$5VI)icpvBtc#xL0%w1ULHYS z96^N$Rp9+5*W+x>{vc6*^ z#p+Ltr4^P-D=b%)Ht=fG`MRt-B)V_XeT<9FxoFEpXW!mzTl&GR-U>e7EAR8Y8GOFi z-sgLDdb?5$u0;0k``}*U4#jWTN#VCV(qZL}*BiP+y{$Xc%eNrF?(UAqJ~K(oj#O6% zDK?L^qWQ^*-waX!u-AjWkVm|WNO zpU?%YTv6+9(l6JYkbi5?M%~8K0Sk7z1L(&s_vCPIQs*yiJ&;)5WFx>^(@3xr^7j(7 z4Ea%mv~Jaxy242gAm3v@a?fb|E@j}{(vnZeitmQ$-OP@UD8Bs@odI%7AS_pAwS-rn zXCjuy5*_2M#*GtVVsGn8oKqsUn>3GqbAl5m>2;fPAVw zicn!8i=CUlhA>svFB?@B(uS$%XYN}e!7Qly zyia0b?+&f?^<-sSO@}^R`!`j@J0}DteV?n=e{^Cz6xg8Yryjo*-OGH6lJsn4O1{4ImSFbYk_4g-e&5tA*;Z^a`MOkxoJ8Vx65lRJZd1p$d>4%i)c!idGo-sH zpGX7w#Y7e1qF+Lg4^EER3;B41blm7%OXA`T&bK74%iyRb@$(s6Xi4B*)w!5ljavnd zlV9Is#U&%;eF@qN$xcx36;fO!2ogtWw+a%Usru4Y`*0O5P(g2BIlwmQLJlLqr<1XF zLNX|v-ff}WxsW#r!rA-yPT~?(S?loJiwn*}t&!H@l z6}lr@a@AmiW`tN^gJvKKy_0#Aw$uMyP2D$swGVqh0!4)EPLm#9`{ zKAJ;iIQ-RVMA;45rjbYAYa&6c>jw){Wa(SZDU=$mM=7p$ zR#@%xFY5~C)2j^?tt_sicCM?mvN4(q#=kIIFX}y}@7&Uo{GZ7MJ0bCkaeAXKH0(|= z7S&_xR_h&bRbp!~RR#0R*eY2STk8u0%{8}Kv+uBLHMUBoN^F%(mDuu3vt!G14v8(w za$Uvi>(;}>buc5#&)@CaeguiepBPAnUjzX)aftG?=d8C+vb|k#57Qd-;Op zs`3(FB;IdIaa|0LhTm}}NvtFQJefD!YuwdG z%E`PnF@^Uk-1GlrzSNj_uOh!8Kn_>`>IC@9t%j4rs}p(8`u5+!{L?+i$n@c-a_Fq*XK+m?rTdK{Gd9E?V z2ehYN(;$bJy_|V~Z(6MtGI{j8suX>PXU3~czAsgoru#}r{fX-@+Ip~e-b>!5`8(sj z->w?*A$gTnzwpba#&b#7^o!Ovu;>6-@3t7#6Wq6*AtwJ?2DlG3a35XZ#0W1ufa5rP z0`A=a?kx}Q)agH(5wlADx~INN{W`qVuft3II=s}c!%O`-ywtD5OZ_^0sD1-q$@69y zSlnA{U~zBMfyKS;2Nw4(8d%(Wa$s@q@PWmT7Z*)KkvV&Lp_2fslR}wB1bH3fi4aic! z%aG=lbZhl8|7$}9OKC1ErMaxv_zZGvKaEebtEP0w-c+cEy{^~evfjd)ZY;;^k#oGg za}J8Kj?X#X`Z>p|opZeQIcJ9E3Epa|qpx+r$!_F+@M}LQwN-cY(I>u73W%MFAJ4RCc2va9?A0 zZ_7GDqGR}oy7yVYyfOjva@RhdKR1KT1o2!xIwhLCLj{*d_9LvqW%hR*9?_g=;4g zDMpLPilvCU2$J}>Gv8w0c~Ec zF$(&N%g2r&A2@Gv6Q5fGVP=`t5)rWPfzDc4R}fB9(d}?q;r0i@ zn>Ri(X4URvq+bUS!oV=A4)R}SJHJ^%kZ0Qg^8MPuo@aTv6bK!$Uy8VVuH8cE=Yg?r zoNM&)+Arl}aIRrtLo8NajSoLhVSAW`+$MdMt9L861<%zKll5qkO1M_q(j*lA;tMWJ zFxL_0x`zclN!X4S`gIAru!ZItUT}eCtq@*tf&NS?Tiz#Ax3UhxI9+*+vo~`}etPDE zt>9Qk%!SumNau?7Lej}j6Kna#3%PW`$mKfW)?#?oBMrW92=bv`dGJAVS@&{De^QH{ zvHyCno@_H6F;a-c?qprY1Fo}kG^TcCx`#?_9lGAekr2VLMmWLOw8YqY%TrCI^Cu>;)`8~<(H_f#qUXa20mc+|5 zIBH3}IfDx=i9gHWVoTza863AHaM`H2X(1ge1M5tAmE53!)kMXtmAnD2CTTI;=_lpmb&Mm%i zOM-|HA0+)+eCvu%Epidt^nI(uI36)GwGduy{e!YbZX0bZ@25L9FpVfD}oiH{hlsqRo*RRGM{YQD?R0s`P6QyE%7 z0BoDe&;kPBLd(#TTaZsPNIl@tgv2Gi3iR&FBU*qfEF%o8(EREMLkRSnj4#_3gzL0z zLEmfT`nCo8Tg#JeAwO(Te8GnVzj36b|7jDHT=BnY`fb&I)vzWc)VLo1os%Zr``eeI z{Yt{-AP!2=ZHskpdruIA+w~sv*hyEwJIZH=9F3x4?7sYduK|iT_j^B%M6Izd-_*iZ797 zviSZ60{~tYA0$ISe1C%kju#&!Jw3j^L4sHiA0(YzeB+|Wi;qb8k0xKR3N-N{3qTSd zDhc_z6c@W7{~|$`e$YsIycWCbTM{{bF7?3@-Qm$p)|7ak%&_*<5p@RYIke(3%^4$<|g}D@HAuG-GyO@u)n- ztPL{zObAyQX@`9=?`d`wgv+?*CqEE{^5HoVp1`J}fbrXsFXjadlklW=!03TIs2wo> zms@Wd+UMIPU&rT85Pi^x0lbcb3VUM=D(tN`sIWKhpu(&9A$tOI#&HKTar(I;7Lw?Q zeBL4vL{m=pR$)j&Ch~cuBIt#Ui>m}8*WcO8RC+mY)ROpT1NHj`5@EY>^Q=+p1s1Ot zH`eI|P8E2eQ$~_;RpO6KMr2;ndv4mPm1H1@9=_@q_HapWv~I0IT~k0;1`IX3ylZ29 zXgY5r6!np&M+aObTFmeY8w0asAlM}2bZvmNR;Di-7%uP2=8f3TTh)9i^G_;ve9=rh zDks_TVN-VO%79JV@wzEHe#N$rg1th0r2BSMiDXA?6Rg#>0`jUUYjt^G)7I)Fz*=9m zIk~e|R}PGEx6A9wC1YhmTX1}H^@nT*(KNwlQ-9w!QNo((rM9xZJ*}{J=4xsb_3~0r zsD$sfe%WjuFdE~PkAPuA)>Q%fU5ncf*fn76KCw{{Fa+gopn%on%b1r`x0$`5g1nr9 zyqJQ#l!CmFg1n4^vN)bXyuIe2h32|@o0il&4b`|49uj;~Vb7F7qc1lPcJ+|LT#4O_ z;nRrqxD+?bkhoj}_|b_sWduuOE_-7}K5xzldV@v~?a(8FUgj`)V*w_UfO_pVFTu64VV`-U|!PjW3_3XYPRh;`KUh8y42D$=`^F}s->b{xw7LPRQaY_ z<(p^JB5fJ7ZVK!ze*PqHxP3p}aaJnk%)>P)xz{M6ze$lT(Uw8Yg~ zeCjGK?kQXBYuFn(sg!Hq-C2Xm$VnadB-txW+9b8?>+QN;zq0HoQXo`auUq7n<;4%7 zMNRnR#Ae4;&DlG)S`lDsQ}zwLY+qyORKCW|Q#FPMKByEW#nG!YaQJ$=^vg`!JCbqs zK)%i(ZS<|QB&h!cEtqa>mcF*-oE>G=L1Zfa#Z>WLNE9Edh8r}Ed&%ZTxQuJ%_f;}SuahYVIXGvry_r#TnzUYHKqTZY7+>vgu29aw=6f608PA4ZVBV$ec! z)t@#kDSX+h1OMS3)qyMCWiAy2`CfxGmyKHztoC}f;-<%$-Bbl6uIX_DVMK9flT1_R zm|?JnI`nm>>bsK_cA^22i3^EnYvxGc?JZ$mV>Q1kwXp1~n{S>`3_nftP%~FHZn?EK z|6pU{T9ItNw<2m9Y=ESa5F6lrL6G={8yUExJrt* zl}Gb5&HpeXWRF!Wg*aR#p>Hu*YQDiTM9GX^i4p$Egq*?VeLaJ1ZK6nKnjIKUb=4Ft z)Yt0(UgSzlA?~*oJ!}SMw<^y zb?t?uhH6R5Wv1feLUW@FtWvH^I%Ms-=EAdU>l%2tR(b;O9>8*uRev7Uo^sZ${LNi8 z{gLYPA3oQdacWDE$M%Z8C`fetq7=a;@oQV!16xyJ3gJ3^CVIZ#q|T}Ds+#(mxC!l@ zJ8G~1)m2>7G-T!oDB^Ce`Cc=`id`#auQBcSGS!%hR}M?2SueG%F9aKM;tfi1UF9sA zb?af`y5YU_AkP>{H;cQSAzCI z?oZI}+l+jDg7!gv`YT;s+KstyLgMzX(ZD5;7sTz3u<5Z6a<4&AHWDvSe9MsA(_Q<0 zkWbdV%mxE`fZdL9sRxf0p?mw=MNr zC9%UmwF>#71nqde?GOm3-Z^}sBi@&66lq1NZJT3@2U+Hl~LwmUpSbjIO-Y^ z*LFn_s+ON2F_K;+hQvZa>PwQn-kFAjDLBTO;)0}?i3^fGCN4<& zn7AP6Vd8?MqlgRgBdHr*2}w5*7bKlTbwSce#05zg5f>y~L|l+`kWiO(96E@&An6|B zf}}5q3zDD_*V??BxxAlsn|?EnevUay;dJW?2?lK4!-f2)4Zx9)#MU$f?}mJgL6MIH zL33_T*r|Y(n(|6p+>AP;^ETc)5uSLNbHgRl86UZ_oA*M*Yzjzj@tLvdw>fBr! zlIWRlZb*H;SL3l_3YlxD4Yn{`)MN(ZUR#LuN16l|Wl12BM0zZZ{n}K&sLr*SgypE9 zJqG=NUBg}YYqU*IdcWZ(>V8sqTXpO02PflgElbeP+PYL*81-Lk{UL%RUT2`30Li2-z9SP7{H}_HNibbUP7*yI9-ELjD^KW0CODR# zQn5}FOvSNI68!v$oFw=G6gf#SOGHi*ghJ#b!7LFuNe~~AlLWIwuH%n#P0=RmubA_wuyA+q(|oB zXU(lea|(WkO=fy%Sw_3DnKIio)7#%>G>XuR^Z;*Jbe6>_L~k49E(*~r2enKgdhei? zDa7Jvu)QhBm~nxg&4}J!o4Y8+fHFvU3i0b^kl8520%ox06yz7vpw=nGN@;NG6lBmH z)H;P2oCjH*LJZ=ATBZ<#{h*d9#H29TXcS}u8Pqz3m}myKPC+K6L9J7WwejHADaa4! zL2jcEQ|I8;DaaaZknR*>Iv(6Q1(~`BwVn#u=Jz1O`7MRPqWdMnc-^|CrSzA??a#*C)Y9a4{-MjS;0B5aIwn7dIlDebGW#+BPLLL)r*%mo}bYi!qS*wLSCd#@z zUgz{!1~s(hxwKY?m)7d= z(prWW*6Q%mS{+_mtHVocb$Dql!wYM5cxkN;|N5*oXkF+{I;gO>`=G+!Il~G&4-P8q z-8`tUkA*>neZUMV?4xQ}VHbLX3j6pRRJaIYef-^HAM8j zppUQ)bdeK59}yAso{pgRUg5Hu5^wwD0pr|LByeR~ELkRL_2#_;^Aa4Re z-T;EU`hvXj0dlGf@`?-k`qU2RJ$StX<`oZ^*F0iQ^?-TZ1Ll-sa-+CJ&IaxFBzEL0_NRx|JVR9~ZY?`IO;JkTSd>a)yh-l;Mq%GQ4S0hBr{k z@Mg*x&R8kKn=EB~eTIvVqj;l5&>Jj*-dG*z3>86dqzHNgMbH~3g5EG4=!_CUZ;%Lj zW6Y=N>{o0{hWUzBueSlX*8`krrZa;h4m}!th(z7WvXrR9ONlzXl&Hf?i8_4k5)E2Q zc(Df+_PPx!>n21vRnyBKUME4hp^ggA`g-}s3Yr(`SP$gAXSUpP z&0kq2^HEK?uq|Dj=!_(9v;;otc-uP_?fIqN| za1t#vLwtB**?Tye1j|;g#Rn9y{yWSIs^IPw`p?tt_D2LsaBoB>Ti(4gzNy*P5_xx- zIdcxk>n%sY0f`S(_X86WU&)@*H+uAdH^8=RppY@&0z6|nW7Gn?a5`h51-N}WW3dIm z=5lgqW84B@aLZU%v-$(Y^L@5HYp^i!-FtThQwqX{Z!qZudEW~19#!w{Zux{;{j>k6 z7*gQp5Iji4Ro?NQ4{YA?Ivf>gai$3-LnIRju9=Q{N?0#0yCeHr`Dw0Kp?($hVmcdcEYN zmIT4ods!?m*ot{#w7{&1L%DY2UOd+r2wzJ!je9!O*n2l+;Nl<79bQiaSZ92VUDZ>M z7E!*qZf-<-T&IQ$s?LLg58`#rD1~R9YIalbVv}jCH$}o| zTaY7`BX{@;LYnM%8{2wSU`Ofz{rPG&Y_fisXTeK-Gjq)YRs+nH>A1#J2s~P(Ca#s5 z#%V41WLr^af904Ls;RPlXbo($*L7u;I?KaWbH3t|xAJ9?r41~$xX!L{!-?>4oh@j0 zsz6^Pc81w&Vh_k~se$`lwS>EkHE_R;2JUy#!2M<#ID-cF>%kd0xcd&?*D=s*(Y)Jh zDmCx$Qgg!#%{#o*yu(Y)JG|7q!%NLOywtqIhig7)|HzwXP+@PwVTGNc2Nm|-7*yE1 zY*1nE*FlB7^9L375i+Ro@xy4A4kypE`r`C5%ji>ptoTJ zy=@|Re4YJpsU1D9oFK1SfSh82yjp_1Qi8lng1kb4ygGu0D-(7Iy*2^!>O{=x6ELq( zz`RBQ^C|_*>l84rRKWaS9@lZr|3~*YbHj*)0EE7FAH6jNd1D61*;0@Ih0Q8*!2c($hZlz3?mEYZEZ9PQ;u(0rLt4%xe@duTsFgP66{u1*}ja z0Ux#ZVHwK8_T=^2p7a`lduhSFB;Z~e@Fc)-h%cIayqloS5Xe{AZ3CSYkF*Qv;Hyg^ zc_>_5kUW~Iy1bLbRmR+9UTGEd9#TQ?AVJath0WAxf~XsPgWsc>;erf+~>HU(dk6@^66O^VQqbbj?k zXW!mzTUy@g^(*pSuk-m{L7(qc_4$4A1Kq!8)aBtlG+1cDn+@Jo9qP3))alTn-di2& z_32QrMTdHab*T4Qhk8A=In?#H@z`fIXiR7AY9Pg%Kw1hPnvhsY{dpM@dqqCX#akj> zm89t0+Twtu3v`U$uCY$v2_m>Qt43CD)Cm5c*i`qw(l?;I4Z}$8jSw)eZ@|0`0rPSN z%zHXug)>(H9%|hb&&vFeI8Wb&YsPmj*p43xyxKPPQ~>h9HhRm5_fAOQ#OYeRGhMFh zEYrD|=JmGsDG4BXWh6@AyU}zl-t*JBnEDJm>@QYGf{i6L?9Ctfyt#E>$wM>Jc;oCe zc;PqJn`=$ZtMV5P#hE{#INcVt^;eT1iKja!AKarqi$TO@9hyCdA0j4c2 z$WK_#8O8g4fpbesK0zbC8>Zh2?D%~66axETI$0VioW?z!d}y5+SaOK=I8&I}Ic-_5 zn+@T0mRWlF0cIAT56VI>AEFh#e8A3X%ZKhPJ|D!DCVfa3V*3EE)Zt@!u3^!~09d&> z*A0>|E~N0isySJwEZ_g7-+uYe{lS5Uv}7zLhHIx8$jD6UK_N;NV_xQvH8>gOVR}IL=CJX~yt6=Zh z2>AA!!L$?5JsSaVon`2T86?Kk$72t)w_Eb)N>03bt|f6agYzwkuV!%6k~lj#@#=+^#CK(Iu_b{cN6ppa zC4ADwY=PI{(=LR^LvS3?yA&QM=TV$bqz%0J0LbAWr*m@tO2Kx5ZYWN|`-^GxBWl&f*K!4t_v9R%utu5)TcF=dk_4Fm_$M;*v<;fHLcv(#6?(c$JZ&36E37!n8oNpQ)1y+FNzb>ez{wJ*7lD0;6 z6C?zH`a9&GCb#c}{DeWH=DN9-#HQqg>*iY$7iMtOlDIO13oQw}qdFIpt6rKp$H_0h zY@lR>d_#ivK;Dy}osd0;-d8wO!$1Dy$EL#Rz6lAOrdGYXA|DRRzS%ovbS0v1JeY1z zXK(C;q~D+3?JeB7khcuB}pXxcz7{r?uOEu{h_d5$o+%**kNk_Z3e8hucY%VRuu8r_8&o>{wqf z3!TO{9l9#|ztuz-YZvyq=G>MvT~8gy7w^)4Xa$ehwYTg8q8o>pFfOV+N6nq`@NskM z(vu!}O0)fpQ+8~5`1)qYIcJ@zt%0)X|4nnYG^@xr*Kia#PZ=oO%A@~F zw#su$>zWVQ!TIr5tiiKPtjemn z##Ee^P-EKf&0aE9AM;pf)*w}lsgSD1R7h1aRi)ZkNcCXd@aW#s8~3+{m$si%7<#-B zmAI}?g$w2l1@jq+d8(zN3e0l&U5(EON>o84^9R|CFeDnhGP(|&J@ zlBpV63r*QzakHStR7h20Dx@lzs#0w%q#6|PsKj-ZNZhayCa!A_cuH_xrI{|^VSJti zfQ2#1Yg1h8gd|jE1pHj%Px=fikRlX3pfsm{@+Rk~S$cEJZE5y;BFJXflhZbiIN8VI z{h-Ln%W14bBFL(W?XC#2m&J}~1lhXcEusjrvf|aY2(pIfAixL~N`|9q!^=-$&E7w@ zHs5WUkMEeyJka*veo2IV|YGJeWFyAaRN^k;{X z`LZu}T2&9)B=cty)86uMRx)ohrp=9*#Fme5C5P*#jw78`3x3dQI4R^`+&j*ejNkmq zD#DV$mFotRZo(IDIV6F)gfFLEnKS&k-20{o71_rxQUz-jU%2kdst`Q!axRR zqUOVQLAcf>urEfw(5{imhXI*fPYtF&9@A-oDW0s`KWLUJZnXAJPF(4vS+Y1*wJMT7 zQMIZZeg1#iD!$4@=4Xs4p5_@W+>1@}7(AS>{V-B(hhc?NQLAckASz=|wI;@*-?Fn# zt4w4vU{#y*Cz)1jDh9OXy>39#kAm7KWIknVeD|XI+o5SZTjiC&#keKX7lb-LXq{c} zi~a5+bYFpPN6>@&b9}*l9D#e6f_pE5d&hy}E8GC?Ef3z;G0%{#o* zyu(Y)JG|7q!%NLOywtqIOU*lcxaNb;oA)LfT!FXc;0nCa2Up;|Gq?ip#=#YMe-Ey} z2gcwEd;|@ypa`|f*`o|Fe2Ypyk{}s#G@j*;jxpdw(8oyxz3(IF{TV^;qX>GtN6_0c zg5Ew6EOb8Zkg8%w(l^z5>K&O>)H^b%sCT6HHLD}(!&S_Lv7w53M`|CgIx?xKSI$1i zA2&74`0+rHS51&tOpy1QAn!9lUL`@^UxK_kf`Ua6 zin-t0OkCb%g1p594Od2cL*3hbUZs@b6-yajy_DgVOc`F)l;IUl8D8y_;gwGr!%Yys zfa}$dpjSPDUhN2al_TiYji6UGf?mxCdKDw+)mzsC=oWu$zjs+7dNshkCg5Ifa4$Nz z?^WPE(IUCJtlgTfl(oZ4Sv$OxwZltUJG_*&!-vQ^c=h0w8eDTqTaedUkXKre*IAHPSv*A)5yh5xcj$ODUJV zlpSL!=&~2IV=QGY?x-T^ADeXlElUZBl$r+*t$2wd=v$8`FujMLng&VfRb5$9+>(;QM<*n>4W%^;Bzi_Z)Z|V` zS0yPrs2&A?q_=d8-X5{ewV5NbuFV>Yoh{On`oT)rg8O|MJ0MY154%C4b8j3%M?sM2 zsDhBFD=x3AAg`$)?{z_5NkRB|_3INX{-2)u!CuH8Ge}lEJRyOW(=RCF;-9jCHx?m* ze$z#~s?)h%>sX=Jd%6fF_+z_C6pN7f8w00{fO4-Q7Fpe1W$u&BOwUOc+zI)g3_4Mh zfowS5+P!r=vLCo7*j3NCL2gRWGUT@zl;0Kx`8CV2H*T-bUp?*GAs?TKFT9Oe@Oke! zalIc;3)=KvaPAtzpZ{VZki`Yzdylik^*(oEc<;}u#>auH#z#b58y^|25+4O~4YM#~ zh91ZCOkH}b#l$z+^&~xe)qj$#CF7eD!*$aPWaOrbS#Ff%p}C4Yai>tj9)tVs)?j#& z1^NvM+tETZb%vLWp;`FUo`TVe!2*?`QiGp2PJT8-@8TKzHoJ}$aN#Xv(z%+8Aqn;1 z&G-r6UXX8X$)zJiF4q;dwnQ*-st2BZ%vD~+kO8}AT)GLw>lG&1^z8cirV#efc$04< z(0motQ^-f`sC4)~VjWFCDPmR&@Ts)=-39rDG%o9P;PJZ7*qiOD2JcxRu|0u$ADF~) z1}80vYchCCOX7|U-rSOSO9F5I{0fO921@+T$M=B&-eVcz#U1GPC2V^OjhmvqaMUyM z0mw%tB)ImB2=u&sig{;5fFHFCJ!cDfbE;cLe2FD^ZXrtHogeL-U(yMbV<94*X_29B zihuE)AV@r?Q=TBdDcSa>xt7G!GdSOp_zxKzwIqHjg9|N*U(euTO9J3 zbXu+&#JsBl8@{5;g)knQ`kRv(c0ztrg7!jgH%Kp`&ZjQ;^vnlIM-<;E^~(Q{`5>>! z^(~~1im#;wB;8f@EvCMU`^5)I4;J6JB|$`p50cI+zI8=U79YVwkOb>N6B1e)K@uG* zNo>$F1wqnDRnSLlr0MhAmh{dv))X&dh3d%OV{E;bGk`8$ zt%d`Z$<$nV*m|ycmNCIxn^-GMg#$;6)Wo$~(|6eX$4{sf_UH6ay}u%Fye(057l%4bYGW43a&LPDtFDE6}$d^!hHqLCXlk zC-g5TOs|s}eZO6!l}T{zSs7@ZO()6901vVZP56-Ckft6@_$1Cte0v~!k9FL$!q1Pl z<)5MVtdQV`W@^2Qqx}C`UhF06zA3Hqb`wLyhlUHtPo}8281lqqvm54G5*K7}z9sR! z8634FuFK#;O9H=*nj03A6LFHjaq`$*R$MYdzCJ-0Lw+zpmqPw+f-Z(UH96x_NSvW@ zz`H^aj^Ov5gn-01l_NC6R+(*^Qm)Rkoh3#-tk3K65pHoAnEPmTS#3W$4d)HI<@!~ zTM`6@_#o-e;u{y8TYQAgYfY4373jAl@%BIxA1Vp?;mifOF@?%rLWO>=m(ka^By#-h z^}!P4D5IsAllpIyhR`4uxb~J7K!iy*E@){%U=Rc;1KZGbQU<`AP4zg;Vxr$OkkcAS zzrD}w)lF6R;yaRIfpV$^I9GKfDtl)#{-wTT*m6ME^Q?yO_UH{-o{)Z28rG_Bk8Zc@ z$J({GJOO%As-d#L`60{9OM#-9x#pS11hYcRtCGLR$gToUN%H)NezQ^Nk10|E;F><-Tz}DC*l5yvZ5S~|NhCa08}oKkLbyxiS0=Scjs zW>3C=OPZHN_2U;oUt(wQRSufSZQNz`s0w27JeO5Kk|h~ zWWpD4Ngtdo_gr(YWoF@uFZRWsaJ_prS=o*{WK~dAoT$8p5k$uy$)|Q7nULVx+oAya zN#oau)7_H*cxA5W-W3vW&)_{PB<{~u=p(h-$pQEV+m%q=%Fs>@!1qsOXeS5YM$6E% zSdgzUXi*1NY0HM>UAcwzNdCy1ddAp}{xQEier=kpe@&@yb zDmZumpFAh;fgL5Rn|0GrFfp{j9m0tUB?b%oWXR?1mK< zer@VqyCHiW;ZQO<_LV0N9l*4R5W$Mm4;9hPTaU5Bh~zSzxG1SAAPTp<}(4P`zk z0-KKs-LFPsTrUU`*Q+u}x}r?0PfqKjxd1p`ypZ(JQFG0PmIQGiKFIrXWSx+DFJU1* zNcykp+n72tQ6fG_y0gi6V(Q-nj(8#I=f=CK1t7S@3;B8rM4h~HQcD6yYs~O&R?!?> z9hE+mYj;O+CD-152@qbEgc>5XU*i3mGH~us=TYF$ig#}a$Q2yCoO`LfsqJxqXC;@2 z+v^pp@S3gD)2fKfRo(0cljRn>YN$EX4MM&GeX_TxKrQ8QjH>cz<*Nt_7tHl$>%C*m znAd2_h4gQyUR^jRR7dvj8e8v+yFhPWt%lE9W}bB~^HR<=e{D=KSEm0OQz7tZk(#(x zY8s~{>x*m!qeq{Qd7<>hT^3F~whyg=ZT32{taA1Ta!cNdDoY!Xk?ZUVH=GC$*V%&3 zjUM^cPE)Rx38G|DARb#8-&i?0E*y-xY*ljAUE1HYUjHX{4R?IqAMZ^z4Wdv!{4nP1 z94ZPJr{uiD4iO2MKO`q$Z1!?PIbi-Tx1QVo4%6d2v_0i4eJ7&(o4ckt_@YJSL`z?>Qt4^J@Dvr;VWh9o*7 zpSMT^(eyxiFl9GnK37SNc%@=tFKoPzmq6sY(&W-)J!(l@orGP6L|DyYdTLbbK`*d= zg?n*honGKnffqVuBpFvFo?AoFRBH0n!1Z#DzfV^zVT3sI4w6!`3u-3QQ zjknHPT{$qu-7c>ymyDGOy-M*M8*yK0S4|U-(QT;k_w9BKYk3YRJ3F1RUCbuA+CWh+ z$FYS>5{){f#+3AW=t;ji3nElPrwyT(A$@VXQpv6x-yTdi^$kIkmY5 z@{bdA86;v@n@>$`A`I7pp%kjP)je&5-r!25T>BA`m8=Y|)Nw3nQekSE|7zKH+jYH8 zkTzQaq4;`jGg_7pkuW|}6K*@P*>P2K_KvMq1en^CeM2wX*BJVpuW|EKjo~|lREm<~ z=v5jxe7#-zuxb0AWSl*ae{GN+idkt%Q2z;9Q(fOIeQk@rQ(IIWM5f|DPZjTlMDg&Q zwHq|kd&%ZTxQuJ%Cs-~t`dUXb99j3>n8qY#&6ME>p_JiAqLkr>qm+@wSe-)1r?dtSP}D;PO3$bV6MVo{V>8&u{(EC9 znj?c1$BcR~>>KSdmKkhh|BkU0&5^-kW=1`@>s(tQ7WI(90%%4(tNXN{i+`VG{?+dx zNIV+uLE1_1c<~!-JtuC+hZwZbT=l0-OA2rH>cE5VGS{dM$oCqg*=^jCz?Ho!fN-9w zz)^Rb2LwUloL&V$xI^5S9?J^q+o@0QaUEB^{IeF;-<=Gz6Fm`DTnI_?GlvK70txet zR`XL+3rT0Hn{S@c_T}v8Pn%J*v5K9(X8z;G#I+*Xd~YSyG}r)1B_TE-A_PGa4%5Mb zNiPO>mbuk_id1g!gjE`C9!hoXg`|dRNy=rW;z*FW(HpH&u1i|#T-RK9 zc5Sf(57$ah;N%8a-eT3CN45Rk-m9i}d(VG(-0h{v@Aisb9V9w_QHtP_^VMqD23%8N z3gNo*<;Q-Lsj8`6W)nI)wWCH27NEL{i<*Ya905h#%{RnQlfq<8OqY9^YBlZmOdE>k z27JX}VFR*qUFGuvO9k^(dc9{(m&SD{a^9fkX&B8wmLWry=6y zkOvJKHMh*QB;J?!mOp6ZKPBjL$Q`Fs+x`oUd|rYshkWaq9as1gAoS&1D0vCw`mI2h zLq5i!C>n|D6W=oA3;tay3VHaUK$k$i;2S$A$N~LE!}M$_owy*+J2#5~{qGHv7?6LV!7}{mDO1RszB!kK{#C=o26?o{ z2K}YX205|_4pxIc!7$YZNuXCA^35?!tX`U8bthz#`p%V*M44`yLK0=6JMC;q<+f{& z->7-oeL-q>7bG1+kEcLVU1(%iwa-!?CA7T-Nn!0u-n)`D&s16V5??knd`Y$8TuqJg zRqIylX6ioY!Cg>Dt_LP0&NEO079_nf?5a*keB(oUg-JZudRXKn@!||VFd^~M)ED70IFCNkQaC=K4S0LA)Rof+QnwMH*Kb4|*8It0X{a8iJAowe+)Gy}J zkO(o~+>qj>SL1y}9M7fNU<;vEnkOUd#Ro(Dib?RRSrSMjkseE9KS60yK4NnabCRI1 zGA-G}6Ygpr&>r2KrJ18nj4MFpgpb^AYnh0C-zF#Rj|tb4h5#S342g1R;wL1v`@=R3 zF$W2Hk989|L)h>owwZ)tb=fW*)wc>J(EEvy7+GZxSG{|WS@L(XMIn1-j~0Fmt-sI8 z{8cUs*(-ajTGs2)G#|8D{x;VJ$#NiAVC8dW-7ni!KOrEoSmg8bbOb9M{?H12oB1-6`SoZp}1U52D{O0Cd(1?!P7*x_-cvZRd(UEFG)jji#m|V<{pe8K`T-kN z&)2H~;db-3{x4w7G1W(`C`169uc3I&g$Zl|Wl+lm6vN6Rv{)U-rq7yNi{z9$)fPm0 zC{0T15xjok>!!CU?4dM@5V(3kt1LRpViY2#2PsXVm)ftN0YX!Rv38Kq6yiG6*py>5 zx*!~e7h-H}zM>dY!_ej_$69ib?i6AQ8rnGJSe_1QoI*@>LmQ_YgXN&cDa4>UC{!uL z;5(>g3Nc6zYMDZ;1cus-a!dw;B&QIQ#vsWl#N;wma>_9e4QiZ1%vVDjryNt;pvEc0 z6gaeT$}w9GYMeq$v4b4$X47W8Zr#$-dL94WO~rXa)(MSlk;gLO<(z56S9P2;6F1kf zetU!uev;<8vBT|)pP*bf$J|&le5-Ncjs&ZZ;-9`I)OB=XB#ZA$$z-4$}vatN$J-_^GzMsmVzmtC$)O zc`VKI2Q>XMrdFCI4!=QbJmm2+^wj1uS@U2p>5*hoGFe7!PD~h`oPV|b)>>2KeZhF* z=R$*DsDzBsH*}smq1ly94#@A|S_|ZT(tb17gNR(Np{5Xu{Xip+>#5?2F;rvvj5W6z zru4Z`a=vUFHKECSm@TjBLX*p4tX30wud$jo1vg!q?F-JrsB|MatbMA{Kqd>EswlR_ z#yX~KiX2udwOYtyK~mO24oi+&E#$GXC~F~yW2O?1u>H;@X(M;C@_yEGsd3&=wl&*-p3L2zKfvuNd&#EBj{}yL2sJ~R&-uPYj(ADgAtNl zZQb91>>1){+Vf>pRjWrQ6+;}IR19%+QZdBQNyQLHClx~+om32QbW$-yxov*@c|&*0 zy_W@f)dYFP1bMXtd8Gt-l>~W(1bKA?6<$5=Bp6=v_1Xl?s}nGIM0QpCG@26XX|Bg1q2@yxf8c5szzlJq_XQ zE(pn4a|rTQ7vzmD$lF{{Df#YF^4;FxDmYvj-E|EMii=yXQp)g(r3|lL%J53246ka+ z@Cv64uXf7t%BPIsCK!i@J#@$4TL9b}0Nm>j?$rnP+Jk%L!M*O_UUhJhMyc4lgC@@KT}{C3@YrcG^p^}O&OOh-b4}fsz=bP6hSX)1P6(b7dC{u>X@;Hsfe(~Mab+mDXz-*Uiw(*g5s2h2AfF#orj+E@C1{Zy-?s@ zCU7qjxR)rWciJ?xg9pZ%w2y%>`f=vv5adM=N7dfsSN zq^gcPx&5d;%O0me5?pm&oxWxA*e!Y<6X+Gjudyd)wE(Zl72Uc*;@t*@r`DlAn`_W% z2|Cde;GwoXuBw%x6FmW*IhCOkJprz<3<-bR3W--_?%U$$*Z^K>8R76wXj~kg5%oTf zCP~p$68)n)=fW*Htp8FR86KV^zP@TNC8*YWCM39PqO->CnT&7JSz~moWwTPw0oh|Y z>JE_jKy^Q`LgM$cogdJTJ3Ufsz{jRD=39Wx*>a)8s0Dc3bjCsp@SN$4#TEdY%a@_5 zaSMRKEn{8H>JJnTcgnckJ;?V(E0`S%%QW||U|fWVV8!kC7Xqkrn*dYK z5cHoXDCs0D0TH4MDY?px$VyZMHfZG6i8V-%*9Af1b5#cU>g?tF^hEXg7T^t*q2iE4 zhU{@4uZe4q*PgGxF; zG=&ahN;ee8uebpbRozgmqeFchr3`}U9J{qDvF}T}vEQ9sCD03`V>?H*$5o~C2u9U; zobpwy(>Dt#N>`QY6g=HzQU&*~#39gE5LP$n`qS3!mo%-015?j!L4Ga|2)=@lCi~}& zt#|S#&@Zl5!$&QX$vMQZ`I%0wsaab2afrw zboM7JtR7qK>`%`&d%;;&8IJ1g7L&gHl2`W}Jk!z!8s|E@!VM?F!*#Zx8>bp#ubHi| zv~^`q)Nr!{yxjEbwzSI4y$+|d|DWC}o)TJ#<7r{rU4<4MUTV?dr4}7tYSH247G;N* zTa+C>Op8I=PV_t2Sr6`!u710;r<%3}UEfoSGj5kwR69DUs5a!z z=<2HZQ7>#II&lSgKM3-o3i5&q@*WW6?JsDUh;hf!$rvy%WWc4nMM?v0rFx;Z42g@qwZ-L)EyznO z$O|jT%PD9|qE!+J1pO|x8@X1O#?aj&Cqok!Z^G#91EYL+1}$0mj3Mdw_!<)X81Z?-M{;8t%K zpYQGA^Sxz!zBh=^?~5Pk{@s|S!M{kq(1dplyv!YnGqdLcFY;mfj@MhiL%jn!)cc@A zz1(5H!Zr)XW1kt*=)(ItT|J~WryuirZHHH7xGG*Cv4qx|x78M)x25Oxcuk{ghZJvL z=;t^jFI&VaN#OUcG%0KwSuri$Ac7?Ddsm(m9U-!k_`mI%#o(C!XE0J&Vf-+*^NJLP z*6#o!3fo0Cdus)Y1kCFkFt1#|eAETZ$6UaC#0AWU)Vg@{!K1Y_areqJM(%`sl|dUd zQ|Z)SJ8~HGF3UYRyoY}8WE}1r8q1H_0COM>G&>=GJVDElziE(m`+jmV4#x|FY_+IA zL$_yjLfoX;#_`aBb4yD;Q7^t5YJ7|ckFbS7ZV7}-F}YP(^97aQ&IVF3tGP zh3=fzo_XM)yUc3T_n=vPKENu%`5rc_Dj%1Xs(hGMScuw}*qK!o7P5HfWVW?@xK}Fk zalP2EOd+~8M0zH>K_2edHT3jPT1tSY)RmvQFHUSC4p}Qu1n5&j7?@ybP`W9P@+RVGeLVHnYvW; zfffAvW6AacNiaF7zKT1_+xlAJ&)LD7;qH0uU*9){b3*jdbGd4|1tB8TN1>CtO7|F9yM35EBdqe=*|R5upTraAxl9L9V$s|&_4x1(p6Q^M@A6M z{VgoAMyES+?cD|kqNjEvhHiu7eq5b0yk;o_^}aoKlJXIdxzSwnCL0yF#@_V(R%&-H zU50vCfgtH0SuJBt-8bvwm8Ach;WCmlNKBIbKa6d?iraSqfc|W?8a`{8dAU)nlk{Cm zV}f~&Q*KeN;#Gam(kkb=w#wtk5KiToHJ?wN*}>}loi=O9MMozLOkAsAZ#IJOl{U(y z*$Cin%g}5D`GzziYBnPA_QZD?y| zKVaz}w5uK#fV{z=MIG;?FIkg(vB6;+gr;YP9`An~M2qorfNK@(nGwDt_GC;lBLFwb zgDvCgvT)zG5OCkq?<{v$&qqTiWIym74Mmlcvte~ zUdVqmXw+Oc*OJ&|#uYf%0s?=rJ%w1cG2p5ARU+_{i{Nb9-l zw7K%5Nx_|vgzk)zKAQhu_TB|tv!kr@UEjX-?oKD^BoHzoB+yArFaeSv1m$8PpaBGT z-$JL8CP73&22Dr;x$H}WqOAmNOq4z{!-{uAkVXLmgU5&{(Lo3oH8Nfzpf-AhM4T~- zn)9!!_gA&Px9Z!yca-zYbDr7H(_L@<>#eHyR<&x?S8FZxi5&<*L0)M=s9f}`rsjBW z$<$OI0%TD$us{e*tU&OEG4}zp2xidM#lEmfQZy$J12^>h@_cfBPgF9mXloDh6FGJ- zha_C(+9;kJnB2WX>v;AqoFjnaq<)<(Zz$#icT2 z88Z@_%;lx>Y)^)Pr0D^&45RDjdNM?h0-s1>Fa=9Pzaz`C6S54f%L%Ao$;SmRhh%_7 zb$yhD9tbmrQ)C>E80}j&c9RJs(!u%&hzQH89WHJJPA>4e=YrY*mtlZI+3q*4^kj-v zF2gFAKvyPjfZPpMD1+@XZ-cN1`ym@9q%zi_rT3W}AILtc&gX^S6R2}bnS7}68&)%| z%C=V9tYMsE%b&ICbJ}FNUMo2AjNHZvx1`Cttm6AD9jxJim<2TZK+^1)>hAcn=eiT- zFM7i9-FYV-fBwm5Z|u%L^Tg9fCqCi+2T!oopf_5`f8IJ|r+?C>zpp#$zQy*$`1Muh zu3v6lvo+3qZ0KHXk7V#&gQ@Pq%FbQ)I>*(proM|}OfYLD=4G#$^aX?Cst%{-_}s#W ztiyi>VTpFdo|%UoRTbwq(K_iWy`)nHFuu!zAbe@$ zl9PL~@6WNZ4U%v%&N}?qiD4>khx;iuG~sH5`^Ju@VAiCmFX>!Ze;24`RnTv&3^XAVq{oKB@R~;67D>V5PE5Zc#dj6@_c&6x z@Q4AEf4wDzdoq(=;OLns{B~p7(ury8Et!;jmvI~wIZPcu(qmHf1+)Rb(LPkreDflO zypOZVL?P+X-K|>&@ABjokEG2uc*W!HN3UWw3NJUN`ki-_TxA^bji2G&qG(OQOO2tt z-xP$GOg6>j9g@e}qlb~nhX947@qMsIVtQD3+iMJg;R`=$;t|&0ahWT>@spx6vPd*E z@BxLq-?AyUf3;=P0!$2_x3ztfiNY@!Q+$D;d&Mhd_ZyFk8sOW`TqPhV{Nb+|FnLQ; z_>)5>KiDYb)ssyF`T4J@yPpr6E&2Je*-|w%cGtUUO*anp`?_?n%h>pMK=b~hW@|hT zH5<2LiXgOjyG64#tU%=?n4b6uj2-AZ+UQUY;bR1@S;hgj;vpL z@TS%;;kAAVuk}lKtzW`x{Ssd5m+)G@gs)e>^}c}I+hM)+y}j03-`jP)^}YSqTi^R> zz4g66*IVEFeZBRo_^4iS$Oz}NHM)m^WYEXmAs-15^zMzI_gMtJBO>Un8$oZf2zon2 zuu|>_lb0%$F9$JmMX;gAJxdKe?pbQ+anDjik9(FHdfe0cKu$fOA8C@(yzRXq$m<}; zYaqzWFUU(T$jdIsdqB{7?H?Wu@`4A?AI3YeEDU|ytv`M=esEUgB-NP@gXg1kV2ygY)uID*zE z&5l}{H7+!2Xe%1^42DduhSF zu;5-+eeNs&`B`JsUFpRXaD z9YjHXD^O4^O?5bKT)KDI4&1ve)dc{OX*N7Ce50P$@>T;!{<3wJ_`Ut$_eKQwvV)Hc zJf3^MiG7Q$+H~^3iz&!UD98&Z$jc?jizH~g|90*#OsdQ5_ZJxz5~HRkg1xK>t;JpN z;wDBUCN>gEj_qXi4oSo$Msh4k#aJs`{r);s`3TQp`YvjF*BEDX}{;M9O#-Q0yA3VA)@_Q_K-0^Lqx4w*y*E4ajt>nSXNG7tA5^ zdA8gJdAvbKhYv9y)I-+k!RNaTzNgfH{2v)wfSj?=E{{EfTxTUG>eY#QaC*f*U`;up zAinTuXvN1^__6$>G>>wFusc1eCm%RYVIM*d3-%~cX=d@EG^sNmRFn98csZebpiOGV zhn#E12cIkUVc1sPhofu62Vc10utxe|o(~ovnG`h+>i2)9wmxjNK4$4LIvO`P=GTLN zGM8UJRt`>Ax>|W5!Sz9r@P6QrglLxYD1*>aeYcp zDPuZvxlw&eHO=d~=7+H#FtxFqoL%;In0A`r;F%-%UT4#j z?q$=%*Z^;|0=;eu@}NP}-O@_`bC!8m2H$l1GMSHMaA~d74YnB-lxx!99= zd;xFn$vi)UZ@Ocd%(ojT@$ZOFV*`Ar6@&-3pqX$(uzSx%d*Qq7wgDYMGNc0|0$pwV z*@yu9tUyMDyd}3SBl^gQ9agasfbxJ=9KYi{M8v~vEUB5h^KKvBiy#@ir#DAIemJ}5 zhEY%Ea|N90$xLNW+%VmfIir9xJ(*_~aJDCdi>A99=6W*tM&O3*oa@Sx>Fy;mKa}tN zcSF80Lpve)T(7j=zk**Ev+V_v;ff|xG~BU&W!%*9=4o9|V|(X>=ws-TYSLps;-SC> z&AQka#-5&Hp2`CeKZ+0X@3Nn-na*Pq*NP945vulP@^Ho5;)7(+ zif=ZLU;;pVkc?yT&Glr63GqQPgvGa^8qeZmI1?nndeDS~ECoq)s3x(&_!I=mP*p`A z8RGJBQJ%)eG z+hD3(I6X^Cq|KJTV6z%`tqrEBBVEtKjGj(I=Qw(&HB0mI(>+VfPNYq6a7lvim;EIP z;DhCo1o>NeTGSY$P@Di1Y~70XJo$Zkb}GM+n2c!dV9GGzkQhu_u0Ak97;wU z`Qh#^|FZSbe5uyjfhZzE;*>$=f8@y63Hg;A8P|<^GLOv0)FZNFo?5`^p3F-MIMb8C zchlW4 z8GO`uMW<%h)fN)LhoiJO<_3rv0$+vDWws#IWaPaU*l-?WIgA9n$57U@fspu6twGLa zE5B+g4|3cpK1hbSUfDFA$2^`EA0(q*d^33p!1>~XWN?dbwkJbyh!2u+Exx&Gkc*Eo z{$EUwU=?U0L>7P~LR1s-Pjawqhun~ZWf#H1c-LzQHuhvn1nu(S66C0(rMg2LJl3pm zAQDIiOAH`_Brg~U3ql|lU>Sx^E&zB(cD*KBG8js4M(`@-2KH4kS~LvddfA5GWv{F{H&#e$KkTiRyx_gKZ z7H_n57QYo}-hgBo5iezx#kwycsrH$aaL@4LMiGH1igS$-4>JJd6sU}w#ynm$4fPIDxduFdXy5c zPATzPZPM{3=`|NV@9UKtmU$hAWnR@BBr2$-=WA)T^pw=nQ{tu9kJXa>^hc-fuX*{$ zOT7l;rCx{h8b+kwZZ6{kz2xzUZZc5kw{lRm*Q>Fk@3Hnu{XNuYg3%frI}m|_P?1Ob z1$n&$d1XSZ(mwKq^JU=!z2rYVS?*D{!S<37P7!`!+4rJb-^LagTz_Ki)0CPx!UcO% z8DsY>ks%%I+yI?#{F+bG?_L1UE)D621Iyf0z}uI}ysI>^eOIL>x) z)TwG{gA3rB%l6KpWitP{a36}lZ2??w1>qhZ8Xt$dN$=!nJxtq3!#-s7`w}i--cuuY z=O^PBS`j4kRGSWUrb3@my;|>M10g0i#gaF@ZFz2MPjLR3y$7t+0>M=pFOWD%^D-o< zL^-%Z<`u;QVaShqfP>=&Q$4`%j~7h$08_;ap{bc3;KK2O*&YBl$;+X}Tn~VctYAas zC~4YoPr7(?IONaE*n=DllLIS$B9LJY{t)q;xUQN;u1e0 zFp-l~KZ_zQK@`}a2_JbIl1P&LZ(H^uBtBw?Ku`~m7ZndH0QIF`fXl5w)`uiqf|-`d ze6R88>!F)^GCz;0Fn@m4Un0$ zc$N4^_he2pP`X1B#<4P)r^ zY2RdPeK?o}BCVB$wr{g;a`Jb6Yu?6h4fC7moOE)7n~sKubh4nM>3=lSkT$j_Yo>6q zU!J>BO9ZcZcqP;c|0xY}QtiavZ!Zm>Jv9{x@-=xEdenshJ ze{oj8*u3YxSpoBZrT4o3$D-}=r|;u$bbWW?!v@*MY2rBXg#0qE*PFiUs7e(yJg3#G z-bp#v?AMuMU6sAf)>YXXcU_fN^Fr+h%>)OR2!x+93v1j%V!6cUED}L9eVV=fSCt{l zo7U8cS1MNa!p2``Gl*Po&9BG5X}Tx#?kwyAB*KQp*7sh-R&Zytvby+VleF z2E5R@Aj`Na@j85wIu{$i#$z=;YN>7yq)Ms-hMKADy4W6?-e4}G zJ@Qx};HuGMh6~MWMKTa<5=v4ZAeUI3p=@Bdd?=eY;;?L0^I0LI7@Gx&UNzB*D(SK6 zU1L^Eb->20c>S0auN_!1v`2nuMb*ew#4<%PkY|qBDoFq~ZmT3g+g7QpZL2fw%5bHn zx(vM5Ruw;FX}E#lrG$?-XX4djynWi`#fqVk$JnLjgO&!2&Uo!zz_1g)y9SKMIyk%) zFwUIup2mP7=&2@Xz{Vx>IWMUmc=3V?@^T9DVhZw73i3h<@-hnYLXk(f_nUh(gMV20vbQT3^3DOe`nW|!z`JdjwYoD@Z=mH3y`>0Q}KOE-eeK1jke&87Wur{BIpel zL9|1U2zuGWWuRON&;W5mL?G=;2O;i-4SZhOfO%m9=4B0-7d2pB(j@0aX4`?2@6!cn zzW+fJkHInBT|Hm5D_17&bv1rWtMOwdHGWJ(@^RU(FYy71I$AuV2vf?j7RG#OG51^M zm+C={pkDAQ)_Q5~aVKQy@zM!BK5La8tHX=q{S9VF-}unoMT2TR-F39__AGmYsq0>8 z#aCOpQSW-UuU-P7>PCIB!iv2A!%R&}_~hvB{Hwb&&OgPf0MnX^Zx|H&7K8bHi(AH8 z3?J5{QIr(NpwYnL+fDg>rtKTEadtxfltDVAw%n7U{iC$>S?uN?Jo(J?>!yRqG<+a8 zybBV=!>0ys&?VVRHk!s|q>cNeQt4yX19Ody&CPkj;nJ52{0x%|{4|pb{9Ka@iWsX? z2zm6$=~{lQqHEKG(fh;la` zFe)*^J50z4Y~I%s*w!YBWTxA7hErQLMGNf>27nj25mSi!#A-zCdYRc{DaZS+6(cc~ zwl#mnTvkR@br3W4@fNH5^SQb0kZ(6gyRTXYY}Kt1Na?8ZaccDsXw8<{GVI96c}u6e z8>f0Qk0^YoUeeE7W86|S!Y^EI>GNLt?sh@aLbE3I3RCqmn9=m#S)-)$TGd?NU2sNg zT>}qkV(+!WPEFKwhXrV^;i9gi@bbxFGSv}7&srZ-^+K^$OVz7FH&xxO{mUUU zn-G(2~t&^_O%hAytFh0R7Xx{@N`}Ntd+aR&^gfEBS?nm2>$-=qp zaqWWq#b+gGru*_}S5NMKLp75@{_*x9BQ4iy;;Qi>f;^widu}@+FUTUk2oh1lTcXZS z&A-r6os56w1qr&|(&_HnQU9K=PvAY4>HsI?%}-55+F!YM>19t#nNM1(_8`Cb^a0-k z7p2VaeA56V^C<(>31s)o%(s8JHtLHo>c(ehzI&H0u*|hX@ZN7p97kO;;C!WJUOxo? z;5muo^Oi;hw>~$4PqH+Ek9vLrpJ-_W-}-_CzRl7IK64>~&$l#!@3Bbuh@}x6x_6w$ z*b`K=R3h}tD5s!N?-7p@vH5N?>LHEzg-EW7aPaP|O9Cp9G(fyUJ?zd0u zp3Z4r8%B`yB;E*+5;qA%`P(k<76d4=R&6!9Z1pWU#7}dl$)I_SiES>=ERK zW@si68{>45LCbiJoMeWBcaaQ(IC7F1j_5@)jO@rsW;o0j$uKk{Cz;_mT_iIIt9|u> z%kE4YEwIgX|NJMT>8=X&Wc)7k<7lle&+Exx*>w2(yebGIGo~&*Dqc@-Z7g@)6(-$P zc}y=rQe76feUZ$IA9JgqoR`03i^T6n(kBolIj5@kS$`E6oE9JvE zowU=xA)l$c!Gv8bLPH|7`kkLUaGtp(UnLhVHnLne7rxzHI5k+fY<|Eln_&ZPF&v2m z;3BGS?pr+0E}C3K)xa+r^lSNgy6~4a78!G4M;Ur>nY?ci8)M3-iXRv4pBlREwPupn z7t=suYqfWv84*8eb^1~la!|MadVO%zZ(E(aN?pi7-TK@0$;s{if8W~rOlcGH*-y%| z-GSw=n3tx@R0;XcvdB5GjGqQ8ngh$vvlY#2Ee+OLZY*gS78?ha-)M`BPn5+*eL#HF;Y0kBOnTR5Ks z{pWeryAu*81~&i4(+D(K#^6_L?wgAu&>v#|J5)#wb{$QA^;MXc3iS5qyw=}_F7L`N zsD3^QHA`J8{5zD7?RB5GQ8tx@S%5swAVqvPM~6hlln#Hi{@!64{9e{%0di24*lD#e zhP~Eg_=O@KH+?xXcfS7s)Vb zs50cYl{=%ud42WALy&m{L&k2H>=|bf95cXIG4lp9;QJnzW>q~f3CVR*^6X#2kX$jv z2RWFK_b+{)+4Os!LVK4&a^ZYjSeDF%lXW2-oaqbDAbalF@rWO*+}mwFSI>}xDSrPF z8K(MCcPS)}jGAx>xaAp1!gY#6wfn8Qx`E_+qHb=_7Z>6s_DzO}kuH#2chsI=8mv>o zMv(1a;x2ozir>G)g8dEOjI%C-T(*1eC^i|^@)DaXAs0c34as^XR`u(5@v%@JTq5@` zk>OGqZO9$_C!U9VmqPy0wQf6PPnhX!Y-)mwBd`b8rS1>R;SuOSu@cTWOmx_ zf~*L6OWAPPzeI-J2=TEY!Cpjck2S)3ZDT@OLw>33RouQz=B3-R6(Lz!tW!Ozad#yN zxu+VeQT8v9VP;!rH?3)pU2E(ZJ^OpWX8o2iR=Yn|1p z#>Qc)E}Ne|T8q`G##WZ0 z3Ul&0t20|OQLnQ)^EH$8I;%55GCQubI+H2$=sK%2`7!gYv$~(SHq6g&+_=fU=P^n% zwdZN%184fj+wrE$6xrZ^$Pf!f(mCy6gwKhSC*7QI`v5m6>6Ta;YlhE?&)hmg$zR(- z^kJD}_zh@Ezt)ziCv=zUOVNk*QEP2w@?C2RzkW3)3V+_1%Ezxk{_XL}`prHl96cd1 zZ3%*mNkPe+al~&r7a@Ug5~nxW*ojbl@`*sWW@ zcG#`b!*W@)=9}(Z3Z9|#b*pkw%H6^yefT_i?$&v38g|(>TT>MZcNTmI+4r9me;tZuhW9(#+ZX=3D-ILNS-71r;LA)Da+BKhGlkr?PLhmr)_lXT2D{%jGLB2q?1+<85||=Z zdrg5U?0n+j0KvT&07C}&Hi=^4L7Z1%|d zkp*E8e{7iAprM=vW3w>|xgT$eMIra+lX|3_wPv$13R#FY#iEdV{YfsOoaJc=i{TZ9 zQWmexE-7TGI;l&_S;{sWqmb=}rX?t3bvvm?%31w3#u`PebSE`MIV<6&@D#GUFsU)h z*i+uQqHB1D_FlbcS`z-Q#heZ%?arstdNUqe8j|?M9 zeBPmv&wDe1xRPDx2$Es)SBsF$^O27XV^DlP1R|gJzxcfCBj30uyY8p}tTN|y9p2`L zKK;xF$q#)xYX~_AfbyFk6Qd+Jyx0hV!}$Q!z~6@#8~$$o>eul1;l+l(54X-m9bRmB z@^C)G#0n&ejwf+O1RL%+yy)E#IU5c+yjVG8Rc91#+=9WwPtWy$+vBYr*y{1N$B(zb zhWQy;0rRE~n74Gm>VdV#53ImekE=c28-dLatAODP22#MF8A*D{1tjArutDQSv3Vy3 zHt$2Rc@G9Q{})Hp#5F`2Pizb6yl3sVE7^`sb-&h+bHg?e4v$ zbAg|aa)A%zT;R=|3%s#&fj4dPjhJKY)8TfO{{1dnbTItu{oABDY39qe~aBr8j zS}Wa))YeLPZLNe8qs3YYudS8v+FA*(t(EZFS_!YMmGIhH39qe{@U>ZM$VHrSo2At~ zB%!A(Y4dEDH)7=T7F2uQc!Ip$VpVUn2x2iVVyXN$LCW~M&$MA2m(GnM?!zf|B>_@wn)!rh3tq##WK1Ac{+s=dYqd~xYhz6{V(6!!> zc$09@4_B9@2zpyY&>JFxXvLBzf_|wJL4S>ipkJ>< z&}$e$uTA~59)U1W@4l9L_f^+db#PzTQ18C#(iu4$>fKje0wZTbz5A-YwaDq!JKh5^ zkBY1*X1Z{`!AE*ReVixMdp4n7_k{WgPpFUYgc1kL2MP7Dolqay3H4r2s5iq20@9fw zUy|}zh@*O`6>=QA)3y2DMNZmr7A}HhjQ?RR>~tw%F9^dQvTJ}K41Zb<`TWcBJ>|LO)vWgvv!WV1&mOjWVR`5dlG_x; z)xH(1{7d!-zp7&8H`_x$f*_eyLP#!o)5rEO{{7ESc8egFoMXy^E%#Orw!}8Q3w-_` z>|AiM3P~>ej zDDu7y`5(8(`nVgJ>MrPg6RlS$rw_(AjjmSt^iGGpzGx;?%#|NxF-sHFCsGbC&Rux2 z9{q>!=gM1Y?ph-A`vtsniOhWlYDImgzN~&q4{(A#YL^Q15iEf7#tQTiEP$^cE6_)< z0G^Yd+S?BKod(5`Mdqf`fF4ECSKa}BzzV{5v7i|(VP5m05zRzU3`X|hMKYuV+W~!Z znF;P%BEzUt%XhY>hx&)=7(&C3Z$+T|_oHTbyrY))Wmnx{g?hmk@Gw2ksRAA_RLhiC^Dk{yi7`v46@C6Qd-g{OBg+rPhf-QiW$a>4;ED=R2b?S z;&?!FrqY=1)3mLFhLTW>IJ_tzf(lpmR@l4IrK=@d(d@w)c zjQ1jlK5s9h?O^p{lo0aoH3o*AMi%5A$)0Ss(r8 zIzo#-wd(WwutkWdvwDycxAkjdWAK08s{Xa5gU`1E{cRBrl4c+B=i8rZ59)lgrHz3* zntqfOlFG6{=GNa!Y^n5$yoy?Yd}W5VL9S$I0g{c0M|H31=JXiH+{s%$^=p6jlfVA) zKfM36Q-}L5&mi9$4?cp2DlFhljPi+*3-Y?RbmVi;r4EgpJ~N&*Ret@H;IP z1oaPxO~p*BT7#-^WZ00W8V@Pe5BtBAzxwq`c{@c z8*7;Z1)S>1ytjbUJ(|gQYNqX;JVMO(2RaJ)kbg};a6*6T?uYOA{d#8SEg{z|}d~z0Y8=4`cxV(sh5U_MS zd5K&vkXbMX-{(L;Joc$VFf$F1Y7vLXghpV4W^9MCL7Xs>N8O7ci59g6$*@-V>IDv3 zI|C3z;)P_S8}D=;`oxxaAsPI}JCkPvLQcGpUodAF?`)nRh(z&1GEEroTn|9BiWl;1 zbFT4j=mBuGOanueoCvB{rwu+j!1 zNHkjRT_PlKe+0co5k#d|mXZ2E^#;x`8{TXT4B5fx{gG04{|dsBhUNF0P5hsctDS4VYgrHwY2F(8&6)^4?xxES)cX{061+4VuDc?J154{B7 zUJ7t83AmRA+{;n&ULpnX14~|<2zpr}=mm+Omm-3tOHVaKnDCrRLxjVN4G|76Hbj`P z+ZLtqB7_xyy%w+BUF`AQi_3Q|$agKsYh3caW6hrFu($6%7kD9Zffpqgc!6?35o4U< zRSTS}(X`}y73BL9*ltG?{4X{T;8%ZhnJ$}@FLY5m3#vLpTFE*!=VoWK)%bMIsMiYz9B~b zJ%%6Ey;=%wjoT=dCThovF38I&Xdp`>Cpan(Pj9na;QPx3zSmsf`{u2%0r!SE(>w3F z?$qn%FF51cdxAS>(%1L4_TG4p^VOm)PmTYdURU=vzR*`MCO@^1jfT9HPWKI&`1-tf z5#C#HO_jWL*Hp<{e$<^~QN={n+8~?WXH3jcjnz@t{an>jYeytVkZ*sSI1&Gf&4vi3 zSoKC71o>NRKV1+c>2!C^s3-Hj%(o5l&ivbv-bq8|^Mn2QxKjc!Z5z-E;yae-v?&6x zb*w;}A^=YxE6}FMr3PGOsV1>ImdRW{#;v^%fE%qKTtT2)OTL%AAnj<#5|E_P5@cST z`L;o_T8siYpM+~OTBTmRuoIa@X%u z6=A;rWaB2RJP3MHjYdp$T(;j0^F5hjzun$`p*ajlbnE;!BxY0(kU7-5m8qT#mK7f) zkw4w7Oy^;MvBd|;KoH+d9u?SMe2^Ds|E$dRWblvpAQ>uZZ>}eU%ftuCC=uU=YRHJs z&zypM(8v4o?8M?Le6~R^Zu?>DU13G*47D6k}H zhgHBrEw9JpW394qkuJlkV+Emp(yIJF>VDAd%0<4h0%$SS18bI+NEG!Dk&m`c7 zKwgBvjSWw@@&g?>cZxhl5AJ`p1NV2g;Pn%$=~>9P*`VX~N$}TCnzo;vJd%F84nMHu zm5ZR)EP`IG2zs3&=oN~f*Cv8ql?axANYoni*x%A)|58Jb{Ywo!_O~{F_AfQ`*uT`! zWB*b^kNws8fi>t+UTQ+H$s#(kW>5JNX%TGbF<}R(p~vCHh8~CWXOwv9RqSZJ{s_;o z`LGI@*CJqEiGcZ-3Yb?RU|xfOc}E1y{~gH>y6$=L1$pTOdEo_l*#&vg1$oH@dBFv( zU+%rN+Za!!obxz#&=bBK_5m z*5U4^^pw=nQ{tuH9A!V@e#I2mKK+P*9f&|dsK~NNkk_m6>qGeHoR=@0?s-)>WpDD{GFk3X_dzQ} zI7Rpa)jPLzFBERe(@sWKH4$&J253kPOn7A&8vb?}VTTvVkPc3d0B!!ZbT6rv?_DBu zk%5}F!cp;4dVuT33bfS(@V2o6Z8ZV>$ykB5ngF&e#xxwtFt({R%=G}7UB{LN(`K@Ot+&SgKU<>5Q?bp;V3*ocKYt5XH>#5e(xVqz`- zXK}d*hTua^QXQ~BT7oLDK{GE&*gNvA!Ecmtd&d%)zsaF;IVAC+$`34(AwJ}RaMXNb z4wy%nGvxtDLMApq=BdT$p@B_3!1GE2kc3ujfXw%fH*i!Buu>X;Bm`pvWPWD6fz3U@ zua*WN3DwvDnLiqD;OHLUuS)}vgmi3x%u!|T2{t&U2Y93v$cT`Her$lu*N-=FY!5(m zDlU9%3L*$e%fTCl2I=774G>`{&+C@&iD&jc@Nz*T`X0zPbpNeHUwwfZ<*D&fTjmX? zKg1rUx7k=`Aj@)8-BX&-LCQ3{4yy(_EQC<(XRN6?U3G8P)*bnGmg&M*4|$3Y8QVrx zw?j8T?^&&df3ZTY+>I%0)P35RU~ViSYNi-6UgYUn+9GYVHJ8^_o6qCgxqL8Dg9e*y zx2=J#tab;jMY3*kzGH29WZuU6j^;P9L?oTu;HIPDA)PGfsN=X2pLYlouNN_VP53nX zI2Wn*`YyK5-0!lqvHcgUc)baEN?zYou-xw$+aKm0cS4q$-{EVfTMAGqTWvOE)fX`4a9%kdF#k6$X(&ZnzUuanJ_U!W>-@45R^h8|59w2I zm~@?ed+V>Wx_8t%t9zfWv$}WxI;;CgS!eYl1r;GhROouLe+ggnO&1M7NIV$%yk8>d zt*y%5f|1YLC4yet2znjDjr8~*0)H`oX!qLbp3ErE4-1fJq2-LW=ue;S(d1w4_^39kvIC0f+5j!}Fe-RuV;W5WaB|N|Fqi__6kk#IP?g zK4voP%X?s0=AAGsTg~#rvOln(!{$NaS55SSO0pNu8}mY{12*mjy^LWHr4Lw?1}}v6 z$m5NGt42?L+ykjCJTSC#k^noOF=ppf1~zWz)MDGtsb1U8sov0*Mr+M-fvu>nw^Ylg zV=qp@a=N8qF~(ZxE+uKU+-(|5QWPY%3wL&gWt7u+e|q9>g694(I*`YiduF{BjHlB7sk?M zYQ85!|MJ5=?Y_H(W37bIYN4t8pvT4B<4(xZ{hX(?Mh!ep_yM7bJ?$sfFe#t!Z3Fy6WZd@2m%=Q5(sddnN(q&0OH;&RpQ< z&s^Z=&|J{AYKC?GsMQTLjei`DAi?WbO7 zOr#CTrov`y{=)`HDhaUx!6FEfNEweCRBCw$>k%w!43bb;bKGR1jTlY8#EeKPxjwMc zu-!MAS&9!EwnHvbiRya{wwvm(6>&3RfMb>qnvfINd@xO5Tbn47nQqq^U~SbDKeRU( z5?)dJ@Cu#g-!EC+_vPlcLw>*@{nVi) z#a7*Yfs~FaABP_U+JF4Qf#0XQ`FHia_2;;}uO^VqHV%hH&evX)E*LzmA3=7F*nfy1 zgNC6VL5$AtjS=LRZDzX&@)0{;Ll8l~^$Hq3^y^l$ta&Twv`-dOrwcFLA?w%e&sY@bAy^r#4LIj;|2LI)&0HWaF8 zKK?&o_yKGD1Q>?j(x&hqjH&%CZAveAa#B~rdHn0;NhFFdUY(8NpEtI7eZf980J7yN ztM)_jNyer*I*4OmQcq1$_9){yy1R8t{Lp$T2L2i=j@HvB;`J%{#6ZFKtS$=0*L;1F zSl{R!w~T$)opQeKK8cTV(v66H>%1S76P&8tgW zk{&qs&XN==S>+2ZfP#nc_aAwR&PG=JRD{E(hsVM%Uv9-dUvM(Et z3wvNbdS8YfU$`foBrB^@X6*Ka;XkuJK_e!0Hl-(Z%4YQ^p110}K=B`aYaL5N?^Di> z_XO$K?7qY{#3xBd`F7*8FSnPVyLFzT7aGek-7qL`odjLek zNO0yv1|m2EkKq9BgB;w4HMoysaN?Fg1NS}!$A?%G+*=Pk8^nmUSxdi3Jh0?V6+v&O z2znz$&|4^i-aHZXwuzuOOa#4EBIr#LL2r);R>l~6IKh{aCzQC5>plLEM3;VgzkO*g zoM8^>>HGK_1!#~x_v}%3;tAE_SuJ8$u8Hexk!ttbrBp3K64A22?aSU%;`4qI-Q z;iKD^@e#AC_#l};W3OZga`Aaju2Wxp&RnGyA(@t9&t#Z{#0SX;T4&Ebu+~|fpdwxK zcs#t=7>|b+iJO6!4=;Kz%M^zfy`LlKJsrV@uMaQcYkU|vy%!^hZ!mBKz1bp&5lHnC zl;&hkc}nZ?xWkV}wSI3kf9YpGti^DNd}LTZiVt#N)q9t`RmJCRD#%+@P{W@0E@4jw zjQAiKE>Su%*j;=LtKYkX)foojgJclI_Q)^{#0NQW*u6^)hv|)b?ynuag$Y+NPlm&6 zK8$q$6}MpSz*bv(kGFPU^X3kiw|BrW_dD%aNx-17yCi|c>VXZqcwmqBKw!fG7&u_i zm)H_XJwRgYz~*foF#k7vL69%&Itv@87mh2vJJf;q zh9K_@1>v2I3&)k-@{zAL{gs%R;8quqSUXlFLvV}Fn{73dV$fo}y|wlB*4EqGu->7D z_4d}*+gn?2Z^L?r8rIv}u->8N+Io9y>+Nk=@6d8>z3R!?_Sna6jClR3mtLRet(Ob@ z;Linq2FL~8bh*GAFc)|;<^rY##&$07BRm&iLB?+`@PjxPRAJY=#(BeWXxrNj+?x&D zTMgVB4cyxd+?x#CTMXPA4BXob+?xyBTWj6}d9Gt`4()4a}+(<>Z7uWbaqsuA>hM$ju6L9by1kE~wd zU@+ifE!(|!1)(H&I)WhawR-;F=%xp|Fy%^MNG9AUFc~65e8o12T2pXLxM#p_10(%^ zc+Y?lP)-`xFM_SrD+Z{8V@DkvJ5ZAAvDUee1HJz@TGeA0B4Qm2_+pz$!BIH8^}<@S zHs2o1hphsepFgyk^|MD{^OHxw{M->RrVf_j0fS~ev-Tx9=40%H)}UE)50>9VUtsfp zs|DZxS!zdXVOb5{I~$9|YN@@NNqt0)y8pA(9uLXddfsMvvFV3$F7N|77x+<~3;fv5 z1%80%0zb-g0Ykl7W;1FTj=9FT0lMzUCSU>SEdcHf0Pgh%_v(Xt?ZLhB;9hrduR6Hb zeD!>Nm%qy!Kzjk`{*QTkco!rW#qhq7Yr~mV`}LHGU(daS=cl!geRA(jrIx*w1bG7q z^0pZ^ihatIzYCHZ*daR@p`_NaWVv$gf@Gc=wg5)VsReK2^n=zA^>$8QoA#zoDAvY= z3H8QHsJCB2y$KWQt(Z{khd~mGO;9qSLyZC*j-AxHCN4DQWJhX&949n%0ob?1p$v{p zM34-}By?H|l4X75^EQkiCL|gohz0qHI)ZC6U}VKogjWQ8JVg-e5k?X8aTCF0tMY&A z7!{U0!48V(^~4zG8w%v@ATAXCg8fu4$g3;J2a6!DsUWYXAg`q$ucM%%TcS27nG`c! zhpxm)c%%TDn9*rHBIZLErltg8l5fl=S*T62fJyj0Ru#QTLYLU&L-sh9*s#gvwgW5( zl2xZX`nDA^M2Yxn+bv+bm)Vcxu`1Rp>&*qoy|x1!`MgPo`G2t=u8XmD*JjvVn_+h? z_wHKm-L;6-`$^*gwV_DelpVv`Y^jDaV;X+K*6Rh0E>6hCYav%5!rt3*gmb1$v7Yz{*&G-r@!DqgJ2~NJ0LxL6YUpWir22 z8ql&u?~n)hs1<}4dqFeA!;Il0D4L1bd9aM~!;54{2et!xN*V13m&q^{MB7yk9s;Am z-w+p#i$6t>>P^$v>#fvy?Z2DX!W*aqPX6vZ>ura`r;_K6B{GK#ALPGf=yFI>y{!iF z^z042M~uuR1)S>1yt07PJ(<3MGd&r67hh0M2B*ar)Z?|ocAg8h$^WC_3LD6;Wax58 zmQJ!n`RU_~;=@DBWFDJ;$lDJ2%nUWgzs9Zo;kbLsEC|VP-JEB^@EL17`T?_yW>QE@ zFkS&$pp7aJzl5G3Y8->`m28P+2^{5Wf=8aPxvPaT%v zRQymGZPeLhbyxWo-w6Hw(5i=*f-UQ%VB|}%S9Xj8W%Q?3@m@;@Z}bQHd=U+jW*_p0 zu+wP0%GP8r&&#z1$X8@&8|3RUv;g^BTa~BJS0B`^|KRi0i);9Nb=O^It#YfUcXM%1 z_uF|B;xd-$JiR6^mgz*5AlBO4jR|5xY9rI;@b<4q|othb4mJKwexCEDdM#jp}JJ0>)A)F zDFQ{;mG8Egd3C;{+XneMgSbZ^|Bk|n>3<^MuT>YSp=!Tp{l6r)u>F-rJ}KWmZl}=_ zUE6DaZm<2hz4m84%-6Ia@4BBcvHs9f%~*#Q5sb764wjYheQ@w{k!3R6;%c(j>r(X& z-FuAduL}3w%VdtV$9EIAmgE3W87t6|9N@)c1zM5={P0+TK5Px}t5zVj_N|cl-NL|E^^+%q!V~_1bbM4=$!uXJ49S{z~7&eMg1Xhc9_FpMpPB~|<&G|?8=pb57yR0%33mQi;FB%!6& zAem)sMLLzI9U@M=kW4(rJDq1D0#Uq>%tgjKlP4$QQ@oH&PsTf&=PSZiypYUV#yi&o z5ZdB}{C#t;@owk=hzZ2iVs?dbDMk*v>tzHO^A1=WP$^4~`-?kE#`2Z!9wh>Ci zvRY(PA}uR_LWFd%@&_V%!hl;QR)~uTdQ~HcuGf@tea8v{kcO3i*ZrbhDM^_cR;(&R zU!xoH$4aY*s#bM7Fil%!#c?@xNays{-A{sR5&1pZb0{59j*=_x*wUKEZu|qHu^fe*ywB31xZJL{L0H9BF|mV#`LRi*lz;D-Fnj$Km3O6maUcVD+Vum#o*Pb z7`)lYqYkoZ7W2jvv*^|7)Kl4Zo{3Fkn!!!R-8x2uL0 zuvVL=FOAc9raSc-eUSXd@$Z>? zxWCqLcy%w0p?O6e=(gN97}Ylq)6_ZD1JC2!p| zRq~b}bvIeGF^M)l?%Pd&+|8b?`04(kYN@pm79<$lXpRXK@#k7I2&TTgQ3YYL&zB#( zAW7p#ipczZ=GzXrsr<0;z%rTh4OFZ?5I4vGc8nEhFAU)Nu>$Rd0o*!PpuMnn81Q~e z!?j?U%*V#KwdDoyNh=6fH|W;t`M>9TzHN}C(Gq0-IP-0XWZ@kJ8uLi>)}-&5*PhB} z_wd-@IN!hK&7bS%doo+|E=@ki_pjMgyCBcV2D^ULllkTXPW5D7R>0|=%nuiErYD0l z^l^&W>=|q>a4tIlV+-6+-K#Xt1M)MjH&1o_!bljQVj#$opknZIK*ivl8Fqs5E>zg} zY5h|rWPh0r#;^)xK$2>vz>TAPPpxmQlR+)=xQhM~SuKGl=K z>*9lCRElpp4^aX^e2@%M@y+BBOKgY_^36GR^sRL=#E$qN8OCaFt|vn{i4T$yEWQoZ za2B8Us37mdxCN7)SbT-gHfX~k{s0T`0(0VQEa=G=Kj!Cdah-etIh$RpZ>^IluFa3) z;?BV%wtt#unk&5y;alrFO{^DMs-bk0b#_9T7JSXHPN4>A753DBgtZfXlAZK9c0&9W zCPv_0($BZ#ug>Dtmoo`R@wLV__@)!kYgTU|X!u`^)wIDhqo!qhHEbm0Y6%q8EN6>d4K`%fA>6&!12zqX>*1dXXN8_~{f_&G4=#X@B z$Kg>n-*dpc<^l7H2h4XKF#k8XcU>fW=Yo9Sf_&G4e9wZ`)A8QA8sdYky6L& zQ%byArNnDjO1zT!`V$IFDx@r*Gz1yQecB|s`L1FuHzl>)l+TIt;)T=g1n-QwY$Pk ze{_o2;jGh5dYpm$!?Q5?9{UH_Zv|ni1)3#SxMlSYZeHx8hpR(A*O>o!?dE*^86^CMOdwrnT9*=# z+pR>0Js^MEpy}@BQBUS?3OLo1IW}A1=INfyg$11H$y`yu*`5rhQAcw<8EhhOLuC|6 z8BH+!&+b-zpy{A}J+fYeL0)6>h|3#Z(6ISHhn)?>T6-E`VnGTrAD-i4A}c#S6)BFy2jheBfH~LNY>(_ozH%@VIy( zA7gek-pzRw5eVXiWE>gq(RpAIAL4~%cp2|8Jpf@NUdY$ySi9-io(y3ntJV&$X0&n= z1&5LjPND$eYsr?rNbS9w3vlr*<<$7WC7k?%8)VNpJH8;9 zD#s0~UL7Pla#gC}zH`)T_>%3KDpLs;Kf!!H>^3*o65JbCCt6GenrynM>nJXvv9k`1 z>RJ4$jv#!Cb<^-ii>cmUX|z=Bg(U4>V_n^ryW9rZ8+4-Xey;0I*0Hj=o4b>5=uW*h ze%G$294$}muCx2MEWRmdCAV05yte(rx88<4zU467 zeaol#mcw`X&PbhX?dhLhPOW6ZO~vIS&Z|@&1oK?90zM2 zSxoy}b7OoyDntG;*7n(!*7FD@=NiXa=MmrXY4tqvrhE0J!aSAujvmvRO2(^rjr3kD zlM-`kHqrf1J)6{=dM@F}&8;$QH;3BR`$nWF6Nx-AoFOuYaWauOHZRep&2&M!ibV4r zZ|LAtWbL7UhP~PYuEx;cn45xG3%~QkR0&oyO%g0Qd7oM9t=VeZAm3@wqzQm>9HEUhO1 zN^UcbwN3!OOHD;^9O2Un7IFNJA698S1 zt|Ae$$ANE3)HTmcsRlUYFWauejONLAuaLXTP%%RO)XP)d#7N7lr}TSf?sq37J*l}v zrQZ+ces@CtX%SG2wId06^s`cBZ7o9KgJh*;}DSa#&uBkeEHSNUk`c+9#iEB8-DCv;_r; zMHG$)53P{HBBAfy**f4Y!U2D_mz1CX^fd{5iT%K67GI_&$HOVl#zqp?y7s!rd^{aG5Vg;eOW<&%^sWl zT}#6+Gas{g@Kbq;T!19r42X}0>KvCR@*R)^b?$z5OC6!8b7xUf=qD}r=qpptQeEg)%RRiPF4U{8J;a9I zV)S}9c3D$ze`B8ca`8~z$%1cAGB)RT%oy4(^iVA+Axt?XechUs5hB< zx+(nZqBtbFO7W9gir;sr71Tm6GKDWGibD<*7h^+lp$)}_HWU}yP+aIFb+0fbi)Jsq zH7_=P$_jOlsqngW%TAM?OYdB_5Wj%zg$AG0X_>%YY(2cZ*c!4(^ro|0wtk>#YoSOv zFsx87qhd#B!>~ddh85Z{tk9N@==XZl>WxJ^NKC7v693hv(cx<7Mb6S;5`B|lKb~V~ z59C1A+gl=;K%>$0bd-c~x-Boh79ao_}^_>NM3M z_ft0ckJkYu2vZ#4jHiE2$H5*yG>X3C#@5s!kea71}VXP;bbxsP`o)kCESRM%MRW z?+aFv-{!Use>Zl&bU!Zr(oHoSa^9rs(bi)>Ia>>Ub+rB#yrZ9N(H->InqqvY$V5r- zFbk>mOG3>%Z9-e8F{#Gfv3>!l`QSqnfNG5W^$S2v0{Nl(g8B@E^-IE_nYWwBb^3y8 zOl9jAfbscE+mu{?3)I|hEv!=osxj}bUjRR4=ulYmk4faw_NbFSfdt9Kph;gBat8Z_ z_RC#D$qg<~hr%2bE>EZA%M*hu)gku+yJ)FP$Tybjn7SnQ=E4X`km=Gk=ns_8Q_I8> z!5|3lVq8JBX@0@559fP46QZzAMba~dp9sP&wXV+8WtP(}Hu7`vX>4qVRS}I+Q-)KM zR36_EC;|;Brjx(T3$#lizm%Z`$bZOC^~76hl<9^29W9eive8*AyRgTiy;!z-WCj^O zZgxe(@ZhN(ra{eLG>Z?4fIgXvuBH|cF`&nI54?NjwwcpM)+{{_(|21t@3&OPCm?A@ zrdK<|N`VfG*pFMKzbTa=zhsaqKhUmRsv~$fa;xJlJ^9b(W)~o7_NXY++^f2++WGLJ zk%#%qr5(ubs>Bpdix~OzvVCyhp%wND21XD{%O$0c63(_3DJ+44ZP3ZVW+y_&Yo?s9 zub(Wugo4&mQ+JQ^bEluz`|9AnjdY6wiX5A-N{B`QWU;_b$oXQ@w;fs`_i#h?b06g6 z#uzWK9L5@K-3;8J7Lkf{e7%UQNF!Mx@B8*tMbW9XBDsGxRDwYs|B@l&BP_SoQV9n6 z@-fCAH4O&hsvpE8jnk+8Teno3A4+F~jt2D=Zw+A^Q5c^1Kv3!{1?B&a1-oX2pDxpTXjoMzJ*dkebQDt)7|{ON{9$j zi?mf+VZ3HP#)kq2Rv`F~I23StV)W`J6d_4l!mcf7S~Up{-#0kD4pJ%lBUh#T2QAe! z069=ecb~plsnob9omOi!$>3kR_reV2Ylp|heFaX->XGvWFp5nVSSOSjy9W$|oOWG}5GFE+rr{!Z=zfBD-pKjixjI!do$$^3xms`kBK-M|LJaeAltQBw!POIS(@8hH&?Bl z^_4c;*$Z8u@<*;p9cqse^6jRAB29~Zaww=ZPMF_b)t!9)89g8ho-oilvIQmz4`*xb zhU9{ly7EdSG|5-~-xwZowJciv!Bq(e6D0KaW`kV{`Th(oKr+$jof41;)tZ4Dub$B1 z>2NKHf2+y!vswKsATfik*pLXJgIJKO%TpcLG*NQ$(^n-DyJ%XtC>v=xTVxL;!9CsG zG|G|wYgza`khnGSkwIpK6C~ote!YvumjyLqG>sKW6$g!VO3gQE#+^Ni$&EBTa;GV( znwU0LoN|p9aKlELA)VCR>;_aIZL3oAO;RPvLb!F^FI|-ooGWo}F_-q)wYwk*dObTS zgK7+)k_YF9&B22rpigAq?}8*+2i&;(e`f9lNFrcP-yaKodV>z~((IQjm3E@tOS4Ls z{iu-)B|TsGo7OXu2!i~lEYwcOGI?HB2j!}tj`@E~z~^LXwn4tfpfkHy>mj38cY{6e z#bL%a!0|^>VjJY=OyV`RghNnRr|rB}Yiw!Yi~;!!Qw)g}XGludg6Q(rd@ofEo>7N0 zF=OM%X^ZL7fi#feGi7=11x)Fb2|Smbv;cX&K^lv999lu6FO8w(NcF^^c<18h5W)V* zYG_TJ%6gDvbGYq>JjbBv?uM0~%(oP9xhM0I0xtDrUQ@uup3Kb!ytyay1_O065ArPr z&FUp6dgmnB-r%sRgT|??I}L5FgbQ!_H+=U&hq1A2*sd|-kPe^^ThVlP-F#2x&kPhF zOaWY(*?4a6>(_ zjY2fm=Glc=sI8lO#!(r<)pMUyaf3_$4;nqytQ0(k{Yf<>>4>0JSU?h*;({a$^m+%# zB4IU_%ftCmqO2$SZqUA2d`BSwBXBkr^kh%ZzR%*`RUpWZ8l)pUD?ORNDtwTCGvp(K z&eAo>TK*4jDco#zj?K;O{FsrSC{U?WC~6#^*>+Lm4-5*Iy$SCn9O1pkWZs*#FgdFy zUp!gAZzBjXI@>CKt)&}f+WAMHG5_eV>46?^MbaITX3x|oE{;EYt~+7=q9+{Rop<8# z=bwD`#_s$xPdt5e;uG$F@C0kAsGF$KG`Aq6joX)+Y0{!*H2vdt!60omM9Rv_5HrHOp3(FRwNg-gnCni%MTq5>TBbpQD5j<>T55;SDvte<$J~?zB;(? zeWoG3UCy+DvVnya zzN$gjGTGXKrd5;R@OA?Crcz$+e(OsT{!vS{fdx4j2ihv|&C04meWTL?Xp$ZFwRyX|Z(vdLS4@?)ZD3IgZEdH@ce%<2R=b5u+AXZQfpy3v|FQ2#cGdg|`F|NS zwt)rsJ1@=rke@JUYy%4rUDdvqvN2_+4J>5)zAW3`*Be=y+gmqxgbgg3{i7Uzdmuk# zDk##lfkh4lwSg6u>uCcE5Cz9JumW4yz@o6rw>7&VA6_mQ>dGsT1V|<>{|`5?(Bdym zi!eb#uVjN=3i&%3T7YDt(asbkLbYb#BWz%;CeIx?SgwG?3}IPimOu#I)Ec_lw+#31FAhR~6AQ3s{R3z`}~8ii5`Qf}?55 zNhi&?vqv#ikWSih+E{TmR=gWF(hTXO=4Lk_8fjaVns1US@!FxWpeu;|{WlAJJSu^4 zT5rx}{%+Y4x%?Tvy%N`WF-MvMkLu$lo;R z%($^NwwpD!&t+R%_@gMX4e~3d%ot0}rA+h2QN$FY;U4DNy zcjHD9XJW?Y)>h55&aJKEP2dx=lNKN^Hb|pX8@y=r;227dR9jnNGdON-fo&w-DCdCyJfQvnuA1&a`J(=D>?O{N^%OKm@BKxZbhxHyb zPHo+TOy1hU*jQHkQ<#->0Daml9k;f~d@=iJC*-^Tb!&@8A8%F)9>e~m z8j^HG&?+n-2~BZ95(e7Zf-DkNW7%(QArfic+5%t%+SV4?CuZMgaqlS*zIbxN*49(3;x|}2*xCYmh80P7NSb}fTU*?mkTz~?M$;6MPFn7arhmXL7^KbS zC?uWKT-W`s-4=09v(;S3vn?DV)(qtxJQ4sK&%MZskkm{U5?^_0hH}zI4>gkx1>YAA zA&1LN{o8B)0M($kzqezHPqO(!$8sT`W01bFGvAZhYL`;+?XmlcE6renAa67%RweV6 z!pC7+PCu(^edPH{PSKS^%~x`QnN#MfI8dfRqTg4_^Ei;4@($lz;EXrNj|1i(tq2%` zb5b{8Ud(`bIRm!ZA7UcY`j5SP4c6a+*LVFbc zB9t7XX8f6ihDxe~N@eJ;{TYZ_@%%_bnGkH2nWR46d!%_!(>vrqWlf-{jB-+0XhSKX zD8;mpc)hp@^{z_jBykIl-~^gheUJp2ZdxG+x@d>Jp^MOlE<(|T30d+9C5MLU-K(eG zy>5bv0yTw72&)}-FR36erXXZ2(!8ja=0&wM&6Dy)F67|~G1FarPuG(}N-Z7qE|}fD z7Zu#g3+{ym_mYEq@xhC{HH8KPS>vhyhO7~9$Qtp6tPyX>8u5m#5%&_7O{r9ZyhO6D z=a8tN_`9<_?aUh`66(cID8du72_;uzCO?zJ0wXbcT@vawsq!|TT$$&U9gqV}v~%WN zq2`4)G!fd+L};za4)2%LXhRcK_mXR&Itq(b``;ILENyX2xaEgtt*A|JNM<1I+kU~W zg=NurDdhdOj+CH>53P_pD!&wL0dinGF=9NfJgGV>(eJPosicAYd4s0ASFg05%2S(X z+7hx{kuHVA(y1GAL{Kn`^&&dhByPknrP zjF~d5ES~v`!qhb2A%IY*#pBg#_2t!Uwd3_}@r)}T58DhN46(tqP7j8i(vyFEUR&*i zMEU2XeYDB~r<@mWh6cw3E0#go*Cxw)tNn*I?#-^wk zZcod0T7Z1MK|0$r>d9PR_!vT@`YGm&p3G0?K{S76Plk1oIKQT^m0GBkTBwz3Y^VfH z;&hbs>mF-LG3DqU8uC3kPHxnpoRfRh)ph~+VzN2CfjqQI zo{4QvCJe251>yHvf}1`$;acbw9L}%wsV#Zmogm+npxn9!exyhNX|0(tRx$&*g$L0)SmlJ;)BdB$=-QTT<<>0~F!Pg+Uv6?C7m z^Ll7j7BURZy3d{-76eJULGO8wzY+kPW{(voBa%DE&|<_V8nVh=kPWHfsnW{hc=#j> zned}!_-+pFeW!T?oIKu@n0FRm<5}$oL*8!<#P4m9InL}RaH=Qsbp@R6$-JSs+ni)NN>VdbD~+(6 zf$ce2&MP5Ve&{EG8+zXXON@ZO-0E^qs4W4=&TbFm&kAI?K@=Z%hpbx#`TJ@?tnOK} z3aaEW09oiGd@%f$`7ZxlKu6%dH*nu2_*(l_*xyxde(5!#zR!gE9uqpLzl5VLTfkbO zKwN$&q;=pmr+}5K$zy(1xXiHY_D{Qhy~r2R&*BxY47~ zMvp@2k(+XD)Ebi>daVF2R`6og9KPM7GC=G1xY5{dZuEN zr##bW8ncrs#1GZi;F@pZ5@jP&k#5umSv(D2AGXpvENr$VJ*FGGxKvurZh(_?mF8zR zpcQFbyP9v3cCz0fWP>&DHwBm~G=V|B)Fu*jdiS9fa<4E{JLH;eMiaN2%J{{{=Jv6UcicQ*Ea%o1;he7?;pYitRv&dPJ)_FAj$XvMs@#>R(sFEl#8 zI19h@CaD%8kYAU@)+;l}yud*5L2e)Nk$H9DgZ#0=H|oj!asj7$ zGQU^A>7LAA6>z2}GiA2X(*mL2d2#*0X?3oW&2p`mFG2 z^y3!6!DHB;RP!|*5wSWU0ZC|z3z9I|NAx{QsTGptxpnKg7X+UrFNCv%+>Z7a&4Sy#CBtW! zm}hzo_Dr_5J~h7VYmQLk*;dp2uHe;)_jC2AHEF%Ot$Lq+Rp4Hk0Ulb?gtcnV8sD{w z|7m6AcLk8{^`S;pb1#WuGkPBJyJciE@}b657{ z`Y4^vG!bv|q7rXoEQ17VMJwQGzIGGvb)K{wFz871t3Q~zXi42UWHFQOLhA3>bk?3> z+Shn1nt&G>X`1@k;)Qw_UYr8@BD}G@#MiDhtgD2?R~Vb?PWGNmNaJ2Y?Vd_$YZn8P zb-rLxV4A`f_b?h+{HQ|}0TG|<6nayEYV#=`zPqE;(|NTedHkUr=zMI4X$X2Syo6kL zb^n)tXsLV)YfJK5Sfa+7yR+$!`fvQ8R%3)%dEI;EyH}znzEUJA-^!_c@Jmz-q^z2q zFnVLsXi+h`VxOo9`$SFHCu+hzQL&4%YM-MeY}}EwQB-WC2^B+8!T4m7mKcB)XT+Fr zM%08eq9&XX6(=aW>@3Aso?B9WWrKrTqr_i*bF`c7oDL7h9WB=6XvnAJCOX!myXRPq zNU;`?VkIIWo3fn_1zBH)iq(|VSW`)jm6cTVP)?z5+m@6*Q4{(^P3RL9J(N@EQ<^6H z6E&f)<3x9N52bEe?VFY*T0;Pagt>0N*aZE)Yroh4M~mHcG@PVt=dAn9SVB*h(32(f zAl{eep>UjB^}O<;8~qJ@j`a%VfsS&;>ctpqFBxO~CDp4opl-pKw_r73#e%IV3sxsA z5M#muQEL`N%}krh-tBc|B{iW>ya|1x*7P}ocbmAs$h?+(%?e=0Tj&*Jz>0Zdq%{Wp z3Bo2|>ztIZI58(lPi$^5_CGBD|2y;pz=~0uk}(rCVS%WLn2FlnhzCvi?}8D46(cq# zjSw|qgs2H4L`@iBq(#Ev`eXPXr&wI`eU??xQXITZ8QTW=5YI4I`jB4cKda=Nx&Rf$s_=!1sAl6OcsJ z9#U+1+5HmZj{zfZed%YnRYexfDw(o2HSy#i|hGer;Vm+1*g(P>6NE zZj8z+P_U$59~UUEU=xOfE3y9W-tJy>QwH70p=>Xwkui?Zf!xd<|4p0DRZ6AD`g8M` z&u@1Y7Z?L5wOj$DXS#;_U+ap8`p(t_q-z#0eWm9;;CouY= zj$@_8xn*Q5&(UImj#f&D|BVfFvDuQ0V{)=;J7dOjHHOEAiWJ)^Qfy$_ah)mLu3uuf zLx_68MJ&1XYOJL7YFb}fYa_ehJC<+V10{<{fae=YpQHZxnTJ|8S?0UT1%M=c!514> z5M!I%P@iRwHTf4=>6+@ye6=Y+YDta7mekJVD!*f)ouz!*OqYAHyiRkplo(tm1a4eF z=1VL9I{l=l`hB3pqq8h4x23WkZF~DTr<7f3%A5hfZ}d&P0`S8|DjukT1dCS0&667E zdUU+O{b2@W)%Q<&)y>Zu7_>BFEs1?_rvN|3y|AIYCaktg>uTcJ$9&B}KrB0$skl7E z)i|upw+Op3(wd&5luew{sPm-;%kIjbGc$Lhbe9F@UMmmE#y0d{*1w_WvRV3nKmC8;hMo=mT)yAf z9+PD2xoqx+9$0>2tOqz&$wXGc#6{Ymw_rMSfhFWIR_>pTZs@;M)?6xUE|r80v$%Ae zu^be$Tv`~+h!C)gsD;oyL%gDAzJS5V&S>5k1i;PqQ)+Q7%2*SlUFC%V!x|Euvg_o-w2%%C#}$ z2@!p(Q8rkah$xrdX)J9b%H>VQR*NVXK4c83h;r=~;|V$XL!x_7MC70 zmV;uJGDo@mkg*+_WOIoK#~+Myj^nI$e(`XPaj?JOIZ#*XqnLX@!;1UOm3u5!tJ^Cy zM#|ItSi8HsHY92l7z-3BmM2o(K(~I44RmYLEt9dtk{Sywsh!EyiZ2!_QY!ha+&e)f6i;kNiYK<9yBEon{b;YPM*3&KL)o4;%PzJ) zd99UG@m?13Y7;Rw)ZHq*)!1&ZQaQfEz+YOKy399qCf(YU8=U9%v{wJ2e#AsgKHe1yMN#%VD{amnY!t8kf{K7FrFP zrj1r=MAD$!cik@iQ~y3-xz(EaTG*%i^?9*%juzYIXt8CER<|o12R(|4)rb^p5h+%Z zc!t%^7saHmV|87}>bj1$KawQM#7nKA?WtHzNsTp?)L2>pvBv|XVw_5M6Z?(Yuo0YE1pJ7(K%1TEA-s~-G z0)E;^+I^VFLGB8~$sFX{q4IVEe-=o9`$$B|zj&&#su|jcj7hPt2^uo^0zlbF+Cvsk68LYouAvDUH%wKo~P0uqA{@fWJ3VU-tUq zr1zK2$$zm@tbqUSNlidPLhTTSRtWQgO&4Jk1~jsZ013YvQMOEC5xT_KDje*Y=I~kG z@e2TNH&WSTGPr)!XEgdl>K=Mk-sJsr;|~k6wof8B?~#lXz-wJH$9U&`k$( zO^F(oCXUAPgrsw{Shu4wQL-*@wAkN(qaAnM&&kc>iszfdYCd>A7;9JEy64u3gT^|9 z4Maep)&mq`@M>F)l~k~2SdSNV{h2w~P@qZz7*Q;F<2aUbV_!-tvBa%X0vHi4d1JrI z(GcGru?%yq@eB*_t9-UCk42^$jc1BZQ6u|;RVHZavE!DMAN0w&{5J+Jw;+m(SS|Bo z=5j)Eb07hJ){~m=e`)FBN32ZQSPeqm!i%twR@8urITv_E7Xeni@NY|Q<$bRsvS5vt8z zXOmE!(kD`BzAHSQ@7wmYmYZAry{buJ}&ohi#sF(GKyiYx95BE>b!n}blBn@D$q z>UhD!ec>AJ3xlFHu_9{6+T1-~-Ok~-dSVLh%9h#W^mQvW0wnel8V&gVHt;2WpHa1J z$umprCM)$b5x}l9%S+n%0qpan5x{9i>dF4MF_MFw6c_>D>`CWW4QPey<_u%b@4SV} z0nz4k4}0Bxx#S6s<@oT9Hsxzddk@P;!}X-cdk| zbl!|6mxkw91eg0rHUX)e*h%h^+P$keqgKz2`NS(O?>efaJY=Q%7T^uXl$TsP1HaGH zu3G}U#nam718SarbSYCK2;enVz3d=hZ!oGD0nt-3#*PFWU435HARs#BB_IlwWt%2J zP$@n@v=@9qSu2FK2AmOTLsMN^z%LCq7qhbsW_KxS@DxU(YR&epb_ z3q8b2yJdhCJ)0AHMiY9{ow(jKgUCik;>k@TqaNXs!y9XkxL(vKnh196cYOl*15YSh zQG3-l8;A)a0b-4-S#K*_S+u4D%Cqc1YpKWk7Ha}xMOSv^EZ`kxhMfA<#6yO3JrOg{ z1;n<34+KNCsRURF(yu0B8@nw;*oYC%QR4CYV9>4!klALCV~mwMTC6C`{>8-1@vhWX zT~xw~&jrnECx2ncgH~#E0K@==V(nzyJ_QlUt!1nyAyTARph&G^0#+Bea*?@vbZ{FG zv-Oa+uA|K{=%6dh&~}PNr1EQUNT=DQ8QCRY<%btfG)rD@Wu@BZjC4o+(oc;v%f_-w zEl3B2OMUiG{;@_H43{utxsixMMPM9_%B8CRRhU>*QfB?+QnR^fr3Mo~v?@E+r&4Bp zZ9L(3<*}y6>oh>+^-L01eeq`Te$LpABU-CmTCHDHh^_2EM;x;bs#N0_;MhO?By6?C zkD!SZt4sWFtQ-Lm_X^)__gY*SQn41{q`ONL4FNaw%*`Ru17`Y53(m@M=!NE(d-`#u zo_>H=yN1b2bq%|e>Kb+_?iv*<`tnrguzIP^VVB~_S9~Tcp>z`!-Opg5pgP)^@a2$qt5Jo;?nmzYu~2l=koZ zx_{@#LKBA&oKPO8q5x0H(OEt>-P?SjlDYf(s|(I@*Rg|SbqS#4b(bI!g;v3F3b$U3 zv$*wYoX8cU`kdxCms@Mc>D+oXj$-Rof>tdF;Fl~_ir2tj79~XaZun|7gA=v)%@eiv zO{`) z2h(cYO4GdA8#My>Nh8h8PQ0c|&Azbci{7@mH*p1_PngQRs=mXL8RD$I*8IG| zO5HvIZZcAL_L_+t1QTYeE5ABZXcwJWw`<{4cKKRy&|C~KXQMY~3=pShNiUgPZ^K46 zX+f#`<5*LP-(fl!vDFV}<%~#-%LOs+_yw^uq3*3^Zrq9GLXSm5PfHI}jAszmjT9i` zvAzZR)hv$(Q!&OPs7Ud!seS+Yyf40ZfD|eAK%`)16~biVt$8<&O6OB?DR_=8)?VZn zZG(v1V56*t9YTQLB6ZuMp6NiOGmV6cZN@97_>7v`CTid2)i${~32K|Mj;`!EwVvs^ zLHS3(@KVu17WRvT3&<7;7f9kx!}>%EK@e5j>(9Ct8WUwAPF+1%K-rUB@x{q0T*XCl zSV;u9+jJ%t8E`KQU-lyk}tlvMg;?9!ffz_V%{a1gdKnxP+AY!ajf|bBIbLFIob1Zj^WaWg zw>#+_!_2cDXY%@V0?xf+0{m33XAlsn{bIdN$Exe^0PoG<8TQp{x!&-5WdG&I-I_0D zAlLSlWp1S=W5D_S09-t$B)QGzk=khCt|9L!)2KWQSgkyqtXviFac|Hd;QxA= zs{!xyHjVNpb!PjzO~6Xs+iIK6&fK|H=kcK~V5RQ1q|MK@I)p*P0$`=?_L^RI8{Vt` zvJ43%pWCqpK6#e2&)sV*f0}_0&Gw`&3--sY6xZzrqC0T}qO4y2J8s#4zN+p6_9=O^ zIk98BPv1m^aJpSk@7OVZjv?8IrDN=F%d*r=S}SDcJ-i*GQm`C=+)b3uO|Q}5OK_E9ZzuW ztoi>%#^{W&Weh2)RHwzNWu0w^8uTuW2dM|K^_q!0dzg;0eyn?+s`jbiA6b1`NRaj5J-VFXM*vTN{^WYW^GVvx^WJD(7gZoal4o=zKpuF>=1mM$i@k z5E(sF0vJs1vY|J{!?peQ_dWsMZKM{x5PuZ-0cp4v{;5LUa?JwR>tovl9Q34NK*HXo z;Q^R<_xmP*^0XPHrWutMfJXe3ZCfYefEC1ggofh?6?{bIJ3cbQfJDfd3rw_%x-F3q z;_lV(6)$FZzZM({4KMUFNuOH_4vnQ%@f$3dZ}$s_7XfbYq&0v@O(|cW!}AEz%fs10&er9 zVZa}IQWKEwD>LY&E3KD`1bDG0H38|i;;Kh)xE{UQu+>$>FOHL&mv6Kz-(;oUkl4u4 zck#Yu+>#S`7JKe!vFnbO z&JjnY&tGI_Y9xM>fhZR#)-6)3TBKOBNNL4iwb+o0TFGB;N+0lcG|{lY4+G6uoR0MS zkjFxu-$Kzi zK>CHm$KC||(-z13!>ESE@9};O0p^~xf;bL)#Z5p4sl@M|v+S!Tf*`bcd@|G67*BPe zyzbWp!H*dF$GTrHG?6%?W43^Q0>7LAx0})*`e2T{)RYDdBSbEQDY49S;yz_{zhtEh z2K=&-+#ca%u}27n_$FGt(Ky(uJ+3wW+hKcc+<3nds7Wrqm{2cQ1)anFvjHFB2AJN|e?zU0vPrffEaJ@d>)` z*t~-jCFizrW+2KWak}H|E50xX-|03by9}QMInRh%YHpo$yI2seY`L&_ZVutCEf-Fj zn?rbi%Y`S;%^`fa<-*Bxa|pNE1q~X2|7@h*?6T~{<8siiw}^PkaXEx<+6DLSL*VN4 z|8u*3lx?dQ!2+SI1PfC2{-nOuTr6QKU#?SUaGf=7E=?{3|3tGxB)}IKNv|Dk_I1ff_@qUvkU+Bm3nP8bGtXV~R~yvzDVb$LiXQ9_}Pb(&*4(M&kqyLlcUxuc;E zFc^AX93Ll)0Fg1;S_2H>seNiK{?HwPqAXMKq(yqO5hNT{>Ta5h-71K&c?A*s8kYI` z5FcQ#?+n*W<{$?LzQ-DfKdNe@k}urva(`qk5SITdrdiDyURd(LJvG9*dXyUbTFt)f zHTo4_{ppfnEgR4B-C@P3frKPA(Pa0SwAsGi1+n5rW1BJYFfjG2-x`w}-#Zai z9~Nt(5|*cos;{nVk~F|ZkQ}%v?IOxvIkH8j6J}pa(CA_TNAO$ z>)>*?@z0aI*O-5=4=%^*v#u-cBBfR*F;k=ash0kfJ=xWX6I{LhM3ORb0KU7IZbF&3 zx#?>#pfbEE-tSArJIVQ$&N$UF>nHpW5qn*iysv&tBK{@qP8aL!gtwc~zcLZvN}DlX z`WrXei2Y$d?hgWf-jhZE5jaB!b+6kz(Kmm=>{RMY?x(HtRx90d#EwWq`l7#d8J8fT z=fv!sLeUL9(zKh~=r#wios($%H}6ps5KT|nV@=m>oJhUCvYUufCib3t`cO;hPF?#~ zxW#!-=0R)x`mM1g4jr?i}yC zLce)peYV}tcul|ujHLaKt{midMhp_5{2@s2pxqT|7w4a|ykQtO96<#4Mcln51|{d_ zk4(cuUegdDMjVr!BhPN=k!y?R?j~pJou>=eDHDct^`MJV-X%`q_VyEO%H%X!XG^UV zQe4-~i<`d3AN=B6S0eqpGA?p}E5YPe<($#t*qQFG0l6EMN2!x#PU{&H^J)z8m zvS9h3>VSw*o&i=R4kabdGpXORQYT@yTb!tzc&$XqLEVe3F0X?D-{xgr5X*$sI9iJ1 z410xduT}LXT-8!VNXblHGU1O&3U^P4y!%X@eqSBCl6d#K86KNh;7g23kX#Q1exqGe z3j)5wNE$aMa*)k|IGKao5-J1UQ{@8*t8gRamoO!^{4{S8Zw*m?9ZX)0$uCPV?pm{?vSNWW?k{y1>7d|>|+7y%EoTlg*=jseEdvNG6Lz1hQn2UpA< z&cTi{suuo$uV`TedsScryuwJuOanr6oQ>`Nh{b?+aS#v(oI8U#7@^mA4~U+Uv7M$s zM<+qoKo3a7ov5K4>?{km7y&V-WCX(^F#;0Zk`asmixH6MmW*KdCdS}Ed#LW(Xv($G zglnU?HelYWEjLes;Gwf_G|?ENDSt;3xiy;dcQmj2J6iX$VM#(z`m*0Wa(Z{xwu_e% zW?L-+p?x44_5(iaE&wD7TEh?E^p|}Xx&RP&9b3IoFNoc7Y_UI1H@01FhPV+s7MB{u z-Pje^)!u7dHL)FAj(XIkuctxPgKx5iXES>m28U1e;q z_p*jJTmSn9E7LuqUe)pKZC%EexIXkaQqJ@&`-B zXWY6WR^*x#O)NfC6_BMz$Lo+{uG8m4U5QDzTO&GM!2cGq5%57Hb!S&h<{;QEo2D|I z87!5_?m4IXA9Eh@s++wwH3u!tPP8PpN3!gvCN{{bbw?SI;n;7z6@!2nR(?D5n#>Nw z`tj9Oul|)1NF*j#-M7#$7{5ef2&1hoa<#1)Iv2?KW~r~LC5 zUuF^ixRnYe;N3>j{bM5sd6H{6{S}*WAa4r9?i^%$Aok=SrP4w1xep)#2aLIJ`%0M;|YZRd!SnnDzWY>a94%*G91Le)>}$EM zpn?AQ?2qN|G5#>!!SZ_l_?xO5W_8=8J}cXNot4Y`8QbjWldJt)IM5j8L=5iJja*x3 zJpBca`z+&#QC3-57~1+(RxZ8JSPDa{EagX6xqPv)nW5pUtXz1dF_@vA!F`pLYZJy} zhU&`AM!D6>L`1ptIb&%PQ7(Vk*lH2w!kxyDiYV8%8Bd7lbj$JmDP63q;o2~ZO9vWD zn}~AxaAT`Qlne8XAr(=sEjFGIQO2=X*p>aW;rJV(T)NCy4vJaIZ-{dFN@F`T$>tIf zj!EO3<2a*lh;oeqqQBsA$@*if^=og=d94E`4W{iF0GVaPk`=7t#g5v3Ldt_T`bZ1{9`2nQ0eq$>4Flqu>|eJG!ye+5nbu+83KHtSH2n$edWCd7{Bk+@23ILUNTk#usaxo@K=X*0MX~(stx>Z z@A(SA)z+Af4VWfX)OIcf>6u#^;~0Ve(r5)E$d@aOz)yNyS-D^Y`R#%r5%}1J6-JPc z8_}r-K44LW5rjZG#&&=8kd4M6la*_Iwh$<-wEnD?>-cpgY@ks9VgSJACps0W0=w_V%ps$H(14 zh3(~P7LsLOLLw006f!^mIE@h7Sa+U>dsmM zbm=yZMj;5!UtnULx{L45diJ_*R?AQAIvsFiVyC;?bCRTqJ6pAQcUQK1juk!NNW@EE}K5e-*Nk2bHBs}@2kQf4tS%H+#q?hMdK7J zmDqrv2xI+i10am~8hmaWaKBN5u+zBRdy3|{YxCVNMxZ|4a&(`f+9jELnGWbna7IkklgcejJ z;$}$ADn+aKsDJCRWh>odWv`-f(vdmnkBuzZfU|u2oC`=hxs9h=?J|wxO!%+`1ecUB zc=SqhLZmodbaJXp6=$sFOx#%&h+PA8*W-M5T?P0TM(WPS`*RTbvVL@R<6))Njo!~y zfVUW_s0wm>;3MpGkirxYh9{}0_m))&PrZj(hL4#akeYy%(P!;424!rL0c)3$U4*xN9HV-7c_#;NFq*IlJEv=9Rumb?6-kY+51$gQl8cGXs>#m`24Y6bCE`iWo=u%dCT*GN#@ zpq&~**QSQhwTVUFAU&_*!&<+}CK(Gg1cY*yyOk>uN-kMRmtjnCiw0n(ZSBtiHvObN z2FTDOuJ7B`IR~50Y&GD0Mv|FZ20$M6d`-YgD7W}fUS;coqB4tw4;fK<0k?U+iOHNK ze61~aipt}LFd?gQoRkG08A<3}Sb%8;)g_T=1d*cnR?z8|IEVNIY623t1F|LkON#q- zodG)Sxbn^e2e3KGguxh>WQxsAGF2=tK+B&3#s%(F`?4#vLY-~#zkTB--ADQC^GqUa)05dH@|X=G0@5kxw1pip_@-jvg3qSD3U z+C$c=2l>u(-L9py7p2DVI#KWA*tN8Lj}Cla4R`SC20;GZh*}!0EA}YvHNpddd&>Yw zzpZmiZoOOw!ci?3^l}{t&uzJ&m+L@yY0Cw@TnECN?SkCeGyw9Rz`aRk9+yMdWEWfu z0)N=kbpLPgudFPBMS4BSI(R`OwaK@K@g+R+m?dd|Nks*C~C%Q0OqlJiY@y*GIXkoZ)%A^jq712WLMZ+~fg zb+RF4mZCG$3b!1a72SrBO-}S z0y{QfMkUv)NnpkxwLKtdENOuK7A?I-wabrAWVZMK8K1=0?FTE8U3`EHSK{mOV;A`^ zK0rn<@%8$lj4mNQKn67N_2nS%@l8Ai$XF)6X|;h(^2iQ)hKnBX_r16#AWg5DWdDo& z>Shd(KG2=Lx<3aAnK2fcxrBOpdyPb!QfV*k}oC8#x?x+4C>ipR1_UR=aZa6l7ebJ-NfoF$$ z{a31E9+iWKq#yD1szBoit2p1v=~8Adc7k-IUD5~xh}cDXu|WAF^d-m7aqk~Iv3UF7 zqT=m?zkF1$B`jVMRn_R=t}Jn%+X+)`!Q*ZLki|x~cAo)R1!*_?>RSA?&ha`|n~&Tv zO9tT2{T;P7(?Pg>79Trb+%Sm5EireJBE@&VB6;NoFu-FAI`pQ6UH534C{_eL)&@OR z3B6Ojnwu&Q`}}Q?h_S|kGgem++v#$2{M^s)PAmt+b;;P}j{{v5OxU#)6S!$FI6*?( zmnW>+wX~g8ScH1Fff`5M(NK;aM~f9XTKq=~2j9^o^DEDrgQFXLtnsbj1i=8^C&&5= zzIF!0j%w32_EV(TO_5?PB6X^RO~qId^jI78SS9pWuht61U+kL#5jG3yqy;h7SP)}% z1u@nY@O3tDtoMUt6R^^@Tm2SW#el88ZD~g7+M3#}+*;c-4I@{UVFI1!ar)9_Wh-a@ zN7vflWbyHB*f8&i;&yF{3N#q~Z?_eQD_OeR3NR9f-FOf;(Qf63<|-lg-Wa0BzL`Em zyMCZgKXm-3n@&Fb@MkQ_W20&evD9KCyC5R_Uwu*x0uuG!Vr%~tVoO>WnFtaPBgc*# zIW{EVA2kDR_J%Y8F+@4HE|s0@QrWpKm7VKq*;(#(gdD~B#eSq8e3pUFv2s7HI~Fgz zf}cX^O@>@~svS+zcE?{BxYWuydOO-l3*GKP_@n^W@K4p^Ad3_SSR{gbw%x6Y6atxo z$Q)czB<~sk!Fny40I{gxi)|{1SVig;#CR*cAYyFg+4fzvW|&s9nugfr^I-^(*h>7i z0g$tO?1um=UTjO{%{HGm6)(08fZ&bd0!We*;TRa4DcO<}+dW;N6 zgJ=&E5U<2V%e>rXVUgl?5ea`V-l@d)<9!A#k6S=b&?=TsW%uKJ=vM*;Bbyk>n5=u2 zx{)iVGLp!J@IM1rF}5)lsX;yi;?jcN#(|+Y9fVhDVf1 z&+2ULJS*0#m3(#HkP!FV5Tciy>ABLSdN>7z5k-qqvS!#udD*jR0A$RF?p4IDKKR8( zSN8-Y(Te(UsujdI*$U!YYEL1Xak3SBaVu5vd(F?_)hJ#q^@fhVz(5Su0Se4yY8NRs zQl!|P#L0`QHK;z-^exJ+)oSnB>Uytb@n?rB-(l=O^cD{Ro@(Pvhm!E>C4O`qs(Uqr zSB!)m3a@$^V0>9yF7)u*j zooRXS%|mXRv$7xI=>k4zT5j@2Hv#YVq!lzwZojV4?{WYsr)5`X#pewme8_lviwimE z=Yj~p|1gqXeLtClJQ#=*Imo{L=Jo3F9OQ|Ccx?`HTp(VPgPi5_Y6akGBRMPe_yu&0 zk=;fuFj?tl<7x;CxZFv0!&&q^gaC(V4iimEjb(sWc(1SM&q3bqLpBU}eU%U7vw;ur z?!c#C!yEGRK_9`N0Eq$I4u>jO8$lLj1UWI zYh%1V3XH@ppc?`Ozq~CV=3lZ5b}fbiN=*PLB4c&%1CZ1d7a(b%2PlBS!rE{Ue^&sL zD5q&&Dz=d!(CdoR!i#dyFZ)jD&Ar+;a})4d-=g~H9LPHZAK<&Hd?5HNU*n*h7WV<=TD*4=s6KN_*D$ zx>fv!m6h)bK>C(9tqF+OMN+p{+t2LnavCZT*RCvPN-h;#Hp9r~u=aKVQIOt%&KBF` zTe-)L+?2JSkIt~UZ;D&kMiw)*71w>PiKA@CnPnUZdzC*ZUOS)F$i8NS63p(U z5V5yew$wy$#6~xYF%vs|uvWAJUhWNP0)D}hRs#kdiEed<@uMYmE0M)ax-D6haLRcQ zn>J0oYVpF$v-wwraPF_^L22#(I^vM($ zwi@Hpbkyu>{a@J-yt;~%D@rpx2y>!R#^DKSD(}67gl0V;j3qQOewPrK5}Dg7%qU}Eai?(wCIZ~=|ss0mOrL~@nAYC{!<_mx2m;5D8!49Kst zWb@X6#4n=i`}gr)mTs850CsmV~A+8SH)v5k5 zf|oRWcyn+SFnB)NvRPx zagU}aZhl{NDtiv~&aVU{2(kwdBec^CIJG@1LuAqrJ(9R+L|Ed3^pFqI7$C{soxN6f zTo$q8yzygzG-|;Ig3Y?s0>u16Z`{JETe5DVNU1cakKTfo4Z&(r3Wioz8rXWJEt0VIb5Gdb`I&)ftgE!^&((^%?B{wsGE)%-jc zm;cMB@MyQWM*q^Yu2W1imWTw11zKbShQV~So~ffrX4Rt1JxFVL zde-t>%^s!E7{Q4_z%g^CLrLe?d>@Rx>QGYJ^Us>ESghp3QdEnC$`{${H_@dU8I4I8 zlMlM;Ov@97P4S@XwPx^yl`;kJ?~SA$x_$tM&bO8;h#-_Y2CnDo#p5nWFEf5EtBXrH zgh{)gi4XAIUbY^1f!rF16FJB|fjFLn{3H;s%|U(Q=*kI+1wbMWBhQmbJu`vO;>YH(L+9K+f@I4+9QW`9Q7-e1JCwzD5r6=|Jqt zLB17;-8smQ1F|H8xqr4_H}w;05U;-n1qlV)ycaSEHNT5z54^ zOr5FSI;YY7Vw)@|lj68Y*-l)sT+%;md9kObVSUOCz8e>mAujmX&0{(%h;b9R8v(RX z+iiTrmD_Dx#dWnE5m#-qaTV7j7IAgxvE^>#Dwa`BW7@cih4>4x6t^)FOL5~+EFd+T zr0RM_u>gOe6AOwxkXS-N?4)+5?bqvsRs8?+Wmzgxon=a@CK(Y22znf&(#wM$U()}= zN=@g0B))pcM*lFP(rxNTA>EDy0@*&qysBR}i0K!<+a4ml&yK;|e0aia)k8F+6v> zH=AbI_OMTrRlhedh+9<`x0{VC#Gd2DjsY$XgZ8eaAo!<^D=o~+jVoxl*RpXXF1K;T zwO9F2tpMaHkg|N&(%6B5Shhy^ce*cuG)N;VnebY7p8D6v_1&B$h z5qCEmS5w(@w0C|bAVJXT2@oT6=LR^nJ-gkwqDK;!Vgm`J*GFUwki0H7q(IK_#*YEg zs0AMgHfuu)5c3PYaSJCmu81OKa*fdF<}ziwk+ydxg9K%}ou=tE&cwQQ+H}NFwiDMo z4bv!-p48dec~alFT5L&9d&*v#>|kqJc80(g_$D6#q%&y8N$*l{+eozMQfv2c1{+aLRqX(F4^e^pFoo$-2L?l2g(8d*D z7)(d&nL1iCtU|cLtoV0t%^=_@W>trqL^MWlVi53RbEZQ{vruhmtCeR=}^C zuUM?)!%|d>gvx=bHm+z)!kFB+sx$53#?@b&!Eg7C)CBxTBdLe38^EDgS<4kf5K3)a zX_vRyxPtT=0)1g_Y)0wH2kY+TjDGeTIXtz9bm zQ0Tr>Zd@VsBbLdo#fU$px+99nS*0W(sVOc%(m)$mfWgAuZd_p!rQf)MK<~4SE6|UH z{)xF~TcgM}zyaS*+PDIFao_{IxXK5D&yrUe(F)L=)V{$ixY1iOe2$43^cs>ISJZfy zuQ@`E5vw`X#ucsi_g0;aEAY^gZ8om9SjA6SS=qRP^jU9O6A-a`y>Z3u2xa0{rqRts z%699VM)x^3Sx_d$agnl}xbEyti^@jkrQ{mWZ%dr}fbDu?Pb5c|1TC;{AMm3GN!z%L z*XQuIq=HyWtp;^337=1@f3B&!s0Yhc#;OI{-MeTa>Qdw6><{r1)ek#`UbmlKj)nqcPS@7CU5aIO_jdOpi!vz-nN!GevezF~ zYWR?qn%DrpVI=o)tNJ&ttCj!GR~`neRvxZJM6aFd>zg*sYsZQ{wfcsh4YR;0XB6}k z+_ipal>7Q?#q}QOSa4v=_4oC>@9U3FY;e12Er0#q7Tj;2GWxyGF=geOo>Z2K8sN`Q zC`sz9cP;~Y>WQ8YaLF?(d?ncaU-Z4->l+3{h4k$l06EF)8wPy&Vy|!K0LWubDv9M+ z-oS2MQeg%8q7h40u!f3K9@AttQ0z{*J4+n_y@{?|0s1ze0+DpdZYb%8EfAPv!03us%?pg{$dT8ATh@yh8 zReHecdPZYC&d|}ku4pt?R5AwHb?Eojj=kQiCg46s>dG$J4;V|dQJnQH*bfv_HQn&tg51f07)q8fR4_L8tv$ylt*3Y#F0j%h0|Bx$YPl9iIJ^ zQm{+M0gz=z)CMfzi09Ks)<9nB`I>-#dwNA4$a{>a=mP%ClgzRS0k0THMR`dOg<4THd7yy6hN#_Dq!m=e5mMyig=)-1r*=N&SXdJR& zEq@IkvI@qcs^<`Y=q0<)rXiVGfxs(7cMg2by23qHYS00^-$>5s zxz+*B2)*OZf#(}Sqp5D(45@jdXbt~Zbo}J9bzWzseKrmBZ;dS3fS>cEa{*~5ccVm@5DPi#F$k4S*L&CrAGde}8IAbkm;?Aldu3biV{fh6d%K^V@q~aaKAoOJ| z5YBmWsqbv>)N;TJjZ{~xUA6p&k&lyaq_-dmOjA4^D{dJnS_dIz&+cghrFLgu`q7 z;7p^5FK#oDcJE!_Ak#wQjR1x|G74C6eb>@B`{ap!wPbGLNkL5bvTJF*@kVIJE0+-T zQNXK>RLBGQd(U?sAdxBfh|O0$-zeZio^&1{Bc~qvX3?J;haeF#VxdD|aU?{F;~-KT z1(ApWR*Qtq!J6~YOgZ&fQGO;Z9xlqoxLzJ*TP&m|^w?hLvC+_D%b~~SL&tW?sUoU6 z`?(LKC2TF|30n(#!q$SGu(hBkY%S>6NLhX$EpB&Z*xF^7NCOr`G|;JXBH&y7kWG|b41kHa>XI|WTcp-lRqY@<`myT(|vj6Q)uxllj0#iFfGLs+nVC3n(JV#-~1oubL+`>(7=0rqYne()^pvh zXz?Ai7T5F{G?6R!Pwq2lEgY3=_7$`^8h=93aS*k)5ywmE+kTUSRmeA#8vXo-_hT za#a*Hi=aGFpy zZS?I)^XcRg;H_3)Ul?oTAm0hZt{mhyf!Ljc9JZu1Q`LKNkW&M(HwU3jitn3&tO=ac zd}~}}L|g)A=qO$yz0U1JLHTQ|p$%%lw|mkUAg!#B+_j9JNP88mfCfqWnESfUAPMX|+L3d~57FeZxf$n4X~Z10Zd$n&kh%&&-NHkpSrh-PyJMIY`Ki zv9dz=moJ>r;*@UaEM7|sfo`F`wswGqr;!WdnkA*!2`dX?NechE!#>y92>Ex>NV(oB z-Vg+&KW9e8_m}|nTI&3r)t%~dX1MY(ufP198FkzjZQYJAEne#Xkm=gc7eV=xU6 zv3vbFv#*%UA9~rf=IqMqOtpoJyUT~|yI$6EK*Vd8dFs!Z{nF}k)2p3j!0S#Z<5lcb zgK!5dKK3bC`-?Qcb_2USzJV22r5Os4@f=&wq0f*#{C{gxCsqVK)&@OR3B6OjO8W2+ z4(|$Ltg#@*>Iz~zT_qh)+5XkK2N35aWj8y)SoSB|32tXI)>cdlJGEFLd-r6gww*3V zPv{HJiYxjy4bUFkcgu)P10ahn8FgC>SlL0|G>~Yw`s3Ypxv5>%I4woO9`uM5YZ0lP z@3G(Uo+YkBkF`OMRYH&Tx-+@%FV?FlhCM-)7Q|R%L5$TE#8PtV-@|Pu=19LI(*&#} z*lm7$tzy7!zQGBwblsL}$okpp%C@Mi!U%fZrdHYii7SvB z$Ju_!ZY#iuw+qALohj7N9;Ezk)xb#ncH?*4w7ZobH@JQ(>toG+n?8@G*U9OWF)tL1 zjjA!kQfF2OwB(>qr$NBwM(WBgI|Y~))Y&`j%b!9!5q2XJSHfiEI2=ZQ){TUr0A8dtt;%K$CV?lbTK zE9dAyxW1~U-&lvQs&NhfRE;2?W}QK#IKUzi+{~~3YqvnHex7fpU+BF$7ZC3h+-(CO zI3!(w7+LUPCb>`$V?zrfrt<8&AhsHp!d_~IUKtDqB(jpUeE{S~KJvqW6@#~@vSz!_ z8ah=W5rhW}Iw=82iWhtd$F|q9OL^7uYzDV@nBwk%fGM@W0VMXiEdsJBsj4>)*7D!7 zpYE%~OD(%%wzi9y>1d-2J65ssX*FJ*!>Y_hd0e4)8bT@C3-8MCh{Q^IR%dJHS&^xg ze09c=5U;l&YI|M}sod}7p==C;3yJcOkz~*20g#7{=)S4u>VwbpncoB?(Te(UsujdI z*$U#R))DEX>hN*06?}2f13qas2A_s^8R-+=%wa5A;)jgk*dE;ip!#7yJPZd#b%@w~ z&-5+ICiKq7mPKOfosTD&S?j!cgMizN)S)E2I^26TSodlWuNd??6khk&QSkYf=Cc~? z)n+s)P-(+{KTkJfagFSoCgN@{sy3MiCMM|i9bvASL3k6xW+SUJ)kYr~>h@4MDjM1S zEYotfm2wvFa!(qiVV-ZNUi7pQkaC(HvK7xPAPgICZ*d_9{mUQ%aGjC5v)4@KARi9I zi5%pg193bDxi=86%|U(;h}YyGj~G$r10H0l=B(7`(?B0%WVZ_pOjf#yH;Q5z;&P^q z9=8zS5X}*yNvUmRz=huIEBkYhGrZX&fM-_uKwc8~0N)t+8ac@O1Fx6lA7WIBn|X@1~6FIjLnJPCW%Ru{zv%`=ymp^e9()0C-mkXZSj|FfKT#G zq95ghoE7*0pI7Ar!Dq>fy>PqU=a>b9-jb2yOw5U1Lvq8J8pFQk3Tm8eHT(1~$?-OC zlce=7wCemQA3U^V?SWb0N8@6v_;M>NKgx%6i8rkYh}gaSQGQp(UNQ%$5^=3FC07OR zZWd{5Mr$z%h=TNncXpTgR=Jt2w=YcGf3=^Fer=10DehGpSRa?S z79VkPX@25JS0m%x4b17!r#)<%_X%;IsPf7Qxd#(8NZ1+!A6^cSY8kRHZp!;bJ$aT-P@K0h7u}M z0oLD}8a;{9-DvUCq#W8lCPpyd?_h$rxVZNPB8<7BKif z40yEt;!NROHvn?75w%hWTvp{9GK4^>;bU71c^F991K?f840T1o(@!nABw_u)nT9O0 zQknp7sPfIQ*_xGeQQ2!Vz}*v~<*9$F+Pjt}bk{Q^rCaF`*G*(dswSBbSBD;Z?%o(3 zd#-bI>dAUzbS%VQh^4qU630^9y+$k`b;p>h>lMWU{Dn>|C^jl%3CZ2dlnqLh4qLEI z?ezn7-Add}EbpxSQ+jFVST*!myKuGLM{Pv-z8@Ke0V~~MbIPI3HHX}wgFw1u=S|^8 zg1ENZe25)#wAh)MzUJr5k-^5=7oD29j-tN&`45Wu?pZx(d2aO^D zlA2oT0*2vqw4SS@*pn&`G}V`SYX$+oYord}x=hf66N7*=ZMf=C5^=|2?Ha^hbtoz2 zahAQ<9K&MuKP*MHNT@u}KLo7x(ndyO62|1iraDvYSgQ=3;$hPh&EVsFBQ*g>jif%h zaR7&ATk;e{5K6rXT92`dM^2C)WBgh!7ngDf$J+%xN&sByW$R7QATJ5Ti5%n&fjFLn zygLxD%|Y@&ye0>^*@)5&_$4FRo1j7OFtS_Y0n?zVTZkgm$%jq^ny6|ghL}=TNdMzw zuQx%1{K2=;FkqK=PkbQ9c=v_@pA+~RImm^9*p-7!24Z&(a$_L&s%IOa#zRJ$>P^tJ-g7M$u%7?p6RTmD*v`vQj&}B^B4!mPD+%&6ZSLlW4@%p~tqnEvZ;W zIgx2gDi-1|#8TYmNG!#TM6rO>e3Gi`6~zMlg-$Fe_CaC^1+lZ*+LEf*7O_^_5h@Y* z^JQ8pR-NTaswO!RI|)7Zv-I+-wjBMHzl$CQtR(*?|4^Wk{Poj^Zu<&>Y-4xcY;OB1 zuI-jFu|w(YD{6kv9O-QPidy(;`&6;YDYmcD63$Lbm~#7Sn_2$3)5@mOcnNsBky^H| zApYp-o*(d+MrzriVcW;NZL2xmNN{jPy`wANFwQOIB%WYqAZJx~rS}+0fET+&CJ5UhI=!So*pE1LM zeJmJmNCdvg$7(s?&poLL$nc_lDL_n0jk$^KE4>oQZ(mJi&o-YYD**|DRuO<0p}RN0 zsqI-AB9n&bk;J9gMgsY)kH{Dxd0lKvf&9W7KL$vn7JMMstnDj6%rErDEu4C$-%S)L zlk0>=jji2C+dGp%g0kHP*7O=@Vr@HZI$|i>iR+z)2b4)q>TK;i;XXyvqy7EBdM@oL zdug(-S<|vf1^$2eCLaN$GiY~7uS{^8U$o~V*6!g7l3DZ1jp{ahIw`LIV z0V8#|QAA?|Ck6o@YhmnA677M*+PsRr>QIt*vjupyIflhbJ}gDGNT_@yg2A|;@sR{TpBdLe3AHbm_EO`nd2&Fc!v{PJcUO{?-@oQmST*@Il z!!Bsz13b^m*5(z+Re?B>gKP-I@f_r1fp~2Wa&sVFlY@N8h|&%CEhE|H73e)ib}Kw! z8Z>pY(SGxaKoeE%R1s6k3h7rq_S%#J+1Hyr3^>O~+7{~1K~4*NfG-GqjU43iK@P<`o2bpKV@&o)`Kj=I#n4z(;)AXj2O0 z;NSz`VZQ0a2ZGOvNPRSFWY03$&+%%9{{ZMU497JcPL1cmo{coDMz57qZC=rOqgK67 zTUXa;^9nq)uIPagCLg%_~SRwoCFI5V3o`dG!gCNtw8nX>@auvfVnT(ftRT zEGU!WxJcPfTz7VcogL&Q;Tq8ItUVVGY|k_HL~^*L*B$mP0)BiTX&aZ_x}}WwFTCxmrhj?*KKt4JoV|LcU z()t;*DWp6zxU_Qs1koDq0Y6^l1No-6Y6x&z_-R7yV)5B z@yeTkU8cO)83zd#HDimC^J5YG51R1XtgM`HhJ+n0pD}yT_))r>&zQZ@*ionVbnP7I z)3?eF)jQBofK2=Jn7dR<6@A7GS(Hgx$ecn}EIY=xA5v0ow1m~92RQba@{(@20Wa~S z5x^yLJs03Fjwng)Q%NH^*m3hbBjBZ;Gy?c~Pg)N6#K)HvOL1U)BJ9!>_;?@nLBJ;)sXM!L zG6$habo)?mib2A8;k;6(xBv;OQ%XP%^#K_iHSp7cRFB4B-Syf_rOKC59%o@7amsH(8w+VywsB}0Q@h@ zTUA{<0YcfxE~sbnMTDL>SB-==J`d#=0MZnNCXjP2v#K(n(JDm+5VEvd0UB*4j{(Wt zD!VmJrRdUEn_B+5y1L^hqFF`)U+)vRNsiLIF6C&}-+H!Tn)T(r>6){wDP~()zJYmu z4t}z4s^Q;Q6A^dKX@JY;m1b+jKt%WPY275#DV=q|lx{u(rtHcVdm6o@D?2H_&qV*q zs~86SwI_`L{@#C1z0yHIywZ*HZ4-Tq z7hahePgTx5qrt2gS1*_FF*T;4n8~eLV8ehDvrDr%<(ELO$PPZRgpN77ksW-1kuQtL zIaM*|)L{D!J$ooCHnF=G11S&7uE4;WCA+V!kvC>?_`cR)b3?-ck_L(8RF`TV6xBQ| z#P5YSec4V7yeOp$keQ>t4}#Y zHt2)_>BJm(yC0BNGDa~lY2OQwX~qo$X*ghLbwKS{QSE2^Fl!U?av-Mdqz_H8vMW_qW=@ zPcCS9rs2YzI!ua9`XOf+@J*gn??#0ZmPq&5WZRXUnUmN|t&YY3fG$TXZ4CdG%i&m} zJ{`Doq9(JX#!^dakXS;E#<$Emtkg4vm`NFwU|T~C%0#}qVQJ_mkj{+5$i0X{%Rrz`)Q!=n#jQx+gK^y zM<#Nx*97X?$sFvqKz-w64mQp1E+t{zWDd40P~SG0gKZ4d^^-Z+{egPJWDfSE$CZvt z?nb@q!LU~c>U$=0u-gK4lPojrkwE>B_C5_8INZzKJeh-iBv3y-nS;%+1eOh3bfnL) z3j_6*$sCLf6z|qa-*K2_L{(dWZJ6h6kX*121*&WS`%Iw9Ua+qRs(b_cuRv8Cz>ISIz( zEN#kPu=@kA+5(IrP`ql3xX+i=Ec)x4HOt)+ceVUEy#9ZEArr}}qV!5icUuFz(NBKo z#@$q7C4H1qcb4lWKlLzTRq5s3^H>UHuSoy*is;XQcOUwcdZ2-c=?`DoTB|93IAox#GNT z*LYu=8?G+v@p`eTcrVH3w-XN|gUsWL3NCg#+v$LHz;rA`hc~(sltPS)GTe+?M;5iN z+aWDe)`S0@rtJxtt5ZZkZcSO0Dh!IpgsRtV-<@76Z8yEg6_v|KwvA08wy-Uy9%Jtb zrSfgkJ5_Wm5~z8Mjn5~wNYKr3CuUIjbQ5xNi;(L!s)KYQX046;jP&ZFEHfC`MT*Dm zy|S2L{!8=9p=3`3Pdz4vJr6uJ?=cJZAmymS{If?XN2MQ|-p)D}+)Qqrb}aZGHf_5d zDqv*3>|m&Xb+%1aQw?QMT+Nfk;>i?{&hcH{G_9wTYi-agK( zy^r6TSOa*NkqSQM@N)wn;0vpKOy}R1-Jlp1+LT^0XijTQ;w8|Gxl;UFo{9xc)KM_xC z;$yD*S>W3^5l=tjizgG=w`qdgh_yDuh!5~aBZ+V01UDA<20p-t1K;KeZZ)1{Q;y_u zpRqBJHW~P}Kw@s9RK<9Xs^%~A))#DS5<4IrPIzo7u6Giy8pq~GdwX@GQ5y%i3S-l&a8KsufthXT^^WCS4HPHnMk9E6T1 zK0vyi_;!wi(DB3vNVgN;j&Tq=p7;Ric0~?=(DB3vNVgN;ws8+#zY?+ zPV~Xei9R@#=!07leQ>be2b*LkJxPrS$bG%`9RXP!YDW-|rJmdZ{L;KK0~HZKmSaUk zKv-yr5AeUNY7t=&R!8CkWZ@&e9pfM@Zo~)3;zfKr$3a-7h!2pZi1>DmgRtySG6J&3 zP|5?54!f){OiAKAC=CQv9bM zhUlXEe|LY33a|Go1Ajlyj4!+C?@Zcqn9j|-t4K}JlPk07uBm!xWtQAAK1I)~%zoR( zM{G)>8!2l6E3?|>i34o@3A5E;qFW^TK&J`cX(D%;powfuq+TM=I!&rLJIJ3nd)m!5 z^>t;F*@AVTIs#JzOF8u*<^fh?>UvX*@0B&y&Z)-j%GzoBc&}vzgK)d?_-5l{aMdsf zSXt|Anc%iMENq&I5i~Jeb~+4pI=m%@t;86W7?2X94?_&ABn_2uPPn%JWNii4$z4t? zDaLo|0f_s%X;xXPg#a(!2hwuDwVpHr*xb)^0X}*_Nh*(cft_)nX9RqmCyfAJ?@7x6 zPd%tA4(vllb%(hOJoMlyBiKibD$fAlV#nl41Ho=GstbXEw|LTWz`H%E!xLjf_z;V* z+tdYqhL8Fn;IoWWoEQV4Ni;Fln_`e~UhZQz2uN6+QUY?c56Ixl47?+d>d_diyIwmN z(aDK10`WETuzGXxh|x~-33d^V{+?9e_G*a5#`Bu&`c#z8LGm)yGu@O7Sa0pQOp zZ&h{e1PG;0jMX#wB0^7`t42cm8{aG!0MZnNCXfp)v#K(n(JDm+5VEvd0UB+l6Jvm6 zZk4?ZOZDH*PK=SjAMgp>Bu8mpmvS`gbl*r&G7E9u; zWd`7jeVCg>^l?6|n`AnrvksWjJljtG`e1M-Ont%s;(hwk%jT8c&Xk5ifFdCJaMtp#W*$h+gfgItdouT;#E()Z$ zRh_+wX0={U+fR97?3EV&n|w1Q=G0+Q>>Yl{83uf(C)K-Aag)gs=?AtRaz~j+Y^GL6 zV*o&xqs7iOk`lE8s}p0f%#s>QEva?6_nLKBshixGNg33rv#p^9Wg_3pGhGA%89D*> znMZWP6dMjbHXV9wS6ccX6XrkVi7~vUEE@pqv({Ne)hQ*gM*>wRZotl*U3xBFoz4M! zOQ7l`57=FSs#8B;huCN<2|6JJwkl9{nh0!jpz7oi*n@$pQ%Yb@-``uN6Jua+3RInb z0=p|vby5m!)*LTEr>ekK2C7bAfqgbmby^GTFiT+hrjuP@mj|j&DS?rJ;?*f7@{d_Y zRJ8@z2W|K%<$~Q3sImdi8!JZJPY6~## z=p{kz2FA20s@fQAb&#NZ0J|hml{;Xs3smJ9*oHt=PJ%HxOPlf+?7_gRwg6)Y6tCJM z?(-!z?(u)F6JzvBN_SfWyxC8F=f>SsV0<|6rE|AE#Q?*d*88VANC6LH!_)^U;F@Ej!fua&z{nue!7&h6SDKE6 z#o4dj9p8eRajVmVE%1NDwC%z19jY)W?$PlbD(y7AdwOt*dW^k$esGDJr`h}%+cwg zo2$&(i8+8vOyKb}0-dS6We$SKj2@;gD9q~WM)6cGQaq1~6i?!RjuT@{*38h=%~@#w z;V1GnfIl#jX6^0c%-WB$CA3b`06x)31s`+xg@F(7k}4n5`9}jE;H_0YruAP2KEOXz z`Iy^JvB_BW0Y2MEg?-HK6M+x#tyR8wa+f^j@NZZ7;;CAEOvXppoKxtHr(5wcm%gmZ z7f+PpV*>ni;9EZtPi*32uKIo8+c*(VKjMog6WOAoHp7Sy@FpXPZ{q|v7QYC5 zfHQ4&5#QzsZZ)26M9JemV{;&FG4MNq#N0%wit!v(&0lUv{?*1Nu>;ZpWzW_LkUqat zxCW55w)nP>(?zfH8yIT<*@7te;(lA67^A0Qe7R7^eiW5dG$FR6#&ZAPI5CFRiN!o) zfp(}E0qEg6E&@nr)_4X;ztss6K)R@o1pv|;wGjzO$I~-cKsug`0HoWgEq0BA(DB3v zNVgN;&T$Yrp7;RicH-MH4noHhA0XYX$N>;Kp7;RicH-MM4noJ%!(TuabmH5X=!3(F zKDas22Zs`Ua7&^O4%Yi%lkB7?sSyFWuh)YEKo*C3U<1ffPi_ISdQ(IIS&kJE0b!vf zK0uaFMT9~8>PSDWwPh6xAMx!N2Vrp|d4Mcl#J6)CgjI_809lHNZ`U{o%MK+YAZv`u zt~+ZAB{m?-2&F$DiwDIQkX3`a5@1+BGyxgU^xOiF(M-l}N(^nycof;26Jv}D*ZY-$ zzn^Eum)-PtCT%%P=Vsnjq^9V}mDzOHR6VpZOYRt-qUTj+zis0e*(^mjQq}@iX0^=| z3vB)gv(;dtTO|5GrwQL_B6pggiEK=yULwyrO{zG9_VmP9eO=jPwqPBoj=vUb`&evoAagK)d?_)Ese;HqH|u(H~t9Hba+b)TMSoZha#L9kP@R0Lkz1V4V7_DxW_JEtgYZWxyy+qwZm_<3u+<2*A@?Z z+|l^ufa^VJ1n`CSN+NLq&h9UTl?SrG&M~SO0k89<5x@_4(sID(>6Pa0uM`J%i%}&G z@Mt@?R5F5n)~NCf@bB!HT*(M_t5IDD4E(YuEeE{clSWFj!oP*-Q1?O)*F~-{5062uN6+QUY?y|HIy!hsk+Vhu&}ZNTZQg$u>sF zE4F0IyJh1AFhMq8a3Hv6G!iqiRzN2Bf{^ioH_Z$TNNFWN3 zp!)^54o*Nx2*^N!AcW`(0gL^fsye@_nyS;ImVkWueP8poxPT~s=7NmWbk$c zA4;g&8-um!gV8Dlw0%Nb$G!UWOR-J*ja=?F7luX#W zH&K~Tb>#jO;MRy*2l!Ln5|E}7V^k>R##o)n>v27P&XolB))dFR?Y() zQSl9^kfnJ8aKub31|)NH@)R(j-foPM!0*>)GG>vZgx94UVSP-D(=cIuO+iXezf`$zsoWM@Yd+&4jw%(rgeu*r*zr@Q@Z1PU`lsm447WxZj7}wSjWZT zU>NZDh*}1CQbctCiLAeGLqvZ+(ba)mO&~v$sEAr#(!ZY*tsex$l4);@Ezx!mn>WUu zSrHB8Iyl(f7=sK24&lZaO;P8Udt(d*DG%<(7_BI+3s2&O^EF^sq`(1^23>B9T~f5n zZh=)d#!8kMZI3s`NN|!{dNm+vD=0uz?{Z`8>zX0oOKIq`V#>cZ_EB06G>FUvl8zEl zz)KZM1JdG2U_R|9Z%m9)3`~LoWSVgU1MvK~-dS1C2P+x#S-S|cmAX)2l_Ds*JAK^o z2d0w?S+pbqfOPk827(nbzH^#2hp%}A`8#M05*gq?;A4Z-Xcu{s)x}L8B z((K;BolM(C%QBu$EED={eds&~e0rQFI)GkQ-R zs9X@IouP{qydm=v3gL(VYZJ0q&@MxFsn zr0?l^$X#V3v6)&OjsXB!-EWMQ9AyVqZj6;Y1GeNEu$i|!*lPW|YKNBcl3Nlr12`jgAsQq5T%1s_>dlFV|{ZKnoM_b`5H-xCYIAP^B5w#r&D>sj*wcRpA z{s{-Ur9|yn2`e|6sJ$^^<@OV`Jqar}rKp|QANk6yDrzrESh;~k?XMD6Zfj9HTN79` zlN)2y?oL>_r9_Pk6k55ZME)_$2v%Z2?E^ae1isWhov@+{-Z_S1wF zKTw;i)0;>WpHW+wu;O28k55>M1vTF2g@eS68q=m=CC1b?Bo2}f)Fu*Ea);X1gq1v_ z_6G?oIZ2JlS)@t+QfuqdMX(YJY7Bvbl~|O0K43#`q`$wa8)NiJO7~g=ydzG2OUrI5 zVD*m!F+i|e$AsxF zQb5DlF#Saes7}*S;egjbAY_o~;Ti~}FH#u`+)0W19uNtb`aNh zXu_a)P}g^8)adAVuostT$Jl%D7nf-HOx56!?qAV(l`=WR8)NtBxX(y0U9=qL1yzpQ zhomvX{8x2AKUl}pj)~#m9Z$>esRjp;ax`K7IjEGQ(JY+=dh1wFGr9HJv7kRer5$jn zfROpJhoJ(}3slB*106I>yweYKP%$BQ9cv+Aj<$zxo-$_}a{!N+z{_a_JX86UIS3>( zdYZbxFsn;9DyMQmmGiiu()1l5?V%<5;OaUl(}>BM89Lvb1@|v;B7ZL6_Y@_w_MT15 z+UMyKT5je5K0#5Qjye3ML-Xm04XbBx4%O~$)Dy)u# z4v>Y9(Cytsg~g4~0kU`zx_z6duu2g+K$apxw|^5AmK~CefUGgHU3bRTX20E=ZqZqaZX{U?n9XY2$1c|SC(TxaMz=8f zK(7hkYa;iWphh+tsb}O_uSv!HLwT?_#_DxthuMO4pmYSL29|QtgO~?cjY-#=W_-`q zSo@|Mx3jg=o=poiD;R{kjmQ5-=@?vP7zE7LIuDHTTAda)9b*JFhRa@u!Cr?qW7uN2 zB0I#x#(-puJ`6Fel4PhP7bx99&gZKYTrY1qaOkDH@SH&PhgwRs0IxhhJd$B>#~79Q z7X)Ouct!0j#Y$_ymnq7(rt;Zm<*lh5{~MVgD$AdplTy20FIjo6RQOr2pcAz@dd10; zQaM$Tft1>XIVqLtRLFopN{tloq*Ta&KuV1i5K94xe;}kr0(hQOh<_lZMgn+JD#SmK zQX>I8DV01MhK(8`A~D<1|Yt$Y}>@?mh&%7-y4 z9|k9_d>FIxVQ|vQhcPQ31}Djf_h_e=&YXdxF>` ze}=6ChOGmJtpkRw1BR^whOGmJtpkRw1BR^whOK&xIK9P&t#b@p=NPumF>IY<*gD6s zb&g@{9K+T*hOKi9Tjxw~Wq4}XI?u3mo?+`e!`69*t@8|9=NY!nGi;q_*gDU!Rew%3 zS*#Zv74auJVbD`$QkobmP4dXnCXXzQ^2pLEk1S2_$kK+uGwG^OFTX7Ex3wYL$DXe5 z!0*)3-R*hbrGe{)Cxp`BwkeF^4hPKGB)V;{7Qc?raLo3&^!;<)R&az5vBjWEREIMh zxV>5oJ3_;$+v8GrNyhOx3X?~!G28QLh(E+|Cr=#+&LMr}hWsIq0#T%$xcM44+!BDt=jM`ZaETt-)z(HwSady;wf?K;N> zEHf>$Y`}i@S%Dw(YrvM1X}~gzGJ^(eId=wZIZ*~IGbFQPz?O4hz?KtUz~jk8qT=dSRYAq!x971*qw7a@DDr2e_wr|@6Z2{P*uDPT!;4>68 ztGTT??B_q9Uj;&F%P1H+2mVw4wpwhzpQiir@-hp^fGjVIx2p=Q2(8t#%PzQ)PU4re zRQOE1${@(8dW0dC)+k`>Vzo??&xm%60-}s8otdFg#aKCI@tLT)lSx(&6KQ7w z_++H2zJn*Y>B%Y$Tg0V+iQNj=CAX}wz1%b~ zOs%6+&yIP&8jvm_8Cv#S)AeviM{!80$jqn$L{>6}z6`~xm=uG6FN&xkz$bdd_M%pE{IQd>HGW6OICcQ%MbveG z$>%x>CY_qTz8Nzb)S&d;j|!zApFT+ig*|1)PC>}Nl}zo0NUzZ((sm0=$#3~Y_}BZ6 zP83t2Z>jP7q7yoRDW#UyDOJ7r>&|7|Er;WotyH~x4x=$$YGyMw>*9rzRB^}5X567mzDhmSyP@Xhy`QLm zo7i7xl<*m2!D*;syve(Qiw&me*CAPhoh_z@-iFD>QwD z$*!?Ffjeaadpc5>boIzGUp=yPky8uN^q~Bu56*Om{8`D1l~=&S_3xsimI9ur>nOQz z3;42#S_;SlOZ47bt+u2o3oq36bfvzs*=VVWa#`C4$I7 zq55h=^?j9ib84-lC0agEwe?68rF8K@>CEsgR_iTY4Tl4ZVi`dJ54=7uT`Y~!j||ZuPSiL!<1iiWsp7xzb!Ml#nSe|p zW3opmMAuYi_>nSPnnv<}UL5dlLIWljWI`)>THo(8^#J(Y+Pxpv(v4-mr>{ic)6(I9 zuU7@+7zyx`ijt(=Hb&)3i4G7w7a1>s61yrDE!(S81{7nK+2 zYDioQcy>e$0VZ~XNmhVb4cb9Gt66+wbJ_d_^*UNS_HP>U{c(gJBwa7p$crka5LaiM z{Cy3HtOdTN;M~}<(__mY9JpnenWjlW7L7gy%RcRqr80dD>^`Bfm+n&%$$_7mbGQ;6 z)!fqD*qrwI*1*r_k2fb*ewFvqEe1Zp;Sgb2q$W0|vU)Rad6E+fMK)Svo1O7tPy^4IR`CWauT}w&Kjb>uD z{WdQeuZ=GQYZxXOzh&wv18vPlZI?T+V|zzdA2qw>HM`}dyV@o@NwA5rlA%YIEIqPf z>JU>HKPH;J6!0k#)d5V_EG>o0vZ)kptfWM&3x1p4gDe+S;0vPM5x~n7)z{qCnxvAH z87b}4rE@~Jzz~;}*?Zt`EBuZ)^mPD#5>bQGsfyXhUETW|;H~~sTnZSCvW|GzGvcPk%daa4Ntpq$)QGLx_7{( zT3T+b+g({@a@5#W=1-LIjBA5zAq2cQqL!B1_J&Mdba5{&a4Y_9(5(&jHeHy$qAvVq z%!3Z#C6}YqGQhV!KA>di+%?~v z$&)`T-IhNqy_Y{LotQr>eVIQiU79~L(k!AFfwJji$9U-w8B2GJm)3e@X{JY(Hh5&I zyhlbg6kw`!RYSA;EY0q-G`nxy(Cof(L$mwF4bAQwKS<3sSGV-VzRlI8dXF?T+dO7y zwt39ZY;(0?c>tg7vNYReX|`+3&}^5b*)B`7T?eb#4okBgmS#IF&30It?XWbfua~5Q z?x}Gm=d$^DXPS>$Im!Gc*s_xZEQ===N&#Cgl>&B-t`}G=1#B6FfMvPF(kNidtO?jM zZ34Dj3k7UBZUpR9uY}qHU8}6qQdYXS;Mu&u{g)Zt=X z@i2m0>$M>2@3qmM*ti3@{E2}?-s#Gb)_BeH-6!iqF#hS20~eR@rDdN6Jvdbe@oGxFc>%W zuipS`eyAd5M=y5(5hdG3M@=K><#8q70c4daEvL$KwN|SZu<|j6fV!z`e6A|`xTG*3 z3X942jh)dW$7__&vlBnSjNe2xgXnvPrW#ym;sOr*Y|SlEYv&k=)>if8H58EC^K@h% zndXsYs(ECYR~}jVuI&+MLw69Ie)EbzC1->;fT-%}N*#q?shX#oPAB&ay>`WzuLL|Qs=5mBoQPTph{7UmpP~IKL;HPWwe~9w z?e|SP@8;V7b<}=2;OwL-;Pnx;95B; z^#)u>GK1+Bi|H1NX}yiumFZ@S>1K;*x8s6@;)3V)5Vj(MAn=+ty!}E36}hb_6?fcWVRbnU#7#uKWXW3z*qfR==8G9 z3HWA3Nm^|iqw=Ll*8zOBT4Q`Rv)w$P-RIA>bTWga?5~95i>mL#u~QDx&E~~XO=rri zrGSixcg2p{`J{sXZ$eFN6KY1wFCMt1%N;izOyfB`<2^@ZEV&5~&&h93jaOc2%aw0r zyfJ!x1?*lP*)1z=ljXc$oN%fLm+z?~-Soq$BDkZYg!O=rj;M8j2$$dE1N={=%9(;Y zI_mgbz(+^aIzYT2U#weN;=Yf#KYC$FCMr;#vjiOK$PXL>!gspa)?Jfu0S%ibrK4Q3 z;-E94H#*3qqc}2P`iZPd&;xHcGT_sq8#)UVL|tPCK6LCCs0I^S#=}rJT&A4j0}#KK z9=y~%KK0|FT!UyDv|w10I}e-vod*z~QeN(GYfO&Gs8hN-4}zCtGBAv6v?xc?C?do( z|BFyqw3^ZUv4_JtyxFFDeMd_f$N>K%qJ{ty!@*J=X;{i=HP}M?t~VsYLec$2#92!M zI~fe_8>6y9kuqiiUVLRn$10LJ$Tv1ts`rhBM(J-jYex9xiRtDsgX!imgK0erd#n6e zGmQ5|16BhbtFk140TC|?%~H6aO3{K!c0|as# zQ2Z?EjQ*?{|Bq&`WL`h zRcED1R@aBjb0=!pI z?il%n700Iej6O$6W3F(C%kC2UcCrzbjz~VDI~E?9)D4hRn$~Pci4eeSZ>nxdyKL{g zj#)dh&&cYSr5#DQ9;Rx$kKO=ZANO~b0lqMzI)HdVj!HQad4Hs;7Ei&hx9GkcN{SBv z6T4B^;ZkFIYB#W&#&S7l>b>8^EvDQV0P*9#Kon-D=~mMAMX;;$3BaM;ZTT6wm=YJ>3Z@ z_rgt?$zq^;uL{sxv=l7>kAF&dBr6%f-&B+=T6T^xx7?%ij?e+VLs6dYHoZjhu6UVb z7?2g3r{nBkug2RWsjzetA?5zQr^6n~mcA)bZyGFpn_B8RBJcyz`Za)`R8(Ix-kPMs z27+v_WBso`4KJ<1P^=OvY)a~{;ednfXrU@CGIsB0nEEH{P@-wD>93+q9l+huri~k` zIjB8@mXt-C+CqK*x}W1pdt{8ds4~YROKUu`G{z%KTRgHf#Uo2gJhC*zBXgY{e4w~UqeYe- zi>j!2O2dvtRZKjkVaKBCdXuL#>@e>_OfjvDhkN6{*#A3kNttE&vobpQv(mWySsAPR zS!rtitc+a#tTa4-HpSQ}am4a$$lWoH$?r(x>yGhq*pcyY$9QRoN0yp+WT}FTochmD zVY{Wmc1wlrmI~X)4HdSJBakww&@?E)2=iY*^d@c4C5uU#2D6y#95Z6FbIgdz&N0Iw zJF8d!X;s(}XW~qS9hM3^EERTGDjfJG0lpwEVSFV)|ND>pl54W zEX5#7SylnQBX&ZWBd*kCz^CGJU@72}t`6L#x5-zVXyufrXUMaj87kkY1@Gm23_#9=8bn9issp|6aZ`J(WTFPnxFs+GJ zjv5@xfzq1GwCm4zk5x&=S@j6J(koVYorvTL9FSsx<7YNExeptbEEQdH zaCPVKf6+*OJ4F-_#^N)%t))K2cTUq%lqc*asA={iB6gQfOF=}*6^Z_7lIMl`J}PMk zm{!!*<%*^juxhR$z*c&JYIkl@7!ZZU?vW$o#nTc$z>MGiY9{Eb)PobvTr_~6 ztdSDc9vG{;M29Z%KGoXO)v4YoQ{B^*x$co9JBjU) zaFWFgInFX2=wl>Y3X@NTtI_6BQ<G6|lP_va8O&`kEP0yYDN9xy_Bu;srO$7Z|kNcNpFz-(Ucz?3;7~`dB>}=WCof$!OAszq2K z7v((&J@AGj1D+q<&^b{-)HSyG^;(i@Frj69$D(- zk)>81=_8%}DQ!oVET2kAf-2<*s+1zAjJ*egjNI}hWdtdkqlY_ym?*C?wcwFjaP_hy z(sgS2ta_DA8JCS;QQW@h@uh%2P*h(d7kj8ArI)@%l|@6xuC$t0NWN3IFXk7acCDVK zl5U7fbO8S>q6SePm2>rzS{;0utA*!2lx_F`lfrJPRl3tMsofwfdzZIfCm`DuH@u8@ zftsiaU=o-(8R-S5OsjhFO?)=1POsI{8G4_>?~VEn0)9$S{?-naq)oM^=&O8Wd(x?c zzRQwWz~@KQ5a8X4a+fSNRO!|0H4kNUb77Fyol-mCS9tK^Mj>JvnuBGWYSY`XDH3awpMRm)- zpaX9I*T`V-vFh$KliL9=jHs1>$xT)73fFwTshlZ&5>ufRNKBlE)9^k)4)N+pQo~=rmAL@HZMIhT4 zB7%Y^D&Ybxg%EIQL@h@aU-V(hbPV^M9oWt|CzNtW4)Dx~S`N5KQSKLwmKg(G&asKj zhXK!ssHK28$AkHq<|Xrkz8}$2^agz437E1PaL$PVB@3;c>#5wiFd&05)LyGtVF>tu zqI_#ApNw>?0dGAclR{;?B7+oapU6q6{CEl}wZ1c>Ie?cc$}1F}cK?f~UKBkw42UO$ z&lb}y!;`oLb37>(tZ}vtPg27iPf7)A0x7l3kS*)Go4^xHA<{A?0=_>6eJLQSJCTFY z5P~Xg0Wn90bwF$hZK+|55CURJAf$#}#zcWFsjRIU!m2Dld&~e08Fmeoc1a-ithX#1 zvSPMpy=B|bWNDk{nyj#)+P0C>HW`{QGmqFvv<%IK5Ria4ua86{KB)ai2mw(#5K>Fw zF-`zWLuwO7OB2Ku+pf2a7>z~{6S*M_h%vr3mE5w?Xc-alq*SoR**0p0XWR9qEq-TG zkT2B13x~U9$nPoct#M%M0HU0Te_%agaiT|-g2L{F!@gUG9fo2jYNa9mor+^Hm3a*? z6TjaQzkj_gz7#Dlz@?PKUDxP8{mGA8aOpzJh5HQFVFNE&M&O-g51kZL*{!A9ryZ9s z`a>?JI9ftYJRPoduEW*F1@HFx2ZoVv*0B)9BtrYvA9rftbDowSd81bDPRQ-oqbu&8 z;-gY&&!*JcBZIi=uYc`txsRH~z2!u+OOxfZajxnBl0U+G_j)XRVw%@?uOCvMUwTSl z=qagm6zLoa{I5CT>8FNPl#UP>pUF`sp1St*ObC@PEeJ^07Wg>LYp)HJyx)-$c-A!r z{>!vX*u9?07ZvFUfr)^Za;7d1&WS6B4q(=4cUP&+=+J7215S6M@HtuKaNW`!{qxjD zD^zgpgS*n-wt_RXY*(5{A1)OUoA<@ZG0TXF>(^>Vy!Yh5Pbep@e^{fQMStRY!us*Y zW|XBBUJxb`4bQW*%~PrkQwvG@I{E)W)BP(c?Ey1;_O8dCxhZk?uBSp)JHKKhWsbw{ zEScY$tlqnxN}i((1>~yOx3^kRI3c(!^UmIwxFo3~T&%fCHW=?aE*(Qkwi-N?Cm(R; zq8;mx(omnALcU{tseZ00@wAk3xT)cDTZTa=hfjLt9pyJvbRH1$D|hNob!2G8WlIMz z^YeYCpFgT?a+j8x(uqXhnKR`fK74`dCnwX*z$7*Lh%BB^9Hj#xHM)opVgc#~LUI5d z1D0CuZ(y=TSe8c2lwElg$9clAH86>AToABjdsi0+wB(=rn?3%4cD5g4p5bi!iUe6v07@l0EE7x1JbUcCYif{NGz&9wWuaO^Xpu+M%d;^##FEF#l zVg3zZ>$dg%Cr&bX9H(wRB0W2O$>emY^wm>?IZolZ>hx2R^8wF~s6o;y?;XG=rp4vN z`h{A#QcJN5@C;pVN`xlXQ#m(Vgmx5OqouS3d{b;IzN2z~q67SoNGCEHjrlyLF4=0= zZb>RR4*+LrHL;$`bh+LVFSeTLvf!OD3kEI8AqrFfo~y&uGL5P+!xF3-9{M0C94J*BS6y?Z(dAAf@rW&ffNM^Zv)a18m z>6!z-H;&pJ!1pQ2_aiE4bg#tpHK>fBE*o9U6bL#>UWXSixSdNPli-ml&&TuUrF~5c zjHu~ksyaDf)xZlhrMMpuS+b;lkuusC8Fm0ucC2d5e|PDq zes>(*hX7w0Q60ehBdS)}v%fPo4_R3++lF44kWLz!D z`Z7eX%LWF<3)8^(;CklZAEy!O!Sz&_lx3T@mxY6$e%!lRv*@&--&3@7T?cqrapFn9 zm5TCRhe}%AbUvcbKasJ^954lZjnZJ4yzA~&+fIoC?wWFN6)I+IEEUug#-Wm}eoL+7 zb`lCc91YsK|M^tDtw^B*L`j)@_CLQ=(<4hoJ+f5QBWq>}Mv&MoJ zD^6k~2~l!t45I2*MALjiV}a#eCykeDmcA;@*nl65sHJbxiIaKJ(%x&zO#BX&FLD95 zM^pz8ExT$bKj5TFd_OAF0c7zY$`C&E6jT{JL*<#lx&DQ-X{_D1>DDPXM0-X6?~SNs zfH=f;P5ODh3N6)ibY;v{PeC87j!2hR7lfzYIn=xCK2_;p<^OJU$Z+Wpx!H_LC&U3` z7%*ws=|xMY-pf^1vUv~ziCfj5T74)+X>>Yge&0;?N>-*7_m1`bix!7Oh{Ux6H%g1EhRZ0H92t-w(bAnoEBL~r!XsG`0?yGp z2Qu>QTubH7d4bNI@XyS#%wu7Bo! zlT}DbIrCM|5N5{$ICIgCwMS{FPfj7iPoJFPsrmqmRg%2*pu45K^Oy z2q6}rZXhHF&@o`C<^BdHL5%g7KZ{nyah@=AXVL0DToACO6I@*!V4X!P*B@&s?gu2Z z#QmGsy-MA6zm_hNN0Nf3woVh<^gH9>b*Bdv4Aw(A`J9xWw$fG4P~?krkC%n%puT6>jF`^@f6 zv0f*2j3Er}Eczg9a@Krbb8x1*TQmp6Kv8qY+Lx>DTcbH0Kr+nJ;d9c(BTJ<`(n-(% z$yv1aKNvb!s;y*xSxwB}c+87yj08@5!JB!v){q8ur4*|Y1qB?;0N7PWIvPayZ z1b0Qk&PNsei-ZEqUJFWgau%&#rz>?ki>}CITrIhU)kVPex@=%zyf6)n53Xen{&5Nm;geds#TpapWvoS0+!<(sdo+;kat)0IpP2IE&UwTHSO$qNq=3>DZMXq5c}B z!7zE(-K(~p5(nHh<=`q*%-C2eD0pUNeimJ5<<6oN^{|#Qr|e%t<=cvMXVD6xq^B#@ z^vF_Ck1SR7$V^EE|4ya+APFvs>blE@MI^~9F&j{eX5w#2uhd6HZ^L!Ors%iDP>@4~qbws*5 zi`HJ5dgoB@vKa@h9m?r^^t;g^!=*#qS+uHjLL4xL0h5-UUbJ+%_i~k$Y#u~F;x<@z z6*-I6c9ce^bLPugv@W7nYAGx39c%qr^jdcotyuObB&XR%ptNE;mGxR>;?APi`m^YY zYX@$W7T3~B>gOsTuXBKV^!-x?x1AfP{Ex!}p*xCNHc9QJM+B@VrSc9%22yGt%Sov` zGKG}dMf%q6xuWQS%XLa3c?5{|!fA_X%5XI0PBl@O!x$k1#F9Wr4ZDnC z6&vajQ)D;-%wo33jMO8$=GUKcw^2N2~%`~w>h zixWMv6cqOS9rlI#=n|FfL_Nz8{}#o4B#8&i#P7Gn@9#2nIEjeAMb(fY4e-v0S_X)c z^4eeOVXGIBB6(UKHI-r-6W98L|Y3g?I* z22Jom&+fQE!-okH^?e)uRo7lK`h!T1T&0zlCgk>)U=<;q;?2@L&!)7`BP+`SV%n4F z*K4C~TFTo#AmJ9?yEb6qQM%RXk*8{O`qWa7q;irXo$G=BG$;I#Rwx}IFg}x=20V53 z?4Y6-Lgh1u1*B^WJVX14C!~`1Ws(Qay2ikNkrp4jHc5K(1 z8whq)oj}v3X*I+Fr#n&joUC%VZXE;t^G<+PsNmXbm}8;gY&b+~SDHv~FBK7+_r(b} z%ZQ1WoUa+NN%;xo#7o|%fzF~o@e;!No>?)h6E7*P@PaUjXn3BbZJsh(l>_EU^gET} zU0O=o17`N@-GDt`N%rjBK!vP!e#J)09EaUmGQTESy>|nZJVzM{$W^g#Z?#HsLU38; zoxL$}Nm566p5`XmASUN-aa;$r=^s` zm0C?biAJxyqnxDC$pb=ukmI@wqZSmvFQ>WYf5-OPJ z2p^>}ezcY%1Q3UNAyn|YYYU8LJs}l5<_OjJShx-sx=!eNcnO!dHn-_8{W>k>CCD0t zNR+*5sB3z8_?q8lR7+`!nV6BQPl7ny7kWr}%m})>8fl$J;7$F3?k!r1V*w9SU1hBW zh#BI-2RA%kr+sF3r&zC(I>rzNkpVbeM6k(~pVZ{~f|jB=AO?z>J2q@oGbW-r9Y8Y7 z)8TW{#Uo3lJTlk9!L8;B9kyWTTv1YKf_QW2da^@{Sx0905W z2pwRayui#F?j(AHoJ4PslV~Q7Z|LOVPNMahoJ3ETN}tzM@=j2vAC;UBcv3_Sl2&=| z06sP?E+;mesFlmL6uSUV()Ff9Xkr7E)3ZhB5{0kTQrZH(GPaeIXewJ19pKj@oygdy zm4P&6Jzu*espLEWoTb&o1}f9#x{GJ4nJx=%jae{gNiGx6)qkQ*7RF9f&2YxV6FAM( zOgKzSaUkF|k=<(g9z**yC(*e=q@Z&dFfTE(I%BoBR%JUfVBSPUAJ%ic;7Lo~SDqFJ zxa#bap1DGS8?DI z?hVYW|C+{~-5aPd)ym06FUtX+tnQ7gnWyWG3$=7<4tzyii*x{=swki4RMMKI^G<#K z-i%%85$ZQ94Ti}v@ou&4=s1k7DThp@Ocj=CCy$T(mAUuq;ZGI zIwD<0XN0HTIn=vs#=(P?KOP-2TslPF6Hw{!IA9C|CM`R?XzBcOqsmG)4F$s7vUQItE*SvE=ShC~S4yhOy)qliJk)N)1MB8O?c zJhmPJyf(^R4Twrk!68Gz)j4Yi>$*-L1l_5E=J=mGdgQ!;MUR|!!XwS;&!6N84w5AZ zAP#CZ*8!r+V&(J5Qal1Co5@R9Q#X)alKM|0Zg&wJ#&I~p(N4*BIJ znkM&LSL&_(&1VCeqm29g1>i45w=D(yhluI`el?<&UZzgP3>g(`b*lL!ylRvVa*2l` ziQj0=Z?rP6O}mdr)kaDpXFQL8l*nrKbxUbVOKg`_;3C8G!@WrzuBGK1PE!BA;s*j=esB-H zN8%_l3`i-zyVjbdk~(7*Sg)`96BR}s8BPHy-B124UT}+iWi%LcJd7u&x1-+VwLFvW z&5~B~49$~9Rl?-Dz(Vdd)Ge#7(KJV?LoSYv>4~VCI9(Xszm3Z0i;>?lz>Q}G5}9HE zClnQ?7;0}$grUXMzleBQ6fp>xT6UdcX#GE9>mk7LD0ej=DupSAS`stO6oa65tDt&{ z;Rz0sDFzS+$rJ;K@I#nlXqxn%c8WoBlyOrG@T};grGSS;R0r_rh+6sr1u;XWm|C4K zQ%va~H`<^`;x}6JGo~2Y{acKCmFR9P;_=zhf{~hi-BOy;65IXoRky9i6I<%=A-7yr zx2#4COQsCc^H#|eQ#J=bwG%cCQw(;K4lYQ*nUo?J4FF4I`4eX*qR@ zK_aD(5fw^5#mv?CpQl8!l569L+fFFr+R|BF_m}00UG1E*j z2>M4A6sMT0d5hr*4w5Mb5C_Q=1Bmb`Q_RudzV9gaKfT3VYP`kJH0eF<6ocj{wvxYWR&WX{wGA*-97VUh`NF$kpeF`_~#$fr*}L%F9s7(%U` zF*Sw(Dg7KmCH1x{=5EABT$0d1LTXt>&TctUx2$rsX>L}<-x3YziKy#X?=oWFGeTaR za!n{@ya$~9>!4Nw&QVkt@2QO?LcrgiLP+g@C&Iwm{)bgJe8ryaU{U;QLImVmT${06IyqZYr zuETM7LGIH7BF{Nw)Nsfs4nbrfr1p-e(?NvmqCcOHj~F=wE;v3Y%K;OFxv z!6XLNodLH!{tGgod6H78*(XusF`<(M!4Fr^e9$*YWRTF+A=O1b7zYTj;m zI31_5mDEptYCt|mOBrMUpYpWusNKA*0eWq{X2`KthP`J++(NFoH> z5K+qj@rQ9K7%gv9B~VH>#{t)9xFxpxQ*7@_ffQ_+#DNy(l>TMXpXNBsCspJ(qWxyz3NB74T!v@FrXCWGi&3R|Zu&sKBxJA_GFS?+-WmH12ROQ3 z+Ilxid$jp?bzpyUTXXM>dyk<0SapRg#09@h9u0uPTk>e5J}M2#TDfTD|ALDU^OG3A zQNR;a^5G)+^)vJ(pcG)tT&=zZ+LBV<9`~%5x61NgyLrA+enQJuv$7YWYTIx|3r>I7 zos&h>1E<59Id|{*i}(G-u5H&;Ym1tt?1W!lku|MXt6E7tV*%Z2y+O$+WjF(*<-DZM zjcL_$o4m@@p8I9CHJ1E+4N6TDKZ~gHdQD{YH;d}x%IpE}2Q>SWm=8mMI}{~*GM8Vx z@GiN_1O_wY$-3~Q^yzFxz$EycPU#0M7n?j*8i zK=VXYzrM6kWOw9L_eX=MisuZ2sN!T1^}wmWIil~&FYK%0UbAaA&#I`J*5}o>WTVj) zzo0~v(h*CSwi_N!!zo<-X7bvg)4I&8Tb?#a?R9Cg2Ye(W{P1`!xzV-j5n2kvZ5ADT zpclG*AF}v0aQc6yaAZlqjMhy~W3?AaM*H67Z~3s*Ua*EgD*5u_HK&yBa8}!-JzkK( z4iJY(;{k(V7;Q4HZeA_h%Bx%1)OecxZgpQn!w7j5F&4m}WKtnJz@ zyb5z`1E3A{*v#2Q0v ztB;p1%Gq+)xyz1ut97d`vwuG>x2svvogP7US0oz*Of9RavSx2BqAaQ>8PnveD^;uQ zAg3y1zo+EspbJdWxLRo)I39{(<|akYq-58syv)$$<8N++K;uADFblp zRpF7_F9QA>#Yq}H@S$;PKg}qC2c8mI2TE%5)W43W^$&Hv6V(|8q^U66QBVGX8O@Kn zBGl#11>hGVY7JnM%9AaVhBTp1ckw0D1Ke2>-^r1TSPDJjsF!dlH)D(3d+p_L_3yW!#QM51aNtu3wI zsgLhbSBcDB9~#F?xF}$2A$5CMK$VRJ)mzJzbxXsrTBch-mQA}YDocCa`q5}R(2K_6 z6-n%}b--HfljihT$tA!n0MdC4rbd_U5O_F2D9SG{ zsk|`JmC}v1WM9lYM4Gc==|-tT|5eT0emO99TXWR^Me**8U-#cY?bAm`$44`U?rqDm zlLtSm31meo1U$G%jXXxa!01Ec{el0CK*O`kmFB2sXv%Z&PtfOwyXW@~gvKC;_2EEs z?-Ah%&U~W|SLq2Ddg-jt=3bW;)xXk2S=5zA9TkjS{7MJf;bx_OrP`X=OLiT}}tK6ajlNgwb%U_TI&6AXBaT#8< zSO?IB+_&eoCh0EEd~$Gkz|LM0YOmKaU;{4w4PC3`>%v!Zb-0qJ8D`JCec`>E(YqK1p>&To82tle^ru6ndPZ?$Y*DFHp3M@qo#(u02XWZAnl_ z+fyA?w6q6IA?UU(rlvL6_LyYb10NZmq>3RjxM0O!PNk%Z%0h|0^OC-fCsmX)1}w&1 zv|`OErU536;_@?zUW4c)qgra(2`C3N7?{|ttl3q==M42EDt|E!Nb(U#g_F*!Yay#^ zA*+cFW$27e^S8D`|!h$Jo4zH=gyUD zkQFAXFjsjy6@V$-Jq%zOHvfW&4;2vk-E-`SI8o0|M4xhK1%j0;3U!2aslul=0 zN~be0rPCRhvfVt+z+GbCE;VqMMI4#ubS7YAvcr)Ml&$7t8igOmXw=hSO=XOFHIa3h z#-e&$rIu6gi>lBMw3LYu5M2+GPx|ynPO* ztqj$h)^SQiX`HII8y-%>Nk%$ZAkh)%1hSOa*`A~;oDz2e9QGAY3C`-*jif*uaOtm% z`UYR;;F7Dul|0Qrm>eY-B||}#{H&0f>}2^XZ%HM`fGwE@Y%)1OI;D#7$*u3wV7Z0F zpN~&c#oIC$BJsUT0vDyEN(6)wEw*SFl#(h@F)u(^A(8iHgeNI$kdoM~35un^c7$c? zq-M9gX16>s3Xq@Ir+Dpp^_rVKfIqJ|xe{E9S%H|3s&9k}5JMzr`|FK3=>`7Z^OZf~ za?$UJqC1HG!zH1aOzwz&T@+m%Mpg6uvBy5@QT3efu;K?)d3)vsU`jV-08_d-6qwS@ zp}>@G4h5!cHq84bc zBmPPi`WG!_@&QEG1Fs`KtBomT9Rc{DKC0IdJo!hZIEZz`uaG&c(aM;N+bulv=qnrl z&x&SEWkk~=s_#V`^6DIGT0c`qqLra~)0&|wQ=01t9!|r_kKE0f%I)P>1xLsww%5et z2zrJ`(mgn%@W{}p{97`0-sRu{o(@;Cw4xArmmDP$B||}#{ET>YW4F3yx4LGxy0mm^ z9W6JhQ)Q;V@5AGhR5_8685eLs-L8~WiH1<3*SxfPa6GBvPN6K-Ri0B-q=u?V(i$Ws zmTO9u)0|6{jBiyR$V?0PM~ady{njKE4y}&#hgNZ47zceLu>t&c&V~x7Tm_rbrs8pF zpVtgark16{WLYAISS9~}E!hU_RDStaI5x2xUaq#e`4t#X$=V37{F62N?v;ROo#cnyk=? z^1GTPKh|<)<31B~1l4wbAe`gSEAE|f(||l}-z2w8d2&vqxUQh!$@w{j+#ELo&O*5}yKCREv0+mvDQLay?2e z!Yp2JXLFjm7Cf3gCTixtB_$`#*?PEA!nmkB(;%uo!O=g`jj93NBC1ZPJ?F>`qe9}oG$t?{k8t~m>L))j@n_?4ECf3#W5KAGqd#2O=C&9aWL`lsDAF1J(Dy4M;_<<{dz$K=){izAwY zFTI)S{2tpk)LcmsKo(&Onww^X@t`%|LDwu?ykPc(f{z`ze8IrwXPj0o*`(FYv6Voy z@?dOLDlFpBouyW9;*&){yRk@z4r9Y&W(*&0=;pA2igK=eSC#jJ+}j8~sKy<6Ws!fd zel_|u%dq+y9ZO^=8dDJKje);uwkXm4v0Zh+Qhr-VA5!);w~W=Q&435xjOLb4j8}C2 zV83~-s{W~H!U|M>K~!Z0;6_FDHFxw^3|oC4P$rZ!nmayb34XD%!81nuT77Gkh*D(U zQOP{AMK0vMlsus{sTT2+^2i2WKT7!t=9TMQvMfC zKZ~3O0Z%>$#a016K~e7WSHK$-C(7;_q4Khf5P0*YfuGxR8Jwi{^Cv_pfH$f6fsh)8 z8H0P^fGIzYrVIg|5q&%i2)piEQt+dN%zuD17Mmxm0P!Lm6f^$Tyhq{vvvUKz@ZK^y z`+`uJr{zp}ZQj_NMs>5I<;d#+1wTKPlIlMwT7GnF|46^E0C9u9-^!wLVzhr#Gv7Tw z4eWCk2l*lZ@CHRqZSZr&&c7%$m?_H;kwW#VizA=Q9~Z!9Xeq4!LP2suP=Mrw_Xd@t zH9>?9@JXr5Y#F8U)Iky_TE0a~VY+$r_jStp zoR%JmgshyB^UUqfNd^PrIavV!Vxe;)FxCngAnD@BfJqi11H?6s3>Y^FS*CIXPg6DV zzl=_Rv=pS^igDwz_1Rw8?~I-EOmSTR3{WY z$Dvo=J7enuqy4A5{r?#}`7Nb5uAq?59d_<*^YnL>>QPXAV^o;!8NIi?^=tBn$8XHZ z28CiO8IPBpAFO+{iM%$-TYapqI?~z&N+nD*n(=B*J_rLOeRs_%`%4NiXT?D>va0w zIIVU7k?-j+nVj&*TIZ=4B(liuzUJMb;#uS>B~_NVzp6EFX`L)br&=O4nFFwgHHN#m zi{^OC;d*H+r@>`Y>wwshD&u_JvL5=4mNHOZ*nj$#R@oeUFM9jHmkjJ|FfHJwR64m-Df_NPcji~J9f(YSaSqABmG(~T*EA0QoPq^NpOP>?_<~Z! zP>1w8`tmEQ8^B9-{5;&X?!Rck)?E@1kgyhdn{m^8PZhc-vK|7wQcU!NtJ5Dx@8bm30MX%M+ll-hPbtKNs6Yljh97)NJ zoe4Ze2!6TIaHlLtxJ8u@ZYvYic4pHo(pDo{8hh)r8d$^B7)dRnDv@W2m*91O6u5#e zduR=hhFW@jZ`a)2j3%)zv{xn z<9p=s(JnkZz84O;~Aw!nYWi6u0Ej7`jtHH0!w+Gfudm4m~*Fc^V1G)_G zd_}qM?6be_I9z9#uXL2MUIIKxA1&-+MX_vx{0wb&_JNzp7gW06&8nANZjkwJp$1A| zl+mxq-zVxB0Xq(oM&&EMpvqTbL6vX9M*gv2DP_!-Em-YsrL62xDKmRi%FZ5P7iBnx zb~Us(Hy(d11;ltcM)}5Qy!}(^CU?n8odi|tV%#`yHP@(@H)|aqTtv8jq|t2382mcj*9$`({9T2Q5AK^=_XHMQV1wcu)7*w_NLw|gs(|B-rL zW@OJ5->F^riCg>oPj%;?aTOM= zW~dI=L|ujeM-(OQ*fL7x_DHv`^pLre804I)t*}K#*Shr~E@_xYYZ<@1)k`-SZa1?u z#No=AI9wT&>2^Y~g;0oV0SUw}Au3IS9CGbfo_5_F={EUZQn@lCS*9ttng0 zmo@dSjyBjC5UqBo? zbbD(wVi~&4jJNofc{8#+a~N%_|efOsWUl z?xsrv0XZr!*(@fJ#)Xd3wMtD zI33$;WLJ6KK(}3Gu{<^$h$<`tL@W6^4;ejAJFGqPMEiZCX+1_;)5PdQP3u%8qBK4} z)NXh<4X3__hl5e+%5N4?68<7nn?3CS9y5T^Usy1Vq~b`E{X-7rLRxHJI|R zb*VO^G#n{6LzL)>Bx4E}sq{50u&;{mn1+vPBGX5Zu~jMCi-547x@%dh<1nzfLRHFk zOhG+4YTE%sLPlM(clEQhC7fiV3J?xqL*I7%1=^g_bUY6)Pg<6$$Yqu0xAijExL&G~ zIh6ZOTyZnDETm!9cC+%3(FHKETT`>E;$|trj&IoCy_E;cIB+u{~N<=^%UI8pXBH(DRqg9qh| z=0@`ad%;KFQcdT_$PSadFNn$v18!85d~-_wBo*|LA5Uw#9Dla@j#B=VGn$+2PxGk+ zm|9x^eQTA7Qq-wG&DXT9RGDc=swNkUs2Zd!qU(bDvcIhxDsj~Xl-_iHyi zOo~^W+6|x9cux)qBmi%k(SHZ{Vr!n38=-NqYf0VG>e{+%=*ZS?3eQ#X*N6Potl!J`sfLAN3-Q0OO z@c&ete0!r@K-EuRWNwQ5Ahb8rA{l)9nmczkRA?K7EXmjd#`bqawMPJ_w$_UlG?X&7 zh0y-Oaf@#2#BbI^qXg#{3`6^O)ryCrH66gi^b2Jd`H?fRy-OqT$w7mwA_ zxTRnbRYR)VV1U;#k=F=dVqcB3cFRuLQuZk)s*}fd1LLJpW_|g|Agc7YI8~~KyAp^z zK}AXkB>SliMMXM*=q4uYHHLH^zbUpfOsI(r6KbL^CP4VyWP)T7wKqmZI)LaVCTy;v z(6s(oTm0|XvNFLUs!Wh1io8CqyxecK=>h{3V%&acm$gUY1F?O7;$xNO^#s`ZloC-I z8z$|BhsZPD()wCFhP)J@!%w`apt09${r#wHaF zk36hIl%_{`I1Q&(i_hKhAx*<07E$Gqnn*6i&+B>xpeDET<2?O;Hd+zseh3Khu$I>c+i#z9dfW7JD4R!dWnnGveyU%Ba&o1{Ht-c+czz3 z^uM-I^cROiGfKAQr=Pk?~JHHK=N3qKBi9}*3um#1OL0?`kLGBoZP6VLrH%@mipU0?_=tP zZ$)nyV^mFK3^FB=^@Y~KZJ$+HUyU*c0l%)OaK7g5Z-GI<+44P{^21&B)h-u?|D!A@ zWupS{A$?T;-Ud&;s1yhBdmFz(=CDR9V}C$?Btumu^^DosBB~--6WNQ8A6D{=#m7&S zh|*kq@Gxm!b81NR8JgpU5Bi#C>O(q$;RB1P@;ZU#KAO{9n_W-4S+33TUHRO(dW1f7i+`pA4$0XE$5lu%g>R?Nw@SQqsuirzsJoxzy(2G@M$k+m+Lsv^0ET z5mi2^iOk8V_1a3FVcr%cqBJ(b+YJws<`t)~WSG=9i9gp;OynSnWsabDgJ4tCa)c&j z&2Tjg-xv>khXIp})wPV;k6uPCVGR-zyEQetE^iVgJNJ@T@^iS7q4hG@&8P9}zmkH> zOMccj0EoS%D!oM`1cSDCTY3UuQluBhJ9aQjEqn2?)v{M_T5ZKkJvh#-@JoGNmn)lE z-O#P@54Ek+xM^OadH$}L@7Dq1JinMPwdrYv{}W|;!DT_1b7n{3HCoEr9q^`z8U(yM zqB`3Z{EU`vg%A8tBpVsj)fC#x)t6FtyEp7oWxo?WVXW?JBBSG%L{{X2L%yW4{yEC* z0DenR>7$WgQ1F1O`+ratlrs7PenlV2>OT8`r2AD~o;<7+vbxVGHct0h$X_9ISfiC> zP4Hm)+iu|)(#{z9Eut!dHIa2G*`l&GAit-MOj=c{%TU~c?1xJ3-s-~A0!(619Ywk^ z^CYEGvuWsO-;4ciX$k<)UVV6s_CzBLO;Zz9VMs)XbHBk6KEFNPiWSyJM)}ox z!m0WLRr9b&whR!><<}~@ek}Q?+MLoj|7`OB65@oxEw2LEAHSkzOmA`5tSL}jO=Je5wV{${ z1mZ>|qBLJCc$hS=IJtoSlfF#wP08U72Vd>U#$dqGXY;abFAgdj8$NR!>XxhPmX#yz zmTT&k)hk5M8mZroFHs%9$7Ej|UGj5ZqiX+y;bXP6yw(Gr9#N}Ge#XncWtl89Csveg zJkc2VbklZBg{>@QFc*iX+ zfJc)Mz#A0hzwnj{78+ulh-KPlePlNR_(DbX%lGHr+?-r({JTE!2BkSqzxY+Me`h;> zdnwijtP@xME89y4;Hyt*+@(*{Emzkq%|21LTvNB~(kE#9_UNt-;NK|9<$uYqd!K;e z-$#Z^0sk?gs_zl*(kEa>G$gC{j+VN3WElrnH(KwvT6gagf2bP&S=77(_)tVGN1>&u zPXMNvFE2HuPwY}gc*pe#;JKQGlIwt{Da!W=D)^^MpEy$6oD|uO06tbx-TH*nda2TU zH#T3%2aLF*+$E>$maFTQW=_{F*VHY$=JjFVV%g`yrOLDk(M$>>;0of z>+ap>`Ks}qQS%PqmWYbRoSeE3U`ns*WsB~!SsCFS*L{HhCJI>v_%%iOuV1Hvf4cm} z!{@ZkKSg#UfDbFGzu9C?DeXS_*YLrG_vj}&yvwP4BO&*WQsI*eLRsIHYqbo9brfcZ z8|;TCsl7T8h8Fc-c)neE%L*Luve^1MKo~nQLxz~^Y5@-OXUhC9qmU863pDfP z3-Pzinox=8?U6Q1+J7~&TnhL(Whonm=nF&R<8yAA1hdm(%b`*g3{-Q?@mI<~05f&B}xGnQM8HT4&@l(v4qxvRlS{PA#i^&Re3be42D~Yq9%krqj>X z6WlW528rWT{==GuF$Y!xGVUBHyR%NxyimT!Hs@R+QXkL8^C{$rX3hY}j_J@S~}g@?!Y z$m7T^JUqS^9@+Sg8OHeTKKYIp7!!JHsX9n|LVRa*b_ej)5w!v^N$CJm%IB-dfTZ$@ z%Geg+`r7{`?@i$JDyqEyx=%0ZBoIPaR0t5VAShdi0&Wo5UXf9Hjol%gz=(tBfFX3) zlg^;8gQJYWFc@{@iK1h~7mRy!M5B%jj=1ZHIx6ZgFYdTAF2n!Sz2{qXpQ`gb-4St| z|J!^>{p#FPXRGzrt$Uv!J)1)s22<9(a;ClArT!&%-{cQ(b3DSg8w~hZFrXj!StZSp z_U^@esJBhmDeh3t=!Nlfx6a0#z)i}?hz1SEU3E* zOpNnPR#g^LR#iFE)RR&1V+~zYZXDP7r81Eki_nJSVh2fu+fN5HMi1k$fV7=rv9hsh zloT(Gw4RTarICd?{!c1b#s^_-!39mdo1! zn=k7F>=iBl999da2-hl@_Ez`11oQ37#3;uXPicA^dN>;F-aM zBrsR8bYYb_OXdHFHQef@n+MmOk?`TV$~7p9RYk8`v!!ovOCNdCk}j9X zzbx>NZs`*``5WqVkwYFAdR@gIV_P9V%^-U?xZ6+hH%C%h(slLfMamlsxtvKBt?PEm zV%GXY&~6$c{q1-)<%(eMN?afU#%uCwgOp#X<(?bL_X95qq+wvx(hnq+*_D_@#o1x; zMrd}l&bDC@m$a-o=vbv2?wQTBu&1R)TV-WQ zoE9~{hEok7RPjmbw;zSTKMjE&%H`$zBWl`{v=mb65+{Si0jlj6k%W@LP;J?|SN4>9 zdS=X+Idk@G`26TzhNnxjE`LZD&0fBOnd>h*$2y z*9#`~dcmar4HGa;-0LM+v`Xtuu)=*$qkCAGb@Se8a;5D|wvTgJOY`Pva2coLO6k37 z(|k>3zYDlPN&cs{D{geUS|tm~DxoXU&2wSENIL#2?)5DA>Cms$@(`gcaS z@@VB~JqWq3(?Q5bP&lHo%Gh9T6oh6-P4~lf8X1!-WpX)}^>&h>(0IqEI8n{PEbBh7 zI9ZuUjVZn1xY$XO`0@gkMHlgLpqnu5S+Vh9Fv>ckY!)%Q?9yglHt#f17}__48obPb z-=s8|-+r@!3i@dVdmh3E`fLR}ftUa}iM<&TMdMI{rEUb(lvQnv8Pqp{CzD8F2gf7MoI z+JXqv(x)lo zKR;;OQPQU)Lk64F4P*S7DUFX>pe0SOq}m|mZ`F44uF!}2fgcH^5n$BP4DG&MRBPxrxia^1t~qr2HlHiWOH4WD_}+xcrw6|V zfX`5p|6*N-)z6cZjZ|6?5DD{JZLhsMyWZR*r~Jt(`r($hc5B7=U303q|437@95|_4 zC2|+FZEaRN1_4=j2U)|wllQ9lWt$#&?c9n~?dXwPx^G|vt_!3=;6Z9yRhHb5N);u* zRV|F<{vt90aki3ZIA@aZ_?N-s0U&P53Dp+N(S#mH}FJtx#S~5JSvgo2#J&i5}mTN8HtQYXu3nq4+0+>NJBtEBnq~#B}0U~ zd4nNdJG9-%5Cwexej#4l*ODPZRcUg>qf|r&&ns4PIA5}oArcj9=Cu%V$47CT!Xj}; zhaQzn7(>DnLg8^&H#0MQI<_)Zg2mu8n?BQ%_4X z*2uHMkUSPIR;UULjE5>?j~s@1(vl|G)08|zHY9HBmJ1LNEEldRFQnpK@l&;-TV+^P zm~$B&IcIvbY;;uBSG|6_t+(w5V=^<0Hqv7-WkL17nuklIGGPH9RBsP!XIiZ{U1QwF z^abI6I7vj_Xl#W$P^)Emhw90>jOwWx65?n%v&)90eGKAbRhKkuAnNzj7N#ZA=H#bb zR4i60dZ+1R6CTpz_0lZa#qxXb{#q)k`U&TQm6KFr1jO1$)m&Jo?QOB&iihDSmGPJs z+gn&u<$kI4$JRq|e$RL{oV`A@);a$VEd|rCbP5M|t1?~ync!r7aF?}~y~|k3+PA3b z@@Tp@qchXCDfy}|Q;QF1`}U6sU$J+^{#s3CPZ;>7KpF(zrlc;nwrG-hU*rSsihPYG znSTj<{hv{ImY$FB3(1B1RF)j3saOKsFWg%U9<7iY3STn4JMgqLde&>;)x)YZDl!xj z6wDM-D$f`&EAvwWWlY4@uLL)SX6a@GrW?DBUfloD5+4X92hx(>*-CT$-;G)T0mfFp zb2(G?klkWhQCH-#A4ib2MHPFqz|n|-w5Y!q-jO@`=p;Orll7u^hWM;Viy9Tx<+?JZ z@>L3X_PcP_rtbNVlq@z4N!KE zP<9wtD|_$8T9E)Li!$k7K+5{(0rrt`3hxsX4+1GHMn7mO4i*I0ZwpdJfj>L6V)Kjc zjbwTjRzz>tXp`JuE~>GT`Kl7-5D;+Y;(BRvHFNLkXf7^ep?tOrh<#%0rb#lG=Zzh+ zjNLSevDhLafi<%>WmV6JSNY@rouv_^2K~?ueqM;~FmOX4jR0R9NW;K41kwl)=fu+o zHsT>}lteNw2^BD6`1C*)>bg(IsA4>*dqd1+^aR$7y2mo=o{hOtgN9M}WJbvkYn3s^ zAmS%|1^Ab0t6vnYl`}o$-x7j1fc8s5Nb=d!tC0^5_`ln=FUzppo&zcKj6m~R3+r>Fc5=$ou-y} zT55u))zx}j#R)3PW*t;fq#6ETBbhUmC{qdWafj6Sj?v5-O@$ALrKP;o)RLImS`smf zv|O^vj->ptR7nE&^-!Oyf!Hby4fwt2-e)(G`I!>sO_tAY>|NB?gmA&Zm42xV;1x=e zMaC6PGB-p%;F|-V$Rx8f@&P{)_(UF=z7WU$JhTIZcISf1ItkckH&!tI8=u)xvqVMM z@7YL(xX4+0AW;#%>n06%uA9Ur3@{GjM?)%fn1=ZH(31LrOF{%TOg71&LX6n8@eB>e za109&6UtAikg2t~UDi;xYopQTc4Z;#?&&EXeG(AT8E)o7%`M$qx*?G6QC;v?8(SJs z3E^I~t0fDq;xKh9V@QLT?n@F>g64ZU_*9LmjPSrq18F4?+k^{LL8rVAJZ#8ZQM`lT<^+%+yqV z4|dna8@uI(0LpYIF#0r}>u9*=Xo)Cn zWiD(iElI^$?Goxj+PGOIlUmyV8Iv4{zUfnKUMcjVX-&+W{$?9|?Se{qms?jf$=sks>7K7u zNJ}jFsv`Nn2&Mc?H@u~LbW3AoOXKfV&KorC@t3xAlYO(2`?SQC1{4(6WV!Uu|8#Bs zC)=MG^cUJ!OY6zJBy`|G;4P7FvPtHnk+`u*=39}tp-IN67oz5xCYb{x@#-d-<0J8^ zCYfhN;+0J@=SSidO)^(U;^j>;8zb?uCgFQmB<4esYnXqsbDsuIT0$B&adNV01a6}h zxD8g|uCW4lwH3IltiWAq1?~zfaF<(wyUYljEKJhCiRUi;^A7`)|GIi!q%DF}mdIR+>5SKTfszlOmw|3`b zb4aPALftXhe1TF)g}Qw*M1!b^*ejYY{YzruW0S{2MyWZUp648)AcameNTCxDQs~5l z6gpucg-&Ehp%WZZ=!Az9IsqbuPKZdMr@<=R&-Grd_n_*UaRZSvb@}!4bY%5UhsoGH z;GToo!n7)7YGYN(W^K;9oGG)4mBlp+E2lPT>etw}EB+@s19)6{qZ z&@CJd`9D{(w24BLNpWCQGB6D#g?ptM)eOdEuZA@oTLe#0COJhF9^h4ucv}rFE{4?N z%1;qmT*qb2%nO~b7CkYT-w(vtnR48+!@D5PE!4845>4P?dP&}doroWmxkQfNaODW) zkT+p#936iWJ{krR0a2dfO;`WCwfOlnuVt%4S~F%U+~<#lY>8D6ToTJ#(&J z8mmk9D2-~<=RM~5mw8|%m0=fnm^$rWP4%CHB9Bz#Ej)jWa;oCEWE3yl`9>wAQ8T$x zCb?TcRxPl31Bq-c5lqF+-g8eOA(2#q1-w8FCs^dKQM%!+5C2rfvE3-%C|<6z-=V45 zn=G!>J9#rdl_gDPXV&0Mw!AmZ$fOwyhHB^gHEKGkj9S2(_0m4xlJqz`7vH2z`;|mMnTZcinF-#iVIvX)ksLi?Z_)Gu%Xf%5_lT1NoA4B z#14G1UaAiK9NHv*ozmt03W%zP9Gpo18bX*#Bpw;JY+a7{(rc{{np~+R<&z_%eN(;I zQ=YF~=|91@^a%g13FQ0q@?QQ4bZ?Cz6>4eDS8L9FR0ZON(ORgJPbn*@^c3J1_0oYY zR@aWK`>p^Jz8u`bEN88gt^*%FFGzgOOQb>Yb?n@qypb4)qedMx+;26+vpOsUOs+I2 zvT#XdNmtD0C6mnHYFWoG*!0bu846&=TsafTCvU2+sB#67i@brotreb>IkcHN zIx8sp1B>bCV8c;EEJLh;!Q@IEkeW(mNloReFq18>sj46EskKBZ_Zh&sVY#)oTyBxa z5o-w`HcwUjKox5iXDQctJ#KIr!Gh~}RVcx-CL-8SDQxY6b*xGvm1zjLECkD+J3X{X z9;wEh;fJHCietM`ywIZchG3O(o0Ds8wEn_wQ<%40va748YQMPuhLs!DJMq;|w- zVc6CfyIA4vk@Q0ygy^4A@M4X_%QO{IB|QFHo{Z2BJ35z}ID(1Mo^U(|BV@7xvN<9* zfw?`S#2>qSK{buzOUB(}G}gIw8qfD>D#J1G+ac7Kx!mYs9)m{6nVW-6OPk=EgXyEdHwMxG@FRgViZkB~jbs!!Pa8{@yQF9? z(#(LS@;*V{m_~_1Y)nHyQooG=K0_Ore~bjCvi-&!_#7)1X2p6dw(J(&_`L zGe(0i3Tpp;Rc%dECRa-g%1rS!m4Pf{1yjyG#W$6aR4fDDR||n3P{~J`gQ;depgyeP z6plKKu2>X5(_TSW@S(b1Yalktd}CE!9kI$fqipJ$^!mK)0si&#hYmPyao4W*lxMf( z2BBNucuZw>;!TxVy7sGdbuD;5nhJj-lB#LLmTKsgA&V&P5yy^OlOW1qotB)@SMFDb z(nyi_ZGaDH_4rQ^g>%@KNfY8ip&IwCGsvyF_vp~(?P>(6F@yPc-Tpw@QvYVkDi6`! zF)|oK^D-jiier_Z(b($3CRb{N)J`hP|FFR_X=od@`m-Wg3F8eYS3Es2(HM%#k-?p= zjHFTvz-Q~F`H4xrp|Y=(%7%+z9NLy!-bJr!KK03uC;tsfQHkY7jQp!)4abDZEa2-q zo#8w!9sjL%(N>}}BsxQ48a&rkbhlW^RNiSMf(MT}@uqfl;!W-C#G5+O&W|=jUFt#` zw$%DIY^mXG*ixHyk?5YFV;M%t5@@B82(gfcbU}MP?4lk z9{4o9w6_ekwf&za(#zqY_3?UD?4m9SBEDk6RFVvrQWBO)Nn7+>Ea8TTBD!Im4(~l z$~RFhF8kZiZ&8artf|yG5Mw*;ExF=0ElFx@6Eqwb-xt-St~DGAf2K@!lnky^l*~&h zm+Yum`-uiyzVR|6lV-GpYRTXnZ&8uT%nAIu`XxV-CM((SOy&w1h`99az;a2-!lnC_ zWnZ~lYu$eIg3?g<^+PlYHGf!k<3SbEiXK5 z6&^MV*9E*WXdeLHDQ{H!KRGP~d~(g8fhIZ3G>#Qj5~7_i32Fv`%T%VEzXl@M`#or= zS%ug%B^?Wi~ zC6_)tyLqIN#x<3(2+OVtM)w2%UP;okue&r@qd=OyzC83}H4ow5Jn(5j(KzspO7fdQ zC`XgLQ2?Z-t)nMhYC|W@Cj@_1qvg~{I#VH9jHB^>(X&=c9-8{^J9TZosJa=QA56n9YrC%Eb8GRs}@9c3almUHrRJX1^R_OU2XMTN^04m`-Nd&p_&H3a0I1CNGR$CPbM-c3o<$*9<=#AiX2G^pV+3 zNQKs1trVn1$t78KSs|%tSaD16Z3KuF{`ZorQQ=F<^yR=j2z*RvNh3h)kn+_Smzhzx zm#QRm8RMG8l#OfEY87eMtJFT3zAMY2YzvkT08t&8(`e-u_@9b2CXrL2djfFd1`s&Sb?d$f7#u$s>*GE2YcBS4z2tzIpOAG37~vVp*9@ z0lh&zqOD=8_?r4jYM$)iVh2g`Qi@7CJT%%oat4zXIdK?izfq~NAwk(c=otXU&Y=r{ ztUcvsnyV+bj|z{@WNpP2^hr{))p7BVU~VoctzgX`RCPdE)DHmPqa=T0JJ2L|XJiEa zvW1b{jA~oMO9URQq)H;W#gP$sNeg2elQZ&Tlp?!Zz{7&ID}Xps-LI4TVPpj2NX1BQ zzhLbOAdXaw7l*8U)fT{ILh@!&grOW2JR(RmJW+6^=>eK?gpv6QOwUocHP9=HM!{s17=dxdZIaEs=8%hoWF||+b8<#DS6T6w3YV$-- zRyk4`Q-MdQRC$%D_DIDqp}BITa>%PpHI9xy>h}l=M>JL$RoN(r3w2{X=P{UISBJ|N z?E>3rA^a>S{_2j z;zPvZUjOm<+75mtzU0sM;AaLEe?So(oN5$!zPx>PSxi}V`7sq)Ply%P2RYvq zOj*4BO(C)_Qd!bL9u1xd^0Rp7^4rDx1(~tNj@l*4L~5?5xftEfBy|`t+vAV#!{jhAtz3L=%Z2t=2(#kswc^|r_rtnh8Ig~4izkAPU;f~XEw zd=haWi!1N{ST^nZZ~9br!e^fQf$0s(JV);JWJnBe2Bog%Vy&f(bE%O=OW~=`^{Sdw z>InF1y)?hos&#Rv&yO8&z0T&otd$!sJU+NpcFSborKb_7)~0{j7GmA48WAJ- zw&JpwvPy_d|EZGffhgCPHSXTbs1AMB4@Af$O$Q?ASoV7iM2~=o4o)>3)xn01(Kjrn ztXlj)gsfTB>?w!3Ci=j8D$UrpsTXAzO>Q26Sk|d;u%}2WeFKOA`2fWgOq6xlWh9;>7-H&Han3@OnEX1Gc2%2*n~X^NtMP=&I$0z4~}9t9$}ia)ui zCTj}4USIK0;*FR-*-ZTr7x89LHTQaNjBow>%N-2g6@1C;=?Uc`Q+C@^X-C0pRN72g zHp*``_ANN9328@A)DJ{#jXMo_ZiBs|zD1=Y(&&!Wlzgi)lFIEK@HV~Ve>0~`;1ywZQWiWTena?uUBTuAqUxw@|Pfy_PMKz)+_%S#9b{PLGopw5QeBItv${% z<)&Sw&s8xEnKD=dzoLp8@>Vw(l`}9i)#y+1O|1=Yjj6#F;5Wgih-7L>Luv+d8JXl; zc%S+4Jm=CO4f-@?e5{R(l0HotZ*L=`q)$hN45XBs%^;50PUxg;fTTo#dS*64A z%q*#DRx zKeW&MHb1lI8sAm3Nac%P{8DNfi@q?=9H>?q!+^z<4FfrowU582qxH-QQ3%~PHLe_~ z<@bInI;jk1z`gZSuY9J(zphF?`oe>NAleVX534wZr(u6rfg#7Y53a?O1=kgeR6>-L zE&p9{lroW;dzf78AV~(`;>jwDWsI~7AWIE|KKGY;`RjO@Id0TbZdXBx+ch2B<4|@K9(I z*$a0?fu#Lon@c5GOnJk}B-u>@eS4@r|A|sr0h(>Xf9t6HBb^hN+cgR}ry;(pz~|%J z`))C1zFSOrePrs)qj$v-YD_dLA83kWm5J22NsxX!wIn|=X4T{9b+xR)us6D!7TYiIxAu ze4>Uf(6CrFoJKuKS^krt@+TuN@U}o&4cwumYT_n$S700g9x?}UtAPuZRFx(7 z^uRa*TpviQfw#1jCHKz2n2qL@_SS!K_4HuwFz~H`vzmid8_I ztICplPGB4c{(T^=0^(d%mRxi-8&)bOaqfJk|QdNuhfsx@%2m3%)) z9|XQVL}U$+V0qbtA#{fZU)KPMOvOmaUkYP zR{(x4aE$^F3RaE-all(S+9VgP%xA9_Gjl7)uo64`8wrzSutbJuAUaDvGEWGWjsc0F zw{)yYE?S!1l$Fm|0Z{vXNeo^Tf;5DQzlo$&iM5#abFlyWw`pnVM+@G|&e3$V zl;gknf)=`jw+Q^CVE78O;EQLQj+$ydMIfmR%fJ&XKZ)6W#LPEgH6Mn*H>VgIXAA#ZjA34s{3bCL{}3SVxfQZfq% zu@D19r1ZkfnnA2VOU2htQKo0q&?Da!$@GjGdh+j&1htu-F+-1hUpCV-X6VVkLt9SH zrLtR96O#N~b*M^RqN&W1z+Hi~8b~!s;I1?3Y<2Jn&=s|N(lWJx_Tw%1f??HCRsFg450$$Gf2yu=%8>(q!ejaSC>35p*-R5cC%bx5OA7W zQBesSVk;{0Ldx$T7u83DkxVLK0X8)((snjYlED-2@l&+2PmYxi#I&+38B$*sjMWWy zxdY=tSvVN3AdGxPYfHtLKUZVCl1++V77YY$3#5ThDEvYo^#l7t+g$-%6iEF*8i=e1 zfcHLw7QO;FTN{0syKH%r%qK%nSb_JnEjcU$Bp_BZi}68sSCBad++RsY$-(@~ErN2hU&}93C2ZnbtV7Tbl?lyl z-!Oa#J9RARk&Wb~i<@1VouR3$KY{zUa-y-GE>M;eL+O4X2KoM){`n5cc>W)1mwz#R z>5@y`!A&T*X1G*@;*rS+4th78T6MCfrn1HZ-VsPEfOjg%FMURuv8^5u9iq5i<90HMB~bgYH<(*&DK`vBErtB3hQTovo&u zV?h-)Te6ag`m<$8)qYDW!pbvs*>?|2aoXZ#=vl9DQzQW~*p~!v3v9!{?<%Q0ZcFBY z$On8#NnRXyGz5Q`pyOtn?yN$t3-YZAstm#cWqE91JrCHgB)?Dqk482iO04xn!=>_V zgHKnn=SA_cwJ0iX)r&+=CdiD*Jz8URMu?fw+;gT(QsE9!35RNGTV7ePK*!6ozAX(A6e zvAinl*}$(?nhZ7%Y$Wr68YB3wIwP51)fmA&8jMmRnS+#Qb*31RJQl;m0=Go!gB!`< znA}4EpBLlv;6^fNuUbsh*NV`7N2rMbAPPnM=1DTBl>Q1tQOVaTy?qY7xGK#R__bil z3g9;asUNr~RP`DlHp;CG5F152@HwI23gAC$jmj=EkjnPa8*GML=p$>o6;jz1BROKy zXvK6s#Wt27AltoZN3BBM^JN^`lL4(fSVazM5Z7Jh=~J zxew#H4`cXnWvG;K;OkGWI%<94Gyfvr%x)$|Cs7pH@`{#n}K!sXA1F71OoR7 z-B#Y4Arrkf2G!W2U!iRhduO?u_57Q2&~A<$^SVhg+mz@F9NqluH{O2AhGA&$uNO$& zmJW8^Wa>>xj8;{MJ1L(_?exdx4Ewfb_W9>}*mYa9YwM(8*H+7}t&{ET`a6vt&BV_h zV7j=BF$bt#nvRfwG#y_Oj9Y&T6}&2PgPv;sIgMCCGh?MgG4 zEThoDnf3ixda7QM?Is|`mnTWm$i@7pwB$9Re~bV>78?CH{e$Kr^EHir|1gM+0ArK4 z)|RF2&#Ky0LG38;g+cAATC*)K~X_V*K_r@QuN~e&E(X z8U)6{r62hAngZ~u;Mo9hwUWHf=PD)uo(BHgP;?dWbxM*iKTI~s#4#-d?+c-5e;Pcm zA;zXcRm*O;={YiDIf5F7Kue8RRyZPaZ-{9>@IEEU9_{m+WYA`8t5&s+zz=HaS+Ya9 zrTfzEE!|t@Li?~@^FMV|UHkJbedlfIgZ@Rm-siUTRaep&d0jI!tVhN0K3m}wR^}y# z@{-0>`E~6xbJRXrg`|c#mopjnFW*;5Kh(5c1y$mYeR9>0Zq!tk!@%>ON*7xNyi7@c z4KUIqw>2=1051q5VAg|i3(c<#numc1_G*R=HN&ZziV?}JDSFNedIo^FB}*?OoLn;aw#jVc8c4gG~s)ZFuws!91a3I0x?Ee#^y8Qea$`8~yB+N7-Z+}+bt6yeuM zIm#0PTmoz$oh3GG>GuC`nG21YToA6sh1!A~}VzEoF~_nv%kb4wqkmTGYKHA-*kWbD6%>>U?WMu5#yU45^&Loew0;GC*v* zI4}DzS`xOxotHB`N10I5aF@-UnyY?elX5rQT9x@8P0g<<%I`Yp<@K7%XUun8+$0wZ z8yig|kDY z&@d&hT)%e7#ZA|gH>e@+*Hi+qzc%wHh56iks(YuFV9=6Dk&eO(6D(SONsAi^pp2(tS1o&Ac`O2Rp^Xz0e)pL&?HA>q%824As*vELLf%%oFs##9Zo0a77k(|28hUQAs(0@jT4BL zlFx`oNy_z%8hRewh*E^hQVdwr)Bbc~u4l~9v%~Ob%+S;6bmCQ7fmrN^$)70g7ol?d zfty2}tp-v}61eM(I?ETk$?3!{)v{1iZ^12!>sA%2x+j>>51e%ZJ#`iEolk-^4qO<< zvQ<=rb8h1So4=ZorocXsywiS z4hoy6n5xr>lqdYvi9-bJt1+vngblINJDrGRQV9$2MH&`qJDVoS;EDHmwpR9DvC@H< zR+c40>dS($+TZ+u@t`c6_VzIHg=fSS2gV$y#&{+DipQdXz_o!i@EV1;1X4fnoiRTj9jhi5PyMGM9}(@wrg|@X|mU z0A8V_@^oTqwOtQCRijaE_G{--Ht{XiA?OZOkLI@PqR%Mf7c|w=iDbX5WO+aW{P$K) zG}hAxl%+2W%KbnLvNkLHs+RHmy@&{>6QSUm;ZhNbMSQm{RQAMx*9X!H z;7v;MOP`S@x%ULd5#XnEiD?*^YJPqwJq$!}wbe!L9gz_j)wJE9cP@8v02dKmE#=7J zge>KN2LykHfatEu;#HdF$_FjwgGMk1QC`>7>2%^>Xn^p;cd>s`+Fc=d{lGJWPpg5~ zD#@1wqkW3gi6~#EioA%=D}E>_AKq6r5Jk@heo`=K6y@)XBw(~B+itB+Ct8+Vs}|Hl zgDFv9whhYZL`x)*#Yyi8BJs%6i0!$x*ru%{<~J>^`r{p%N`C~Ne_VA*ru3bYWKK}W zsvb%1WTlp@WS$jjA=^#pq<`4ZzunY7+%)uWpUm}V50E?QA29UqF!c{u`ga)m+iXsF zEAsdc8v3`H`Ufrj+YJ5Y?tra*6zxZa+8Y8AZD04JL3gZXii)fBBGEI>6F7IjGVLE?W;FMlDeIGk`>{&;iKe#Ym2nRo zTQ#mjLKH`U3j=8w_#!1$qb9kDz}R+xM9u8LIt;uxkcNN=_G*Tk3YsiPMSX-yT?pKc*1xq~id;qnFCp49G<9 zjX{-Kb8eM3KCuV%LUf*VakHuC10`olYk{PoqaO@v{e*E-qut_mqvMBP1YA$Cm`-m$90t zhr|czlFWdmnE?{pO_Nx2w-%7m1^6{3$sXcllME&c-;Xlu`>}K%4XA840Wp4x(}}Ow zl7ANZ#|UssX!PUs51NbY+SBO&BXErXW0SYmmSvmTrfQE2YDa-j2?AH;YFD8)>d0=k z{W7Hbqsx^E+aZC%ryCoFuPlM+*#Mo4b(}~k_WW;g=H4K548n3KyL}o{b zX+Q8iN-9q$l0loXty!%Z;y;85GrxT&SNw0T4o%m(t`kkg?(!m<(DXh#( z4&^0{sq!{$yWh}MRv~HSIhQjT_b>mb67JBnT?MK5$5s94d`)FJ41B_obg@;yGnC}l z03%Iu&ku|vz!Sm*Wi&k7 zmTL_dGNht_QQYcWT>ii|TB(*1cv-LkpQ54lw`$hDHWQd5A1>%ZzgC2Bes>e_r zy;%W7nGg3^s2B7YyY8G$bgE|i=%GKuR9G9sv`*h-k zTl!$2N?T4R%5~@;RDGQLD^DjvJW}hs^?)8!nj%HZ(}}c8n$1+Ph3{rl6;v8tiz#aOTO|a$-GmE!Uz0rosY}~hp~uS1N_e;YVyc119jL1!o+)miNipw z5)-!u6K@YD4g=9r^0fw_%+*dOqKzoXeKPQ;!GLif2Kbf1K$9Gik+Q%$Lp;WTgg}hi zIY|afJDg6;EgZx`3=omqLOd`*S|SiFC7%(Gl9cNiHS|2V5v2&1r5LcLr~T=~T+f)H zXNTd>n4zcB>BMJh%fMnkOnyXZ9}lgjA9!x4v(-SVNdkABQD^yLH#wd71#LpKA8)~> zhE<>mX*-)H$>53i_-o4W%@DtSAf}aN$&mW8V665xKVUp43#Yxk8k2<@o)K3Z7}KcL z+ycc%geKSzTpmaR7b?6okotk!18D{DV}aBUq=Cp&XW*v8nNC&!-=?JUbRwA-hGxG4 z?`c~y6#@x})y!gi(0xnLJqCQQl6Lbf;lF6H^MaLQKn&kaiMf;6F#zw-n^ZA&ORGfj z#leKNp9;E%fatEu;#HdF$_FjwgGMk1QC`>7 z>2%^@Y9xO6E;gyO7Y7IWfxiu;)xcA<+I&ec+NU_3i1Oo9su%Gx#UBrv20x*YD0(*V z{ef)&0xIooI<9vN-8IK_nh|8nHdN7TdIy z#QcIotNu8ysq{zS?1j}OnbLPolKHU`s~$=2S9Ml0Jt4f=ZbB#h!-oFtrvBlkp?~{i zu0MN#+)4j{p?`;|f56he!_ePmbHZDZ$A8e!zs=M?XzAZ(=+7E1{^#09(SDy+sjQrV zMBCT>XwV(2*?9EQUeOqeXj#(Cwwi8^1y$5+$x0^b&z2=s`z>tzr-(@gmZRiB6 zf1vPJkp#qGUlRPN5UpY01))#K=|nOYM?T;NC3$h+dm|e`$4$>hRAY+e4+V3xu|=56 zAiP>xZVs&H0smP^exU&VOk@M1#9B`@Tq@r-_=76;o+v(gqo_Ds!$9}UvzeI%X%Yp4Vz*sW#qHv#5ewaIjG_C*7&aXoJ z_=BocLJT}jNxlVwFH)Ke4i9W3bA62wd~=is{P#mD6x^VB zs4;@q*BQxNUt>%o5c7E~hKU7kiJcE_B!gpe4*~pmjL(A`$)LSzF;QPDLi<4>asxmV ziuTQuWKb#n6^NpeuT^^c9C~q8b{Bz938t(7o)k#^z!wM78Xz{xtqc$wMLh6*q2LPO z30hIIiwvZ)ee?#Kt7fdf!JFyl8e@7BL-H7w48WyAI5SY#&aLW@Zl?=QpSOMYR8p!K2HrlEI6eGupLv(y(jmq+wU5(}}-G zW&l5X&}2>ujbY#_g)|)*c7QY;UlNR8#%iJ-5+9^OC8N}b1&jd_+f9>XRt2k80AHx2 z@^m5@OqNk-V`hCnmfjMi^#d_}iqnZlYE}F|Q<*z~%R-|cr+-i_vTIMHe`(+v0mde8 ztu4zob&RUJJE$E6el7IWRk_+#sEsuXjG3c)4=DUQ;pYLkg#`GA}ulmo%ozv$UOV)YN>K|BQ^uxPKW_ zrgJoHS3y;a*z}mHAALtt86tomKaeiA2KZ$q`8B{uliY)WaRm6!I%aoR)S&qrLGv&W z!CuX#=8)00g z2|UWsdBfJrxAeh48=0ew?`hh8hW$u3yY|zH9t;}#fixJ2=yoHb&V48oH;{|VmIRge|B{s*%*zfMrsS3D zS7W)j>6-F@8q%lHleN`l+RR_0sj&j|PVA>87y)ICL`OM4lr*+|og2|$Z_-rGI-Y*8 zoPkU`1oSFot^cMnWM)f?8<2Z+a_0f@)K1;qId3)?&vx%UIP_d~h&1G)D@x%UHje`)Z32#CMl z`+?y7mcTdw{IZfNMsmbPHc5cQMm8FO#74M)F-*q2P9C6&l80$957X*AOoMrtR_9?F zBurNY?^grsVHyl!dTC%B1QHk@rokpTVj}|*kl4tO03NFnCdYZ4Kcw#nN@-KS4kv?i^2%R+ltZfuO#8*g<*6Y1J+F%3nozu zg&PCbHH~GvAa%{FRLd2iuE){x#z+G0P*RuMaCwu=y94o($tIb9QevzIUT#QC#n;i{DuX<~AIhT|(Wz9C1WV%<%-mJQA4m$gR^yogfL7OcU z43sOEcWSlFoTO6Kz*nn2X|)?-tGz^8EmvNv9MWoQ9BVtZ+DA}0qOr5!E*q^bP<&pnApf z>n6w`(5o59M$^(Nm9#EM90XEWB>w&Sn(ryhB#a^fGi0?1>ShS_IFRs)#z%t>520QKB)pytOnjwAfHBmo@=&kJLp`2{ zdQ~3k@jTS4@=%ZGpuZUlzJK0{)kAu;@vWvgUEqBA5qLt?9-GKaJk>Uq22 zMVMiY!8tjM@i90jH*>`&+kn$Sep0<1p|?bv`nL z!SC`C2fAb_kW8!>`Czb)g`d~1S2EJkXvrlJe@P`8{;#Wg7*u8C-|~mShzTnN*_Q&c zQm8E&VwJ825-icYYk~}p3UTuU9x_^$L^6z5WpOf$SS2SJVp4Jv42GzZNQObGEKX)u z4BM^=GK5c>D6kgEUD-sfk(A&OHWPD!hqb^|<77bgFzsrY)`dK|~+G5|Q<+A4M7LGvm(pRIjtZCHW~0q+f@ z;pd)Nnf_}{#pGjjH9~7Er5Ua4e4YK6`J~}JL!YiN%Zap`bn+vtLegl3B!+YM0?1ll zR`Wpm=d_povnngXlkeTLfPq6S08(obwRPYv5HcaeFnIUX-Fk?nN zSHl--lVl>3z71R(`q~;GW1cA58U{e7i6i6GF>lc({)**KUA+Ikwfs?s7jFN3!sJ2- z9$S{4M!{>BSLPEYX;wfcq9yY4-qVl-JAG!_CeVr)*r#2P0u26T9Ldl-r!9>FwQ+50 zXcJ5jr3x~1*=ehwK&^#s%?3R`#Q8s;f}PvFmPPj{%_VdAaxb4Fq^vAoTThB^@303U7Zao>MRFMd*O{GBkXIYfS_Fp>BmP9g(pB0<~UazE*kIa?frgaFo zF_8L!v-&G(Wl=KERHDqp!0mNDGVcj|LqJ-hF^RVh4smfA>zsOKi=fNRe5gt0oRfm3 zJ14%RnRmxJ+&RJ8h&mLXc1{?zxYO$QJ43Vmx~_f7;w*&j3k#wl;D0?M7_@o4QI9*r zpg~+qiDZbZ5I3(ULl{d=GOU?OPBI6_ZPJ|+tfp8>m7HX#l2T?2c7=M&guyEI?Y^bq zUM;TNg-BD6LWP(Lo$Xj8F$HwHXFPSW!RG=e_olVmR0@mX*X83!ajA}B+rwCvJp(Qb zrffGQXR^*CSzJ%cJaWZrGpn-mMAGyF+nbfW&*>AlCY0!w)^v=rpJUJi`)&%Lc+`@a zSDJ4Ws4LyV z^2ucr^1@)Gj#e>_xvGXcF|*ngk5UoQ>ftCvQE`Yeks2GW4ada}lBS*%PgG5l!Lvtb z>w6DfNXbqmkcF>oA}#Vhg$u|YxNrfv zU-!0x8MlNjt-`4TUzH&I%@F>u9nOBYY$5@fzQl-5Ti>%ns8<0AuP+HEzM=p~d?gk@ z;wxN0;wxN0;wxN0;wxN0;wxOh_l0G|pT>50RdH0y)3sXWl;+58= zh}U1L^f!iT%{sYPl&a|wH76Xqb3oX}ecCZGpR2I&GP|SDF^fF7ob`PREShE1lJB z3xT^AhKItP1Ei9kT<(V~pI=ps-;`fIzqX4~k!yq_%WW0ET`5P1POG#rB0L;fX$3wU zS!s1X99e1QJ{(zTRX-eAE%n@zsTSMR^NHccbpW_BkVb%$fi!Tv!cPX$2=G27&2sBp z@1#4pZ|RaIx3t_A?IpjK+Pla7PrL0Wr!OuUxbV}HD=TF<0@4P}gCA+zm9M?!_W%u- zvdIl_OEe_Yn=$QCH!@p_b@w8a)DT*9G2D^P(4LgZGg-@VFk_9YgS7s{{RPdu28XFZ zb|vKK7x4X|28XGH81Zb{i6eQcTD;E{52Er)JV`<;*ZcIPBF(-xH7%`dMn74&pn|>h6 z)KVS;&}@BVQWDt}I6G{iw z)E1*R#x@es;i~8HL0>%ho03SC;CV@mo>izwx(xoZYb8~Yx+Wxicv5VlG(8sM!j+mTBn-VJRLlU)i6?Nv zm0B*O)b7M=xs2sc)BQHt*2^s)#`4Dn%ZGEzhjYt^vHab^@?jtz_^)W*u+1MvfD(Pm zb|;NpN80#uZELrNHn%eOWMyvl%G~Vi&au4?!7*Fe_oepV$+pSH`?Gve< zk~7s*5~r(6?nGT0G*3%4d0MK-)6%~VKHX*cbeHART@$G)@hLxb*iM(-qEnBAE7fAO zHSgaAI_q4esm%Jo+Ay}wJk80B^~zB89AK^NcB5>{Cbtt=u)8pg)HsV?I3#@|*kCmG zoXKdfDbrr=YPWRp4Nh*z8?)psglvfwmEWSur6zY|-u7lT&XhCg@`A)w^6o_H^^Csi zWE#eh%9|m;n^f6>iG7zkeOuy6Id=}zPGvqQVXnPg;n`vPn6fWy&%VChne~~aFMs-0 zVj;eEsEvlBSSu8AC&< zCe-d=Vm}b8TMMKP$WJ}1VEBza96qJ+6J;fph6((+UOLq9Y+ZaU!nZeAf8C+T`qm<_ z&QLcGGqlu-T+yzXRw4bLW;6EUy;Vc*VqGi5HADV7Spm~FWj1z}3xg?Z(K*vz?#ihK zOq9PwmCJycPc44i0mhq@v3lFgkC;$iuU9&BU)rp5+?J8bd;@&B$~iExJ`ATlQz{B5hez0HmZSuogxKXA1Hz+=cz5#$ZqsNV+`OkS~l3 zrg3k7{V$g^jed^u(^Yw!g%NC*C|ifV>=#C`lZw=x>&c9&jI?Wpek{Dbhh{VE%pmn) z3z&u%T?N(guJ+YpF=f?~GgS);X;r;fvl7e~6nU|kvec{AA6aZ%@hY`4T5CK3s%}+o zQdUxFl)#(yQnfH>wXimFULgY^tZ(R0q_&puMPPli7Fkp-3|h6c47k2fy@h*R4W0j^ z493`wb;IV~MPWZL8wFgEGiA-Kj8|YhOQp%W()BL7O7D-LJ}2lJ1){#SKw1fwCE0yp zkHg$y)ze|r=q-;CQ-D;~tiV+&$2&>#x46XLb_h9`MVI4VIb)YIS_ur0gH+z zgssZ!e>F&+-;>=LMF9U*N#%!&$^1MLH#W)4(``)Q+|VR*Y$RUOB=dwwyt+x|*>M*X zxLQf&ZyO!mB>Q|N&+%^@^vwt12j3{#+jZ zF~UzOH4kirm|WS{BonJ?jB0v!i18Tk^RZ~rB=bNdHkxGSsB2yB%C07vBO|f9N#>c6 z*wZ9KgrsVR*( z%a%0BeoM*nycvjFrFA&g8|q(7CbO3k<(aM!<-;%#sDx5P8iRL`NrW3;5dp}N8?T-1{_s&1)ps`uw=La#i#U+*57 z|1m##Xdji72CY(ExHqe0_C|ao-KDgSpl!?@Ms@iZ|jN!>774GpG;P~J%TaZ{x^9gP5YDoM^EZ)lPs3^fs{r#_#`kZ~%NFgqBrs4MH-&hfYug>9Y{ zMdbr(?(>2tL%>%DPvmU|GXD_x27$K)zNilVBoWoxNYV_tJG`ZtLy=Jp-Q6TB{fhq6J22G#7C|@6%nYq&p+sl=$!@XqnXpRD;bHcN{>KH%t*Q&sS6I11EKzQEccYfg`NQ*k~ zw|%DJAHDrIDMsxy0@zjHN(Lr|-L;(NhaNEj7T?QvIHms`s??uYKgj*t@K^ z_wJfV^_QHf0VOfDpd_|8!Cx`zVRLvD^kn_Ef(-0HUa=6-@zubFJ|z)8AZ@hdGmPE5 z-Y|A^b|S(Rb55=tsCA9hBa10(dO4Hqf^U}ltn%E(iL8~UBRgBt_c*LvqSkhp9Q;Nj z>>*922I$ACxI+w6uVCG=-q@t>3o8BqBBtS#bEj%sc}HwBSuEY3=|x&mo7Llhvb`|K z8Us>N+SRsfmG0bFrXagjDY`I~)LOR`Nc#I=LpF>S22$YwG*QQfI5UWUn8l~zOjki*KHa|3ET*i| zx*U>d&U@=&&9EM~9+*)G^&OWQx2ugX8>d!X@sG+xYP?s~a9r#pN&4a$I!dpIqcyNL zT5rn7V3)EP9mctpDi&GBs;IDR$VQ3ce3kT9!O*PhIfE&yMUfoXE>Kx>%HtC22oUSyX_5kMb2axo-*wztJ&T~n~F9kTrH{D>prgdVrHKa4!`H}Wo0Clfe-jqz2r|Z zO!U@H1^9&!7r&uQ`;|;B5B06}l7Bq$$jV20teM>Nawr_oPoq31d>C~IcupV<0@o|4 zdT6jLpOw7K=PA=wq5K$-`?qp^QR=V#BO5bX;~{2gkdwclVcWlbcP)NoHUwrJj=dZNC(BNgvcCQ_qSG#nQ@O8U4; z`ayg5T#++n?&VBVj;Og*V?_O2W}gv`FDnzNxs2pu^fZ^`Zqm2-KA@>l+s_z%BtHR13=bif~+AR;%Am4+e^c7v7@9PsiYniVD*P0XUYQPGNvhqhg@p*WJMmu zXZB^DR%hQIR7O%cU;+G%UaA&c{!o#=h2oD#a`7Q$G8SCzPEkIx@{t~ECih$`{aL!r zcCDt;9DpwiqyZo=^7i^~;q@+?&kNYRq1$kmZb)0xj9&Rmv^`Hn`_H-5KVAU+YP~*J zuAjK1&cPLo^c>4uIJkn%bLHV)D+gEbM(VBfrni+Xbx!s{HY6;muX7SVvBg{Yj47>b z0&LUy-&k zk;|kFcic3DnI`bIj%~Ol|{$S;&VQiz9Lx-etpM8J!+#+W) zqLedrZ=4~^dwSebt#A!|2w$??2o)|jl4V%+wLv}{RCYs4z;pPi>w} ztnAz*{)(Erg6`*pmDv!GbE_rabj*?JNUbqy$T_}ovRoHK)@smT$^u&1gtSE}t-3?H zM(>cI9u{D5B=QECsVEF^(P=%woJMjctlb4{eyV5FIEN{lHJsqw(4;kejIlH)5tF9}^Wi;Xjwve;BD9BCJ*w5k_uze~#F;(k z^~ywQ_8cyDkR)gA9UmL3eNB%qhQ$xB85?<3v*zn&ND=QRpSYyS*WAw4^Y=Y+#8${; z`N*4c^QAKMDLL&ph5Jht$5+wp^>xN(ye80-G09Qd_zl3U`nr11O=<}3av1h1HPl$M zTTI#4|9WO1iPU&xK4TUaNlkUm@m;y0XcZx+s;6CYC@+~=-`j^qQp5Vb*<2(wZ19iO z3dhIo*lLh1x%7rzNPM5}KK)Lev2kaMlU1Dgn*_PQZ2P>sx4ReXNK0{)B{f!iy)%1f zQiinVMl6|kzFt0HNosZkm$4bu(48^)1N>|jW&NPhjY?8OrVq1oY-jO10TP1zTYS^` ziK9}Q@y{K4|F%GXZ9v)&@UN8A<*w*$&eGBHQDM;T2Og#*;p=IVVWlpg4_w#e)wGYt z!oYv27bf#9C3d^Dce*Ay9Pf752$kO?Sf-zq6vKh1gx@X@gUGyGiQVpsJLhIqA|0f| zYoagFAiY;psVX2x2L?&B)cVw0KQd8a<*);N#?_mxUos* zOOd#tN#^^JcukYck0bHwCYd5cZwR=jlDw5mk8YBkr{wCL(24L)DD?gHy5B0wzYUoU zZ)Lz`Tx$7~_L+xzkWfEM9gs-_I1qeV*ViQT%E$+NbL1!QFk+*Dt98!uhB}YL2$A5&Iphgq9_sA*gI{x1!Ug&F zaIODqp?|Zsa=&p(izk(p6h=@7o(+7N#zfeFG=9$prkM*HkV=tm45Z!5xY7unfO--> zAYDQDxVywS?-0K3&{e2S;RDiP%JGa06)b!KYQ+g(Z4>aYAu@GLaHR!vryckP1R^mBS;z+2lbAV%^U0*%fB-4z1 zxw+YXg@5z)2DRbu!k9U@Muq%&5SBN6X@`_}O(;1+i3_x(|22}fZ@xMj@OBl@EBm=u z%A2p`ZwrETo~d;`fn0vOven*uh4ilW5_q|S8M_%K)|Jem%#E@!#mq>32#JY}I2+qn z?RAXjI>vJyBHc*h?#OJn9Y8&g%DmTK~}RFSn& z*}_8U1)#Z6`xHPp@>?6_P`G!CeIIiJLYf|Pg^ouD zw0hd|^(%N#p1vm3!kpUPXM}Y+$_UMFD#I^|cLdw>^*wh;qx!DBZ45qw|XH3&-!KnX9j1utIN|Mt8(tfYzhwM@p zdK@w+(4k_a1qVARmbPE$L}Yg-fxckS!5-O+~I3{us&IfENU&1yg^c~G4e%2wR8GE#a8UZWwS62M#=LJpY08w6N&s&&t*l~Uk(GPr~lH}p83_*+9o)Sj{ z{2fN18NnUwdrWj^s`X`GF!o^;o`#uS1sZM$VaX;2iz%zaoXLI&dWGtV`i$A?uat?@ zXnhUG#SW4hj$5bah9^gvdlpmXUe0808RTr%4S&v6-oU4=HnQ=f%hEtM%dJV`Mzp0n<^z_x_VWsfCRo^I;2!@y%>69BpuydSE<6>?)8j*1o1JrmUvA9Fl1A z`^c&!X->w1CNp5Bds8vVAwd1WcLdS^ zkmuqJ`2=fP@A35lWL~cV(w7UM-=f#^mkYRpDf!C!eGkI>EujSkFvO)mW9L>Z_2FFd%kFzEN}wbTa?}J zR9Ab;P@-G9mW=}Z?KFB|-%SA&k6JP_qdt!w_w*|NZB6Ag62Gqgo>QtzLRxcb1^Kx< zA@LJzcb*=&fP4^5nvHyq+kbFjev=<2IWW8uJpklOUv>6MX8hML9-TWOGj=>Tc04yW zZ$NFtt;)r%%Ee{7cD8lWzPC@L0!v~lvLu!!)&8-C`rC$7rl+MMt=kJ*qA0)1GV`v9 zRA$Lpv#^A=&}lcLRGf1!e0oKDwWh{;$rYFC#p?r8R>u}oR&zPiw6-l#|Kgy&ANV&) z+N<0%xJ15peR#W<%bi2c)mo@eR-4O~Y>?lff`Yi2vb7{X>gO+|A*;6K5k zU#gnY&F`zY3-iylU_$wVK>Vwbxl zKl1I%F4Hov4Q2a*lwIVWeaXh^bK?t++1Gz=eEC_6%MXq(EF%Dz_wH-=TYc)KI> zwl}a{q--6!kN-@2a;|y$AYw71y!%_#^G*P+^kHb=A&mWz9m#pwsiH*U8GB{k83Jj5qQ6ny4@uo zn#`i&3vX18Pldw$KngE*XG`hbAA_z{k;t*ekzhP_nBxeNZVg5n<4DewwbVk^-LT!L zveL)v(9t!Gkp_{kP?6@i+UsC@qq0pg(zsB7g6UWT9g~ws+F|bX6E!?b5XEzpf-X>OR>d6L&bWhZC;&kd}bi?6x^mRyE#U*gl~$=ef1n&+BmQtI9Lq zT_r24>HoYAI-f1^|$tpN!_$!D1p1Hty4R0xo$*0<(TTaEg2#l>1J{}6TuvpTSt{y*~G z1>CNyD)gUg?{jv}Nt-_ClQeD9CgCAeNK0uc6el4hG1nTuIoF9m-L=Mv+s`St;g{{f?n|<^03v?4KvLb(0Da+{WsP+rF;`_?364iLFYS$fIJ_V%pIIA+)#6VXS2q(pW{Y;Xz1rYJW1xg>rJPQ9^VzK~u zXOX?b%6{_`q+^r>UR);~3$zjVW|WT9~<6CqRT=PTS~+lDBI+`=q8F znNR`GKB=)naJvh8WF~!=mN;6e+{vFMGX9R7A^R8Q>3v&~YiMd)n z@B5;$$8r64l!(;5<>g`)=WvRXn$PQE)>G2G@dDt}6xEXl5?6;+1M)mwa;h`)%S5)T z3*994v?O*bVslBe*DHRH9fdDVCAZm<&ZhcU$CN!@%TCMWUEW(Idtzd_84&%HGBPQC zS|)34>ou%UqJ<>DY&VJxAtb_6m9Qu8lU^-Pj>xZ03^oG76VgIG@pUQvxUl~Euy*~b z*}H4zYwgam5U?NDo?4dCZ_ceWtC&?POARd#vv*$|)~?O))7hW&n*3&HN zJNK&+z=p`idF_#_&T1TUtELjXfM=iGT#_3oz;IE6lF9d1`wi&*hv}OW(|N#8C#Ks0 zpZ{RwTmg8EqNc((s`&vqq*vhzPihFreS4C-0dVD-rif_1w@(I!QOpKYW3d1nKb$yj z1f;NVe9e-tkI!K<98g2(yKTkShBMKn#s+fuFB+Bf}KnD-;#UfUkI9BU3tdz$=rx7ID)X9s<=O;L<}u zZ3TSEIiMB+&-+18TLE8?P>X#9Pd_hF0p6TYi-2c7GEo6upr~jOFje6URZaOr|G!aP zeRp#8A|UP+iKhbZO|IS!h*_`8>g~At zl;r9~K-?QG0{&no1N>;NkyC+R{wOML5%8B36}bWDigQNs$l)bgEqF}|ABWqBs))l@ z7)G35=?=#khvSUHG45S(eh$ara10K|G2Gs!mb>dSO*t$0;?%EY=UhCnf}M?QNfo%# z&&h2mAkp9IXsMVgTwdBNs8X_^lAHt}@V0ER9SACUL@n+4^Q=St~Q{WkcLJi z*GTLo6>r2}{s3r`?{p-^C(IN?bwFkcRY;SDT%}h4;w+JTTb~Su3UXf`3+b(DBpLdv zx;PnnteTPxKB*}Q6}qSzNrq0UE>323cH3=zGPqAd6tLyV+stH3J=yXb)3)(5I4WE; z`fBnAm0Ke*s3m^fTrbw(lXXRg2Iswv;B^NqhwQ;{ngQ{@y2?I*uf(O>6Cn)%7Z3DPT!U~XqXq~M6PrwOs+RVf%l)e1K1)Y)L zrhYjROw5hu-0IhEN-@CzQCAfin(V|PDA0;9yHhfDaq$;Z;1CWkvS=Q)x@7j|?(UZU z1obY3Z|R@=1GO^Y-I~@&$MLuH9sk|p`R|s#;|9BhGK!_A|A1*$b2O{J%|_jsjQX4+ zWvKf%gKn6n_?D#()QQGrPkLxBH!+fh;wO72Ztx2Y5s#l3glKB7JBOzO+b zl5JI4BD0!eiTrooN>-iVEEQDWHCmaSIuiPcY+9AiudF3ZGRuAE4LONCy)>6F;}}pp zJI|=ujn!H)Vr)=u(Ko<9pCl{*?o(7ZEL~^fqN*qfnX}C95!pHu)!@}vk!7aFZY^+IKlwVrRYso`q35|KI!uARWeF`PPvb&0r1CH;e@;zU5^ zO|r&!FD!jOFWo*Z0y6Q90)XjaWhEDo8Lc=0kdafU0GYN56(IeKPysSD3Kbv&q)-8} z1};>9+^T@5hOU23@triEG>tq8D#c8TmSd%IUguJ;UqhwvuKlHq}Emsl&AD(%q3R)0SlT zxukVJXh>t<-~7t@6Z2OOYz@v+gRDx(H!T3~pK5TPO2{5J!%i2;p%g9FTfrL<{AVe2 zHUSbRqKg%5?lT&>+47`^0np;NlE^v0Hz=wnHG7@xEh3MWGEx%QmnXN(0e)Cf@{O6D zgQGQ2SEqp8fE5I;aHH@0jPBB?i?SN?sB|B{0q_awet&7_;9Pym!Tr26fNkeC<~~Ey znx9>bnPWBPb!jz5RAx2isJ!$7$TYR)M+fv%>0y)w%VX^}>d<>E_Syj&F!waeRo zrzx`rbD}!=4axtTtbLm><;iLKx2e>{X^kdS1hH4;{6dm92iRKB*|$VZGOw+dHOk?r zMl!Cj!d4@xL#DDdl2HQ#Ya~^Ni8Yc{GZt)WBvpdtHL|p^Dw+)TvT7w&QJN+wZ20x` zI4*@A76?_Ts-RG`n<{1l;lvX-p(-^ORH=8NcB`gdtBY^4tYeFQX%SaSinvlx#Ff8Mazv?vo=pcm zn-2C%QFZZ2W%&_ZS|n7Z6erfA%)ii4=Wo* zwIOf4s6&2AQ+FNC5}EL_oKA=zLg}r)aew~Yh&}zJ8R6i+U6nXm`p{Hr0QQ+l#W_H< z9xhN;TnLvME6po99KpUpNl7Iz0q6D7S&n5p^7*te-XPsNrpVH85lDYRi#))Q(kh}a z9oQEZ8khcO(;0oS-dSY};R9yQu%)c)s)8uwiNz#DCZa8;3C>AI_-9p9=`iik5|_bX6rY*-4+#n|vt_POL9Kdr$(@E`EXnS@zm`z-dn85^AbStXk zg!G1tsTPmOREs5QCKM7?@*N!xR5Qzhw%Dvp^+uhDR()Nanzdbs@jdjbn%kmpDk-T1 zCE&m7rDkFTqMBAqynabe;dH6h_&x zb;IJ``*o4enZL@Bc6u=rnQ*K9l?dOY1!P_sdTU;!-)RB+M@iOZKsXNhJDrZcu(Hxsf0aBT>0{&0s(VP*WmZUBtPF116gwxwLC(4mya=e}U9tuO$1itB3 zm~>aFFsCoFL?$@u1^>kDqsnb6^yRE7a(|m-EC3?5AuNNzs^_0o^$BGRH)k*m)u)w+ z)IGG3i(@&7nq$7o{ve(3Jx^0vbh$!BvmPU;FDdF@G!+ye>9Ww5+n+Vn0K~VIcDlYW zAbaZhjo*X?;3E|!UnK3^%gD}v%=0s{J0SCljGP*fd1FRS56Ivl5!4%y!8L+h zW=1mcP5raJ*oNWR#%kqUI4_b zT00DTc8Vuanam3mDbIBG$a2rB0SGFgW>Gq#Mz&P1!T1UDi&YmCk#N37CG<6Q`nFh{ z68VwpHcDKtCF2d%$WNG8RPVg1(35BPOY#YG^7zDArft;UrUe%@ZGFTX)Q{^WsbE0Z zt`l+1Nw$|f?0)ey?e+Cp+Ux4Gw7+)u2_wIYCBkKjI<3ncJWq*1x>|7$O-mtL02dV{ zO>Fmo%yTncZBhGQ^(egvu{+bUL}oCJOd)%c^7Iav;o4TEi61_c&7|vBO?b)-GP1sA zsuilo7^9qp!5>i~Qs=2^CvY)~Gn}gM3(6@!cr+6dkI4AY5=n#F-*4Afge{r>)TdNS znAu|@csK;{FR3lFve8*%6Vxm9lI*7gJXK#1kbTIz24rwUi$!Td%$GcbZOP%Nq{N!8 z9Wladjo;@zK^b?e7WngI$tJ*WDN3Alpiic!=1JcGxFT7+^M(PLV-iZ>8-)#OTJWKU10&n@(zv`ao%cR&s^Yf+R&#t+`* z@}<2;%l&q~S{ich}4-zbpjX1aLNZc&?ViJtt~eL$s~bYKRm)0RJrFzQ0zWubB{B- z7$?|yg<;VOPA?}gqm@1GR>XM_lw^eX5eo%6H_ zkXI~(b$&JQ>AJO0rgMPAXieuRyKl)+cAx2X8N@g^NuBFky;M+)uQ(TiwTSh z;kPtaj!!$~%w!;h-%}!@NY;al!v%4xlD#j*-xfehN?hG+X6Yfk-3TzZDpeO%Nu9fp zs)E!1PCA$Y$RjdwXNe}*EfkXYzgO{M@17+x=+q6@+BteJIpJ$sc1$qFnF^MYmca=A zpOsy?PiJf(&L;LpSbPFwx)qN3!4!n1(mWzlY25%P!ufdJteNKHb_b5-Ja(#ajOv(m zHM>?rb(#{9I`36=0vE?|l2-M*+DpGJ_tt=|-g=MigF{K?G?)c2h#ym z?@>6<=;y86t)VT~`;+#S^i9ywpAuZFVAlUn_`m7&)dw zx)oJ>hCYt==Fkq2jlk+(wE{Ay4L0CsR1B#TQJuiWv7FW`rzekAJXDs*QM@EtA+y=u znmyIXc~V)xF(OotF#0*}h-)qvC?TnIe1I3}rMQbBetPbLmAZ!^PK3DlSS32CCK`IE z@6DIu8*#f>Zp*8}3Oi|54gY)dD6nXx+68&u|zXg!{ zw|ah2%WwUYg&8gJ-Bi+a#U7D~C#llJ3(=;lb zXd=h$D=m=;5zDC)&Nmevs^e8omS-DMb&3*^I-OA`aB(cBb;{{SN1GQaOJvNmM2GBA zE!X*0<5X|2H~Km5xIl?W-DxBjv!#|(_@=(kv@#u}WIBZ45LtH^qGrR-(?*RiVlJ|e zNwVhwk5|-8*!jRw-wvTTs*mdgTGFPJb+hkB^&4uiP@qJ!@28|3J9$DkSlx%h5QVm5 z+|a4;)y2u>rn)^MQ{8bJ0K6WScx?iN{cPPcE`P#|9mlK~?;|{Ns*iGqrSmeNOhc52 zR30LiEvpl_IF{4Xl+&}4QN}@`vP8x~mgtb(gXLo z$H~LJVG6EbjnrFhO>da2G)~q*b`>P0t;ZC0qD$2B(nD%FOfgc+VKP_CVUkkID!f7c zOYO(A6k>gvIY(z1B&7bi5Qfa#kY<@VolnoOI;s^UM#0%*P>j@7(2{k6J>J4nISQ^Y z5?2h>u2He-5!R%xik2*H^fPs5m^ms=8=|OUZb%MS+7;;t6}e2>3Fl70%vBK&$cJVS~AB=mPmN{UqQ9!32e1zB$#)-T$JsQQq~L=y1jdTI1$7NK~RQZ~0zYVr=AcwQaqdpx@i z9hdRGhr$qrwxeCssi>28r|L4H;Srh8h<8%(`oqL)0TA}_O$qs|WAU>RystHe>JOAL z+}t-M-mXNX&I6xL;Nmz=fm47!o0_WeO>l^eZyIai_7}>nX$3d%z(=v~O|ljM5kFj@ zaG_)o0KK#AecBL>8Pb{?uy?9Lq~deH_v@vm-KZt0HN@L1C_bT-O}i;6$F`gAp)f?D z?HJ#5D!kmiu&D`W#^Vv0;D`+eUf;=;4+wkN(I3AST-Lf3;V(aYQ#r%VZ8`s@M5J!Z z;o=xhQ=%n@jkQkGhv-= zkvfmemo4WasVgo7&XxNgSu0#lRZm=UlPzhq@68~Q)X{$CC@zvZI>hm~3LI|7QiCkX zl{f5y;(WR%u5Y~QEZq6*WESUslfW`G%jZ+QsUF&q*6b)t>df|fv%Oi$khaXoC2iyD zaeyVM+Yo{wbE;v=5XBArEEbt|(3wIcslzk6IRuuo_)dVhV83?3oX{^QdlsK@a#Nl5 z|LJ-<;huDG;T+&Urh^Nw>kXc(z2ys2r#%PwGJ4x^-SmJAGj%yWaL0gG)7GWYV-D~K z6xEG|$^4Kar^3~@hXFYZp9(J)EC)BgNbn{MVKfMzQ{%7=hTq?5hXu7xB z;nFV+{UkiCt2a{bzn}cH5%5+;b;FLC0hzC4I>2dFPUxxunbR_|Ga$1*BfA4K|0N@* z24og9a(X}pZ-}7YfDEn?X&&7Vt!F`U}?8=J`XMb2TCaitpiie=XNf zYm~=@QzD*JW>P3Y9YiwVk0;k}1|;|+88Bfk+yJQ*X~uxWy)@%aY6R4i&;imEgsz*~ z1yv_>fV2*wn@UZE+7voK8cf}NkfDNw4v+>TbiDx?>RjjmbM;@hY(OSg;he3)&1FQ? zuf}R6<~Blv#EzzZF&4xZwZDo@SYC`Jn=5e}mH3CL!nOgvT~X3=?;eo3JJVTp&3Z+A z^Yv@0!@p=MQ@wX9lRr(&Z0L*Sl=x06xj>1((30_UCL`Z`4FvFv269ivGPz-GN*}2skEo0HjShO-0 ztqgOgHcE!f%=Y(7DK)Z`QzJ`BHPVFl2%p8p#!^(om69T^6yz;bj#$E_sMCq{-o!3fyrh~w^K=_^{1O#x4taMmbfEE)+uTkfPg-@v|*(5W2 z4AqyEh}2yunDY@bWdGA>vZ^ z_yWN_5r%6HQy8KsKE_c|Q&tRE4v>KpFwdU0mo~}El{#n4MD}JhJjM{&0U&7rN72BD ztI+A$X_9MW+##|tZips|V8m}o;^zRjDoS<>Nc`^PLw2PJ(*Yh77*jD4!AVbwmGKK6 zj~wnGFq0HIat;%i)D4JvUGkx+LXXH)p(Q#-4t-gl+MwO!)J#y3|H~?WR)z-c!a=<< zskQ+SZCli3)rPQB%R%hyL2e#|h45dMlvJiWfWN4h;u$tAb6RhK#K&P!{hCsrHIh1= z#s}%EwaA*`BE=gdW1c@}_0i({Rabn9$!?9jP1l+}rm1sJ7%EF-BC-yMMEFkSwme+> zfuK)j!Tm{+v<(p9ZE_o7A)v>55{o&&_bEyq?n)Q5X5=n$SU^9f2U?cQLBIQFa}G7X zoJq{dwlT5^l+RU9HyhnAE75cCd}ljS+1)jui`sS|yjz{N3~I)PiKKYMr+ z6HbVFM8-Tz*vMznD}u zvFs6<%CWHZ6KVq>&&4~TzpK^lQoK|~Zjywjg6L&AqiO8-^i zL+URSkRx$-+2*y3%cSmu`;H;=Uj%>&sdH1;Gpr8rA^^NdT?J>4;WDZJA^=xO9R*hy zR)>5MfDj~gRjhhkCiPzg;3}!3;Sk>jOlDx7CdS+8BV<7F zEXAlftoF~VqK{8sT;IUg)ld3?hEz5vy<0&(cPA)5!S;Z3*3kw)4n&i%*(YIBf3A=Z zlk7Y%F$LtLuQvIxlI#fhHKXjJRd&%TYXhj}Z`p0P?6zBWX4S5F)LpWZ_}>> zWsRK7H!!L+6A5+J3Pei)TjhwwhFJZ9YAU6v>@Q~Ni8%Zv(59? z?UMH-z`$-+mX>O$e+=_FW2ty>#1AZ3`n=w4cFK$-?8kgw9I!?**QSUt_e@O=7#3D@zoDI zF&;O5$y3(W2ad0;4;=r>-6z#>cscxJH@{o4zssWdX@pwe` zFv+>A23$m|^OWe&&45SD!ldog2uBrB5CN^{$Dok;;0YSts9XK;6|H%gIh(sf_3uhV z>OOkr;<8jhX6hP^d%s>@m%e_x8Sqj?O@(XTwcB_l7XFkLJ|`8P1ElcUaG8`o{66T@ z${IdiKa!M354RtI)AFRGiPWmHL?%*YT9e5BS+y%4uY*U{1U(Is|4CW8{c0~j)=?`C z(bI%ffP!UT10I!&=jUncjRQ3_%T)Mb_DfkA7~O}$uxkQGbp!SE*wL}!5t-Ns;cVrQ zIoak`tydya_h|qZFG@N&oSvx{Uy_JSP>0GAIf_d&PJ}*7&!SXe+mF8oD2 zzoA5=PXFHtTpY(KYAH`WzOHvI+!NL-IXc)Lqp8RMyjW4P)qVGXOkUwI4<|x(hL(WX zS#l`H_b;k2f;9?eMICXlg2$9Nw=^b0aWl~ueh+b>|TweaM6~C$9>t@YKDvqV5pGiwi zrkTZ+5LP@M&h&h;KKR8*u2@ogLbe=ld z5iH+Hg#hB!_R?Ibt5biW`hZqTFRc!mI`D{$yK9XTx6dfo;g{{fepRo^tQ!#V!v#t= z#5@XrJ~3GU{8E-0cY!=^)KHk2d`?Tu$Y(>EH5)MS8Z%DB+y;Ht27voYC+2 zm!{4n*7v0By<}mxqF&Az9UdN$36EwZgxd<`HZ3EeypB)y#3W=65V=ZOddbT6_N>e} zX4oAQ)$uBx)Ex`Ch+@vh7U|Emd2dP0+-X#n$at+bH*tHUa%=BuIZdwQ2u2ODs`ghrY+)pGKbAX6#2unX$$=-1=Gma5X+jyo*Cw1Ef7tzaU z8}aS)2WUHcw5A=IPyzpB#_cW*3e}~0^?91QlRryj{2e(%wxGPcZ!2;Qtxl0?Y90UO zEO8Q5oq69=j6II)w=}nsoYXv77fIfvsnikRn-$fQ2NG9@RRi)oU2>{3 z^UFl03B>h3#O_RDw<0!|G&_jm_t+`9Kb72OOFEnCW0g?$8ZA35lXrPEg5$cQz(xM z>#q-M*RPtryJo)D?ko!d`*H25Wf}eE+)A^GS*5bn(DE>Q_tjzT>Yc%(4#|bjR^z6_ zh1W~Ck;Qq={c4rUW+EHswMTA?54PlY{A`m-@B+Rhp|$~Dbyhw&qw65N6UA<^sz1_Nc(Yks& zu6|*1^&%kdjTQkv>E9 z4qIUuag7G$e~06Y!*RypsJcwRF*qE9!?9!~dGtG3+rGO#)0BfWJLl1nS!Ve$V{OMY0{9Z^a?kz>3;i%NP2;o&z9&>WT^WmCGTmasjQ1fd}ZK&R%si^!FouCkHH8&^9*6QfT z$R`43RyW)j<%HYiI^oByf@)~;|Lo4gbKnQk-0hxE`-wMN!{KQ_$07F)!}zY|nf=y+WP#lOJy?ep1~O^efDgy^a3vspo(Q@rb$|>L56xTN z@3&?Tze@JYpL}8~f6jxdaPkQQO5uVB)}<#X_;_vaxJkkakb!8Oto={G33A%Z#441% z{KN&Fk>I9&ITB3Fjpp3y*KSHN!2nTL6&afB#3CrriZHuVvROfiOGM3I6KRJRSu~GY zT{3s&?(UZU1obY3Z|T4C_(uMj_iNG`={WwDzT>}JJpajVNxcDUxj~T5kDmSqO|zP# zSzVOJt2>iXPg0~TwE(u7|D9g*zcZ=Y(&|oED-?Z&YV|9ciZsACWv%Y&lX*+l3b3Ws zU7l8Vd0N?L+LcVm2phB;mHxW+L;p)tsnFZ{WKKS+DJH$Z=?Z=$qX4IlhH4J*zvkH5 zyF`ZmO}IG`vv(A7vXpG`{vn*g7> zsxhvnBl9So)`(od$0pPq;Cpq5u8WdcekRVE2YimAYC1AYiEa}hk?0KK!<_@eX(Orm zPd&3l(3RE80h!Zu1|%9B=>Ip(^m82^=rcE>4r@xM77uvs{y+-b*XrD-F3v>gchZDt z6X3f}NnYQ#3mNoHnsOAwh)W#obWmo>vws^&?CDyexk zobvzXTUm5gxoyv!pYGN2%w3R#dS)uf%&visO7mQX0RQ#2*i4yDac|nXO{K6XzSs0> zRdt^BVb4i@*%hTC9?{~ViTrooN_m~&z4Nx!Xk~WlNa$CPJxj^+J8xjJS?)V;N63KU zS&C7!c@oNqajPmCeFOZ3s((--QfI-n6Sz2r)1e2&Z>uEMyTyrs%$sD5 z?_OB?{;PERvpR4Ck%8@iL;!z*3(8HZQ8=`2S5 z=kA5>L3R)WQb`xp>miq{YAPlkCUD8B)+$PaZXq68FRR4m%CiS$l^qGMvI38US6Q7$ z!mF&@BjHt6^^x!zRplWxlWpqx+o`MA0Jt*UxGn%bE}=F&Rl#3Ks0F~^QPlGIah~1b zj2Zce5Vy4479A^x`Skc;NhILHALvb#bVq>1ptDc86Ux|?b4BbufF+X~(b6?N!|Uj_ zl4dG4)k8L^!?fzs-H|TSmSp(3q;)@NNb~HVtUob-^}yEPJT=Iwgq)5KczvqDc`6}$ z+^l}*p1c$-)?2|F5xgcz*#tPU6j?BUr+b(8vuVR-S02$ z9K6yz?bz_n`!{y}nWi;AyBagcYRtc7 zMh;siclSk;!CqFaq$*0&1ceRXNjrj4=rI`=s!~-!q3APG#cUv)cmgL>rRIVv^)A$w z%V_>@DKh4*=JRO&g{1jBjV5b8Z#ADs^M2BN9uNy=q}ymt!vT|RGOLr$oShgCYQb}p zC0nf}Tdmq#t=i_!akLEQhIrA+ShO-0%eomQLjrJrzqF)AmU3!jDXB(IDogG}Ln$ia zN=Xq{3W~V$H^!!eo=pe)r6f`RV80YqBPW$5Ayb+ps8WugN-0jPMVSxOQRkwxA#fvL zs~fv{snjp#8L=))Ww!yg%I)HC(tnz*TYl()~I;J){fv|d?I>udxvqUDmET!sR7vcBo*fX(R#Q*tIibMuSKDE)^Oq*+VOX*l9Ebb0=`u*o#j}z zBcD$j;||0Tq_m3YO9%Fag~p}-*>px z#6qJWB_5H9XiGG~ImrnBVHGYNrX5=1vIB&dE8$GNIvPJN4`xxXjA_2aYzW+zk;-@j z_!Q-Hn!G;~-_4Ts*Us|0?_Qa@(|DdTLhFN&`p2dU&*Sq!3_+y$%V*+IU?*?WFAJh_%IrEm-is1H*EC7&_BEXv% zeaZ;f5*fCCRTuq9oz9@D;BU^a0*Vg?gf(XFVCYe!d$M`WtS5;YSFi7NSy4hO24WkFkP zR;GHRPDHCVs+L*Xg?1>`uucpvS5i_5O28}hQZq3a*09xc#t*bW`r~7YwB{1A2&B)_ zB5Uf2!LXE}4mTDmt!TQ=|5OU2?AW?taqpb8p0~9$U5>QV6~Ihn!mX)k2#->3GOrB1 zH80Zdw17P&$=VDE=ivgAXtJ#&nht1jqRJW5Yc$8EQh-$EtbnVOM{`DiT9UeqI8}uL z6Hag2oG3?*$?BkM3v zRc#iMPv!whm&u0k`a|s?HY@FPePKZMy37LbR~02+D%d?B^VW>KVL;}?8M$jf=BpX` z;sKd|&d8kuGRK_W_)shYJVQ}YOZiYc*#{}Q`B3|{=|k<{AEDRdQU1WJwR)S|)K}xBDBvrTKd!F^WNyjG&VbAZGO{}$ z^G_K$H6XKGozM-}PY=l8Awl*AWN?ijmzj}_535^WY{T$u<2G!BrA%mfRKRvlXO1hQ zWxX2EjG9QgRf9g(7!80_o+DZ5n~_eCOWOq`nq`i+XNe54A>077;$~)2f1$k9%+ZrH zwz2vfV2!K(35BPOY#YG z^7zDArft-JrxyHUOqCQJ+#d)3*gLIGLUZJUY4)Bi^B~5JifXsU{U2ReOU-j#H5n|_lD>y`pZ6?6* z`d#Je9WcYScPLH#n4oMXUB7C=Q)ZBn_1%W}lvb}XMmgsyzEO!tou{guz{M=iaH_%= zl~aE3XeJ~ck@2A=k_NTk?#VU+{ii;qTEfg86T!nFh`+41%*rX)8k?ZLu9sv33*dF> zZGoj-12VXw#UfQr3n+OA+mgdkNr^RGJ7R=?Gk!OlI$H7sJYLmZr>Rsq;EyFsv~r4J$<=C$cccbwt4 zqfMWjkO1t(p-yX-vsyJ^zL_IAF;JkY;Ix=3-?nCl$hKxf6t{-8*J@2jR{`PYr!aF@ znjw3Nl8w2Sj4M#`$!8@bEx#-beyh@*QK%|=1JdW^8 zz=7QgBX3maIAf$oWFo>6&89YGVj)yZDlUsPV^64lPKijJX;de0aSW$?kOM8~+u7Q3 zGmtodT|Yd+k3P})7!ylD@k%*M% zg*W4KVRwxz6=*1n-e$DZ-b84Uq{wOC+n{`{X{Wevo$|Cvi{0+bjr82Nd{Us>qnZp+3-8$tYG14dB13 zbZ0uMUdOy+$yub9gMGE=y})7uqvRZrlN#4uqp33)2;peGNED6OX>`1jJtXnk0!T@T ztDDU%J%sxk0p?bv>Y^&CqiR*bX?xPanUYu{6L*%=1iOVo5`VFZ7kl?CkwK?!xYo|m zd&vnKwCtE*j58ICAT5It{JgR&cN2{b#M#9D2#Zf(Ot-=@zcjkiJR(zR-2f-T`FNRZ z#m$;&K5lp5Sk7ao8qZf9v#w^>YN&Q95vlWDRVQ$994BdVB2$aPIgve3c^y-4m)Ie%($-ry2H=r( z$S2mBB}JT0Y&u}WV^!{$HrPCQ3aJQ1%XSDJl~)d%GSm#Ad4!5Dx2y~iLxirYi!CLI zSU+BBpNTd*5x=h$L^+HcQz6}os=Z-!1bRd^0;_GxA#-wC`E!(r)QPB0;NnThUOV-8y|p++Q|W90PfMtcfafc!d1!E+ z9hD-_bxL$mD!&Dg`?q?2QOj@rlZ6>Au{D)6U9m@G;z_DB@j|reYPo>0oAr{77KPP) zD-Y`?a96jYwsxtC-g<*WWJ1Jp>ID1pWvH%EIa!`1Jd6wvqJ*wquLR&g>qo3oBUsEDdcN)pXY^miGF4t3)UZkm0+rc5S?l45nhM%X6 z8egPaLiY2M?0LXz6g3leK5*2xLnw~w<2r$sv}Y>oX5WwMH`HLEK#6AGPf0m;@`P@% zx(|gR3T?-@p;O_j*Cv;n{@)`q)g8A1!0VS2uT6lkpRIew$(9At?O**#dU3#AdEy4C1sEN%9_ zA5cP4*o$M2t(#=NVCkG&ZlQs9n}gFqu}f@C`RfkXvsR^ zya|{&3a&5`R}9sz;ac?wYf@K5OBOf!nYuH~92KVxQB*NEB!?^QigbjETqf;=b0=Wt zst60xsA6t_hHI#J5q&nD_TY>+mdK7b(Wi;qcXXMt7;`{(lduhd$S+EiHI+qBz?q3p z2NVt}Xv~~sSt9N!@v5PfiSns=snN{6R(=9yJ3TfXlFEIyJu%jjIbO0v!pr{(sy$C& zt34yZ#7({Ia(d&hd=kN;Eop+uD=EtD@0Vq3WLYC#>Gto0EqbE0%ZkwnrthHrj5E|hP37e>@-z~RD2G2j$UfojarggL%h9$;sT{? z+D%D0w%vRWg&_)U$M~jGQ7g|#6=s6NBQn7e8xFj-Bwh=Eu$LYE@oT|lg<28*^26oI z8Fp^VSyUoYx8-ng45#=-77iP0ou>B1^JRM~MVnm@lbWX@{>(}qa4(&jS&P4#uBkxl9_?FJOvm|rd^ zt?-C8l|<9a;6&;?GGDfwi=@siLfkONxpF6Dt#CP2J#ooRwxrR%H-kh{NBfzhxJc^g z5Xa*xaJU^y4YDLx-mnXb^XYykZ6-5O>$8(tocm1z%g`*JPxYpHXh&MJqb#X2+w0Bt zW+_A3G9#BXW`rIGSdzL8!IC-EFlBhf4g4$?nRd{bLL{lfGrBp*doy(s_)dVhz@Ei7 z$tR8)HunE66>z7f5_v4yG`qA^ZX&sxf%%q z#rJT%KOsQivoy-%!YL6?Dl;jRpbjD#@FSCAn*j;_NCr%p3pYS2MVc`naWBodlNtf_ zBy@l@1)=Mvc0tt%9U!ek=%!Lrp*DpMkOotCA7rRtp#%IAHCE_)12WXP&;jP^zi!!p zOs>K?TZNlL@vC2r)k@42MTNzVrhYLN#8b2eV-uDaW69=9+(spyq&CQ+1K|A?B|Z1< z0huc^omJP|c*QqgH>eH^sn6VarZPD@F|(l`LZHN!RC0k557d(Jb0#C-d<_KfbCf|( z)^o3yH($yBbYeUw;>?fBFHo}9d#|9b9nFE4D;Tk_Jf#sJt5A%gjE#a~WTZX>#lVK2 zo#m_1G8V0jMJr>`$}o3oqh!d;Y=6I$QX@+_HL{dcBTJW$k`)&lOHmP5N{YBrkhf4d zN{%RX(6i}azm!x{mZECpD4R+=altH0Itsx5rzTwCquPeB+Pg^)pHreIr&i=P*)J;D zBNN#sK-kYphjDfN7OI{6g>Pv2+*oa&)z^K{(0~&9fQJhmM_l)W7%6NEB zsq1Xg^qzCLm#pmuRM}7zA}bx16`;k$ z(QDLsVd1fAN;b*N9z*q1B_eef%D8xWa*pK`{_zae_sk}BhPL1k84t$N@VZNR9#e-_ zey0F@P+5m;K5eGoP^Qv31O9JCtq?gfTJYJQ#*qAfIw^+WF)gTh=>SVe%WbaUv1sM6 zrRhwo*nprxc=?*p5OLPJf#M4U_e2=3IZR=QqWBm`Mg3SYU^zhQ1~AW_wl|iv|Nl1) zfK0TheYt^OV~FekkTig!Xka*1=ydy-7EC?@*NN7LfSe$%pJp z6Q%<^C@`jCB!ZKk6f5HwJRUjRL0~2+bmSZ+FsU05^Y6)rW(@a;Och$9W8~16^{EZo zO-{`O75QIL`Li-KXcrFZ>q)f@fN0yIE~_?#Pii@coju6SgRl@jtE8kd-2wcPUW#Yf zw9IL}1ri^JLG>-AK5Ha(I*kv~?`n}X!$pcWNX9&W&g!GZ_p7e>6qDT=IawDk&)3u& zI4etJBC-yMM0lEVTOO|cK+q?%;Lb{twgDo%O>QGB1oT*&Sj+)FL{ai^SGu4zBX^0z z0{SsM(6VF>`rSX9bEx^{Oj7oU3QwSBw?e{(pi(@!-0=G_UPHkes2~m&8m}iOPF2@Pi{>{9#Zxq zo#xIaYn@5O%aka)#F-O^@LDDNSeiO-1f-;Bz1Q5xRpRKfY&^?oiMxnF$wtmXlFhYi zS`@bZ{+>~KOG#8!5Pd1BY+~6XGL>zK%=>6YctALHCC;&DR`eVlH=9fmBvP z0Y9vl$|I_;$(!%vkw7KaPU3mQ46=WX?o}WL_oPZNG1#r(aQ_sjrlve1Q&ZglCqn)N znUxgb!|^ch!`vtgfcl8A?+kDS z5mET?PJgZp2_GgY{a1zc>JJoFgSxvA?JiHCR*0A8f7 zg0shPnbdy~fUBgAf-4NGL%s+=2$H%gRy{70`Y!@-mDEvj+ORt0ivY9%(h(|hnbdy~ zfUBggid-Z;#ESsa%h+s1Iu$N?%vuw%mTtN9oc&(>#IEf!JK@-4o2K!2O{c=84p&PT zX9<1Ns;d8@Y@VyBe0_ToqWMD;c`d3k@;c#Sok^O{{$Cc`4Z5d29 z%REhtx6{ah{4g0%JWDZZ4*Tf~s_5&FYw+?Ul&`BV9iLEV-md}qHk?rL3AUG=n5Y0b z5KY2npM;GZxUg!#heUTXtsE z&eu-jdw;)VSR+f8HL_Nz_0MM-ZyQRU5m&PGZZCX}BK)AI=D~i+v!-lmSc5*(iNmO5 z7s5j{5`Qd3q*>bx)p>gHsfozcu}5TT&JsD_MB=K{AKcc8(>otRG!r5yc)N}x) zrPG3d&!e@_jLbIATenNzlK=y|Sy@`@HJ3_8&9XeKNLRqBkq-JvDydxjei3(JaakTB zgs(21gC*krsFy0@+Wdc@NW6EC{2BfGd3Dpq)CX<`q+9HUYi_Uug_Qk9sKo7SdnSFfM1>Dbm2>#6;lP1+n`@d=FS1|0rVs;V=6@`z0BG;8~CBlwRG z*TwLX6O_`UUoH{j@rdkUl59x?N@sNvZpKAp?aEBfP!UT10I!&=jUncjRQ3_KcT`8w_i%i!00{{hFudlsvD@M z*QsG{FJ_5MY=rO<<&Zhq=2qRPM5ON104}~d>Ev*Fk6!$AA~Hc8Dof-jF3mU*{-tu0 zXIbCn(HFQ6CP|wC5#A<`-9q_8j}IpnbAX>zls@{pc+?yg7SN9ie-RJ)$CUla*`T4o z<~nRobLhrSKEFqT5QCm$%1y_D_gQM$DD0LiMjoMC$baoxnx(a@M$N&N5HjsMB8V3FAu6Rf>DQrXmCI zwThCh?z;zM@(RahtMCn40%E6XLS>0e)kMyay#MmZhUFDenKGoE(>7qd9SsncUch*Snl@7M}1lgd&-SsyO1 zJNhMATzaTZY_P03NyV|$^zpRRWV&F#$7ZW#Q4QH>JHI z=3tWj@?`NQK%7w1dFo^rvV12M0*F`JOLL{JPW^@I2en$Bt*P6dERk_{t#RV^1m!mT zvOU zL%IS+jcm}DtDMpA_?M>6B-Zz&?7d`Rx1wHdNZvM0)FU$C(Ts#}`)TDiEhC}4j!(9q zgvy1VKu%iTT!DXsiXVNd zOli+dvgSz2PGCm2!oeR(ZZq}l5t({!S_j;2Q*LqkciDj4UnCiGfQW4fOFvl2-f=K9 zjuB4Vc#ldab=w9P(aUKY@$K`MX*>H3O*=B70{+X4+g%zIs{MNPuQYWBD@$bj9XUhx zhsw+Qwj$Ti>J*u#*70A?5+_mBnfJZP*yFhV?Mg)I-tuxWd&c1ur$lei#jK;!ZN~!O zF^cNR1Bt7{ssVYPE;-ei`DG&01mgN1Vn3PI(zYTtm)vUH7&@usOj3B8EomM+MN_kK zA5y8)GI^KxR>^)eDYF?6{gl!wbeopRTHAUJ?^mLelFoA_r`QleBD_Nj^yGcgtL32* z`8$(_8v)@7Y00>om_m76Sbu$3yMEQ|-8J*Ic4t`#*pF*ZEz9UP=T@3k%qo?ohL(rf zyRQywSMLlSbqKidb~SD~TzI{N8(Ey^++|j&Y$mdCUVG%`jg4czrl|xk;L~+Go7_MF zUh-27wM@Rh+Alqt^DzB#Vmc3a_IyKDh3$ZE)_AVM6@a%YYASrAnjerux)5erZ3wyF zNpd#;ZdJLW`QAPm7)CK0OpQg(aJ*mg#YR913&+nr-GbDX-UppJq~t1fnB2Lo_9TqMeOmp0W~%Hf05LSO1%7iPTLk>8 zmUQ6P=`x3O?0|#hu0`DRc^$=M%me&G?P{eU;Gb#)2^HYAS2iXI72sPEYVoZKE+0>+)r;2E+i~@eC08#3;@)Tx@UhRKMiv22R8%Ab{>$ek zGQbZgDv|-`igQNs$l*`5TJV|_J`T4LRS}1+FpRiHgYv(_amL{|<8X|77o4BNF*qE9 z!*L9^Z>r_)`b<;K3Vu}T*RpdSHL!vo<#y7;TJ3Qrw>nxXrV5vrHVdkhEGTO- zW&|A@+<`zQSW{D`?Az2yj83xT1W0?U2P!iAwd-r|TLgEDPORzzWNuTWJknS!Ve$V{O% zX~5Wkl2D5_Xd!$bIajT#jn*2Yz^Y9$_<}`P^=hOb> zjT-Vmt@$0E26P;9KLJRsiP!GvlNqW)GOdPmhu4tqNHL7>YM$9|El3u~{okw(EevGR zwgHbzZS6`x`aBVIQ|bU2CLWr%yx(ul9)6YVmp}Q$R{op^RpI0l29&}D53Ea1Q1EOW zcyN=16(9rAI$8UlfD`1jnTb^>d-;hAIwQeN{cbQx)vw)@VuAspt|~G#*@;C^ zpcP?ur)2En;xDGaa-8a6MHbDYR+r4d+}+*MpP=5Q@Gbovx&(E%rZv)W{4IUQf46x4 zyQS~A!ET|9E}*AB#uz_Gvs#&FQ+Fn#9*|~JbAYYpf2Y^{?@X$;D(6l!B1NtEJx{gj zYbpynfWMHnx~os-m$O!YEv@eIw7SdF%0APsWI~oh1^xW=dhLh)TvMsg+xld_nL4RW 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ᙥOyH2txumy;)I$EfS+;xO%IJQs&N260p zIuG3;ytbFBbUp696!Iy#5gKu67F94($Lz-uO*d!D8v2;b8!O|=3GGx zdn<^c3kxEBq{m~TUx8kKDPE-iWWVx9jkOKwiY0ZJY*NR zQ?_X*|CGJh*L9l~slkK$lwq3JvydX1@@Qw>&m}bF5nJO?x5(s8j}AF*ZG4QkR&T6XI<=1j~FwG0;=q$wj`LBHyV!$R%chlRq-+$EEtHO7w! z#4W_|2ND(?s#$u1mfI7YWnl|R`A}n*dyFBLJ+~8KO=BiboS#xnLKW)8--39r%D+}i(KR95eOx*%T%W|k3kn~J%zmVA z8F`f=X#(W+fNXz(eX6{?EdowalKd|GXijA>&xg{yS&*jj>x8A;Q*wWk$kx&lHp{nG zVsn6AM!v^hqBfAjg?BnhQqCExgA=TSCh)mNY5@n7RGjsxyx8*rU*Y-cIh9L1A8?)L z>&dCS))Pl_f=HO0wRm(a4{*-TvahSSw`w|+=W=f1*gBU~_LAHtlvM6%xMwM;+$x|= zNe%rzwjT97rAIwa=~2&9derlj9`$$$GsQxGR8Q@pHq~dLPSt0jX4Pk*e${8Dlma(_ zcK$=#8T$Il&gT#gxA$5NAa7e_mfgIL3RmbRAhgvUU??wB>;VL_qmUn(Zrq{W_Mp>1 z|1ASY$J|bB<>;T*Rvx6al?S1=?$@DfQ4W<_$%C}I@?b~Qb*pozsiTETI$EfoYyd)E zI<`QGWcEylh&h~ro+_@NpFG1Q_UhDsE~P=|sT zx+2TY(gAU<4UA}yBaP%kgqJA8YmBi0yh%y!h9K-Vb!*U*&DYs=wU&vEs`RQy_I`VF zoKj8rW-7x$#@GNdVLLTKH>FgI9h7A!>&D|$Ehl6n?i5RPSjqj4JS0#0p}a$%Oy!9? z-pWZ}Q=KR8R*q@Lu{u*09_^t!h^cabb<%r{gC}gUrpW2l9%QjUZU zJYvfh>%bF|wL^!LGvBNhv#XQHkE#O5N+d%$)8p4Ssth|FhQ`_hY+S2dOp-Jh|Yd=3f zd8{SR$XPjk-Z=KLHf$m0rjE7OsR}n~xjn)1yM;lEWF~kkJJBt(%K9_*FH1R|0N-h( zVc?Pj;2HqFR7vimF@rg^yACo&;Fk}EGz@&}p^yfEw;O2~xYJXN3-}Tv4Fk7mnB=Sj zyvs<#z@N=EStS_vf8DP~iR@Gv8d0C9_RQrn#LM)PJHIBj;>hg=*0ubfko zBwseKrGf`bfz)2E+mwQp%Bz$pLmBvfBaHy@f6|rB-p%9cz*fN)c+EDUcaP)VOC2uKI=zkflHdfbd zwl#5#h7&Q`wk8pyt!ol7+O{SUqpfQaG1|5!j?r);MqAe;Vzg~d9HZexjJB;w#AsVI zjw+$(5;P*jIxRnD1|&kg+1hPcPK~9yH(MoCY7DYIw{Xv1X)_W_k%$En!%_e>f>?G& zjVPA9)ZSn#&SD_3mGpgJ4HaTrwx&jK%buta-IA9Y;VpTo5zLa88qq9ysWHu!yj_Bj z{Yu9PuCHY;!lSrNNU{AdO4xtTm{~AgMF=87W+`BbLOD zSQ0ye@0@v6<=desL|Mz0y@7DL#O@mUg}RAMl8?%UCc2iGi$TH`=9G}abP`gmdGyPBeV9_w-jPTv;_WZz z{Qw}^GL8tTkKc0Qx6C5596KqcVQ6o)AM7Te!Vbh0Ma;1LAdA^@AmQwYEz6C_i#-%g z3DwBHP$y8lBF9+5>TMdpCX^JeI9>y2?X^i9iMxFMH_PtT)bYcrIZYkyV_=gkZj%9n zCS<>mNP%j}sPoaY1jDD2VAU4j2V>2~+2_9FGJt-n9z9-m3m;6OU

      gT@vprpPd|&)4jy)M&(ZG#vuSki?fe6Qh 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�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

      a0u3)VaFh-%zYcQg42ApjG;zU7iH|ttS}Clb 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 z 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 L2NdV7y|O*5gHrujdudOPKe1 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 H9`_ instead. + diff --git a/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/RECORD b/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/RECORD new file mode 100644 index 0000000..674a799 --- /dev/null +++ b/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/RECORD @@ -0,0 +1,6 @@ +bs4-0.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +bs4-0.0.1.dist-info/METADATA,sha256=bVRbr82MkIf0VeeUP0gfl3SouLVKkecr32puiylQwCs,938 +bs4-0.0.1.dist-info/RECORD,, +bs4-0.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +bs4-0.0.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +bs4-0.0.1.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/REQUESTED b/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/certifi-2023.5.7.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL b/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL rename to python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt b/python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt rename to python/lib/python3.10/site-packages/bs4-0.0.1.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/bs4/__init__.py b/python/lib/python3.10/site-packages/bs4/__init__.py similarity index 100% rename from lib/python3.11/site-packages/bs4/__init__.py rename to python/lib/python3.10/site-packages/bs4/__init__.py diff --git a/lib/python3.11/site-packages/bs4/builder/__init__.py b/python/lib/python3.10/site-packages/bs4/builder/__init__.py similarity index 100% rename from lib/python3.11/site-packages/bs4/builder/__init__.py rename to python/lib/python3.10/site-packages/bs4/builder/__init__.py diff --git a/lib/python3.11/site-packages/bs4/builder/_html5lib.py b/python/lib/python3.10/site-packages/bs4/builder/_html5lib.py similarity index 100% rename from lib/python3.11/site-packages/bs4/builder/_html5lib.py rename to python/lib/python3.10/site-packages/bs4/builder/_html5lib.py diff --git a/lib/python3.11/site-packages/bs4/builder/_htmlparser.py b/python/lib/python3.10/site-packages/bs4/builder/_htmlparser.py similarity index 100% rename from lib/python3.11/site-packages/bs4/builder/_htmlparser.py rename to python/lib/python3.10/site-packages/bs4/builder/_htmlparser.py diff --git a/lib/python3.11/site-packages/bs4/builder/_lxml.py b/python/lib/python3.10/site-packages/bs4/builder/_lxml.py similarity index 100% rename from lib/python3.11/site-packages/bs4/builder/_lxml.py rename to python/lib/python3.10/site-packages/bs4/builder/_lxml.py diff --git a/lib/python3.11/site-packages/bs4/css.py b/python/lib/python3.10/site-packages/bs4/css.py similarity index 100% rename from lib/python3.11/site-packages/bs4/css.py rename to python/lib/python3.10/site-packages/bs4/css.py diff --git a/lib/python3.11/site-packages/bs4/dammit.py b/python/lib/python3.10/site-packages/bs4/dammit.py similarity index 100% rename from lib/python3.11/site-packages/bs4/dammit.py rename to python/lib/python3.10/site-packages/bs4/dammit.py diff --git a/lib/python3.11/site-packages/bs4/diagnose.py b/python/lib/python3.10/site-packages/bs4/diagnose.py similarity index 100% rename from lib/python3.11/site-packages/bs4/diagnose.py rename to python/lib/python3.10/site-packages/bs4/diagnose.py diff --git a/lib/python3.11/site-packages/bs4/element.py b/python/lib/python3.10/site-packages/bs4/element.py similarity index 100% rename from lib/python3.11/site-packages/bs4/element.py rename to python/lib/python3.10/site-packages/bs4/element.py diff --git a/lib/python3.11/site-packages/bs4/formatter.py b/python/lib/python3.10/site-packages/bs4/formatter.py similarity index 100% rename from lib/python3.11/site-packages/bs4/formatter.py rename to python/lib/python3.10/site-packages/bs4/formatter.py diff --git a/lib/python3.11/site-packages/bs4/tests/__init__.py b/python/lib/python3.10/site-packages/bs4/tests/__init__.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/__init__.py rename to python/lib/python3.10/site-packages/bs4/tests/__init__.py diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase b/python/lib/python3.10/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase rename to python/lib/python3.10/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase diff --git a/lib/python3.11/site-packages/bs4/tests/test_builder.py b/python/lib/python3.10/site-packages/bs4/tests/test_builder.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_builder.py rename to python/lib/python3.10/site-packages/bs4/tests/test_builder.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_builder_registry.py b/python/lib/python3.10/site-packages/bs4/tests/test_builder_registry.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_builder_registry.py rename to python/lib/python3.10/site-packages/bs4/tests/test_builder_registry.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_css.py b/python/lib/python3.10/site-packages/bs4/tests/test_css.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_css.py rename to python/lib/python3.10/site-packages/bs4/tests/test_css.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_dammit.py b/python/lib/python3.10/site-packages/bs4/tests/test_dammit.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_dammit.py rename to python/lib/python3.10/site-packages/bs4/tests/test_dammit.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_docs.py b/python/lib/python3.10/site-packages/bs4/tests/test_docs.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_docs.py rename to python/lib/python3.10/site-packages/bs4/tests/test_docs.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_element.py b/python/lib/python3.10/site-packages/bs4/tests/test_element.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_element.py rename to python/lib/python3.10/site-packages/bs4/tests/test_element.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_formatter.py b/python/lib/python3.10/site-packages/bs4/tests/test_formatter.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_formatter.py rename to python/lib/python3.10/site-packages/bs4/tests/test_formatter.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_fuzz.py b/python/lib/python3.10/site-packages/bs4/tests/test_fuzz.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_fuzz.py rename to python/lib/python3.10/site-packages/bs4/tests/test_fuzz.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_html5lib.py b/python/lib/python3.10/site-packages/bs4/tests/test_html5lib.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_html5lib.py rename to python/lib/python3.10/site-packages/bs4/tests/test_html5lib.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_htmlparser.py b/python/lib/python3.10/site-packages/bs4/tests/test_htmlparser.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_htmlparser.py rename to python/lib/python3.10/site-packages/bs4/tests/test_htmlparser.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_lxml.py b/python/lib/python3.10/site-packages/bs4/tests/test_lxml.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_lxml.py rename to python/lib/python3.10/site-packages/bs4/tests/test_lxml.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_navigablestring.py b/python/lib/python3.10/site-packages/bs4/tests/test_navigablestring.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_navigablestring.py rename to python/lib/python3.10/site-packages/bs4/tests/test_navigablestring.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_pageelement.py b/python/lib/python3.10/site-packages/bs4/tests/test_pageelement.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_pageelement.py rename to python/lib/python3.10/site-packages/bs4/tests/test_pageelement.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_soup.py b/python/lib/python3.10/site-packages/bs4/tests/test_soup.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_soup.py rename to python/lib/python3.10/site-packages/bs4/tests/test_soup.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_tag.py b/python/lib/python3.10/site-packages/bs4/tests/test_tag.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_tag.py rename to python/lib/python3.10/site-packages/bs4/tests/test_tag.py diff --git a/lib/python3.11/site-packages/bs4/tests/test_tree.py b/python/lib/python3.10/site-packages/bs4/tests/test_tree.py similarity index 100% rename from lib/python3.11/site-packages/bs4/tests/test_tree.py rename to python/lib/python3.10/site-packages/bs4/tests/test_tree.py diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/LICENSE b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/LICENSE similarity index 100% rename from lib/python3.11/site-packages/certifi-2023.5.7.dist-info/LICENSE rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/LICENSE diff --git a/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/METADATA b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/certifi-2023.5.7.dist-info/METADATA rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/RECORD b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/RECORD new file mode 100644 index 0000000..3de83b1 --- /dev/null +++ b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/RECORD @@ -0,0 +1,15 @@ +certifi-2023.5.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2023.5.7.dist-info/LICENSE,sha256=oC9sY4-fuE0G93ZMOrCF2K9-2luTwWbaVDEkeQd8b7A,1052 +certifi-2023.5.7.dist-info/METADATA,sha256=fpDUR-Vqju0gWBVplvFKNISMUn1UqTzr6698ttTzSLo,2190 +certifi-2023.5.7.dist-info/RECORD,, +certifi-2023.5.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +certifi-2023.5.7.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +certifi-2023.5.7.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=q5ePznlfOw-XYIOV6RTnh45yS9haN-Nb1d__4QXc3g0,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/__pycache__/__init__.cpython-310.pyc,, +certifi/__pycache__/__main__.cpython-310.pyc,, +certifi/__pycache__/core.cpython-310.pyc,, +certifi/cacert.pem,sha256=swFTXcpJHZgU6ij6oyCsehnQ9dlCN5lvoKO1qTZDJRQ,278952 +certifi/core.py,sha256=lhewz0zFb2b4ULsQurElmloYwQoecjWzPqY67P8T7iM,4219 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/WHEEL b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/certifi-2023.5.7.dist-info/WHEEL rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/certifi-2023.5.7.dist-info/top_level.txt b/python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/certifi-2023.5.7.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/certifi-2023.5.7.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/certifi/__init__.py b/python/lib/python3.10/site-packages/certifi/__init__.py similarity index 100% rename from lib/python3.11/site-packages/certifi/__init__.py rename to python/lib/python3.10/site-packages/certifi/__init__.py diff --git a/lib/python3.11/site-packages/certifi/__main__.py b/python/lib/python3.10/site-packages/certifi/__main__.py similarity index 100% rename from lib/python3.11/site-packages/certifi/__main__.py rename to python/lib/python3.10/site-packages/certifi/__main__.py diff --git a/lib/python3.11/site-packages/certifi/cacert.pem b/python/lib/python3.10/site-packages/certifi/cacert.pem similarity index 100% rename from lib/python3.11/site-packages/certifi/cacert.pem rename to python/lib/python3.10/site-packages/certifi/cacert.pem diff --git a/lib/python3.11/site-packages/certifi/core.py b/python/lib/python3.10/site-packages/certifi/core.py similarity index 100% rename from lib/python3.11/site-packages/certifi/core.py rename to python/lib/python3.10/site-packages/certifi/core.py diff --git a/lib/python3.11/site-packages/certifi/py.typed b/python/lib/python3.10/site-packages/certifi/py.typed similarity index 100% rename from lib/python3.11/site-packages/certifi/py.typed rename to python/lib/python3.10/site-packages/certifi/py.typed diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/METADATA b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/METADATA rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/RECORD b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/RECORD new file mode 100644 index 0000000..4cc2e9d --- /dev/null +++ b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/RECORD @@ -0,0 +1,36 @@ +../../../bin/normalizer,sha256=pgfkRCNOLuifhDuF1o1fzKY6SANkqlwBL5YNE3oQ8Xk,275 +charset_normalizer-3.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.1.0.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-3.1.0.dist-info/METADATA,sha256=8lfcrrmtfEq--eZqh8FJzEjptLCEoGXySKruxIms44I,30983 +charset_normalizer-3.1.0.dist-info/RECORD,, +charset_normalizer-3.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer-3.1.0.dist-info/WHEEL,sha256=nKSwEH5fkxvG0Vdj1Hx7vbuU-SGQ9Nxl4yFFsCilvhs,152 +charset_normalizer-3.1.0.dist-info/entry_points.txt,sha256=uYo8aIGLWv8YgWfSna5HnfY_En4pkF1w4bgawNAXzP0,76 +charset_normalizer-3.1.0.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=aAb_F9Zb23pb4NO6TfIfqLXLvf1PjnLBBOuPvQwPA18,1549 +charset_normalizer/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/__pycache__/api.cpython-310.pyc,, +charset_normalizer/__pycache__/cd.cpython-310.pyc,, +charset_normalizer/__pycache__/constant.cpython-310.pyc,, +charset_normalizer/__pycache__/legacy.cpython-310.pyc,, +charset_normalizer/__pycache__/md.cpython-310.pyc,, +charset_normalizer/__pycache__/models.cpython-310.pyc,, +charset_normalizer/__pycache__/utils.cpython-310.pyc,, +charset_normalizer/__pycache__/version.cpython-310.pyc,, +charset_normalizer/api.py,sha256=Vh44rFXztkxCjW7gF2waq8TyRL3mXKX8RwNGB99bhb4,18624 +charset_normalizer/assets/__init__.py,sha256=wpRfujN7GJuEE5wHHo3wEDVoJ5ovzRIxsImyimCBfGU,20069 +charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/cd.py,sha256=mZuiTSKq4XpweSDD2H4T4R3Axtaa-QS0tpEWdpMuAzQ,12554 +charset_normalizer/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc,, +charset_normalizer/cli/normalizer.py,sha256=2F-xURZJzo063Ye-2RLJ2wcmURpbKeAzKwpiws65dAs,9744 +charset_normalizer/constant.py,sha256=PmCeoKXqq3ZbCtCUpKHwwFBIv9DXMT_an1yd24q28mA,19101 +charset_normalizer/legacy.py,sha256=T-QuVMsMeDiQEk8WSszMrzVJg_14AMeSkmHdRYhdl1k,2071 +charset_normalizer/md.cpython-310-x86_64-linux-gnu.so,sha256=VRykbQIynSswzdrRbruysjgWzNW9fAXVUn06wgATyhc,17496 +charset_normalizer/md.py,sha256=MXPKP_oLbsubulEL_1rxcYKSd5FeEfyEfNNm5O6ADpc,18258 +charset_normalizer/md__mypyc.cpython-310-x86_64-linux-gnu.so,sha256=r7AOFco7yQOyP83eUuE0S1s6UENwSuxbZDmRJzWrEHQ,424312 +charset_normalizer/models.py,sha256=mC11wo84l00u2o03TRNX7M5ItBAbPUKKXgJSFxA35GY,11492 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=tKLpquPYQdaRdFRwBo5gPOi06ov8UCJy5X1Pti0Q78U,11544 +charset_normalizer/version.py,sha256=bekbdpF_D3BtF-PhbPnA9PNaZaI8kKIgl3LTCD5FmYk,79 diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/REQUESTED b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED diff --git a/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL new file mode 100644 index 0000000..a9630e4 --- /dev/null +++ b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: false +Tag: cp310-cp310-manylinux_2_17_x86_64 +Tag: cp310-cp310-manylinux2014_x86_64 + diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt diff --git a/lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt b/python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/charset_normalizer/__init__.py b/python/lib/python3.10/site-packages/charset_normalizer/__init__.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/__init__.py rename to python/lib/python3.10/site-packages/charset_normalizer/__init__.py diff --git a/lib/python3.11/site-packages/charset_normalizer/api.py b/python/lib/python3.10/site-packages/charset_normalizer/api.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/api.py rename to python/lib/python3.10/site-packages/charset_normalizer/api.py diff --git a/lib/python3.11/site-packages/charset_normalizer/assets/__init__.py b/python/lib/python3.10/site-packages/charset_normalizer/assets/__init__.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/assets/__init__.py rename to python/lib/python3.10/site-packages/charset_normalizer/assets/__init__.py diff --git a/lib/python3.11/site-packages/charset_normalizer/cd.py b/python/lib/python3.10/site-packages/charset_normalizer/cd.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/cd.py rename to python/lib/python3.10/site-packages/charset_normalizer/cd.py diff --git a/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py b/python/lib/python3.10/site-packages/charset_normalizer/cli/__init__.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/cli/__init__.py rename to python/lib/python3.10/site-packages/charset_normalizer/cli/__init__.py diff --git a/lib/python3.11/site-packages/charset_normalizer/cli/normalizer.py b/python/lib/python3.10/site-packages/charset_normalizer/cli/normalizer.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/cli/normalizer.py rename to python/lib/python3.10/site-packages/charset_normalizer/cli/normalizer.py diff --git a/lib/python3.11/site-packages/charset_normalizer/constant.py b/python/lib/python3.10/site-packages/charset_normalizer/constant.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/constant.py rename to python/lib/python3.10/site-packages/charset_normalizer/constant.py diff --git a/lib/python3.11/site-packages/charset_normalizer/legacy.py b/python/lib/python3.10/site-packages/charset_normalizer/legacy.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/legacy.py rename to python/lib/python3.10/site-packages/charset_normalizer/legacy.py diff --git a/python/lib/python3.10/site-packages/charset_normalizer/md.cpython-310-x86_64-linux-gnu.so b/python/lib/python3.10/site-packages/charset_normalizer/md.cpython-310-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..0e3becc992a951f1d79b64cdbe88d7ba1a93a3a3 GIT binary patch literal 17496 zcmeHOeQXrR6`#HJ;UfoUW4@uO7X%el^`6fL!bcp=`0Hp5xULDLO0=x+*1k*cD|c(K zY1BF;i9!RC)v8jJk|=6bC5_rD`J)j{)f56sQ2R%dekf5?B-EA!CshL}MXp+LeQ##o zd2fA3)Be$avIBc>-tWEN%;sq8L>+Ek-JqSCP9PMHA_Wn0;N z_+7&^?prr&nwy&^A(FCOtiz8csk`M_*(8!=N0`^AAsLd!f6H=4swAB}Y{E>7aG2?+ zlmkAYAC!`Ks3NaX7xu=xD&_04og@Ro%-e|V+$zg+%XQL^BtIv>1}@tP%-^dC2e%}D zlEnKw@F>KBdFx*a`=G3^R$KzI{Uqh-^7C5)Rj6?E?cLAbo%i;iPPAsN_H$4EYw^^n zM}mDDzl$wEJH`ZgynT~VxPW_kF^Jy=$A>3=Ui#_DYoYgk`$6c1%P;l;R5N`7ELs)o zHvpq^a+)8ifnx(Sr=!e&31qc$wgRq6AEy`uWvvsCc@tz43$lSl0yrRXEV~Kr9(N_n zIKF_Lmj2S6J;m`LdtT!FoT?Ia)~i0Xkent%oiai zVP*_W7~PhcPUqr8Hh8O`b?MY_-cA-QGocrAdMoO2%xz(P{kwN{8Etx-zL`#0N+0wY z@ecvay$q7B&Dg3G1kuMXNN>8I>HdpS9OeB=IFoq5g_C}1rzjBnD)tddR~$Iqb7;Hj zz@7Ksj03NyLO`yF3I#EFYjHqx;CRna+7J~v^mo?V>cGo=0(`bQ@bWnW9(CZ(_JGMt zUIe@dcoFa-;6=cTfENKT0w1FY#E$(X5PRHzG0a%(ku$dc$__aB*s=40b0P?(&3^<_ zY5kw!x1l)-InajHE1I@f=LI!E%o!uw;#I^MyT{Mhl!_5vvO zz0WXqR$}eHaYS!uei&QDrg%J0c6>hsWQOMht=hgkq|hU0_{Ave(?0_{wi2(~>}BGWdp}+T zya;#^@FL(vz>9zv0WShx1iT1%5%415MW9v$;z_emv}_}rD`fbGzk;4g7)E9yKM_aH zt?W8}b2R397{E^eS6Qv@&_LqL|M?F}C0s&q{c5R%wxMgK629T$H)Kr8(Ltt+H!7EuLWA

      FFk(0X=veOu&0+g>T} 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/charset_normalizer/models.py b/python/lib/python3.10/site-packages/charset_normalizer/models.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/models.py rename to python/lib/python3.10/site-packages/charset_normalizer/models.py diff --git a/lib/python3.11/site-packages/charset_normalizer/py.typed b/python/lib/python3.10/site-packages/charset_normalizer/py.typed similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/py.typed rename to python/lib/python3.10/site-packages/charset_normalizer/py.typed diff --git a/lib/python3.11/site-packages/charset_normalizer/utils.py b/python/lib/python3.10/site-packages/charset_normalizer/utils.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/utils.py rename to python/lib/python3.10/site-packages/charset_normalizer/utils.py diff --git a/lib/python3.11/site-packages/charset_normalizer/version.py b/python/lib/python3.10/site-packages/charset_normalizer/version.py similarity index 100% rename from lib/python3.11/site-packages/charset_normalizer/version.py rename to python/lib/python3.10/site-packages/charset_normalizer/version.py diff --git a/lib/python3.11/site-packages/filelock-3.12.2.dist-info/INSTALLER b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/filelock-3.12.2.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/click-8.1.3.dist-info/RECORD b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/RECORD new file mode 100644 index 0000000..1ca66a0 --- /dev/null +++ b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/RECORD @@ -0,0 +1,40 @@ +click-8.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.1.3.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.1.3.dist-info/METADATA,sha256=tFJIX5lOjx7c5LjZbdTPFVDJSgyv9F74XY0XCPp_gnc,3247 +click-8.1.3.dist-info/RECORD,, +click-8.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click-8.1.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +click-8.1.3.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=rQBLutqg-z6m8nOzivIfigDn_emijB_dKv9BZ2FNi5s,3138 +click/__pycache__/__init__.cpython-310.pyc,, +click/__pycache__/_compat.cpython-310.pyc,, +click/__pycache__/_termui_impl.cpython-310.pyc,, +click/__pycache__/_textwrap.cpython-310.pyc,, +click/__pycache__/_winconsole.cpython-310.pyc,, +click/__pycache__/core.cpython-310.pyc,, +click/__pycache__/decorators.cpython-310.pyc,, +click/__pycache__/exceptions.cpython-310.pyc,, +click/__pycache__/formatting.cpython-310.pyc,, +click/__pycache__/globals.cpython-310.pyc,, +click/__pycache__/parser.cpython-310.pyc,, +click/__pycache__/shell_completion.cpython-310.pyc,, +click/__pycache__/termui.cpython-310.pyc,, +click/__pycache__/testing.cpython-310.pyc,, +click/__pycache__/types.cpython-310.pyc,, +click/__pycache__/utils.cpython-310.pyc,, +click/_compat.py,sha256=JIHLYs7Jzz4KT9t-ds4o4jBzLjnwCiJQKqur-5iwCKI,18810 +click/_termui_impl.py,sha256=qK6Cfy4mRFxvxE8dya8RBhLpSC8HjF-lvBc6aNrPdwg,23451 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=mz87bYEKzIoNYEa56BFAiOJnvt1Y0L-i7wD4_ZecieE,112782 +click/decorators.py,sha256=yo3zvzgUm5q7h5CXjyV6q3h_PJAiUaem178zXwdWUFI,16350 +click/exceptions.py,sha256=7gDaLGuFZBeCNwY9ERMsF2-Z3R9Fvq09Zc6IZSKjseo,9167 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=TP-qM88STzc7f127h35TD_v920FgfOD2EwzqA0oE8XU,1961 +click/parser.py,sha256=cAEt1uQR8gq3-S9ysqbVU-fdAZNvilxw4ReJ_T1OQMk,19044 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=qOp_BeC9esEOSZKyu5G7RIxEUaLsXUX-mTb7hB1r4QY,18018 +click/termui.py,sha256=ACBQVOvFCTSqtD5VREeCAdRtlHd-Imla-Lte4wSfMjA,28355 +click/testing.py,sha256=ptpMYgRY7dVfE3UDgkgwayu9ePw98sQI3D7zZXiCpj4,16063 +click/types.py,sha256=rEb1aZSQKq3ciCMmjpG2Uva9vk498XRL7ThrcK2GRss,35805 +click/utils.py,sha256=33D6E7poH_nrKB-xr-UyDEXnxOcCiQqxuRLtrqeVv6o,18682 diff --git a/lib/python3.11/site-packages/filelock-3.12.2.dist-info/REQUESTED b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/filelock-3.12.2.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt b/python/lib/python3.10/site-packages/click-8.1.3.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/click-8.1.3.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/click/__init__.py b/python/lib/python3.10/site-packages/click/__init__.py similarity index 100% rename from lib/python3.11/site-packages/click/__init__.py rename to python/lib/python3.10/site-packages/click/__init__.py diff --git a/lib/python3.11/site-packages/click/_compat.py b/python/lib/python3.10/site-packages/click/_compat.py similarity index 100% rename from lib/python3.11/site-packages/click/_compat.py rename to python/lib/python3.10/site-packages/click/_compat.py diff --git a/lib/python3.11/site-packages/click/_termui_impl.py b/python/lib/python3.10/site-packages/click/_termui_impl.py similarity index 100% rename from lib/python3.11/site-packages/click/_termui_impl.py rename to python/lib/python3.10/site-packages/click/_termui_impl.py diff --git a/lib/python3.11/site-packages/click/_textwrap.py b/python/lib/python3.10/site-packages/click/_textwrap.py similarity index 100% rename from lib/python3.11/site-packages/click/_textwrap.py rename to python/lib/python3.10/site-packages/click/_textwrap.py diff --git a/lib/python3.11/site-packages/click/_winconsole.py b/python/lib/python3.10/site-packages/click/_winconsole.py similarity index 100% rename from lib/python3.11/site-packages/click/_winconsole.py rename to python/lib/python3.10/site-packages/click/_winconsole.py diff --git a/lib/python3.11/site-packages/click/core.py b/python/lib/python3.10/site-packages/click/core.py similarity index 100% rename from lib/python3.11/site-packages/click/core.py rename to python/lib/python3.10/site-packages/click/core.py diff --git a/lib/python3.11/site-packages/click/decorators.py b/python/lib/python3.10/site-packages/click/decorators.py similarity index 100% rename from lib/python3.11/site-packages/click/decorators.py rename to python/lib/python3.10/site-packages/click/decorators.py diff --git a/lib/python3.11/site-packages/click/exceptions.py b/python/lib/python3.10/site-packages/click/exceptions.py similarity index 100% rename from lib/python3.11/site-packages/click/exceptions.py rename to python/lib/python3.10/site-packages/click/exceptions.py diff --git a/lib/python3.11/site-packages/click/formatting.py b/python/lib/python3.10/site-packages/click/formatting.py similarity index 100% rename from lib/python3.11/site-packages/click/formatting.py rename to python/lib/python3.10/site-packages/click/formatting.py diff --git a/lib/python3.11/site-packages/click/globals.py b/python/lib/python3.10/site-packages/click/globals.py similarity index 100% rename from lib/python3.11/site-packages/click/globals.py rename to python/lib/python3.10/site-packages/click/globals.py diff --git a/lib/python3.11/site-packages/click/parser.py b/python/lib/python3.10/site-packages/click/parser.py similarity index 100% rename from lib/python3.11/site-packages/click/parser.py rename to python/lib/python3.10/site-packages/click/parser.py diff --git a/lib/python3.11/site-packages/click/py.typed b/python/lib/python3.10/site-packages/click/py.typed similarity index 100% rename from lib/python3.11/site-packages/click/py.typed rename to python/lib/python3.10/site-packages/click/py.typed diff --git a/lib/python3.11/site-packages/click/shell_completion.py b/python/lib/python3.10/site-packages/click/shell_completion.py similarity index 100% rename from lib/python3.11/site-packages/click/shell_completion.py rename to python/lib/python3.10/site-packages/click/shell_completion.py diff --git a/lib/python3.11/site-packages/click/termui.py b/python/lib/python3.10/site-packages/click/termui.py similarity index 100% rename from lib/python3.11/site-packages/click/termui.py rename to python/lib/python3.10/site-packages/click/termui.py diff --git a/lib/python3.11/site-packages/click/testing.py b/python/lib/python3.10/site-packages/click/testing.py similarity index 100% rename from lib/python3.11/site-packages/click/testing.py rename to python/lib/python3.10/site-packages/click/testing.py diff --git a/lib/python3.11/site-packages/click/types.py b/python/lib/python3.10/site-packages/click/types.py similarity index 100% rename from lib/python3.11/site-packages/click/types.py rename to python/lib/python3.10/site-packages/click/types.py diff --git a/lib/python3.11/site-packages/click/utils.py b/python/lib/python3.10/site-packages/click/utils.py similarity index 100% rename from lib/python3.11/site-packages/click/utils.py rename to python/lib/python3.10/site-packages/click/utils.py diff --git a/python/lib/python3.10/site-packages/distutils-precedence.pth b/python/lib/python3.10/site-packages/distutils-precedence.pth new file mode 100644 index 0000000..6de4198 --- /dev/null +++ b/python/lib/python3.10/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/lib/python3.11/site-packages/idna-3.4.dist-info/INSTALLER b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/idna-3.4.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/filelock-3.12.2.dist-info/METADATA b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/filelock-3.12.2.dist-info/METADATA rename to python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/RECORD b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/RECORD new file mode 100644 index 0000000..9e4a806 --- /dev/null +++ b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/RECORD @@ -0,0 +1,23 @@ +filelock-3.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +filelock-3.12.2.dist-info/METADATA,sha256=XziDNuweWluDKuB0HgIgQPYZr2D1UfRluRfZ7RNypsw,2724 +filelock-3.12.2.dist-info/RECORD,, +filelock-3.12.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +filelock-3.12.2.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87 +filelock-3.12.2.dist-info/licenses/LICENSE,sha256=iNm062BXnBkew5HKBMFhMFctfu3EqG2qWL8oxuFMm80,1210 +filelock/__init__.py,sha256=nCvrEw6t391LA0d_TsybAbRF3HI4g6lYoHil-xghyJs,1230 +filelock/__pycache__/__init__.cpython-310.pyc,, +filelock/__pycache__/_api.cpython-310.pyc,, +filelock/__pycache__/_error.cpython-310.pyc,, +filelock/__pycache__/_soft.cpython-310.pyc,, +filelock/__pycache__/_unix.cpython-310.pyc,, +filelock/__pycache__/_util.cpython-310.pyc,, +filelock/__pycache__/_windows.cpython-310.pyc,, +filelock/__pycache__/version.cpython-310.pyc,, +filelock/_api.py,sha256=iUUv2QVWTX4g3v2LSH2m8iF-ZlyP1UkezsfCSvXgil0,10125 +filelock/_error.py,sha256=-5jMcjTu60YAvAO1UbqDD1GIEjVkwr8xCFwDBtMeYDg,787 +filelock/_soft.py,sha256=FlmkORe37IXz0voO2JPmdDjk2W5BH5B5LSDqnQ7ZOTU,1638 +filelock/_unix.py,sha256=T-g81COqIF-yEJKKyxax_8joejxw7JVYWDPrpy2Cq2I,2062 +filelock/_util.py,sha256=Y3CMudAij-xLOWdIMxWhWEaOTCI_BICW0spcv_LFp4Y,1410 +filelock/_windows.py,sha256=3wpFAtTliqodzqLXk8h1EX_T_zyd32t_roJqKVr0pm0,2100 +filelock/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +filelock/version.py,sha256=Vk4x7NmWnlU1UDYhJpyZCmorJtPQLx9a4YEOiepQZgM,162 diff --git a/lib/python3.11/site-packages/idna-3.4.dist-info/REQUESTED b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/idna-3.4.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/filelock-3.12.2.dist-info/WHEEL b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/filelock-3.12.2.dist-info/WHEEL rename to python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE b/python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE similarity index 100% rename from lib/python3.11/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE rename to python/lib/python3.10/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE diff --git a/lib/python3.11/site-packages/filelock/__init__.py b/python/lib/python3.10/site-packages/filelock/__init__.py similarity index 100% rename from lib/python3.11/site-packages/filelock/__init__.py rename to python/lib/python3.10/site-packages/filelock/__init__.py diff --git a/lib/python3.11/site-packages/filelock/_api.py b/python/lib/python3.10/site-packages/filelock/_api.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_api.py rename to python/lib/python3.10/site-packages/filelock/_api.py diff --git a/lib/python3.11/site-packages/filelock/_error.py b/python/lib/python3.10/site-packages/filelock/_error.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_error.py rename to python/lib/python3.10/site-packages/filelock/_error.py diff --git a/lib/python3.11/site-packages/filelock/_soft.py b/python/lib/python3.10/site-packages/filelock/_soft.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_soft.py rename to python/lib/python3.10/site-packages/filelock/_soft.py diff --git a/lib/python3.11/site-packages/filelock/_unix.py b/python/lib/python3.10/site-packages/filelock/_unix.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_unix.py rename to python/lib/python3.10/site-packages/filelock/_unix.py diff --git a/lib/python3.11/site-packages/filelock/_util.py b/python/lib/python3.10/site-packages/filelock/_util.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_util.py rename to python/lib/python3.10/site-packages/filelock/_util.py diff --git a/lib/python3.11/site-packages/filelock/_windows.py b/python/lib/python3.10/site-packages/filelock/_windows.py similarity index 100% rename from lib/python3.11/site-packages/filelock/_windows.py rename to python/lib/python3.10/site-packages/filelock/_windows.py diff --git a/lib/python3.11/site-packages/filelock/py.typed b/python/lib/python3.10/site-packages/filelock/py.typed similarity index 100% rename from lib/python3.11/site-packages/filelock/py.typed rename to python/lib/python3.10/site-packages/filelock/py.typed diff --git a/lib/python3.11/site-packages/filelock/version.py b/python/lib/python3.10/site-packages/filelock/version.py similarity index 100% rename from lib/python3.11/site-packages/filelock/version.py rename to python/lib/python3.10/site-packages/filelock/version.py diff --git a/lib/python3.11/site-packages/flask/__init__.py b/python/lib/python3.10/site-packages/flask/__init__.py similarity index 100% rename from lib/python3.11/site-packages/flask/__init__.py rename to python/lib/python3.10/site-packages/flask/__init__.py diff --git a/lib/python3.11/site-packages/flask/__main__.py b/python/lib/python3.10/site-packages/flask/__main__.py similarity index 100% rename from lib/python3.11/site-packages/flask/__main__.py rename to python/lib/python3.10/site-packages/flask/__main__.py diff --git a/lib/python3.11/site-packages/flask/app.py b/python/lib/python3.10/site-packages/flask/app.py similarity index 100% rename from lib/python3.11/site-packages/flask/app.py rename to python/lib/python3.10/site-packages/flask/app.py diff --git a/lib/python3.11/site-packages/flask/blueprints.py b/python/lib/python3.10/site-packages/flask/blueprints.py similarity index 100% rename from lib/python3.11/site-packages/flask/blueprints.py rename to python/lib/python3.10/site-packages/flask/blueprints.py diff --git a/lib/python3.11/site-packages/flask/cli.py b/python/lib/python3.10/site-packages/flask/cli.py similarity index 100% rename from lib/python3.11/site-packages/flask/cli.py rename to python/lib/python3.10/site-packages/flask/cli.py diff --git a/lib/python3.11/site-packages/flask/config.py b/python/lib/python3.10/site-packages/flask/config.py similarity index 100% rename from lib/python3.11/site-packages/flask/config.py rename to python/lib/python3.10/site-packages/flask/config.py diff --git a/lib/python3.11/site-packages/flask/ctx.py b/python/lib/python3.10/site-packages/flask/ctx.py similarity index 100% rename from lib/python3.11/site-packages/flask/ctx.py rename to python/lib/python3.10/site-packages/flask/ctx.py diff --git a/lib/python3.11/site-packages/flask/debughelpers.py b/python/lib/python3.10/site-packages/flask/debughelpers.py similarity index 100% rename from lib/python3.11/site-packages/flask/debughelpers.py rename to python/lib/python3.10/site-packages/flask/debughelpers.py diff --git a/lib/python3.11/site-packages/flask/globals.py b/python/lib/python3.10/site-packages/flask/globals.py similarity index 100% rename from lib/python3.11/site-packages/flask/globals.py rename to python/lib/python3.10/site-packages/flask/globals.py diff --git a/lib/python3.11/site-packages/flask/helpers.py b/python/lib/python3.10/site-packages/flask/helpers.py similarity index 100% rename from lib/python3.11/site-packages/flask/helpers.py rename to python/lib/python3.10/site-packages/flask/helpers.py diff --git a/lib/python3.11/site-packages/flask/json/__init__.py b/python/lib/python3.10/site-packages/flask/json/__init__.py similarity index 100% rename from lib/python3.11/site-packages/flask/json/__init__.py rename to python/lib/python3.10/site-packages/flask/json/__init__.py diff --git a/lib/python3.11/site-packages/flask/json/provider.py b/python/lib/python3.10/site-packages/flask/json/provider.py similarity index 100% rename from lib/python3.11/site-packages/flask/json/provider.py rename to python/lib/python3.10/site-packages/flask/json/provider.py diff --git a/lib/python3.11/site-packages/flask/json/tag.py b/python/lib/python3.10/site-packages/flask/json/tag.py similarity index 100% rename from lib/python3.11/site-packages/flask/json/tag.py rename to python/lib/python3.10/site-packages/flask/json/tag.py diff --git a/lib/python3.11/site-packages/flask/logging.py b/python/lib/python3.10/site-packages/flask/logging.py similarity index 100% rename from lib/python3.11/site-packages/flask/logging.py rename to python/lib/python3.10/site-packages/flask/logging.py diff --git a/lib/python3.11/site-packages/flask/py.typed b/python/lib/python3.10/site-packages/flask/py.typed similarity index 100% rename from lib/python3.11/site-packages/flask/py.typed rename to python/lib/python3.10/site-packages/flask/py.typed diff --git a/lib/python3.11/site-packages/flask/scaffold.py b/python/lib/python3.10/site-packages/flask/scaffold.py similarity index 100% rename from lib/python3.11/site-packages/flask/scaffold.py rename to python/lib/python3.10/site-packages/flask/scaffold.py diff --git a/lib/python3.11/site-packages/flask/sessions.py b/python/lib/python3.10/site-packages/flask/sessions.py similarity index 100% rename from lib/python3.11/site-packages/flask/sessions.py rename to python/lib/python3.10/site-packages/flask/sessions.py diff --git a/lib/python3.11/site-packages/flask/signals.py b/python/lib/python3.10/site-packages/flask/signals.py similarity index 100% rename from lib/python3.11/site-packages/flask/signals.py rename to python/lib/python3.10/site-packages/flask/signals.py diff --git a/lib/python3.11/site-packages/flask/templating.py b/python/lib/python3.10/site-packages/flask/templating.py similarity index 100% rename from lib/python3.11/site-packages/flask/templating.py rename to python/lib/python3.10/site-packages/flask/templating.py diff --git a/lib/python3.11/site-packages/flask/testing.py b/python/lib/python3.10/site-packages/flask/testing.py similarity index 100% rename from lib/python3.11/site-packages/flask/testing.py rename to python/lib/python3.10/site-packages/flask/testing.py diff --git a/lib/python3.11/site-packages/flask/typing.py b/python/lib/python3.10/site-packages/flask/typing.py similarity index 100% rename from lib/python3.11/site-packages/flask/typing.py rename to python/lib/python3.10/site-packages/flask/typing.py diff --git a/lib/python3.11/site-packages/flask/views.py b/python/lib/python3.10/site-packages/flask/views.py similarity index 100% rename from lib/python3.11/site-packages/flask/views.py rename to python/lib/python3.10/site-packages/flask/views.py diff --git a/lib/python3.11/site-packages/flask/wrappers.py b/python/lib/python3.10/site-packages/flask/wrappers.py similarity index 100% rename from lib/python3.11/site-packages/flask/wrappers.py rename to python/lib/python3.10/site-packages/flask/wrappers.py diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER b/python/lib/python3.10/site-packages/idna-3.4.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/idna-3.4.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/idna-3.4.dist-info/LICENSE.md b/python/lib/python3.10/site-packages/idna-3.4.dist-info/LICENSE.md similarity index 100% rename from lib/python3.11/site-packages/idna-3.4.dist-info/LICENSE.md rename to python/lib/python3.10/site-packages/idna-3.4.dist-info/LICENSE.md diff --git a/lib/python3.11/site-packages/idna-3.4.dist-info/METADATA b/python/lib/python3.10/site-packages/idna-3.4.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/idna-3.4.dist-info/METADATA rename to python/lib/python3.10/site-packages/idna-3.4.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/idna-3.4.dist-info/RECORD b/python/lib/python3.10/site-packages/idna-3.4.dist-info/RECORD new file mode 100644 index 0000000..31b84fb --- /dev/null +++ b/python/lib/python3.10/site-packages/idna-3.4.dist-info/RECORD @@ -0,0 +1,23 @@ +idna-3.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.4.dist-info/LICENSE.md,sha256=otbk2UC9JNvnuWRc3hmpeSzFHbeuDVrNMBrIYMqj6DY,1523 +idna-3.4.dist-info/METADATA,sha256=8aLSf9MFS7oB26pZh2hprg7eJp0UJSc-3rpf_evp4DA,9830 +idna-3.4.dist-info/RECORD,, +idna-3.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna-3.4.dist-info/WHEEL,sha256=4TfKIB_xu-04bc2iKz6_zFt-gEFEEDU_31HGhqzOCE8,81 +idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +idna/__pycache__/__init__.cpython-310.pyc,, +idna/__pycache__/codec.cpython-310.pyc,, +idna/__pycache__/compat.cpython-310.pyc,, +idna/__pycache__/core.cpython-310.pyc,, +idna/__pycache__/idnadata.cpython-310.pyc,, +idna/__pycache__/intranges.cpython-310.pyc,, +idna/__pycache__/package_data.cpython-310.pyc,, +idna/__pycache__/uts46data.cpython-310.pyc,, +idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 +idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 +idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 +idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED b/python/lib/python3.10/site-packages/idna-3.4.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/idna-3.4.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/idna-3.4.dist-info/WHEEL b/python/lib/python3.10/site-packages/idna-3.4.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/idna-3.4.dist-info/WHEEL rename to python/lib/python3.10/site-packages/idna-3.4.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/idna/__init__.py b/python/lib/python3.10/site-packages/idna/__init__.py similarity index 100% rename from lib/python3.11/site-packages/idna/__init__.py rename to python/lib/python3.10/site-packages/idna/__init__.py diff --git a/lib/python3.11/site-packages/idna/codec.py b/python/lib/python3.10/site-packages/idna/codec.py similarity index 100% rename from lib/python3.11/site-packages/idna/codec.py rename to python/lib/python3.10/site-packages/idna/codec.py diff --git a/lib/python3.11/site-packages/idna/compat.py b/python/lib/python3.10/site-packages/idna/compat.py similarity index 100% rename from lib/python3.11/site-packages/idna/compat.py rename to python/lib/python3.10/site-packages/idna/compat.py diff --git a/lib/python3.11/site-packages/idna/core.py b/python/lib/python3.10/site-packages/idna/core.py similarity index 100% rename from lib/python3.11/site-packages/idna/core.py rename to python/lib/python3.10/site-packages/idna/core.py diff --git a/lib/python3.11/site-packages/idna/idnadata.py b/python/lib/python3.10/site-packages/idna/idnadata.py similarity index 100% rename from lib/python3.11/site-packages/idna/idnadata.py rename to python/lib/python3.10/site-packages/idna/idnadata.py diff --git a/lib/python3.11/site-packages/idna/intranges.py b/python/lib/python3.10/site-packages/idna/intranges.py similarity index 100% rename from lib/python3.11/site-packages/idna/intranges.py rename to python/lib/python3.10/site-packages/idna/intranges.py diff --git a/lib/python3.11/site-packages/idna/package_data.py b/python/lib/python3.10/site-packages/idna/package_data.py similarity index 100% rename from lib/python3.11/site-packages/idna/package_data.py rename to python/lib/python3.10/site-packages/idna/package_data.py diff --git a/lib/python3.11/site-packages/idna/py.typed b/python/lib/python3.10/site-packages/idna/py.typed similarity index 100% rename from lib/python3.11/site-packages/idna/py.typed rename to python/lib/python3.10/site-packages/idna/py.typed diff --git a/lib/python3.11/site-packages/idna/uts46data.py b/python/lib/python3.10/site-packages/idna/uts46data.py similarity index 100% rename from lib/python3.11/site-packages/idna/uts46data.py rename to python/lib/python3.10/site-packages/idna/uts46data.py diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/METADATA b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/METADATA rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/RECORD b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/RECORD new file mode 100644 index 0000000..e963762 --- /dev/null +++ b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/RECORD @@ -0,0 +1,26 @@ +importlib_metadata-6.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-6.6.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-6.6.0.dist-info/METADATA,sha256=PkZEyOdZ2YQVAGc1nwMGJ2o6cs7hWeBL2Ya5NoyUGbA,4958 +importlib_metadata-6.6.0.dist-info/RECORD,, +importlib_metadata-6.6.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata-6.6.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +importlib_metadata-6.6.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=e_TtkQm2IsKEBa4H9j502DqMUZ-k6KQa53o9VX47ofs,29949 +importlib_metadata/__pycache__/__init__.cpython-310.pyc,, +importlib_metadata/__pycache__/_adapters.cpython-310.pyc,, +importlib_metadata/__pycache__/_collections.cpython-310.pyc,, +importlib_metadata/__pycache__/_compat.cpython-310.pyc,, +importlib_metadata/__pycache__/_functools.cpython-310.pyc,, +importlib_metadata/__pycache__/_itertools.cpython-310.pyc,, +importlib_metadata/__pycache__/_meta.cpython-310.pyc,, +importlib_metadata/__pycache__/_py39compat.cpython-310.pyc,, +importlib_metadata/__pycache__/_text.cpython-310.pyc,, +importlib_metadata/_adapters.py,sha256=i8S6Ib1OQjcILA-l4gkzktMZe18TaeUNI49PLRp6OBU,2454 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=VZUVAQntwXR1lZUYgZjOnXsV_B5mRV5FjNjwVP_EMSo,2096 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=I2AuaUMr5a6cTdZleV9WpyqUCSooqqV-zSzr1qn7FMw,1615 +importlib_metadata/_py39compat.py,sha256=2Tk5twb_VgLCY-1NEAQjdZp_S9OFMC-pUzP2isuaPsQ,1098 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt b/python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/importlib_metadata/__init__.py b/python/lib/python3.10/site-packages/importlib_metadata/__init__.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/__init__.py rename to python/lib/python3.10/site-packages/importlib_metadata/__init__.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_adapters.py b/python/lib/python3.10/site-packages/importlib_metadata/_adapters.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_adapters.py rename to python/lib/python3.10/site-packages/importlib_metadata/_adapters.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_collections.py b/python/lib/python3.10/site-packages/importlib_metadata/_collections.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_collections.py rename to python/lib/python3.10/site-packages/importlib_metadata/_collections.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_compat.py b/python/lib/python3.10/site-packages/importlib_metadata/_compat.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_compat.py rename to python/lib/python3.10/site-packages/importlib_metadata/_compat.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_functools.py b/python/lib/python3.10/site-packages/importlib_metadata/_functools.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_functools.py rename to python/lib/python3.10/site-packages/importlib_metadata/_functools.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_itertools.py b/python/lib/python3.10/site-packages/importlib_metadata/_itertools.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_itertools.py rename to python/lib/python3.10/site-packages/importlib_metadata/_itertools.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_meta.py b/python/lib/python3.10/site-packages/importlib_metadata/_meta.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_meta.py rename to python/lib/python3.10/site-packages/importlib_metadata/_meta.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_py39compat.py b/python/lib/python3.10/site-packages/importlib_metadata/_py39compat.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_py39compat.py rename to python/lib/python3.10/site-packages/importlib_metadata/_py39compat.py diff --git a/lib/python3.11/site-packages/importlib_metadata/_text.py b/python/lib/python3.10/site-packages/importlib_metadata/_text.py similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/_text.py rename to python/lib/python3.10/site-packages/importlib_metadata/_text.py diff --git a/lib/python3.11/site-packages/importlib_metadata/py.typed b/python/lib/python3.10/site-packages/importlib_metadata/py.typed similarity index 100% rename from lib/python3.11/site-packages/importlib_metadata/py.typed rename to python/lib/python3.10/site-packages/importlib_metadata/py.typed diff --git a/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/INSTALLER b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER similarity index 100% rename from lib/python3.11/site-packages/mutagen-1.46.0.dist-info/INSTALLER rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/RECORD b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/RECORD new file mode 100644 index 0000000..156b2ca --- /dev/null +++ b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/RECORD @@ -0,0 +1,24 @@ +itsdangerous-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.1.2.dist-info/LICENSE.rst,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.1.2.dist-info/METADATA,sha256=ThrHIJQ_6XlfbDMCAVe_hawT7IXiIxnTBIDrwxxtucQ,2928 +itsdangerous-2.1.2.dist-info/RECORD,, +itsdangerous-2.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous-2.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +itsdangerous-2.1.2.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13 +itsdangerous/__init__.py,sha256=n4mkyjlIVn23pgsgCIw0MJKPdcHIetyeRpe5Fwsn8qg,876 +itsdangerous/__pycache__/__init__.cpython-310.pyc,, +itsdangerous/__pycache__/_json.cpython-310.pyc,, +itsdangerous/__pycache__/encoding.cpython-310.pyc,, +itsdangerous/__pycache__/exc.cpython-310.pyc,, +itsdangerous/__pycache__/serializer.cpython-310.pyc,, +itsdangerous/__pycache__/signer.cpython-310.pyc,, +itsdangerous/__pycache__/timed.cpython-310.pyc,, +itsdangerous/__pycache__/url_safe.cpython-310.pyc,, +itsdangerous/_json.py,sha256=wIhs_7-_XZolmyr-JvKNiy_LgAcfevYR0qhCVdlIhg8,450 +itsdangerous/encoding.py,sha256=pgh86snHC76dPLNCnPlrjR5SaYL_M8H-gWRiiLNbhCU,1419 +itsdangerous/exc.py,sha256=VFxmP2lMoSJFqxNMzWonqs35ROII4-fvCBfG0v1Tkbs,3206 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=zgZ1-U705jHDpt62x_pmLJdryEKDNAbt5UkJtnkcCSw,11144 +itsdangerous/signer.py,sha256=QUH0iX0in-OTptMAXKU5zWMwmOCXn1fsDsubXiGdFN4,9367 +itsdangerous/timed.py,sha256=5CBWLds4Nm8-3bFVC8RxNzFjx6PSwjch8wuZ5cwcHFI,8174 +itsdangerous/url_safe.py,sha256=5bC4jSKOjWNRkWrFseifWVXUnHnPgwOLROjiOwb-eeo,2402 diff --git a/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/REQUESTED b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/mutagen-1.46.0.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/mutagen-1.46.0.dist-info/WHEEL b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/mutagen-1.46.0.dist-info/WHEEL rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt b/python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/itsdangerous/__init__.py b/python/lib/python3.10/site-packages/itsdangerous/__init__.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/__init__.py rename to python/lib/python3.10/site-packages/itsdangerous/__init__.py diff --git a/lib/python3.11/site-packages/itsdangerous/_json.py b/python/lib/python3.10/site-packages/itsdangerous/_json.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/_json.py rename to python/lib/python3.10/site-packages/itsdangerous/_json.py diff --git a/lib/python3.11/site-packages/itsdangerous/encoding.py b/python/lib/python3.10/site-packages/itsdangerous/encoding.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/encoding.py rename to python/lib/python3.10/site-packages/itsdangerous/encoding.py diff --git a/lib/python3.11/site-packages/itsdangerous/exc.py b/python/lib/python3.10/site-packages/itsdangerous/exc.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/exc.py rename to python/lib/python3.10/site-packages/itsdangerous/exc.py diff --git a/lib/python3.11/site-packages/itsdangerous/py.typed b/python/lib/python3.10/site-packages/itsdangerous/py.typed similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/py.typed rename to python/lib/python3.10/site-packages/itsdangerous/py.typed diff --git a/lib/python3.11/site-packages/itsdangerous/serializer.py b/python/lib/python3.10/site-packages/itsdangerous/serializer.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/serializer.py rename to python/lib/python3.10/site-packages/itsdangerous/serializer.py diff --git a/lib/python3.11/site-packages/itsdangerous/signer.py b/python/lib/python3.10/site-packages/itsdangerous/signer.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/signer.py rename to python/lib/python3.10/site-packages/itsdangerous/signer.py diff --git a/lib/python3.11/site-packages/itsdangerous/timed.py b/python/lib/python3.10/site-packages/itsdangerous/timed.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/timed.py rename to python/lib/python3.10/site-packages/itsdangerous/timed.py diff --git a/lib/python3.11/site-packages/itsdangerous/url_safe.py b/python/lib/python3.10/site-packages/itsdangerous/url_safe.py similarity index 100% rename from lib/python3.11/site-packages/itsdangerous/url_safe.py rename to python/lib/python3.10/site-packages/itsdangerous/url_safe.py diff --git a/lib/python3.11/site-packages/jinja2/__init__.py b/python/lib/python3.10/site-packages/jinja2/__init__.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/__init__.py rename to python/lib/python3.10/site-packages/jinja2/__init__.py diff --git a/lib/python3.11/site-packages/jinja2/_identifier.py b/python/lib/python3.10/site-packages/jinja2/_identifier.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/_identifier.py rename to python/lib/python3.10/site-packages/jinja2/_identifier.py diff --git a/lib/python3.11/site-packages/jinja2/async_utils.py b/python/lib/python3.10/site-packages/jinja2/async_utils.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/async_utils.py rename to python/lib/python3.10/site-packages/jinja2/async_utils.py diff --git a/lib/python3.11/site-packages/jinja2/bccache.py b/python/lib/python3.10/site-packages/jinja2/bccache.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/bccache.py rename to python/lib/python3.10/site-packages/jinja2/bccache.py diff --git a/lib/python3.11/site-packages/jinja2/compiler.py b/python/lib/python3.10/site-packages/jinja2/compiler.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/compiler.py rename to python/lib/python3.10/site-packages/jinja2/compiler.py diff --git a/lib/python3.11/site-packages/jinja2/constants.py b/python/lib/python3.10/site-packages/jinja2/constants.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/constants.py rename to python/lib/python3.10/site-packages/jinja2/constants.py diff --git a/lib/python3.11/site-packages/jinja2/debug.py b/python/lib/python3.10/site-packages/jinja2/debug.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/debug.py rename to python/lib/python3.10/site-packages/jinja2/debug.py diff --git a/lib/python3.11/site-packages/jinja2/defaults.py b/python/lib/python3.10/site-packages/jinja2/defaults.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/defaults.py rename to python/lib/python3.10/site-packages/jinja2/defaults.py diff --git a/lib/python3.11/site-packages/jinja2/environment.py b/python/lib/python3.10/site-packages/jinja2/environment.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/environment.py rename to python/lib/python3.10/site-packages/jinja2/environment.py diff --git a/lib/python3.11/site-packages/jinja2/exceptions.py b/python/lib/python3.10/site-packages/jinja2/exceptions.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/exceptions.py rename to python/lib/python3.10/site-packages/jinja2/exceptions.py diff --git a/lib/python3.11/site-packages/jinja2/ext.py b/python/lib/python3.10/site-packages/jinja2/ext.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/ext.py rename to python/lib/python3.10/site-packages/jinja2/ext.py diff --git a/lib/python3.11/site-packages/jinja2/filters.py b/python/lib/python3.10/site-packages/jinja2/filters.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/filters.py rename to python/lib/python3.10/site-packages/jinja2/filters.py diff --git a/lib/python3.11/site-packages/jinja2/idtracking.py b/python/lib/python3.10/site-packages/jinja2/idtracking.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/idtracking.py rename to python/lib/python3.10/site-packages/jinja2/idtracking.py diff --git a/lib/python3.11/site-packages/jinja2/lexer.py b/python/lib/python3.10/site-packages/jinja2/lexer.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/lexer.py rename to python/lib/python3.10/site-packages/jinja2/lexer.py diff --git a/lib/python3.11/site-packages/jinja2/loaders.py b/python/lib/python3.10/site-packages/jinja2/loaders.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/loaders.py rename to python/lib/python3.10/site-packages/jinja2/loaders.py diff --git a/lib/python3.11/site-packages/jinja2/meta.py b/python/lib/python3.10/site-packages/jinja2/meta.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/meta.py rename to python/lib/python3.10/site-packages/jinja2/meta.py diff --git a/lib/python3.11/site-packages/jinja2/nativetypes.py b/python/lib/python3.10/site-packages/jinja2/nativetypes.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/nativetypes.py rename to python/lib/python3.10/site-packages/jinja2/nativetypes.py diff --git a/lib/python3.11/site-packages/jinja2/nodes.py b/python/lib/python3.10/site-packages/jinja2/nodes.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/nodes.py rename to python/lib/python3.10/site-packages/jinja2/nodes.py diff --git a/lib/python3.11/site-packages/jinja2/optimizer.py b/python/lib/python3.10/site-packages/jinja2/optimizer.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/optimizer.py rename to python/lib/python3.10/site-packages/jinja2/optimizer.py diff --git a/lib/python3.11/site-packages/jinja2/parser.py b/python/lib/python3.10/site-packages/jinja2/parser.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/parser.py rename to python/lib/python3.10/site-packages/jinja2/parser.py diff --git a/lib/python3.11/site-packages/jinja2/py.typed b/python/lib/python3.10/site-packages/jinja2/py.typed similarity index 100% rename from lib/python3.11/site-packages/jinja2/py.typed rename to python/lib/python3.10/site-packages/jinja2/py.typed diff --git a/lib/python3.11/site-packages/jinja2/runtime.py b/python/lib/python3.10/site-packages/jinja2/runtime.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/runtime.py rename to python/lib/python3.10/site-packages/jinja2/runtime.py diff --git a/lib/python3.11/site-packages/jinja2/sandbox.py b/python/lib/python3.10/site-packages/jinja2/sandbox.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/sandbox.py rename to python/lib/python3.10/site-packages/jinja2/sandbox.py diff --git a/lib/python3.11/site-packages/jinja2/tests.py b/python/lib/python3.10/site-packages/jinja2/tests.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/tests.py rename to python/lib/python3.10/site-packages/jinja2/tests.py diff --git a/lib/python3.11/site-packages/jinja2/utils.py b/python/lib/python3.10/site-packages/jinja2/utils.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/utils.py rename to python/lib/python3.10/site-packages/jinja2/utils.py diff --git a/lib/python3.11/site-packages/jinja2/visitor.py b/python/lib/python3.10/site-packages/jinja2/visitor.py similarity index 100% rename from lib/python3.11/site-packages/jinja2/visitor.py rename to python/lib/python3.10/site-packages/jinja2/visitor.py diff --git a/lib/python3.11/site-packages/markupsafe/__init__.py b/python/lib/python3.10/site-packages/markupsafe/__init__.py similarity index 100% rename from lib/python3.11/site-packages/markupsafe/__init__.py rename to python/lib/python3.10/site-packages/markupsafe/__init__.py diff --git a/lib/python3.11/site-packages/markupsafe/_native.py b/python/lib/python3.10/site-packages/markupsafe/_native.py similarity index 100% rename from lib/python3.11/site-packages/markupsafe/_native.py rename to python/lib/python3.10/site-packages/markupsafe/_native.py diff --git a/lib/python3.11/site-packages/markupsafe/_speedups.c b/python/lib/python3.10/site-packages/markupsafe/_speedups.c similarity index 100% rename from lib/python3.11/site-packages/markupsafe/_speedups.c rename to python/lib/python3.10/site-packages/markupsafe/_speedups.c diff --git a/python/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so b/python/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..b95b9d1d2afc9cf98b0c01f167ffa35cffe761e6 GIT binary patch literal 44240 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.7 +License-File: LICENSE.txt + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +We release updates regularly, with a new version every 3 months. Find more details in our documentation: + +* `Release notes`_ +* `Release process`_ + +In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right. + +**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3. + +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Development documentation`_ +* `Development mailing list`_ +* `Development IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installation/ +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Development documentation: https://pip.pypa.io/en/latest/development +.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html +.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020 +.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html +.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/ +.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa +.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev +.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md + + diff --git a/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD new file mode 100644 index 0000000..683a938 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD @@ -0,0 +1,1037 @@ +../../../bin/pip,sha256=mOhgxQUxbvpXOyHoT1DAzpxDdW7TWwQ0egrY4VJkgDw,252 +../../../bin/pip3,sha256=mOhgxQUxbvpXOyHoT1DAzpxDdW7TWwQ0egrY4VJkgDw,252 +../../../bin/pip3.10,sha256=mOhgxQUxbvpXOyHoT1DAzpxDdW7TWwQ0egrY4VJkgDw,252 +../../../bin/pip3.10,sha256=mOhgxQUxbvpXOyHoT1DAzpxDdW7TWwQ0egrY4VJkgDw,252 +pip-22.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-22.0.2.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 +pip-22.0.2.dist-info/METADATA,sha256=Yixa0LKkyzjT2N5JQO5qYDgZcmTs6Z6dg4UbwBNyT2A,4166 +pip-22.0.2.dist-info/RECORD,, +pip-22.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip-22.0.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +pip-22.0.2.dist-info/entry_points.txt,sha256=vUvIlB_ga0fFQuWvFEq6uJKftMG_HNuoe4kgXkb5rNY,126 +pip-22.0.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=PZBF-ESk5Q0DZxQd4HHmTU_wX8y1ynzxBCRdu_fxHSI,357 +pip/__main__.py,sha256=mXwWDftNLMKfwVqKFWGE_uuBZvGSIiUELhLkeysIuZc,1198 +pip/__pycache__/__init__.cpython-310.pyc,, +pip/__pycache__/__main__.cpython-310.pyc,, +pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 +pip/_internal/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/__pycache__/build_env.cpython-310.pyc,, +pip/_internal/__pycache__/cache.cpython-310.pyc,, +pip/_internal/__pycache__/configuration.cpython-310.pyc,, +pip/_internal/__pycache__/exceptions.cpython-310.pyc,, +pip/_internal/__pycache__/main.cpython-310.pyc,, +pip/_internal/__pycache__/pyproject.cpython-310.pyc,, +pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc,, +pip/_internal/__pycache__/wheel_builder.cpython-310.pyc,, +pip/_internal/build_env.py,sha256=QAsnxJFvj74jS2cZUcxk7zXLvrtAYiRL0EkSPkpSJTo,9739 +pip/_internal/cache.py,sha256=71eaYwrls34HJ6gzbmmYiotiKhPNFTM_tqYJXD5nf3s,9441 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-310.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc,, +pip/_internal/cli/__pycache__/command_context.cpython-310.pyc,, +pip/_internal/cli/__pycache__/main.cpython-310.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-310.pyc,, +pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc,, +pip/_internal/cli/__pycache__/req_command.cpython-310.pyc,, +pip/_internal/cli/__pycache__/spinners.cpython-310.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc,, +pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 +pip/_internal/cli/base_command.py,sha256=6IVFmOjObv0ILip28QcgP8glhXHiGRvU_9kO35Hr7Z0,8037 +pip/_internal/cli/cmdoptions.py,sha256=GT2G2YKBj-851qGseugn2Veq7fJe3FA30gWdcziPQvo,28525 +pip/_internal/cli/command_context.py,sha256=a1pBBvvGLDiZ1Kw64_4tT6HmRTwYDoYy8JFgG5Czn7s,760 +pip/_internal/cli/main.py,sha256=ioJ8IVlb2K1qLOxR-tXkee9lURhYV89CDM71MKag7YY,2472 +pip/_internal/cli/main_parser.py,sha256=Q9TnytfuC5Z2JSjBFWVGtEdYLFy7rukNIb04movHdAo,2614 +pip/_internal/cli/parser.py,sha256=CDXTuFr2UD8ozOlZYf1KDziQdo9-X_IaYOiUcyJQwrA,10788 +pip/_internal/cli/progress_bars.py,sha256=_52w11WoZrvDSR3oItLWvLrEZFUKAfLf4Y6I6WtOnIU,10339 +pip/_internal/cli/req_command.py,sha256=VwqonOy18QwZsRsVjHhp-6w15fG9x3Ltwoa8yJqQno8,18669 +pip/_internal/cli/spinners.py,sha256=TFhjxtOnLeNJ5YmRvQm4eKPgPbJNkZiqO8jOXuxRaYU,5076 +pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 +pip/_internal/commands/__init__.py,sha256=Vc1HjsLEtyCh7506OozPHPKXe2Hk-z9cFkFF3BMj1lM,3736 +pip/_internal/commands/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/commands/__pycache__/cache.cpython-310.pyc,, +pip/_internal/commands/__pycache__/check.cpython-310.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-310.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-310.pyc,, +pip/_internal/commands/__pycache__/debug.cpython-310.pyc,, +pip/_internal/commands/__pycache__/download.cpython-310.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-310.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-310.pyc,, +pip/_internal/commands/__pycache__/help.cpython-310.pyc,, +pip/_internal/commands/__pycache__/index.cpython-310.pyc,, +pip/_internal/commands/__pycache__/install.cpython-310.pyc,, +pip/_internal/commands/__pycache__/list.cpython-310.pyc,, +pip/_internal/commands/__pycache__/search.cpython-310.pyc,, +pip/_internal/commands/__pycache__/show.cpython-310.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/commands/cache.py,sha256=p9gvc6W_xgxE2zO0o8NXqO1gGJEinEK42qEC-a7Cnuk,7524 +pip/_internal/commands/check.py,sha256=0gjXR7j36xJT5cs2heYU_dfOfpnFfzX8OoPNNoKhqdM,1685 +pip/_internal/commands/completion.py,sha256=kTG_I1VR3N5kGC4Ma9pQTSoY9Q1URCrNyseHSQ-rCL4,2958 +pip/_internal/commands/configuration.py,sha256=arE8vLstjBg-Ar1krXF-bBmT1qBtnL7Fpk-NVh38a0U,8944 +pip/_internal/commands/debug.py,sha256=krET-y45CnQzXwKR1qA3M_tJE4LE2vnQtm3yfGyDSnE,6629 +pip/_internal/commands/download.py,sha256=gVIAEOcpWolhRj9hl89Qzn52G2b_pcZ8naXhxaXobdo,4942 +pip/_internal/commands/freeze.py,sha256=PaJJB9mT_3vHeZ3mbFL_m1fzTYL-_Or3kDtXwTdZZ-A,2968 +pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 +pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 +pip/_internal/commands/index.py,sha256=8pYkICUJlccjm3E83b7UuZ5DtOfLh1N7ZHXAgkajjHo,4849 +pip/_internal/commands/install.py,sha256=YVygBF6vfrNi0jmdNBCM6bcoWb7vaALEGG1--8Mmf88,27893 +pip/_internal/commands/list.py,sha256=aKt1PP7enTiNLD_1qDXXaIKQ2QvLmUDfoQU6SYxJ8Ek,12318 +pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 +pip/_internal/commands/show.py,sha256=2VicM3jF0YWgn4O1jG_QF5oxOT0ln57VDu1NE6hqWcM,5859 +pip/_internal/commands/uninstall.py,sha256=DNTYAGJNljMO_YYBxrpcwj0FEl7lo_P55_98O6g2TNk,3526 +pip/_internal/commands/wheel.py,sha256=7HAjLclZxIzBrX6JmhmGBVxH5xrjaBYCtSdpQi1pWCE,6206 +pip/_internal/configuration.py,sha256=qmCX3uuVM73PQeAuWQHic22bhops8s31B8k02nFAoiQ,13171 +pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 +pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/distributions/__pycache__/base.cpython-310.pyc,, +pip/_internal/distributions/__pycache__/installed.cpython-310.pyc,, +pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc,, +pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/distributions/base.py,sha256=3FUYD8Gb4YuSu3pggC_FRctZBDbpm5ZK89tPksIUjoE,1172 +pip/_internal/distributions/installed.py,sha256=HzfNRu3smoOm54m8H2iK6LHzBx6_DEnka4OPEsizbXg,680 +pip/_internal/distributions/sdist.py,sha256=0nJvU1RhZtbwaeYtLbzSwYrbGRcY6IgNsWdEhAHROK8,5499 +pip/_internal/distributions/wheel.py,sha256=-NgzdIs-w_hcer_U81yzgpVTljJRg5m79xufqvbjv0s,1115 +pip/_internal/exceptions.py,sha256=U-dV1ixkSz6NAU6Aw9dosKi2EzZ5D3BA7ilYZuTLKeU,20912 +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/index/__pycache__/collector.cpython-310.pyc,, +pip/_internal/index/__pycache__/package_finder.cpython-310.pyc,, +pip/_internal/index/__pycache__/sources.cpython-310.pyc,, +pip/_internal/index/collector.py,sha256=8kXlmlnZ-qAknyxd0duCn5mxFHX-zr468ykutk8WOwo,21392 +pip/_internal/index/package_finder.py,sha256=9UVg-7582nYNEWa0cIIl8otzPm4mlfyrQVuozAcssLo,36783 +pip/_internal/index/sources.py,sha256=SVyPitv08-Qalh2_Bk5diAJ9GAA_d-a93koouQodAG0,6557 +pip/_internal/locations/__init__.py,sha256=ergvPwlfNTmQYFmaRYbj--ZwTN5izgTL9KE5d0FB7-8,17362 +pip/_internal/locations/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc,, +pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc,, +pip/_internal/locations/__pycache__/base.cpython-310.pyc,, +pip/_internal/locations/_distutils.py,sha256=Sk7tw8ZP1DWMYJ8MibABsa8IME2Ejv1PKeGlYQCBTZc,5871 +pip/_internal/locations/_sysconfig.py,sha256=LQNKTJKyjVqxXaPntlBwdUqTG1xwYf6GVCKMbyRJx5M,7918 +pip/_internal/locations/base.py,sha256=x5D1ONktmPJd8nnUTh-ELsAJ7fiXA-k-0a_vhfi2_Us,1579 +pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 +pip/_internal/metadata/__init__.py,sha256=iGoDbe_iTXQTIAEVy9f7dm-VQfZANO8kkwFr1CpqxqI,2036 +pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/metadata/__pycache__/base.cpython-310.pyc,, +pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc,, +pip/_internal/metadata/base.py,sha256=SCRPtShrtPy0lfFxuaFTgJJHsRXToGFToQUAZoBBbeA,19429 +pip/_internal/metadata/pkg_resources.py,sha256=wAnEtrcgH9YtV996MfoBjR2hGLHvi3uxk0vUOHbqBak,9456 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-310.pyc,, +pip/_internal/models/__pycache__/direct_url.cpython-310.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-310.pyc,, +pip/_internal/models/__pycache__/index.cpython-310.pyc,, +pip/_internal/models/__pycache__/link.cpython-310.pyc,, +pip/_internal/models/__pycache__/scheme.cpython-310.pyc,, +pip/_internal/models/__pycache__/search_scope.cpython-310.pyc,, +pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc,, +pip/_internal/models/__pycache__/target_python.cpython-310.pyc,, +pip/_internal/models/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990 +pip/_internal/models/direct_url.py,sha256=7XtGQSLLDQb5ZywI2EMnnLcddtf5CJLx44lMtTHPxFw,6350 +pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 +pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 +pip/_internal/models/link.py,sha256=hoT_qsOBAgLBm9GKqpBrNF_mrEXeGXQE-aH_RX2cGgg,9817 +pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 +pip/_internal/models/search_scope.py,sha256=LwloG0PJAmtI1hFXIypsD95kWE9xfR5hf_a2v1Vw7sk,4520 +pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 +pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 +pip/_internal/models/wheel.py,sha256=wlyz23BcZ40nBLX3rXKtrV6tmc8-8RxHyV-hq5zJ74Q,3525 +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/network/__pycache__/auth.cpython-310.pyc,, +pip/_internal/network/__pycache__/cache.cpython-310.pyc,, +pip/_internal/network/__pycache__/download.cpython-310.pyc,, +pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc,, +pip/_internal/network/__pycache__/session.cpython-310.pyc,, +pip/_internal/network/__pycache__/utils.cpython-310.pyc,, +pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc,, +pip/_internal/network/auth.py,sha256=a3C7Xaa8kTJjXkdi_wrUjqaySc8Z9Yz7U6QIbXfzMyc,12190 +pip/_internal/network/cache.py,sha256=FJ3uTUo3wgf2KHmeZ3ltN9x3tQoy_0X6qNsRtNXsuL0,2131 +pip/_internal/network/download.py,sha256=12Ef_L7MlhNUN_0-n_3DggozWJER8c9J0us16cbvkKA,6062 +pip/_internal/network/lazy_wheel.py,sha256=1b8ZJ1w4bSBzpGzGwJR_CL2yQ6AFIwWQkS1vbPPw2XU,7627 +pip/_internal/network/session.py,sha256=38IKGKC64MTVUIH5XOR1hr2pOCzp39RccykdmGAvqRU,16729 +pip/_internal/network/utils.py,sha256=igLlTu_-q0LmL8FdJKq-Uj7AT_owrQ-T9FfyarkhK5U,4059 +pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/operations/__pycache__/check.cpython-310.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-310.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-310.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc,, +pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc,, +pip/_internal/operations/build/metadata.py,sha256=ES_uRmAvhrNm_nDTpZxshBfUsvnXtkj-g_4rZrH9Rww,1404 +pip/_internal/operations/build/metadata_editable.py,sha256=_Rai0VZjxoeJUkjkuICrq45LtjwFoDOveosMYH43rKc,1456 +pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 +pip/_internal/operations/build/wheel.py,sha256=AO9XnTGhTgHtZmU8Dkbfo1OGr41rBuSDjIgAa4zUKgE,1063 +pip/_internal/operations/build/wheel_editable.py,sha256=TVETY-L_M_dSEKBhTIcQOP75zKVXw8tuq1U354Mm30A,1405 +pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 +pip/_internal/operations/check.py,sha256=ca4O9CkPt9Em9sLCf3H0iVt1GIcW7M8C0U5XooaBuT4,5109 +pip/_internal/operations/freeze.py,sha256=ZiYw5GlUpLVx4VJHz4S1AP2JFNyvH0iq5kpcYj2ovyw,9770 +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc,, +pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc,, +pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=ee4kfJHNuzTdKItbfAsNOSEwq_vD7DRPGkBdK48yBhU,1354 +pip/_internal/operations/install/legacy.py,sha256=x7BG8kBm0K3JO6AR4sBl0zh2LOrfUaz7EdNt-keHBv4,4091 +pip/_internal/operations/install/wheel.py,sha256=QuQyCZE-XjuJjDYRixo40oUt2ucFhNmSrCbcXY7A9aE,27412 +pip/_internal/operations/prepare.py,sha256=LJP97jsuiCAaTGVIRrcINvxc1ntVsB45MoRbyMIukg4,24145 +pip/_internal/pyproject.py,sha256=Wm2ljdT6spC-tSdf1LBRaMYSJaXr1xUxV3OwdHCW9jc,6722 +pip/_internal/req/__init__.py,sha256=A7mUvT1KAcCYP3H7gUOTx2GRMlgoDur3H68Q0OJqM5A,2793 +pip/_internal/req/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-310.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-310.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-310.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-310.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc,, +pip/_internal/req/constructors.py,sha256=fXmtNI_J77JFP_HRvYcQW-1nKw3AiUu6Q3b1Nm8aMm0,16094 +pip/_internal/req/req_file.py,sha256=5N8OTouPCof-305StC2YK9HBxQMw-xO46skRoBPbkZo,17421 +pip/_internal/req/req_install.py,sha256=jU1HQBT_DnXZean7jY8wPNMhb6_CzdKHcilHFY_o-Fc,32524 +pip/_internal/req/req_set.py,sha256=kHYiLvkKRx21WaLTwOI-54Ng0SSzZZ9SE7FD0PsfvYA,7584 +pip/_internal/req/req_tracker.py,sha256=jK7JDu-Wt73X-gqozrFtgJVlUlnQo0P4IQ4x4_gPlfM,4117 +pip/_internal/req/req_uninstall.py,sha256=K2BHYRRJAfkSpFqcPzc9XfX2EvbhaRtQIPRFmMtUdfo,23814 +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/resolution/__pycache__/base.cpython-310.pyc,, +pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=b7bf5qL1ROg73sl8dhTvLdD1w5XF8xybBAF6eF_kz7c,18288 +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220 +pip/_internal/resolution/resolvelib/candidates.py,sha256=KR5jxZRSahByOABXbwrX-zNoawa7Gm9Iss-HrvrcvNw,18357 +pip/_internal/resolution/resolvelib/factory.py,sha256=0bbxnUSSjaeTmtIEgeeKtEqhEFfNhv3xpq7j9IaMq2c,28298 +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 +pip/_internal/resolution/resolvelib/provider.py,sha256=LzQQyzMVaZYAwLgKInbq-it6mbQL1gX0hGohz5Cr5wg,9915 +pip/_internal/resolution/resolvelib/reporter.py,sha256=3ZVVYrs5PqvLFJkGLcuXoMK5mTInFzl31xjUpDBpZZk,2526 +pip/_internal/resolution/resolvelib/requirements.py,sha256=B1ndvKPSuyyyTEXt9sKhbwminViSWnBrJa7qO2ln4Z0,5455 +pip/_internal/resolution/resolvelib/resolver.py,sha256=ucoVKHtwH6gkZjcfIVJbUiOIHLqJxeYlrKTMIJciYwM,11335 +pip/_internal/self_outdated_check.py,sha256=GKSatNlt2cz_CMGxu72FbUzuPaXpWOnIVKOOYIk0gvY,6849 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/utils/__pycache__/_log.cpython-310.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-310.pyc,, +pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc,, +pip/_internal/utils/__pycache__/datetime.cpython-310.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc,, +pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc,, +pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc,, +pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-310.pyc,, +pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc,, +pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-310.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-310.pyc,, +pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-310.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-310.pyc,, +pip/_internal/utils/__pycache__/models.cpython-310.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-310.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc,, +pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc,, +pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc,, +pip/_internal/utils/__pycache__/urls.cpython-310.pyc,, +pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc,, +pip/_internal/utils/__pycache__/wheel.cpython-310.pyc,, +pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 +pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 +pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 +pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 +pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 +pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 +pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 +pip/_internal/utils/distutils_args.py,sha256=mcAscyp80vTt3xAGTipnpgc83V-_wCvydNELVXLq7JI,1249 +pip/_internal/utils/egg_link.py,sha256=5MVlpz5LirT4iLQq86OYzjXaYF0D4Qk1dprEI7ThST4,2203 +pip/_internal/utils/encoding.py,sha256=bdZ3YgUpaOEBI5MP4-DEXiQarCW3V0rxw1kRz-TaU1Q,1169 +pip/_internal/utils/entrypoints.py,sha256=aPvCnQVi9Hdk35Kloww_D5ibjUpqxgqcJP8O9VuMZek,1055 +pip/_internal/utils/filesystem.py,sha256=rrl-rY1w8TYyKYndUyZlE9ffkQyA4-jI9x_59zXkn5s,5893 +pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 +pip/_internal/utils/glibc.py,sha256=tDfwVYnJCOC0BNVpItpy8CGLP9BjkxFHdl0mTS0J7fc,3110 +pip/_internal/utils/hashes.py,sha256=anpZfFGIT6HcIj2td9NHtE8AWg6GeAIhwpP8GPvZE0E,4811 +pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 +pip/_internal/utils/logging.py,sha256=Rvght-fDXL70VWib1cpgZ3iU-kXODV98bNeLUlbqVto,11522 +pip/_internal/utils/misc.py,sha256=MdUB12BMhj73sEmskEutmPyWFaJB7asoPCfLzs_YeT0,19359 +pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 +pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 +pip/_internal/utils/setuptools_build.py,sha256=vNH9hQB9wT6d-h1hVQhBKw91jNeT42meHpVeii-urOI,5652 +pip/_internal/utils/subprocess.py,sha256=vIWGpet5ARBmZ2Qn4NEHNgzCOduqbPIuByZmhhmr6mM,9182 +pip/_internal/utils/temp_dir.py,sha256=zob3PYMVevONkheOMUp_4jDofrEY3HIu5DHK78cSspI,7662 +pip/_internal/utils/unpacking.py,sha256=HUFlMEyCa9dPwdLh6sWeh95DeKytV8rsOyKShEw9y6g,8906 +pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 +pip/_internal/utils/virtualenv.py,sha256=4_48qMzCwB_F5jIK5BC_ua7uiAMVifmQWU9NdaGUoVA,3459 +pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549 +pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 +pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-310.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc,, +pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc,, +pip/_internal/vcs/bazaar.py,sha256=IGb5ca1xSZfgegRD2_JeyoZPrQQHs7lEYEIgpVsKpoU,3047 +pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116 +pip/_internal/vcs/mercurial.py,sha256=Bzbd518Jsx-EJI0IhIobiQqiRsUv5TWYnrmRIFWE0Gw,5238 +pip/_internal/vcs/subversion.py,sha256=TEMRdwECvMcXakZX0pTNUep79kmBYkWDkWFkrYmcmac,11718 +pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 +pip/_internal/wheel_builder.py,sha256=65rOA8FSYt3c3HyqEw17uujjlCgqmoKEIv6rv9xN2NM,12307 +pip/_vendor/__init__.py,sha256=xjcBX0EP50pkaMdCssrsBXoZgo2hTtYxlcH1CIyA3T4,4708 +pip/_vendor/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/__pycache__/distro.cpython-310.pyc,, +pip/_vendor/__pycache__/six.cpython-310.pyc,, +pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=1j_YQfjmiix6YyouLrftC6NzksAm8e8xGSjMKMRPIkM,465 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379 +pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033 +pip/_vendor/cachecontrol/cache.py,sha256=eMS9Bn9JWQkHiIYA5GPRBqKVU95uS-yXkxrzpoafRig,917 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=gGFOtIH8QDRvkP4YAfGIh-u9YYcGZVxwLM1-6e1mPNI,170 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=P2KHcNXiqxEW7fCq5KC-NYHGSk0nNR9NIKuN-vBTn-E,4251 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=tu_YBV7EV8vdBRGazUErkoRqYYjSBmNcB8dZ7BNomqk,940 +pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778 +pip/_vendor/cachecontrol/controller.py,sha256=9DSEiV58Gx7Ce69fLCrRcpN-_sHzXTY4ol9bEviatR0,15625 +pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946 +pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 +pip/_vendor/cachecontrol/serialize.py,sha256=dlySaeA5U7Q5eHvjiObgo1M8j8_huVjfWjid7Aq-r8c,6783 +pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 +pip/_vendor/certifi/__init__.py,sha256=xWdRgntT3j1V95zkRipGOg_A1UfEju2FcpujhysZLRI,62 +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-310.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=-og4Keu4zSpgL5shwfhd4kz0eUnVILzrGCi0zRy2kGw,265969 +pip/_vendor/certifi/core.py,sha256=CcwptmiI-3M50jIdO0HT6Fh6W_wqGsf8QcX9yfzvyuc,2791 +pip/_vendor/chardet/__init__.py,sha256=mWZaWmvZkhwfBEAT9O1Y6nRTfKzhT7FHhQTTAujbqUA,3271 +pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-310.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=GZLReHP6FRRn43hvSOoGCxYamErKzyp6RgOQxVeC3kg,3839 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=XK5zqjUG2a4-y6eLHZ8ThYcp6WWUrdlmELxNypcc2SE,2747 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=40zr6wICZwknxyuLGGcIOPyve8DTebBCbbvttvnmp5Q,1200 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=rk9CJpuxO0bObboJcv6gNgWuosYZmd8qEEds5y7DS_Y,105697 +pip/_vendor/chardet/langgreekmodel.py,sha256=S-uNQ1ihC75yhBvSux24gLFZv3QyctMwC6OxLJdX-bw,99571 +pip/_vendor/chardet/langhebrewmodel.py,sha256=DzPP6TPGG_-PV7tqspu_d8duueqm7uN-5eQ0aHUw1Gg,98776 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RtJH7DZdsmaHqyK46Kkmnk5wQHiJwJPPJSqqIlpeZRc,102498 +pip/_vendor/chardet/langrussianmodel.py,sha256=THqJOhSxiTQcHboDNSc5yofc2koXXQFHFyjtyuntUfM,131180 +pip/_vendor/chardet/langthaimodel.py,sha256=R1wXHnUMtejpw0JnH_JO8XdYasME6wjVqp1zP7TKLgg,103312 +pip/_vendor/chardet/langturkishmodel.py,sha256=rfwanTptTwSycE4-P-QasPmzd-XVYgevytzjlEzBBu8,95946 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc,, +pip/_vendor/chardet/metadata/languages.py,sha256=41tLq3eLSrBEbEVVQpVGFq9K7o1ln9b1HpY1l0hCUQo,19474 +pip/_vendor/chardet/sbcharsetprober.py,sha256=nmyMyuxzG87DN6K3Rk2MUzJLMLR69MrWpdnHzOwVUwQ,6136 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=hqefQuXmiFyDBArOjujH6hd6WFXlOD1kWCsxDhjx5Vc,4309 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=DpZTXCX0nUHXxkQ9sr4GZxGB_hveZ6hWt3uM94cgWKs,12503 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=A4CILFAd8MRVG1HoXPp45iK9RLlWyV73a1EtwE8Tvn8,242 +pip/_vendor/colorama/__init__.py,sha256=pCdErryzLSzDW5P-rRPBlPLqbBtIRNJB6cMgoeJns5k,239 +pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +pip/_vendor/colorama/ansitowin32.py,sha256=yV7CEmCb19MjnJKODZEEvMH_fnbJhwnpzo4sxZuGXmA,10517 +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/distlib/__init__.py,sha256=y-rKDBB99QJ3N1PJGAXQo89ou615aAeBjV2brBxKgM8,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-310.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc,, +pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259 +pip/_vendor/distlib/database.py,sha256=hBO2dgvDF7W3BqX8Ecns6p_RPerCaIbNKbdUOuJ1a14,51456 +pip/_vendor/distlib/index.py,sha256=UfcimNW19AB7IKWam4VaJbXuCBvArKfSxhV16EwavzE,20739 +pip/_vendor/distlib/locators.py,sha256=4D2hEcHePNuW4mXEZ3Cuw12eW-vbO-4WuAlbf4h5K7w,51963 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058 +pip/_vendor/distlib/metadata.py,sha256=vatoxFdmBr6ie-sTVXVNPOPG3uwMDWJTnEECnm7xDCw,39109 +pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 +pip/_vendor/distlib/scripts.py,sha256=tjSwENINeV91ROZxec5zTSMRg2jEeKc4enyCHDzNvEE,17720 +pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 +pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 +pip/_vendor/distlib/wheel.py,sha256=pj5VVCjqZMcHvgizORWwAFPS7hOk61CZ59dxP8laQ4E,42943 +pip/_vendor/distro.py,sha256=O1EeHMq1-xAO373JI2_6pYEtd09yEkxtmrYkdY-9S-w,48414 +pip/_vendor/html5lib/__init__.py,sha256=BYzcKCqeEii52xDrqBFruhnmtmkiuHXFyFh-cglQ8mk,1160 +pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=ifOwF7pXqmyThIXc3boWc96s4MDezqRrRVp7FwDYUFs,16728 +pip/_vendor/html5lib/_inputstream.py,sha256=jErNASMlkgs7MpOM9Ve_VdLDJyFFweAjLuhVutZz33U,32353 +pip/_vendor/html5lib/_tokenizer.py,sha256=04mgA2sNTniutl2fxFv-ei5bns4iRaPxVXXHh_HrV_4,77040 +pip/_vendor/html5lib/_trie/__init__.py,sha256=nqfgO910329BEVJ5T4psVwQtjd2iJyEXQ2-X8c1YxwU,109 +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_utils.py,sha256=Dx9AKntksRjFT1veBj7I362pf5OgIaT0zglwq43RnfU,4931 +pip/_vendor/html5lib/constants.py,sha256=Ll-yzLU_jcjyAI_h57zkqZ7aQWE5t5xA4y_jQgoUUhw,83464 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-310.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=m6oGmkBhkGAnn2nV6D4hE78SCZ6WEnK9rKdZB3uXBIc,26897 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/html5parser.py,sha256=anr-aXre_ImfrkQ35c_rftKXxC80vJCREKe06Tq15HA,117186 +pip/_vendor/html5lib/serializer.py,sha256=_PpvcZF07cwE7xr9uKkZqh5f4UEaI8ltCU2xPJzaTpk,15759 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-310.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-310.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-310.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-310.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-310.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-310.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=z-o51vt9r_l2IDG5IioTOKGzZne4Fy3_Fc-7ztrOh4I,14565 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=w5ZFpKk6bAxnrwD2_BrF5EVC7vzz0L3LMi9Sxrbc_8w,12836 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9gqDjs-IxsPhBYa5cpvv2FZ1KZlG83Giusy2lFmvIkE,14766 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=OBPtc1TU5mGyy18QDMxKEyYEz0wxFUUNj5v0-XgmYhY,5719 +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-310.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=xo1L5m9VtkfpFJK0pFmkLVajhqYYVisVZn3k9kYpPkI,4551 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=_b0LAVWLcVu9WaU_-w3D8f0IRSpCbjf667V-3NRdhTw,6357 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 +pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc,, +pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 +pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 +pip/_vendor/idna/core.py,sha256=RFIkY-HhFZaDoBEFjGwyGd_vWI04uOAQjnzueMWqwOU,12795 +pip/_vendor/idna/idnadata.py,sha256=fzMzkCea2xieVxcrjngJ-2pLsKQNejPCZFlBajIuQdw,44025 +pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 +pip/_vendor/idna/package_data.py,sha256=szxQhV0ZD0nKJ84Kuobw3l8q4_KeCyXjFRdpwIpKZmw,21 +pip/_vendor/idna/uts46data.py,sha256=o-D7V-a0fOLZNd7tvxof6MYfUd0TBZzE2bLR5XO67xU,204400 +pip/_vendor/msgpack/__init__.py,sha256=2gJwcsTIaAtCM0GMi2rU-_Y6kILeeQuqRkrQ22jSANc,1118 +pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-310.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc,, +pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc,, +pip/_vendor/msgpack/_version.py,sha256=JpTcnRd3YUioA24NDtDZbLW0Nhl2yA-N1Rq2lLDBB-g,20 +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/ext.py,sha256=4l356Y4sVEcvCla2dh_cL57vh4GMhZfa3kuWHFHYz6A,6088 +pip/_vendor/msgpack/fallback.py,sha256=L5jriXysURbf6rPbbHbvXgvoFrKZiryIBmujMTcrf3A,34475 +pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 +pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 +pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-310.pyc,, +pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 +pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 +pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 +pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 +pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 +pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 +pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 +pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 +pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 +pip/_vendor/pep517/__init__.py,sha256=Y1bATL2qbFNN6M_DQa4yyrwqjpIiL-j9T6kBmR0DS14,130 +pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/build.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc,, +pip/_vendor/pep517/build.py,sha256=2bar6EdjwIz2Dlfy94qdxn3oA9mVnnny40mfoT5f-qI,3457 +pip/_vendor/pep517/check.py,sha256=bCORq1WrHjhpTONa-zpAqG0EB9rHNuhO1ORu6DsDuL8,6084 +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/compat.py,sha256=NmLImE5oiDT3gbEhJ4w7xeoMFcpAPrGu_NltBytSJUY,1253 +pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 +pip/_vendor/pep517/envbuild.py,sha256=zFde--rmzjXMLXcm7SA_3hDtgk5VCTA8hjpk88RbF6E,6100 +pip/_vendor/pep517/in_process/__init__.py,sha256=MyWoAi8JHdcBv7yXuWpUSVADbx6LSB9rZh7kTIgdA8Y,563 +pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc,, +pip/_vendor/pep517/in_process/_in_process.py,sha256=D3waguyNSGcwosociD5USfcycYr2RCzCjYtxX5UHQmQ,11201 +pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 +pip/_vendor/pep517/wrappers.py,sha256=impq7Cz_LL1iDF1iiOzYWB4MaEu6O6Gps7TJ5qsJz1Q,13429 +pip/_vendor/pkg_resources/__init__.py,sha256=NnpQ3g6BCHzpMgOR_OLBmYtniY4oOzdKpwqghfq_6ug,108287 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/platformdirs/__init__.py,sha256=Aizpxewwd4nY63Gqw-Od1Rso9Ah4bSoc6rkx-GBRu2Y,12676 +pip/_vendor/platformdirs/__main__.py,sha256=ZmsnTxEOxtTvwa-Y_Vfab_JN3X4XCVeN8X0yyy9-qnc,1176 +pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc,, +pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc,, +pip/_vendor/platformdirs/android.py,sha256=xhlD4NmrKCARe5lgnpBGYo4lOYxEOBOByNDNYy91gEE,4012 +pip/_vendor/platformdirs/api.py,sha256=MXKHXOL3eh_-trSok-JUTjAR_zjmmKF3rjREVABjP8s,4910 +pip/_vendor/platformdirs/macos.py,sha256=-3UXQewbT0yMhMdkzRXfXGAntmLIH7Qt4a9Hlf8I5_Y,2655 +pip/_vendor/platformdirs/unix.py,sha256=b4aVYTz0qZ50HntwOXo8r6tp82jAa3qTjxw-WlnC2yc,6910 +pip/_vendor/platformdirs/version.py,sha256=bXzLJCe23FNQRQrf7ZRWKejxWnct_wft7dxdkMGT33E,80 +pip/_vendor/platformdirs/windows.py,sha256=ISruopR5UGBePC0BxCxXevkZYfjJsIZc49YWU5iYfQ4,6439 +pip/_vendor/progress/__init__.py,sha256=1HejNZtv2ouUNQeStUDAtZrtwkz_3FmYKQ476hJ7zOs,5294 +pip/_vendor/progress/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-310.pyc,, +pip/_vendor/progress/__pycache__/colors.cpython-310.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-310.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-310.pyc,, +pip/_vendor/progress/bar.py,sha256=GbedY0oZ-Q1duXjmvVLO0tSf-uTSH7hJ3zzyI91Esws,2942 +pip/_vendor/progress/colors.py,sha256=cCYXQnYFYVmQKKmYEbQ_lj6SPSFzdw4FN98F2x2kR-U,2655 +pip/_vendor/progress/counter.py,sha256=zYt9DWH0_05s8Q9TrJwHVud-WwsyyaR3PwYtk5hxwwQ,1613 +pip/_vendor/progress/spinner.py,sha256=u5ElzW94XEiLGH-aAlr54VJtKfeK745xr6UfGvvflzU,1461 +pip/_vendor/pygments/__init__.py,sha256=CAmA9UthykwxvtutUcH0IxqtiyQcSg6CmYdM-jKlcRY,3002 +pip/_vendor/pygments/__main__.py,sha256=X7rGLMUC54EXgO14FZ9goKXZDmhPzKXTsUglmb_McIU,353 +pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/console.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/style.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/token.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc,, +pip/_vendor/pygments/__pycache__/util.cpython-310.pyc,, +pip/_vendor/pygments/cmdline.py,sha256=XpsyWgErcSqHC7rXiYKLF3Y61Uy8SR2DNQDDhZGuezg,23408 +pip/_vendor/pygments/console.py,sha256=QZXBUAkyl4dPLQ1e6XHjQu3mmXBWvuGQwsQT2q1mtCY,1697 +pip/_vendor/pygments/filter.py,sha256=35iMZiB1rcuogxokm92kViB2DPXPp_wWoxWuMmwvvzY,1938 +pip/_vendor/pygments/filters/__init__.py,sha256=-veOimzCyYGEARru2Dfo6ofSYcZ8tGsIVuMprtaZQ24,40292 +pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pygments/formatter.py,sha256=zSBbX2U_OOriy7SJvSTK6OAxjuXtROWxQlNpJEJZjBA,2917 +pip/_vendor/pygments/formatters/__init__.py,sha256=fjkYDy5-F998XczKi0ymHFayr5ObIRLHF8cgp9k8kpA,5119 +pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc,, +pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc,, +pip/_vendor/pygments/formatters/_mapping.py,sha256=3A1rYSjYN9MLduCFWy2_mYhllPVpwlw55anRYnPXX8w,6516 +pip/_vendor/pygments/formatters/bbcode.py,sha256=cSKMOioUnE4TzvCCsK4IbJ6G78W07ZwHtkz4V1Wte0U,3314 +pip/_vendor/pygments/formatters/groff.py,sha256=ULgMKvGeLswX0KZn3IBp0p0U3rruiSHBtpl6O5qbqLs,5005 +pip/_vendor/pygments/formatters/html.py,sha256=0jM7Jc4xA4tsjmPq35uklm_En_OVdcNb0__SEXp2pDQ,35330 +pip/_vendor/pygments/formatters/img.py,sha256=r4iag_jCfyv_LhIt-1fRDeVEEoAfVJzkD9nZChIwiS8,21819 +pip/_vendor/pygments/formatters/irc.py,sha256=gi_IeIZeNaTfTMtvseLigZdS6lNicN7r7O7rnI6myo0,5871 +pip/_vendor/pygments/formatters/latex.py,sha256=qZUerrHt2Nn2aB4gJcdqj99qBkIxl_1v1ukYsf230Gk,18930 +pip/_vendor/pygments/formatters/other.py,sha256=Q01LtkqPZ8m_EYdgMVzXPUGjHoL00lXI3By97wzytYU,5073 +pip/_vendor/pygments/formatters/pangomarkup.py,sha256=ZpjALTSuGFwviJd5kOYwr-1NgqxCX3XRJrjXC7x1UbQ,2212 +pip/_vendor/pygments/formatters/rtf.py,sha256=qh7-z_wbUsTY6z7fZUGrYECYBlWB0wEdBwIZVEVybL0,5014 +pip/_vendor/pygments/formatters/svg.py,sha256=T7Jj004I3JUPOr48aAhQ368K2qWCciUyMQ2tdU-LB-4,7335 +pip/_vendor/pygments/formatters/terminal.py,sha256=cRD5hitINOkYlGZo9ma252vpJYPSGNgLivrsm6zGyec,4674 +pip/_vendor/pygments/formatters/terminal256.py,sha256=Bvz9zZL3UWc94TDm1GhKMI4x0BTit0XplhyRL0zmtkw,11753 +pip/_vendor/pygments/lexer.py,sha256=ECXWlEsbRnKs_njozZns6BGQ4riTMzct_BzAr3zV6dY,31937 +pip/_vendor/pygments/lexers/__init__.py,sha256=6Ds0GVBP3jrIU02wmjRdpoL4eFGhwT2IVD1zf3cV5_Y,11307 +pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc,, +pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc,, +pip/_vendor/pygments/lexers/_mapping.py,sha256=jAxmvh5wvNkD-p3Fh6E7hY_B0sGbcxWRfseT6iq7ex4,70032 +pip/_vendor/pygments/lexers/python.py,sha256=LXnk43Lcngqn9xj6eRqdk2f73oF4kHZWiwgHMM_RlVM,52776 +pip/_vendor/pygments/modeline.py,sha256=37fen3cf1moCz4vMVJqX41eAQCmj8pzUchikgPcHp-U,986 +pip/_vendor/pygments/plugin.py,sha256=zGSig3S7QX-3o6RDxd4_Uvice_t25l_BN9aQQ9k8vmU,1727 +pip/_vendor/pygments/regexopt.py,sha256=mj8Fgu3sT0d5PZwRwDLexEvVOQbuHeosubQnqVwgiqs,3072 +pip/_vendor/pygments/scanner.py,sha256=nGoHy-Npk2ylUd4bws_CJN1hK785Xqo8e0teRmNX2jo,3091 +pip/_vendor/pygments/sphinxext.py,sha256=FZ2puvLe2Bztqtj6UJvQd7D8TvtOZ1GsfRJObvH59tE,4630 +pip/_vendor/pygments/style.py,sha256=lGyan5bU42q1kGMfFqafwL3g1j5EurTvfkv8vdP7NzQ,6257 +pip/_vendor/pygments/styles/__init__.py,sha256=Qx2zq6ufbDNE2cTp51M-s9zW-sDE-KLIqFw31qr3Bhg,3252 +pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pygments/token.py,sha256=lNPgeaQTzu2DEUi6n_lxAIU7uy4DVj8LMI3nSVnTjks,6143 +pip/_vendor/pygments/unistring.py,sha256=Xs0FzOzE0l0iWRoTlcgi-Q_kAMdF5Gt5FL_goGKJc98,63188 +pip/_vendor/pygments/util.py,sha256=s9n8BQXIxG3lIwCPWv5-ci8yhaqq5JbEVK9v8Z-8_3I,9123 +pip/_vendor/pyparsing/__init__.py,sha256=jXheGTFT1b6r_4WxuOE0uVUqiouLJ3WHzOScpLieRgQ,9107 +pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/core.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc,, +pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc,, +pip/_vendor/pyparsing/actions.py,sha256=60v7mETOBzc01YPH_qQD5isavgcSJpAfIKpzgjM3vaU,6429 +pip/_vendor/pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936 +pip/_vendor/pyparsing/core.py,sha256=GtQsD06HlwKPc7M8K8hyOuOW-cRnd87AxAHq-ad5lEk,212248 +pip/_vendor/pyparsing/diagram/__init__.py,sha256=h0gsUwmo5N3shgvfXVQTtqvTpUAv-ZdQjSQ6IUJmsxY,22165 +pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/pyparsing/exceptions.py,sha256=H4D9gqMavqmAFSsdrU_J6bO-jA-T-A7yvtXWZpooIUA,9030 +pip/_vendor/pyparsing/helpers.py,sha256=kqpIZFG-y0fQ3g_TmloYllo9we6YCYiewZMXIK0y5wc,38299 +pip/_vendor/pyparsing/results.py,sha256=4D-oURF1cLeL7k0d3zMqUuWH_gTjop_OrZwik9O0HXU,25339 +pip/_vendor/pyparsing/testing.py,sha256=szs8AKZREZMhL0y0vsMfaTVAnpqPHetg6VKJBNmc4QY,13388 +pip/_vendor/pyparsing/unicode.py,sha256=IR-ioeGY29cZ49tG8Ts7ITPWWNP5G2DcZs58oa8zn44,10381 +pip/_vendor/pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805 +pip/_vendor/requests/__init__.py,sha256=6IUFQM6K9V2NIu4fe4LtUsN21-TFbw_w3EfPpdUN-qc,5130 +pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-310.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-310.pyc,, +pip/_vendor/requests/__version__.py,sha256=q8miOQaomOv3S74lK4eQs1zZ5jwcnOusyEU-M2idhts,441 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=WazYJQ_b2LHhNDb_y0hscNlWVsSe5ca5I3pymPrer5w,21861 +pip/_vendor/requests/api.py,sha256=hjuoP79IAEmX6Dysrw8t032cLfwLHxbI_wM4gC5G9t0,6402 +pip/_vendor/requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,10207 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=N1281mkcTluMjKqCSLf88LR6HNOygEhS1TbR9LLsoVY,2114 +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/exceptions.py,sha256=VcpBXOL-9JYhNbK8OZxCIImBgpQSXJlUelDPf1f-pmM,3446 +pip/_vendor/requests/help.py,sha256=dyhe3lcmHXnFCzDiZVjcGmVvvO_jtsfAm-AC542ndw8,3972 +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/models.py,sha256=7pzscX_47qxx7-zEaBWGxMoB33Vdf6HLoUKZh1ktEvM,35116 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=Zu-Y9YPlwTIsyFx1hvIrc3ziyeFpuFPqcOuSuz8BNWs,29835 +pip/_vendor/requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188 +pip/_vendor/requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005 +pip/_vendor/requests/utils.py,sha256=siud-FQ6xgKFbL49DRvAb3PMQMMHoeCL_TCmuHh9AUU,33301 +pip/_vendor/resolvelib/__init__.py,sha256=UL-B2BDI0_TRIqkfGwLHKLxY-LjBlomz7941wDqzB1I,537 +pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc,, +pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc,, +pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc,, +pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 +pip/_vendor/resolvelib/providers.py,sha256=roVmFBItQJ0TkhNua65h8LdNny7rmeqVEXZu90QiP4o,5872 +pip/_vendor/resolvelib/reporters.py,sha256=fW91NKf-lK8XN7i6Yd_rczL5QeOT3sc6AKhpaTEnP3E,1583 +pip/_vendor/resolvelib/resolvers.py,sha256=2wYzVGBGerbmcIpH8cFmgSKgLSETz8jmwBMGjCBMHG4,17592 +pip/_vendor/resolvelib/structs.py,sha256=IVIYof6sA_N4ZEiE1C1UhzTX495brCNnyCdgq6CYq28,4794 +pip/_vendor/rich/__init__.py,sha256=wF1th4JGBCVC02xfaw8j6P2MrFcJaQJL72scKtEmDYQ,5804 +pip/_vendor/rich/__main__.py,sha256=vd1PP-o7_1un-ThdgMU9LHV-D8z56yz_-fryczn38eE,8810 +pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_lru_cache.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/abc.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/align.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/bar.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/box.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/cells.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/color.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/columns.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/console.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/containers.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/control.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/errors.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/json.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/layout.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/live.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/logging.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/markup.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/measure.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/padding.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/pager.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/palette.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/panel.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/progress.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/region.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/repr.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/rule.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/scope.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/screen.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/segment.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/status.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/style.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/styled.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/table.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/tabulate.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/text.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/theme.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/themes.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc,, +pip/_vendor/rich/__pycache__/tree.cpython-310.pyc,, +pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 +pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 +pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 +pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 +pip/_vendor/rich/_inspect.py,sha256=vq6BjewwEvddjcBTr_lCcjYQBsKi92aTNpcXyaA5ERA,7444 +pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 +pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 +pip/_vendor/rich/_lru_cache.py,sha256=M7H1ZQF32o6SxrpOur9zTIhEHlNXT9XnrcdhruUmG5I,1246 +pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 +pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 +pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 +pip/_vendor/rich/_spinners.py,sha256=huT1biTlwyp9Lm8S7bLfVzg1psUaIH5xHDwTaWEHVh0,26521 +pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 +pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 +pip/_vendor/rich/_windows.py,sha256=nBO71icHMIHlzT7hg6fkoIdh1mT-5MvDdPDwunkshyw,2065 +pip/_vendor/rich/_wrap.py,sha256=OtnSxnERkuNlSM1d_MYtNg8KIYTcTBk3peg16dCZH_U,1804 +pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 +pip/_vendor/rich/align.py,sha256=2zRHV8SzR5eP-vQkSDgjmgsBLBluCBwykgejAW6oRD0,10425 +pip/_vendor/rich/ansi.py,sha256=QaVVkfvVL6C3OsuWI9iQ-iJFkMsMohjYlxgMLnVTEPo,6676 +pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 +pip/_vendor/rich/box.py,sha256=o0ywz1iW0WjGLPrRVDAZPh1CVPEgAOaWsn8Bf3sf43g,9069 +pip/_vendor/rich/cells.py,sha256=NadN20gFxE8Aj-2S3Drn7qgn-ZpsRZcNnTNtweRL7rA,4285 +pip/_vendor/rich/color.py,sha256=SD3yTf3t8japb-jOv8GYCMCDqyzpipzXS_0rAXhSlU4,17285 +pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 +pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 +pip/_vendor/rich/console.py,sha256=bioCy8012eZ8PIOBxMyyqxYPltKk2pGEG9jmwylNCQk,81236 +pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 +pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 +pip/_vendor/rich/control.py,sha256=qxg6Yjd78XuF0VxthlT8O4dpvpACYwKkBfm2S4-IvHA,5298 +pip/_vendor/rich/default_styles.py,sha256=At42PcWzmnYWcx5fUOKyOUpI8HK5m4ItZqxkgHToaMs,7614 +pip/_vendor/rich/diagnose.py,sha256=4L8SZfbqjIRotzJ39QzD9-d4I80FyV1mNKHryg1eArE,183 +pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 +pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 +pip/_vendor/rich/file_proxy.py,sha256=fHeReSO3VJ7IbH_9ri-OrPYbFC3UYOzeTNjngiiWOcY,1613 +pip/_vendor/rich/filesize.py,sha256=oQJnM5_7ygkpzt3GtNq5l3F6gmB7YahBA5vpdQVKLwI,2511 +pip/_vendor/rich/highlighter.py,sha256=AdhjC0meTYswZ_xKgka0cRYdNjLABLUzHAbyF3QpPWo,4894 +pip/_vendor/rich/json.py,sha256=RCm4lXBXrjvXHpqrWPH8wdGP0jEo4IohLmkddlhRY18,5051 +pip/_vendor/rich/jupyter.py,sha256=4sxNAwJs4g3dYfWy_enPw9fp0Tdn-82tV4T9uh9vAOM,3025 +pip/_vendor/rich/layout.py,sha256=b64KMDP2EPiC103P-v-_VZKGY13oWiiGS418P_KRRlc,14048 +pip/_vendor/rich/live.py,sha256=OKxMaFU5sFfuR--cJftGYjSvg1VPQri1U_DNZUjCsvI,13711 +pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 +pip/_vendor/rich/logging.py,sha256=YNcCSK6pCo2Wg6JKqScAe6VgFqebHBnS5nDnBO4gXAA,10868 +pip/_vendor/rich/markup.py,sha256=hsVW_k1TIvj5OPPQ12ihAii9HSVa8N1TStvA5B2GGpo,8058 +pip/_vendor/rich/measure.py,sha256=Z74XvzIgLZm0xH-QIo1uX5d4oahavHe8D8MKyxLNqPQ,5258 +pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 +pip/_vendor/rich/pager.py,sha256=VK_2EfH0JduZWdyV-KZma06bvi_V5PWmHG6W7BoiaTg,838 +pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 +pip/_vendor/rich/panel.py,sha256=O6ORyIhDcOLSEasTjpcDvmhvIcppPGCeQoXpoycIUT8,8637 +pip/_vendor/rich/pretty.py,sha256=HAB68BpYysaL1EXeV4X5Tt-U2hDlcLpbFz06fkojWWE,32572 +pip/_vendor/rich/progress.py,sha256=jcgi7aMnQ_YjSpAmQkalwtNsgVn9i56SeZGprr7tuOk,35926 +pip/_vendor/rich/progress_bar.py,sha256=ELiBaxJOgsRYKpNIrot7BC0bFXvmf8cTd6nxI02BbK0,7762 +pip/_vendor/rich/prompt.py,sha256=gKVd13YWv6jedzwcRPZGUINBjC-xcJhJ_xz_NvMW80c,11307 +pip/_vendor/rich/protocol.py,sha256=Vx6n4fEoSDhzSup8t3KH0iK2RWyssIOks5E0S1qw1GA,1401 +pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 +pip/_vendor/rich/repr.py,sha256=1A0U0_ibG_bZbw71pUBIctO9Az-CQUuyOTbiKcJOwyw,4309 +pip/_vendor/rich/rule.py,sha256=cPK6NYo4kzh-vM_8a-rXajXplsbaHa6ahErYvGSsrJ0,4197 +pip/_vendor/rich/scope.py,sha256=HX13XsJfqzQHpPfw4Jn9JmJjCsRj9uhHxXQEqjkwyLA,2842 +pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 +pip/_vendor/rich/segment.py,sha256=MBBAWaHyqCQFCfiNbrTW4BGaFR1uU31XktJ1S3Taqb4,23916 +pip/_vendor/rich/spinner.py,sha256=V6dW0jIk5IO0_2MyxyftQf5VjCHI0T2cRhJ4F31hPIQ,4312 +pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 +pip/_vendor/rich/style.py,sha256=AD1I7atfclsFCtGeL8ronH1Jj-02WLp9ZQ2VYqmpBjM,26469 +pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 +pip/_vendor/rich/syntax.py,sha256=pJAD08ywowg5xVwTGCqUOMpDYskjoMoDYEV-hryEX5s,26994 +pip/_vendor/rich/table.py,sha256=oQAEBaV4zMUPyg_tSA93_GrCirdIf-osolxf9wb3pEo,36757 +pip/_vendor/rich/tabulate.py,sha256=nl0oeNbiXectEgTHyj3K7eN4NZMISpaogpOdZyEOGbs,1700 +pip/_vendor/rich/terminal_theme.py,sha256=E0nI_ycFpvflamt-KVCY4J52LmUjRi1Y6ICB-Ef3gMo,1459 +pip/_vendor/rich/text.py,sha256=auX3LpY-I6PBiNyxB3o3LyMEx7lna2cx9IbNQJDwtw8,44424 +pip/_vendor/rich/theme.py,sha256=GKNtQhDBZKAzDaY0vQVQQFzbc0uWfFe6CJXA-syT7zQ,3627 +pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 +pip/_vendor/rich/traceback.py,sha256=hAU3IR295eFuup_px2NU4aCEWu7KQs1qpZbnqoHCtR0,25935 +pip/_vendor/rich/tree.py,sha256=JxyWbc27ZuwoLQnd7I-rSsRsqI9lzaVKlfTLJXla9U0,9122 +pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 +pip/_vendor/tenacity/__init__.py,sha256=GLLsTFD4Bd5VDgTR6mU_FxyOsrxc48qONorVaRebeD4,18257 +pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/after.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/before.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/before_sleep.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/nap.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/retry.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/stop.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-310.pyc,, +pip/_vendor/tenacity/__pycache__/wait.cpython-310.pyc,, +pip/_vendor/tenacity/_asyncio.py,sha256=HEb0BVJEeBJE9P-m9XBxh1KcaF96BwoeqkJCL5sbVcQ,3314 +pip/_vendor/tenacity/_utils.py,sha256=-y68scDcyoqvTJuJJ0GTfjdSCljEYlbCYvgk7nM4NdM,1944 +pip/_vendor/tenacity/after.py,sha256=dlmyxxFy2uqpLXDr838DiEd7jgv2AGthsWHGYcGYsaI,1496 +pip/_vendor/tenacity/before.py,sha256=7XtvRmO0dRWUp8SVn24OvIiGFj8-4OP5muQRUiWgLh0,1376 +pip/_vendor/tenacity/before_sleep.py,sha256=ThyDvqKU5yle_IvYQz_b6Tp6UjUS0PhVp6zgqYl9U6Y,1908 +pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 +pip/_vendor/tenacity/retry.py,sha256=62R71W59bQjuNyFKsDM7hE2aEkEPtwNBRA0tnsEvgSk,6645 +pip/_vendor/tenacity/stop.py,sha256=sKHmHaoSaW6sKu3dTxUVKr1-stVkY7lw4Y9yjZU30zQ,2790 +pip/_vendor/tenacity/tornadoweb.py,sha256=E8lWO2nwe6dJgoB-N2HhQprYLDLB_UdSgFnv-EN6wKE,2145 +pip/_vendor/tenacity/wait.py,sha256=e_Saa6I2tsNLpCL1t9897wN2fGb0XQMQlE4bU2t9V2w,6691 +pip/_vendor/tomli/__init__.py,sha256=z1Elt0nLAqU5Y0DOn9p__8QnLWavlEOpRyQikdYgKro,230 +pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc,, +pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc,, +pip/_vendor/tomli/_parser.py,sha256=50BD4o9YbzFAGAYyZLqZC8F81DQ7iWWyJnrHNwBKa6A,22415 +pip/_vendor/tomli/_re.py,sha256=5GPfgXKteg7wRFCF-DzlkAPI2ilHbkMK2-JC49F-AJQ,2681 +pip/_vendor/typing_extensions.py,sha256=1uqi_RSlI7gos4eJB_NEV3d5wQwzTUQHd3_jrkbTo8Q,87149 +pip/_vendor/urllib3/__init__.py,sha256=j3yzHIbmW7CS-IKQJ9-PPQf_YKO8EOAey_rMW0UR7us,2763 +pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372 +pip/_vendor/urllib3/_version.py,sha256=_NdMUQaeBvFHAX2z3zAIX2Wum58A6rVtY1f7ByHsQ4g,63 +pip/_vendor/urllib3/connection.py,sha256=6zokyboYYKm9VkyrQvVVLgxMyCZK7n9Vmg_2ZK6pbhc,20076 +pip/_vendor/urllib3/connectionpool.py,sha256=eQ1jWJ2dDdRADuCj9Yx7RCpzY2iM8P32jGHbjYBkAIk,39308 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 +pip/_vendor/urllib3/contrib/appengine.py,sha256=lfzpHFmJiO82shClLEm3QB62SYgHWnjpZOH_2JhU5Tc,11034 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=ej9gGvfAb2Gt00lafFp45SIoRz-QwrQ4WChm6gQmAlM,4538 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=DD4pInv_3OEEGffEFynBoirc8ldR789sLmGSKukzA0E,16900 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=4qUKo7PUV-vVIqXmr2BD-sH7qplB918jiD5eNsRI9vU,34449 +pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 +pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 +pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 +pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 +pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 +pip/_vendor/urllib3/packages/six.py,sha256=1LVW7ljqRirFlfExjwl-v1B7vSAUNTmzGMs-qays2zg,34666 +pip/_vendor/urllib3/poolmanager.py,sha256=xfVcBtEBc8Xwa8jURSqdS7QmXvUuMHhjL1sjFOY-rUk,20001 +pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 +pip/_vendor/urllib3/response.py,sha256=hGhGBh7TkEkh_IQg5C1W_xuPNrgIKv5BUXPyE-q0LuE,28203 +pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 +pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 +pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 +pip/_vendor/urllib3/util/request.py,sha256=NnzaEKQ1Pauw5MFMV6HmgEMHITf0Aua9fQuzi2uZzGc,4123 +pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 +pip/_vendor/urllib3/util/retry.py,sha256=eUKOZ16Ya_Tu3_sXF5KVhLJmHQF7YXOCX-MWRoZVzqs,22011 +pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 +pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=w01jCYuwvQ038p9mhc1P1gF8IiTN1qHakThpoukOlbw,5751 +pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 +pip/_vendor/urllib3/util/timeout.py,sha256=QSbBUNOB9yh6AnDn61SrLQ0hg5oz0I9-uXEG91AJuIg,10003 +pip/_vendor/urllib3/util/url.py,sha256=QVEzcbHipbXyCWwH6R4K4TR-N8T4LM55WEMwNUTBmLE,14047 +pip/_vendor/urllib3/util/wait.py,sha256=3MUKRSAUJDB2tgco7qRUskW0zXGAWYvRRE4Q1_6xlLs,5404 +pip/_vendor/vendor.txt,sha256=H-9fScoah7nx4K8O4Uft0l5iH2P_mVo4RqyuMVOTJEc,496 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-310.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-310.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-310.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/REQUESTED b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/REQUESTED similarity index 100% rename from lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/REQUESTED rename to python/lib/python3.10/site-packages/pip-22.0.2.dist-info/REQUESTED diff --git a/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt new file mode 100644 index 0000000..c4ad521 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.10 = pip._internal.cli.main:main + diff --git a/lib/python3.11/site-packages/pip-22.3.1.dist-info/top_level.txt b/python/lib/python3.10/site-packages/pip-22.0.2.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/pip-22.3.1.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/pip-22.0.2.dist-info/top_level.txt diff --git a/python/lib/python3.10/site-packages/pip/__init__.py b/python/lib/python3.10/site-packages/pip/__init__.py new file mode 100644 index 0000000..8a50472 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/__init__.py @@ -0,0 +1,13 @@ +from typing import List, Optional + +__version__ = "22.0.2" + + +def main(args: Optional[List[str]] = None) -> int: + """This is an internal API only meant for use by pip's own console scripts. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/lib/python3.11/site-packages/pip/__main__.py b/python/lib/python3.10/site-packages/pip/__main__.py similarity index 100% rename from lib/python3.11/site-packages/pip/__main__.py rename to python/lib/python3.10/site-packages/pip/__main__.py diff --git a/lib/site-packages/pip/_internal/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/__init__.py similarity index 100% rename from lib/site-packages/pip/_internal/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/build_env.py b/python/lib/python3.10/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..daeb7fb --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/build_env.py @@ -0,0 +1,296 @@ +"""Build Environment used for isolation during sdist building +""" + +import contextlib +import logging +import os +import pathlib +import sys +import textwrap +import zipfile +from collections import OrderedDict +from sysconfig import get_paths +from types import TracebackType +from typing import TYPE_CHECKING, Iterable, Iterator, List, Optional, Set, Tuple, Type + +from pip._vendor.certifi import where +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.version import Version + +from pip import __file__ as pip_location +from pip._internal.cli.spinners import open_spinner +from pip._internal.locations import get_platlib, get_prefixed_libs, get_purelib +from pip._internal.metadata import get_environment +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds + +if TYPE_CHECKING: + from pip._internal.index.package_finder import PackageFinder + +logger = logging.getLogger(__name__) + + +class _Prefix: + def __init__(self, path: str) -> None: + self.path = path + self.setup = False + self.bin_dir = get_paths( + "nt" if os.name == "nt" else "posix_prefix", + vars={"base": path, "platbase": path}, + )["scripts"] + self.lib_dirs = get_prefixed_libs(path) + + +@contextlib.contextmanager +def _create_standalone_pip() -> Iterator[str]: + """Create a "standalone pip" zip file. + + The zip file's content is identical to the currently-running pip. + It will be used to install requirements into the build environment. + """ + source = pathlib.Path(pip_location).resolve().parent + + # Return the current instance if `source` is not a directory. We can't build + # a zip from this, and it likely means the instance is already standalone. + if not source.is_dir(): + yield str(source) + return + + with TempDirectory(kind="standalone-pip") as tmp_dir: + pip_zip = os.path.join(tmp_dir.path, "__env_pip__.zip") + kwargs = {} + if sys.version_info >= (3, 8): + kwargs["strict_timestamps"] = False + with zipfile.ZipFile(pip_zip, "w", **kwargs) as zf: + for child in source.rglob("*"): + zf.write(child, child.relative_to(source.parent).as_posix()) + yield os.path.join(pip_zip, "pip") + + +class BuildEnvironment: + """Creates and manages an isolated environment to install build deps""" + + def __init__(self) -> None: + temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True) + + self._prefixes = OrderedDict( + (name, _Prefix(os.path.join(temp_dir.path, name))) + for name in ("normal", "overlay") + ) + + self._bin_dirs: List[str] = [] + self._lib_dirs: List[str] = [] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in (get_purelib(), get_platlib()) + } + self._site_dir = os.path.join(temp_dir.path, "site") + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open( + os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8" + ) as fp: + fp.write( + textwrap.dedent( + """ + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + """ + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs) + ) + + def __enter__(self) -> None: + self._save_env = { + name: os.environ.get(name, None) + for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH") + } + + path = self._bin_dirs[:] + old_path = self._save_env["PATH"] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update( + { + "PATH": os.pathsep.join(path), + "PYTHONNOUSERSITE": "1", + "PYTHONPATH": os.pathsep.join(pythonpath), + } + ) + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def check_requirements( + self, reqs: Iterable[str] + ) -> Tuple[Set[Tuple[str, str]], Set[str]]: + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + env = get_environment(self._lib_dirs) + for req_str in reqs: + req = Requirement(req_str) + dist = env.get_distribution(req.name) + if not dist: + missing.add(req_str) + continue + if isinstance(dist.version, Version): + installed_req_str = f"{req.name}=={dist.version}" + else: + installed_req_str = f"{req.name}==={dist.version}" + if dist.version not in req.specifier: + conflicting.add((installed_req_str, req_str)) + # FIXME: Consider direct URL? + return conflicting, missing + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + with contextlib.ExitStack() as ctx: + pip_runnable = ctx.enter_context(_create_standalone_pip()) + self._install_requirements( + pip_runnable, + finder, + requirements, + prefix, + kind=kind, + ) + + @staticmethod + def _install_requirements( + pip_runnable: str, + finder: "PackageFinder", + requirements: Iterable[str], + prefix: _Prefix, + *, + kind: str, + ) -> None: + args: List[str] = [ + sys.executable, + pip_runnable, + "install", + "--ignore-installed", + "--no-user", + "--prefix", + prefix.path, + "--no-warn-script-location", + ] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append("-v") + for format_control in ("no_binary", "only_binary"): + formats = getattr(finder.format_control, format_control) + args.extend( + ( + "--" + format_control.replace("_", "-"), + ",".join(sorted(formats or {":none:"})), + ) + ) + + index_urls = finder.index_urls + if index_urls: + args.extend(["-i", index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(["--extra-index-url", extra_index]) + else: + args.append("--no-index") + for link in finder.find_links: + args.extend(["--find-links", link]) + + for host in finder.trusted_hosts: + args.extend(["--trusted-host", host]) + if finder.allow_all_prereleases: + args.append("--pre") + if finder.prefer_binary: + args.append("--prefer-binary") + args.append("--") + args.extend(requirements) + extra_environ = {"_PIP_STANDALONE_CERT": where()} + with open_spinner(f"Installing {kind}") as spinner: + call_subprocess( + args, + command_desc=f"pip subprocess to install {kind}", + spinner=spinner, + extra_environ=extra_environ, + ) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment""" + + def __init__(self) -> None: + pass + + def __enter__(self) -> None: + pass + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + def cleanup(self) -> None: + pass + + def install_requirements( + self, + finder: "PackageFinder", + requirements: Iterable[str], + prefix_as_string: str, + *, + kind: str, + ) -> None: + raise NotImplementedError() diff --git a/python/lib/python3.10/site-packages/pip/_internal/cache.py b/python/lib/python3.10/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..1d6df22 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cache.py @@ -0,0 +1,264 @@ +"""Cache Management +""" + +import hashlib +import json +import logging +import os +from typing import Any, Dict, List, Optional, Set + +from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.models.format_control import FormatControl +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.urls import path_to_url + +logger = logging.getLogger(__name__) + + +def _hash_dict(d: Dict[str, str]) -> str: + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache: + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__( + self, cache_dir: str, format_control: FormatControl, allowed_formats: Set[str] + ) -> None: + super().__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts(self, link: Link) -> List[str]: + """Get parts of part that must be os.path.joined with cache_dir""" + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]: + can_not_cache = not self.cache_dir or not canonical_package_name or not link + if can_not_cache: + return [] + + formats = self.format_control.get_allowed_formats(canonical_package_name) + if not self.allowed_formats.intersection(formats): + return [] + + candidates = [] + path = self.get_path_for_link(link) + if os.path.isdir(path): + for candidate in os.listdir(path): + candidates.append((candidate, path)) + return candidates + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached items in for link.""" + raise NotImplementedError() + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs.""" + + def __init__(self, cache_dir: str, format_control: FormatControl) -> None: + super().__init__(cache_dir, format_control, {"binary"}) + + def get_path_for_link(self, link: Link) -> str: + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + assert self.cache_dir + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel %s for %s as it " + "does not match the expected distribution name %s.", + wheel_name, + link, + package_name, + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory""" + + def __init__(self, format_control: FormatControl) -> None: + self._temp_dir = TempDirectory( + kind=tempdir_kinds.EPHEM_WHEEL_CACHE, + globally_managed=True, + ) + + super().__init__(self._temp_dir.path, format_control) + + +class CacheEntry: + def __init__( + self, + link: Link, + persistent: bool, + ): + self.link = link + self.persistent = persistent + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir: str, format_control: FormatControl) -> None: + super().__init__(cache_dir, format_control, {"binary"}) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link(self, link: Link) -> str: + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link: Link) -> str: + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Link: + cache_entry = self.get_cache_entry(link, package_name, supported_tags) + if cache_entry is None: + return link + return cache_entry.link + + def get_cache_entry( + self, + link: Link, + package_name: Optional[str], + supported_tags: List[Tag], + ) -> Optional[CacheEntry]: + """Returns a CacheEntry with a link to a cached item if it exists or + None. The cache entry indicates if the item was found in the persistent + or ephemeral cache. + """ + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=True) + + retval = self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=False) + + return None diff --git a/lib/python3.11/site-packages/pip/_internal/cli/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/cli/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/cli/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/cli/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py b/python/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py rename to python/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/base_command.py b/python/lib/python3.10/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..f5dc0fe --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,220 @@ +"""Base Command class, and related routines""" + +import functools +import logging +import logging.config +import optparse +import os +import sys +import traceback +from optparse import Values +from typing import Any, Callable, List, Optional, Tuple + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + DiagnosticPipError, + InstallationError, + NetworkConnectionError, + PreviousBuildDirError, + UninstallationError, +) +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry +from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = ["Command"] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage: str = "" + ignore_require_venv: bool = False + + def __init__(self, name: str, summary: str, isolated: bool = False) -> None: + super().__init__() + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser( + usage=self.usage, + prog=f"{get_prog()} {name}", + formatter=UpdatingDefaultsHelpFormatter(), + add_help_option=False, + name=name, + description=self.__doc__, + isolated=isolated, + ) + + self.tempdir_registry: Optional[TempDirRegistry] = None + + # Commands should add options to this option group + optgroup_name = f"{self.name.capitalize()} Options" + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + self.add_options() + + def add_options(self) -> None: + pass + + def handle_pip_version_check(self, options: Values) -> None: + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, "no_index") + + def run(self, options: Values, args: List[str]) -> int: + raise NotImplementedError + + def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]: + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args: List[str]) -> int: + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args: List[str]) -> int: + # We must initialize this before the tempdir manager, otherwise the + # configuration would not be accessible by the time we clean up the + # tempdir manager. + self.tempdir_registry = self.enter_context(tempdir_registry()) + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ["PIP_NO_INPUT"] = "1" + + if options.exists_action: + os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical("Could not find an activated virtualenv (required).") + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you should " + "use sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + if "2020-resolver" in options.features_enabled: + logger.warning( + "--use-feature=2020-resolver no longer has any effect, " + "since it is now the default dependency resolver in pip. " + "This will become an error in pip 21.0." + ) + + def intercepts_unhandled_exc( + run_func: Callable[..., int] + ) -> Callable[..., int]: + @functools.wraps(run_func) + def exc_logging_wrapper(*args: Any) -> int: + try: + status = run_func(*args) + assert isinstance(status, int) + return status + except DiagnosticPipError as exc: + logger.error("[present-diagnostic] %s", exc) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except ( + InstallationError, + UninstallationError, + BadCommand, + NetworkConnectionError, + ) as exc: + logger.critical(str(exc)) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical("%s", exc) + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to + # stderr because stdout no longer works. + print("ERROR: Pipe to stdout was broken", file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical("Operation cancelled by user") + logger.debug("Exception information:", exc_info=True) + + return ERROR + except BaseException: + logger.critical("Exception:", exc_info=True) + + return UNKNOWN_ERROR + + return exc_logging_wrapper + + try: + if not options.debug_mode: + run = intercepts_unhandled_exc(self.run) + else: + run = self.run + return run(options, args) + finally: + self.handle_pip_version_check(options) diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py b/python/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..b7e54f7 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,1018 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os +import textwrap +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values +from textwrap import dedent +from typing import Any, Callable, Dict, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.parser import ConfigOptionParser +from pip._internal.cli.progress_bars import BAR_TYPES +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, get_src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.target_python import TargetPython +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.misc import strtobool + +logger = logging.getLogger(__name__) + + +def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = f"{option} error: {msg}" + msg = textwrap.fill(" ".join(msg.split())) + parser.error(msg) + + +def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group["name"]) + for option in group["options"]: + option_group.add_option(option()) + return option_group + + +def check_install_build_global( + options: Values, check_options: Optional[Values] = None +) -> None: + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n: str) -> Optional[Any]: + return getattr(check_options, n, None) + + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + logger.warning( + "Disabling all use of wheels due to the use of --build-option " + "/ --global-option / --install-option.", + ) + + +def check_dist_restriction(options: Values, check_target: bool = False) -> None: + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any( + [ + options.python_version, + options.platforms, + options.abis, + options.implementation, + ] + ) + + binary_only = FormatControl(set(), {":all:"}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +def _path_option_check(option: Option, opt: str, value: str) -> str: + return os.path.expanduser(value) + + +def _package_name_option_check(option: Option, opt: str, value: str) -> str: + return canonicalize_name(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path", "package_name") + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["package_name"] = _package_name_option_check + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_: Callable[..., Option] = partial( + Option, + "-h", + "--help", + dest="help", + action="help", + help="Show help.", +) + +debug_mode: Callable[..., Option] = partial( + Option, + "--debug", + dest="debug_mode", + action="store_true", + default=False, + help=( + "Let unhandled exceptions propagate outside the main subroutine, " + "instead of logging them to stderr." + ), +) + +isolated_mode: Callable[..., Option] = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv: Callable[..., Option] = partial( + Option, + "--require-virtualenv", + "--require-venv", + dest="require_venv", + action="store_true", + default=False, + help=( + "Allow pip to only run in a virtual environment; " + "exit with an error otherwise." + ), +) + +verbose: Callable[..., Option] = partial( + Option, + "-v", + "--verbose", + dest="verbose", + action="count", + default=0, + help="Give more output. Option is additive, and can be used up to 3 times.", +) + +no_color: Callable[..., Option] = partial( + Option, + "--no-color", + dest="no_color", + action="store_true", + default=False, + help="Suppress colored output.", +) + +version: Callable[..., Option] = partial( + Option, + "-V", + "--version", + dest="version", + action="store_true", + help="Show version and exit.", +) + +quiet: Callable[..., Option] = partial( + Option, + "-q", + "--quiet", + dest="quiet", + action="count", + default=0, + help=( + "Give less output. Option is additive, and can be used up to 3" + " times (corresponding to WARNING, ERROR, and CRITICAL logging" + " levels)." + ), +) + +progress_bar: Callable[..., Option] = partial( + Option, + "--progress-bar", + dest="progress_bar", + type="choice", + choices=list(BAR_TYPES.keys()), + default="on", + help=( + "Specify type of progress to be displayed [" + + "|".join(BAR_TYPES.keys()) + + "] (default: %default)" + ), +) + +log: Callable[..., Option] = partial( + PipOption, + "--log", + "--log-file", + "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log.", +) + +no_input: Callable[..., Option] = partial( + Option, + # Don't ask for input + "--no-input", + dest="no_input", + action="store_true", + default=False, + help="Disable prompting for input.", +) + +proxy: Callable[..., Option] = partial( + Option, + "--proxy", + dest="proxy", + type="str", + default="", + help="Specify a proxy in the form [user:passwd@]proxy.server:port.", +) + +retries: Callable[..., Option] = partial( + Option, + "--retries", + dest="retries", + type="int", + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) + +timeout: Callable[..., Option] = partial( + Option, + "--timeout", + "--default-timeout", + metavar="sec", + dest="timeout", + type="float", + default=15, + help="Set the socket timeout (default %default seconds).", +) + + +def exists_action() -> Option: + return Option( + # Option when path already exist + "--exists-action", + dest="exists_action", + type="choice", + choices=["s", "i", "w", "b", "a"], + default=[], + action="append", + metavar="action", + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert: Callable[..., Option] = partial( + PipOption, + "--cert", + dest="cert", + type="path", + metavar="path", + help=( + "Path to PEM-encoded CA certificate bundle. " + "If provided, overrides the default. " + "See 'SSL Certificate Verification' in pip documentation " + "for more information." + ), +) + +client_cert: Callable[..., Option] = partial( + PipOption, + "--client-cert", + dest="client_cert", + type="path", + default=None, + metavar="path", + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) + +index_url: Callable[..., Option] = partial( + Option, + "-i", + "--index-url", + "--pypi-url", + dest="index_url", + metavar="URL", + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) + + +def extra_index_url() -> Option: + return Option( + "--extra-index-url", + dest="extra_index_urls", + metavar="URL", + action="append", + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index: Callable[..., Option] = partial( + Option, + "--no-index", + dest="no_index", + action="store_true", + default=False, + help="Ignore package index (only looking at --find-links URLs instead).", +) + + +def find_links() -> Option: + return Option( + "-f", + "--find-links", + dest="find_links", + action="append", + default=[], + metavar="url", + help="If a URL or path to an html file, then parse for links to " + "archives such as sdist (.tar.gz) or wheel (.whl) files. " + "If a local path or file:// URL that's a directory, " + "then look for archives in the directory listing. " + "Links to VCS project URLs are not supported.", + ) + + +def trusted_host() -> Option: + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints() -> Option: + return Option( + "-c", + "--constraint", + dest="constraints", + action="append", + default=[], + metavar="file", + help="Constrain versions using the given constraints file. " + "This option can be used multiple times.", + ) + + +def requirements() -> Option: + return Option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help="Install from the given requirements file. " + "This option can be used multiple times.", + ) + + +def editable() -> Option: + return Option( + "-e", + "--editable", + dest="editables", + action="append", + default=[], + metavar="path/url", + help=( + "Install a project in editable mode (i.e. setuptools " + '"develop mode") from a local project path or a VCS url.' + ), + ) + + +def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src: Callable[..., Option] = partial( + PipOption, + "--src", + "--source", + "--source-dir", + "--source-directory", + dest="src_dir", + type="path", + metavar="dir", + default=get_src_prefix(), + action="callback", + callback=_handle_src, + help="Directory to check out editable projects into. " + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".', +) + + +def _get_format_control(values: Values, option: Option) -> Any: + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.no_binary, + existing.only_binary, + ) + + +def _handle_only_binary( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, + existing.only_binary, + existing.no_binary, + ) + + +def no_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", + dest="format_control", + action="callback", + callback=_handle_no_binary, + type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all binary packages, ":none:" to empty the set (notice ' + "the colons), or one or more package names with commas between " + "them (no colons). Note that some packages are tricky to compile " + "and may fail to install when this option is used on them.", + ) + + +def only_binary() -> Option: + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", + dest="format_control", + action="callback", + callback=_handle_only_binary, + type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all source packages, ":none:" to empty the set, or one ' + "or more package names with commas between them. Packages " + "without binary distributions will fail to install when this " + "option is used on them.", + ) + + +platforms: Callable[..., Option] = partial( + Option, + "--platform", + dest="platforms", + metavar="platform", + action="append", + default=None, + help=( + "Only use wheels compatible with . Defaults to the " + "platform of the running system. Use this option multiple times to " + "specify multiple platforms supported by the target interpreter." + ), +) + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]: + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split(".") + if len(parts) > 3: + return ((), "at most three version parts are allowed") + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), "each version part must be an integer") + + return (version_info, None) + + +def _handle_python_version( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = "invalid --python-version value: {!r}: {}".format( + value, + error_msg, + ) + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version: Callable[..., Option] = partial( + Option, + "--python-version", + dest="python_version", + metavar="python_version", + action="callback", + callback=_handle_python_version, + type="str", + default=None, + help=dedent( + """\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """ + ), +) + + +implementation: Callable[..., Option] = partial( + Option, + "--implementation", + dest="implementation", + metavar="implementation", + default=None, + help=( + "Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels." + ), +) + + +abis: Callable[..., Option] = partial( + Option, + "--abi", + dest="abis", + metavar="abi", + action="append", + default=None, + help=( + "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " + "If not specified, then the current interpreter abi tag is used. " + "Use this option multiple times to specify multiple abis supported " + "by the target interpreter. Generally you will need to specify " + "--implementation, --platform, and --python-version when using this " + "option." + ), +) + + +def add_target_python_options(cmd_opts: OptionGroup) -> None: + cmd_opts.add_option(platforms()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abis()) + + +def make_target_python(options: Values) -> TargetPython: + target_python = TargetPython( + platforms=options.platforms, + py_version_info=options.python_version, + abis=options.abis, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary() -> Option: + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages.", + ) + + +cache_dir: Callable[..., Option] = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type="path", + help="Store the cache data in

      .", +) + + +def _handle_no_cache_dir( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache: Callable[..., Option] = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) + +no_deps: Callable[..., Option] = partial( + Option, + "--no-deps", + "--no-dependencies", + dest="ignore_dependencies", + action="store_true", + default=False, + help="Don't install package dependencies.", +) + +ignore_requires_python: Callable[..., Option] = partial( + Option, + "--ignore-requires-python", + dest="ignore_requires_python", + action="store_true", + help="Ignore the Requires-Python information.", +) + +no_build_isolation: Callable[..., Option] = partial( + Option, + "--no-build-isolation", + dest="build_isolation", + action="store_false", + default=True, + help="Disable isolation when building a modern source distribution. " + "Build dependencies specified by PEP 518 must be already installed " + "if this option is used.", +) + + +def _handle_no_use_pep517( + option: Option, opt: str, value: str, parser: OptionParser +) -> None: + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517: Any = partial( + Option, + "--use-pep517", + dest="use_pep517", + action="store_true", + default=None, + help="Use PEP 517 for building source distributions " + "(use --no-use-pep517 to force legacy behaviour).", +) + +no_use_pep517: Any = partial( + Option, + "--no-use-pep517", + dest="use_pep517", + action="callback", + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP, +) + +install_options: Callable[..., Option] = partial( + Option, + "--install-option", + dest="install_options", + action="append", + metavar="options", + help="Extra arguments to be supplied to the setup.py install " + 'command (use like --install-option="--install-scripts=/usr/local/' + 'bin"). Use multiple --install-option options to pass multiple ' + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) + +build_options: Callable[..., Option] = partial( + Option, + "--build-option", + dest="build_options", + metavar="options", + action="append", + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", +) + +global_options: Callable[..., Option] = partial( + Option, + "--global-option", + dest="global_options", + action="append", + metavar="options", + help="Extra global options to be supplied to the setup.py " + "call before the install or bdist_wheel command.", +) + +no_clean: Callable[..., Option] = partial( + Option, + "--no-clean", + action="store_true", + default=False, + help="Don't clean up build directories.", +) + +pre: Callable[..., Option] = partial( + Option, + "--pre", + action="store_true", + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) + +disable_pip_version_check: Callable[..., Option] = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=True, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) + + +def _handle_merge_hash( + option: Option, opt_str: str, value: str, parser: OptionParser +) -> None: + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(":", 1) + except ValueError: + parser.error( + "Arguments to {} must be a hash name " # noqa + "followed by a value, like --hash=sha256:" + "abcde...".format(opt_str) + ) + if algo not in STRONG_HASHES: + parser.error( + "Allowed hash algorithms for {} are {}.".format( # noqa + opt_str, ", ".join(STRONG_HASHES) + ) + ) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash: Callable[..., Option] = partial( + Option, + "--hash", + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest="hashes", + action="callback", + callback=_handle_merge_hash, + type="string", + help="Verify that the package's archive matches this " + "hash before installing. Example: --hash=sha256:abcdef...", +) + + +require_hashes: Callable[..., Option] = partial( + Option, + "--require-hashes", + dest="require_hashes", + action="store_true", + default=False, + help="Require a hash to check each requirement against, for " + "repeatable installs. This option is implied when any package in a " + "requirements file has a --hash option.", +) + + +list_path: Callable[..., Option] = partial( + PipOption, + "--path", + dest="path", + type="path", + action="append", + help="Restrict to the specified installation path for listing " + "packages (can be used multiple times).", +) + + +def check_list_path_option(options: Values) -> None: + if options.path and (options.user or options.local): + raise CommandError("Cannot combine '--path' with '--user' or '--local'") + + +list_exclude: Callable[..., Option] = partial( + PipOption, + "--exclude", + dest="excludes", + action="append", + metavar="package", + type="package_name", + help="Exclude specified package from the output", +) + + +no_python_version_warning: Callable[..., Option] = partial( + Option, + "--no-python-version-warning", + dest="no_python_version_warning", + action="store_true", + default=False, + help="Silence deprecation warnings for upcoming unsupported Pythons.", +) + + +use_new_feature: Callable[..., Option] = partial( + Option, + "--use-feature", + dest="features_enabled", + metavar="feature", + action="append", + default=[], + choices=["2020-resolver", "fast-deps", "in-tree-build"], + help="Enable new functionality, that may be backward incompatible.", +) + +use_deprecated_feature: Callable[..., Option] = partial( + Option, + "--use-deprecated", + dest="deprecated_features_enabled", + metavar="feature", + action="append", + default=[], + choices=[ + "legacy-resolver", + "out-of-tree-build", + "backtrack-on-build-failures", + "html5lib", + ], + help=("Enable deprecated functionality, that will be removed in the future."), +) + + +########## +# groups # +########## + +general_group: Dict[str, Any] = { + "name": "General Options", + "options": [ + help_, + debug_mode, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + use_new_feature, + use_deprecated_feature, + ], +} + +index_group: Dict[str, Any] = { + "name": "Package Index Options", + "options": [ + index_url, + extra_index_url, + no_index, + find_links, + ], +} diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/command_context.py b/python/lib/python3.10/site-packages/pip/_internal/cli/command_context.py new file mode 100644 index 0000000..ed68322 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/command_context.py @@ -0,0 +1,27 @@ +from contextlib import ExitStack, contextmanager +from typing import ContextManager, Iterator, TypeVar + +_T = TypeVar("_T", covariant=True) + + +class CommandContextMixIn: + def __init__(self) -> None: + super().__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self) -> Iterator[None]: + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider: ContextManager[_T]) -> _T: + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/lib/python3.11/site-packages/pip/_internal/cli/main.py b/python/lib/python3.10/site-packages/pip/_internal/cli/main.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/cli/main.py rename to python/lib/python3.10/site-packages/pip/_internal/cli/main.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py b/python/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..3666ab0 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,87 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys +from typing import List, Tuple + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter +from pip._internal.commands import commands_dict, get_similar_commands +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_pip_version, get_prog + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser() -> ConfigOptionParser: + """Creates and returns the main parser for pip's CLI""" + + parser = ConfigOptionParser( + usage="\n%prog [options]", + add_help_option=False, + formatter=UpdatingDefaultsHelpFormatter(), + name="global", + prog=get_prog(), + ) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [""] + [ + f"{name:27} {command_info.summary}" + for name, command_info in commands_dict.items() + ] + parser.description = "\n".join(description) + + return parser + + +def parse_command(args: List[str]) -> Tuple[str, List[str]]: + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == "help" and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = [f'unknown command "{cmd_name}"'] + if guess: + msg.append(f'maybe you meant "{guess}"') + + raise CommandError(" - ".join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/parser.py b/python/lib/python3.10/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..a1c99a8 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,292 @@ +"""Base option parser setup""" + +import logging +import optparse +import shutil +import sys +import textwrap +from contextlib import suppress +from typing import Any, Dict, Iterator, List, Tuple + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.misc import redact_auth_from_url, strtobool + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args: Any, **kwargs: Any) -> None: + # help position must be aligned with __init__.parseopts.description + kwargs["max_help_position"] = 30 + kwargs["indent_increment"] = 1 + kwargs["width"] = shutil.get_terminal_size()[0] - 2 + super().__init__(*args, **kwargs) + + def format_option_strings(self, option: optparse.Option) -> str: + return self._format_option_strings(option) + + def _format_option_strings( + self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", " + ) -> str: + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + assert option.dest is not None + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt.format(metavar.lower())) + + return "".join(opts) + + def format_heading(self, heading: str) -> str: + if heading == "Options": + return "" + return heading + ":\n" + + def format_usage(self, usage: str) -> str: + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " ")) + return msg + + def format_description(self, description: str) -> str: + # leave full control over description to us + if description: + if hasattr(self.parser, "main"): + label = "Commands" + else: + label = "Description" + # some doc strings have initial newlines, some don't + description = description.lstrip("\n") + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = f"{label}:\n{description}\n" + return description + else: + return "" + + def format_epilog(self, epilog: str) -> str: + # leave full control over epilog to us + if epilog: + return epilog + else: + return "" + + def indent_lines(self, text: str, indent: str) -> str: + new_lines = [indent + line for line in text.split("\n")] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + + Also redact auth from url type options + """ + + def expand_default(self, option: optparse.Option) -> str: + default_values = None + if self.parser is not None: + assert isinstance(self.parser, ConfigOptionParser) + self.parser._update_defaults(self.parser.defaults) + assert option.dest is not None + default_values = self.parser.defaults.get(option.dest) + help_text = super().expand_default(option) + + if default_values and option.metavar == "URL": + if isinstance(default_values, str): + default_values = [default_values] + + # If its not a list, we should abort and just return the help text + if not isinstance(default_values, list): + default_values = [] + + for val in default_values: + help_text = help_text.replace(val, redact_auth_from_url(val)) + + return help_text + + +class CustomOptionParser(optparse.OptionParser): + def insert_option_group( + self, idx: int, *args: Any, **kwargs: Any + ) -> optparse.OptionGroup: + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self) -> List[optparse.Option]: + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__( + self, + *args: Any, + name: str, + isolated: bool = False, + **kwargs: Any, + ) -> None: + self.name = name + self.config = Configuration(isolated) + + assert self.name + super().__init__(*args, **kwargs) + + def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print(f"An error occurred during configuration: {exc}") + sys.exit(3) + + def _get_ordered_configuration_items(self) -> Iterator[Tuple[str, Any]]: + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items: Dict[str, List[Tuple[str, Any]]] = { + name: [] for name in override_order + } + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key, + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option("--" + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + assert option.dest is not None + + if option.action in ("store_true", "store_false"): + try: + val = strtobool(val) + except ValueError: + self.error( + "{} is not a valid value for {} option, " # noqa + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.".format(val, key) + ) + elif option.action == "count": + with suppress(ValueError): + val = strtobool(val) + with suppress(ValueError): + val = int(val) + if not isinstance(val, int) or val < 0: + self.error( + "{} is not a valid value for {} option, " # noqa + "please instead specify either a non-negative integer " + "or a boolean value like yes/no or false/true " + "which is equivalent to 1/0.".format(val, key) + ) + elif option.action == "append": + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == "callback": + assert option.callback is not None + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self) -> optparse.Values: + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + assert option.dest is not None + default = defaults.get(option.dest) + if isinstance(default, str): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg: str) -> None: + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, f"{msg}\n") diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py b/python/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py new file mode 100644 index 0000000..ffa1964 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py @@ -0,0 +1,321 @@ +import functools +import itertools +import sys +from signal import SIGINT, default_int_handler, signal +from typing import Any, Callable, Iterator, Optional, Tuple + +from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar +from pip._vendor.progress.spinner import Spinner +from pip._vendor.rich.progress import ( + BarColumn, + DownloadColumn, + FileSizeColumn, + Progress, + ProgressColumn, + SpinnerColumn, + TextColumn, + TimeElapsedColumn, + TimeRemainingColumn, + TransferSpeedColumn, +) + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +DownloadProgressRenderer = Callable[[Iterator[bytes]], Iterator[bytes]] + + +def _select_progress_class(preferred: Bar, fallback: Bar) -> Bar: + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", ""), + getattr(preferred, "fill", ""), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + "".join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar: Any = _select_progress_class(IncrementalBar, Bar) + + +class InterruptibleMixin: + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + """ + Save the original SIGINT handler for later. + """ + # https://github.com/python/mypy/issues/5887 + super().__init__(*args, **kwargs) # type: ignore + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self) -> None: + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super().finish() # type: ignore + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): # type: ignore + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + def update(self) -> None: + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = ("\U0001F539", "\U0001F537", "\U0001F535") + + +class DownloadProgressMixin: + def __init__(self, *args: Any, **kwargs: Any) -> None: + # https://github.com/python/mypy/issues/5887 + super().__init__(*args, **kwargs) # type: ignore + self.message: str = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self) -> str: + return format_size(self.index) # type: ignore + + @property + def download_speed(self) -> str: + # Avoid zero division errors... + if self.avg == 0.0: # type: ignore + return "..." + return format_size(1 / self.avg) + "/s" # type: ignore + + @property + def pretty_eta(self) -> str: + if self.eta: # type: ignore + return f"eta {self.eta_td}" # type: ignore + return "" + + def iter(self, it): # type: ignore + for x in it: + yield x + # B305 is incorrectly raised here + # https://github.com/PyCQA/flake8-bugbear/issues/59 + self.next(len(x)) # noqa: B305 + self.finish() + + +class WindowsMixin: + def __init__(self, *args: Any, **kwargs: Any) -> None: + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call needs to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: # type: ignore + self.hide_cursor = False + + # https://github.com/python/mypy/issues/5887 + super().__init__(*args, **kwargs) # type: ignore + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) # type: ignore + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): + pass + + +class DownloadBar(BaseDownloadProgressBar, Bar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, BlueEmojiBar): + pass + + +class DownloadProgressSpinner( + WindowsMixin, InterruptibleMixin, DownloadProgressMixin, Spinner +): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self) -> str: + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self) -> None: + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = "".join( + [ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ] + ) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner), +} + + +def _legacy_progress_bar( + progress_bar: str, max: Optional[int] +) -> DownloadProgressRenderer: + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter # type: ignore + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +# +# Modern replacement, for our legacy progress bars. +# +def _rich_progress_bar( + iterable: Iterator[bytes], + *, + bar_type: str, + size: int, +) -> Iterator[bytes]: + assert bar_type == "on", "This should only be used in the default mode." + + if not size: + total = float("inf") + columns: Tuple[ProgressColumn, ...] = ( + TextColumn("[progress.description]{task.description}"), + SpinnerColumn("line", speed=1.5), + FileSizeColumn(), + TransferSpeedColumn(), + TimeElapsedColumn(), + ) + else: + total = size + columns = ( + TextColumn("[progress.description]{task.description}"), + BarColumn(), + DownloadColumn(), + TransferSpeedColumn(), + TextColumn("eta"), + TimeRemainingColumn(), + ) + + progress = Progress(*columns, refresh_per_second=30) + task_id = progress.add_task(" " * (get_indentation() + 2), total=total) + with progress: + for chunk in iterable: + yield chunk + progress.update(task_id, advance=len(chunk)) + + +def get_download_progress_renderer( + *, bar_type: str, size: Optional[int] = None +) -> DownloadProgressRenderer: + """Get an object that can be used to render the download progress. + + Returns a callable, that takes an iterable to "wrap". + """ + if bar_type == "on": + return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size) + elif bar_type == "off": + return iter # no-op, when passed an iterator + else: + return _legacy_progress_bar(bar_type, size) diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/req_command.py b/python/lib/python3.10/site-packages/pip/_internal/cli/req_command.py new file mode 100644 index 0000000..5d4d1f0 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/req_command.py @@ -0,0 +1,506 @@ +"""Contains the Command base classes that depend on PipSession. + +The classes in this module are in a separate module so the commands not +needing download / PackageFinder capability don't unnecessarily import the +PackageFinder machinery and all its vendored dependencies, etc. +""" + +import logging +import os +import sys +from functools import partial +from optparse import Values +from typing import Any, List, Optional, Tuple + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, + install_req_from_parsed_requirement, + install_req_from_req_string, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolution.base import BaseResolver +from pip._internal.self_outdated_check import pip_self_version_check +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.temp_dir import ( + TempDirectory, + TempDirectoryTypeRegistry, + tempdir_kinds, +) +from pip._internal.utils.virtualenv import running_under_virtualenv + +logger = logging.getLogger(__name__) + + +class SessionCommandMixin(CommandContextMixIn): + + """ + A class mixin for command classes needing _build_session(). + """ + + def __init__(self) -> None: + super().__init__() + self._session: Optional[PipSession] = None + + @classmethod + def _get_index_urls(cls, options: Values) -> Optional[List[str]]: + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options: Values) -> PipSession: + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session( + self, + options: Values, + retries: Optional[int] = None, + timeout: Optional[int] = None, + ) -> PipSession: + assert not options.cache_dir or os.path.isabs(options.cache_dir) + session = PipSession( + cache=( + os.path.join(options.cache_dir, "http") if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = timeout if timeout is not None else options.timeout + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options: Values) -> None: + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, "no_index") + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, retries=0, timeout=min(5, options.timeout) + ) + with session: + pip_self_version_check(session, options) + + +KEEPABLE_TEMPDIR_TYPES = [ + tempdir_kinds.BUILD_ENV, + tempdir_kinds.EPHEM_WHEEL_CACHE, + tempdir_kinds.REQ_BUILD, +] + + +def warn_if_run_as_root() -> None: + """Output a warning for sudo users on Unix. + + In a virtual environment, sudo pip still writes to virtualenv. + On Windows, users may run pip as Administrator without issues. + This warning only applies to Unix root users outside of virtualenv. + """ + if running_under_virtualenv(): + return + if not hasattr(os, "getuid"): + return + # On Windows, there are no "system managed" Python packages. Installing as + # Administrator via pip is the correct way of updating system environments. + # + # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform + # checks: https://mypy.readthedocs.io/en/stable/common_issues.html + if sys.platform == "win32" or sys.platform == "cygwin": + return + + if os.getuid() != 0: + return + + logger.warning( + "Running pip as the 'root' user can result in broken permissions and " + "conflicting behaviour with the system package manager. " + "It is recommended to use a virtual environment instead: " + "https://pip.pypa.io/warnings/venv" + ) + + +def with_cleanup(func: Any) -> Any: + """Decorator for common logic related to managing temporary + directories. + """ + + def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: + for t in KEEPABLE_TEMPDIR_TYPES: + registry.set_delete(t, False) + + def wrapper( + self: RequirementCommand, options: Values, args: List[Any] + ) -> Optional[int]: + assert self.tempdir_registry is not None + if options.no_clean: + configure_tempdir_registry(self.tempdir_registry) + + try: + return func(self, options, args) + except PreviousBuildDirError: + # This kind of conflict can occur when the user passes an explicit + # build directory with a pre-existing folder. In that case we do + # not want to accidentally remove it. + configure_tempdir_registry(self.tempdir_registry) + raise + + return wrapper + + +class RequirementCommand(IndexGroupCommand): + def __init__(self, *args: Any, **kw: Any) -> None: + super().__init__(*args, **kw) + + self.cmd_opts.add_option(cmdoptions.no_clean()) + + @staticmethod + def determine_resolver_variant(options: Values) -> str: + """Determines which resolver should be used, based on the given options.""" + if "legacy-resolver" in options.deprecated_features_enabled: + return "legacy" + + return "2020-resolver" + + @staticmethod + def determine_build_failure_suppression(options: Values) -> bool: + """Determines whether build failures should be suppressed and backtracked on.""" + if "backtrack-on-build-failures" not in options.deprecated_features_enabled: + return False + + if "legacy-resolver" in options.deprecated_features_enabled: + raise CommandError("Cannot backtrack with legacy resolver.") + + deprecated( + reason=( + "Backtracking on build failures can mask issues related to how " + "a package generates metadata or builds a wheel. This flag will " + "be removed in pip 22.2." + ), + gone_in=None, + replacement=( + "avoiding known-bad versions by explicitly telling pip to ignore them " + "(either directly as requirements, or via a constraints file)" + ), + feature_flag=None, + issue=10655, + ) + return True + + @classmethod + def make_requirement_preparer( + cls, + temp_build_dir: TempDirectory, + options: Values, + req_tracker: RequirementTracker, + session: PipSession, + finder: PackageFinder, + use_user_site: bool, + download_dir: Optional[str] = None, + verbosity: int = 0, + ) -> RequirementPreparer: + """ + Create a RequirementPreparer instance for the given parameters. + """ + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + + resolver_variant = cls.determine_resolver_variant(options) + if resolver_variant == "2020-resolver": + lazy_wheel = "fast-deps" in options.features_enabled + if lazy_wheel: + logger.warning( + "pip is using lazily downloaded wheels using HTTP " + "range requests to obtain dependency information. " + "This experimental feature is enabled through " + "--use-feature=fast-deps and it is not ready for " + "production." + ) + else: + lazy_wheel = False + if "fast-deps" in options.features_enabled: + logger.warning( + "fast-deps has no effect when used with the legacy resolver." + ) + + in_tree_build = "out-of-tree-build" not in options.deprecated_features_enabled + if "in-tree-build" in options.features_enabled: + deprecated( + reason="In-tree builds are now the default.", + replacement="to remove the --use-feature=in-tree-build flag", + gone_in="22.1", + ) + if "out-of-tree-build" in options.deprecated_features_enabled: + deprecated( + reason="Out-of-tree builds are deprecated.", + replacement=None, + gone_in="22.1", + ) + + if options.progress_bar not in {"on", "off"}: + deprecated( + reason="Custom progress bar styles are deprecated", + replacement="to use the default progress bar style.", + gone_in="22.1", + ) + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + session=session, + progress_bar=options.progress_bar, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + lazy_wheel=lazy_wheel, + verbosity=verbosity, + in_tree_build=in_tree_build, + ) + + @classmethod + def make_resolver( + cls, + preparer: RequirementPreparer, + finder: PackageFinder, + options: Values, + wheel_cache: Optional[WheelCache] = None, + use_user_site: bool = False, + ignore_installed: bool = True, + ignore_requires_python: bool = False, + force_reinstall: bool = False, + upgrade_strategy: str = "to-satisfy-only", + use_pep517: Optional[bool] = None, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> BaseResolver: + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + use_pep517=use_pep517, + ) + suppress_build_failures = cls.determine_build_failure_suppression(options) + resolver_variant = cls.determine_resolver_variant(options) + # The long import name and duplicated invocation is needed to convince + # Mypy into correctly typechecking. Otherwise it would complain the + # "Resolver" class being redefined. + if resolver_variant == "2020-resolver": + import pip._internal.resolution.resolvelib.resolver + + return pip._internal.resolution.resolvelib.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + suppress_build_failures=suppress_build_failures, + ) + import pip._internal.resolution.legacy.resolver + + return pip._internal.resolution.legacy.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def get_requirements( + self, + args: List[str], + options: Values, + finder: PackageFinder, + session: PipSession, + ) -> List[InstallRequirement]: + """ + Parse command-line arguments into the corresponding requirements. + """ + requirements: List[InstallRequirement] = [] + for filename in options.constraints: + for parsed_req in parse_requirements( + filename, + constraint=True, + finder=finder, + options=options, + session=session, + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + user_supplied=False, + ) + requirements.append(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, + None, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + ) + requirements.append(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + user_supplied=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + ) + requirements.append(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, finder=finder, options=options, session=session + ): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + ) + requirements.append(req_to_add) + + # If any requirement has hash options, enable hash checking. + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {"name": self.name} + if options.find_links: + raise CommandError( + "You must give at least one requirement to {name} " + '(maybe you meant "pip {name} {links}"?)'.format( + **dict(opts, links=" ".join(options.find_links)) + ) + ) + else: + raise CommandError( + "You must give at least one requirement to {name} " + '(see "pip help {name}")'.format(**opts) + ) + + return requirements + + @staticmethod + def trace_basic_info(finder: PackageFinder) -> None: + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = LinkCollector.create(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/cli/spinners.py b/python/lib/python3.10/site-packages/pip/_internal/cli/spinners.py new file mode 100644 index 0000000..1e313e1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/cli/spinners.py @@ -0,0 +1,157 @@ +import contextlib +import itertools +import logging +import sys +import time +from typing import IO, Iterator + +from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation + +logger = logging.getLogger(__name__) + + +class SpinnerInterface: + def spin(self) -> None: + raise NotImplementedError() + + def finish(self, final_status: str) -> None: + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__( + self, + message: str, + file: IO[str] = None, + spin_chars: str = "-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds: float = 0.125, + ): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status: str) -> None: + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status: str) -> None: + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self) -> None: + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status: str) -> None: + if self._finished: + return + self._update(f"finished with status '{final_status}'") + self._finished = True + + +class RateLimiter: + def __init__(self, min_update_interval_seconds: float) -> None: + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update: float = 0 + + def ready(self) -> bool: + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self) -> None: + self._last_update = time.time() + + +@contextlib.contextmanager +def open_spinner(message: str) -> Iterator[SpinnerInterface]: + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner: SpinnerInterface = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") + + +@contextlib.contextmanager +def hidden_cursor(file: IO[str]) -> Iterator[None]: + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) diff --git a/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py b/python/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/cli/status_codes.py rename to python/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c72f24f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,127 @@ +""" +Package containing all pip commands +""" + +import importlib +from collections import namedtuple +from typing import Any, Dict, Optional + +from pip._internal.cli.base_command import Command + +CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") + +# This dictionary does a bunch of heavy lifting for help output: +# - Enables avoiding additional (costly) imports for presenting `--help`. +# - The ordering matters for help display. +# +# Even though the module path starts with the same "pip._internal.commands" +# prefix, the full path makes testing easier (specifically when modifying +# `commands_dict` in test setup / teardown). +commands_dict: Dict[str, CommandInfo] = { + "install": CommandInfo( + "pip._internal.commands.install", + "InstallCommand", + "Install packages.", + ), + "download": CommandInfo( + "pip._internal.commands.download", + "DownloadCommand", + "Download packages.", + ), + "uninstall": CommandInfo( + "pip._internal.commands.uninstall", + "UninstallCommand", + "Uninstall packages.", + ), + "freeze": CommandInfo( + "pip._internal.commands.freeze", + "FreezeCommand", + "Output installed packages in requirements format.", + ), + "list": CommandInfo( + "pip._internal.commands.list", + "ListCommand", + "List installed packages.", + ), + "show": CommandInfo( + "pip._internal.commands.show", + "ShowCommand", + "Show information about installed packages.", + ), + "check": CommandInfo( + "pip._internal.commands.check", + "CheckCommand", + "Verify installed packages have compatible dependencies.", + ), + "config": CommandInfo( + "pip._internal.commands.configuration", + "ConfigurationCommand", + "Manage local and global configuration.", + ), + "search": CommandInfo( + "pip._internal.commands.search", + "SearchCommand", + "Search PyPI for packages.", + ), + "cache": CommandInfo( + "pip._internal.commands.cache", + "CacheCommand", + "Inspect and manage pip's wheel cache.", + ), + "index": CommandInfo( + "pip._internal.commands.index", + "IndexCommand", + "Inspect information available from package indexes.", + ), + "wheel": CommandInfo( + "pip._internal.commands.wheel", + "WheelCommand", + "Build wheels from your requirements.", + ), + "hash": CommandInfo( + "pip._internal.commands.hash", + "HashCommand", + "Compute hashes of package archives.", + ), + "completion": CommandInfo( + "pip._internal.commands.completion", + "CompletionCommand", + "A helper command used for command completion.", + ), + "debug": CommandInfo( + "pip._internal.commands.debug", + "DebugCommand", + "Show information useful for debugging.", + ), + "help": CommandInfo( + "pip._internal.commands.help", + "HelpCommand", + "Show help for commands.", + ), +} + + +def create_command(name: str, **kwargs: Any) -> Command: + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name: str) -> Optional[str]: + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return None diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/cache.py b/python/lib/python3.10/site-packages/pip/_internal/commands/cache.py new file mode 100644 index 0000000..f1a489d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/cache.py @@ -0,0 +1,223 @@ +import os +import textwrap +from optparse import Values +from typing import Any, List + +import pip._internal.utils.filesystem as filesystem +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, PipError +from pip._internal.utils.logging import getLogger + +logger = getLogger(__name__) + + +class CacheCommand(Command): + """ + Inspect and manage pip's wheel cache. + + Subcommands: + + - dir: Show the cache directory. + - info: Show information about the cache. + - list: List filenames of packages stored in the cache. + - remove: Remove one or more package from the cache. + - purge: Remove all items from the cache. + + ```` can be a glob expression or a package name. + """ + + ignore_require_venv = True + usage = """ + %prog dir + %prog info + %prog list [] [--format=[human, abspath]] + %prog remove + %prog purge + """ + + def add_options(self) -> None: + + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="human", + choices=("human", "abspath"), + help="Select the output format among: human (default) or abspath", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "dir": self.get_cache_dir, + "info": self.get_cache_info, + "list": self.list_cache_items, + "remove": self.remove_cache_items, + "purge": self.purge_cache, + } + + if not options.cache_dir: + logger.error("pip cache commands can not function since cache is disabled.") + return ERROR + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def get_cache_dir(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + logger.info(options.cache_dir) + + def get_cache_info(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + num_http_files = len(self._find_http_files(options)) + num_packages = len(self._find_wheels(options, "*")) + + http_cache_location = self._cache_dir(options, "http") + wheels_cache_location = self._cache_dir(options, "wheels") + http_cache_size = filesystem.format_directory_size(http_cache_location) + wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) + + message = ( + textwrap.dedent( + """ + Package index page cache location: {http_cache_location} + Package index page cache size: {http_cache_size} + Number of HTTP files: {num_http_files} + Wheels location: {wheels_cache_location} + Wheels size: {wheels_cache_size} + Number of wheels: {package_count} + """ + ) + .format( + http_cache_location=http_cache_location, + http_cache_size=http_cache_size, + num_http_files=num_http_files, + wheels_cache_location=wheels_cache_location, + package_count=num_packages, + wheels_cache_size=wheels_cache_size, + ) + .strip() + ) + + logger.info(message) + + def list_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if args: + pattern = args[0] + else: + pattern = "*" + + files = self._find_wheels(options, pattern) + if options.list_format == "human": + self.format_for_human(files) + else: + self.format_for_abspath(files) + + def format_for_human(self, files: List[str]) -> None: + if not files: + logger.info("Nothing cached.") + return + + results = [] + for filename in files: + wheel = os.path.basename(filename) + size = filesystem.format_file_size(filename) + results.append(f" - {wheel} ({size})") + logger.info("Cache contents:\n") + logger.info("\n".join(sorted(results))) + + def format_for_abspath(self, files: List[str]) -> None: + if not files: + return + + results = [] + for filename in files: + results.append(filename) + + logger.info("\n".join(sorted(results))) + + def remove_cache_items(self, options: Values, args: List[Any]) -> None: + if len(args) > 1: + raise CommandError("Too many arguments") + + if not args: + raise CommandError("Please provide a pattern") + + files = self._find_wheels(options, args[0]) + + no_matching_msg = "No matching packages" + if args[0] == "*": + # Only fetch http files if no specific pattern given + files += self._find_http_files(options) + else: + # Add the pattern to the log message + no_matching_msg += ' for pattern "{}"'.format(args[0]) + + if not files: + logger.warning(no_matching_msg) + + for filename in files: + os.unlink(filename) + logger.verbose("Removed %s", filename) + logger.info("Files removed: %s", len(files)) + + def purge_cache(self, options: Values, args: List[Any]) -> None: + if args: + raise CommandError("Too many arguments") + + return self.remove_cache_items(options, ["*"]) + + def _cache_dir(self, options: Values, subdir: str) -> str: + return os.path.join(options.cache_dir, subdir) + + def _find_http_files(self, options: Values) -> List[str]: + http_dir = self._cache_dir(options, "http") + return filesystem.find_files(http_dir, "*") + + def _find_wheels(self, options: Values, pattern: str) -> List[str]: + wheel_dir = self._cache_dir(options, "wheels") + + # The wheel filename format, as specified in PEP 427, is: + # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl + # + # Additionally, non-alphanumeric values in the distribution are + # normalized to underscores (_), meaning hyphens can never occur + # before `-{version}`. + # + # Given that information: + # - If the pattern we're given contains a hyphen (-), the user is + # providing at least the version. Thus, we can just append `*.whl` + # to match the rest of it. + # - If the pattern we're given doesn't contain a hyphen (-), the + # user is only providing the name. Thus, we append `-*.whl` to + # match the hyphen before the version, followed by anything else. + # + # PEP 427: https://www.python.org/dev/peps/pep-0427/ + pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") + + return filesystem.find_files(wheel_dir, pattern) diff --git a/lib/python3.11/site-packages/pip/_internal/commands/check.py b/python/lib/python3.10/site-packages/pip/_internal/commands/check.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/commands/check.py rename to python/lib/python3.10/site-packages/pip/_internal/commands/check.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/completion.py b/python/lib/python3.10/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..c0fb4ca --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,96 @@ +import sys +import textwrap +from optparse import Values +from typing import List + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip {shell} completion start{script}# pip {shell} completion end +""" + +COMPLETION_SCRIPTS = { + "bash": """ + _pip_completion() + {{ + COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) ) + }} + complete -o default -F _pip_completion {prog} + """, + "zsh": """ + function _pip_completion {{ + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )) + }} + compctl -K _pip_completion {prog} + """, + "fish": """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c {prog} + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--bash", + "-b", + action="store_const", + const="bash", + dest="shell", + help="Emit completion code for bash", + ) + self.cmd_opts.add_option( + "--zsh", + "-z", + action="store_const", + const="zsh", + dest="shell", + help="Emit completion code for zsh", + ) + self.cmd_opts.add_option( + "--fish", + "-f", + action="store_const", + const="fish", + dest="shell", + help="Emit completion code for fish", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ["--" + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog()) + ) + print(BASE_COMPLETION.format(script=script, shell=options.shell)) + return SUCCESS + else: + sys.stderr.write( + "ERROR: You must pass {}\n".format(" or ".join(shell_options)) + ) + return SUCCESS diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/configuration.py b/python/lib/python3.10/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..c6c74ed --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,266 @@ +import logging +import os +import subprocess +from optparse import Values +from typing import Any, List, Optional + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import ( + Configuration, + Kind, + get_configuration_files, + kinds, +) +from pip._internal.exceptions import PipError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_prog, write_output + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """ + Manage local and global configuration. + + Subcommands: + + - list: List the active configuration (or from the file specified) + - edit: Edit the configuration file in an editor + - get: Get the value associated with name + - set: Set the name=value + - unset: Unset the value associated with name + - debug: List the configuration files and values defined under them + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen to the user file by + default. + """ + + ignore_require_venv = True + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + %prog [] debug + """ + + def add_options(self) -> None: + self.cmd_opts.add_option( + "--editor", + dest="editor", + action="store", + default=None, + help=( + "Editor to use to edit the file. Uses VISUAL or EDITOR " + "environment variables if not provided." + ), + ) + + self.cmd_opts.add_option( + "--global", + dest="global_file", + action="store_true", + default=False, + help="Use the system-wide configuration file only", + ) + + self.cmd_opts.add_option( + "--user", + dest="user_file", + action="store_true", + default=False, + help="Use the user configuration file only", + ) + + self.cmd_opts.add_option( + "--site", + dest="site_file", + action="store_true", + default=False, + help="Use the current environment configuration file only", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name, + "debug": self.list_config_values, + } + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]: + file_options = [ + key + for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) + if value + ] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options: Values, args: List[str]) -> None: + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options: Values, args: List[str]) -> None: + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options: Values, args: List[str]) -> None: + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def list_config_values(self, options: Values, args: List[str]) -> None: + """List config key-value pairs across different config files""" + self._get_n_args(args, "debug", n=0) + + self.print_env_var_values() + # Iterate over config files and print if they exist, and the + # key-value pairs present in them if they do + for variant, files in sorted(self.configuration.iter_config_files()): + write_output("%s:", variant) + for fname in files: + with indent_log(): + file_exists = os.path.exists(fname) + write_output("%s, exists: %r", fname, file_exists) + if file_exists: + self.print_config_file_values(variant) + + def print_config_file_values(self, variant: Kind) -> None: + """Get key-value pairs from the file of a variant""" + for name, value in self.configuration.get_values_in_config(variant).items(): + with indent_log(): + write_output("%s: %s", name, value) + + def print_env_var_values(self) -> None: + """Get key-values pairs present as environment variables""" + write_output("%s:", "env_var") + with indent_log(): + for key, value in sorted(self.configuration.get_environ_vars()): + env_var = f"PIP_{key.upper()}" + write_output("%s=%r", env_var, value) + + def open_in_editor(self, options: Values, args: List[str]) -> None: + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}".format(e.returncode) + ) + + def _get_n_args(self, args: List[str], example: str, n: int) -> Any: + """Helper to make sure the command got the right number of arguments""" + if len(args) != n: + msg = ( + "Got unexpected number of arguments, expected {}. " + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self) -> None: + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.exception( + "Unable to save configuration. Please report this as a bug." + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options: Values) -> str: + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/debug.py b/python/lib/python3.10/site-packages/pip/_internal/commands/debug.py new file mode 100644 index 0000000..d3f1f28 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/debug.py @@ -0,0 +1,202 @@ +import locale +import logging +import os +import sys +from optparse import Values +from types import ModuleType +from typing import Any, Dict, List, Optional + +import pip._vendor +from pip._vendor.certifi import where +from pip._vendor.packaging.version import parse as parse_version + +from pip import __file__ as pip_location +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.configuration import Configuration +from pip._internal.metadata import get_environment +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_pip_version + +logger = logging.getLogger(__name__) + + +def show_value(name: str, value: Any) -> None: + logger.info("%s: %s", name, value) + + +def show_sys_implementation() -> None: + logger.info("sys.implementation:") + implementation_name = sys.implementation.name + with indent_log(): + show_value("name", implementation_name) + + +def create_vendor_txt_map() -> Dict[str, str]: + vendor_txt_path = os.path.join( + os.path.dirname(pip_location), "_vendor", "vendor.txt" + ) + + with open(vendor_txt_path) as f: + # Purge non version specifying lines. + # Also, remove any space prefix or suffixes (including comments). + lines = [ + line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line + ] + + # Transform into "module" -> version dict. + return dict(line.split("==", 1) for line in lines) # type: ignore + + +def get_module_from_module_name(module_name: str) -> ModuleType: + # Module name can be uppercase in vendor.txt for some reason... + module_name = module_name.lower() + # PATCH: setuptools is actually only pkg_resources. + if module_name == "setuptools": + module_name = "pkg_resources" + + __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) + return getattr(pip._vendor, module_name) + + +def get_vendor_version_from_module(module_name: str) -> Optional[str]: + module = get_module_from_module_name(module_name) + version = getattr(module, "__version__", None) + + if not version: + # Try to find version in debundled module info. + env = get_environment([os.path.dirname(module.__file__)]) + dist = env.get_distribution(module_name) + if dist: + version = str(dist.version) + + return version + + +def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: + """Log the actual version and print extra info if there is + a conflict or if the actual version could not be imported. + """ + for module_name, expected_version in vendor_txt_versions.items(): + extra_message = "" + actual_version = get_vendor_version_from_module(module_name) + if not actual_version: + extra_message = ( + " (Unable to locate actual module version, using" + " vendor.txt specified version)" + ) + actual_version = expected_version + elif parse_version(actual_version) != parse_version(expected_version): + extra_message = ( + " (CONFLICT: vendor.txt suggests version should" + " be {})".format(expected_version) + ) + logger.info("%s==%s%s", module_name, actual_version, extra_message) + + +def show_vendor_versions() -> None: + logger.info("vendored library versions:") + + vendor_txt_versions = create_vendor_txt_map() + with indent_log(): + show_actual_vendor_versions(vendor_txt_versions) + + +def show_tags(options: Values) -> None: + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = "" + if formatted_target: + suffix = f" (target: {formatted_target})" + + msg = "Compatible tags: {}{}".format(len(tags), suffix) + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = ( + "...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" + ).format(tag_limit=tag_limit) + logger.info(msg) + + +def ca_bundle_info(config: Configuration) -> str: + levels = set() + for key, _ in config.items(): + levels.add(key.split(".")[0]) + + if not levels: + return "Not specified" + + levels_that_override_global = ["install", "wheel", "download"] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return "global" + + if "global" in levels: + levels.remove("global") + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + self.parser.insert_option_group(0, self.cmd_opts) + self.parser.config.load() + + def run(self, options: Values, args: List[str]) -> int: + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value("pip version", get_pip_version()) + show_value("sys.version", sys.version) + show_value("sys.executable", sys.executable) + show_value("sys.getdefaultencoding", sys.getdefaultencoding()) + show_value("sys.getfilesystemencoding", sys.getfilesystemencoding()) + show_value( + "locale.getpreferredencoding", + locale.getpreferredencoding(), + ) + show_value("sys.platform", sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE")) + show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE")) + show_value("pip._vendor.certifi.where()", where()) + show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) + + show_vendor_versions() + + show_tags(options) + + return SUCCESS diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/download.py b/python/lib/python3.10/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..233b7e9 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,140 @@ +import logging +import os +from optparse import Values +from typing import List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.global_options()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + + self.cmd_opts.add_option( + "-d", + "--dest", + "--destination-dir", + "--destination-directory", + dest="download_dir", + metavar="dir", + default=os.curdir, + help="Download packages into .", + ) + + cmdoptions.add_target_python_options(self.cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="download", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + ignore_requires_python=options.ignore_requires_python, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + downloaded: List[str] = [] + for req in requirement_set.requirements.values(): + if req.satisfied_by is None: + assert req.name is not None + preparer.save_linked_requirement(req) + downloaded.append(req.name) + if downloaded: + write_output("Successfully downloaded %s", " ".join(downloaded)) + + return SUCCESS diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/freeze.py b/python/lib/python3.10/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..6e9cc76 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,97 @@ +import sys +from optparse import Values +from typing import List + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {"pip", "setuptools", "distribute", "wheel", "pkg-resources"} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times." + ), + ) + self.cmd_opts.add_option( + "-l", + "--local", + dest="local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not output " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--all", + dest="freeze_all", + action="store_true", + help=( + "Do not skip these packages in the output:" + " {}".format(", ".join(DEV_PKGS)) + ), + ) + self.cmd_opts.add_option( + "--exclude-editable", + dest="exclude_editable", + action="store_true", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + if options.excludes: + skip.update(options.excludes) + + cmdoptions.check_list_path_option(options) + + for line in freeze( + requirement=options.requirements, + local_only=options.local, + user_only=options.user, + paths=options.path, + isolated=options.isolated_mode, + skip=skip, + exclude_editable=options.exclude_editable, + ): + sys.stdout.write(line + "\n") + return SUCCESS diff --git a/lib/python3.11/site-packages/pip/_internal/commands/hash.py b/python/lib/python3.10/site-packages/pip/_internal/commands/hash.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/commands/hash.py rename to python/lib/python3.10/site-packages/pip/_internal/commands/hash.py diff --git a/lib/python3.11/site-packages/pip/_internal/commands/help.py b/python/lib/python3.10/site-packages/pip/_internal/commands/help.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/commands/help.py rename to python/lib/python3.10/site-packages/pip/_internal/commands/help.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/index.py b/python/lib/python3.10/site-packages/pip/_internal/commands/index.py new file mode 100644 index 0000000..9d8aae3 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/index.py @@ -0,0 +1,139 @@ +import logging +from optparse import Values +from typing import Any, Iterable, List, Optional, Union + +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.commands.search import print_dist_installation_info +from pip._internal.exceptions import CommandError, DistributionNotFound, PipError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.network.session import PipSession +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class IndexCommand(IndexGroupCommand): + """ + Inspect information available from package indexes. + """ + + usage = """ + %prog versions + """ + + def add_options(self) -> None: + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + handlers = { + "versions": self.get_available_package_versions, + } + + logger.warning( + "pip index is currently an experimental command. " + "It may be removed/changed in a future release " + "without prior warning." + ) + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _build_package_finder( + self, + options: Values, + session: PipSession, + target_python: Optional[TargetPython] = None, + ignore_requires_python: Optional[bool] = None, + ) -> PackageFinder: + """ + Create a package finder appropriate to the index command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, + ) + + def get_available_package_versions(self, options: Values, args: List[Any]) -> None: + if len(args) != 1: + raise CommandError("You need to specify exactly one argument") + + target_python = cmdoptions.make_target_python(options) + query = args[0] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + + versions: Iterable[Union[LegacyVersion, Version]] = ( + candidate.version for candidate in finder.find_all_candidates(query) + ) + + if not options.pre: + # Remove prereleases + versions = ( + version for version in versions if not version.is_prerelease + ) + versions = set(versions) + + if not versions: + raise DistributionNotFound( + "No matching distribution found for {}".format(query) + ) + + formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] + latest = formatted_versions[0] + + write_output("{} ({})".format(query, latest)) + write_output("Available versions: {}".format(", ".join(formatted_versions))) + print_dist_installation_info(query, latest) diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/install.py b/python/lib/python3.10/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..34e4c2f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,771 @@ +import errno +import operator +import os +import shutil +import site +from optparse import SUPPRESS_HELP, Values +from typing import Iterable, List, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import ( + RequirementCommand, + warn_if_run_as_root, + with_cleanup, +) +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import get_scheme +from pip._internal.metadata import get_environment +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.check import ConflictDetails, check_install_conflicts +from pip._internal.req import install_given_reqs +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.distutils_args import parse_distutils_args +from pip._internal.utils.filesystem import test_writable_dir +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ( + ensure_dir, + get_pip_version, + protect_pip_from_modification_on_windows, + write_output, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.virtualenv import ( + running_under_virtualenv, + virtualenv_no_global, +) +from pip._internal.wheel_builder import ( + BinaryAllowedPredicate, + build, + should_build_for_install_command, +) + +logger = getLogger(__name__) + + +def get_check_binary_allowed(format_control: FormatControl) -> BinaryAllowedPredicate: + def check_binary_allowed(req: InstallRequirement) -> bool: + canonical_name = canonicalize_name(req.name or "") + allowed_formats = format_control.get_allowed_formats(canonical_name) + return "binary" in allowed_formats + + return check_binary_allowed + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.pre()) + + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option( + "-t", + "--target", + dest="target_dir", + metavar="dir", + default=None, + help=( + "Install packages into . " + "By default this will not replace existing files/folders in " + ". Use --upgrade to replace existing packages in " + "with new versions." + ), + ) + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option( + "--user", + dest="use_user_site", + action="store_true", + help=( + "Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)" + ), + ) + self.cmd_opts.add_option( + "--no-user", + dest="use_user_site", + action="store_false", + help=SUPPRESS_HELP, + ) + self.cmd_opts.add_option( + "--root", + dest="root_path", + metavar="dir", + default=None, + help="Install everything relative to this alternate root directory.", + ) + self.cmd_opts.add_option( + "--prefix", + dest="prefix_path", + metavar="dir", + default=None, + help=( + "Installation prefix where lib, bin and other top-level " + "folders are placed" + ), + ) + + self.cmd_opts.add_option(cmdoptions.src()) + + self.cmd_opts.add_option( + "-U", + "--upgrade", + dest="upgrade", + action="store_true", + help=( + "Upgrade all specified packages to the newest available " + "version. The handling of dependencies depends on the " + "upgrade-strategy used." + ), + ) + + self.cmd_opts.add_option( + "--upgrade-strategy", + dest="upgrade_strategy", + default="only-if-needed", + choices=["only-if-needed", "eager"], + help=( + "Determines how dependency upgrading should be handled " + "[default: %default]. " + '"eager" - dependencies are upgraded regardless of ' + "whether the currently installed version satisfies the " + "requirements of the upgraded package(s). " + '"only-if-needed" - are upgraded only when they do not ' + "satisfy the requirements of the upgraded package(s)." + ), + ) + + self.cmd_opts.add_option( + "--force-reinstall", + dest="force_reinstall", + action="store_true", + help="Reinstall all packages even if they are already up-to-date.", + ) + + self.cmd_opts.add_option( + "-I", + "--ignore-installed", + dest="ignore_installed", + action="store_true", + help=( + "Ignore the installed packages, overwriting them. " + "This can break your system if the existing package " + "is of a different version or was installed " + "with a different package manager!" + ), + ) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + + self.cmd_opts.add_option(cmdoptions.install_options()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + self.cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + if options.use_user_site and options.target_dir is not None: + raise CommandError("Can not combine '--user' and '--target'") + + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + install_options = options.install_options or [] + + logger.verbose("Using %s", get_pip_version()) + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir: Optional[TempDirectory] = None + target_temp_dir_path: Optional[str] = None + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if ( + # fmt: off + os.path.exists(options.target_dir) and + not os.path.isdir(options.target_dir) + # fmt: on + ): + raise CommandError( + "Target path exists but is not a directory, will not continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + self.enter_context(target_temp_dir) + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="install", + globally_managed=True, + ) + + try: + reqs = self.get_requirements(args, options, finder, session) + + # Only when installing is it permitted to use PEP 660. + # In other circumstances (pip wheel, pip download) we generate + # regular (i.e. non editable) metadata and wheels. + for req in reqs: + req.permit_editable_wheels = True + + reject_location_related_install_options(reqs, options.install_options) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + verbosity=self.verbosity, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=not options.target_dir + ) + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = False + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows(modifying_pip=modifying_pip) + + check_binary_allowed = get_check_binary_allowed(finder.format_control) + + reqs_to_build = [ + r + for r in requirement_set.requirements.values() + if should_build_for_install_command(r, check_binary_allowed) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=True, + build_options=[], + global_options=[], + ) + + # If we're using PEP 517, we cannot do a legacy setup.py install + # so we fail here. + pep517_build_failure_names: List[str] = [ + r.name for r in build_failures if r.use_pep517 # type: ignore + ] + if pep517_build_failure_names: + raise InstallationError( + "Could not build wheels for {}, which is required to " + "install pyproject.toml-based projects".format( + ", ".join(pep517_build_failure_names) + ) + ) + + # For now, we just warn about failures building legacy + # requirements, as we'll fall through to a setup.py install for + # those. + for r in build_failures: + if not r.use_pep517: + r.legacy_install_reason = 8368 + + to_install = resolver.get_installation_order(requirement_set) + + # Check for conflicts in the package set we're installing. + conflicts: Optional[ConflictDetails] = None + should_warn_about_conflicts = ( + not options.ignore_dependencies and options.warn_about_conflicts + ) + if should_warn_about_conflicts: + conflicts = self._determine_conflicts(to_install) + + # Don't warn about script install locations if + # --target or --prefix has been specified + warn_script_location = options.warn_script_location + if options.target_dir or options.prefix_path: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + pycompile=options.compile, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + env = get_environment(lib_locations) + + installed.sort(key=operator.attrgetter("name")) + items = [] + for result in installed: + item = result.name + try: + installed_dist = env.get_distribution(item) + if installed_dist is not None: + item = f"{item}-{installed_dist.version}" + except Exception: + pass + items.append(item) + + if conflicts is not None: + self._warn_about_conflicts( + conflicts, + resolver_variant=self.determine_resolver_variant(options), + ) + + installed_desc = " ".join(items) + if installed_desc: + write_output( + "Successfully installed %s", + installed_desc, + ) + except OSError as error: + show_traceback = self.verbosity >= 1 + + message = create_os_error_message( + error, + show_traceback, + options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) # noqa + + return ERROR + + if options.target_dir: + assert target_temp_dir + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + + warn_if_run_as_root() + return SUCCESS + + def _handle_target_dir( + self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool + ) -> None: + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = get_scheme("", home=target_temp_dir.path) + purelib_dir = scheme.purelib + platlib_dir = scheme.platlib + data_dir = scheme.data + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + "Target directory %s already exists. Specify " + "--upgrade to force replacement.", + target_item_dir, + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + "Target directory %s already exists and is " + "a link. pip will not automatically replace " + "links, please remove if replacement is " + "desired.", + target_item_dir, + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move(os.path.join(lib_dir, item), target_item_dir) + + def _determine_conflicts( + self, to_install: List[InstallRequirement] + ) -> Optional[ConflictDetails]: + try: + return check_install_conflicts(to_install) + except Exception: + logger.exception( + "Error while checking for conflicts. Please file an issue on " + "pip's issue tracker: https://github.com/pypa/pip/issues/new" + ) + return None + + def _warn_about_conflicts( + self, conflict_details: ConflictDetails, resolver_variant: str + ) -> None: + package_set, (missing, conflicting) = conflict_details + if not missing and not conflicting: + return + + parts: List[str] = [] + if resolver_variant == "legacy": + parts.append( + "pip's legacy dependency resolver does not consider dependency " + "conflicts when selecting packages. This behaviour is the " + "source of the following dependency conflicts." + ) + else: + assert resolver_variant == "2020-resolver" + parts.append( + "pip's dependency resolver does not currently take into account " + "all the packages that are installed. This behaviour is the " + "source of the following dependency conflicts." + ) + + # NOTE: There is some duplication here, with commands/check.py + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + message = ( + "{name} {version} requires {requirement}, " + "which is not installed." + ).format( + name=project_name, + version=version, + requirement=dependency[1], + ) + parts.append(message) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + message = ( + "{name} {version} requires {requirement}, but {you} have " + "{dep_name} {dep_version} which is incompatible." + ).format( + name=project_name, + version=version, + requirement=req, + dep_name=dep_name, + dep_version=dep_version, + you=("you" if resolver_variant == "2020-resolver" else "you'll"), + ) + parts.append(message) + + logger.critical("\n".join(parts)) + + +def get_lib_location_guesses( + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> List[str]: + scheme = get_scheme( + "", + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + return [scheme.purelib, scheme.platlib] + + +def site_packages_writable(root: Optional[str], isolated: bool) -> bool: + return all( + test_writable_dir(d) + for d in set(get_lib_location_guesses(root=root, isolated=isolated)) + ) + + +def decide_user_install( + use_user_site: Optional[bool], + prefix_path: Optional[str] = None, + target_dir: Optional[str] = None, + root_path: Optional[str] = None, + isolated_mode: bool = False, +) -> bool: + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info( + "Defaulting to user installation because normal site-packages " + "is not writeable" + ) + return True + + +def reject_location_related_install_options( + requirements: List[InstallRequirement], options: Optional[List[str]] +) -> None: + """If any location-changing --install-option arguments were passed for + requirements or on the command-line, then show a deprecation warning. + """ + + def format_options(option_names: Iterable[str]) -> List[str]: + return ["--{}".format(name.replace("_", "-")) for name in option_names] + + offenders = [] + + for requirement in requirements: + install_options = requirement.install_options + location_options = parse_distutils_args(install_options) + if location_options: + offenders.append( + "{!r} from {}".format( + format_options(location_options.keys()), requirement + ) + ) + + if options: + location_options = parse_distutils_args(options) + if location_options: + offenders.append( + "{!r} from command line".format(format_options(location_options.keys())) + ) + + if not offenders: + return + + raise CommandError( + "Location-changing options found in --install-option: {}." + " This is unsupported, use pip-level options like --user," + " --prefix, --root, and --target instead.".format("; ".join(offenders)) + ) + + +def create_os_error_message( + error: OSError, show_traceback: bool, using_user_site: bool +) -> str: + """Format an error message for an OSError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an OSError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not running_under_virtualenv() and not using_user_site: + parts.extend( + [ + user_option_part, + " or ", + permissions_part.lower(), + ] + ) + else: + parts.append(permissions_part) + parts.append(".\n") + + # Suggest the user to enable Long Paths if path length is + # more than 260 + if ( + WINDOWS + and error.errno == errno.ENOENT + and error.filename + and len(error.filename) > 260 + ): + parts.append( + "HINT: This error might have occurred since " + "this system does not have Windows Long Path " + "support enabled. You can find information on " + "how to enable this at " + "https://pip.pypa.io/warnings/enable-long-paths\n" + ) + + return "".join(parts).strip() + "\n" diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/list.py b/python/lib/python3.10/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..3a545e9 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,363 @@ +import json +import logging +from optparse import Values +from typing import TYPE_CHECKING, Iterator, List, Optional, Sequence, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import IndexGroupCommand +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.misc import tabulate, write_output + +if TYPE_CHECKING: + from pip._internal.metadata.base import DistributionVersion + + class _DistWithLatestInfo(BaseDistribution): + """Give the distribution object a couple of extra fields. + + These will be populated during ``get_outdated()``. This is dirty but + makes the rest of the code much cleaner. + """ + + latest_version: DistributionVersion + latest_filetype: str + + _ProcessedDists = Sequence[_DistWithLatestInfo] + + +from pip._vendor.packaging.version import parse + +logger = logging.getLogger(__name__) + + +class ListCommand(IndexGroupCommand): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + + ignore_require_venv = True + usage = """ + %prog [options]""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-o", + "--outdated", + action="store_true", + default=False, + help="List outdated packages", + ) + self.cmd_opts.add_option( + "-u", + "--uptodate", + action="store_true", + default=False, + help="List uptodate packages", + ) + self.cmd_opts.add_option( + "-e", + "--editable", + action="store_true", + default=False, + help="List editable projects.", + ) + self.cmd_opts.add_option( + "-l", + "--local", + action="store_true", + default=False, + help=( + "If in a virtualenv that has global access, do not list " + "globally-installed packages." + ), + ) + self.cmd_opts.add_option( + "--user", + dest="user", + action="store_true", + default=False, + help="Only output packages installed in user-site.", + ) + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option( + "--format", + action="store", + dest="list_format", + default="columns", + choices=("columns", "freeze", "json"), + help="Select the output format among: columns (default), freeze, or json", + ) + + self.cmd_opts.add_option( + "--not-required", + action="store_true", + dest="not_required", + help="List packages that are not dependencies of installed packages.", + ) + + self.cmd_opts.add_option( + "--exclude-editable", + action="store_false", + dest="include_editable", + help="Exclude editable package from output.", + ) + self.cmd_opts.add_option( + "--include-editable", + action="store_true", + dest="include_editable", + help="Include editable package from output.", + default=True, + ) + self.cmd_opts.add_option(cmdoptions.list_exclude()) + index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def _build_package_finder( + self, options: Values, session: PipSession + ) -> PackageFinder: + """ + Create a package finder appropriate to this list command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + use_deprecated_html5lib="html5lib" in options.deprecated_features_enabled, + ) + + def run(self, options: Values, args: List[str]) -> int: + if options.outdated and options.uptodate: + raise CommandError("Options --outdated and --uptodate cannot be combined.") + + cmdoptions.check_list_path_option(options) + + skip = set(stdlib_pkgs) + if options.excludes: + skip.update(canonicalize_name(n) for n in options.excludes) + + packages: "_ProcessedDists" = [ + cast("_DistWithLatestInfo", d) + for d in get_environment(options.path).iter_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + skip=skip, + ) + ] + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + return SUCCESS + + def get_outdated( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if parse(str(dist.latest_version)) > parse(str(dist.version)) + ] + + def get_uptodate( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + return [ + dist + for dist in self.iter_packages_latest_infos(packages, options) + if parse(str(dist.latest_version)) == parse(str(dist.version)) + ] + + def get_not_required( + self, packages: "_ProcessedDists", options: Values + ) -> "_ProcessedDists": + dep_keys = { + canonicalize_name(dep.name) + for dist in packages + for dep in (dist.iter_dependencies() or ()) + } + + # Create a set to remove duplicate packages, and cast it to a list + # to keep the return type consistent with get_outdated and + # get_uptodate + return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys}) + + def iter_packages_latest_infos( + self, packages: "_ProcessedDists", options: Values + ) -> Iterator["_DistWithLatestInfo"]: + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + def latest_info( + dist: "_DistWithLatestInfo", + ) -> Optional["_DistWithLatestInfo"]: + all_candidates = finder.find_all_candidates(dist.canonical_name) + if not options.pre: + # Remove prereleases + all_candidates = [ + candidate + for candidate in all_candidates + if not candidate.version.is_prerelease + ] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.canonical_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + return None + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = "wheel" + else: + typ = "sdist" + dist.latest_version = remote_version + dist.latest_filetype = typ + return dist + + for dist in map(latest_info, packages): + if dist is not None: + yield dist + + def output_package_listing( + self, packages: "_ProcessedDists", options: Values + ) -> None: + packages = sorted( + packages, + key=lambda dist: dist.canonical_name, + ) + if options.list_format == "columns" and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == "freeze": + for dist in packages: + if options.verbose >= 1: + write_output( + "%s==%s (%s)", dist.raw_name, dist.version, dist.location + ) + else: + write_output("%s==%s", dist.raw_name, dist.version) + elif options.list_format == "json": + write_output(format_for_json(packages, options)) + + def output_package_listing_columns( + self, data: List[List[str]], header: List[str] + ) -> None: + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: "-" * x, sizes))) + + for val in pkg_strings: + write_output(val) + + +def format_for_columns( + pkgs: "_ProcessedDists", options: Values +) -> Tuple[List[List[str]], List[str]]: + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + header = ["Package", "Version"] + + running_outdated = options.outdated + if running_outdated: + header.extend(["Latest", "Type"]) + + has_editables = any(x.editable for x in pkgs) + if has_editables: + header.append("Editable project location") + + if options.verbose >= 1: + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + data = [] + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.raw_name, str(proj.version)] + + if running_outdated: + row.append(str(proj.latest_version)) + row.append(proj.latest_filetype) + + if has_editables: + row.append(proj.editable_project_location or "") + + if options.verbose >= 1: + row.append(proj.location or "") + if options.verbose >= 1: + row.append(proj.installer) + + data.append(row) + + return data, header + + +def format_for_json(packages: "_ProcessedDists", options: Values) -> str: + data = [] + for dist in packages: + info = { + "name": dist.raw_name, + "version": str(dist.version), + } + if options.verbose >= 1: + info["location"] = dist.location or "" + info["installer"] = dist.installer + if options.outdated: + info["latest_version"] = str(dist.latest_version) + info["latest_filetype"] = dist.latest_filetype + editable_project_location = dist.editable_project_location + if editable_project_location: + info["editable_project_location"] = editable_project_location + data.append(info) + return json.dumps(data) diff --git a/lib/python3.11/site-packages/pip/_internal/commands/search.py b/python/lib/python3.10/site-packages/pip/_internal/commands/search.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/commands/search.py rename to python/lib/python3.10/site-packages/pip/_internal/commands/search.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/show.py b/python/lib/python3.10/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..d5540d6 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,178 @@ +import logging +from optparse import Values +from typing import Iterator, List, NamedTuple, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.utils.misc import write_output + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-f", + "--files", + dest="files", + action="store_true", + default=False, + help="Show the full list of installed files for each package.", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + if not args: + logger.warning("ERROR: Please provide a package name or names.") + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose + ): + return ERROR + return SUCCESS + + +class _PackageInfo(NamedTuple): + name: str + version: str + location: str + requires: List[str] + required_by: List[str] + installer: str + metadata_version: str + classifiers: List[str] + summary: str + homepage: str + author: str + author_email: str + license: str + entry_points: List[str] + files: Optional[List[str]] + + +def search_packages_info(query: List[str]) -> Iterator[_PackageInfo]: + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + env = get_default_environment() + + installed = {dist.canonical_name: dist for dist in env.iter_distributions()} + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning("Package(s) not found: %s", ", ".join(missing)) + + def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]: + return ( + dist.metadata["Name"] or "UNKNOWN" + for dist in installed.values() + if current_dist.canonical_name + in {canonicalize_name(d.name) for d in dist.iter_dependencies()} + ) + + for query_name in query_names: + try: + dist = installed[query_name] + except KeyError: + continue + + requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower) + required_by = sorted(_get_requiring_packages(dist), key=str.lower) + + try: + entry_points_text = dist.read_text("entry_points.txt") + entry_points = entry_points_text.splitlines(keepends=False) + except FileNotFoundError: + entry_points = [] + + files_iter = dist.iter_declared_entries() + if files_iter is None: + files: Optional[List[str]] = None + else: + files = sorted(files_iter) + + metadata = dist.metadata + + yield _PackageInfo( + name=dist.raw_name, + version=str(dist.version), + location=dist.location or "", + requires=requires, + required_by=required_by, + installer=dist.installer, + metadata_version=dist.metadata_version or "", + classifiers=metadata.get_all("Classifier", []), + summary=metadata.get("Summary", ""), + homepage=metadata.get("Home-page", ""), + author=metadata.get("Author", ""), + author_email=metadata.get("Author-email", ""), + license=metadata.get("License", ""), + entry_points=entry_points, + files=files, + ) + + +def print_results( + distributions: Iterator[_PackageInfo], + list_files: bool, + verbose: bool, +) -> bool: + """ + Print the information from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.name) + write_output("Version: %s", dist.version) + write_output("Summary: %s", dist.summary) + write_output("Home-page: %s", dist.homepage) + write_output("Author: %s", dist.author) + write_output("Author-email: %s", dist.author_email) + write_output("License: %s", dist.license) + write_output("Location: %s", dist.location) + write_output("Requires: %s", ", ".join(dist.requires)) + write_output("Required-by: %s", ", ".join(dist.required_by)) + + if verbose: + write_output("Metadata-Version: %s", dist.metadata_version) + write_output("Installer: %s", dist.installer) + write_output("Classifiers:") + for classifier in dist.classifiers: + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.entry_points: + write_output(" %s", entry.strip()) + if list_files: + write_output("Files:") + if dist.files is None: + write_output("Cannot locate RECORD or installed-files.txt") + else: + for line in dist.files: + write_output(" %s", line.strip()) + return results_printed diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py b/python/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..bb9e8e6 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,105 @@ +import logging +from optparse import Values +from typing import List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import ( + install_req_from_line, + install_req_from_parsed_requirement, +) +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + +logger = logging.getLogger(__name__) + + +class UninstallCommand(Command, SessionCommandMixin): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + + usage = """ + %prog [options] ... + %prog [options] -r ...""" + + def add_options(self) -> None: + self.cmd_opts.add_option( + "-r", + "--requirement", + dest="requirements", + action="append", + default=[], + metavar="file", + help=( + "Uninstall all the packages listed in the given requirements " + "file. This option can be used multiple times." + ), + ) + self.cmd_opts.add_option( + "-y", + "--yes", + dest="yes", + action="store_true", + help="Don't ask for confirmation of uninstall deletions.", + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options: Values, args: List[str]) -> int: + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, + isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + else: + logger.warning( + "Invalid requirement: %r ignored -" + " the uninstall command expects named" + " requirements.", + name, + ) + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, options=options, session=session + ): + req = install_req_from_parsed_requirement( + parsed_req, isolated=options.isolated_mode + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + f"You must give at least one requirement to {self.name} (see " + f'"pip help {self.name}")' + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, + verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() + + warn_if_run_as_root() + return SUCCESS diff --git a/python/lib/python3.10/site-packages/pip/_internal/commands/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..d5b20dc --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,178 @@ +import logging +import os +import shutil +from optparse import Values +from typing import List + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self) -> None: + + self.cmd_opts.add_option( + "-w", + "--wheel-dir", + dest="wheel_dir", + metavar="dir", + default=os.curdir, + help=( + "Build wheels into , where the default is the " + "current working directory." + ), + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + self.cmd_opts.add_option( + "--no-verify", + dest="no_verify", + action="store_true", + default=False, + help="Don't verify if built wheel is valid.", + ) + + self.cmd_opts.add_option(cmdoptions.build_options()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--pre", + action="store_true", + default=False, + help=( + "Include pre-release and development versions. By default, " + "pip only finds stable versions." + ), + ) + + self.cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options: Values, args: List[str]) -> int: + cmdoptions.check_install_build_global(options) + + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + delete=not options.no_clean, + kind="wheel", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + download_dir=options.wheel_dir, + use_user_site=False, + verbosity=self.verbosity, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve(reqs, check_supported_wheels=True) + + reqs_to_build: List[InstallRequirement] = [] + for req in requirement_set.requirements.values(): + if req.is_wheel: + preparer.save_linked_requirement(req) + elif should_build_for_wheel_command(req): + reqs_to_build.append(req) + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + verify=(not options.no_verify), + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError("Failed to build one or more wheels") + + return SUCCESS diff --git a/python/lib/python3.10/site-packages/pip/_internal/configuration.py b/python/lib/python3.10/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..a8092d1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/configuration.py @@ -0,0 +1,366 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import configparser +import locale +import os +import sys +from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import getLogger +from pip._internal.utils.misc import ensure_dir, enum + +RawConfigParser = configparser.RawConfigParser # Shorthand +Kind = NewType("Kind", str) + +CONFIG_BASENAME = "pip.ini" if WINDOWS else "pip.conf" +ENV_NAMES_IGNORED = "version", "help" + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) +OVERRIDE_ORDER = kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR +VALID_LOAD_ONLY = kinds.USER, kinds.GLOBAL, kinds.SITE + +logger = getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name: str) -> str: + """Make a name consistent regardless of source (environment or file)""" + name = name.lower().replace("_", "-") + if name.startswith("--"): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name: str) -> List[str]: + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + "Perhaps you wanted to use 'global.{}' instead?" + ).format(name) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +def get_configuration_files() -> Dict[Kind, List[str]]: + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip") + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + os.path.expanduser("~"), + "pip" if WINDOWS else ".pip", + CONFIG_BASENAME, + ) + new_config_file = os.path.join(appdirs.user_config_dir("pip"), CONFIG_BASENAME) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration: + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None: + super().__init__() + + if load_only is not None and load_only not in VALID_LOAD_ONLY: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, VALID_LOAD_ONLY)) + ) + ) + self.isolated = isolated + self.load_only = load_only + + # Because we keep track of where we got the data from + self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = { + variant: [] for variant in OVERRIDE_ORDER + } + self._config: Dict[Kind, Dict[str, Any]] = { + variant: {} for variant in OVERRIDE_ORDER + } + self._modified_parsers: List[Tuple[str, RawConfigParser]] = [] + + def load(self) -> None: + """Loads configuration from configuration files and environment""" + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self) -> Optional[str]: + """Returns the file with highest priority in configuration""" + assert self.load_only is not None, "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self) -> Iterable[Tuple[str, Any]]: + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key: str) -> Any: + """Get a value from the configuration.""" + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError(f"No such key - {key}") + + def set_value(self, key: str, value: Any) -> None: + """Modify a value in the configuration.""" + self._ensure_have_load_only() + + assert self.load_only + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key: str) -> None: + """Unset a value in the configuration.""" + self._ensure_have_load_only() + + assert self.load_only + if key not in self._config[self.load_only]: + raise ConfigurationError(f"No such key - {key}") + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + if not ( + parser.has_section(section) and parser.remove_option(section, name) + ): + # The option was not removed. + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + # The section may be empty after the option was removed. + if not parser.items(section): + parser.remove_section(section) + self._mark_as_modified(fname, parser) + + del self._config[self.load_only][key] + + def save(self) -> None: + """Save the current in-memory state.""" + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) + + # + # Private routines + # + + def _ensure_have_load_only(self) -> None: + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self) -> Dict[str, Any]: + """A dictionary representing the loaded configuration.""" + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in OVERRIDE_ORDER: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self) -> None: + """Loads configuration from configuration files""" + config_files = dict(self.iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug("Skipping file '%s' (variant: %s)", fname, variant) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant: Kind, fname: str) -> RawConfigParser: + logger.verbose("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname: str) -> RawConfigParser: + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + locale_encoding = locale.getpreferredencoding(False) + try: + parser.read(fname, encoding=locale_encoding) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason=f"contains invalid {locale_encoding} characters", + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self) -> None: + """Loads configuration from environment variables""" + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self.get_environ_vars()) + ) + + def _normalized_keys( + self, section: str, items: Iterable[Tuple[str, Any]] + ) -> Dict[str, Any]: + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def get_environ_vars(self) -> Iterable[Tuple[str, str]]: + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + if key.startswith("PIP_"): + name = key[4:].lower() + if name not in ENV_NAMES_IGNORED: + yield name, val + + # XXX: This is patched in the tests. + def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get("PIP_CONFIG_FILE", None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + config_files = get_configuration_files() + + # at the base we have any global configuration + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # finally virtualenv configuration first trumping others + yield kinds.SITE, config_files[kinds.SITE] + + def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: + """Get values present in a config file""" + return self._config[variant] + + def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]: + # Determine which parser to modify + assert self.load_only + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None: + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self._dictionary!r})" diff --git a/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/distributions/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/distributions/base.py b/python/lib/python3.10/site-packages/pip/_internal/distributions/base.py new file mode 100644 index 0000000..149fff5 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/distributions/base.py @@ -0,0 +1,36 @@ +import abc + +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata.base import BaseDistribution +from pip._internal.req import InstallRequirement + + +class AbstractDistribution(metaclass=abc.ABCMeta): + """A base class for handling installable artifacts. + + The requirements for anything installable are as follows: + + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req: InstallRequirement) -> None: + super().__init__() + self.req = req + + @abc.abstractmethod + def get_metadata_distribution(self) -> BaseDistribution: + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata( + self, finder: PackageFinder, build_isolation: bool + ) -> None: + raise NotImplementedError() diff --git a/python/lib/python3.10/site-packages/pip/_internal/distributions/installed.py b/python/lib/python3.10/site-packages/pip/_internal/distributions/installed.py new file mode 100644 index 0000000..be5962f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/distributions/installed.py @@ -0,0 +1,20 @@ +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution + + +class InstalledDistribution(AbstractDistribution): + """Represents an installed package. + + This does not need any preparation as the required information has already + been computed. + """ + + def get_metadata_distribution(self) -> BaseDistribution: + assert self.req.satisfied_by is not None, "not actually installed" + return self.req.satisfied_by + + def prepare_distribution_metadata( + self, finder: PackageFinder, build_isolation: bool + ) -> None: + pass diff --git a/python/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py b/python/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py new file mode 100644 index 0000000..bdaf403 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py @@ -0,0 +1,127 @@ +import logging +from typing import Iterable, Set, Tuple + +from pip._internal.build_env import BuildEnvironment +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.exceptions import InstallationError +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.subprocess import runner_with_spinner_message + +logger = logging.getLogger(__name__) + + +class SourceDistribution(AbstractDistribution): + """Represents a source distribution. + + The preparation step for these needs metadata for the packages to be + generated, either using PEP 517 or using the legacy `setup.py egg_info`. + """ + + def get_metadata_distribution(self) -> BaseDistribution: + return self.req.get_dist() + + def prepare_distribution_metadata( + self, finder: PackageFinder, build_isolation: bool + ) -> None: + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + # Setup an isolated environment and install the build backend static + # requirements in it. + self._prepare_build_backend(finder) + # Check that if the requirement is editable, it either supports PEP 660 or + # has a setup.py or a setup.cfg. This cannot be done earlier because we need + # to setup the build backend to verify it supports build_editable, nor can + # it be done later, because we want to avoid installing build requirements + # needlessly. Doing it here also works around setuptools generating + # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory + # without setup.py nor setup.cfg. + self.req.isolated_editable_sanity_check() + # Install the dynamic build requirements. + self._install_build_reqs(finder) + + self.req.prepare_metadata() + + def _prepare_build_backend(self, finder: PackageFinder) -> None: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, "overlay", kind="build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + self._raise_conflicts("PEP 517/518 supported requirements", conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))), + ) + + def _get_build_requires_wheel(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message("Getting requirements to build wheel") + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_wheel() + + def _get_build_requires_editable(self) -> Iterable[str]: + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build editable" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + return backend.get_requires_for_build_editable() + + def _install_build_reqs(self, finder: PackageFinder) -> None: + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + if ( + self.req.editable + and self.req.permit_editable_wheels + and self.req.supports_pyproject_editable() + ): + build_reqs = self._get_build_requires_editable() + else: + build_reqs = self._get_build_requires_wheel() + conflicting, missing = self.req.build_env.check_requirements(build_reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, "normal", kind="backend dependencies" + ) + + def _raise_conflicts( + self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]] + ) -> None: + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=", ".join( + f"{installed} is incompatible with {wanted}" + for installed, wanted in sorted(conflicting_reqs) + ), + ) + raise InstallationError(error_message) diff --git a/python/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py new file mode 100644 index 0000000..340b0f3 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py @@ -0,0 +1,31 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import ( + BaseDistribution, + FilesystemWheel, + get_wheel_distribution, +) + + +class WheelDistribution(AbstractDistribution): + """Represents a wheel distribution. + + This does not need any preparation as wheels can be directly unpacked. + """ + + def get_metadata_distribution(self) -> BaseDistribution: + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + assert self.req.local_file_path, "Set as part of preparation during download" + assert self.req.name, "Wheels are never unnamed" + wheel = FilesystemWheel(self.req.local_file_path) + return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) + + def prepare_distribution_metadata( + self, finder: PackageFinder, build_isolation: bool + ) -> None: + pass diff --git a/python/lib/python3.10/site-packages/pip/_internal/exceptions.py b/python/lib/python3.10/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..97b9612 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,658 @@ +"""Exceptions used throughout package. + +This module MUST NOT try to import from anything within `pip._internal` to +operate. This is expected to be importable from any/all files within the +subpackage and, thus, should not depend on them. +""" + +import configparser +import re +from itertools import chain, groupby, repeat +from typing import TYPE_CHECKING, Dict, List, Optional, Union + +from pip._vendor.requests.models import Request, Response +from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult +from pip._vendor.rich.markup import escape +from pip._vendor.rich.text import Text + +if TYPE_CHECKING: + from hashlib import _Hash + from typing import Literal + + from pip._internal.metadata import BaseDistribution + from pip._internal.req.req_install import InstallRequirement + + +# +# Scaffolding +# +def _is_kebab_case(s: str) -> bool: + return re.match(r"^[a-z]+(-[a-z]+)*$", s) is not None + + +def _prefix_with_indent( + s: Union[Text, str], + console: Console, + *, + prefix: str, + indent: str, +) -> Text: + if isinstance(s, Text): + text = s + else: + text = console.render_str(s) + + return console.render_str(prefix, overflow="ignore") + console.render_str( + f"\n{indent}", overflow="ignore" + ).join(text.split(allow_blank=True)) + + +class PipError(Exception): + """The base pip error.""" + + +class DiagnosticPipError(PipError): + """An error, that presents diagnostic information to the user. + + This contains a bunch of logic, to enable pretty presentation of our error + messages. Each error gets a unique reference. Each error can also include + additional context, a hint and/or a note -- which are presented with the + main error message in a consistent style. + + This is adapted from the error output styling in `sphinx-theme-builder`. + """ + + reference: str + + def __init__( + self, + *, + kind: 'Literal["error", "warning"]' = "error", + reference: Optional[str] = None, + message: Union[str, Text], + context: Optional[Union[str, Text]], + hint_stmt: Optional[Union[str, Text]], + note_stmt: Optional[Union[str, Text]] = None, + link: Optional[str] = None, + ) -> None: + # Ensure a proper reference is provided. + if reference is None: + assert hasattr(self, "reference"), "error reference not provided!" + reference = self.reference + assert _is_kebab_case(reference), "error reference must be kebab-case!" + + self.kind = kind + self.reference = reference + + self.message = message + self.context = context + + self.note_stmt = note_stmt + self.hint_stmt = hint_stmt + + self.link = link + + super().__init__(f"<{self.__class__.__name__}: {self.reference}>") + + def __repr__(self) -> str: + return ( + f"<{self.__class__.__name__}(" + f"reference={self.reference!r}, " + f"message={self.message!r}, " + f"context={self.context!r}, " + f"note_stmt={self.note_stmt!r}, " + f"hint_stmt={self.hint_stmt!r}" + ")>" + ) + + def __rich_console__( + self, + console: Console, + options: ConsoleOptions, + ) -> RenderResult: + colour = "red" if self.kind == "error" else "yellow" + + yield f"[{colour} bold]{self.kind}[/]: [bold]{self.reference}[/]" + yield "" + + if not options.ascii_only: + # Present the main message, with relevant context indented. + if self.context is not None: + yield _prefix_with_indent( + self.message, + console, + prefix=f"[{colour}]×[/] ", + indent=f"[{colour}]│[/] ", + ) + yield _prefix_with_indent( + self.context, + console, + prefix=f"[{colour}]╰─>[/] ", + indent=f"[{colour}] [/] ", + ) + else: + yield _prefix_with_indent( + self.message, + console, + prefix="[red]×[/] ", + indent=" ", + ) + else: + yield self.message + if self.context is not None: + yield "" + yield self.context + + if self.note_stmt is not None or self.hint_stmt is not None: + yield "" + + if self.note_stmt is not None: + yield _prefix_with_indent( + self.note_stmt, + console, + prefix="[magenta bold]note[/]: ", + indent=" ", + ) + if self.hint_stmt is not None: + yield _prefix_with_indent( + self.hint_stmt, + console, + prefix="[cyan bold]hint[/]: ", + indent=" ", + ) + + if self.link is not None: + yield "" + yield f"Link: {self.link}" + + +# +# Actual Errors +# +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class MissingPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml has `build-system`, but no `build-system.requires`.""" + + reference = "missing-pyproject-build-system-requires" + + def __init__(self, *, package: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid pyproject.toml file.\n" + "The [build-system] table is missing the mandatory `requires` key." + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class InvalidPyProjectBuildRequires(DiagnosticPipError): + """Raised when pyproject.toml an invalid `build-system.requires`.""" + + reference = "invalid-pyproject-build-system-requires" + + def __init__(self, *, package: str, reason: str) -> None: + super().__init__( + message=f"Can not process {escape(package)}", + context=Text( + "This package has an invalid `build-system.requires` key in " + f"pyproject.toml.\n{reason}" + ), + note_stmt="This is an issue with the package mentioned above, not pip.", + hint_stmt=Text("See PEP 518 for the detailed specification."), + ) + + +class NoneMetadataError(PipError): + """Raised when accessing a Distribution's "METADATA" or "PKG-INFO". + + This signifies an inconsistency, when the Distribution claims to have + the metadata file (if not, raise ``FileNotFoundError`` instead), but is + not actually able to produce its content. This may be due to permission + errors. + """ + + def __init__( + self, + dist: "BaseDistribution", + metadata_name: str, + ) -> None: + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self) -> str: + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return "None {} metadata found for distribution: {}".format( + self.metadata_name, + self.dist, + ) + + +class UserInstallationInvalid(InstallationError): + """A --user install is requested on an environment without user site.""" + + def __str__(self) -> str: + return "User base directory is not specified" + + +class InvalidSchemeCombination(InstallationError): + def __str__(self) -> str: + before = ", ".join(str(a) for a in self.args[:-1]) + return f"Cannot set {before} and {self.args[-1]} together" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class NetworkConnectionError(PipError): + """HTTP connection error""" + + def __init__( + self, error_msg: str, response: Response = None, request: Request = None + ) -> None: + """ + Initialize NetworkConnectionError with `request` and `response` + objects. + """ + self.response = response + self.request = request + self.error_msg = error_msg + if ( + self.response is not None + and not self.request + and hasattr(response, "request") + ): + self.request = self.response.request + super().__init__(error_msg, response, request) + + def __str__(self) -> str: + return str(self.error_msg) + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class InvalidWheel(InstallationError): + """Invalid (e.g. corrupt) wheel.""" + + def __init__(self, location: str, name: str): + self.location = location + self.name = name + + def __str__(self) -> str: + return f"Wheel '{self.name}' located at {self.location} is invalid." + + +class MetadataInconsistent(InstallationError): + """Built metadata contains inconsistent information. + + This is raised when the metadata contains values (e.g. name and version) + that do not match the information previously obtained from sdist filename + or user-supplied ``#egg=`` value. + """ + + def __init__( + self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str + ) -> None: + self.ireq = ireq + self.field = field + self.f_val = f_val + self.m_val = m_val + + def __str__(self) -> str: + template = ( + "Requested {} has inconsistent {}: " + "filename has {!r}, but metadata has {!r}" + ) + return template.format(self.ireq, self.field, self.f_val, self.m_val) + + +class LegacyInstallFailure(DiagnosticPipError): + """Error occurred while executing `setup.py install`""" + + reference = "legacy-install-failure" + + def __init__(self, package_details: str) -> None: + super().__init__( + message="Encountered error while trying to install package.", + context=package_details, + hint_stmt="See above for output from the failure.", + note_stmt="This is an issue with the package mentioned above, not pip.", + ) + + +class InstallationSubprocessError(DiagnosticPipError, InstallationError): + """A subprocess call failed.""" + + reference = "subprocess-exited-with-error" + + def __init__( + self, + *, + command_description: str, + exit_code: int, + output_lines: Optional[List[str]], + ) -> None: + if output_lines is None: + output_prompt = Text("See above for output.") + else: + output_prompt = ( + Text.from_markup(f"[red][{len(output_lines)} lines of output][/]\n") + + Text("".join(output_lines)) + + Text.from_markup(R"[red]\[end of output][/]") + ) + + super().__init__( + message=( + f"[green]{escape(command_description)}[/] did not run successfully.\n" + f"exit code: {exit_code}" + ), + context=output_prompt, + hint_stmt=None, + note_stmt=( + "This error originates from a subprocess, and is likely not a " + "problem with pip." + ), + ) + + self.command_description = command_description + self.exit_code = exit_code + + def __str__(self) -> str: + return f"{self.command_description} exited with {self.exit_code}" + + +class MetadataGenerationFailed(InstallationSubprocessError, InstallationError): + reference = "metadata-generation-failed" + + def __init__( + self, + *, + package_details: str, + ) -> None: + super(InstallationSubprocessError, self).__init__( + message="Encountered error while generating package metadata.", + context=escape(package_details), + hint_stmt="See above for details.", + note_stmt="This is an issue with the package mentioned above, not pip.", + ) + + def __str__(self) -> str: + return "metadata generation failed" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self) -> None: + self.errors: List["HashError"] = [] + + def append(self, error: "HashError") -> None: + self.errors.append(error) + + def __str__(self) -> str: + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return "\n".join(lines) + return "" + + def __bool__(self) -> bool: + return bool(self.errors) + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + + req: Optional["InstallRequirement"] = None + head = "" + order: int = -1 + + def body(self) -> str: + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + its link already populated by the resolver's _populate_link(). + + """ + return f" {self._requirement_name()}" + + def __str__(self) -> str: + return f"{self.head}\n{self.body()}" + + def _requirement_name(self) -> str: + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else "unknown package" + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ( + "Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:" + ) + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ( + "Can't verify hashes for these file:// requirements because they " + "point to directories:" + ) + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ( + "Hashes are required in --require-hashes mode, but they are " + "missing from some requirements. Here is a list of those " + "requirements along with the hashes their downloaded archives " + "actually had. Add lines like these to your requirements files to " + "prevent tampering. (If you did not enable --require-hashes " + "manually, note that it turns on automatically when any package " + "has a hash.)" + ) + + def __init__(self, gotten_hash: str) -> None: + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self) -> str: + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = ( + self.req.original_link + if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, "req", None) + ) + return " {} --hash={}:{}".format( + package or "unknown package", FAVORITE_HASH, self.gotten_hash + ) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ( + "In --require-hashes mode, all requirements must have their " + "versions pinned with ==. These do not:" + ) + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + + order = 4 + head = ( + "THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS " + "FILE. If you have updated the package versions, please update " + "the hashes. Otherwise, examine the package contents carefully; " + "someone may have tampered with them." + ) + + def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None: + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self) -> str: + return " {}:\n{}".format(self._requirement_name(), self._hash_comparison()) + + def _hash_comparison(self) -> str: + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + + def hash_then_or(hash_name: str) -> "chain[str]": + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(" or")) + + lines: List[str] = [] + for hash_name, expecteds in self.allowed.items(): + prefix = hash_then_or(hash_name) + lines.extend( + (" Expected {} {}".format(next(prefix), e)) for e in expecteds + ) + lines.append( + " Got {}\n".format(self.gots[hash_name].hexdigest()) + ) + return "\n".join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file""" + + def __init__( + self, + reason: str = "could not be loaded", + fname: Optional[str] = None, + error: Optional[configparser.Error] = None, + ) -> None: + super().__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self) -> str: + if self.fname is not None: + message_part = f" in {self.fname}." + else: + assert self.error is not None + message_part = f".\n{self.error}\n" + return f"Configuration file {self.reason}{message_part}" diff --git a/lib/python3.11/site-packages/pip/_internal/index/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/index/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/index/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/index/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/index/collector.py b/python/lib/python3.10/site-packages/pip/_internal/index/collector.py new file mode 100644 index 0000000..4ecbb33 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/index/collector.py @@ -0,0 +1,648 @@ +""" +The main purpose of this module is to expose LinkCollector.collect_sources(). +""" + +import cgi +import collections +import functools +import itertools +import logging +import os +import re +import urllib.parse +import urllib.request +import xml.etree.ElementTree +from html.parser import HTMLParser +from optparse import Values +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + MutableMapping, + NamedTuple, + Optional, + Sequence, + Tuple, + Union, +) + +from pip._vendor import html5lib, requests +from pip._vendor.requests import Response +from pip._vendor.requests.exceptions import RetryError, SSLError + +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.network.session import PipSession +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import is_archive_file +from pip._internal.utils.misc import pairwise, redact_auth_from_url +from pip._internal.vcs import vcs + +from .sources import CandidatesFromPage, LinkSource, build_source + +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + +logger = logging.getLogger(__name__) + +HTMLElement = xml.etree.ElementTree.Element +ResponseHeaders = MutableMapping[str, str] + + +def _match_vcs_scheme(url: str) -> Optional[str]: + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in "+:": + return scheme + return None + + +class _NotHTML(Exception): + def __init__(self, content_type: str, request_desc: str) -> None: + super().__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response: Response) -> None: + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url: str, session: PipSession) -> None: + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url) + if scheme not in {"http", "https"}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + raise_for_status(resp) + + _ensure_html_header(resp) + + +def _get_html_response(url: str, session: PipSession) -> Response: + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if is_archive_file(Link(url).filename): + _ensure_html_response(url, session=session) + + logger.debug("Getting page %s", redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + raise_for_status(resp) + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]: + """Determine if we have any encoding information in our headers.""" + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params["charset"] + return None + + +def _determine_base_url(document: HTMLElement, page_url: str) -> str: + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + + TODO: Remove when `html5lib` is dropped. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _clean_url_path_part(part: str) -> str: + """ + Clean a "part" of a URL path (i.e. after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + return urllib.parse.quote(urllib.parse.unquote(part)) + + +def _clean_file_url_path(part: str) -> str: + """ + Clean the first part of a URL path that corresponds to a local + filesystem path (i.e. the first part after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + # Also, on Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + return urllib.request.pathname2url(urllib.request.url2pathname(part)) + + +# percent-encoded: / +_reserved_chars_re = re.compile("(@|%2F)", re.IGNORECASE) + + +def _clean_url_path(path: str, is_local_path: bool) -> str: + """ + Clean the path portion of a URL. + """ + if is_local_path: + clean_func = _clean_file_url_path + else: + clean_func = _clean_url_path_part + + # Split on the reserved characters prior to cleaning so that + # revision strings in VCS URLs are properly preserved. + parts = _reserved_chars_re.split(path) + + cleaned_parts = [] + for to_clean, reserved in pairwise(itertools.chain(parts, [""])): + cleaned_parts.append(clean_func(to_clean)) + # Normalize %xx escapes (e.g. %2f -> %2F) + cleaned_parts.append(reserved.upper()) + + return "".join(cleaned_parts) + + +def _clean_link(url: str) -> str: + """ + Make sure a link is fully quoted. + For example, if ' ' occurs in the URL, it will be replaced with "%20", + and without double-quoting other characters. + """ + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. + result = urllib.parse.urlparse(url) + # If the netloc is empty, then the URL refers to a local filesystem path. + is_local_path = not result.netloc + path = _clean_url_path(result.path, is_local_path=is_local_path) + return urllib.parse.urlunparse(result._replace(path=path)) + + +def _create_link_from_element( + element_attribs: Dict[str, Optional[str]], + page_url: str, + base_url: str, +) -> Optional[Link]: + """ + Convert an anchor element's attributes in a simple repository page to a Link. + """ + href = element_attribs.get("href") + if not href: + return None + + url = _clean_link(urllib.parse.urljoin(base_url, href)) + pyrequire = element_attribs.get("data-requires-python") + yanked_reason = element_attribs.get("data-yanked") + + link = Link( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + ) + + return link + + +class CacheablePageContent: + def __init__(self, page: "HTMLPage") -> None: + assert page.cache_link_parsing + self.page = page + + def __eq__(self, other: object) -> bool: + return isinstance(other, type(self)) and self.page.url == other.page.url + + def __hash__(self) -> int: + return hash(self.page.url) + + +class ParseLinks(Protocol): + def __call__( + self, page: "HTMLPage", use_deprecated_html5lib: bool + ) -> Iterable[Link]: + ... + + +def with_cached_html_pages(fn: ParseLinks) -> ParseLinks: + """ + Given a function that parses an Iterable[Link] from an HTMLPage, cache the + function's result (keyed by CacheablePageContent), unless the HTMLPage + `page` has `page.cache_link_parsing == False`. + """ + + @functools.lru_cache(maxsize=None) + def wrapper( + cacheable_page: CacheablePageContent, use_deprecated_html5lib: bool + ) -> List[Link]: + return list(fn(cacheable_page.page, use_deprecated_html5lib)) + + @functools.wraps(fn) + def wrapper_wrapper(page: "HTMLPage", use_deprecated_html5lib: bool) -> List[Link]: + if page.cache_link_parsing: + return wrapper(CacheablePageContent(page), use_deprecated_html5lib) + return list(fn(page, use_deprecated_html5lib)) + + return wrapper_wrapper + + +def _parse_links_html5lib(page: "HTMLPage") -> Iterable[Link]: + """ + Parse an HTML document, and yield its anchor elements as Link objects. + + TODO: Remove when `html5lib` is dropped. + """ + document = html5lib.parse( + page.content, + transport_encoding=page.encoding, + namespaceHTMLElements=False, + ) + + url = page.url + base_url = _determine_base_url(document, url) + for anchor in document.findall(".//a"): + link = _create_link_from_element( + anchor.attrib, + page_url=url, + base_url=base_url, + ) + if link is None: + continue + yield link + + +@with_cached_html_pages +def parse_links(page: "HTMLPage", use_deprecated_html5lib: bool) -> Iterable[Link]: + """ + Parse an HTML document, and yield its anchor elements as Link objects. + """ + encoding = page.encoding or "utf-8" + + # Check if the page starts with a valid doctype, to decide whether to use + # http.parser or (deprecated) html5lib for parsing -- unless explicitly + # requested to use html5lib. + if not use_deprecated_html5lib: + expected_doctype = "".encode(encoding) + actual_start = page.content[: len(expected_doctype)] + if actual_start.decode(encoding).lower() != "": + deprecated( + reason=( + f"The HTML index page being used ({page.url}) is not a proper " + "HTML 5 document. This is in violation of PEP 503 which requires " + "these pages to be well-formed HTML 5 documents. Please reach out " + "to the owners of this index page, and ask them to update this " + "index page to a valid HTML 5 document." + ), + replacement=None, + gone_in="22.2", + issue=10825, + ) + use_deprecated_html5lib = True + + if use_deprecated_html5lib: + yield from _parse_links_html5lib(page) + return + + parser = HTMLLinkParser() + parser.feed(page.content.decode(encoding)) + + url = page.url + base_url = parser.base_url or url + for anchor in parser.anchors: + link = _create_link_from_element( + anchor, + page_url=url, + base_url=base_url, + ) + if link is None: + continue + yield link + + +class HTMLPage: + """Represents one page, along with its URL""" + + def __init__( + self, + content: bytes, + encoding: Optional[str], + url: str, + cache_link_parsing: bool = True, + ) -> None: + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + :param cache_link_parsing: whether links parsed from this page's url + should be cached. PyPI index urls should + have this set to False, for example. + """ + self.content = content + self.encoding = encoding + self.url = url + self.cache_link_parsing = cache_link_parsing + + def __str__(self) -> str: + return redact_auth_from_url(self.url) + + +class HTMLLinkParser(HTMLParser): + """ + HTMLParser that keeps the first base HREF and a list of all anchor + elements' attributes. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._seen_decl = False + self.base_url: Optional[str] = None + self.anchors: List[Dict[str, Optional[str]]] = [] + + def handle_decl(self, decl: str) -> None: + if decl.lower() != "doctype html": + self._raise_error() + self._seen_decl = True + + def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None: + if not self._seen_decl: + self._raise_error() + + if tag == "base" and self.base_url is None: + href = self.get_href(attrs) + if href is not None: + self.base_url = href + elif tag == "a": + self.anchors.append(dict(attrs)) + + def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]: + for name, value in attrs: + if name == "href": + return value + return None + + def _raise_error(self) -> None: + raise ValueError( + "HTML doctype missing or incorrect. Expected .\n\n" + "If you believe this error to be incorrect, try passing the " + "command line option --use-deprecated=html5lib and please leave " + "a comment on the pip issue at https://github.com/pypa/pip/issues/10825." + ) + + +def _handle_get_page_fail( + link: Link, + reason: Union[str, Exception], + meth: Optional[Callable[..., None]] = None, +) -> None: + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_html_page(response: Response, cache_link_parsing: bool = True) -> HTMLPage: + encoding = _get_encoding_from_headers(response.headers) + return HTMLPage( + response.content, + encoding=encoding, + url=response.url, + cache_link_parsing=cache_link_parsing, + ) + + +def _get_html_page( + link: Link, session: Optional[PipSession] = None +) -> Optional["HTMLPage"]: + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split("#", 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.warning( + "Cannot look at %s URL %s because it does not support lookup as web pages.", + vcs_scheme, + link, + ) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib.parse.urlparse(url) + if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith("/"): + url += "/" + url = urllib.parse.urljoin(url, "index.html") + logger.debug(" file: URL is directory, getting %s", url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.warning( + "Skipping page %s because it looks like an archive, and cannot " + "be checked by a HTTP HEAD request.", + link, + ) + except _NotHTML as exc: + logger.warning( + "Skipping page %s because the %s request got Content-Type: %s." + "The only supported Content-Type is text/html", + link, + exc.request_desc, + exc.content_type, + ) + except NetworkConnectionError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, f"connection error: {exc}") + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return _make_html_page(resp, cache_link_parsing=link.cache_link_parsing) + return None + + +class CollectedSources(NamedTuple): + find_links: Sequence[Optional[LinkSource]] + index_urls: Sequence[Optional[LinkSource]] + + +class LinkCollector: + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_sources() method. + """ + + def __init__( + self, + session: PipSession, + search_scope: SearchScope, + ) -> None: + self.search_scope = search_scope + self.session = session + + @classmethod + def create( + cls, + session: PipSession, + options: Values, + suppress_no_index: bool = False, + ) -> "LinkCollector": + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + "Ignoring indexes: %s", + ",".join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, + index_urls=index_urls, + ) + link_collector = LinkCollector( + session=session, + search_scope=search_scope, + ) + return link_collector + + @property + def find_links(self) -> List[str]: + return self.search_scope.find_links + + def fetch_page(self, location: Link) -> Optional[HTMLPage]: + """ + Fetch an HTML page containing package links. + """ + return _get_html_page(location, session=self.session) + + def collect_sources( + self, + project_name: str, + candidates_from_page: CandidatesFromPage, + ) -> CollectedSources: + # The OrderedDict calls deduplicate sources by URL. + index_url_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=False, + cache_link_parsing=False, + ) + for loc in self.search_scope.get_index_urls_locations(project_name) + ).values() + find_links_sources = collections.OrderedDict( + build_source( + loc, + candidates_from_page=candidates_from_page, + page_validator=self.session.is_secure_origin, + expand_dir=True, + cache_link_parsing=True, + ) + for loc in self.find_links + ).values() + + if logger.isEnabledFor(logging.DEBUG): + lines = [ + f"* {s.link}" + for s in itertools.chain(find_links_sources, index_url_sources) + if s is not None and s.link is not None + ] + lines = [ + f"{len(lines)} location(s) to search " + f"for versions of {project_name}:" + ] + lines + logger.debug("\n".join(lines)) + + return CollectedSources( + find_links=list(find_links_sources), + index_urls=list(index_url_sources), + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/index/package_finder.py b/python/lib/python3.10/site-packages/pip/_internal/index/package_finder.py new file mode 100644 index 0000000..223d06d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/index/package_finder.py @@ -0,0 +1,1004 @@ +"""Routines related to PyPI, indexes""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import functools +import itertools +import logging +import re +from typing import FrozenSet, Iterable, List, Optional, Set, Tuple, Union + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.tags import Tag +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import _BaseVersion +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.index.collector import LinkCollector, parse_links +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.models.target_python import TargetPython +from pip._internal.models.wheel import Wheel +from pip._internal.req import InstallRequirement +from pip._internal.utils._log import getLogger +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import build_netloc +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS + +__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"] + + +logger = getLogger(__name__) + +BuildTag = Union[Tuple[()], Tuple[int, str]] +CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag] + + +def _check_link_requires_python( + link: Link, + version_info: Tuple[int, int, int], + ignore_requires_python: bool = False, +) -> bool: + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, + link, + ) + else: + if not is_compatible: + version = ".".join(map(str, version_info)) + if not ignore_requires_python: + logger.verbose( + "Link requires a different Python (%s not in: %r): %s", + version, + link.requires_python, + link, + ) + return False + + logger.debug( + "Ignoring failed Requires-Python check (%s not in: %r) for link: %s", + version, + link.requires_python, + link, + ) + + return True + + +class LinkEvaluator: + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r"-py([123]\.?[0-9]?)$") + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name: str, + canonical_name: str, + formats: FrozenSet[str], + target_python: TargetPython, + allow_yanked: bool, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link: Link) -> Tuple[bool, Optional[str]]: + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (is_candidate, result), where `result` is (1) a + version string if `is_candidate` is True, and (2) if + `is_candidate` is False, an optional string to log the reason + the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or "" + return (False, f"yanked for reason: {reason}") + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (False, "not a file") + if ext not in SUPPORTED_EXTENSIONS: + return (False, f"unsupported archive format: {ext}") + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = "No binaries permitted for {}".format(self.project_name) + return (False, reason) + if "macosx10" in link.path and ext == ".zip": + return (False, "macosx10 one") + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return (False, "invalid wheel filename") + if canonicalize_name(wheel.name) != self._canonical_name: + reason = "wrong project name (not {})".format(self.project_name) + return (False, reason) + + supported_tags = self._target_python.get_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = wheel.get_formatted_file_tags() + reason = ( + "none of the wheel's tags ({}) are compatible " + "(run pip debug --verbose to show compatible tags)".format( + ", ".join(file_tags) + ) + ) + return (False, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + reason = f"No sources permitted for {self.project_name}" + return (False, reason) + + if not version: + version = _extract_version_from_fragment( + egg_info, + self._canonical_name, + ) + if not version: + reason = f"Missing project version for {self.project_name}" + return (False, reason) + + match = self._py_version_re.search(version) + if match: + version = version[: match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return (False, "Python version is incorrect") + + supports_python = _check_link_requires_python( + link, + version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + # Return None for the reason text to suppress calling + # _log_skipped_link(). + return (False, None) + + logger.debug("Found link %s, version: %s", link, version) + + return (True, version) + + +def filter_unallowed_hashes( + candidates: List[InstallationCandidate], + hashes: Hashes, + project_name: str, +) -> List[InstallationCandidate]: + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + "Given no hashes to check %s links for project %r: " + "discarding no candidates", + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = "discarding no candidates" + else: + discard_message = "discarding {} non-matches:\n {}".format( + len(non_matches), + "\n ".join(str(candidate.link) for candidate in non_matches), + ) + + logger.debug( + "Checked %s links for project %r against %s hashes " + "(%s matches, %s no digest): %s", + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message, + ) + + return filtered + + +class CandidatePreferences: + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + ) -> None: + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult: + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates: List[InstallationCandidate], + applicable_candidates: List[InstallationCandidate], + best_candidate: Optional[InstallationCandidate], + ) -> None: + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self) -> Iterable[InstallationCandidate]: + """Iterate through all candidates.""" + return iter(self._candidates) + + def iter_applicable(self) -> Iterable[InstallationCandidate]: + """Iterate through the applicable candidates.""" + return iter(self._applicable_candidates) + + +class CandidateEvaluator: + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name: str, + target_python: Optional[TargetPython] = None, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> "CandidateEvaluator": + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name: str, + supported_tags: List[Tag], + specifier: specifiers.BaseSpecifier, + prefer_binary: bool = False, + allow_all_prereleases: bool = False, + hashes: Optional[Hashes] = None, + ) -> None: + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + # Since the index of the tag in the _supported_tags list is used + # as a priority, precompute a map from tag to index/priority to be + # used in wheel.find_most_preferred_tag. + self._wheel_tag_preferences = { + tag: idx for idx, tag in enumerate(supported_tags) + } + + def get_applicable_candidates( + self, + candidates: List[InstallationCandidate], + ) -> List[InstallationCandidate]: + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) + for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [c for c in candidates if str(c.version) in versions] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag: BuildTag = () + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + try: + pri = -( + wheel.find_most_preferred_tag( + valid_tags, self._wheel_tag_preferences + ) + ) + except ValueError: + raise UnsupportedWheel( + "{} is not a supported wheel for this platform. It " + "can't be sorted.".format(wheel.filename) + ) + if self._prefer_binary: + binary_preference = 1 + if wheel.build_tag is not None: + match = re.match(r"^(\d+)(.*)$", wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, + yank_value, + binary_preference, + candidate.version, + pri, + build_tag, + ) + + def sort_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> Optional[InstallationCandidate]: + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + best_candidate = max(candidates, key=self._sort_key) + return best_candidate + + def compute_best_candidate( + self, + candidates: List[InstallationCandidate], + ) -> BestCandidateResult: + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder: + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector: LinkCollector, + target_python: TargetPython, + allow_yanked: bool, + use_deprecated_html5lib: bool, + format_control: Optional[FormatControl] = None, + candidate_prefs: Optional[CandidatePreferences] = None, + ignore_requires_python: Optional[bool] = None, + ) -> None: + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + self._use_deprecated_html5lib = use_deprecated_html5lib + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links: Set[Link] = set() + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector: LinkCollector, + selection_prefs: SelectionPreferences, + target_python: Optional[TargetPython] = None, + *, + use_deprecated_html5lib: bool, + ) -> "PackageFinder": + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + use_deprecated_html5lib=use_deprecated_html5lib, + ) + + @property + def target_python(self) -> TargetPython: + return self._target_python + + @property + def search_scope(self) -> SearchScope: + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope: SearchScope) -> None: + self._link_collector.search_scope = search_scope + + @property + def find_links(self) -> List[str]: + return self._link_collector.find_links + + @property + def index_urls(self) -> List[str]: + return self.search_scope.index_urls + + @property + def trusted_hosts(self) -> Iterable[str]: + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self) -> bool: + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self) -> None: + self._candidate_prefs.allow_all_prereleases = True + + @property + def prefer_binary(self) -> bool: + return self._candidate_prefs.prefer_binary + + def set_prefer_binary(self) -> None: + self._candidate_prefs.prefer_binary = True + + def make_link_evaluator(self, project_name: str) -> LinkEvaluator: + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links: Iterable[Link]) -> List[Link]: + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen: Set[Link] = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link: Link, reason: str) -> None: + if link not in self._logged_links: + # Put the link at the end so the reason is more visible and because + # the link string is usually very long. + logger.debug("Skipping link: %s: %s", reason, link) + self._logged_links.add(link) + + def get_install_candidate( + self, link_evaluator: LinkEvaluator, link: Link + ) -> Optional[InstallationCandidate]: + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + is_candidate, result = link_evaluator.evaluate_link(link) + if not is_candidate: + if result: + self._log_skipped_link(link, reason=result) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + version=result, + ) + + def evaluate_links( + self, link_evaluator: LinkEvaluator, links: Iterable[Link] + ) -> List[InstallationCandidate]: + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url( + self, project_url: Link, link_evaluator: LinkEvaluator + ) -> List[InstallationCandidate]: + logger.debug( + "Fetching project page and analyzing links: %s", + project_url, + ) + html_page = self._link_collector.fetch_page(project_url) + if html_page is None: + return [] + + page_links = list(parse_links(html_page, self._use_deprecated_html5lib)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + @functools.lru_cache(maxsize=None) + def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]: + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + link_evaluator = self.make_link_evaluator(project_name) + + collected_sources = self._link_collector.collect_sources( + project_name=project_name, + candidates_from_page=functools.partial( + self.process_project_url, + link_evaluator=link_evaluator, + ), + ) + + page_candidates_it = itertools.chain.from_iterable( + source.page_candidates() + for sources in collected_sources + for source in sources + if source is not None + ) + page_candidates = list(page_candidates_it) + + file_links_it = itertools.chain.from_iterable( + source.file_links() + for sources in collected_sources + for source in sources + if source is not None + ) + file_candidates = self.evaluate_links( + link_evaluator, + sorted(file_links_it, reverse=True), + ) + + if logger.isEnabledFor(logging.DEBUG) and file_candidates: + paths = [] + for candidate in file_candidates: + assert candidate.link.url # we need to have a URL + try: + paths.append(candidate.link.file_path) + except Exception: + paths.append(candidate.link.url) # it's not a local file + + logger.debug("Local files found: %s", ", ".join(paths)) + + # This is an intentional priority ordering + return file_candidates + page_candidates + + def make_candidate_evaluator( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> CandidateEvaluator: + """Create a CandidateEvaluator object to use.""" + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + @functools.lru_cache(maxsize=None) + def find_best_candidate( + self, + project_name: str, + specifier: Optional[specifiers.BaseSpecifier] = None, + hashes: Optional[Hashes] = None, + ) -> BestCandidateResult: + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement( + self, req: InstallRequirement, upgrade: bool + ) -> Optional[InstallationCandidate]: + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a InstallationCandidate if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, + specifier=req.specifier, + hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version: Optional[_BaseVersion] = None + if req.satisfied_by is not None: + installed_version = req.satisfied_by.version + + def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ( + ", ".join( + sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + ) + ) + or "none" + ) + + if installed_version is None and best_candidate is None: + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound( + "No matching distribution found for {}".format(req) + ) + + best_installed = False + if installed_version and ( + best_candidate is None or best_candidate.version <= installed_version + ): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + "Existing installed version (%s) is most up-to-date and " + "satisfies requirement", + installed_version, + ) + else: + logger.debug( + "Existing installed version (%s) satisfies requirement " + "(most up-to-date version is %s)", + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + "Installed version (%s) is most up-to-date (past versions: %s)", + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + "Using version %s (newest of versions: %s)", + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate + + +def _find_name_version_sep(fragment: str, canonical_name: str) -> int: + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError(f"{fragment} does not match {canonical_name}") + + +def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]: + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/lib/python3.11/site-packages/pip/_internal/index/sources.py b/python/lib/python3.10/site-packages/pip/_internal/index/sources.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/index/sources.py rename to python/lib/python3.10/site-packages/pip/_internal/index/sources.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/locations/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/locations/__init__.py new file mode 100644 index 0000000..ac0c166 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/locations/__init__.py @@ -0,0 +1,520 @@ +import functools +import logging +import os +import pathlib +import sys +import sysconfig +from typing import Any, Dict, Iterator, List, Optional, Tuple + +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.virtualenv import running_under_virtualenv + +from . import _distutils, _sysconfig +from .base import ( + USER_CACHE_DIR, + get_major_minor_version, + get_src_prefix, + is_osx_framework, + site_packages, + user_site, +) + +__all__ = [ + "USER_CACHE_DIR", + "get_bin_prefix", + "get_bin_user", + "get_major_minor_version", + "get_platlib", + "get_prefixed_libs", + "get_purelib", + "get_scheme", + "get_src_prefix", + "site_packages", + "user_site", +] + + +logger = logging.getLogger(__name__) + + +_PLATLIBDIR: str = getattr(sys, "platlibdir", "lib") + +_USE_SYSCONFIG_DEFAULT = sys.version_info >= (3, 10) + + +def _should_use_sysconfig() -> bool: + """This function determines the value of _USE_SYSCONFIG. + + By default, pip uses sysconfig on Python 3.10+. + But Python distributors can override this decision by setting: + sysconfig._PIP_USE_SYSCONFIG = True / False + Rationale in https://github.com/pypa/pip/issues/10647 + + This is a function for testability, but should be constant during any one + run. + """ + return bool(getattr(sysconfig, "_PIP_USE_SYSCONFIG", _USE_SYSCONFIG_DEFAULT)) + + +_USE_SYSCONFIG = _should_use_sysconfig() + +# Be noisy about incompatibilities if this platforms "should" be using +# sysconfig, but is explicitly opting out and using distutils instead. +if _USE_SYSCONFIG_DEFAULT and not _USE_SYSCONFIG: + _MISMATCH_LEVEL = logging.WARNING +else: + _MISMATCH_LEVEL = logging.DEBUG + + +def _looks_like_bpo_44860() -> bool: + """The resolution to bpo-44860 will change this incorrect platlib. + + See . + """ + from distutils.command.install import INSTALL_SCHEMES # type: ignore + + try: + unix_user_platlib = INSTALL_SCHEMES["unix_user"]["platlib"] + except KeyError: + return False + return unix_user_platlib == "$usersite" + + +def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool: + platlib = scheme["platlib"] + if "/$platlibdir/" in platlib: + platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/") + if "/lib64/" not in platlib: + return False + unpatched = platlib.replace("/lib64/", "/lib/") + return unpatched.replace("$platbase/", "$base/") == scheme["purelib"] + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_lib() -> bool: + """Red Hat patches platlib in unix_prefix and unix_home, but not purelib. + + This is the only way I can see to tell a Red Hat-patched Python. + """ + from distutils.command.install import INSTALL_SCHEMES # type: ignore + + return all( + k in INSTALL_SCHEMES + and _looks_like_red_hat_patched_platlib_purelib(INSTALL_SCHEMES[k]) + for k in ("unix_prefix", "unix_home") + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_debian_scheme() -> bool: + """Debian adds two additional schemes.""" + from distutils.command.install import INSTALL_SCHEMES # type: ignore + + return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES + + +@functools.lru_cache(maxsize=None) +def _looks_like_red_hat_scheme() -> bool: + """Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``. + + Red Hat's ``00251-change-user-install-location.patch`` changes the install + command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is + (fortunately?) done quite unconditionally, so we create a default command + object without any configuration to detect this. + """ + from distutils.command.install import install + from distutils.dist import Distribution + + cmd: Any = install(Distribution()) + cmd.finalize_options() + return ( + cmd.exec_prefix == f"{os.path.normpath(sys.exec_prefix)}/local" + and cmd.prefix == f"{os.path.normpath(sys.prefix)}/local" + ) + + +@functools.lru_cache(maxsize=None) +def _looks_like_slackware_scheme() -> bool: + """Slackware patches sysconfig but fails to patch distutils and site. + + Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib + path, but does not do the same to the site module. + """ + if user_site is None: # User-site not available. + return False + try: + paths = sysconfig.get_paths(scheme="posix_user", expand=False) + except KeyError: # User-site not available. + return False + return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site + + +@functools.lru_cache(maxsize=None) +def _looks_like_msys2_mingw_scheme() -> bool: + """MSYS2 patches distutils and sysconfig to use a UNIX-like scheme. + + However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is + likely going to be included in their 3.10 release, so we ignore the warning. + See msys2/MINGW-packages#9319. + + MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase, + and is missing the final ``"site-packages"``. + """ + paths = sysconfig.get_paths("nt", expand=False) + return all( + "Lib" not in p and "lib" in p and not p.endswith("site-packages") + for p in (paths[key] for key in ("platlib", "purelib")) + ) + + +def _fix_abiflags(parts: Tuple[str]) -> Iterator[str]: + ldversion = sysconfig.get_config_var("LDVERSION") + abiflags: str = getattr(sys, "abiflags", None) + + # LDVERSION does not end with sys.abiflags. Just return the path unchanged. + if not ldversion or not abiflags or not ldversion.endswith(abiflags): + yield from parts + return + + # Strip sys.abiflags from LDVERSION-based path components. + for part in parts: + if part.endswith(ldversion): + part = part[: (0 - len(abiflags))] + yield part + + +@functools.lru_cache(maxsize=None) +def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None: + issue_url = "https://github.com/pypa/pip/issues/10151" + message = ( + "Value for %s does not match. Please report this to <%s>" + "\ndistutils: %s" + "\nsysconfig: %s" + ) + logger.log(_MISMATCH_LEVEL, message, key, issue_url, old, new) + + +def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool: + if old == new: + return False + _warn_mismatched(old, new, key=key) + return True + + +@functools.lru_cache(maxsize=None) +def _log_context( + *, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + prefix: Optional[str] = None, +) -> None: + parts = [ + "Additional context:", + "user = %r", + "home = %r", + "root = %r", + "prefix = %r", + ] + + logger.log(_MISMATCH_LEVEL, "\n".join(parts), user, home, root, prefix) + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + new = _sysconfig.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + if _USE_SYSCONFIG: + return new + + old = _distutils.get_scheme( + dist_name, + user=user, + home=home, + root=root, + isolated=isolated, + prefix=prefix, + ) + + warning_contexts = [] + for k in SCHEME_KEYS: + old_v = pathlib.Path(getattr(old, k)) + new_v = pathlib.Path(getattr(new, k)) + + if old_v == new_v: + continue + + # distutils incorrectly put PyPy packages under ``site-packages/python`` + # in the ``posix_home`` scheme, but PyPy devs said they expect the + # directory name to be ``pypy`` instead. So we treat this as a bug fix + # and not warn about it. See bpo-43307 and python/cpython#24628. + skip_pypy_special_case = ( + sys.implementation.name == "pypy" + and home is not None + and k in ("platlib", "purelib") + and old_v.parent == new_v.parent + and old_v.name.startswith("python") + and new_v.name.startswith("pypy") + ) + if skip_pypy_special_case: + continue + + # sysconfig's ``osx_framework_user`` does not include ``pythonX.Y`` in + # the ``include`` value, but distutils's ``headers`` does. We'll let + # CPython decide whether this is a bug or feature. See bpo-43948. + skip_osx_framework_user_special_case = ( + user + and is_osx_framework() + and k == "headers" + and old_v.parent.parent == new_v.parent + and old_v.parent.name.startswith("python") + ) + if skip_osx_framework_user_special_case: + continue + + # On Red Hat and derived Linux distributions, distutils is patched to + # use "lib64" instead of "lib" for platlib. + if k == "platlib" and _looks_like_red_hat_lib(): + continue + + # On Python 3.9+, sysconfig's posix_user scheme sets platlib against + # sys.platlibdir, but distutils's unix_user incorrectly coninutes + # using the same $usersite for both platlib and purelib. This creates a + # mismatch when sys.platlibdir is not "lib". + skip_bpo_44860 = ( + user + and k == "platlib" + and not WINDOWS + and sys.version_info >= (3, 9) + and _PLATLIBDIR != "lib" + and _looks_like_bpo_44860() + ) + if skip_bpo_44860: + continue + + # Slackware incorrectly patches posix_user to use lib64 instead of lib, + # but not usersite to match the location. + skip_slackware_user_scheme = ( + user + and k in ("platlib", "purelib") + and not WINDOWS + and _looks_like_slackware_scheme() + ) + if skip_slackware_user_scheme: + continue + + # Both Debian and Red Hat patch Python to place the system site under + # /usr/local instead of /usr. Debian also places lib in dist-packages + # instead of site-packages, but the /usr/local check should cover it. + skip_linux_system_special_case = ( + not (user or home or prefix or running_under_virtualenv()) + and old_v.parts[1:3] == ("usr", "local") + and len(new_v.parts) > 1 + and new_v.parts[1] == "usr" + and (len(new_v.parts) < 3 or new_v.parts[2] != "local") + and (_looks_like_red_hat_scheme() or _looks_like_debian_scheme()) + ) + if skip_linux_system_special_case: + continue + + # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in + # the "pythonX.Y" part of the path, but distutils does. + skip_sysconfig_abiflag_bug = ( + sys.version_info < (3, 8) + and not WINDOWS + and k in ("headers", "platlib", "purelib") + and tuple(_fix_abiflags(old_v.parts)) == new_v.parts + ) + if skip_sysconfig_abiflag_bug: + continue + + # MSYS2 MINGW's sysconfig patch does not include the "site-packages" + # part of the path. This is incorrect and will be fixed in MSYS. + skip_msys2_mingw_bug = ( + WINDOWS and k in ("platlib", "purelib") and _looks_like_msys2_mingw_scheme() + ) + if skip_msys2_mingw_bug: + continue + + # CPython's POSIX install script invokes pip (via ensurepip) against the + # interpreter located in the source tree, not the install site. This + # triggers special logic in sysconfig that's not present in distutils. + # https://github.com/python/cpython/blob/8c21941ddaf/Lib/sysconfig.py#L178-L194 + skip_cpython_build = ( + sysconfig.is_python_build(check_home=True) + and not WINDOWS + and k in ("headers", "include", "platinclude") + ) + if skip_cpython_build: + continue + + warning_contexts.append((old_v, new_v, f"scheme.{k}")) + + if not warning_contexts: + return old + + # Check if this path mismatch is caused by distutils config files. Those + # files will no longer work once we switch to sysconfig, so this raises a + # deprecation message for them. + default_old = _distutils.distutils_scheme( + dist_name, + user, + home, + root, + isolated, + prefix, + ignore_config_files=True, + ) + if any(default_old[k] != getattr(old, k) for k in SCHEME_KEYS): + deprecated( + reason=( + "Configuring installation scheme with distutils config files " + "is deprecated and will no longer work in the near future. If you " + "are using a Homebrew or Linuxbrew Python, please see discussion " + "at https://github.com/Homebrew/homebrew-core/issues/76621" + ), + replacement=None, + gone_in=None, + ) + return old + + # Post warnings about this mismatch so user can report them back. + for old_v, new_v, key in warning_contexts: + _warn_mismatched(old_v, new_v, key=key) + _log_context(user=user, home=home, root=root, prefix=prefix) + + return old + + +def get_bin_prefix() -> str: + new = _sysconfig.get_bin_prefix() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_bin_prefix() + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="bin_prefix"): + _log_context() + return old + + +def get_bin_user() -> str: + return _sysconfig.get_scheme("", user=True).scripts + + +def _looks_like_deb_system_dist_packages(value: str) -> bool: + """Check if the value is Debian's APT-controlled dist-packages. + + Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the + default package path controlled by APT, but does not patch ``sysconfig`` to + do the same. This is similar to the bug worked around in ``get_scheme()``, + but here the default is ``deb_system`` instead of ``unix_local``. Ultimately + we can't do anything about this Debian bug, and this detection allows us to + skip the warning when needed. + """ + if not _looks_like_debian_scheme(): + return False + if value == "/usr/lib/python3/dist-packages": + return True + return False + + +def get_purelib() -> str: + """Return the default pure-Python lib location.""" + new = _sysconfig.get_purelib() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_purelib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="purelib"): + _log_context() + return old + + +def get_platlib() -> str: + """Return the default platform-shared lib location.""" + new = _sysconfig.get_platlib() + if _USE_SYSCONFIG: + return new + + old = _distutils.get_platlib() + if _looks_like_deb_system_dist_packages(old): + return old + if _warn_if_mismatch(pathlib.Path(old), pathlib.Path(new), key="platlib"): + _log_context() + return old + + +def _deduplicated(v1: str, v2: str) -> List[str]: + """Deduplicate values from a list.""" + if v1 == v2: + return [v1] + return [v1, v2] + + +def _looks_like_apple_library(path: str) -> bool: + """Apple patches sysconfig to *always* look under */Library/Python*.""" + if sys.platform[:6] != "darwin": + return False + return path == f"/Library/Python/{get_major_minor_version()}/site-packages" + + +def get_prefixed_libs(prefix: str) -> List[str]: + """Return the lib locations under ``prefix``.""" + new_pure, new_plat = _sysconfig.get_prefixed_libs(prefix) + if _USE_SYSCONFIG: + return _deduplicated(new_pure, new_plat) + + old_pure, old_plat = _distutils.get_prefixed_libs(prefix) + old_lib_paths = _deduplicated(old_pure, old_plat) + + # Apple's Python (shipped with Xcode and Command Line Tools) hard-code + # platlib and purelib to '/Library/Python/X.Y/site-packages'. This will + # cause serious build isolation bugs when Apple starts shipping 3.10 because + # pip will install build backends to the wrong location. This tells users + # who is at fault so Apple may notice it and fix the issue in time. + if all(_looks_like_apple_library(p) for p in old_lib_paths): + deprecated( + reason=( + "Python distributed by Apple's Command Line Tools incorrectly " + "patches sysconfig to always point to '/Library/Python'. This " + "will cause build isolation to operate incorrectly on Python " + "3.10 or later. Please help report this to Apple so they can " + "fix this. https://developer.apple.com/bug-reporting/" + ), + replacement=None, + gone_in=None, + ) + return old_lib_paths + + warned = [ + _warn_if_mismatch( + pathlib.Path(old_pure), + pathlib.Path(new_pure), + key="prefixed-purelib", + ), + _warn_if_mismatch( + pathlib.Path(old_plat), + pathlib.Path(new_plat), + key="prefixed-platlib", + ), + ] + if any(warned): + _log_context(prefix=prefix) + + return old_lib_paths diff --git a/python/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py b/python/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py new file mode 100644 index 0000000..2ec79e6 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py @@ -0,0 +1,169 @@ +"""Locations where we look for configs, install stuff, etc""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import os +import sys +from distutils.cmd import Command as DistutilsCommand +from distutils.command.install import SCHEME_KEYS +from distutils.command.install import install as distutils_install_command +from distutils.sysconfig import get_python_lib +from typing import Dict, List, Optional, Tuple, Union, cast + +from pip._internal.models.scheme import Scheme +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import get_major_minor_version + +logger = logging.getLogger(__name__) + + +def distutils_scheme( + dist_name: str, + user: bool = False, + home: str = None, + root: str = None, + isolated: bool = False, + prefix: str = None, + *, + ignore_config_files: bool = False, +) -> Dict[str, str]: + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name} + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + if not ignore_config_files: + try: + d.parse_config_files() + except UnicodeDecodeError: + # Typeshed does not include find_config_files() for some reason. + paths = d.find_config_files() # type: ignore + logger.warning( + "Ignore distutils configs in %s due to encoding errors.", + ", ".join(os.path.basename(p) for p in paths), + ) + obj: Optional[DistutilsCommand] = None + obj = d.get_command_obj("install", create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), f"user={user} prefix={prefix}" + assert not (home and prefix), f"home={home} prefix={prefix}" + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, "install_" + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if "install_lib" in d.get_option_dict("install"): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + if home: + prefix = home + elif user: + prefix = i.install_userbase # type: ignore + else: + prefix = i.prefix + scheme["headers"] = os.path.join( + prefix, + "include", + "site", + f"python{get_major_minor_version()}", + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive(os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join(root, path_no_drive[1:]) + + return scheme + + +def get_scheme( + dist_name: str, + user: bool = False, + home: Optional[str] = None, + root: Optional[str] = None, + isolated: bool = False, + prefix: Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme(dist_name, user, home, root, isolated, prefix) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) + + +def get_bin_prefix() -> str: + # XXX: In old virtualenv versions, sys.prefix can contain '..' components, + # so we need to call normpath to eliminate them. + prefix = os.path.normpath(sys.prefix) + if WINDOWS: + bin_py = os.path.join(prefix, "Scripts") + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(prefix, "bin") + return bin_py + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == "darwin" and prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return os.path.join(prefix, "bin") + + +def get_purelib() -> str: + return get_python_lib(plat_specific=False) + + +def get_platlib() -> str: + return get_python_lib(plat_specific=True) + + +def get_prefixed_libs(prefix: str) -> Tuple[str, str]: + return ( + get_python_lib(plat_specific=False, prefix=prefix), + get_python_lib(plat_specific=True, prefix=prefix), + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py b/python/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py new file mode 100644 index 0000000..5e141aa --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py @@ -0,0 +1,219 @@ +import distutils.util # FIXME: For change_root. +import logging +import os +import sys +import sysconfig +import typing + +from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import get_major_minor_version, is_osx_framework + +logger = logging.getLogger(__name__) + + +# Notes on _infer_* functions. +# Unfortunately ``get_default_scheme()`` didn't exist before 3.10, so there's no +# way to ask things like "what is the '_prefix' scheme on this platform". These +# functions try to answer that with some heuristics while accounting for ad-hoc +# platforms not covered by CPython's default sysconfig implementation. If the +# ad-hoc implementation does not fully implement sysconfig, we'll fall back to +# a POSIX scheme. + +_AVAILABLE_SCHEMES = set(sysconfig.get_scheme_names()) + +_PREFERRED_SCHEME_API = getattr(sysconfig, "get_preferred_scheme", None) + + +def _should_use_osx_framework_prefix() -> bool: + """Check for Apple's ``osx_framework_library`` scheme. + + Python distributed by Apple's Command Line Tools has this special scheme + that's used when: + + * This is a framework build. + * We are installing into the system prefix. + + This does not account for ``pip install --prefix`` (also means we're not + installing to the system prefix), which should use ``posix_prefix``, but + logic here means ``_infer_prefix()`` outputs ``osx_framework_library``. But + since ``prefix`` is not available for ``sysconfig.get_default_scheme()``, + which is the stdlib replacement for ``_infer_prefix()``, presumably Apple + wouldn't be able to magically switch between ``osx_framework_library`` and + ``posix_prefix``. ``_infer_prefix()`` returning ``osx_framework_library`` + means its behavior is consistent whether we use the stdlib implementation + or our own, and we deal with this special case in ``get_scheme()`` instead. + """ + return ( + "osx_framework_library" in _AVAILABLE_SCHEMES + and not running_under_virtualenv() + and is_osx_framework() + ) + + +def _infer_prefix() -> str: + """Try to find a prefix scheme for the current platform. + + This tries: + + * A special ``osx_framework_library`` for Python distributed by Apple's + Command Line Tools, when not running in a virtual environment. + * Implementation + OS, used by PyPy on Windows (``pypy_nt``). + * Implementation without OS, used by PyPy on POSIX (``pypy``). + * OS + "prefix", used by CPython on POSIX (``posix_prefix``). + * Just the OS name, used by CPython on Windows (``nt``). + + If none of the above works, fall back to ``posix_prefix``. + """ + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("prefix") + if _should_use_osx_framework_prefix(): + return "osx_framework_library" + implementation_suffixed = f"{sys.implementation.name}_{os.name}" + if implementation_suffixed in _AVAILABLE_SCHEMES: + return implementation_suffixed + if sys.implementation.name in _AVAILABLE_SCHEMES: + return sys.implementation.name + suffixed = f"{os.name}_prefix" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if os.name in _AVAILABLE_SCHEMES: # On Windows, prefx is just called "nt". + return os.name + return "posix_prefix" + + +def _infer_user() -> str: + """Try to find a user scheme for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("user") + if is_osx_framework() and not running_under_virtualenv(): + suffixed = "osx_framework_user" + else: + suffixed = f"{os.name}_user" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + if "posix_user" not in _AVAILABLE_SCHEMES: # User scheme unavailable. + raise UserInstallationInvalid() + return "posix_user" + + +def _infer_home() -> str: + """Try to find a home for the current platform.""" + if _PREFERRED_SCHEME_API: + return _PREFERRED_SCHEME_API("home") + suffixed = f"{os.name}_home" + if suffixed in _AVAILABLE_SCHEMES: + return suffixed + return "posix_home" + + +# Update these keys if the user sets a custom home. +_HOME_KEYS = [ + "installed_base", + "base", + "installed_platbase", + "platbase", + "prefix", + "exec_prefix", +] +if sysconfig.get_config_var("userbase") is not None: + _HOME_KEYS.append("userbase") + + +def get_scheme( + dist_name: str, + user: bool = False, + home: typing.Optional[str] = None, + root: typing.Optional[str] = None, + isolated: bool = False, + prefix: typing.Optional[str] = None, +) -> Scheme: + """ + Get the "scheme" corresponding to the input parameters. + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme + :param root: root under which other directories are re-based + :param isolated: ignored, but kept for distutils compatibility (where + this controls whether the user-site pydistutils.cfg is honored) + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + if user and prefix: + raise InvalidSchemeCombination("--user", "--prefix") + if home and prefix: + raise InvalidSchemeCombination("--home", "--prefix") + + if home is not None: + scheme_name = _infer_home() + elif user: + scheme_name = _infer_user() + else: + scheme_name = _infer_prefix() + + # Special case: When installing into a custom prefix, use posix_prefix + # instead of osx_framework_library. See _should_use_osx_framework_prefix() + # docstring for details. + if prefix is not None and scheme_name == "osx_framework_library": + scheme_name = "posix_prefix" + + if home is not None: + variables = {k: home for k in _HOME_KEYS} + elif prefix is not None: + variables = {k: prefix for k in _HOME_KEYS} + else: + variables = {} + + paths = sysconfig.get_paths(scheme=scheme_name, vars=variables) + + # Logic here is very arbitrary, we're doing it for compatibility, don't ask. + # 1. Pip historically uses a special header path in virtual environments. + # 2. If the distribution name is not known, distutils uses 'UNKNOWN'. We + # only do the same when not running in a virtual environment because + # pip's historical header path logic (see point 1) did not do this. + if running_under_virtualenv(): + if user: + base = variables.get("userbase", sys.prefix) + else: + base = variables.get("base", sys.prefix) + python_xy = f"python{get_major_minor_version()}" + paths["include"] = os.path.join(base, "include", "site", python_xy) + elif not dist_name: + dist_name = "UNKNOWN" + + scheme = Scheme( + platlib=paths["platlib"], + purelib=paths["purelib"], + headers=os.path.join(paths["include"], dist_name), + scripts=paths["scripts"], + data=paths["data"], + ) + if root is not None: + for key in SCHEME_KEYS: + value = distutils.util.change_root(root, getattr(scheme, key)) + setattr(scheme, key, value) + return scheme + + +def get_bin_prefix() -> str: + # Forcing to use /usr/local/bin for standard macOS framework installs. + if sys.platform[:6] == "darwin" and sys.prefix[:16] == "/System/Library/": + return "/usr/local/bin" + return sysconfig.get_paths()["scripts"] + + +def get_purelib() -> str: + return sysconfig.get_paths()["purelib"] + + +def get_platlib() -> str: + return sysconfig.get_paths()["platlib"] + + +def get_prefixed_libs(prefix: str) -> typing.Tuple[str, str]: + paths = sysconfig.get_paths(vars={"base": prefix, "platbase": prefix}) + return (paths["purelib"], paths["platlib"]) diff --git a/python/lib/python3.10/site-packages/pip/_internal/locations/base.py b/python/lib/python3.10/site-packages/pip/_internal/locations/base.py new file mode 100644 index 0000000..86dad4a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/locations/base.py @@ -0,0 +1,52 @@ +import functools +import os +import site +import sys +import sysconfig +import typing + +from pip._internal.utils import appdirs +from pip._internal.utils.virtualenv import running_under_virtualenv + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + +# FIXME doesn't account for venv linked to global site-packages +site_packages: typing.Optional[str] = sysconfig.get_path("purelib") + + +def get_major_minor_version() -> str: + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return "{}.{}".format(*sys.version_info) + + +def get_src_prefix() -> str: + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, "src") + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), "src") + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit("The folder you are executing pip from can no longer be found.") + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site: typing.Optional[str] = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + + +@functools.lru_cache(maxsize=None) +def is_osx_framework() -> bool: + return bool(sysconfig.get_config_var("PYTHONFRAMEWORK")) diff --git a/lib/python3.11/site-packages/pip/_internal/main.py b/python/lib/python3.10/site-packages/pip/_internal/main.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/main.py rename to python/lib/python3.10/site-packages/pip/_internal/main.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py new file mode 100644 index 0000000..cc037c1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py @@ -0,0 +1,62 @@ +from typing import List, Optional + +from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel + +__all__ = [ + "BaseDistribution", + "BaseEnvironment", + "FilesystemWheel", + "MemoryWheel", + "Wheel", + "get_default_environment", + "get_environment", + "get_wheel_distribution", +] + + +def get_default_environment() -> BaseEnvironment: + """Get the default representation for the current environment. + + This returns an Environment instance from the chosen backend. The default + Environment instance should be built from ``sys.path`` and may use caching + to share instance state accorss calls. + """ + from .pkg_resources import Environment + + return Environment.default() + + +def get_environment(paths: Optional[List[str]]) -> BaseEnvironment: + """Get a representation of the environment specified by ``paths``. + + This returns an Environment instance from the chosen backend based on the + given import paths. The backend must build a fresh instance representing + the state of installed distributions when this function is called. + """ + from .pkg_resources import Environment + + return Environment.from_paths(paths) + + +def get_directory_distribution(directory: str) -> BaseDistribution: + """Get the distribution metadata representation in the specified directory. + + This returns a Distribution instance from the chosen backend based on + the given on-disk ``.dist-info`` directory. + """ + from .pkg_resources import Distribution + + return Distribution.from_directory(directory) + + +def get_wheel_distribution(wheel: Wheel, canonical_name: str) -> BaseDistribution: + """Get the representation of the specified wheel's distribution metadata. + + This returns a Distribution instance from the chosen backend based on + the given wheel's ``.dist-info`` directory. + + :param canonical_name: Normalized project name of the given wheel. + """ + from .pkg_resources import Distribution + + return Distribution.from_wheel(wheel, canonical_name) diff --git a/python/lib/python3.10/site-packages/pip/_internal/metadata/base.py b/python/lib/python3.10/site-packages/pip/_internal/metadata/base.py new file mode 100644 index 0000000..1a5a781 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/metadata/base.py @@ -0,0 +1,546 @@ +import csv +import email.message +import json +import logging +import pathlib +import re +import zipfile +from typing import ( + IO, + TYPE_CHECKING, + Collection, + Container, + Iterable, + Iterator, + List, + Optional, + Tuple, + Union, +) + +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet +from pip._vendor.packaging.utils import NormalizedName +from pip._vendor.packaging.version import LegacyVersion, Version + +from pip._internal.exceptions import NoneMetadataError +from pip._internal.locations import site_packages, user_site +from pip._internal.models.direct_url import ( + DIRECT_URL_METADATA_NAME, + DirectUrl, + DirectUrlValidationError, +) +from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. +from pip._internal.utils.egg_link import ( + egg_link_path_from_location, + egg_link_path_from_sys_path, +) +from pip._internal.utils.misc import is_local, normalize_path +from pip._internal.utils.urls import url_to_path + +if TYPE_CHECKING: + from typing import Protocol +else: + Protocol = object + +DistributionVersion = Union[LegacyVersion, Version] + +InfoPath = Union[str, pathlib.PurePosixPath] + +logger = logging.getLogger(__name__) + + +class BaseEntryPoint(Protocol): + @property + def name(self) -> str: + raise NotImplementedError() + + @property + def value(self) -> str: + raise NotImplementedError() + + @property + def group(self) -> str: + raise NotImplementedError() + + +def _convert_installed_files_path( + entry: Tuple[str, ...], + info: Tuple[str, ...], +) -> str: + """Convert a legacy installed-files.txt path into modern RECORD path. + + The legacy format stores paths relative to the info directory, while the + modern format stores paths relative to the package root, e.g. the + site-packages directory. + + :param entry: Path parts of the installed-files.txt entry. + :param info: Path parts of the egg-info directory relative to package root. + :returns: The converted entry. + + For best compatibility with symlinks, this does not use ``abspath()`` or + ``Path.resolve()``, but tries to work with path parts: + + 1. While ``entry`` starts with ``..``, remove the equal amounts of parts + from ``info``; if ``info`` is empty, start appending ``..`` instead. + 2. Join the two directly. + """ + while entry and entry[0] == "..": + if not info or info[-1] == "..": + info += ("..",) + else: + info = info[:-1] + entry = entry[1:] + return str(pathlib.Path(*info, *entry)) + + +class BaseDistribution(Protocol): + def __repr__(self) -> str: + return f"{self.raw_name} {self.version} ({self.location})" + + def __str__(self) -> str: + return f"{self.raw_name} {self.version}" + + @property + def location(self) -> Optional[str]: + """Where the distribution is loaded from. + + A string value is not necessarily a filesystem path, since distributions + can be loaded from other sources, e.g. arbitrary zip archives. ``None`` + means the distribution is created in-memory. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and files in the distribution. + """ + raise NotImplementedError() + + @property + def editable_project_location(self) -> Optional[str]: + """The project location for editable distributions. + + This is the directory where pyproject.toml or setup.py is located. + None if the distribution is not installed in editable mode. + """ + # TODO: this property is relatively costly to compute, memoize it ? + direct_url = self.direct_url + if direct_url: + if direct_url.is_local_editable(): + return url_to_path(direct_url.url) + else: + # Search for an .egg-link file by walking sys.path, as it was + # done before by dist_is_editable(). + egg_link_path = egg_link_path_from_sys_path(self.raw_name) + if egg_link_path: + # TODO: get project location from second line of egg_link file + # (https://github.com/pypa/pip/issues/10243) + return self.location + return None + + @property + def installed_location(self) -> Optional[str]: + """The distribution's "installed" location. + + This should generally be a ``site-packages`` directory. This is + usually ``dist.location``, except for legacy develop-installed packages, + where ``dist.location`` is the source code location, and this is where + the ``.egg-link`` file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + egg_link = egg_link_path_from_location(self.raw_name) + if egg_link: + location = egg_link + elif self.location: + location = self.location + else: + return None + return normalize_path(location) + + @property + def info_location(self) -> Optional[str]: + """Location of the .[egg|dist]-info directory or file. + + Similarly to ``location``, a string value is not necessarily a + filesystem path. ``None`` means the distribution is created in-memory. + + For a modern .dist-info installation on disk, this should be something + like ``{location}/{raw_name}-{version}.dist-info``. + + Do not canonicalize this value with e.g. ``pathlib.Path.resolve()``. If + this is a symbolic link, we want to preserve the relative path between + it and other files in the distribution. + """ + raise NotImplementedError() + + @property + def installed_by_distutils(self) -> bool: + """Whether this distribution is installed with legacy distutils format. + + A distribution installed with "raw" distutils not patched by setuptools + uses one single file at ``info_location`` to store metadata. We need to + treat this specially on uninstallation. + """ + info_location = self.info_location + if not info_location: + return False + return pathlib.Path(info_location).is_file() + + @property + def installed_as_egg(self) -> bool: + """Whether this distribution is installed as an egg. + + This usually indicates the distribution was installed by (older versions + of) easy_install. + """ + location = self.location + if not location: + return False + return location.endswith(".egg") + + @property + def installed_with_setuptools_egg_info(self) -> bool: + """Whether this distribution is installed with the ``.egg-info`` format. + + This usually indicates the distribution was installed with setuptools + with an old pip version or with ``single-version-externally-managed``. + + Note that this ensure the metadata store is a directory. distutils can + also installs an ``.egg-info``, but as a file, not a directory. This + property is *False* for that case. Also see ``installed_by_distutils``. + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".egg-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def installed_with_dist_info(self) -> bool: + """Whether this distribution is installed with the "modern format". + + This indicates a "modern" installation, e.g. storing metadata in the + ``.dist-info`` directory. This applies to installations made by + setuptools (but through pip, not directly), or anything using the + standardized build backend interface (PEP 517). + """ + info_location = self.info_location + if not info_location: + return False + if not info_location.endswith(".dist-info"): + return False + return pathlib.Path(info_location).is_dir() + + @property + def canonical_name(self) -> NormalizedName: + raise NotImplementedError() + + @property + def version(self) -> DistributionVersion: + raise NotImplementedError() + + @property + def setuptools_filename(self) -> str: + """Convert a project name to its setuptools-compatible filename. + + This is a copy of ``pkg_resources.to_filename()`` for compatibility. + """ + return self.raw_name.replace("-", "_") + + @property + def direct_url(self) -> Optional[DirectUrl]: + """Obtain a DirectUrl from this distribution. + + Returns None if the distribution has no `direct_url.json` metadata, + or if `direct_url.json` is invalid. + """ + try: + content = self.read_text(DIRECT_URL_METADATA_NAME) + except FileNotFoundError: + return None + try: + return DirectUrl.from_json(content) + except ( + UnicodeDecodeError, + json.JSONDecodeError, + DirectUrlValidationError, + ) as e: + logger.warning( + "Error parsing %s for %s: %s", + DIRECT_URL_METADATA_NAME, + self.canonical_name, + e, + ) + return None + + @property + def installer(self) -> str: + try: + installer_text = self.read_text("INSTALLER") + except (OSError, ValueError, NoneMetadataError): + return "" # Fail silently if the installer file cannot be read. + for line in installer_text.splitlines(): + cleaned_line = line.strip() + if cleaned_line: + return cleaned_line + return "" + + @property + def editable(self) -> bool: + return bool(self.editable_project_location) + + @property + def local(self) -> bool: + """If distribution is installed in the current virtual environment. + + Always True if we're not in a virtualenv. + """ + if self.installed_location is None: + return False + return is_local(self.installed_location) + + @property + def in_usersite(self) -> bool: + if self.installed_location is None or user_site is None: + return False + return self.installed_location.startswith(normalize_path(user_site)) + + @property + def in_site_packages(self) -> bool: + if self.installed_location is None or site_packages is None: + return False + return self.installed_location.startswith(normalize_path(site_packages)) + + def is_file(self, path: InfoPath) -> bool: + """Check whether an entry in the info directory is a file.""" + raise NotImplementedError() + + def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: + """Iterate through a directory in the info directory. + + Each item yielded would be a path relative to the info directory. + + :raise FileNotFoundError: If ``name`` does not exist in the directory. + :raise NotADirectoryError: If ``name`` does not point to a directory. + """ + raise NotImplementedError() + + def read_text(self, path: InfoPath) -> str: + """Read a file in the info directory. + + :raise FileNotFoundError: If ``name`` does not exist in the directory. + :raise NoneMetadataError: If ``name`` exists in the info directory, but + cannot be read. + """ + raise NotImplementedError() + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + raise NotImplementedError() + + @property + def metadata(self) -> email.message.Message: + """Metadata of distribution parsed from e.g. METADATA or PKG-INFO. + + This should return an empty message if the metadata file is unavailable. + + :raises NoneMetadataError: If the metadata file is available, but does + not contain valid metadata. + """ + raise NotImplementedError() + + @property + def metadata_version(self) -> Optional[str]: + """Value of "Metadata-Version:" in distribution metadata, if available.""" + return self.metadata.get("Metadata-Version") + + @property + def raw_name(self) -> str: + """Value of "Name:" in distribution metadata.""" + # The metadata should NEVER be missing the Name: key, but if it somehow + # does, fall back to the known canonical name. + return self.metadata.get("Name", self.canonical_name) + + @property + def requires_python(self) -> SpecifierSet: + """Value of "Requires-Python:" in distribution metadata. + + If the key does not exist or contains an invalid value, an empty + SpecifierSet should be returned. + """ + value = self.metadata.get("Requires-Python") + if value is None: + return SpecifierSet() + try: + # Convert to str to satisfy the type checker; this can be a Header object. + spec = SpecifierSet(str(value)) + except InvalidSpecifier as e: + message = "Package %r has an invalid Requires-Python: %s" + logger.warning(message, self.raw_name, e) + return SpecifierSet() + return spec + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + """Dependencies of this distribution. + + For modern .dist-info distributions, this is the collection of + "Requires-Dist:" entries in distribution metadata. + """ + raise NotImplementedError() + + def iter_provided_extras(self) -> Iterable[str]: + """Extras provided by this distribution. + + For modern .dist-info distributions, this is the collection of + "Provides-Extra:" entries in distribution metadata. + """ + raise NotImplementedError() + + def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("RECORD") + except FileNotFoundError: + return None + # This extra Path-str cast normalizes entries. + return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines())) + + def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]: + try: + text = self.read_text("installed-files.txt") + except FileNotFoundError: + return None + paths = (p for p in text.splitlines(keepends=False) if p) + root = self.location + info = self.info_location + if root is None or info is None: + return paths + try: + info_rel = pathlib.Path(info).relative_to(root) + except ValueError: # info is not relative to root. + return paths + if not info_rel.parts: # info *is* root. + return paths + return ( + _convert_installed_files_path(pathlib.Path(p).parts, info_rel.parts) + for p in paths + ) + + def iter_declared_entries(self) -> Optional[Iterator[str]]: + """Iterate through file entires declared in this distribution. + + For modern .dist-info distributions, this is the files listed in the + ``RECORD`` metadata file. For legacy setuptools distributions, this + comes from ``installed-files.txt``, with entries normalized to be + compatible with the format used by ``RECORD``. + + :return: An iterator for listed entries, or None if the distribution + contains neither ``RECORD`` nor ``installed-files.txt``. + """ + return ( + self._iter_declared_entries_from_record() + or self._iter_declared_entries_from_legacy() + ) + + +class BaseEnvironment: + """An environment containing distributions to introspect.""" + + @classmethod + def default(cls) -> "BaseEnvironment": + raise NotImplementedError() + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment": + raise NotImplementedError() + + def get_distribution(self, name: str) -> Optional["BaseDistribution"]: + """Given a requirement name, return the installed distributions. + + The name may not be normalized. The implementation must canonicalize + it for lookup. + """ + raise NotImplementedError() + + def _iter_distributions(self) -> Iterator["BaseDistribution"]: + """Iterate through installed distributions. + + This function should be implemented by subclass, but never called + directly. Use the public ``iter_distribution()`` instead, which + implements additional logic to make sure the distributions are valid. + """ + raise NotImplementedError() + + def iter_distributions(self) -> Iterator["BaseDistribution"]: + """Iterate through installed distributions.""" + for dist in self._iter_distributions(): + # Make sure the distribution actually comes from a valid Python + # packaging distribution. Pip's AdjacentTempDirectory leaves folders + # e.g. ``~atplotlib.dist-info`` if cleanup was interrupted. The + # valid project name pattern is taken from PEP 508. + project_name_valid = re.match( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", + dist.canonical_name, + flags=re.IGNORECASE, + ) + if not project_name_valid: + logger.warning( + "Ignoring invalid distribution %s (%s)", + dist.canonical_name, + dist.location, + ) + continue + yield dist + + def iter_installed_distributions( + self, + local_only: bool = True, + skip: Container[str] = stdlib_pkgs, + include_editables: bool = True, + editables_only: bool = False, + user_only: bool = False, + ) -> Iterator[BaseDistribution]: + """Return a list of installed distributions. + + :param local_only: If True (default), only return installations + local to the current virtualenv, if in a virtualenv. + :param skip: An iterable of canonicalized project names to ignore; + defaults to ``stdlib_pkgs``. + :param include_editables: If False, don't report editables. + :param editables_only: If True, only report editables. + :param user_only: If True, only report installations in the user + site directory. + """ + it = self.iter_distributions() + if local_only: + it = (d for d in it if d.local) + if not include_editables: + it = (d for d in it if not d.editable) + if editables_only: + it = (d for d in it if d.editable) + if user_only: + it = (d for d in it if d.in_usersite) + return (d for d in it if d.canonical_name not in skip) + + +class Wheel(Protocol): + location: str + + def as_zipfile(self) -> zipfile.ZipFile: + raise NotImplementedError() + + +class FilesystemWheel(Wheel): + def __init__(self, location: str) -> None: + self.location = location + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.location, allowZip64=True) + + +class MemoryWheel(Wheel): + def __init__(self, location: str, stream: IO[bytes]) -> None: + self.location = location + self.stream = stream + + def as_zipfile(self) -> zipfile.ZipFile: + return zipfile.ZipFile(self.stream, allowZip64=True) diff --git a/python/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py b/python/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py new file mode 100644 index 0000000..d39f0ba --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py @@ -0,0 +1,256 @@ +import email.message +import email.parser +import logging +import os +import pathlib +import zipfile +from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional + +from pip._vendor import pkg_resources +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel +from pip._internal.utils.misc import display_path +from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file + +from .base import ( + BaseDistribution, + BaseEntryPoint, + BaseEnvironment, + DistributionVersion, + InfoPath, + Wheel, +) + +logger = logging.getLogger(__name__) + + +class EntryPoint(NamedTuple): + name: str + value: str + group: str + + +class WheelMetadata: + """IMetadataProvider that reads metadata files from a dictionary. + + This also maps metadata decoding exceptions to our internal exception type. + """ + + def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> None: + self._metadata = metadata + self._wheel_name = wheel_name + + def has_metadata(self, name: str) -> bool: + return name in self._metadata + + def get_metadata(self, name: str) -> str: + try: + return self._metadata[name].decode() + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + f"Error decoding metadata for {self._wheel_name}: {e} in {name} file" + ) + + def get_metadata_lines(self, name: str) -> Iterable[str]: + return pkg_resources.yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name: str) -> bool: + return False + + def metadata_listdir(self, name: str) -> List[str]: + return [] + + def run_script(self, script_name: str, namespace: str) -> None: + pass + + +class Distribution(BaseDistribution): + def __init__(self, dist: pkg_resources.Distribution) -> None: + self._dist = dist + + @classmethod + def from_directory(cls, directory: str) -> "Distribution": + dist_dir = directory.rstrip(os.sep) + + # Build a PathMetadata object, from path to metadata. :wink: + base_dir, dist_dir_name = os.path.split(dist_dir) + metadata = pkg_resources.PathMetadata(base_dir, dist_dir) + + # Determine the correct Distribution object type. + if dist_dir.endswith(".egg-info"): + dist_cls = pkg_resources.Distribution + dist_name = os.path.splitext(dist_dir_name)[0] + else: + assert dist_dir.endswith(".dist-info") + dist_cls = pkg_resources.DistInfoDistribution + dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] + + dist = dist_cls(base_dir, project_name=dist_name, metadata=metadata) + return cls(dist) + + @classmethod + def from_wheel(cls, wheel: Wheel, name: str) -> "Distribution": + """Load the distribution from a given wheel. + + :raises InvalidWheel: Whenever loading of the wheel causes a + :py:exc:`zipfile.BadZipFile` exception to be thrown. + :raises UnsupportedWheel: If the wheel is a valid zip, but malformed + internally. + """ + try: + with wheel.as_zipfile() as zf: + info_dir, _ = parse_wheel(zf, name) + metadata_text = { + path.split("/", 1)[-1]: read_wheel_metadata_file(zf, path) + for path in zf.namelist() + if path.startswith(f"{info_dir}/") + } + except zipfile.BadZipFile as e: + raise InvalidWheel(wheel.location, name) from e + except UnsupportedWheel as e: + raise UnsupportedWheel(f"{name} has an invalid wheel, {e}") + dist = pkg_resources.DistInfoDistribution( + location=wheel.location, + metadata=WheelMetadata(metadata_text, wheel.location), + project_name=name, + ) + return cls(dist) + + @property + def location(self) -> Optional[str]: + return self._dist.location + + @property + def info_location(self) -> Optional[str]: + return self._dist.egg_info + + @property + def installed_by_distutils(self) -> bool: + # A distutils-installed distribution is provided by FileMetadata. This + # provider has a "path" attribute not present anywhere else. Not the + # best introspection logic, but pip has been doing this for a long time. + try: + return bool(self._dist._provider.path) + except AttributeError: + return False + + @property + def canonical_name(self) -> NormalizedName: + return canonicalize_name(self._dist.project_name) + + @property + def version(self) -> DistributionVersion: + return parse_version(self._dist.version) + + def is_file(self, path: InfoPath) -> bool: + return self._dist.has_metadata(str(path)) + + def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]: + name = str(path) + if not self._dist.has_metadata(name): + raise FileNotFoundError(name) + if not self._dist.isdir(name): + raise NotADirectoryError(name) + for child in self._dist.metadata_listdir(name): + yield pathlib.PurePosixPath(path, child) + + def read_text(self, path: InfoPath) -> str: + name = str(path) + if not self._dist.has_metadata(name): + raise FileNotFoundError(name) + content = self._dist.get_metadata(name) + if content is None: + raise NoneMetadataError(self, name) + return content + + def iter_entry_points(self) -> Iterable[BaseEntryPoint]: + for group, entries in self._dist.get_entry_map().items(): + for name, entry_point in entries.items(): + name, _, value = str(entry_point).partition("=") + yield EntryPoint(name=name.strip(), value=value.strip(), group=group) + + @property + def metadata(self) -> email.message.Message: + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + if isinstance(self._dist, pkg_resources.DistInfoDistribution): + metadata_name = "METADATA" + else: + metadata_name = "PKG-INFO" + try: + metadata = self.read_text(metadata_name) + except FileNotFoundError: + if self.location: + displaying_path = display_path(self.location) + else: + displaying_path = repr(self.location) + logger.warning("No metadata found in %s", displaying_path) + metadata = "" + feed_parser = email.parser.FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: + if extras: # pkg_resources raises on invalid extras, so we sanitize. + extras = frozenset(extras).intersection(self._dist.extras) + return self._dist.requires(extras) + + def iter_provided_extras(self) -> Iterable[str]: + return self._dist.extras + + +class Environment(BaseEnvironment): + def __init__(self, ws: pkg_resources.WorkingSet) -> None: + self._ws = ws + + @classmethod + def default(cls) -> BaseEnvironment: + return cls(pkg_resources.working_set) + + @classmethod + def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment: + return cls(pkg_resources.WorkingSet(paths)) + + def _search_distribution(self, name: str) -> Optional[BaseDistribution]: + """Find a distribution matching the ``name`` in the environment. + + This searches from *all* distributions available in the environment, to + match the behavior of ``pkg_resources.get_distribution()``. + """ + canonical_name = canonicalize_name(name) + for dist in self.iter_distributions(): + if dist.canonical_name == canonical_name: + return dist + return None + + def get_distribution(self, name: str) -> Optional[BaseDistribution]: + # Search the distribution by looking through the working set. + dist = self._search_distribution(name) + if dist: + return dist + + # If distribution could not be found, call working_set.require to + # update the working set, and try to find the distribution again. + # This might happen for e.g. when you install a package twice, once + # using setup.py develop and again using setup.py install. Now when + # running pip uninstall twice, the package gets removed from the + # working set in the first uninstall, so we have to populate the + # working set again so that pip knows about it and the packages gets + # picked up and is successfully uninstalled the second time too. + try: + # We didn't pass in any version specifiers, so this can never + # raise pkg_resources.VersionConflict. + self._ws.require(name) + except pkg_resources.DistributionNotFound: + return None + return self._search_distribution(name) + + def _iter_distributions(self) -> Iterator[BaseDistribution]: + for dist in self._ws: + yield Distribution(dist) diff --git a/lib/python3.11/site-packages/pip/_internal/models/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/models/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/models/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/models/candidate.py b/python/lib/python3.10/site-packages/pip/_internal/models/candidate.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/candidate.py rename to python/lib/python3.10/site-packages/pip/_internal/models/candidate.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/models/direct_url.py b/python/lib/python3.10/site-packages/pip/_internal/models/direct_url.py new file mode 100644 index 0000000..92060d4 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/models/direct_url.py @@ -0,0 +1,220 @@ +""" PEP 610 """ +import json +import re +import urllib.parse +from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union + +__all__ = [ + "DirectUrl", + "DirectUrlValidationError", + "DirInfo", + "ArchiveInfo", + "VcsInfo", +] + +T = TypeVar("T") + +DIRECT_URL_METADATA_NAME = "direct_url.json" +ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$") + + +class DirectUrlValidationError(Exception): + pass + + +def _get( + d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None +) -> Optional[T]: + """Get value from dictionary and verify expected type.""" + if key not in d: + return default + value = d[key] + if not isinstance(value, expected_type): + raise DirectUrlValidationError( + "{!r} has unexpected type for {} (expected {})".format( + value, key, expected_type + ) + ) + return value + + +def _get_required( + d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None +) -> T: + value = _get(d, expected_type, key, default) + if value is None: + raise DirectUrlValidationError(f"{key} must have a value") + return value + + +def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType": + infos = [info for info in infos if info is not None] + if not infos: + raise DirectUrlValidationError( + "missing one of archive_info, dir_info, vcs_info" + ) + if len(infos) > 1: + raise DirectUrlValidationError( + "more than one of archive_info, dir_info, vcs_info" + ) + assert infos[0] is not None + return infos[0] + + +def _filter_none(**kwargs: Any) -> Dict[str, Any]: + """Make dict excluding None values.""" + return {k: v for k, v in kwargs.items() if v is not None} + + +class VcsInfo: + name = "vcs_info" + + def __init__( + self, + vcs: str, + commit_id: str, + requested_revision: Optional[str] = None, + resolved_revision: Optional[str] = None, + resolved_revision_type: Optional[str] = None, + ) -> None: + self.vcs = vcs + self.requested_revision = requested_revision + self.commit_id = commit_id + self.resolved_revision = resolved_revision + self.resolved_revision_type = resolved_revision_type + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]: + if d is None: + return None + return cls( + vcs=_get_required(d, str, "vcs"), + commit_id=_get_required(d, str, "commit_id"), + requested_revision=_get(d, str, "requested_revision"), + resolved_revision=_get(d, str, "resolved_revision"), + resolved_revision_type=_get(d, str, "resolved_revision_type"), + ) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none( + vcs=self.vcs, + requested_revision=self.requested_revision, + commit_id=self.commit_id, + resolved_revision=self.resolved_revision, + resolved_revision_type=self.resolved_revision_type, + ) + + +class ArchiveInfo: + name = "archive_info" + + def __init__( + self, + hash: Optional[str] = None, + ) -> None: + self.hash = hash + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]: + if d is None: + return None + return cls(hash=_get(d, str, "hash")) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none(hash=self.hash) + + +class DirInfo: + name = "dir_info" + + def __init__( + self, + editable: bool = False, + ) -> None: + self.editable = editable + + @classmethod + def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]: + if d is None: + return None + return cls(editable=_get_required(d, bool, "editable", default=False)) + + def _to_dict(self) -> Dict[str, Any]: + return _filter_none(editable=self.editable or None) + + +InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] + + +class DirectUrl: + def __init__( + self, + url: str, + info: InfoType, + subdirectory: Optional[str] = None, + ) -> None: + self.url = url + self.info = info + self.subdirectory = subdirectory + + def _remove_auth_from_netloc(self, netloc: str) -> str: + if "@" not in netloc: + return netloc + user_pass, netloc_no_user_pass = netloc.split("@", 1) + if ( + isinstance(self.info, VcsInfo) + and self.info.vcs == "git" + and user_pass == "git" + ): + return netloc + if ENV_VAR_RE.match(user_pass): + return netloc + return netloc_no_user_pass + + @property + def redacted_url(self) -> str: + """url with user:password part removed unless it is formed with + environment variables as specified in PEP 610, or it is ``git`` + in the case of a git URL. + """ + purl = urllib.parse.urlsplit(self.url) + netloc = self._remove_auth_from_netloc(purl.netloc) + surl = urllib.parse.urlunsplit( + (purl.scheme, netloc, purl.path, purl.query, purl.fragment) + ) + return surl + + def validate(self) -> None: + self.from_dict(self.to_dict()) + + @classmethod + def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl": + return DirectUrl( + url=_get_required(d, str, "url"), + subdirectory=_get(d, str, "subdirectory"), + info=_exactly_one_of( + [ + ArchiveInfo._from_dict(_get(d, dict, "archive_info")), + DirInfo._from_dict(_get(d, dict, "dir_info")), + VcsInfo._from_dict(_get(d, dict, "vcs_info")), + ] + ), + ) + + def to_dict(self) -> Dict[str, Any]: + res = _filter_none( + url=self.redacted_url, + subdirectory=self.subdirectory, + ) + res[self.info.name] = self.info._to_dict() + return res + + @classmethod + def from_json(cls, s: str) -> "DirectUrl": + return cls.from_dict(json.loads(s)) + + def to_json(self) -> str: + return json.dumps(self.to_dict(), sort_keys=True) + + def is_local_editable(self) -> bool: + return isinstance(self.info, DirInfo) and self.info.editable diff --git a/lib/python3.11/site-packages/pip/_internal/models/format_control.py b/python/lib/python3.10/site-packages/pip/_internal/models/format_control.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/format_control.py rename to python/lib/python3.10/site-packages/pip/_internal/models/format_control.py diff --git a/lib/python3.11/site-packages/pip/_internal/models/index.py b/python/lib/python3.10/site-packages/pip/_internal/models/index.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/index.py rename to python/lib/python3.10/site-packages/pip/_internal/models/index.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/models/link.py b/python/lib/python3.10/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..6069b27 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/models/link.py @@ -0,0 +1,288 @@ +import functools +import logging +import os +import posixpath +import re +import urllib.parse +from typing import TYPE_CHECKING, Dict, List, NamedTuple, Optional, Tuple, Union + +from pip._internal.utils.filetypes import WHEEL_EXTENSION +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.misc import ( + redact_auth_from_url, + split_auth_from_netloc, + splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.urls import path_to_url, url_to_path + +if TYPE_CHECKING: + from pip._internal.index.collector import HTMLPage + +logger = logging.getLogger(__name__) + + +_SUPPORTED_HASHES = ("sha1", "sha224", "sha384", "sha256", "sha512", "md5") + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL""" + + __slots__ = [ + "_parsed_url", + "_url", + "comes_from", + "requires_python", + "yanked_reason", + "cache_link_parsing", + ] + + def __init__( + self, + url: str, + comes_from: Optional[Union[str, "HTMLPage"]] = None, + requires_python: Optional[str] = None, + yanked_reason: Optional[str] = None, + cache_link_parsing: bool = True, + ) -> None: + """ + :param url: url of the resource pointed to (href of the link) + :param comes_from: instance of HTMLPage where the link was found, + or string. + :param requires_python: String containing the `Requires-Python` + metadata field, specified in PEP 345. This may be specified by + a data-requires-python attribute in the HTML link tag, as + described in PEP 503. + :param yanked_reason: the reason the file has been yanked, if the + file has been yanked, or None if the file hasn't been yanked. + This is the value of the "data-yanked" attribute, if present, in + a simple repository HTML link. If the file has been yanked but + no reason was provided, this should be the empty string. See + PEP 592 for more information and the specification. + :param cache_link_parsing: A flag that is used elsewhere to determine + whether resources retrieved from this link + should be cached. PyPI index urls should + generally have this set to False, for + example. + """ + + # url can be a UNC windows share + if url.startswith("\\\\"): + url = path_to_url(url) + + self._parsed_url = urllib.parse.urlsplit(url) + # Store the url as a private attribute to prevent accidentally + # trying to set a new value. + self._url = url + + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + self.yanked_reason = yanked_reason + + super().__init__(key=url, defining_class=Link) + + self.cache_link_parsing = cache_link_parsing + + def __str__(self) -> str: + if self.requires_python: + rp = f" (requires-python:{self.requires_python})" + else: + rp = "" + if self.comes_from: + return "{} (from {}){}".format( + redact_auth_from_url(self._url), self.comes_from, rp + ) + else: + return redact_auth_from_url(str(self._url)) + + def __repr__(self) -> str: + return f"" + + @property + def url(self) -> str: + return self._url + + @property + def filename(self) -> str: + path = self.path.rstrip("/") + name = posixpath.basename(path) + if not name: + # Make sure we don't leak auth information if the netloc + # includes a username and password. + netloc, user_pass = split_auth_from_netloc(self.netloc) + return netloc + + name = urllib.parse.unquote(name) + assert name, f"URL {self._url!r} produced no filename" + return name + + @property + def file_path(self) -> str: + return url_to_path(self.url) + + @property + def scheme(self) -> str: + return self._parsed_url.scheme + + @property + def netloc(self) -> str: + """ + This can contain auth information. + """ + return self._parsed_url.netloc + + @property + def path(self) -> str: + return urllib.parse.unquote(self._parsed_url.path) + + def splitext(self) -> Tuple[str, str]: + return splitext(posixpath.basename(self.path.rstrip("/"))) + + @property + def ext(self) -> str: + return self.splitext()[1] + + @property + def url_without_fragment(self) -> str: + scheme, netloc, path, query, fragment = self._parsed_url + return urllib.parse.urlunsplit((scheme, netloc, path, query, "")) + + _egg_fragment_re = re.compile(r"[#&]egg=([^&]*)") + + @property + def egg_fragment(self) -> Optional[str]: + match = self._egg_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)") + + @property + def subdirectory_fragment(self) -> Optional[str]: + match = self._subdirectory_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r"({choices})=([a-f0-9]+)".format(choices="|".join(_SUPPORTED_HASHES)) + ) + + @property + def hash(self) -> Optional[str]: + match = self._hash_re.search(self._url) + if match: + return match.group(2) + return None + + @property + def hash_name(self) -> Optional[str]: + match = self._hash_re.search(self._url) + if match: + return match.group(1) + return None + + @property + def show_url(self) -> str: + return posixpath.basename(self._url.split("#", 1)[0].split("?", 1)[0]) + + @property + def is_file(self) -> bool: + return self.scheme == "file" + + def is_existing_dir(self) -> bool: + return self.is_file and os.path.isdir(self.file_path) + + @property + def is_wheel(self) -> bool: + return self.ext == WHEEL_EXTENSION + + @property + def is_vcs(self) -> bool: + from pip._internal.vcs import vcs + + return self.scheme in vcs.all_schemes + + @property + def is_yanked(self) -> bool: + return self.yanked_reason is not None + + @property + def has_hash(self) -> bool: + return self.hash_name is not None + + def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool: + """ + Return True if the link has a hash and it is allowed. + """ + if hashes is None or not self.has_hash: + return False + # Assert non-None so mypy knows self.hash_name and self.hash are str. + assert self.hash_name is not None + assert self.hash is not None + + return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) + + +class _CleanResult(NamedTuple): + """Convert link for equivalency check. + + This is used in the resolver to check whether two URL-specified requirements + likely point to the same distribution and can be considered equivalent. This + equivalency logic avoids comparing URLs literally, which can be too strict + (e.g. "a=1&b=2" vs "b=2&a=1") and produce conflicts unexpecting to users. + + Currently this does three things: + + 1. Drop the basic auth part. This is technically wrong since a server can + serve different content based on auth, but if it does that, it is even + impossible to guarantee two URLs without auth are equivalent, since + the user can input different auth information when prompted. So the + practical solution is to assume the auth doesn't affect the response. + 2. Parse the query to avoid the ordering issue. Note that ordering under the + same key in the query are NOT cleaned; i.e. "a=1&a=2" and "a=2&a=1" are + still considered different. + 3. Explicitly drop most of the fragment part, except ``subdirectory=`` and + hash values, since it should have no impact the downloaded content. Note + that this drops the "egg=" part historically used to denote the requested + project (and extras), which is wrong in the strictest sense, but too many + people are supplying it inconsistently to cause superfluous resolution + conflicts, so we choose to also ignore them. + """ + + parsed: urllib.parse.SplitResult + query: Dict[str, List[str]] + subdirectory: str + hashes: Dict[str, str] + + +def _clean_link(link: Link) -> _CleanResult: + parsed = link._parsed_url + netloc = parsed.netloc.rsplit("@", 1)[-1] + # According to RFC 8089, an empty host in file: means localhost. + if parsed.scheme == "file" and not netloc: + netloc = "localhost" + fragment = urllib.parse.parse_qs(parsed.fragment) + if "egg" in fragment: + logger.debug("Ignoring egg= fragment in %s", link) + try: + # If there are multiple subdirectory values, use the first one. + # This matches the behavior of Link.subdirectory_fragment. + subdirectory = fragment["subdirectory"][0] + except (IndexError, KeyError): + subdirectory = "" + # If there are multiple hash values under the same algorithm, use the + # first one. This matches the behavior of Link.hash_value. + hashes = {k: fragment[k][0] for k in _SUPPORTED_HASHES if k in fragment} + return _CleanResult( + parsed=parsed._replace(netloc=netloc, query="", fragment=""), + query=urllib.parse.parse_qs(parsed.query), + subdirectory=subdirectory, + hashes=hashes, + ) + + +@functools.lru_cache(maxsize=None) +def links_equivalent(link1: Link, link2: Link) -> bool: + return _clean_link(link1) == _clean_link(link2) diff --git a/lib/python3.11/site-packages/pip/_internal/models/scheme.py b/python/lib/python3.10/site-packages/pip/_internal/models/scheme.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/scheme.py rename to python/lib/python3.10/site-packages/pip/_internal/models/scheme.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/models/search_scope.py b/python/lib/python3.10/site-packages/pip/_internal/models/search_scope.py new file mode 100644 index 0000000..e4e54c2 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/models/search_scope.py @@ -0,0 +1,129 @@ +import itertools +import logging +import os +import posixpath +import urllib.parse +from typing import List + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import has_tls +from pip._internal.utils.misc import normalize_path, redact_auth_from_url + +logger = logging.getLogger(__name__) + + +class SearchScope: + + """ + Encapsulates the locations that pip is configured to search. + """ + + __slots__ = ["find_links", "index_urls"] + + @classmethod + def create( + cls, + find_links: List[str], + index_urls: List[str], + ) -> "SearchScope": + """ + Create a SearchScope object after normalizing the `find_links`. + """ + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + built_find_links: List[str] = [] + for link in find_links: + if link.startswith("~"): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + built_find_links.append(link) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not has_tls(): + for link in itertools.chain(index_urls, built_find_links): + parsed = urllib.parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + return cls( + find_links=built_find_links, + index_urls=index_urls, + ) + + def __init__( + self, + find_links: List[str], + index_urls: List[str], + ) -> None: + self.find_links = find_links + self.index_urls = index_urls + + def get_formatted_locations(self) -> str: + lines = [] + redacted_index_urls = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + for url in self.index_urls: + + redacted_index_url = redact_auth_from_url(url) + + # Parse the URL + purl = urllib.parse.urlsplit(redacted_index_url) + + # URL is generally invalid if scheme and netloc is missing + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not purl.scheme and not purl.netloc: + logger.warning( + 'The index url "%s" seems invalid, please provide a scheme.', + redacted_index_url, + ) + + redacted_index_urls.append(redacted_index_url) + + lines.append( + "Looking in indexes: {}".format(", ".join(redacted_index_urls)) + ) + + if self.find_links: + lines.append( + "Looking in links: {}".format( + ", ".join(redact_auth_from_url(url) for url in self.find_links) + ) + ) + return "\n".join(lines) + + def get_index_urls_locations(self, project_name: str) -> List[str]: + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url: str) -> str: + loc = posixpath.join( + url, urllib.parse.quote(canonicalize_name(project_name)) + ) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith("/"): + loc = loc + "/" + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py b/python/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py rename to python/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py diff --git a/lib/python3.11/site-packages/pip/_internal/models/target_python.py b/python/lib/python3.10/site-packages/pip/_internal/models/target_python.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/models/target_python.py rename to python/lib/python3.10/site-packages/pip/_internal/models/target_python.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/models/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/models/wheel.py new file mode 100644 index 0000000..aaf218d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/models/wheel.py @@ -0,0 +1,89 @@ +"""Represents a wheel file and provides access to the various parts of the +name that have meaning. +""" +import re +from typing import Dict, Iterable, List + +from pip._vendor.packaging.tags import Tag + +from pip._internal.exceptions import InvalidWheelFilename + + +class Wheel: + """A wheel file""" + + wheel_file_re = re.compile( + r"""^(?P(?P[^\s-]+?)-(?P[^\s-]*?)) + ((-(?P\d[^-]*?))?-(?P[^\s-]+?)-(?P[^\s-]+?)-(?P[^\s-]+?) + \.whl|\.dist-info)$""", + re.VERBOSE, + ) + + def __init__(self, filename: str) -> None: + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.") + self.filename = filename + self.name = wheel_info.group("name").replace("_", "-") + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group("ver").replace("_", "-") + self.build_tag = wheel_info.group("build") + self.pyversions = wheel_info.group("pyver").split(".") + self.abis = wheel_info.group("abi").split(".") + self.plats = wheel_info.group("plat").split(".") + + # All the tag combinations from this file + self.file_tags = { + Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats + } + + def get_formatted_file_tags(self) -> List[str]: + """Return the wheel's tags as a sorted list of strings.""" + return sorted(str(tag) for tag in self.file_tags) + + def support_index_min(self, tags: List[Tag]) -> int: + """Return the lowest index that one of the wheel's file_tag combinations + achieves in the given list of supported tags. + + For example, if there are 8 supported tags and one of the file tags + is first in the list, then return 0. + + :param tags: the PEP 425 tags to check the wheel against, in order + with most preferred first. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min(tags.index(tag) for tag in self.file_tags if tag in tags) + + def find_most_preferred_tag( + self, tags: List[Tag], tag_to_priority: Dict[Tag, int] + ) -> int: + """Return the priority of the most preferred tag that one of the wheel's file + tag combinations achieves in the given list of supported tags using the given + tag_to_priority mapping, where lower priorities are more-preferred. + + This is used in place of support_index_min in some cases in order to avoid + an expensive linear scan of a large list of tags. + + :param tags: the PEP 425 tags to check the wheel against. + :param tag_to_priority: a mapping from tag to priority of that tag, where + lower is more preferred. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min( + tag_to_priority[tag] for tag in self.file_tags if tag in tag_to_priority + ) + + def supported(self, tags: Iterable[Tag]) -> bool: + """Return whether the wheel is compatible with one of the given tags. + + :param tags: the PEP 425 tags to check the wheel against. + """ + return not self.file_tags.isdisjoint(tags) diff --git a/lib/python3.11/site-packages/pip/_internal/network/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/network/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/network/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/network/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/network/auth.py b/python/lib/python3.10/site-packages/pip/_internal/network/auth.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/network/auth.py rename to python/lib/python3.10/site-packages/pip/_internal/network/auth.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/network/cache.py b/python/lib/python3.10/site-packages/pip/_internal/network/cache.py new file mode 100644 index 0000000..9dba7ed --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/network/cache.py @@ -0,0 +1,69 @@ +"""HTTP cache implementation. +""" + +import os +from contextlib import contextmanager +from typing import Iterator, Optional + +from pip._vendor.cachecontrol.cache import BaseCache +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.requests.models import Response + +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ensure_dir + + +def is_from_cache(response: Response) -> bool: + return getattr(response, "from_cache", False) + + +@contextmanager +def suppressed_cache_errors() -> Iterator[None]: + """If we can't access the cache then we can just skip caching and process + requests as if caching wasn't enabled. + """ + try: + yield + except OSError: + pass + + +class SafeFileCache(BaseCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, directory: str) -> None: + assert directory is not None, "Cache directory must not be None." + super().__init__() + self.directory = directory + + def _get_cache_path(self, name: str) -> str: + # From cachecontrol.caches.file_cache.FileCache._fn, brought into our + # class for backwards-compatibility and to avoid using a non-public + # method. + hashed = FileCache.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key: str) -> Optional[bytes]: + path = self._get_cache_path(key) + with suppressed_cache_errors(): + with open(path, "rb") as f: + return f.read() + + def set(self, key: str, value: bytes, expires: Optional[int] = None) -> None: + path = self._get_cache_path(key) + with suppressed_cache_errors(): + ensure_dir(os.path.dirname(path)) + + with adjacent_tmp_file(path) as f: + f.write(value) + + replace(f.name, path) + + def delete(self, key: str) -> None: + path = self._get_cache_path(key) + with suppressed_cache_errors(): + os.remove(path) diff --git a/python/lib/python3.10/site-packages/pip/_internal/network/download.py b/python/lib/python3.10/site-packages/pip/_internal/network/download.py new file mode 100644 index 0000000..35bc970 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/network/download.py @@ -0,0 +1,185 @@ +"""Download files with progress indicators. +""" +import cgi +import logging +import mimetypes +import os +from typing import Iterable, Optional, Tuple + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.cli.progress_bars import get_download_progress_renderer +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.network.cache import is_from_cache +from pip._internal.network.session import PipSession +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks +from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext + +logger = logging.getLogger(__name__) + + +def _get_http_response_size(resp: Response) -> Optional[int]: + try: + return int(resp.headers["content-length"]) + except (ValueError, KeyError, TypeError): + return None + + +def _prepare_download( + resp: Response, + link: Link, + progress_bar: str, +) -> Iterable[bytes]: + total_length = _get_http_response_size(resp) + + if link.netloc == PyPI.file_storage_domain: + url = link.show_url + else: + url = link.url_without_fragment + + logged_url = redact_auth_from_url(url) + + if total_length: + logged_url = "{} ({})".format(logged_url, format_size(total_length)) + + if is_from_cache(resp): + logger.info("Using cached %s", logged_url) + else: + logger.info("Downloading %s", logged_url) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif is_from_cache(resp): + show_progress = False + elif not total_length: + show_progress = True + elif total_length > (40 * 1000): + show_progress = True + else: + show_progress = False + + chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + + if not show_progress: + return chunks + + renderer = get_download_progress_renderer(bar_type=progress_bar, size=total_length) + return renderer(chunks) + + +def sanitize_content_filename(filename: str) -> str: + """ + Sanitize the "filename" value from a Content-Disposition header. + """ + return os.path.basename(filename) + + +def parse_content_disposition(content_disposition: str, default_filename: str) -> str: + """ + Parse the "filename" value from a Content-Disposition header, and + return the default filename if the result is empty. + """ + _type, params = cgi.parse_header(content_disposition) + filename = params.get("filename") + if filename: + # We need to sanitize the filename to prevent directory traversal + # in case the filename contains ".." path parts. + filename = sanitize_content_filename(filename) + return filename or default_filename + + +def _get_http_response_filename(resp: Response, link: Link) -> str: + """Get an ideal filename from the given HTTP response, falling back to + the link filename if not provided. + """ + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get("content-disposition") + if content_disposition: + filename = parse_content_disposition(content_disposition, filename) + ext: Optional[str] = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(resp.headers.get("content-type", "")) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + return filename + + +def _http_get_download(session: PipSession, link: Link) -> Response: + target_url = link.url.split("#", 1)[0] + resp = session.get(target_url, headers=HEADERS, stream=True) + raise_for_status(resp) + return resp + + +class Downloader: + def __init__( + self, + session: PipSession, + progress_bar: str, + ) -> None: + self._session = session + self._progress_bar = progress_bar + + def __call__(self, link: Link, location: str) -> Tuple[str, str]: + """Download the file given by link into location.""" + try: + resp = _http_get_download(self._session, link) + except NetworkConnectionError as e: + assert e.response is not None + logger.critical( + "HTTP error %s while getting %s", e.response.status_code, link + ) + raise + + filename = _get_http_response_filename(resp, link) + filepath = os.path.join(location, filename) + + chunks = _prepare_download(resp, link, self._progress_bar) + with open(filepath, "wb") as content_file: + for chunk in chunks: + content_file.write(chunk) + content_type = resp.headers.get("Content-Type", "") + return filepath, content_type + + +class BatchDownloader: + def __init__( + self, + session: PipSession, + progress_bar: str, + ) -> None: + self._session = session + self._progress_bar = progress_bar + + def __call__( + self, links: Iterable[Link], location: str + ) -> Iterable[Tuple[Link, Tuple[str, str]]]: + """Download the files given by links into location.""" + for link in links: + try: + resp = _http_get_download(self._session, link) + except NetworkConnectionError as e: + assert e.response is not None + logger.critical( + "HTTP error %s while getting %s", + e.response.status_code, + link, + ) + raise + + filename = _get_http_response_filename(resp, link) + filepath = os.path.join(location, filename) + + chunks = _prepare_download(resp, link, self._progress_bar) + with open(filepath, "wb") as content_file: + for chunk in chunks: + content_file.write(chunk) + content_type = resp.headers.get("Content-Type", "") + yield link, (filepath, content_type) diff --git a/python/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py b/python/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py new file mode 100644 index 0000000..c9e44d5 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py @@ -0,0 +1,210 @@ +"""Lazy ZIP over HTTP""" + +__all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"] + +from bisect import bisect_left, bisect_right +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from typing import Any, Dict, Iterator, List, Optional, Tuple +from zipfile import BadZipfile, ZipFile + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.metadata import BaseDistribution, MemoryWheel, get_wheel_distribution +from pip._internal.network.session import PipSession +from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks + + +class HTTPRangeRequestUnsupported(Exception): + pass + + +def dist_from_wheel_url(name: str, url: str, session: PipSession) -> BaseDistribution: + """Return a distribution object from the given wheel URL. + + This uses HTTP range requests to only fetch the potion of the wheel + containing metadata, just enough for the object to be constructed. + If such requests are not supported, HTTPRangeRequestUnsupported + is raised. + """ + with LazyZipOverHTTP(url, session) as zf: + # For read-only ZIP files, ZipFile only needs methods read, + # seek, seekable and tell, not the whole IO protocol. + wheel = MemoryWheel(zf.name, zf) # type: ignore + # After context manager exit, wheel.name + # is an invalid file by intention. + return get_wheel_distribution(wheel, canonicalize_name(name)) + + +class LazyZipOverHTTP: + """File-like object mapped to a ZIP file over HTTP. + + This uses HTTP range requests to lazily fetch the file's content, + which is supposed to be fed to ZipFile. If such requests are not + supported by the server, raise HTTPRangeRequestUnsupported + during initialization. + """ + + def __init__( + self, url: str, session: PipSession, chunk_size: int = CONTENT_CHUNK_SIZE + ) -> None: + head = session.head(url, headers=HEADERS) + raise_for_status(head) + assert head.status_code == 200 + self._session, self._url, self._chunk_size = session, url, chunk_size + self._length = int(head.headers["Content-Length"]) + self._file = NamedTemporaryFile() + self.truncate(self._length) + self._left: List[int] = [] + self._right: List[int] = [] + if "bytes" not in head.headers.get("Accept-Ranges", "none"): + raise HTTPRangeRequestUnsupported("range request is not supported") + self._check_zip() + + @property + def mode(self) -> str: + """Opening mode, which is always rb.""" + return "rb" + + @property + def name(self) -> str: + """Path to the underlying file.""" + return self._file.name + + def seekable(self) -> bool: + """Return whether random access is supported, which is True.""" + return True + + def close(self) -> None: + """Close the file.""" + self._file.close() + + @property + def closed(self) -> bool: + """Whether the file is closed.""" + return self._file.closed + + def read(self, size: int = -1) -> bytes: + """Read up to size bytes from the object and return them. + + As a convenience, if size is unspecified or -1, + all bytes until EOF are returned. Fewer than + size bytes may be returned if EOF is reached. + """ + download_size = max(size, self._chunk_size) + start, length = self.tell(), self._length + stop = length if size < 0 else min(start + download_size, length) + start = max(0, stop - download_size) + self._download(start, stop - 1) + return self._file.read(size) + + def readable(self) -> bool: + """Return whether the file is readable, which is True.""" + return True + + def seek(self, offset: int, whence: int = 0) -> int: + """Change stream position and return the new absolute position. + + Seek to offset relative position indicated by whence: + * 0: Start of stream (the default). pos should be >= 0; + * 1: Current position - pos may be negative; + * 2: End of stream - pos usually negative. + """ + return self._file.seek(offset, whence) + + def tell(self) -> int: + """Return the current position.""" + return self._file.tell() + + def truncate(self, size: Optional[int] = None) -> int: + """Resize the stream to the given size in bytes. + + If size is unspecified resize to the current position. + The current stream position isn't changed. + + Return the new file size. + """ + return self._file.truncate(size) + + def writable(self) -> bool: + """Return False.""" + return False + + def __enter__(self) -> "LazyZipOverHTTP": + self._file.__enter__() + return self + + def __exit__(self, *exc: Any) -> Optional[bool]: + return self._file.__exit__(*exc) + + @contextmanager + def _stay(self) -> Iterator[None]: + """Return a context manager keeping the position. + + At the end of the block, seek back to original position. + """ + pos = self.tell() + try: + yield + finally: + self.seek(pos) + + def _check_zip(self) -> None: + """Check and download until the file is a valid ZIP.""" + end = self._length - 1 + for start in reversed(range(0, end, self._chunk_size)): + self._download(start, end) + with self._stay(): + try: + # For read-only ZIP files, ZipFile only needs + # methods read, seek, seekable and tell. + ZipFile(self) # type: ignore + except BadZipfile: + pass + else: + break + + def _stream_response( + self, start: int, end: int, base_headers: Dict[str, str] = HEADERS + ) -> Response: + """Return HTTP response to a range request from start to end.""" + headers = base_headers.copy() + headers["Range"] = f"bytes={start}-{end}" + # TODO: Get range requests to be correctly cached + headers["Cache-Control"] = "no-cache" + return self._session.get(self._url, headers=headers, stream=True) + + def _merge( + self, start: int, end: int, left: int, right: int + ) -> Iterator[Tuple[int, int]]: + """Return an iterator of intervals to be fetched. + + Args: + start (int): Start of needed interval + end (int): End of needed interval + left (int): Index of first overlapping downloaded data + right (int): Index after last overlapping downloaded data + """ + lslice, rslice = self._left[left:right], self._right[left:right] + i = start = min([start] + lslice[:1]) + end = max([end] + rslice[-1:]) + for j, k in zip(lslice, rslice): + if j > i: + yield i, j - 1 + i = k + 1 + if i <= end: + yield i, end + self._left[left:right], self._right[left:right] = [start], [end] + + def _download(self, start: int, end: int) -> None: + """Download bytes from start to end inclusively.""" + with self._stay(): + left = bisect_left(self._right, start) + right = bisect_right(self._left, end) + for start, end in self._merge(start, end, left, right): + response = self._stream_response(start, end) + response.raise_for_status() + self.seek(start) + for chunk in response_chunks(response, self._chunk_size): + self._file.write(chunk) diff --git a/python/lib/python3.10/site-packages/pip/_internal/network/session.py b/python/lib/python3.10/site-packages/pip/_internal/network/session.py new file mode 100644 index 0000000..cbe743b --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/network/session.py @@ -0,0 +1,454 @@ +"""PipSession and supporting code, containing all pip-specific +network request configuration and behavior. +""" + +import email.utils +import io +import ipaddress +import json +import logging +import mimetypes +import os +import platform +import shutil +import subprocess +import sys +import urllib.parse +import warnings +from typing import Any, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Union + +from pip._vendor import requests, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.models import PreparedRequest, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.urllib3.connectionpool import ConnectionPool +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +from pip import __version__ +from pip._internal.metadata import get_default_environment +from pip._internal.models.link import Link +from pip._internal.network.auth import MultiDomainBasicAuth +from pip._internal.network.cache import SafeFileCache + +# Import ssl from compat so the initial import occurs in only one place. +from pip._internal.utils.compat import has_tls +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.misc import build_url_from_netloc, parse_netloc +from pip._internal.utils.urls import url_to_path + +logger = logging.getLogger(__name__) + +SecureOrigin = Tuple[str, str, Optional[Union[int, str]]] + + +# Ignore warning raised when using --trusted-host. +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +SECURE_ORIGINS: List[SecureOrigin] = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] + + +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + "BUILD_BUILDID", + # Jenkins + "BUILD_ID", + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + "CI", + # Explicit environment variable. + "PIP_IS_CI", +) + + +def looks_like_ci() -> bool: + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent() -> str: + """ + Return a string representing the user agent. + """ + data: Dict[str, Any] = { + "installer": {"name": "pip", "version": __version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == "CPython": + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == "PyPy": + pypy_version_info = sys.pypy_version_info # type: ignore + if pypy_version_info.releaselevel == "final": + pypy_version_info = pypy_version_info[:3] + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == "Jython": + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == "IronPython": + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + + linux_distribution = distro.name(), distro.version(), distro.codename() + distro_infos: Dict[str, Any] = dict( + filter( + lambda x: x[1], + zip(["name", "version", "id"], linux_distribution), + ) + ) + libc = dict( + filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + ) + ) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if has_tls(): + import _ssl as ssl + + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_dist = get_default_environment().get_distribution("setuptools") + if setuptools_dist is not None: + data["setuptools_version"] = str(setuptools_dist.version) + + if shutil.which("rustc") is not None: + # If for any reason `rustc --version` fails, silently ignore it + try: + rustc_output = subprocess.check_output( + ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5 + ) + except Exception: + pass + else: + if rustc_output.startswith(b"rustc "): + # The format of `rustc --version` is: + # `b'rustc 1.52.1 (9bc8c42bb 2021-05-09)\n'` + # We extract just the middle (1.52.1) part + data["rustc_version"] = rustc_output.split(b" ")[1].decode() + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class LocalFSAdapter(BaseAdapter): + def send( + self, + request: PreparedRequest, + stream: bool = False, + timeout: Optional[Union[float, Tuple[float, float]]] = None, + verify: Union[bool, str] = True, + cert: Optional[Union[str, Tuple[str, str]]] = None, + proxies: Optional[Mapping[str, str]] = None, + ) -> Response: + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + # format the exception raised as a io.BytesIO object, + # to return a better error message: + resp.status_code = 404 + resp.reason = type(exc).__name__ + resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8")) + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict( + { + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + } + ) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self) -> None: + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + def cert_verify( + self, + conn: ConnectionPool, + url: str, + verify: Union[bool, str], + cert: Optional[Union[str, Tuple[str, str]]], + ) -> None: + super().cert_verify(conn=conn, url=url, verify=False, cert=cert) + + +class InsecureCacheControlAdapter(CacheControlAdapter): + def cert_verify( + self, + conn: ConnectionPool, + url: str, + verify: Union[bool, str], + cert: Optional[Union[str, Tuple[str, str]]], + ) -> None: + super().cert_verify(conn=conn, url=url, verify=False, cert=cert) + + +class PipSession(requests.Session): + + timeout: Optional[int] = None + + def __init__( + self, + *args: Any, + retries: int = 0, + cache: Optional[str] = None, + trusted_hosts: Sequence[str] = (), + index_urls: Optional[List[str]] = None, + **kwargs: Any, + ) -> None: + """ + :param trusted_hosts: Domains not to emit warnings for when not using + HTTPS. + """ + super().__init__(*args, **kwargs) + + # Namespace the attribute with "pip_" just in case to prevent + # possible conflicts with the base class. + self.pip_trusted_origins: List[Tuple[str, Optional[int]]] = [] + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth(index_urls=index_urls) + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) # type: ignore + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching so we'll use it for all http:// URLs. + # If caching is disabled, we will also use it for + # https:// hosts that we've marked as ignoring + # TLS errors for (trusted-hosts). + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + # We want to _only_ cache responses on securely fetched origins or when + # the host is specified as trusted. We do this because + # we can't validate the response of an insecurely/untrusted fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + self._trusted_host_adapter = InsecureCacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + self._trusted_host_adapter = insecure_adapter + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + for host in trusted_hosts: + self.add_trusted_host(host, suppress_logging=True) + + def update_index_urls(self, new_index_urls: List[str]) -> None: + """ + :param new_index_urls: New index urls to update the authentication + handler with. + """ + self.auth.index_urls = new_index_urls + + def add_trusted_host( + self, host: str, source: Optional[str] = None, suppress_logging: bool = False + ) -> None: + """ + :param host: It is okay to provide a host that has previously been + added. + :param source: An optional source string, for logging where the host + string came from. + """ + if not suppress_logging: + msg = f"adding trusted host: {host!r}" + if source is not None: + msg += f" (from {source})" + logger.info(msg) + + host_port = parse_netloc(host) + if host_port not in self.pip_trusted_origins: + self.pip_trusted_origins.append(host_port) + + self.mount( + build_url_from_netloc(host, scheme="http") + "/", self._trusted_host_adapter + ) + self.mount(build_url_from_netloc(host) + "/", self._trusted_host_adapter) + if not host_port[1]: + self.mount( + build_url_from_netloc(host, scheme="http") + ":", + self._trusted_host_adapter, + ) + # Mount wildcard ports for the same host. + self.mount(build_url_from_netloc(host) + ":", self._trusted_host_adapter) + + def iter_secure_origins(self) -> Iterator[SecureOrigin]: + yield from SECURE_ORIGINS + for host, port in self.pip_trusted_origins: + yield ("*", host, "*" if port is None else port) + + def is_secure_origin(self, location: Link) -> bool: + # Determine if this url used a secure transport mechanism + parsed = urllib.parse.urlparse(str(location)) + origin_protocol, origin_host, origin_port = ( + parsed.scheme, + parsed.hostname, + parsed.port, + ) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + origin_protocol = origin_protocol.rsplit("+", 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in self.iter_secure_origins(): + secure_protocol, secure_host, secure_port = secure_origin + if origin_protocol != secure_protocol and secure_protocol != "*": + continue + + try: + addr = ipaddress.ip_address(origin_host) + network = ipaddress.ip_network(secure_host) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if ( + origin_host + and origin_host.lower() != secure_host.lower() + and secure_host != "*" + ): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port matches. + if ( + origin_port != secure_port + and secure_port != "*" + and secure_port is not None + ): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + origin_host, + origin_host, + ) + + return False + + def request(self, method: str, url: str, *args: Any, **kwargs: Any) -> Response: + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super().request(method, url, *args, **kwargs) diff --git a/python/lib/python3.10/site-packages/pip/_internal/network/utils.py b/python/lib/python3.10/site-packages/pip/_internal/network/utils.py new file mode 100644 index 0000000..094cf1b --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/network/utils.py @@ -0,0 +1,96 @@ +from typing import Dict, Iterator + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response + +from pip._internal.exceptions import NetworkConnectionError + +# The following comments and HTTP headers were originally added by +# Donald Stufft in git commit 22c562429a61bb77172039e480873fb239dd8c03. +# +# We use Accept-Encoding: identity here because requests defaults to +# accepting compressed responses. This breaks in a variety of ways +# depending on how the server is configured. +# - Some servers will notice that the file isn't a compressible file +# and will leave the file alone and with an empty Content-Encoding +# - Some servers will notice that the file is already compressed and +# will leave the file alone, adding a Content-Encoding: gzip header +# - Some servers won't notice anything at all and will take a file +# that's already been compressed and compress it again, and set +# the Content-Encoding: gzip header +# By setting this to request only the identity encoding we're hoping +# to eliminate the third case. Hopefully there does not exist a server +# which when given a file will notice it is already compressed and that +# you're not asking for a compressed file and will then decompress it +# before sending because if that's the case I don't think it'll ever be +# possible to make this work. +HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"} + + +def raise_for_status(resp: Response) -> None: + http_error_msg = "" + if isinstance(resp.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. + try: + reason = resp.reason.decode("utf-8") + except UnicodeDecodeError: + reason = resp.reason.decode("iso-8859-1") + else: + reason = resp.reason + + if 400 <= resp.status_code < 500: + http_error_msg = ( + f"{resp.status_code} Client Error: {reason} for url: {resp.url}" + ) + + elif 500 <= resp.status_code < 600: + http_error_msg = ( + f"{resp.status_code} Server Error: {reason} for url: {resp.url}" + ) + + if http_error_msg: + raise NetworkConnectionError(http_error_msg, response=resp) + + +def response_chunks( + response: Response, chunk_size: int = CONTENT_CHUNK_SIZE +) -> Iterator[bytes]: + """Given a requests Response, provide the data chunks.""" + try: + # Special case for urllib3. + for chunk in response.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False, + ): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = response.raw.read(chunk_size) + if not chunk: + break + yield chunk diff --git a/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py b/python/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py rename to python/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/operations/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py b/python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/check.py b/python/lib/python3.10/site-packages/pip/_internal/operations/check.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/check.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/check.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/operations/freeze.py b/python/lib/python3.10/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..4565540 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,254 @@ +import collections +import logging +import os +from typing import Container, Dict, Iterable, Iterator, List, NamedTuple, Optional, Set + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.metadata import BaseDistribution, get_environment +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.direct_url_helpers import direct_url_as_pep440_direct_reference + +logger = logging.getLogger(__name__) + + +class _EditableInfo(NamedTuple): + requirement: str + comments: List[str] + + +def freeze( + requirement: Optional[List[str]] = None, + local_only: bool = False, + user_only: bool = False, + paths: Optional[List[str]] = None, + isolated: bool = False, + exclude_editable: bool = False, + skip: Container[str] = (), +) -> Iterator[str]: + installations: Dict[str, FrozenRequirement] = {} + + dists = get_environment(paths).iter_installed_distributions( + local_only=local_only, + skip=(), + user_only=user_only, + ) + for dist in dists: + req = FrozenRequirement.from_dist(dist) + if exclude_editable and req.editable: + continue + installations[req.canonical_name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options: Set[str] = set() + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files: Dict[str, List[str]] = collections.defaultdict(list) + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if ( + not line.strip() + or line.strip().startswith("#") + or line.startswith( + ( + "-r", + "--requirement", + "-f", + "--find-links", + "-i", + "--index-url", + "--pre", + "--trusted-host", + "--process-dependency-links", + "--extra-index-url", + "--use-feature", + ) + ) + ): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith("-e") or line.startswith("--editable"): + if line.startswith("-e"): + line = line[2:].strip() + else: + line = line[len("--editable") :].strip().lstrip("=") + line_req = install_req_from_editable( + line, + isolated=isolated, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub("", line).strip(), + isolated=isolated, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, + line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + else: + line_req_canonical_name = canonicalize_name(line_req.name) + if line_req_canonical_name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub("", line).strip(), + line_req.name, + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req_canonical_name]).rstrip() + del installations[line_req_canonical_name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in req_files.items(): + if len(files) > 1: + logger.warning( + "Requirement %s included multiple times [%s]", + name, + ", ".join(sorted(set(files))), + ) + + yield ("## The following requirements were added by pip freeze:") + for installation in sorted(installations.values(), key=lambda x: x.name.lower()): + if installation.canonical_name not in skip: + yield str(installation).rstrip() + + +def _format_as_name_version(dist: BaseDistribution) -> str: + if isinstance(dist.version, Version): + return f"{dist.raw_name}=={dist.version}" + return f"{dist.raw_name}==={dist.version}" + + +def _get_editable_info(dist: BaseDistribution) -> _EditableInfo: + """ + Compute and return values (req, comments) for use in + FrozenRequirement.from_dist(). + """ + editable_project_location = dist.editable_project_location + assert editable_project_location + location = os.path.normcase(os.path.abspath(editable_project_location)) + + from pip._internal.vcs import RemoteNotFoundError, RemoteNotValidError, vcs + + vcs_backend = vcs.get_backend_for_dir(location) + + if vcs_backend is None: + display = _format_as_name_version(dist) + logger.debug( + 'No VCS found for editable requirement "%s" in: %r', + display, + location, + ) + return _EditableInfo( + requirement=location, + comments=[f"# Editable install with no version control ({display})"], + ) + + vcs_name = type(vcs_backend).__name__ + + try: + req = vcs_backend.get_src_requirement(location, dist.raw_name) + except RemoteNotFoundError: + display = _format_as_name_version(dist) + return _EditableInfo( + requirement=location, + comments=[f"# Editable {vcs_name} install with no remote ({display})"], + ) + except RemoteNotValidError as ex: + display = _format_as_name_version(dist) + return _EditableInfo( + requirement=location, + comments=[ + f"# Editable {vcs_name} install ({display}) with either a deleted " + f"local remote or invalid URI:", + f"# '{ex.url}'", + ], + ) + except BadCommand: + logger.warning( + "cannot determine version of editable source in %s " + "(%s command not found in path)", + location, + vcs_backend.name, + ) + return _EditableInfo(requirement=location, comments=[]) + except InstallationError as exc: + logger.warning("Error when trying to get requirement for VCS system %s", exc) + else: + return _EditableInfo(requirement=req, comments=[]) + + logger.warning("Could not determine repository location of %s", location) + + return _EditableInfo( + requirement=location, + comments=["## !! Could not determine repository location"], + ) + + +class FrozenRequirement: + def __init__( + self, + name: str, + req: str, + editable: bool, + comments: Iterable[str] = (), + ) -> None: + self.name = name + self.canonical_name = canonicalize_name(name) + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist: BaseDistribution) -> "FrozenRequirement": + editable = dist.editable + if editable: + req, comments = _get_editable_info(dist) + else: + comments = [] + direct_url = dist.direct_url + if direct_url: + # if PEP 610 metadata is present, use it + req = direct_url_as_pep440_direct_reference(direct_url, dist.raw_name) + else: + # name==version requirement + req = _format_as_name_version(dist) + + return cls(dist.raw_name, req, editable, comments=comments) + + def __str__(self) -> str: + req = self.req + if self.editable: + req = f"-e {req}" + return "\n".join(list(self.comments) + [str(req)]) + "\n" diff --git a/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py b/python/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py rename to python/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py b/python/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py new file mode 100644 index 0000000..5b7ef90 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py @@ -0,0 +1,120 @@ +"""Legacy installation process, i.e. `setup.py install`. +""" + +import logging +import os +from distutils.util import change_root +from typing import List, Optional, Sequence + +from pip._internal.build_env import BuildEnvironment +from pip._internal.exceptions import InstallationError, LegacyInstallFailure +from pip._internal.models.scheme import Scheme +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.setuptools_build import make_setuptools_install_args +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +def write_installed_files_from_setuptools_record( + record_lines: List[str], + root: Optional[str], + req_description: str, +) -> None: + def prepend_root(path: str) -> str: + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + for line in record_lines: + directory = os.path.dirname(line) + if directory.endswith(".egg-info"): + egg_info_dir = prepend_root(directory) + break + else: + message = ( + "{} did not indicate that it installed an " + ".egg-info directory. Only setup.py projects " + "generating .egg-info directories are supported." + ).format(req_description) + raise InstallationError(message) + + new_lines = [] + for line in record_lines: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append(os.path.relpath(prepend_root(filename), egg_info_dir)) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, "installed-files.txt") + with open(inst_files_path, "w") as f: + f.write("\n".join(new_lines) + "\n") + + +def install( + install_options: List[str], + global_options: Sequence[str], + root: Optional[str], + home: Optional[str], + prefix: Optional[str], + use_user_site: bool, + pycompile: bool, + scheme: Scheme, + setup_py_path: str, + isolated: bool, + req_name: str, + build_env: BuildEnvironment, + unpacked_source_directory: str, + req_description: str, +) -> bool: + + header_dir = scheme.headers + + with TempDirectory(kind="record") as temp_dir: + try: + record_filename = os.path.join(temp_dir.path, "install-record.txt") + install_args = make_setuptools_install_args( + setup_py_path, + global_options=global_options, + install_options=install_options, + record_filename=record_filename, + root=root, + prefix=prefix, + header_dir=header_dir, + home=home, + use_user_site=use_user_site, + no_user_config=isolated, + pycompile=pycompile, + ) + + runner = runner_with_spinner_message( + f"Running setup.py install for {req_name}" + ) + with build_env: + runner( + cmd=install_args, + cwd=unpacked_source_directory, + ) + + if not os.path.exists(record_filename): + logger.debug("Record file %s not found", record_filename) + # Signal to the caller that we didn't install the new package + return False + + except Exception as e: + # Signal to the caller that we didn't install the new package + raise LegacyInstallFailure(package_details=req_name) from e + + # At this point, we have successfully installed the requirement. + + # We intentionally do not use any encoding to read the file because + # setuptools writes the file using distutils.file_util.write_file, + # which does not specify an encoding. + with open(record_filename) as f: + record_lines = f.read().splitlines() + + write_installed_files_from_setuptools_record(record_lines, root, req_description) + return True diff --git a/python/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py new file mode 100644 index 0000000..e191b13 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py @@ -0,0 +1,738 @@ +"""Support for installing and building the "wheel" binary package format. +""" + +import collections +import compileall +import contextlib +import csv +import importlib +import logging +import os.path +import re +import shutil +import sys +import warnings +from base64 import urlsafe_b64encode +from email.message import Message +from itertools import chain, filterfalse, starmap +from typing import ( + IO, + TYPE_CHECKING, + Any, + BinaryIO, + Callable, + Dict, + Iterable, + Iterator, + List, + NewType, + Optional, + Sequence, + Set, + Tuple, + Union, + cast, +) +from zipfile import ZipFile, ZipInfo + +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.distlib.util import get_export_entry +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_major_minor_version +from pip._internal.metadata import ( + BaseDistribution, + FilesystemWheel, + get_wheel_distribution, +) +from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl +from pip._internal.models.scheme import SCHEME_KEYS, Scheme +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition +from pip._internal.utils.unpacking import ( + current_umask, + is_within_directory, + set_extracted_file_to_default_mode_plus_executable, + zip_item_is_executable, +) +from pip._internal.utils.wheel import parse_wheel + +if TYPE_CHECKING: + from typing import Protocol + + class File(Protocol): + src_record_path: "RecordPath" + dest_path: str + changed: bool + + def save(self) -> None: + pass + + +logger = logging.getLogger(__name__) + +RecordPath = NewType("RecordPath", str) +InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]] + + +def rehash(path: str, blocksize: int = 1 << 20) -> Tuple[str, str]: + """Return (encoded_digest, length) for path using hashlib.sha256()""" + h, length = hash_file(path, blocksize) + digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=") + return (digest, str(length)) + + +def csv_io_kwargs(mode: str) -> Dict[str, Any]: + """Return keyword arguments to properly open a CSV file + in the given mode. + """ + return {"mode": mode, "newline": "", "encoding": "utf-8"} + + +def fix_script(path: str) -> bool: + """Replace #!python with #!/path/to/python + Return True if file was changed. + """ + # XXX RECORD hashes will need to be updated + assert os.path.isfile(path) + + with open(path, "rb") as script: + firstline = script.readline() + if not firstline.startswith(b"#!python"): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b"#!" + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, "wb") as script: + script.write(firstline) + script.write(rest) + return True + + +def wheel_root_is_purelib(metadata: Message) -> bool: + return metadata.get("Root-Is-Purelib", "").lower() == "true" + + +def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, str]]: + console_scripts = {} + gui_scripts = {} + for entry_point in dist.iter_entry_points(): + if entry_point.group == "console_scripts": + console_scripts[entry_point.name] = entry_point.value + elif entry_point.group == "gui_scripts": + gui_scripts[entry_point.name] = entry_point.value + return console_scripts, gui_scripts + + +def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]: + """Determine if any scripts are not on PATH and format a warning. + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir: Dict[str, Set[str]] = collections.defaultdict(set) + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) + for i in os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for: Dict[str, Set[str]] = { + parent_dir: scripts + for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, dir_scripts in warn_for.items(): + sorted_scripts: List[str] = sorted(dir_scripts) + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH.".format( + start_text, parent_dir + ) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Add a note if any directory starts with ~ + warn_for_tilde = any( + i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i + ) + if warn_for_tilde: + tilde_warning_msg = ( + "NOTE: The current PATH contains path(s) starting with `~`, " + "which may not be expanded by all applications." + ) + msg_lines.append(tilde_warning_msg) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def _normalized_outrows( + outrows: Iterable[InstalledCSVRow], +) -> List[Tuple[str, str, str]]: + """Normalize the given rows of a RECORD file. + + Items in each row are converted into str. Rows are then sorted to make + the value more predictable for tests. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted( + (record_path, hash_, str(size)) for record_path, hash_, size in outrows + ) + + +def _record_to_fs_path(record_path: RecordPath) -> str: + return record_path + + +def _fs_to_record_path(path: str, relative_to: Optional[str] = None) -> RecordPath: + if relative_to is not None: + # On Windows, do not handle relative paths if they belong to different + # logical disks + if ( + os.path.splitdrive(path)[0].lower() + == os.path.splitdrive(relative_to)[0].lower() + ): + path = os.path.relpath(path, relative_to) + path = path.replace(os.path.sep, "/") + return cast("RecordPath", path) + + +def get_csv_rows_for_installed( + old_csv_rows: List[List[str]], + installed: Dict[RecordPath, RecordPath], + changed: Set[RecordPath], + generated: List[str], + lib_dir: str, +) -> List[InstalledCSVRow]: + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows: List[InstalledCSVRow] = [] + for row in old_csv_rows: + if len(row) > 3: + logger.warning("RECORD line has more than three elements: %s", row) + old_record_path = cast("RecordPath", row[0]) + new_record_path = installed.pop(old_record_path, old_record_path) + if new_record_path in changed: + digest, length = rehash(_record_to_fs_path(new_record_path)) + else: + digest = row[1] if len(row) > 1 else "" + length = row[2] if len(row) > 2 else "" + installed_rows.append((new_record_path, digest, length)) + for f in generated: + path = _fs_to_record_path(f, lib_dir) + digest, length = rehash(f) + installed_rows.append((path, digest, length)) + for installed_record_path in installed.values(): + installed_rows.append((installed_record_path, "", "")) + return installed_rows + + +def get_console_script_specs(console: Dict[str, str]) -> List[str]: + """ + Given the mapping from entrypoint name to callable, return the relevant + console script specs. + """ + # Don't mutate caller's version + console = console.copy() + + scripts_to_generate = [] + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop("pip", None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append("pip = " + pip_script) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + scripts_to_generate.append( + "pip{} = {}".format(sys.version_info[0], pip_script) + ) + + scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}") + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r"pip(\d(\.\d)?)?$", k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop("easy_install", None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append("easy_install = " + easy_install_script) + + scripts_to_generate.append( + "easy_install-{} = {}".format( + get_major_minor_version(), easy_install_script + ) + ) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r"easy_install(-\d\.\d)?$", k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console entry points specified in the wheel + scripts_to_generate.extend(starmap("{} = {}".format, console.items())) + + return scripts_to_generate + + +class ZipBackedFile: + def __init__( + self, src_record_path: RecordPath, dest_path: str, zip_file: ZipFile + ) -> None: + self.src_record_path = src_record_path + self.dest_path = dest_path + self._zip_file = zip_file + self.changed = False + + def _getinfo(self) -> ZipInfo: + return self._zip_file.getinfo(self.src_record_path) + + def save(self) -> None: + # directory creation is lazy and after file filtering + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + parent_dir = os.path.dirname(self.dest_path) + ensure_dir(parent_dir) + + # When we open the output file below, any existing file is truncated + # before we start writing the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(self.dest_path): + os.unlink(self.dest_path) + + zipinfo = self._getinfo() + + with self._zip_file.open(zipinfo) as f: + with open(self.dest_path, "wb") as dest: + shutil.copyfileobj(f, dest) + + if zip_item_is_executable(zipinfo): + set_extracted_file_to_default_mode_plus_executable(self.dest_path) + + +class ScriptFile: + def __init__(self, file: "File") -> None: + self._file = file + self.src_record_path = self._file.src_record_path + self.dest_path = self._file.dest_path + self.changed = False + + def save(self) -> None: + self._file.save() + self.changed = fix_script(self.dest_path) + + +class MissingCallableSuffix(InstallationError): + def __init__(self, entry_point: str) -> None: + super().__init__( + "Invalid script entry point: {} - A callable " + "suffix is required. Cf https://packaging.python.org/" + "specifications/entry-points/#use-for-scripts for more " + "information.".format(entry_point) + ) + + +def _raise_for_invalid_entrypoint(specification: str) -> None: + entry = get_export_entry(specification) + if entry is not None and entry.suffix is None: + raise MissingCallableSuffix(str(entry)) + + +class PipScriptMaker(ScriptMaker): + def make(self, specification: str, options: Dict[str, Any] = None) -> List[str]: + _raise_for_invalid_entrypoint(specification) + return super().make(specification, options) + + +def _install_wheel( + name: str, + wheel_zip: ZipFile, + wheel_path: str, + scheme: Scheme, + pycompile: bool = True, + warn_script_location: bool = True, + direct_url: Optional[DirectUrl] = None, + requested: bool = False, +) -> None: + """Install a wheel. + + :param name: Name of the project to install + :param wheel_zip: open ZipFile for wheel being installed + :param scheme: Distutils scheme dictating the install directories + :param req_description: String used in place of the requirement, for + logging + :param pycompile: Whether to byte-compile installed Python files + :param warn_script_location: Whether to check that scripts are installed + into a directory on PATH + :raises UnsupportedWheel: + * when the directory holds an unpacked wheel with incompatible + Wheel-Version + * when the .dist-info dir does not match the wheel + """ + info_dir, metadata = parse_wheel(wheel_zip, name) + + if wheel_root_is_purelib(metadata): + lib_dir = scheme.purelib + else: + lib_dir = scheme.platlib + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed: Dict[RecordPath, RecordPath] = {} + changed: Set[RecordPath] = set() + generated: List[str] = [] + + def record_installed( + srcfile: RecordPath, destfile: str, modified: bool = False + ) -> None: + """Map archive RECORD paths to installation RECORD paths.""" + newpath = _fs_to_record_path(destfile, lib_dir) + installed[srcfile] = newpath + if modified: + changed.add(_fs_to_record_path(destfile)) + + def is_dir_path(path: RecordPath) -> bool: + return path.endswith("/") + + def assert_no_path_traversal(dest_dir_path: str, target_path: str) -> None: + if not is_within_directory(dest_dir_path, target_path): + message = ( + "The wheel {!r} has a file {!r} trying to install" + " outside the target directory {!r}" + ) + raise InstallationError( + message.format(wheel_path, target_path, dest_dir_path) + ) + + def root_scheme_file_maker( + zip_file: ZipFile, dest: str + ) -> Callable[[RecordPath], "File"]: + def make_root_scheme_file(record_path: RecordPath) -> "File": + normed_path = os.path.normpath(record_path) + dest_path = os.path.join(dest, normed_path) + assert_no_path_traversal(dest, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_root_scheme_file + + def data_scheme_file_maker( + zip_file: ZipFile, scheme: Scheme + ) -> Callable[[RecordPath], "File"]: + scheme_paths = {key: getattr(scheme, key) for key in SCHEME_KEYS} + + def make_data_scheme_file(record_path: RecordPath) -> "File": + normed_path = os.path.normpath(record_path) + try: + _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) + except ValueError: + message = ( + "Unexpected file in {}: {!r}. .data directory contents" + " should be named like: '/'." + ).format(wheel_path, record_path) + raise InstallationError(message) + + try: + scheme_path = scheme_paths[scheme_key] + except KeyError: + valid_scheme_keys = ", ".join(sorted(scheme_paths)) + message = ( + "Unknown scheme key used in {}: {} (for file {!r}). .data" + " directory contents should be in subdirectories named" + " with a valid scheme key ({})" + ).format(wheel_path, scheme_key, record_path, valid_scheme_keys) + raise InstallationError(message) + + dest_path = os.path.join(scheme_path, dest_subpath) + assert_no_path_traversal(scheme_path, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_data_scheme_file + + def is_data_scheme_path(path: RecordPath) -> bool: + return path.split("/", 1)[0].endswith(".data") + + paths = cast(List[RecordPath], wheel_zip.namelist()) + file_paths = filterfalse(is_dir_path, paths) + root_scheme_paths, data_scheme_paths = partition(is_data_scheme_path, file_paths) + + make_root_scheme_file = root_scheme_file_maker(wheel_zip, lib_dir) + files: Iterator[File] = map(make_root_scheme_file, root_scheme_paths) + + def is_script_scheme_path(path: RecordPath) -> bool: + parts = path.split("/", 2) + return len(parts) > 2 and parts[0].endswith(".data") and parts[1] == "scripts" + + other_scheme_paths, script_scheme_paths = partition( + is_script_scheme_path, data_scheme_paths + ) + + make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme) + other_scheme_files = map(make_data_scheme_file, other_scheme_paths) + files = chain(files, other_scheme_files) + + # Get the defined entry points + distribution = get_wheel_distribution( + FilesystemWheel(wheel_path), + canonicalize_name(name), + ) + console, gui = get_entrypoints(distribution) + + def is_entrypoint_wrapper(file: "File") -> bool: + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + path = file.dest_path + name = os.path.basename(path) + if name.lower().endswith(".exe"): + matchname = name[:-4] + elif name.lower().endswith("-script.py"): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return matchname in console or matchname in gui + + script_scheme_files: Iterator[File] = map( + make_data_scheme_file, script_scheme_paths + ) + script_scheme_files = filterfalse(is_entrypoint_wrapper, script_scheme_files) + script_scheme_files = map(ScriptFile, script_scheme_files) + files = chain(files, script_scheme_files) + + for file in files: + file.save() + record_installed(file.src_record_path, file.dest_path, file.changed) + + def pyc_source_file_paths() -> Iterator[str]: + # We de-duplicate installation paths, since there can be overlap (e.g. + # file in .data maps to same location as file in wheel root). + # Sorting installation paths makes it easier to reproduce and debug + # issues related to permissions on existing files. + for installed_path in sorted(set(installed.values())): + full_installed_path = os.path.join(lib_dir, installed_path) + if not os.path.isfile(full_installed_path): + continue + if not full_installed_path.endswith(".py"): + continue + yield full_installed_path + + def pyc_output_path(path: str) -> str: + """Return the path the pyc file would have been written to.""" + return importlib.util.cache_from_source(path) + + # Compile all of the pyc files for the installed files + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore") + for path in pyc_source_file_paths(): + success = compileall.compile_file(path, force=True, quiet=True) + if success: + pyc_path = pyc_output_path(path) + assert os.path.exists(pyc_path) + pyc_record_path = cast( + "RecordPath", pyc_path.replace(os.path.sep, "/") + ) + record_installed(pyc_record_path, pyc_path) + logger.debug(stdout.getvalue()) + + maker = PipScriptMaker(None, scheme.scripts) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {""} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Generate the console and GUI entry points specified in the wheel + scripts_to_generate = get_console_script_specs(console) + + gui_scripts_to_generate = list(starmap("{} = {}".format, gui.items())) + + generated_console_scripts = maker.make_multiple(scripts_to_generate) + generated.extend(generated_console_scripts) + + generated.extend(maker.make_multiple(gui_scripts_to_generate, {"gui": True})) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + generated_file_mode = 0o666 & ~current_umask() + + @contextlib.contextmanager + def _generate_file(path: str, **kwargs: Any) -> Iterator[BinaryIO]: + with adjacent_tmp_file(path, **kwargs) as f: + yield f + os.chmod(f.name, generated_file_mode) + replace(f.name, path) + + dest_info_dir = os.path.join(lib_dir, info_dir) + + # Record pip as the installer + installer_path = os.path.join(dest_info_dir, "INSTALLER") + with _generate_file(installer_path) as installer_file: + installer_file.write(b"pip\n") + generated.append(installer_path) + + # Record the PEP 610 direct URL reference + if direct_url is not None: + direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME) + with _generate_file(direct_url_path) as direct_url_file: + direct_url_file.write(direct_url.to_json().encode("utf-8")) + generated.append(direct_url_path) + + # Record the REQUESTED file + if requested: + requested_path = os.path.join(dest_info_dir, "REQUESTED") + with open(requested_path, "wb"): + pass + generated.append(requested_path) + + record_text = distribution.read_text("RECORD") + record_rows = list(csv.reader(record_text.splitlines())) + + rows = get_csv_rows_for_installed( + record_rows, + installed=installed, + changed=changed, + generated=generated, + lib_dir=lib_dir, + ) + + # Record details of all files installed + record_path = os.path.join(dest_info_dir, "RECORD") + + with _generate_file(record_path, **csv_io_kwargs("w")) as record_file: + # Explicitly cast to typing.IO[str] as a workaround for the mypy error: + # "writer" has incompatible type "BinaryIO"; expected "_Writer" + writer = csv.writer(cast("IO[str]", record_file)) + writer.writerows(_normalized_outrows(rows)) + + +@contextlib.contextmanager +def req_error_context(req_description: str) -> Iterator[None]: + try: + yield + except InstallationError as e: + message = "For req: {}. {}".format(req_description, e.args[0]) + raise InstallationError(message) from e + + +def install_wheel( + name: str, + wheel_path: str, + scheme: Scheme, + req_description: str, + pycompile: bool = True, + warn_script_location: bool = True, + direct_url: Optional[DirectUrl] = None, + requested: bool = False, +) -> None: + with ZipFile(wheel_path, allowZip64=True) as z: + with req_error_context(req_description): + _install_wheel( + name=name, + wheel_zip=z, + wheel_path=wheel_path, + scheme=scheme, + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=direct_url, + requested=requested, + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/operations/prepare.py b/python/lib/python3.10/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..a726f03 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,642 @@ +"""Prepares a distribution for installation +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import mimetypes +import os +import shutil +from typing import Dict, Iterable, List, Optional + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.distributions import make_distribution_for_install_requirement +from pip._internal.distributions.installed import InstalledDistribution +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, + HashMismatch, + HashUnpinned, + InstallationError, + NetworkConnectionError, + PreviousBuildDirError, + VcsHashUnsupported, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.network.download import BatchDownloader, Downloader +from pip._internal.network.lazy_wheel import ( + HTTPRangeRequestUnsupported, + dist_from_wheel_url, +) +from pip._internal.network.session import PipSession +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.utils.filesystem import copy2_fixed +from pip._internal.utils.hashes import Hashes, MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, hide_url, is_installable_dir, rmtree +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.unpacking import unpack_file +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +def _get_prepared_distribution( + req: InstallRequirement, + req_tracker: RequirementTracker, + finder: PackageFinder, + build_isolation: bool, +) -> BaseDistribution: + """Prepare a distribution for installation.""" + abstract_dist = make_distribution_for_install_requirement(req) + with req_tracker.track(req): + abstract_dist.prepare_distribution_metadata(finder, build_isolation) + return abstract_dist.get_metadata_distribution() + + +def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None: + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend is not None + vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity) + + +class File: + def __init__(self, path: str, content_type: Optional[str]) -> None: + self.path = path + if content_type is None: + self.content_type = mimetypes.guess_type(path)[0] + else: + self.content_type = content_type + + +def get_http_url( + link: Link, + download: Downloader, + download_dir: Optional[str] = None, + hashes: Optional[Hashes] = None, +) -> File: + temp_dir = TempDirectory(kind="unpack", globally_managed=True) + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, download_dir, hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = None + else: + # let's download to a tmp dir + from_path, content_type = download(link, temp_dir.path) + if hashes: + hashes.check_against_path(from_path) + + return File(from_path, content_type) + + +def _copy2_ignoring_special_files(src: str, dest: str) -> None: + """Copying special files is not supported, but as a convenience to users + we skip errors copying them. This supports tools that may create e.g. + socket files in the project source directory. + """ + try: + copy2_fixed(src, dest) + except shutil.SpecialFileError as e: + # SpecialFileError may be raised due to either the source or + # destination. If the destination was the cause then we would actually + # care, but since the destination directory is deleted prior to + # copy we ignore all of them assuming it is caused by the source. + logger.warning( + "Ignoring special file error '%s' encountered copying %s to %s.", + str(e), + src, + dest, + ) + + +def _copy_source_tree(source: str, target: str) -> None: + target_abspath = os.path.abspath(target) + target_basename = os.path.basename(target_abspath) + target_dirname = os.path.dirname(target_abspath) + + def ignore(d: str, names: List[str]) -> List[str]: + skipped: List[str] = [] + if d == source: + # Pulling in those directories can potentially be very slow, + # exclude the following directories if they appear in the top + # level dir (and only it). + # See discussion at https://github.com/pypa/pip/pull/6770 + skipped += [".tox", ".nox"] + if os.path.abspath(d) == target_dirname: + # Prevent an infinite recursion if the target is in source. + # This can happen when TMPDIR is set to ${PWD}/... + # and we copy PWD to TMPDIR. + skipped += [target_basename] + return skipped + + shutil.copytree( + source, + target, + ignore=ignore, + symlinks=True, + copy_function=_copy2_ignoring_special_files, + ) + + +def get_file_url( + link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None +) -> File: + """Get file and optionally check its hash.""" + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, download_dir, hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link.file_path + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(from_path) + return File(from_path, None) + + +def unpack_url( + link: Link, + location: str, + download: Downloader, + verbosity: int, + download_dir: Optional[str] = None, + hashes: Optional[Hashes] = None, +) -> Optional[File]: + """Unpack link into location, downloading if required. + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if link.is_vcs: + unpack_vcs_link(link, location, verbosity=verbosity) + return None + + # Once out-of-tree-builds are no longer supported, could potentially + # replace the below condition with `assert not link.is_existing_dir` + # - unpack_url does not need to be called for in-tree-builds. + # + # As further cleanup, _copy_source_tree and accompanying tests can + # be removed. + # + # TODO when use-deprecated=out-of-tree-build is removed + if link.is_existing_dir(): + if os.path.isdir(location): + rmtree(location) + _copy_source_tree(link.file_path, location) + return None + + # file urls + if link.is_file: + file = get_file_url(link, download_dir, hashes=hashes) + + # http urls + else: + file = get_http_url( + link, + download, + download_dir, + hashes=hashes, + ) + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies, except wheels + if not link.is_wheel: + unpack_file(file.path, location, file.content_type) + + return file + + +def _check_download_dir( + link: Link, download_dir: str, hashes: Optional[Hashes] +) -> Optional[str]: + """Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + + if not os.path.exists(download_path): + return None + + # If already downloaded, does its hash match? + logger.info("File was already downloaded %s", download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + "Previously-downloaded file %s has bad hash. Re-downloading.", + download_path, + ) + os.unlink(download_path) + return None + return download_path + + +class RequirementPreparer: + """Prepares a Requirement""" + + def __init__( + self, + build_dir: str, + download_dir: Optional[str], + src_dir: str, + build_isolation: bool, + req_tracker: RequirementTracker, + session: PipSession, + progress_bar: str, + finder: PackageFinder, + require_hashes: bool, + use_user_site: bool, + lazy_wheel: bool, + verbosity: int, + in_tree_build: bool, + ) -> None: + super().__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + self._session = session + self._download = Downloader(session, progress_bar) + self._batch_download = BatchDownloader(session, progress_bar) + self.finder = finder + + # Where still-packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Is build isolation allowed? + self.build_isolation = build_isolation + + # Should hash-checking be required? + self.require_hashes = require_hashes + + # Should install in user site-packages? + self.use_user_site = use_user_site + + # Should wheels be downloaded lazily? + self.use_lazy_wheel = lazy_wheel + + # How verbose should underlying tooling be? + self.verbosity = verbosity + + # Should in-tree builds be used for local paths? + self.in_tree_build = in_tree_build + + # Memoized downloaded files, as mapping of url: path. + self._downloaded: Dict[str, str] = {} + + # Previous "header" printed for a link-based InstallRequirement + self._previous_requirement_header = ("", "") + + def _log_preparing_link(self, req: InstallRequirement) -> None: + """Provide context for the requirement being prepared.""" + if req.link.is_file and not req.original_link_is_in_wheel_cache: + message = "Processing %s" + information = str(display_path(req.link.file_path)) + else: + message = "Collecting %s" + information = str(req.req or req) + + if (message, information) != self._previous_requirement_header: + self._previous_requirement_header = (message, information) + logger.info(message, information) + + if req.original_link_is_in_wheel_cache: + with indent_log(): + logger.info("Using cached %s", req.link.filename) + + def _ensure_link_req_src_dir( + self, req: InstallRequirement, parallel_builds: bool + ) -> None: + """Ensure source_dir of a linked InstallRequirement.""" + # Since source_dir is only set for editable requirements. + if req.link.is_wheel: + # We don't need to unpack wheels, so no need for a source + # directory. + return + assert req.source_dir is None + if req.link.is_existing_dir() and self.in_tree_build: + # build local directories in-tree + req.source_dir = req.link.file_path + return + + # We always delete unpacked sdists after pip runs. + req.ensure_has_source_dir( + self.build_dir, + autodelete=True, + parallel_builds=parallel_builds, + ) + + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + # TODO: this check is now probably dead code + if is_installable_dir(req.source_dir): + raise PreviousBuildDirError( + "pip can't proceed with requirements '{}' due to a" + "pre-existing build directory ({}). This is likely " + "due to a previous installation that failed . pip is " + "being responsible and not assuming it can delete this. " + "Please delete it and try again.".format(req, req.source_dir) + ) + + def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes: + # By the time this is called, the requirement's link should have + # been checked so we can tell what kind of requirements req is + # and raise some more informative errors than otherwise. + # (For example, we can raise VcsHashUnsupported for a VCS URL + # rather than HashMissing.) + if not self.require_hashes: + return req.hashes(trust_internet=True) + + # We could check these first 2 conditions inside unpack_url + # and save repetition of conditions, but then we would + # report less-useful error messages for unhashable + # requirements, complaining that there's no hash provided. + if req.link.is_vcs: + raise VcsHashUnsupported() + if req.link.is_existing_dir(): + raise DirectoryUrlHashUnsupported() + + # Unpinned packages are asking for trouble when a new version + # is uploaded. This isn't a security check, but it saves users + # a surprising hash mismatch in the future. + # file:/// URLs aren't pinnable, so don't complain about them + # not being pinned. + if req.original_link is None and not req.is_pinned: + raise HashUnpinned() + + # If known-good hashes are missing for this requirement, + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + return req.hashes(trust_internet=False) or MissingHashes() + + def _fetch_metadata_using_lazy_wheel( + self, + link: Link, + ) -> Optional[BaseDistribution]: + """Fetch metadata using lazy wheel, if possible.""" + if not self.use_lazy_wheel: + return None + if self.require_hashes: + logger.debug("Lazy wheel is not used as hash checking is required") + return None + if link.is_file or not link.is_wheel: + logger.debug( + "Lazy wheel is not used as %r does not points to a remote wheel", + link, + ) + return None + + wheel = Wheel(link.filename) + name = canonicalize_name(wheel.name) + logger.info( + "Obtaining dependency information from %s %s", + name, + wheel.version, + ) + url = link.url.split("#", 1)[0] + try: + return dist_from_wheel_url(name, url, self._session) + except HTTPRangeRequestUnsupported: + logger.debug("%s does not support range requests", url) + return None + + def _complete_partial_requirements( + self, + partially_downloaded_reqs: Iterable[InstallRequirement], + parallel_builds: bool = False, + ) -> None: + """Download any requirements which were only fetched by metadata.""" + # Download to a temporary directory. These will be copied over as + # needed for downstream 'download', 'wheel', and 'install' commands. + temp_dir = TempDirectory(kind="unpack", globally_managed=True).path + + # Map each link to the requirement that owns it. This allows us to set + # `req.local_file_path` on the appropriate requirement after passing + # all the links at once into BatchDownloader. + links_to_fully_download: Dict[Link, InstallRequirement] = {} + for req in partially_downloaded_reqs: + assert req.link + links_to_fully_download[req.link] = req + + batch_download = self._batch_download( + links_to_fully_download.keys(), + temp_dir, + ) + for link, (filepath, _) in batch_download: + logger.debug("Downloading link %s to %s", link, filepath) + req = links_to_fully_download[link] + req.local_file_path = filepath + + # This step is necessary to ensure all lazy wheels are processed + # successfully by the 'download', 'wheel', and 'install' commands. + for req in partially_downloaded_reqs: + self._prepare_linked_requirement(req, parallel_builds) + + def prepare_linked_requirement( + self, req: InstallRequirement, parallel_builds: bool = False + ) -> BaseDistribution: + """Prepare a requirement to be obtained from req.link.""" + assert req.link + link = req.link + self._log_preparing_link(req) + with indent_log(): + # Check if the relevant file is already available + # in the download directory + file_path = None + if self.download_dir is not None and link.is_wheel: + hashes = self._get_linked_req_hashes(req) + file_path = _check_download_dir(req.link, self.download_dir, hashes) + + if file_path is not None: + # The file is already available, so mark it as downloaded + self._downloaded[req.link.url] = file_path + else: + # The file is not available, attempt to fetch only metadata + wheel_dist = self._fetch_metadata_using_lazy_wheel(link) + if wheel_dist is not None: + req.needs_more_preparation = True + return wheel_dist + + # None of the optimizations worked, fully prepare the requirement + return self._prepare_linked_requirement(req, parallel_builds) + + def prepare_linked_requirements_more( + self, reqs: Iterable[InstallRequirement], parallel_builds: bool = False + ) -> None: + """Prepare linked requirements more, if needed.""" + reqs = [req for req in reqs if req.needs_more_preparation] + for req in reqs: + # Determine if any of these requirements were already downloaded. + if self.download_dir is not None and req.link.is_wheel: + hashes = self._get_linked_req_hashes(req) + file_path = _check_download_dir(req.link, self.download_dir, hashes) + if file_path is not None: + self._downloaded[req.link.url] = file_path + req.needs_more_preparation = False + + # Prepare requirements we found were already downloaded for some + # reason. The other downloads will be completed separately. + partially_downloaded_reqs: List[InstallRequirement] = [] + for req in reqs: + if req.needs_more_preparation: + partially_downloaded_reqs.append(req) + else: + self._prepare_linked_requirement(req, parallel_builds) + + # TODO: separate this part out from RequirementPreparer when the v1 + # resolver can be removed! + self._complete_partial_requirements( + partially_downloaded_reqs, + parallel_builds=parallel_builds, + ) + + def _prepare_linked_requirement( + self, req: InstallRequirement, parallel_builds: bool + ) -> BaseDistribution: + assert req.link + link = req.link + + self._ensure_link_req_src_dir(req, parallel_builds) + hashes = self._get_linked_req_hashes(req) + + if link.is_existing_dir() and self.in_tree_build: + local_file = None + elif link.url not in self._downloaded: + try: + local_file = unpack_url( + link, + req.source_dir, + self._download, + self.verbosity, + self.download_dir, + hashes, + ) + except NetworkConnectionError as exc: + raise InstallationError( + "Could not install requirement {} because of HTTP " + "error {} for URL {}".format(req, exc, link) + ) + else: + file_path = self._downloaded[link.url] + if hashes: + hashes.check_against_path(file_path) + local_file = File(file_path, content_type=None) + + # For use in later processing, + # preserve the file path on the requirement. + if local_file: + req.local_file_path = local_file.path + + dist = _get_prepared_distribution( + req, + self.req_tracker, + self.finder, + self.build_isolation, + ) + return dist + + def save_linked_requirement(self, req: InstallRequirement) -> None: + assert self.download_dir is not None + assert req.link is not None + link = req.link + if link.is_vcs or (link.is_existing_dir() and req.editable): + # Make a .zip of the source_dir we already created. + req.archive(self.download_dir) + return + + if link.is_existing_dir(): + logger.debug( + "Not copying link to destination directory " + "since it is a directory: %s", + link, + ) + return + if req.local_file_path is None: + # No distribution was downloaded for this requirement. + return + + download_location = os.path.join(self.download_dir, link.filename) + if not os.path.exists(download_location): + shutil.copy(req.local_file_path, download_location) + download_path = display_path(download_location) + logger.info("Saved %s", download_path) + + def prepare_editable_requirement( + self, + req: InstallRequirement, + ) -> BaseDistribution: + """Prepare an editable requirement.""" + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info("Obtaining %s", req) + + with indent_log(): + if self.require_hashes: + raise InstallationError( + "The editable requirement {} cannot be installed when " + "requiring hashes, because there is no single file to " + "hash.".format(req) + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable() + + dist = _get_prepared_distribution( + req, + self.req_tracker, + self.finder, + self.build_isolation, + ) + + req.check_if_exists(self.use_user_site) + + return dist + + def prepare_installed_requirement( + self, + req: InstallRequirement, + skip_reason: str, + ) -> BaseDistribution: + """Prepare an already-installed requirement.""" + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to {}".format(req.satisfied_by) + ) + logger.info( + "Requirement %s: %s (%s)", skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if self.require_hashes: + logger.debug( + "Since it is already installed, we are trusting this " + "package without checking its hash. To ensure a " + "completely repeatable environment, install into an " + "empty virtualenv." + ) + return InstalledDistribution(req).get_metadata_distribution() diff --git a/python/lib/python3.10/site-packages/pip/_internal/pyproject.py b/python/lib/python3.10/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..e183eaf --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,168 @@ +import os +from collections import namedtuple +from typing import Any, List, Optional + +from pip._vendor import tomli +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement + +from pip._internal.exceptions import ( + InstallationError, + InvalidPyProjectBuildRequires, + MissingPyProjectBuildRequires, +) + + +def _is_list_of_str(obj: Any) -> bool: + return isinstance(obj, list) and all(isinstance(item, str) for item in obj) + + +def make_pyproject_path(unpacked_source_directory: str) -> str: + return os.path.join(unpacked_source_directory, "pyproject.toml") + + +BuildSystemDetails = namedtuple( + "BuildSystemDetails", ["requires", "backend", "check", "backend_path"] +) + + +def load_pyproject_toml( + use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str +) -> Optional[BuildSystemDetails]: + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + directory paths to import the backend from (backend-path), + relative to the project root. + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if not has_pyproject and not has_setup: + raise InstallationError( + f"{req_name} does not appear to be a Python project: " + f"neither 'setup.py' nor 'pyproject.toml' found." + ) + + if has_pyproject: + with open(pyproject_toml, encoding="utf-8") as f: + pp_toml = tomli.loads(f.read()) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format(build_system["build-backend"]) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise MissingPyProjectBuildRequires(package=req_name) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InvalidPyProjectBuildRequires( + package=req_name, + reason="It is not a list of strings.", + ) + + # Each requirement must be valid as per PEP 508 + for requirement in requires: + try: + Requirement(requirement) + except InvalidRequirement as error: + raise InvalidPyProjectBuildRequires( + package=req_name, + reason=f"It contains an invalid requirement: {requirement!r}", + ) from error + + backend = build_system.get("build-backend") + backend_path = build_system.get("backend-path", []) + check: List[str] = [] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..70dea27 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,94 @@ +import collections +import logging +from typing import Iterator, List, Optional, Sequence, Tuple + +from pip._internal.utils.logging import indent_log + +from .req_file import parse_requirements +from .req_install import InstallRequirement +from .req_set import RequirementSet + +__all__ = [ + "RequirementSet", + "InstallRequirement", + "parse_requirements", + "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +class InstallationResult: + def __init__(self, name: str) -> None: + self.name = name + + def __repr__(self) -> str: + return f"InstallationResult(name={self.name!r})" + + +def _validate_requirements( + requirements: List[InstallRequirement], +) -> Iterator[Tuple[str, InstallRequirement]]: + for req in requirements: + assert req.name, f"invalid to-be-installed requirement: {req}" + yield req.name, req + + +def install_given_reqs( + requirements: List[InstallRequirement], + install_options: List[str], + global_options: Sequence[str], + root: Optional[str], + home: Optional[str], + prefix: Optional[str], + warn_script_location: bool, + use_user_site: bool, + pycompile: bool, +) -> List[InstallationResult]: + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + to_install = collections.OrderedDict(_validate_requirements(requirements)) + + if to_install: + logger.info( + "Installing collected packages: %s", + ", ".join(to_install.keys()), + ) + + installed = [] + + with indent_log(): + for req_name, requirement in to_install.items(): + if requirement.should_reinstall: + logger.info("Attempting uninstall: %s", req_name) + with indent_log(): + uninstalled_pathset = requirement.uninstall(auto_confirm=True) + else: + uninstalled_pathset = None + + try: + requirement.install( + install_options, + global_options, + root=root, + home=home, + prefix=prefix, + warn_script_location=warn_script_location, + use_user_site=use_user_site, + pycompile=pycompile, + ) + except Exception: + # if install did not succeed, rollback previous uninstall + if uninstalled_pathset and not requirement.install_succeeded: + uninstalled_pathset.rollback() + raise + else: + if uninstalled_pathset and requirement.install_succeeded: + uninstalled_pathset.commit() + + installed.append(InstallationResult(req_name)) + + return installed diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/constructors.py b/python/lib/python3.10/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..25bfb39 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,490 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re +from typing import Any, Dict, Optional, Set, Tuple, Union + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier + +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.req.req_file import ParsedRequirement +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.filetypes import is_archive_file +from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import is_url, vcs + +__all__ = [ + "install_req_from_editable", + "install_req_from_line", + "parse_editable", +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path: str) -> Tuple[str, Optional[str]]: + m = re.match(r"^(.+)(\[[^\]]+\])$", path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras: Optional[str]) -> Set[str]: + if not extras: + return set() + return get_requirement("placeholder" + extras.lower()).extras + + +def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith("file:"): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + get_requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, set() + + for version_control in vcs: + if url.lower().startswith(f"{version_control}:"): + url = f"{version_control}+{url}" + break + + link = Link(url) + + if not link.is_vcs: + backends = ", ".join(vcs.all_schemes) + raise InstallationError( + f"{editable_req} is not a valid editable requirement. " + f"It should either be a path to a local project or a VCS URL " + f"(beginning with {backends})." + ) + + package_name = link.egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '{}', please specify one " + "with #egg=your_package_name".format(editable_req) + ) + return package_name, url, set() + + +def check_first_requirement_in_file(filename: str) -> None: + """Check if file is parsable as a requirements file. + + This is heavily based on ``pkg_resources.parse_requirements``, but + simplified to just check the first meaningful line. + + :raises InvalidRequirement: If the first meaningful line cannot be parsed + as an requirement. + """ + with open(filename, encoding="utf-8", errors="ignore") as f: + # Create a steppable iterator, so we can handle \-continuations. + lines = ( + line + for line in (line.strip() for line in f) + if line and not line.startswith("#") # Skip blank lines/comments. + ) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if " #" in line: + line = line[: line.find(" #")] + # If there is a line continuation, drop it, and append the next line. + if line.endswith("\\"): + line = line[:-2].strip() + next(lines, "") + Requirement(line) + return + + +def deduce_helpful_msg(req: str) -> str: + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + if not os.path.exists(req): + return f" File '{req}' does not exist." + msg = " The path does exist. " + # Try to parse and check if it is a requirements file. + try: + check_first_requirement_in_file(req) + except InvalidRequirement: + logger.debug("Cannot parse '%s' as requirements file", req) + else: + msg += ( + f"The argument you provided " + f"({req}) appears to be a" + f" requirements file. If that is the" + f" case, use the '-r' flag to install" + f" the packages specified within it." + ) + return msg + + +class RequirementParts: + def __init__( + self, + requirement: Optional[Requirement], + link: Optional[Link], + markers: Optional[Marker], + extras: Set[str], + ): + self.requirement = requirement + self.link = link + self.markers = markers + self.extras = extras + + +def parse_req_from_editable(editable_req: str) -> RequirementParts: + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req: Optional[Requirement] = Requirement(name) + except InvalidRequirement: + raise InstallationError(f"Invalid requirement: '{name}'") + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req: str, + comes_from: Optional[Union[InstallRequirement, str]] = None, + use_pep517: Optional[bool] = None, + isolated: bool = False, + options: Optional[Dict[str, Any]] = None, + constraint: bool = False, + user_supplied: bool = False, + permit_editable_wheels: bool = False, +) -> InstallRequirement: + + parts = parse_req_from_editable(editable_req) + + return InstallRequirement( + parts.requirement, + comes_from=comes_from, + user_supplied=user_supplied, + editable=True, + permit_editable_wheels=permit_editable_wheels, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + install_options=options.get("install_options", []) if options else [], + global_options=options.get("global_options", []) if options else [], + hash_options=options.get("hashes", {}) if options else {}, + extras=parts.extras, + ) + + +def _looks_like_path(name: str) -> bool: + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path: str, name: str) -> Optional[str]: + """ + First, it checks whether a provided path is an installable directory. If it + is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + # TODO: The is_installable_dir test here might not be necessary + # now that it is done in load_pyproject_toml too. + raise InstallationError( + f"Directory {name!r} is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split("@", 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + "Requirement %r looks like a filename, but the file does not exist", + name, + ) + return path_to_url(path) + + +def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts: + if is_url(name): + marker_sep = "; " + else: + marker_sep = ";" + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == "file" and re.search(r"\.\./", link.url): + link = Link(path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = f"{wheel.name}=={wheel.version}" + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text: str) -> str: + if not line_source: + return text + return f"{text} (from {line_source})" + + def _parse_req_string(req_as_string: str) -> Requirement: + try: + req = get_requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif "=" in req_as_string and not any( + op in req_as_string for op in operators + ): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + msg = with_source(f"Invalid requirement: {req_as_string!r}") + if add_msg: + msg += f"\nHint: {add_msg}" + raise InstallationError(msg) + else: + # Deprecate extras after specifiers: "name>=1.0[extras]" + # This currently works by accident because _strip_extras() parses + # any extras in the end of the string and those are saved in + # RequirementParts + for spec in req.specifier: + spec_str = str(spec) + if spec_str.endswith("]"): + msg = f"Extras after version '{spec_str}'." + raise InstallationError(msg) + return req + + if req_as_string is not None: + req: Optional[Requirement] = _parse_req_string(req_as_string) + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name: str, + comes_from: Optional[Union[str, InstallRequirement]] = None, + use_pep517: Optional[bool] = None, + isolated: bool = False, + options: Optional[Dict[str, Any]] = None, + constraint: bool = False, + line_source: Optional[str] = None, + user_supplied: bool = False, +) -> InstallRequirement: + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, + comes_from, + link=parts.link, + markers=parts.markers, + use_pep517=use_pep517, + isolated=isolated, + install_options=options.get("install_options", []) if options else [], + global_options=options.get("global_options", []) if options else [], + hash_options=options.get("hashes", {}) if options else {}, + constraint=constraint, + extras=parts.extras, + user_supplied=user_supplied, + ) + + +def install_req_from_req_string( + req_string: str, + comes_from: Optional[InstallRequirement] = None, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, +) -> InstallRequirement: + try: + req = get_requirement(req_string) + except InvalidRequirement: + raise InstallationError(f"Invalid requirement: '{req_string}'") + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if ( + req.url + and comes_from + and comes_from.link + and comes_from.link.netloc in domains_not_allowed + ): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "{} depends on {} ".format(comes_from.name, req) + ) + + return InstallRequirement( + req, + comes_from, + isolated=isolated, + use_pep517=use_pep517, + user_supplied=user_supplied, + ) + + +def install_req_from_parsed_requirement( + parsed_req: ParsedRequirement, + isolated: bool = False, + use_pep517: Optional[bool] = None, + user_supplied: bool = False, +) -> InstallRequirement: + if parsed_req.is_editable: + req = install_req_from_editable( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + constraint=parsed_req.constraint, + isolated=isolated, + user_supplied=user_supplied, + ) + + else: + req = install_req_from_line( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + isolated=isolated, + options=parsed_req.options, + constraint=parsed_req.constraint, + line_source=parsed_req.line_source, + user_supplied=user_supplied, + ) + return req + + +def install_req_from_link_and_ireq( + link: Link, ireq: InstallRequirement +) -> InstallRequirement: + return InstallRequirement( + req=ireq.req, + comes_from=ireq.comes_from, + editable=ireq.editable, + link=link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + install_options=ireq.install_options, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/req_file.py b/python/lib/python3.10/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..03ae504 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,536 @@ +""" +Requirements file parsing +""" + +import optparse +import os +import re +import shlex +import urllib.parse +from optparse import Values +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + Optional, + Tuple, +) + +from pip._internal.cli import cmdoptions +from pip._internal.exceptions import InstallationError, RequirementsFileParseError +from pip._internal.models.search_scope import SearchScope +from pip._internal.network.session import PipSession +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.urls import get_url_scheme + +if TYPE_CHECKING: + # NoReturn introduced in 3.6.2; imported only for type checking to maintain + # pip compatibility with older patch versions of Python 3.6 + from typing import NoReturn + + from pip._internal.index.package_finder import PackageFinder + +__all__ = ["parse_requirements"] + +ReqFileLines = Iterable[Tuple[int, str]] + +LineParser = Callable[[str], Tuple[str, Values]] + +SCHEME_RE = re.compile(r"^(http|https|file):", re.I) +COMMENT_RE = re.compile(r"(^|\s+)#.*$") + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r"(?P\$\{(?P[A-Z0-9_]+)\})") + +SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.prefer_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.use_new_feature, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +class ParsedRequirement: + def __init__( + self, + requirement: str, + is_editable: bool, + comes_from: str, + constraint: bool, + options: Optional[Dict[str, Any]] = None, + line_source: Optional[str] = None, + ) -> None: + self.requirement = requirement + self.is_editable = is_editable + self.comes_from = comes_from + self.options = options + self.constraint = constraint + self.line_source = line_source + + +class ParsedLine: + def __init__( + self, + filename: str, + lineno: int, + args: str, + opts: Values, + constraint: bool, + ) -> None: + self.filename = filename + self.lineno = lineno + self.opts = opts + self.constraint = constraint + + if args: + self.is_requirement = True + self.is_editable = False + self.requirement = args + elif opts.editables: + self.is_requirement = True + self.is_editable = True + # We don't support multiple -e on one line + self.requirement = opts.editables[0] + else: + self.is_requirement = False + + +def parse_requirements( + filename: str, + session: PipSession, + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + constraint: bool = False, +) -> Iterator[ParsedRequirement]: + """Parse a requirements file and yield ParsedRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + """ + line_parser = get_line_parser(finder) + parser = RequirementsFileParser(session, line_parser) + + for parsed_line in parser.parse(filename, constraint): + parsed_req = handle_line( + parsed_line, options=options, finder=finder, session=session + ) + if parsed_req is not None: + yield parsed_req + + +def preprocess(content: str) -> ReqFileLines: + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + """ + lines_enum: ReqFileLines = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_requirement_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, +) -> ParsedRequirement: + + # preserve for the nested code path + line_comes_from = "{} {} (line {})".format( + "-c" if line.constraint else "-r", + line.filename, + line.lineno, + ) + + assert line.is_requirement + + if line.is_editable: + # For editable requirements, we don't support per-requirement + # options, so just return the parsed requirement. + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + ) + else: + if options: + # Disable wheels if the user has specified build options + cmdoptions.check_install_build_global(options, line.opts) + + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + + line_source = f"line {line.lineno} of {line.filename}" + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + options=req_options, + line_source=line_source, + ) + + +def handle_option_line( + opts: Values, + filename: str, + lineno: int, + finder: Optional["PackageFinder"] = None, + options: Optional[optparse.Values] = None, + session: Optional[PipSession] = None, +) -> None: + + if options: + # percolate options upward + if opts.require_hashes: + options.require_hashes = opts.require_hashes + if opts.features_enabled: + options.features_enabled.extend( + f for f in opts.features_enabled if f not in options.features_enabled + ) + + # set finder options + if finder: + find_links = finder.find_links + index_urls = finder.index_urls + if opts.index_url: + index_urls = [opts.index_url] + if opts.no_index is True: + index_urls = [] + if opts.extra_index_urls: + index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + if session: + # We need to update the auth urls in session + session.update_index_urls(index_urls) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + ) + finder.search_scope = search_scope + + if opts.pre: + finder.set_allow_all_prereleases() + + if opts.prefer_binary: + finder.set_prefer_binary() + + if session: + for host in opts.trusted_hosts or []: + source = f"line {lineno} of {filename}" + session.add_trusted_host(host, source=source) + + +def handle_line( + line: ParsedLine, + options: Optional[optparse.Values] = None, + finder: Optional["PackageFinder"] = None, + session: Optional[PipSession] = None, +) -> Optional[ParsedRequirement]: + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + :param line: The parsed line to be processed. + :param options: CLI options. + :param finder: The finder - updated by non-requirement lines. + :param session: The session - updated by non-requirement lines. + + Returns a ParsedRequirement object if the line is a requirement line, + otherwise returns None. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + if line.is_requirement: + parsed_req = handle_requirement_line(line, options) + return parsed_req + else: + handle_option_line( + line.opts, + line.filename, + line.lineno, + finder, + options, + session, + ) + return None + + +class RequirementsFileParser: + def __init__( + self, + session: PipSession, + line_parser: LineParser, + ) -> None: + self._session = session + self._line_parser = line_parser + + def parse(self, filename: str, constraint: bool) -> Iterator[ParsedLine]: + """Parse a given file, yielding parsed lines.""" + yield from self._parse_and_recurse(filename, constraint) + + def _parse_and_recurse( + self, filename: str, constraint: bool + ) -> Iterator[ParsedLine]: + for line in self._parse_file(filename, constraint): + if not line.is_requirement and ( + line.opts.requirements or line.opts.constraints + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib.parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join( + os.path.dirname(filename), + req_path, + ) + + yield from self._parse_and_recurse(req_path, nested_constraint) + else: + yield line + + def _parse_file(self, filename: str, constraint: bool) -> Iterator[ParsedLine]: + _, content = get_file_content(filename, self._session) + + lines_enum = preprocess(content) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = f"Invalid requirement: {line}\n{e.msg}" + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser: + def parse_line(line: str) -> Tuple[str, Values]: + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + + opts, _ = parser.parse_args(shlex.split(options_str), defaults) + + return args_str, opts + + return parse_line + + +def break_args_options(line: str) -> Tuple[str, str]: + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(" ") + args = [] + options = tokens[:] + for token in tokens: + if token.startswith("-") or token.startswith("--"): + break + else: + args.append(token) + options.pop(0) + return " ".join(args), " ".join(options) + + +class OptionParsingError(Exception): + def __init__(self, msg: str) -> None: + self.msg = msg + + +def build_parser() -> optparse.OptionParser: + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self: Any, msg: str) -> "NoReturn": + raise OptionParsingError(msg) + + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum: ReqFileLines) -> ReqFileLines: + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line: List[str] = [] + for line_number, line in lines_enum: + if not line.endswith("\\") or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = " " + line + if new_line: + new_line.append(line) + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip("\\")) + + # last line contains \ + if new_line: + assert primary_line_number is not None + yield primary_line_number, "".join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum: ReqFileLines) -> ReqFileLines: + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub("", line) + line = line.strip() + if line: + yield line_number, line + + +def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines: + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url: str, session: PipSession) -> Tuple[str, str]: + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + """ + scheme = get_url_scheme(url) + + # Pip has special support for file:// URLs (LocalFSAdapter). + if scheme in ["http", "https", "file"]: + resp = session.get(url) + raise_for_status(resp) + return resp.url, resp.text + + # Assume this is a bare path. + try: + with open(url, "rb") as f: + content = auto_decode(f.read()) + except OSError as exc: + raise InstallationError(f"Could not open requirements file: {exc}") + return url, content diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/req_install.py b/python/lib/python3.10/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..02dbda1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,858 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import functools +import logging +import os +import shutil +import sys +import uuid +import zipfile +from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError, LegacyInstallFailure +from pip._internal.locations import get_scheme +from pip._internal.metadata import ( + BaseDistribution, + get_default_environment, + get_directory_distribution, +) +from pip._internal.models.link import Link +from pip._internal.operations.build.metadata import generate_metadata +from pip._internal.operations.build.metadata_editable import generate_editable_metadata +from pip._internal.operations.build.metadata_legacy import ( + generate_metadata as generate_metadata_legacy, +) +from pip._internal.operations.install.editable_legacy import ( + install_editable as install_editable_legacy, +) +from pip._internal.operations.install.legacy import install as install_legacy +from pip._internal.operations.install.wheel import install_wheel +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.direct_url_helpers import ( + direct_url_for_editable, + direct_url_from_link, +) +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.misc import ( + ask_path_exists, + backup_dir, + display_path, + hide_url, + redact_auth_from_url, +) +from pip._internal.utils.packaging import safe_extra +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.virtualenv import running_under_virtualenv +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +class InstallRequirement: + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req: Optional[Requirement], + comes_from: Optional[Union[str, "InstallRequirement"]], + editable: bool = False, + link: Optional[Link] = None, + markers: Optional[Marker] = None, + use_pep517: Optional[bool] = None, + isolated: bool = False, + install_options: Optional[List[str]] = None, + global_options: Optional[List[str]] = None, + hash_options: Optional[Dict[str, List[str]]] = None, + constraint: bool = False, + extras: Collection[str] = (), + user_supplied: bool = False, + permit_editable_wheels: bool = False, + ) -> None: + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + self.editable = editable + self.permit_editable_wheels = permit_editable_wheels + self.legacy_install_reason: Optional[int] = None + + # source_dir is the local directory where the linked requirement is + # located, or unpacked. In case unpacking is needed, creating and + # populating source_dir is done by the RequirementPreparer. Note this + # is not necessarily the directory where pyproject.toml or setup.py is + # located - that one is obtained via unpacked_source_directory. + self.source_dir: Optional[str] = None + if self.editable: + assert link + if link.is_file: + self.source_dir = os.path.normpath(os.path.abspath(link.file_path)) + + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + self.original_link_is_in_wheel_cache = False + + # Path to any downloaded or already-existing package. + self.local_file_path: Optional[str] = None + if self.link and self.link.is_file: + self.local_file_path = self.link.file_path + + if extras: + self.extras = extras + elif req: + self.extras = {safe_extra(extra) for extra in req.extras} + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + # This holds the Distribution object if this requirement is already installed. + self.satisfied_by: Optional[BaseDistribution] = None + # Whether the installation process should try to uninstall an existing + # distribution before installing this requirement. + self.should_reinstall = False + # Temporary build location + self._temp_build_dir: Optional[TempDirectory] = None + # Set to True after successful installation + self.install_succeeded: Optional[bool] = None + # Supplied options + self.install_options = install_options if install_options else [] + self.global_options = global_options if global_options else [] + self.hash_options = hash_options if hash_options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + # User supplied requirement are explicitly requested for installation + # by the user via CLI arguments or requirements files, as opposed to, + # e.g. dependencies, extras or constraints. + self.user_supplied = user_supplied + + self.isolated = isolated + self.build_env: BuildEnvironment = NoOpBuildEnvironment() + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory: Optional[str] = None + + # The static build requirements (from pyproject.toml) + self.pyproject_requires: Optional[List[str]] = None + + # Build requirements that we will check are available + self.requirements_to_check: List[str] = [] + + # The PEP 517 backend we should use to build the project + self.pep517_backend: Optional[Pep517HookCaller] = None + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + # This requirement needs more preparation before it can be built + self.needs_more_preparation = False + + def __str__(self) -> str: + if self.req: + s = str(self.req) + if self.link: + s += " from {}".format(redact_auth_from_url(self.link.url)) + elif self.link: + s = redact_auth_from_url(self.link.url) + else: + s = "" + if self.satisfied_by is not None: + s += " in {}".format(display_path(self.satisfied_by.location)) + if self.comes_from: + if isinstance(self.comes_from, str): + comes_from: Optional[str] = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += f" (from {comes_from})" + return s + + def __repr__(self) -> str: + return "<{} object: {} editable={!r}>".format( + self.__class__.__name__, str(self), self.editable + ) + + def format_debug(self) -> str: + """An un-tested helper for getting state, for debugging.""" + attributes = vars(self) + names = sorted(attributes) + + state = ("{}={!r}".format(attr, attributes[attr]) for attr in sorted(names)) + return "<{name} object: {{{state}}}>".format( + name=self.__class__.__name__, + state=", ".join(state), + ) + + # Things that are valid for all kinds of requirements? + @property + def name(self) -> Optional[str]: + if self.req is None: + return None + return self.req.name + + @functools.lru_cache() # use cached_property in python 3.8+ + def supports_pyproject_editable(self) -> bool: + if not self.use_pep517: + return False + assert self.pep517_backend + with self.build_env: + runner = runner_with_spinner_message( + "Checking if build backend supports build_editable" + ) + with self.pep517_backend.subprocess_runner(runner): + return "build_editable" in self.pep517_backend._supported_features() + + @property + def specifier(self) -> SpecifierSet: + return self.req.specifier + + @property + def is_pinned(self) -> bool: + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="} + + def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool: + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ("",) + if self.markers is not None: + return any( + self.markers.evaluate({"extra": extra}) for extra in extras_requested + ) + else: + return True + + @property + def has_hash_options(self) -> bool: + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.hash_options) + + def hashes(self, trust_internet: bool = True) -> Hashes: + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.hash_options.copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self) -> Optional[str]: + """Format a nice indicator to show where this "comes from" """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, str): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += "->" + comes_from + return s + + def ensure_build_location( + self, build_dir: str, autodelete: bool, parallel_builds: bool + ) -> str: + assert build_dir is not None + if self._temp_build_dir is not None: + assert self._temp_build_dir.path + return self._temp_build_dir.path + if self.req is None: + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = TempDirectory( + kind=tempdir_kinds.REQ_BUILD, globally_managed=True + ) + + return self._temp_build_dir.path + + # This is the only remaining place where we manually determine the path + # for the temporary directory. It is only needed for editables where + # it is the value of the --src option. + + # When parallel builds are enabled, add a UUID to the build directory + # name so multiple builds do not interfere with each other. + dir_name: str = canonicalize_name(self.name) + if parallel_builds: + dir_name = f"{dir_name}_{uuid.uuid4().hex}" + + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug("Creating directory %s", build_dir) + os.makedirs(build_dir) + actual_build_dir = os.path.join(build_dir, dir_name) + # `None` indicates that we respect the globally-configured deletion + # settings, which is what we actually want when auto-deleting. + delete_arg = None if autodelete else False + return TempDirectory( + path=actual_build_dir, + delete=delete_arg, + kind=tempdir_kinds.REQ_BUILD, + globally_managed=True, + ).path + + def _set_requirement(self) -> None: + """Set requirement after generating metadata.""" + assert self.req is None + assert self.metadata is not None + assert self.source_dir is not None + + # Construct a Requirement object from the generated metadata + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + + self.req = Requirement( + "".join( + [ + self.metadata["Name"], + op, + self.metadata["Version"], + ] + ) + ) + + def warn_on_mismatching_name(self) -> None: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) == metadata_name: + # Everything is fine. + return + + # If we're here, there's a mismatch. Log a warning about it. + logger.warning( + "Generating metadata for package %s " + "produced metadata for project name %s. Fix your " + "#egg=%s fragments.", + self.name, + metadata_name, + self.name, + ) + self.req = Requirement(metadata_name) + + def check_if_exists(self, use_user_site: bool) -> None: + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.should_reinstall appropriately. + """ + if self.req is None: + return + existing_dist = get_default_environment().get_distribution(self.req.name) + if not existing_dist: + return + + version_compatible = self.req.specifier.contains( + existing_dist.version, + prereleases=True, + ) + if not version_compatible: + self.satisfied_by = None + if use_user_site: + if existing_dist.in_usersite: + self.should_reinstall = True + elif running_under_virtualenv() and existing_dist.in_site_packages: + raise InstallationError( + f"Will not install to the user site because it will " + f"lack sys.path precedence to {existing_dist.raw_name} " + f"in {existing_dist.location}" + ) + else: + self.should_reinstall = True + else: + if self.editable: + self.should_reinstall = True + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + else: + self.satisfied_by = existing_dist + + # Things valid for wheels + @property + def is_wheel(self) -> bool: + if not self.link: + return False + return self.link.is_wheel + + # Things valid for sdists + @property + def unpacked_source_directory(self) -> str: + return os.path.join( + self.source_dir, self.link and self.link.subdirectory_fragment or "" + ) + + @property + def setup_py_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_py = os.path.join(self.unpacked_source_directory, "setup.py") + + return setup_py + + @property + def setup_cfg_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg") + + return setup_cfg + + @property + def pyproject_toml_path(self) -> str: + assert self.source_dir, f"No source dir for {self}" + return make_pyproject_path(self.unpacked_source_directory) + + def load_pyproject_toml(self) -> None: + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pyproject_toml_data = load_pyproject_toml( + self.use_pep517, self.pyproject_toml_path, self.setup_py_path, str(self) + ) + + if pyproject_toml_data is None: + self.use_pep517 = False + return + + self.use_pep517 = True + requires, backend, check, backend_path = pyproject_toml_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller( + self.unpacked_source_directory, + backend, + backend_path=backend_path, + ) + + def isolated_editable_sanity_check(self) -> None: + """Check that an editable requirement if valid for use with PEP 517/518. + + This verifies that an editable that has a pyproject.toml either supports PEP 660 + or as a setup.py or a setup.cfg + """ + if ( + self.editable + and self.use_pep517 + and not self.supports_pyproject_editable() + and not os.path.isfile(self.setup_py_path) + and not os.path.isfile(self.setup_cfg_path) + ): + raise InstallationError( + f"Project {self} has a 'pyproject.toml' and its build " + f"backend is missing the 'build_editable' hook. Since it does not " + f"have a 'setup.py' nor a 'setup.cfg', " + f"it cannot be installed in editable mode. " + f"Consider using a build backend that supports PEP 660." + ) + + def prepare_metadata(self) -> None: + """Ensure that project metadata is available. + + Under PEP 517 and PEP 660, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + details = self.name or f"from {self.link}" + + if self.use_pep517: + assert self.pep517_backend is not None + if ( + self.editable + and self.permit_editable_wheels + and self.supports_pyproject_editable() + ): + self.metadata_directory = generate_editable_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + details=details, + ) + else: + self.metadata_directory = generate_metadata_legacy( + build_env=self.build_env, + setup_py_path=self.setup_py_path, + source_dir=self.unpacked_source_directory, + isolated=self.isolated, + details=details, + ) + + # Act on the newly generated metadata, based on the name and version. + if not self.name: + self._set_requirement() + else: + self.warn_on_mismatching_name() + + self.assert_source_matches_version() + + @property + def metadata(self) -> Any: + if not hasattr(self, "_metadata"): + self._metadata = self.get_dist().metadata + + return self._metadata + + def get_dist(self) -> BaseDistribution: + return get_directory_distribution(self.metadata_directory) + + def assert_source_matches_version(self) -> None: + assert self.source_dir + version = self.metadata["version"] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + "Requested %s, but installing version %s", + self, + version, + ) + else: + logger.debug( + "Source in %s has version %s, which satisfies requirement %s", + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir( + self, + parent_dir: str, + autodelete: bool = False, + parallel_builds: bool = False, + ) -> None: + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.ensure_build_location( + parent_dir, + autodelete=autodelete, + parallel_builds=parallel_builds, + ) + + # For editable installations + def update_editable(self) -> None: + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == "file": + # Static paths don't get updated + return + vcs_backend = vcs.get_backend_for_scheme(self.link.scheme) + # Editable requirements are validated in Requirement constructors. + # So here, if it's neither a path nor a valid VCS URL, it's a bug. + assert vcs_backend, f"Unsupported VCS URL {self.link.url}" + hidden_url = hide_url(self.link.url) + vcs_backend.obtain(self.source_dir, url=hidden_url, verbosity=0) + + # Top-level Actions + def uninstall( + self, auto_confirm: bool = False, verbose: bool = False + ) -> Optional[UninstallPathSet]: + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + assert self.req + dist = get_default_environment().get_distribution(self.req.name) + if not dist: + logger.warning("Skipping %s as it is not installed.", self.name) + return None + logger.info("Found existing installation: %s", dist) + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _get_archive_name(self, path: str, parentdir: str, rootdir: str) -> str: + def _clean_zip_name(name: str, prefix: str) -> str: + assert name.startswith( + prefix + os.path.sep + ), f"name {name!r} doesn't start with prefix {prefix!r}" + name = name[len(prefix) + 1 :] + name = name.replace(os.path.sep, "/") + return name + + path = os.path.join(parentdir, path) + name = _clean_zip_name(path, rootdir) + return self.name + "/" + name + + def archive(self, build_dir: Optional[str]) -> None: + """Saves archive to provided build_dir. + + Used for saving downloaded VCS requirements as part of `pip download`. + """ + assert self.source_dir + if build_dir is None: + return + + create_archive = True + archive_name = "{}-{}.zip".format(self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + + if os.path.exists(archive_path): + response = ask_path_exists( + "The file {} exists. (i)gnore, (w)ipe, " + "(b)ackup, (a)bort ".format(display_path(archive_path)), + ("i", "w", "b", "a"), + ) + if response == "i": + create_archive = False + elif response == "w": + logger.warning("Deleting %s", display_path(archive_path)) + os.remove(archive_path) + elif response == "b": + dest_file = backup_dir(archive_path) + logger.warning( + "Backing up %s to %s", + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == "a": + sys.exit(-1) + + if not create_archive: + return + + zip_output = zipfile.ZipFile( + archive_path, + "w", + zipfile.ZIP_DEFLATED, + allowZip64=True, + ) + with zip_output: + dir = os.path.normcase(os.path.abspath(self.unpacked_source_directory)) + for dirpath, dirnames, filenames in os.walk(dir): + for dirname in dirnames: + dir_arcname = self._get_archive_name( + dirname, + parentdir=dirpath, + rootdir=dir, + ) + zipdir = zipfile.ZipInfo(dir_arcname + "/") + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip_output.writestr(zipdir, "") + for filename in filenames: + file_arcname = self._get_archive_name( + filename, + parentdir=dirpath, + rootdir=dir, + ) + filename = os.path.join(dirpath, filename) + zip_output.write(filename, file_arcname) + + logger.info("Saved %s", display_path(archive_path)) + + def install( + self, + install_options: List[str], + global_options: Optional[Sequence[str]] = None, + root: Optional[str] = None, + home: Optional[str] = None, + prefix: Optional[str] = None, + warn_script_location: bool = True, + use_user_site: bool = False, + pycompile: bool = True, + ) -> None: + scheme = get_scheme( + self.name, + user=use_user_site, + home=home, + root=root, + isolated=self.isolated, + prefix=prefix, + ) + + global_options = global_options if global_options is not None else [] + if self.editable and not self.is_wheel: + install_editable_legacy( + install_options, + global_options, + prefix=prefix, + home=home, + use_user_site=use_user_site, + name=self.name, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + ) + self.install_succeeded = True + return + + if self.is_wheel: + assert self.local_file_path + direct_url = None + if self.editable: + direct_url = direct_url_for_editable(self.unpacked_source_directory) + elif self.original_link: + direct_url = direct_url_from_link( + self.original_link, + self.source_dir, + self.original_link_is_in_wheel_cache, + ) + install_wheel( + self.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=direct_url, + requested=self.user_supplied, + ) + self.install_succeeded = True + return + + # TODO: Why don't we do this for editable installs? + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + self.global_options + install_options = list(install_options) + self.install_options + + try: + success = install_legacy( + install_options=install_options, + global_options=global_options, + root=root, + home=home, + prefix=prefix, + use_user_site=use_user_site, + pycompile=pycompile, + scheme=scheme, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + req_name=self.name, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + req_description=str(self.req), + ) + except LegacyInstallFailure as exc: + self.install_succeeded = False + raise exc + except Exception: + self.install_succeeded = True + raise + + self.install_succeeded = success + + if success and self.legacy_install_reason == 8368: + deprecated( + reason=( + "{} was installed using the legacy 'setup.py install' " + "method, because a wheel could not be built for it.".format( + self.name + ) + ), + replacement="to fix the wheel build issue reported above", + gone_in=None, + issue=8368, + ) + + +def check_invalid_constraint_type(req: InstallRequirement) -> str: + + # Check for unsupported forms + problem = "" + if not req.name: + problem = "Unnamed requirements are not allowed as constraints" + elif req.editable: + problem = "Editable requirements are not allowed as constraints" + elif req.extras: + problem = "Constraints cannot have extras" + + if problem: + deprecated( + reason=( + "Constraints are only allowed to take the form of a package " + "name and a version specifier. Other forms were originally " + "permitted as an accident of the implementation, but were " + "undocumented. The new implementation of the resolver no " + "longer supports these forms." + ), + replacement="replacing the constraint with a requirement", + # No plan yet for when the new resolver becomes default + gone_in=None, + issue=8210, + ) + + return problem diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/req_set.py b/python/lib/python3.10/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..6626c37 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,189 @@ +import logging +from collections import OrderedDict +from typing import Dict, Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InstallationError +from pip._internal.models.wheel import Wheel +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils import compatibility_tags + +logger = logging.getLogger(__name__) + + +class RequirementSet: + def __init__(self, check_supported_wheels: bool = True) -> None: + """Create a RequirementSet.""" + + self.requirements: Dict[str, InstallRequirement] = OrderedDict() + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements: List[InstallRequirement] = [] + + def __str__(self) -> str: + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name or ""), + ) + return " ".join(str(req.req) for req in requirements) + + def __repr__(self) -> str: + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name or ""), + ) + + format_string = "<{classname} object; {count} requirement(s): {reqs}>" + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=", ".join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req: InstallRequirement) -> None: + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req: InstallRequirement) -> None: + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def add_requirement( + self, + install_req: InstallRequirement, + parent_req_name: Optional[str] = None, + extras_requested: Optional[Iterable[str]] = None, + ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]: + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, + install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = compatibility_tags.get_supported() + if self.check_supported_wheels and not wheel.supported(tags): + raise InstallationError( + "{} is not a supported wheel on this platform.".format( + wheel.filename + ) + ) + + # This next bit is really a sanity check. + assert ( + not install_req.user_supplied or parent_req_name is None + ), "a user supplied req shouldn't have a parent" + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + self.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req: Optional[InstallRequirement] = self.get_requirement( + install_req.name + ) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None + and existing_req + and not existing_req.constraint + and existing_req.extras == install_req.extras + and existing_req.req + and install_req.req + and existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: {} (already in {}, name={!r})".format( + install_req, existing_req, install_req.name + ) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = install_req.link and not ( + existing_req.link and install_req.link.path == existing_req.link.path + ) + if does_not_satisfy_constraint: + raise InstallationError( + "Could not satisfy constraints for '{}': " + "installation from path or url cannot be " + "constrained to a version".format(install_req.name) + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + # If we're now installing a user supplied requirement, + # mark the existing object as such. + if install_req.user_supplied: + existing_req.user_supplied = True + existing_req.extras = tuple( + sorted(set(existing_req.extras) | set(install_req.extras)) + ) + logger.debug( + "Setting %s extras to: %s", + existing_req, + existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, name: str) -> bool: + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements + and not self.requirements[project_name].constraint + ) + + def get_requirement(self, name: str) -> InstallRequirement: + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError(f"No project with the name {name!r}") + + @property + def all_requirements(self) -> List[InstallRequirement]: + return self.unnamed_requirements + list(self.requirements.values()) diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py b/python/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..24d3c53 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,124 @@ +import contextlib +import hashlib +import logging +import os +from types import TracebackType +from typing import Dict, Iterator, Optional, Set, Type, Union + +from pip._internal.models.link import Link +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +@contextlib.contextmanager +def update_env_context_manager(**changes: str) -> Iterator[None]: + target = os.environ + + # Save values from the target and change them. + non_existent_marker = object() + saved_values: Dict[str, Union[object, str]] = {} + for name, new_value in changes.items(): + try: + saved_values[name] = target[name] + except KeyError: + saved_values[name] = non_existent_marker + target[name] = new_value + + try: + yield + finally: + # Restore original values in the target. + for name, original_value in saved_values.items(): + if original_value is non_existent_marker: + del target[name] + else: + assert isinstance(original_value, str) # for mypy + target[name] = original_value + + +@contextlib.contextmanager +def get_requirement_tracker() -> Iterator["RequirementTracker"]: + root = os.environ.get("PIP_REQ_TRACKER") + with contextlib.ExitStack() as ctx: + if root is None: + root = ctx.enter_context(TempDirectory(kind="req-tracker")).path + ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root)) + logger.debug("Initialized build tracking at %s", root) + + with RequirementTracker(root) as tracker: + yield tracker + + +class RequirementTracker: + def __init__(self, root: str) -> None: + self._root = root + self._entries: Set[InstallRequirement] = set() + logger.debug("Created build tracker: %s", self._root) + + def __enter__(self) -> "RequirementTracker": + logger.debug("Entered build tracker: %s", self._root) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.cleanup() + + def _entry_path(self, link: Link) -> str: + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req: InstallRequirement) -> None: + """Add an InstallRequirement to build tracking.""" + + assert req.link + # Get the file to write information about this requirement. + entry_path = self._entry_path(req.link) + + # Try reading from the file. If it exists and can be read from, a build + # is already in progress, so a LookupError is raised. + try: + with open(entry_path) as fp: + contents = fp.read() + except FileNotFoundError: + pass + else: + message = "{} is already being built: {}".format(req.link, contents) + raise LookupError(message) + + # If we're here, req should really not be building already. + assert req not in self._entries + + # Start tracking this requirement. + with open(entry_path, "w", encoding="utf-8") as fp: + fp.write(str(req)) + self._entries.add(req) + + logger.debug("Added %s to build tracker %r", req, self._root) + + def remove(self, req: InstallRequirement) -> None: + """Remove an InstallRequirement from build tracking.""" + + assert req.link + # Delete the created file and the corresponding entries. + os.unlink(self._entry_path(req.link)) + self._entries.remove(req) + + logger.debug("Removed %s from build tracker %r", req, self._root) + + def cleanup(self) -> None: + for req in set(self._entries): + self.remove(req) + + logger.debug("Removed build tracker: %r", self._root) + + @contextlib.contextmanager + def track(self, req: InstallRequirement) -> Iterator[None]: + self.add(req) + yield + self.remove(req) diff --git a/python/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py b/python/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..472090a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,633 @@ +import functools +import os +import sys +import sysconfig +from importlib.util import cache_from_source +from typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import get_bin_prefix, get_bin_user +from pip._internal.metadata import BaseDistribution +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.egg_link import egg_link_path_from_location +from pip._internal.utils.logging import getLogger, indent_log +from pip._internal.utils.misc import ask, is_local, normalize_path, renames, rmtree +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory + +logger = getLogger(__name__) + + +def _script_names(bin_dir: str, script_name: str, is_gui: bool) -> Iterator[str]: + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + exe_name = os.path.join(bin_dir, script_name) + yield exe_name + if not WINDOWS: + return + yield f"{exe_name}.exe" + yield f"{exe_name}.exe.manifest" + if is_gui: + yield f"{exe_name}-script.pyw" + else: + yield f"{exe_name}-script.py" + + +def _unique(fn: Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]]: + @functools.wraps(fn) + def unique(*args: Any, **kw: Any) -> Iterator[Any]: + seen: Set[Any] = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + + return unique + + +@_unique +def uninstallation_paths(dist: BaseDistribution) -> Iterator[str]: + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + + If RECORD is not found, raises UninstallationError, + with possible information from the INSTALLER file. + + https://packaging.python.org/specifications/recording-installed-packages/ + """ + location = dist.location + assert location is not None, "not installed" + + entries = dist.iter_declared_entries() + if entries is None: + msg = "Cannot uninstall {dist}, RECORD file not found.".format(dist=dist) + installer = dist.installer + if not installer or installer == "pip": + dep = "{}=={}".format(dist.raw_name, dist.version) + msg += ( + " You might be able to recover from this via: " + "'pip install --force-reinstall --no-deps {}'.".format(dep) + ) + else: + msg += " Hint: The package was installed by {}.".format(installer) + raise UninstallationError(msg) + + for entry in entries: + path = os.path.join(location, entry) + yield path + if path.endswith(".py"): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + ".pyc") + yield path + path = os.path.join(dn, base + ".pyo") + yield path + + +def compact(paths: Iterable[str]) -> Set[str]: + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths: Set[str] = set() + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) + and path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths: Iterable[str]) -> Set[str]: + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = {os.path.normcase(p): p for p in paths} + remaining = set(case_map) + unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len) + wildcards: Set[str] = set() + + def norm_join(*a: str) -> str: + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) for w in wildcards): + # This directory has already been handled. + continue + + all_files: Set[str] = set() + all_subdirs: Set[str] = set() + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) for d in subdirs) + all_files.update(norm_join(root, dirname, f) for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]: + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if ( + os.path.isfile(file_) + and os.path.normcase(file_) not in _normcased_files + ): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | {os.path.join(folder, "*") for folder in folders} + + return will_remove, will_skip + + +class StashedUninstallPathSet: + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + + def __init__(self) -> None: + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs: Dict[str, TempDirectory] = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves: List[Tuple[str, str]] = [] + + def _get_directory_stash(self, path: str) -> str: + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir: TempDirectory = AdjacentTempDirectory(path) + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path: str) -> str: + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path: str) -> str: + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if path_is_dir and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self) -> None: + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self) -> None: + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug("Replacing %s from %s", new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self) -> bool: + return bool(self._moves) + + +class UninstallPathSet: + """A set of file paths to be removed in the uninstallation of a + requirement.""" + + def __init__(self, dist: BaseDistribution) -> None: + self._paths: Set[str] = set() + self._refuse: Set[str] = set() + self._pth: Dict[str, UninstallPthEntries] = {} + self._dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path: str) -> bool: + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path: str) -> None: + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self._paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == ".py": + self.add(cache_from_source(path)) + + def add_pth(self, pth_file: str, entry: str) -> None: + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self._pth: + self._pth[pth_file] = UninstallPthEntries(pth_file) + self._pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None: + """Remove paths in ``self._paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self._paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self._dist.raw_name, + ) + return + + dist_name_version = f"{self._dist.raw_name}-{self._dist.version}" + logger.info("Uninstalling %s:", dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self._paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.verbose("Removing file or directory %s", path) + + for pth in self._pth.values(): + pth.remove() + + logger.info("Successfully uninstalled %s", dist_name_version) + + def _allowed_to_proceed(self, verbose: bool) -> bool: + """Display which files would be deleted and prompt for confirmation""" + + def _display(msg: str, paths: Iterable[str]) -> None: + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self._paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self._paths) + will_skip = set() + + _display("Would remove:", will_remove) + _display("Would not remove (might be manually added):", will_skip) + _display("Would not remove (outside of prefix):", self._refuse) + if verbose: + _display("Will actually move:", compress_for_rename(self._paths)) + + return ask("Proceed (Y/n)? ", ("y", "n", "")) != "n" + + def rollback(self) -> None: + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self._dist.raw_name, + ) + return + logger.info("Rolling back uninstall of %s", self._dist.raw_name) + self._moved_paths.rollback() + for pth in self._pth.values(): + pth.rollback() + + def commit(self) -> None: + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet": + dist_location = dist.location + info_location = dist.info_location + if dist_location is None: + logger.info( + "Not uninstalling %s since it is not installed", + dist.canonical_name, + ) + return cls(dist) + + normalized_dist_location = normalize_path(dist_location) + if not dist.local: + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.canonical_name, + normalized_dist_location, + sys.prefix, + ) + return cls(dist) + + if normalized_dist_location in { + p + for p in {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")} + if p + }: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.canonical_name, + normalized_dist_location, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path_from_location(dist.raw_name) + + # Distribution is installed with metadata in a "flat" .egg-info + # directory. This means it is not a modern .dist-info installation, an + # egg, or legacy editable. + setuptools_flat_installation = ( + dist.installed_with_setuptools_egg_info + and info_location is not None + and os.path.exists(info_location) + # If dist is editable and the location points to a ``.egg-info``, + # we are in fact in the legacy editable case. + and not info_location.endswith(f"{dist.setuptools_filename}.egg-info") + ) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if setuptools_flat_installation: + if info_location is not None: + paths_to_remove.add(info_location) + installed_files = dist.iter_declared_entries() + if installed_files is not None: + for installed_file in installed_files: + paths_to_remove.add(os.path.join(dist_location, installed_file)) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.is_file("top_level.txt"): + try: + namespace_packages = dist.read_text("namespace_packages.txt") + except FileNotFoundError: + namespaces = [] + else: + namespaces = namespace_packages.splitlines(keepends=False) + for top_level_pkg in [ + p + for p in dist.read_text("top_level.txt").splitlines() + if p and p not in namespaces + ]: + path = os.path.join(dist_location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(f"{path}.py") + paths_to_remove.add(f"{path}.pyc") + paths_to_remove.add(f"{path}.pyo") + + elif dist.installed_by_distutils: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.raw_name, + ) + ) + + elif dist.installed_as_egg: + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist_location) + easy_install_egg = os.path.split(dist_location)[1] + easy_install_pth = os.path.join( + os.path.dirname(dist_location), + "easy-install.pth", + ) + paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg) + + elif dist.installed_with_dist_info: + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # PEP 660 modern editable is handled in the ``.dist-info`` case + # above, so this only covers the setuptools-style editable. + with open(develop_egg_link) as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert link_pointer == dist_location, ( + f"Egg-link {link_pointer} does not match installed location of " + f"{dist.raw_name} (at {dist_location})" + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join( + os.path.dirname(develop_egg_link), "easy-install.pth" + ) + paths_to_remove.add_pth(easy_install_pth, dist_location) + + else: + logger.debug( + "Not sure how to uninstall: %s - Check: %s", + dist, + dist_location, + ) + + if dist.in_usersite: + bin_dir = get_bin_user() + else: + bin_dir = get_bin_prefix() + + # find distutils scripts= scripts + try: + for script in dist.iterdir("scripts"): + paths_to_remove.add(os.path.join(bin_dir, script.name)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, f"{script.name}.bat")) + except (FileNotFoundError, NotADirectoryError): + pass + + # find console_scripts and gui_scripts + def iter_scripts_to_remove( + dist: BaseDistribution, + bin_dir: str, + ) -> Iterator[str]: + for entry_point in dist.iter_entry_points(): + if entry_point.group == "console_scripts": + yield from _script_names(bin_dir, entry_point.name, False) + elif entry_point.group == "gui_scripts": + yield from _script_names(bin_dir, entry_point.name, True) + + for s in iter_scripts_to_remove(dist, bin_dir): + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries: + def __init__(self, pth_file: str) -> None: + self.file = pth_file + self.entries: Set[str] = set() + self._saved_lines: Optional[List[bytes]] = None + + def add(self, entry: str) -> None: + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace("\\", "/") + self.entries.add(entry) + + def remove(self) -> None: + logger.verbose("Removing pth entries from %s:", self.file) + + # If the file doesn't exist, log a warning and return + if not os.path.isfile(self.file): + logger.warning("Cannot remove entries from nonexistent file %s", self.file) + return + with open(self.file, "rb") as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b"\r\n" in line for line in lines): + endline = "\r\n" + else: + endline = "\n" + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.verbose("Removing entry: %s", entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, "wb") as fh: + fh.writelines(lines) + + def rollback(self) -> bool: + if self._saved_lines is None: + logger.error("Cannot roll back changes to %s, none were made", self.file) + return False + logger.debug("Rolling %s back to previous state", self.file) + with open(self.file, "wb") as fh: + fh.writelines(self._saved_lines) + return True diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/base.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/base.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/base.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/base.py diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py new file mode 100644 index 0000000..8c149d4 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py @@ -0,0 +1,467 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import logging +import sys +from collections import defaultdict +from itertools import chain +from typing import DefaultDict, Iterable, List, Optional, Set, Tuple + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.requirements import Requirement + +from pip._internal.cache import WheelCache +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + HashError, + HashErrors, + NoneMetadataError, + UnsupportedPythonVersion, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution +from pip._internal.models.link import Link +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.req_install import ( + InstallRequirement, + check_invalid_constraint_type, +) +from pip._internal.req.req_set import RequirementSet +from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider +from pip._internal.utils.compatibility_tags import get_supported +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import normalize_version_info +from pip._internal.utils.packaging import check_requires_python + +logger = logging.getLogger(__name__) + +DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] + + +def _check_dist_requires_python( + dist: BaseDistribution, + version_info: Tuple[int, int, int], + ignore_requires_python: bool = False, +) -> None: + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + # This idiosyncratically converts the SpecifierSet to str and let + # check_requires_python then parse it again into SpecifierSet. But this + # is the legacy resolver so I'm just not going to bother refactoring. + try: + requires_python = str(dist.requires_python) + except FileNotFoundError as e: + raise NoneMetadataError(dist, str(e)) + try: + is_compatible = check_requires_python( + requires_python, + version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", dist.raw_name, exc + ) + return + + if is_compatible: + return + + version = ".".join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + "Ignoring failed Requires-Python check for package %r: %s not in %r", + dist.raw_name, + version, + requires_python, + ) + return + + raise UnsupportedPythonVersion( + "Package {!r} requires a different Python: {} not in {!r}".format( + dist.raw_name, version, requires_python + ) + ) + + +class Resolver(BaseResolver): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + self.wheel_cache = wheel_cache + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies: DiscoveredDependencies = defaultdict(list) + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + requirement_set = RequirementSet(check_supported_wheels=check_supported_wheels) + for req in root_reqs: + if req.constraint: + check_invalid_constraint_type(req) + requirement_set.add_requirement(req) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # _populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs: List[InstallRequirement] = [] + hash_errors = HashErrors() + for req in chain(requirement_set.all_requirements, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + return requirement_set + + def _is_upgrade_allowed(self, req: InstallRequirement) -> bool: + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.user_supplied or req.constraint + + def _set_req_to_reinstall(self, req: InstallRequirement) -> None: + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or req.satisfied_by.in_usersite: + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed( + self, req_to_install: InstallRequirement + ) -> Optional[str]: + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return "already satisfied, skipping upgrade" + return "already satisfied" + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return "already up-to-date" + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]: + upgrade = self._is_upgrade_allowed(req) + best_candidate = self.finder.find_requirement(req, upgrade) + if not best_candidate: + return None + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or "" + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + "The candidate selected for download or install is a " + "yanked version: {candidate}\n" + "Reason for being yanked: {reason}" + ).format(candidate=best_candidate, reason=reason) + logger.warning(msg) + + return link + + def _populate_link(self, req: InstallRequirement) -> None: + """Ensure that if a link can be found for this, that it is found. + + Note that req.link may still be None - if the requirement is already + installed and not needed to be upgraded based on the return value of + _is_upgrade_allowed(). + + If preparer.require_hashes is True, don't use the wheel cache, because + cached wheels, always built locally, have different hashes than the + files downloaded from the index server and thus throw false hash + mismatches. Furthermore, cached wheels at present have undeterministic + contents due to file modification times. + """ + if req.link is None: + req.link = self._find_requirement_link(req) + + if self.wheel_cache is None or self.preparer.require_hashes: + return + cache_entry = self.wheel_cache.get_cache_entry( + link=req.link, + package_name=req.name, + supported_tags=get_supported(), + ) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + if req.link is req.original_link and cache_entry.persistent: + req.original_link_is_in_wheel_cache = True + req.link = cache_entry.link + + def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution: + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement(req, skip_reason) + + # We eagerly populate the link, since that's our "legacy" behavior. + self._populate_link(req) + dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" + or self.force_reinstall + or self.ignore_installed + or req.link.scheme == "file" + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + "Requirement already satisfied (use --upgrade to upgrade): %s", + req, + ) + return dist + + def _resolve_one( + self, + requirement_set: RequirementSet, + req_to_install: InstallRequirement, + ) -> List[InstallRequirement]: + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # Parse and return dependencies + dist = self._get_dist_for(req_to_install) + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, + version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs: List[InstallRequirement] = [] + + def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None: + # This idiosyncratically converts the Requirement to str and let + # make_install_req then parse it again into Requirement. But this is + # the legacy resolver so I'm just not going to bother refactoring. + sub_install_req = self._make_install_req(str(subreq), req_to_install) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append(add_to_parent) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.user_supplied + requirement_set.add_requirement(req_to_install, parent_req_name=None) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ",".join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.iter_provided_extras()) + ) + for missing in missing_requested: + logger.warning( + "%s %s does not provide the extra '%s'", + dist.raw_name, + dist.version, + missing, + ) + + available_requested = sorted( + set(dist.iter_provided_extras()) & set(req_to_install.extras) + ) + for subreq in dist.iter_dependencies(available_requested): + add_req(subreq, extras_requested=available_requested) + + return more_reqs + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs: Set[InstallRequirement] = set() + + def schedule(req: InstallRequirement) -> None: + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py new file mode 100644 index 0000000..9b8450e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -0,0 +1,547 @@ +import logging +import sys +from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast + +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import ( + HashError, + InstallationSubprocessError, + MetadataInconsistent, +) +from pip._internal.metadata import BaseDistribution +from pip._internal.models.link import Link, links_equivalent +from pip._internal.models.wheel import Wheel +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.misc import normalize_version_info + +from .base import Candidate, CandidateVersion, Requirement, format_name + +if TYPE_CHECKING: + from .factory import Factory + +logger = logging.getLogger(__name__) + +BaseCandidate = Union[ + "AlreadyInstalledCandidate", + "EditableCandidate", + "LinkCandidate", +] + +# Avoid conflicting with the PyPI package "Python". +REQUIRES_PYTHON_IDENTIFIER = cast(NormalizedName, "") + + +def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]: + """The runtime version of BaseCandidate.""" + base_candidate_classes = ( + AlreadyInstalledCandidate, + EditableCandidate, + LinkCandidate, + ) + if isinstance(candidate, base_candidate_classes): + return candidate + return None + + +def make_install_req_from_link( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert not template.editable, "template is editable" + if template.req: + line = str(template.req) + else: + line = link.url + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options, + ), + ) + ireq.original_link = template.original_link + ireq.link = link + return ireq + + +def make_install_req_from_editable( + link: Link, template: InstallRequirement +) -> InstallRequirement: + assert template.editable, "template not editable" + return install_req_from_editable( + link.url, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + permit_editable_wheels=template.permit_editable_wheels, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options, + ), + ) + + +def _make_install_req_from_dist( + dist: BaseDistribution, template: InstallRequirement +) -> InstallRequirement: + if template.req: + line = str(template.req) + elif template.link: + line = f"{dist.canonical_name} @ {template.link.url}" + else: + line = f"{dist.canonical_name}=={dist.version}" + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options, + ), + ) + ireq.satisfied_by = dist + return ireq + + +class _InstallRequirementBackedCandidate(Candidate): + """A candidate backed by an ``InstallRequirement``. + + This represents a package request with the target not being already + in the environment, and needs to be fetched and installed. The backing + ``InstallRequirement`` is responsible for most of the leg work; this + class exposes appropriate information to the resolver. + + :param link: The link passed to the ``InstallRequirement``. The backing + ``InstallRequirement`` will use this link to fetch the distribution. + :param source_link: The link this candidate "originates" from. This is + different from ``link`` when the link is found in the wheel cache. + ``link`` would point to the wheel cache, while this points to the + found remote link (e.g. from pypi.org). + """ + + dist: BaseDistribution + is_installed = False + + def __init__( + self, + link: Link, + source_link: Link, + ireq: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + self._link = link + self._source_link = source_link + self._factory = factory + self._ireq = ireq + self._name = name + self._version = version + self.dist = self._prepare() + + def __str__(self) -> str: + return f"{self.name} {self.version}" + + def __repr__(self) -> str: + return "{class_name}({link!r})".format( + class_name=self.__class__.__name__, + link=str(self._link), + ) + + def __hash__(self) -> int: + return hash((self.__class__, self._link)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return links_equivalent(self._link, other._link) + return False + + @property + def source_link(self) -> Optional[Link]: + return self._source_link + + @property + def project_name(self) -> NormalizedName: + """The normalised name of the project the candidate refers to""" + if self._name is None: + self._name = self.dist.canonical_name + return self._name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> CandidateVersion: + if self._version is None: + self._version = self.dist.version + return self._version + + def format_for_error(self) -> str: + return "{} {} (from {})".format( + self.name, + self.version, + self._link.file_path if self._link.is_file else self._link, + ) + + def _prepare_distribution(self) -> BaseDistribution: + raise NotImplementedError("Override in subclass") + + def _check_metadata_consistency(self, dist: BaseDistribution) -> None: + """Check for consistency of project name and version of dist.""" + if self._name is not None and self._name != dist.canonical_name: + raise MetadataInconsistent( + self._ireq, + "name", + self._name, + dist.canonical_name, + ) + if self._version is not None and self._version != dist.version: + raise MetadataInconsistent( + self._ireq, + "version", + str(self._version), + str(dist.version), + ) + + def _prepare(self) -> BaseDistribution: + try: + dist = self._prepare_distribution() + except HashError as e: + # Provide HashError the underlying ireq that caused it. This + # provides context for the resulting error message to show the + # offending line to the user. + e.req = self._ireq + raise + except InstallationSubprocessError as exc: + # The output has been presented already, so don't duplicate it. + exc.context = "See above for output." + raise + + self._check_metadata_consistency(dist) + return dist + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + requires = self.dist.iter_dependencies() if with_requires else () + for r in requires: + yield self._factory.make_requirement_from_spec(str(r), self._ireq) + yield self._factory.make_requires_python_requirement(self.dist.requires_python) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return self._ireq + + +class LinkCandidate(_InstallRequirementBackedCandidate): + is_editable = False + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + source_link = link + cache_entry = factory.get_wheel_cache_entry(link, name) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + link = cache_entry.link + ireq = make_install_req_from_link(link, template) + assert ireq.link == link + if ireq.link.is_wheel and not ireq.link.is_file: + wheel = Wheel(ireq.link.filename) + wheel_name = canonicalize_name(wheel.name) + assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel" + # Version may not be present for PEP 508 direct URLs + if version is not None: + wheel_version = Version(wheel.version) + assert version == wheel_version, "{!r} != {!r} for wheel {}".format( + version, wheel_version, name + ) + + if ( + cache_entry is not None + and cache_entry.persistent + and template.link is template.original_link + ): + ireq.original_link_is_in_wheel_cache = True + + super().__init__( + link=link, + source_link=source_link, + ireq=ireq, + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + preparer = self._factory.preparer + return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True) + + +class EditableCandidate(_InstallRequirementBackedCandidate): + is_editable = True + + def __init__( + self, + link: Link, + template: InstallRequirement, + factory: "Factory", + name: Optional[NormalizedName] = None, + version: Optional[CandidateVersion] = None, + ) -> None: + super().__init__( + link=link, + source_link=link, + ireq=make_install_req_from_editable(link, template), + factory=factory, + name=name, + version=version, + ) + + def _prepare_distribution(self) -> BaseDistribution: + return self._factory.preparer.prepare_editable_requirement(self._ireq) + + +class AlreadyInstalledCandidate(Candidate): + is_installed = True + source_link = None + + def __init__( + self, + dist: BaseDistribution, + template: InstallRequirement, + factory: "Factory", + ) -> None: + self.dist = dist + self._ireq = _make_install_req_from_dist(dist, template) + self._factory = factory + + # This is just logging some messages, so we can do it eagerly. + # The returned dist would be exactly the same as self.dist because we + # set satisfied_by in _make_install_req_from_dist. + # TODO: Supply reason based on force_reinstall and upgrade_strategy. + skip_reason = "already satisfied" + factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) + + def __str__(self) -> str: + return str(self.dist) + + def __repr__(self) -> str: + return "{class_name}({distribution!r})".format( + class_name=self.__class__.__name__, + distribution=self.dist, + ) + + def __hash__(self) -> int: + return hash((self.__class__, self.name, self.version)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self.name == other.name and self.version == other.version + return False + + @property + def project_name(self) -> NormalizedName: + return self.dist.canonical_name + + @property + def name(self) -> str: + return self.project_name + + @property + def version(self) -> CandidateVersion: + return self.dist.version + + @property + def is_editable(self) -> bool: + return self.dist.editable + + def format_for_error(self) -> str: + return f"{self.name} {self.version} (Installed)" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + if not with_requires: + return + for r in self.dist.iter_dependencies(): + yield self._factory.make_requirement_from_spec(str(r), self._ireq) + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None + + +class ExtrasCandidate(Candidate): + """A candidate that has 'extras', indicating additional dependencies. + + Requirements can be for a project with dependencies, something like + foo[extra]. The extras don't affect the project/version being installed + directly, but indicate that we need additional dependencies. We model that + by having an artificial ExtrasCandidate that wraps the "base" candidate. + + The ExtrasCandidate differs from the base in the following ways: + + 1. It has a unique name, of the form foo[extra]. This causes the resolver + to treat it as a separate node in the dependency graph. + 2. When we're getting the candidate's dependencies, + a) We specify that we want the extra dependencies as well. + b) We add a dependency on the base candidate. + See below for why this is needed. + 3. We return None for the underlying InstallRequirement, as the base + candidate will provide it, and we don't want to end up with duplicates. + + The dependency on the base candidate is needed so that the resolver can't + decide that it should recommend foo[extra1] version 1.0 and foo[extra2] + version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 + respectively forces the resolver to recognise that this is a conflict. + """ + + def __init__( + self, + base: BaseCandidate, + extras: FrozenSet[str], + ) -> None: + self.base = base + self.extras = extras + + def __str__(self) -> str: + name, rest = str(self.base).split(" ", 1) + return "{}[{}] {}".format(name, ",".join(self.extras), rest) + + def __repr__(self) -> str: + return "{class_name}(base={base!r}, extras={extras!r})".format( + class_name=self.__class__.__name__, + base=self.base, + extras=self.extras, + ) + + def __hash__(self) -> int: + return hash((self.base, self.extras)) + + def __eq__(self, other: Any) -> bool: + if isinstance(other, self.__class__): + return self.base == other.base and self.extras == other.extras + return False + + @property + def project_name(self) -> NormalizedName: + return self.base.project_name + + @property + def name(self) -> str: + """The normalised name of the project the candidate refers to""" + return format_name(self.base.project_name, self.extras) + + @property + def version(self) -> CandidateVersion: + return self.base.version + + def format_for_error(self) -> str: + return "{} [{}]".format( + self.base.format_for_error(), ", ".join(sorted(self.extras)) + ) + + @property + def is_installed(self) -> bool: + return self.base.is_installed + + @property + def is_editable(self) -> bool: + return self.base.is_editable + + @property + def source_link(self) -> Optional[Link]: + return self.base.source_link + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + factory = self.base._factory + + # Add a dependency on the exact base + # (See note 2b in the class docstring) + yield factory.make_requirement_from_candidate(self.base) + if not with_requires: + return + + # The user may have specified extras that the candidate doesn't + # support. We ignore any unsupported extras here. + valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras()) + invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras()) + for extra in sorted(invalid_extras): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra, + ) + + for r in self.base.dist.iter_dependencies(valid_extras): + requirement = factory.make_requirement_from_spec( + str(r), self.base._ireq, valid_extras + ) + if requirement: + yield requirement + + def get_install_requirement(self) -> Optional[InstallRequirement]: + # We don't return anything here, because we always + # depend on the base candidate, and we'll get the + # install requirement from that. + return None + + +class RequiresPythonCandidate(Candidate): + is_installed = False + source_link = None + + def __init__(self, py_version_info: Optional[Tuple[int, ...]]) -> None: + if py_version_info is not None: + version_info = normalize_version_info(py_version_info) + else: + version_info = sys.version_info[:3] + self._version = Version(".".join(str(c) for c in version_info)) + + # We don't need to implement __eq__() and __ne__() since there is always + # only one RequiresPythonCandidate in a resolution, i.e. the host Python. + # The built-in object.__eq__() and object.__ne__() do exactly what we want. + + def __str__(self) -> str: + return f"Python {self._version}" + + @property + def project_name(self) -> NormalizedName: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def name(self) -> str: + return REQUIRES_PYTHON_IDENTIFIER + + @property + def version(self) -> CandidateVersion: + return self._version + + def format_for_error(self) -> str: + return f"Python {self.version}" + + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: + return () + + def get_install_requirement(self) -> Optional[InstallRequirement]: + return None diff --git a/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py new file mode 100644 index 0000000..261d8d5 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -0,0 +1,739 @@ +import contextlib +import functools +import logging +from typing import ( + TYPE_CHECKING, + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Mapping, + NamedTuple, + Optional, + Sequence, + Set, + Tuple, + TypeVar, + cast, +) + +from pip._vendor.packaging.requirements import InvalidRequirement +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.resolvelib import ResolutionImpossible + +from pip._internal.cache import CacheEntry, WheelCache +from pip._internal.exceptions import ( + DistributionNotFound, + InstallationError, + InstallationSubprocessError, + MetadataInconsistent, + UnsupportedPythonVersion, + UnsupportedWheel, +) +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import BaseDistribution, get_default_environment +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import install_req_from_link_and_ireq +from pip._internal.req.req_install import ( + InstallRequirement, + check_invalid_constraint_type, +) +from pip._internal.resolution.base import InstallRequirementProvider +from pip._internal.utils.compatibility_tags import get_supported +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.packaging import get_requirement +from pip._internal.utils.virtualenv import running_under_virtualenv + +from .base import Candidate, CandidateVersion, Constraint, Requirement +from .candidates import ( + AlreadyInstalledCandidate, + BaseCandidate, + EditableCandidate, + ExtrasCandidate, + LinkCandidate, + RequiresPythonCandidate, + as_base_candidate, +) +from .found_candidates import FoundCandidates, IndexCandidateInfo +from .requirements import ( + ExplicitRequirement, + RequiresPythonRequirement, + SpecifierRequirement, + UnsatisfiableRequirement, +) + +if TYPE_CHECKING: + from typing import Protocol + + class ConflictCause(Protocol): + requirement: RequiresPythonRequirement + parent: Candidate + + +logger = logging.getLogger(__name__) + +C = TypeVar("C") +Cache = Dict[Link, C] + + +class CollectedRootRequirements(NamedTuple): + requirements: List[Requirement] + constraints: Dict[str, Constraint] + user_requested: Dict[str, int] + + +class Factory: + def __init__( + self, + finder: PackageFinder, + preparer: RequirementPreparer, + make_install_req: InstallRequirementProvider, + wheel_cache: Optional[WheelCache], + use_user_site: bool, + force_reinstall: bool, + ignore_installed: bool, + ignore_requires_python: bool, + suppress_build_failures: bool, + py_version_info: Optional[Tuple[int, ...]] = None, + ) -> None: + self._finder = finder + self.preparer = preparer + self._wheel_cache = wheel_cache + self._python_candidate = RequiresPythonCandidate(py_version_info) + self._make_install_req_from_spec = make_install_req + self._use_user_site = use_user_site + self._force_reinstall = force_reinstall + self._ignore_requires_python = ignore_requires_python + self._suppress_build_failures = suppress_build_failures + + self._build_failures: Cache[InstallationError] = {} + self._link_candidate_cache: Cache[LinkCandidate] = {} + self._editable_candidate_cache: Cache[EditableCandidate] = {} + self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {} + self._extras_candidate_cache: Dict[ + Tuple[int, FrozenSet[str]], ExtrasCandidate + ] = {} + + if not ignore_installed: + env = get_default_environment() + self._installed_dists = { + dist.canonical_name: dist + for dist in env.iter_installed_distributions(local_only=False) + } + else: + self._installed_dists = {} + + @property + def force_reinstall(self) -> bool: + return self._force_reinstall + + def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: + if not link.is_wheel: + return + wheel = Wheel(link.filename) + if wheel.supported(self._finder.target_python.get_tags()): + return + msg = f"{link.filename} is not a supported wheel on this platform." + raise UnsupportedWheel(msg) + + def _make_extras_candidate( + self, base: BaseCandidate, extras: FrozenSet[str] + ) -> ExtrasCandidate: + cache_key = (id(base), extras) + try: + candidate = self._extras_candidate_cache[cache_key] + except KeyError: + candidate = ExtrasCandidate(base, extras) + self._extras_candidate_cache[cache_key] = candidate + return candidate + + def _make_candidate_from_dist( + self, + dist: BaseDistribution, + extras: FrozenSet[str], + template: InstallRequirement, + ) -> Candidate: + try: + base = self._installed_candidate_cache[dist.canonical_name] + except KeyError: + base = AlreadyInstalledCandidate(dist, template, factory=self) + self._installed_candidate_cache[dist.canonical_name] = base + if not extras: + return base + return self._make_extras_candidate(base, extras) + + def _make_candidate_from_link( + self, + link: Link, + extras: FrozenSet[str], + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[CandidateVersion], + ) -> Optional[Candidate]: + # TODO: Check already installed candidate, and use it if the link and + # editable flag match. + + if link in self._build_failures: + # We already tried this candidate before, and it does not build. + # Don't bother trying again. + return None + + if template.editable: + if link not in self._editable_candidate_cache: + try: + self._editable_candidate_cache[link] = EditableCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except MetadataInconsistent as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + except InstallationSubprocessError as e: + if not self._suppress_build_failures: + raise + logger.warning("Discarding %s due to build failure: %s", link, e) + self._build_failures[link] = e + return None + + base: BaseCandidate = self._editable_candidate_cache[link] + else: + if link not in self._link_candidate_cache: + try: + self._link_candidate_cache[link] = LinkCandidate( + link, + template, + factory=self, + name=name, + version=version, + ) + except MetadataInconsistent as e: + logger.info( + "Discarding [blue underline]%s[/]: [yellow]%s[reset]", + link, + e, + extra={"markup": True}, + ) + self._build_failures[link] = e + return None + except InstallationSubprocessError as e: + if not self._suppress_build_failures: + raise + logger.warning("Discarding %s due to build failure: %s", link, e) + self._build_failures[link] = e + return None + base = self._link_candidate_cache[link] + + if not extras: + return base + return self._make_extras_candidate(base, extras) + + def _iter_found_candidates( + self, + ireqs: Sequence[InstallRequirement], + specifier: SpecifierSet, + hashes: Hashes, + prefers_installed: bool, + incompatible_ids: Set[int], + ) -> Iterable[Candidate]: + if not ireqs: + return () + + # The InstallRequirement implementation requires us to give it a + # "template". Here we just choose the first requirement to represent + # all of them. + # Hopefully the Project model can correct this mismatch in the future. + template = ireqs[0] + assert template.req, "Candidates found on index must be PEP 508" + name = canonicalize_name(template.req.name) + + extras: FrozenSet[str] = frozenset() + for ireq in ireqs: + assert ireq.req, "Candidates found on index must be PEP 508" + specifier &= ireq.req.specifier + hashes &= ireq.hashes(trust_internet=False) + extras |= frozenset(ireq.extras) + + def _get_installed_candidate() -> Optional[Candidate]: + """Get the candidate for the currently-installed version.""" + # If --force-reinstall is set, we want the version from the index + # instead, so we "pretend" there is nothing installed. + if self._force_reinstall: + return None + try: + installed_dist = self._installed_dists[name] + except KeyError: + return None + # Don't use the installed distribution if its version does not fit + # the current dependency graph. + if not specifier.contains(installed_dist.version, prereleases=True): + return None + candidate = self._make_candidate_from_dist( + dist=installed_dist, + extras=extras, + template=template, + ) + # The candidate is a known incompatibility. Don't use it. + if id(candidate) in incompatible_ids: + return None + return candidate + + def iter_index_candidate_infos() -> Iterator[IndexCandidateInfo]: + result = self._finder.find_best_candidate( + project_name=name, + specifier=specifier, + hashes=hashes, + ) + icans = list(result.iter_applicable()) + + # PEP 592: Yanked releases are ignored unless the specifier + # explicitly pins a version (via '==' or '===') that can be + # solely satisfied by a yanked release. + all_yanked = all(ican.link.is_yanked for ican in icans) + + def is_pinned(specifier: SpecifierSet) -> bool: + for sp in specifier: + if sp.operator == "===": + return True + if sp.operator != "==": + continue + if sp.version.endswith(".*"): + continue + return True + return False + + pinned = is_pinned(specifier) + + # PackageFinder returns earlier versions first, so we reverse. + for ican in reversed(icans): + if not (all_yanked and pinned) and ican.link.is_yanked: + continue + func = functools.partial( + self._make_candidate_from_link, + link=ican.link, + extras=extras, + template=template, + name=name, + version=ican.version, + ) + yield ican.version, func + + return FoundCandidates( + iter_index_candidate_infos, + _get_installed_candidate(), + prefers_installed, + incompatible_ids, + ) + + def _iter_explicit_candidates_from_base( + self, + base_requirements: Iterable[Requirement], + extras: FrozenSet[str], + ) -> Iterator[Candidate]: + """Produce explicit candidates from the base given an extra-ed package. + + :param base_requirements: Requirements known to the resolver. The + requirements are guaranteed to not have extras. + :param extras: The extras to inject into the explicit requirements' + candidates. + """ + for req in base_requirements: + lookup_cand, _ = req.get_candidate_lookup() + if lookup_cand is None: # Not explicit. + continue + # We've stripped extras from the identifier, and should always + # get a BaseCandidate here, unless there's a bug elsewhere. + base_cand = as_base_candidate(lookup_cand) + assert base_cand is not None, "no extras here" + yield self._make_extras_candidate(base_cand, extras) + + def _iter_candidates_from_constraints( + self, + identifier: str, + constraint: Constraint, + template: InstallRequirement, + ) -> Iterator[Candidate]: + """Produce explicit candidates from constraints. + + This creates "fake" InstallRequirement objects that are basically clones + of what "should" be the template, but with original_link set to link. + """ + for link in constraint.links: + self._fail_if_link_is_unsupported_wheel(link) + candidate = self._make_candidate_from_link( + link, + extras=frozenset(), + template=install_req_from_link_and_ireq(link, template), + name=canonicalize_name(identifier), + version=None, + ) + if candidate: + yield candidate + + def find_candidates( + self, + identifier: str, + requirements: Mapping[str, Iterable[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + constraint: Constraint, + prefers_installed: bool, + ) -> Iterable[Candidate]: + # Collect basic lookup information from the requirements. + explicit_candidates: Set[Candidate] = set() + ireqs: List[InstallRequirement] = [] + for req in requirements[identifier]: + cand, ireq = req.get_candidate_lookup() + if cand is not None: + explicit_candidates.add(cand) + if ireq is not None: + ireqs.append(ireq) + + # If the current identifier contains extras, add explicit candidates + # from entries from extra-less identifier. + with contextlib.suppress(InvalidRequirement): + parsed_requirement = get_requirement(identifier) + explicit_candidates.update( + self._iter_explicit_candidates_from_base( + requirements.get(parsed_requirement.name, ()), + frozenset(parsed_requirement.extras), + ), + ) + + # Add explicit candidates from constraints. We only do this if there are + # known ireqs, which represent requirements not already explicit. If + # there are no ireqs, we're constraining already-explicit requirements, + # which is handled later when we return the explicit candidates. + if ireqs: + try: + explicit_candidates.update( + self._iter_candidates_from_constraints( + identifier, + constraint, + template=ireqs[0], + ), + ) + except UnsupportedWheel: + # If we're constrained to install a wheel incompatible with the + # target architecture, no candidates will ever be valid. + return () + + # Since we cache all the candidates, incompatibility identification + # can be made quicker by comparing only the id() values. + incompat_ids = {id(c) for c in incompatibilities.get(identifier, ())} + + # If none of the requirements want an explicit candidate, we can ask + # the finder for candidates. + if not explicit_candidates: + return self._iter_found_candidates( + ireqs, + constraint.specifier, + constraint.hashes, + prefers_installed, + incompat_ids, + ) + + return ( + c + for c in explicit_candidates + if id(c) not in incompat_ids + and constraint.is_satisfied_by(c) + and all(req.is_satisfied_by(c) for req in requirements[identifier]) + ) + + def _make_requirement_from_install_req( + self, ireq: InstallRequirement, requested_extras: Iterable[str] + ) -> Optional[Requirement]: + if not ireq.match_markers(requested_extras): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + ireq.name, + ireq.markers, + ) + return None + if not ireq.link: + return SpecifierRequirement(ireq) + self._fail_if_link_is_unsupported_wheel(ireq.link) + cand = self._make_candidate_from_link( + ireq.link, + extras=frozenset(ireq.extras), + template=ireq, + name=canonicalize_name(ireq.name) if ireq.name else None, + version=None, + ) + if cand is None: + # There's no way we can satisfy a URL requirement if the underlying + # candidate fails to build. An unnamed URL must be user-supplied, so + # we fail eagerly. If the URL is named, an unsatisfiable requirement + # can make the resolver do the right thing, either backtrack (and + # maybe find some other requirement that's buildable) or raise a + # ResolutionImpossible eventually. + if not ireq.name: + raise self._build_failures[ireq.link] + return UnsatisfiableRequirement(canonicalize_name(ireq.name)) + return self.make_requirement_from_candidate(cand) + + def collect_root_requirements( + self, root_ireqs: List[InstallRequirement] + ) -> CollectedRootRequirements: + collected = CollectedRootRequirements([], {}, {}) + for i, ireq in enumerate(root_ireqs): + if ireq.constraint: + # Ensure we only accept valid constraints + problem = check_invalid_constraint_type(ireq) + if problem: + raise InstallationError(problem) + if not ireq.match_markers(): + continue + assert ireq.name, "Constraint must be named" + name = canonicalize_name(ireq.name) + if name in collected.constraints: + collected.constraints[name] &= ireq + else: + collected.constraints[name] = Constraint.from_ireq(ireq) + else: + req = self._make_requirement_from_install_req( + ireq, + requested_extras=(), + ) + if req is None: + continue + if ireq.user_supplied and req.name not in collected.user_requested: + collected.user_requested[req.name] = i + collected.requirements.append(req) + return collected + + def make_requirement_from_candidate( + self, candidate: Candidate + ) -> ExplicitRequirement: + return ExplicitRequirement(candidate) + + def make_requirement_from_spec( + self, + specifier: str, + comes_from: Optional[InstallRequirement], + requested_extras: Iterable[str] = (), + ) -> Optional[Requirement]: + ireq = self._make_install_req_from_spec(specifier, comes_from) + return self._make_requirement_from_install_req(ireq, requested_extras) + + def make_requires_python_requirement( + self, + specifier: SpecifierSet, + ) -> Optional[Requirement]: + if self._ignore_requires_python: + return None + # Don't bother creating a dependency for an empty Requires-Python. + if not str(specifier): + return None + return RequiresPythonRequirement(specifier, self._python_candidate) + + def get_wheel_cache_entry( + self, link: Link, name: Optional[str] + ) -> Optional[CacheEntry]: + """Look up the link in the wheel cache. + + If ``preparer.require_hashes`` is True, don't use the wheel cache, + because cached wheels, always built locally, have different hashes + than the files downloaded from the index server and thus throw false + hash mismatches. Furthermore, cached wheels at present have + nondeterministic contents due to file modification times. + """ + if self._wheel_cache is None or self.preparer.require_hashes: + return None + return self._wheel_cache.get_cache_entry( + link=link, + package_name=name, + supported_tags=get_supported(), + ) + + def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]: + # TODO: Are there more cases this needs to return True? Editable? + dist = self._installed_dists.get(candidate.project_name) + if dist is None: # Not installed, no uninstallation required. + return None + + # We're installing into global site. The current installation must + # be uninstalled, no matter it's in global or user site, because the + # user site installation has precedence over global. + if not self._use_user_site: + return dist + + # We're installing into user site. Remove the user site installation. + if dist.in_usersite: + return dist + + # We're installing into user site, but the installed incompatible + # package is in global site. We can't uninstall that, and would let + # the new user installation to "shadow" it. But shadowing won't work + # in virtual environments, so we error out. + if running_under_virtualenv() and dist.in_site_packages: + message = ( + f"Will not install to the user site because it will lack " + f"sys.path precedence to {dist.raw_name} in {dist.location}" + ) + raise InstallationError(message) + return None + + def _report_requires_python_error( + self, causes: Sequence["ConflictCause"] + ) -> UnsupportedPythonVersion: + assert causes, "Requires-Python error reported with no cause" + + version = self._python_candidate.version + + if len(causes) == 1: + specifier = str(causes[0].requirement.specifier) + message = ( + f"Package {causes[0].parent.name!r} requires a different " + f"Python: {version} not in {specifier!r}" + ) + return UnsupportedPythonVersion(message) + + message = f"Packages require a different Python. {version} not in:" + for cause in causes: + package = cause.parent.format_for_error() + specifier = str(cause.requirement.specifier) + message += f"\n{specifier!r} (required by {package})" + return UnsupportedPythonVersion(message) + + def _report_single_requirement_conflict( + self, req: Requirement, parent: Optional[Candidate] + ) -> DistributionNotFound: + if parent is None: + req_disp = str(req) + else: + req_disp = f"{req} (from {parent.name})" + + cands = self._finder.find_all_candidates(req.project_name) + versions = [str(v) for v in sorted({c.version for c in cands})] + + logger.critical( + "Could not find a version that satisfies the requirement %s " + "(from versions: %s)", + req_disp, + ", ".join(versions) or "none", + ) + if str(req) == "requirements.txt": + logger.info( + "HINT: You are attempting to install a package literally " + 'named "requirements.txt" (which cannot exist). Consider ' + "using the '-r' flag to install the packages listed in " + "requirements.txt" + ) + + return DistributionNotFound(f"No matching distribution found for {req}") + + def get_installation_error( + self, + e: "ResolutionImpossible[Requirement, Candidate]", + constraints: Dict[str, Constraint], + ) -> InstallationError: + + assert e.causes, "Installation error reported with no cause" + + # If one of the things we can't solve is "we need Python X.Y", + # that is what we report. + requires_python_causes = [ + cause + for cause in e.causes + if isinstance(cause.requirement, RequiresPythonRequirement) + and not cause.requirement.is_satisfied_by(self._python_candidate) + ] + if requires_python_causes: + # The comprehension above makes sure all Requirement instances are + # RequiresPythonRequirement, so let's cast for convenience. + return self._report_requires_python_error( + cast("Sequence[ConflictCause]", requires_python_causes), + ) + + # Otherwise, we have a set of causes which can't all be satisfied + # at once. + + # The simplest case is when we have *one* cause that can't be + # satisfied. We just report that case. + if len(e.causes) == 1: + req, parent = e.causes[0] + if req.name not in constraints: + return self._report_single_requirement_conflict(req, parent) + + # OK, we now have a list of requirements that can't all be + # satisfied at once. + + # A couple of formatting helpers + def text_join(parts: List[str]) -> str: + if len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def describe_trigger(parent: Candidate) -> str: + ireq = parent.get_install_requirement() + if not ireq or not ireq.comes_from: + return f"{parent.name}=={parent.version}" + if isinstance(ireq.comes_from, InstallRequirement): + return str(ireq.comes_from.name) + return str(ireq.comes_from) + + triggers = set() + for req, parent in e.causes: + if parent is None: + # This is a root requirement, so we can report it directly + trigger = req.format_for_error() + else: + trigger = describe_trigger(parent) + triggers.add(trigger) + + if triggers: + info = text_join(sorted(triggers)) + else: + info = "the requested packages" + + msg = ( + "Cannot install {} because these package versions " + "have conflicting dependencies.".format(info) + ) + logger.critical(msg) + msg = "\nThe conflict is caused by:" + + relevant_constraints = set() + for req, parent in e.causes: + if req.name in constraints: + relevant_constraints.add(req.name) + msg = msg + "\n " + if parent: + msg = msg + f"{parent.name} {parent.version} depends on " + else: + msg = msg + "The user requested " + msg = msg + req.format_for_error() + for key in relevant_constraints: + spec = constraints[key].specifier + msg += f"\n The user requested (constraint) {key}{spec}" + + msg = ( + msg + + "\n\n" + + "To fix this you could try to:\n" + + "1. loosen the range of package versions you've specified\n" + + "2. remove package versions to allow pip attempt to solve " + + "the dependency conflict\n" + ) + + logger.info(msg) + + return DistributionNotFound( + "ResolutionImpossible: for help visit " + "https://pip.pypa.io/en/latest/topics/dependency-resolution/" + "#dealing-with-dependency-conflicts" + ) diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py new file mode 100644 index 0000000..e6ec959 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -0,0 +1,248 @@ +import collections +import math +from typing import ( + TYPE_CHECKING, + Dict, + Iterable, + Iterator, + Mapping, + Sequence, + TypeVar, + Union, +) + +from pip._vendor.resolvelib.providers import AbstractProvider + +from .base import Candidate, Constraint, Requirement +from .candidates import REQUIRES_PYTHON_IDENTIFIER +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.providers import Preference + from pip._vendor.resolvelib.resolvers import RequirementInformation + + PreferenceInformation = RequirementInformation[Requirement, Candidate] + + _ProviderBase = AbstractProvider[Requirement, Candidate, str] +else: + _ProviderBase = AbstractProvider + +# Notes on the relationship between the provider, the factory, and the +# candidate and requirement classes. +# +# The provider is a direct implementation of the resolvelib class. Its role +# is to deliver the API that resolvelib expects. +# +# Rather than work with completely abstract "requirement" and "candidate" +# concepts as resolvelib does, pip has concrete classes implementing these two +# ideas. The API of Requirement and Candidate objects are defined in the base +# classes, but essentially map fairly directly to the equivalent provider +# methods. In particular, `find_matches` and `is_satisfied_by` are +# requirement methods, and `get_dependencies` is a candidate method. +# +# The factory is the interface to pip's internal mechanisms. It is stateless, +# and is created by the resolver and held as a property of the provider. It is +# responsible for creating Requirement and Candidate objects, and provides +# services to those objects (access to pip's finder and preparer). + + +D = TypeVar("D") +V = TypeVar("V") + + +def _get_with_identifier( + mapping: Mapping[str, V], + identifier: str, + default: D, +) -> Union[D, V]: + """Get item from a package name lookup mapping with a resolver identifier. + + This extra logic is needed when the target mapping is keyed by package + name, which cannot be directly looked up with an identifier (which may + contain requested extras). Additional logic is added to also look up a value + by "cleaning up" the extras from the identifier. + """ + if identifier in mapping: + return mapping[identifier] + # HACK: Theoretically we should check whether this identifier is a valid + # "NAME[EXTRAS]" format, and parse out the name part with packaging or + # some regular expression. But since pip's resolver only spits out three + # kinds of identifiers: normalized PEP 503 names, normalized names plus + # extras, and Requires-Python, we can cheat a bit here. + name, open_bracket, _ = identifier.partition("[") + if open_bracket and name in mapping: + return mapping[name] + return default + + +class PipProvider(_ProviderBase): + """Pip's provider implementation for resolvelib. + + :params constraints: A mapping of constraints specified by the user. Keys + are canonicalized project names. + :params ignore_dependencies: Whether the user specified ``--no-deps``. + :params upgrade_strategy: The user-specified upgrade strategy. + :params user_requested: A set of canonicalized package names that the user + supplied for pip to install/upgrade. + """ + + def __init__( + self, + factory: Factory, + constraints: Dict[str, Constraint], + ignore_dependencies: bool, + upgrade_strategy: str, + user_requested: Dict[str, int], + ) -> None: + self._factory = factory + self._constraints = constraints + self._ignore_dependencies = ignore_dependencies + self._upgrade_strategy = upgrade_strategy + self._user_requested = user_requested + self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf) + + def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str: + return requirement_or_candidate.name + + def get_preference( # type: ignore + self, + identifier: str, + resolutions: Mapping[str, Candidate], + candidates: Mapping[str, Iterator[Candidate]], + information: Mapping[str, Iterable["PreferenceInformation"]], + backtrack_causes: Sequence["PreferenceInformation"], + ) -> "Preference": + """Produce a sort key for given requirement based on preference. + + The lower the return value is, the more preferred this group of + arguments is. + + Currently pip considers the followings in order: + + * Prefer if any of the known requirements is "direct", e.g. points to an + explicit URL. + * If equal, prefer if any requirement is "pinned", i.e. contains + operator ``===`` or ``==``. + * If equal, calculate an approximate "depth" and resolve requirements + closer to the user-specified requirements first. + * Order user-specified requirements by the order they are specified. + * If equal, prefers "non-free" requirements, i.e. contains at least one + operator, such as ``>=`` or ``<``. + * If equal, order alphabetically for consistency (helps debuggability). + """ + lookups = (r.get_candidate_lookup() for r, _ in information[identifier]) + candidate, ireqs = zip(*lookups) + operators = [ + specifier.operator + for specifier_set in (ireq.specifier for ireq in ireqs if ireq) + for specifier in specifier_set + ] + + direct = candidate is not None + pinned = any(op[:2] == "==" for op in operators) + unfree = bool(operators) + + try: + requested_order: Union[int, float] = self._user_requested[identifier] + except KeyError: + requested_order = math.inf + parent_depths = ( + self._known_depths[parent.name] if parent is not None else 0.0 + for _, parent in information[identifier] + ) + inferred_depth = min(d for d in parent_depths) + 1.0 + else: + inferred_depth = 1.0 + self._known_depths[identifier] = inferred_depth + + requested_order = self._user_requested.get(identifier, math.inf) + + # Requires-Python has only one candidate and the check is basically + # free, so we always do it first to avoid needless work if it fails. + requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER + + # HACK: Setuptools have a very long and solid backward compatibility + # track record, and extremely few projects would request a narrow, + # non-recent version range of it since that would break a lot things. + # (Most projects specify it only to request for an installer feature, + # which does not work, but that's another topic.) Intentionally + # delaying Setuptools helps reduce branches the resolver has to check. + # This serves as a temporary fix for issues like "apache-airflow[all]" + # while we work on "proper" branch pruning techniques. + delay_this = identifier == "setuptools" + + # Prefer the causes of backtracking on the assumption that the problem + # resolving the dependency tree is related to the failures that caused + # the backtracking + backtrack_cause = self.is_backtrack_cause(identifier, backtrack_causes) + + return ( + not requires_python, + delay_this, + not direct, + not pinned, + not backtrack_cause, + inferred_depth, + requested_order, + not unfree, + identifier, + ) + + def find_matches( + self, + identifier: str, + requirements: Mapping[str, Iterator[Requirement]], + incompatibilities: Mapping[str, Iterator[Candidate]], + ) -> Iterable[Candidate]: + def _eligible_for_upgrade(identifier: str) -> bool: + """Are upgrades allowed for this project? + + This checks the upgrade strategy, and whether the project was one + that the user specified in the command line, in order to decide + whether we should upgrade if there's a newer version available. + + (Note that we don't need access to the `--upgrade` flag, because + an upgrade strategy of "to-satisfy-only" means that `--upgrade` + was not specified). + """ + if self._upgrade_strategy == "eager": + return True + elif self._upgrade_strategy == "only-if-needed": + user_order = _get_with_identifier( + self._user_requested, + identifier, + default=None, + ) + return user_order is not None + return False + + constraint = _get_with_identifier( + self._constraints, + identifier, + default=Constraint.empty(), + ) + return self._factory.find_candidates( + identifier=identifier, + requirements=requirements, + constraint=constraint, + prefers_installed=(not _eligible_for_upgrade(identifier)), + incompatibilities=incompatibilities, + ) + + def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: + return requirement.is_satisfied_by(candidate) + + def get_dependencies(self, candidate: Candidate) -> Sequence[Requirement]: + with_requires = not self._ignore_dependencies + return [r for r in candidate.iter_dependencies(with_requires) if r is not None] + + @staticmethod + def is_backtrack_cause( + identifier: str, backtrack_causes: Sequence["PreferenceInformation"] + ) -> bool: + for backtrack_cause in backtrack_causes: + if identifier == backtrack_cause.requirement.name: + return True + if backtrack_cause.parent and identifier == backtrack_cause.parent.name: + return True + return False diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py diff --git a/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py rename to python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py new file mode 100644 index 0000000..618f1e1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -0,0 +1,292 @@ +import functools +import logging +import os +from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible +from pip._vendor.resolvelib import Resolver as RLResolver +from pip._vendor.resolvelib.structs import DirectedGraph + +from pip._internal.cache import WheelCache +from pip._internal.index.package_finder import PackageFinder +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.req_install import InstallRequirement +from pip._internal.req.req_set import RequirementSet +from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider +from pip._internal.resolution.resolvelib.provider import PipProvider +from pip._internal.resolution.resolvelib.reporter import ( + PipDebuggingReporter, + PipReporter, +) + +from .base import Candidate, Requirement +from .factory import Factory + +if TYPE_CHECKING: + from pip._vendor.resolvelib.resolvers import Result as RLResult + + Result = RLResult[Requirement, Candidate, str] + + +logger = logging.getLogger(__name__) + + +class Resolver(BaseResolver): + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer: RequirementPreparer, + finder: PackageFinder, + wheel_cache: Optional[WheelCache], + make_install_req: InstallRequirementProvider, + use_user_site: bool, + ignore_dependencies: bool, + ignore_installed: bool, + ignore_requires_python: bool, + force_reinstall: bool, + upgrade_strategy: str, + suppress_build_failures: bool, + py_version_info: Optional[Tuple[int, ...]] = None, + ): + super().__init__() + assert upgrade_strategy in self._allowed_strategies + + self.factory = Factory( + finder=finder, + preparer=preparer, + make_install_req=make_install_req, + wheel_cache=wheel_cache, + use_user_site=use_user_site, + force_reinstall=force_reinstall, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + suppress_build_failures=suppress_build_failures, + py_version_info=py_version_info, + ) + self.ignore_dependencies = ignore_dependencies + self.upgrade_strategy = upgrade_strategy + self._result: Optional[Result] = None + + def resolve( + self, root_reqs: List[InstallRequirement], check_supported_wheels: bool + ) -> RequirementSet: + collected = self.factory.collect_root_requirements(root_reqs) + provider = PipProvider( + factory=self.factory, + constraints=collected.constraints, + ignore_dependencies=self.ignore_dependencies, + upgrade_strategy=self.upgrade_strategy, + user_requested=collected.user_requested, + ) + if "PIP_RESOLVER_DEBUG" in os.environ: + reporter: BaseReporter = PipDebuggingReporter() + else: + reporter = PipReporter() + resolver: RLResolver[Requirement, Candidate, str] = RLResolver( + provider, + reporter, + ) + + try: + try_to_avoid_resolution_too_deep = 2000000 + result = self._result = resolver.resolve( + collected.requirements, max_rounds=try_to_avoid_resolution_too_deep + ) + + except ResolutionImpossible as e: + error = self.factory.get_installation_error( + cast("ResolutionImpossible[Requirement, Candidate]", e), + collected.constraints, + ) + raise error from e + + req_set = RequirementSet(check_supported_wheels=check_supported_wheels) + for candidate in result.mapping.values(): + ireq = candidate.get_install_requirement() + if ireq is None: + continue + + # Check if there is already an installation under the same name, + # and set a flag for later stages to uninstall it, if needed. + installed_dist = self.factory.get_dist_to_uninstall(candidate) + if installed_dist is None: + # There is no existing installation -- nothing to uninstall. + ireq.should_reinstall = False + elif self.factory.force_reinstall: + # The --force-reinstall flag is set -- reinstall. + ireq.should_reinstall = True + elif installed_dist.version != candidate.version: + # The installation is different in version -- reinstall. + ireq.should_reinstall = True + elif candidate.is_editable or installed_dist.editable: + # The incoming distribution is editable, or different in + # editable-ness to installation -- reinstall. + ireq.should_reinstall = True + elif candidate.source_link and candidate.source_link.is_file: + # The incoming distribution is under file:// + if candidate.source_link.is_wheel: + # is a local wheel -- do nothing. + logger.info( + "%s is already installed with the same version as the " + "provided wheel. Use --force-reinstall to force an " + "installation of the wheel.", + ireq.name, + ) + continue + + # is a local sdist or path -- reinstall + ireq.should_reinstall = True + else: + continue + + link = candidate.source_link + if link and link.is_yanked: + # The reason can contain non-ASCII characters, Unicode + # is required for Python 2. + msg = ( + "The candidate selected for download or install is a " + "yanked version: {name!r} candidate (version {version} " + "at {link})\nReason for being yanked: {reason}" + ).format( + name=candidate.name, + version=candidate.version, + link=link, + reason=link.yanked_reason or "", + ) + logger.warning(msg) + + req_set.add_named_requirement(ireq) + + reqs = req_set.all_requirements + self.factory.preparer.prepare_linked_requirements_more(reqs) + return req_set + + def get_installation_order( + self, req_set: RequirementSet + ) -> List[InstallRequirement]: + """Get order for installation of requirements in RequirementSet. + + The returned list contains a requirement before another that depends on + it. This helps ensure that the environment is kept consistent as they + get installed one-by-one. + + The current implementation creates a topological ordering of the + dependency graph, giving more weight to packages with less + or no dependencies, while breaking any cycles in the graph at + arbitrary points. We make no guarantees about where the cycle + would be broken, other than it *would* be broken. + """ + assert self._result is not None, "must call resolve() first" + + if not req_set.requirements: + # Nothing is left to install, so we do not need an order. + return [] + + graph = self._result.graph + weights = get_topological_weights( + graph, + expected_node_count=len(self._result.mapping) + 1, + ) + + sorted_items = sorted( + req_set.requirements.items(), + key=functools.partial(_req_set_item_sorter, weights=weights), + reverse=True, + ) + return [ireq for _, ireq in sorted_items] + + +def get_topological_weights( + graph: "DirectedGraph[Optional[str]]", expected_node_count: int +) -> Dict[Optional[str], int]: + """Assign weights to each node based on how "deep" they are. + + This implementation may change at any point in the future without prior + notice. + + We first simplify the dependency graph by pruning any leaves and giving them + the highest weight: a package without any dependencies should be installed + first. This is done again and again in the same way, giving ever less weight + to the newly found leaves. The loop stops when no leaves are left: all + remaining packages have at least one dependency left in the graph. + + Then we continue with the remaining graph, by taking the length for the + longest path to any node from root, ignoring any paths that contain a single + node twice (i.e. cycles). This is done through a depth-first search through + the graph, while keeping track of the path to the node. + + Cycles in the graph result would result in node being revisited while also + being on its own path. In this case, take no action. This helps ensure we + don't get stuck in a cycle. + + When assigning weight, the longer path (i.e. larger length) is preferred. + """ + path: Set[Optional[str]] = set() + weights: Dict[Optional[str], int] = {} + + def visit(node: Optional[str]) -> None: + if node in path: + # We hit a cycle, so we'll break it here. + return + + # Time to visit the children! + path.add(node) + for child in graph.iter_children(node): + visit(child) + path.remove(node) + + last_known_parent_count = weights.get(node, 0) + weights[node] = max(last_known_parent_count, len(path)) + + # Simplify the graph, pruning leaves that have no dependencies. + # This is needed for large graphs (say over 200 packages) because the + # `visit` function is exponentially slower then, taking minutes. + # See https://github.com/pypa/pip/issues/10557 + # We will loop until we explicitly break the loop. + while True: + leaves = set() + for key in graph: + if key is None: + continue + for _child in graph.iter_children(key): + # This means we have at least one child + break + else: + # No child. + leaves.add(key) + if not leaves: + # We are done simplifying. + break + # Calculate the weight for the leaves. + weight = len(graph) - 1 + for leaf in leaves: + weights[leaf] = weight + # Remove the leaves from the graph, making it simpler. + for leaf in leaves: + graph.remove(leaf) + + # Visit the remaining graph. + # `None` is guaranteed to be the root node by resolvelib. + visit(None) + + # Sanity checks + assert weights[None] == 0 + assert len(weights) == expected_node_count + + return weights + + +def _req_set_item_sorter( + item: Tuple[str, InstallRequirement], + weights: Dict[Optional[str], int], +) -> Tuple[int, str]: + """Key function used to sort install requirements for installation. + + Based on the "weight" mapping calculated in ``get_installation_order()``. + The canonical package name is returned as the second member as a tie- + breaker to ensure the result is predictable, which is useful in tests. + """ + name = canonicalize_name(item[0]) + return weights[name], name diff --git a/python/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py b/python/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py new file mode 100644 index 0000000..7300e0e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py @@ -0,0 +1,189 @@ +import datetime +import hashlib +import json +import logging +import optparse +import os.path +import sys +from typing import Any, Dict + +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.metadata import get_default_environment +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.network.session import PipSession +from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace +from pip._internal.utils.misc import ensure_dir + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +def _get_statefile_name(key: str) -> str: + key_bytes = key.encode() + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +class SelfCheckState: + def __init__(self, cache_dir: str) -> None: + self.state: Dict[str, Any] = {} + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self.statefile_path, encoding="utf-8") as statefile: + self.state = json.load(statefile) + except (OSError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self) -> str: + return sys.prefix + + def save(self, pypi_version: str, current_time: datetime.datetime) -> None: + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self.statefile_path) as f: + f.write(text.encode()) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self.statefile_path) + except OSError: + # Best effort. + pass + + +def was_installed_by_pip(pkg: str) -> bool: + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + dist = get_default_environment().get_distribution(pkg) + return dist is not None and "pip" == dist.installer + + +def pip_self_version_check(session: PipSession, options: optparse.Values) -> None: + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_dist = get_default_environment().get_distribution("pip") + if not installed_dist: + return + + pip_version = installed_dist.version + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + link_collector = LinkCollector.create( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + use_deprecated_html5lib=( + "html5lib" in options.deprecated_features_enabled + ), + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return + pypi_version = str(best_candidate.version) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = parse_version(pypi_version) + + local_version_is_older = ( + pip_version < remote_version + and pip_version.base_version != remote_version.base_version + and was_installed_by_pip("pip") + ) + + # Determine if our pypi_version is older + if not local_version_is_older: + return + + # We cannot tell how the current pip is available in the current + # command context, so be pragmatic here and suggest the command + # that's always available. This does not accommodate spaces in + # `sys.executable` on purpose as it is not possible to do it + # correctly without knowing the user's shell. Thus, + # it won't be done until possible through the standard library. + # Do not be tempted to use the undocumented subprocess.list2cmdline. + # It is considered an internal implementation detail for a reason. + pip_cmd = f"{sys.executable} -m pip" + logger.warning( + "You are using pip version %s; however, version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, + pypi_version, + pip_cmd, + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/lib/python3.11/site-packages/pip/_internal/utils/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/utils/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/__init__.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/_log.py b/python/lib/python3.10/site-packages/pip/_internal/utils/_log.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/_log.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/_log.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py b/python/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/appdirs.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/compat.py b/python/lib/python3.10/site-packages/pip/_internal/utils/compat.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/compat.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/compat.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py b/python/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/datetime.py b/python/lib/python3.10/site-packages/pip/_internal/utils/datetime.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/datetime.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/datetime.py diff --git a/lib/site-packages/pip/_internal/utils/deprecation.py b/python/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py similarity index 100% rename from lib/site-packages/pip/_internal/utils/deprecation.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py b/python/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py b/python/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py new file mode 100644 index 0000000..e4aa5b8 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py @@ -0,0 +1,42 @@ +from distutils.errors import DistutilsArgError +from distutils.fancy_getopt import FancyGetopt +from typing import Dict, List + +_options = [ + ("exec-prefix=", None, ""), + ("home=", None, ""), + ("install-base=", None, ""), + ("install-data=", None, ""), + ("install-headers=", None, ""), + ("install-lib=", None, ""), + ("install-platlib=", None, ""), + ("install-purelib=", None, ""), + ("install-scripts=", None, ""), + ("prefix=", None, ""), + ("root=", None, ""), + ("user", None, ""), +] + + +# typeshed doesn't permit Tuple[str, None, str], see python/typeshed#3469. +_distutils_getopt = FancyGetopt(_options) # type: ignore + + +def parse_distutils_args(args: List[str]) -> Dict[str, str]: + """Parse provided arguments, returning an object that has the + matched arguments. + + Any unknown arguments are ignored. + """ + result = {} + for arg in args: + try: + _, match = _distutils_getopt.getopt(args=[arg]) + except DistutilsArgError: + # We don't care about any other options, which here may be + # considered unrecognized since our option list is not + # exhaustive. + pass + else: + result.update(match.__dict__) + return result diff --git a/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py b/python/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/egg_link.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/encoding.py b/python/lib/python3.10/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..1c73f6c --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,36 @@ +import codecs +import locale +import re +import sys +from typing import List, Tuple + +BOMS: List[Tuple[bytes, str]] = [ + (codecs.BOM_UTF8, "utf-8"), + (codecs.BOM_UTF16, "utf-16"), + (codecs.BOM_UTF16_BE, "utf-16-be"), + (codecs.BOM_UTF16_LE, "utf-16-le"), + (codecs.BOM_UTF32, "utf-32"), + (codecs.BOM_UTF32_BE, "utf-32-be"), + (codecs.BOM_UTF32_LE, "utf-32-le"), +] + +ENCODING_RE = re.compile(br"coding[:=]\s*([-\w.]+)") + + +def auto_decode(data: bytes) -> str: + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom) :].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b"\n")[:2]: + if line[0:1] == b"#" and ENCODING_RE.search(line): + result = ENCODING_RE.search(line) + assert result is not None + encoding = result.groups()[0].decode("ascii") + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py b/python/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py new file mode 100644 index 0000000..1504a12 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py @@ -0,0 +1,27 @@ +import sys +from typing import List, Optional + +from pip._internal.cli.main import main + + +def _wrapper(args: Optional[List[str]] = None) -> int: + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py b/python/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..b7e6191 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,182 @@ +import fnmatch +import os +import os.path +import random +import shutil +import stat +import sys +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from typing import Any, BinaryIO, Iterator, List, Union, cast + +from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed + +from pip._internal.utils.compat import get_path_uid +from pip._internal.utils.misc import format_size + + +def check_path_owner(path: str) -> bool: + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +def copy2_fixed(src: str, dest: str) -> None: + """Wrap shutil.copy2() but map errors copying socket files to + SpecialFileError as expected. + + See also https://bugs.python.org/issue37700. + """ + try: + shutil.copy2(src, dest) + except OSError: + for f in [src, dest]: + try: + is_socket_file = is_socket(f) + except OSError: + # An error has already occurred. Another error here is not + # a problem and we can ignore it. + pass + else: + if is_socket_file: + raise shutil.SpecialFileError(f"`{f}` is a socket") + + raise + + +def is_socket(path: str) -> bool: + return stat.S_ISSOCK(os.lstat(path).st_mode) + + +@contextmanager +def adjacent_tmp_file(path: str, **kwargs: Any) -> Iterator[BinaryIO]: + """Return a file-like object pointing to a tmp file next to path. + + The file is created securely and is ensured to be written to disk + after the context reaches its end. + + kwargs will be passed to tempfile.NamedTemporaryFile to control + the way the temporary file will be opened. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix=".tmp", + **kwargs, + ) as f: + result = cast(BinaryIO, f) + try: + yield result + finally: + result.flush() + os.fsync(result.fileno()) + + +# Tenacity raises RetryError by default, explicitly raise the original exception +_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25)) + +replace = _replace_retry(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path: str) -> bool: + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == "posix": + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path: str) -> bool: + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = "accesstest_deleteme_fishfingers_custard_" + alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" + for _ in range(10): + name = basename + "".join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + except FileExistsError: + pass + except PermissionError: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + # This could as well be because the parent dir is not readable, + # due to non-privileged user access. + return False + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise OSError("Unexpected condition testing for writable directory") + + +def find_files(path: str, pattern: str) -> List[str]: + """Returns a list of absolute paths of files beneath path, recursively, + with filenames which match the UNIX-style shell glob pattern.""" + result: List[str] = [] + for root, _, files in os.walk(path): + matches = fnmatch.filter(files, pattern) + result.extend(os.path.join(root, f) for f in matches) + return result + + +def file_size(path: str) -> Union[int, float]: + # If it's a symlink, return 0. + if os.path.islink(path): + return 0 + return os.path.getsize(path) + + +def format_file_size(path: str) -> str: + return format_size(file_size(path)) + + +def directory_size(path: str) -> Union[int, float]: + size = 0.0 + for root, _dirs, files in os.walk(path): + for filename in files: + file_path = os.path.join(root, filename) + size += file_size(file_path) + return size + + +def format_directory_size(path: str) -> str: + return format_size(directory_size(path)) diff --git a/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py b/python/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/filetypes.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/glibc.py b/python/lib/python3.10/site-packages/pip/_internal/utils/glibc.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/glibc.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/glibc.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/hashes.py b/python/lib/python3.10/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..82eb035 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,144 @@ +import hashlib +from typing import TYPE_CHECKING, BinaryIO, Dict, Iterator, List + +from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError +from pip._internal.utils.misc import read_chunks + +if TYPE_CHECKING: + from hashlib import _Hash + + # NoReturn introduced in 3.6.2; imported only for type checking to maintain + # pip compatibility with older patch versions of Python 3.6 + from typing import NoReturn + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = "sha256" + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ["sha256", "sha384", "sha512"] + + +class Hashes: + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + + def __init__(self, hashes: Dict[str, List[str]] = None) -> None: + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + allowed = {} + if hashes is not None: + for alg, keys in hashes.items(): + # Make sure values are always sorted (to ease equality checks) + allowed[alg] = sorted(keys) + self._allowed = allowed + + def __and__(self, other: "Hashes") -> "Hashes": + if not isinstance(other, Hashes): + return NotImplemented + + # If either of the Hashes object is entirely empty (i.e. no hash + # specified at all), all hashes from the other object are allowed. + if not other: + return self + if not self: + return other + + # Otherwise only hashes that present in both objects are allowed. + new = {} + for alg, values in other._allowed.items(): + if alg not in self._allowed: + continue + new[alg] = [v for v in values if v in self._allowed[alg]] + return Hashes(new) + + @property + def digest_count(self) -> int: + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool: + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks: Iterator[bytes]) -> None: + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in self._allowed.keys(): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError(f"Unknown hash name: {hash_name}") + + for chunk in chunks: + for hash in gots.values(): + hash.update(chunk) + + for hash_name, got in gots.items(): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file: BinaryIO) -> None: + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path: str) -> None: + with open(path, "rb") as file: + return self.check_against_file(file) + + def __bool__(self) -> bool: + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Hashes): + return NotImplemented + return self._allowed == other._allowed + + def __hash__(self) -> int: + return hash( + ",".join( + sorted( + ":".join((alg, digest)) + for alg, digest_list in self._allowed.items() + for digest in digest_list + ) + ) + ) + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + + def __init__(self) -> None: + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super().__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn": + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py b/python/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/logging.py b/python/lib/python3.10/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..6e001c5 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,343 @@ +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +import threading +from dataclasses import dataclass +from logging import Filter +from typing import IO, Any, ClassVar, Iterator, List, Optional, TextIO, Type + +from pip._vendor.rich.console import ( + Console, + ConsoleOptions, + ConsoleRenderable, + RenderResult, +) +from pip._vendor.rich.highlighter import NullHighlighter +from pip._vendor.rich.logging import RichHandler +from pip._vendor.rich.segment import Segment +from pip._vendor.rich.style import Style + +from pip._internal.exceptions import DiagnosticPipError +from pip._internal.utils._log import VERBOSE, getLogger +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir + +_log_state = threading.local() +subprocess_logger = getLogger("pip.subprocessor") + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + + +def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> bool: + if exc_class is BrokenPipeError: + return True + + # On Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if not WINDOWS: + return False + + return isinstance(exc, OSError) and exc.errno in (errno.EINVAL, errno.EPIPE) + + +@contextlib.contextmanager +def indent_log(num: int = 2) -> Iterator[None]: + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + # For thread-safety + _log_state.indentation = get_indentation() + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation() -> int: + return getattr(_log_state, "indentation", 0) + + +class IndentingFormatter(logging.Formatter): + default_time_format = "%Y-%m-%dT%H:%M:%S" + + def __init__( + self, + *args: Any, + add_timestamp: bool = False, + **kwargs: Any, + ) -> None: + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = add_timestamp + super().__init__(*args, **kwargs) + + def get_message_start(self, formatted: str, levelno: int) -> str: + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return "" + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return "" + if levelno < logging.ERROR: + return "WARNING: " + + return "ERROR: " + + def format(self, record: logging.LogRecord) -> str: + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super().format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = "" + if self.add_timestamp: + prefix = f"{self.formatTime(record)} " + prefix += " " * get_indentation() + formatted = "".join([prefix + line for line in formatted.splitlines(True)]) + return formatted + + +@dataclass +class IndentedRenderable: + renderable: ConsoleRenderable + indent: int + + def __rich_console__( + self, console: Console, options: ConsoleOptions + ) -> RenderResult: + segments = console.render(self.renderable, options) + lines = Segment.split_lines(segments) + for line in lines: + yield Segment(" " * self.indent) + yield from line + yield Segment("\n") + + +class RichPipStreamHandler(RichHandler): + KEYWORDS: ClassVar[Optional[List[str]]] = [] + + def __init__(self, stream: Optional[TextIO], no_color: bool) -> None: + super().__init__( + console=Console(file=stream, no_color=no_color, soft_wrap=True), + show_time=False, + show_level=False, + show_path=False, + highlighter=NullHighlighter(), + ) + + # Our custom override on Rich's logger, to make things work as we need them to. + def emit(self, record: logging.LogRecord) -> None: + style: Optional[Style] = None + + # If we are given a diagnostic error to present, present it with indentation. + if record.msg == "[present-diagnostic] %s" and len(record.args) == 1: + diagnostic_error: DiagnosticPipError = record.args[0] # type: ignore[index] + assert isinstance(diagnostic_error, DiagnosticPipError) + + renderable: ConsoleRenderable = IndentedRenderable( + diagnostic_error, indent=get_indentation() + ) + else: + message = self.format(record) + renderable = self.render_message(record, message) + if record.levelno is not None: + if record.levelno >= logging.ERROR: + style = Style(color="red") + elif record.levelno >= logging.WARNING: + style = Style(color="yellow") + + try: + self.console.print(renderable, overflow="ignore", crop=False, style=style) + except Exception: + self.handleError(record) + + def handleError(self, record: logging.LogRecord) -> None: + """Called when logging is unable to log some output.""" + + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if ( + exc_class + and exc + and self.console.file is sys.stdout + and _is_broken_pipe_error(exc_class, exc) + ): + raise BrokenStdoutLoggingError() + + return super().handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + def _open(self) -> IO[Any]: + ensure_dir(os.path.dirname(self.baseFilename)) + return super()._open() + + +class MaxLevelFilter(Filter): + def __init__(self, level: int) -> None: + self.level = level + + def filter(self, record: logging.LogRecord) -> bool: + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record: logging.LogRecord) -> bool: + # The base Filter class allows only records from a logger (or its + # children). + return not super().filter(record) + + +def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str]) -> int: + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 2: + level_number = logging.DEBUG + elif verbosity == 1: + level_number = VERBOSE + elif verbosity == -1: + level_number = logging.WARNING + elif verbosity == -2: + level_number = logging.ERROR + elif verbosity <= -3: + level_number = logging.CRITICAL + else: + level_number = logging.INFO + + level = logging.getLevelName(level_number) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.RichPipStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "stream": log_streams["stderr"], + "no_color": no_color, + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "encoding": "utf-8", + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": {"pip._vendor": {"level": vendored_log_level}}, + } + ) + + return level_number diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/misc.py b/python/lib/python3.10/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..0bf9e99 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,653 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +import contextlib +import errno +import getpass +import hashlib +import io +import logging +import os +import posixpath +import shutil +import stat +import sys +import urllib.parse +from io import StringIO +from itertools import filterfalse, tee, zip_longest +from types import TracebackType +from typing import ( + Any, + BinaryIO, + Callable, + ContextManager, + Iterable, + Iterator, + List, + Optional, + TextIO, + Tuple, + Type, + TypeVar, + cast, +) + +from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed + +from pip import __version__ +from pip._internal.exceptions import CommandError +from pip._internal.locations import get_major_minor_version +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.virtualenv import running_under_virtualenv + +__all__ = [ + "rmtree", + "display_path", + "backup_dir", + "ask", + "splitext", + "format_size", + "is_installable_dir", + "normalize_path", + "renames", + "get_prog", + "captured_stdout", + "ensure_dir", + "remove_auth_from_url", +] + + +logger = logging.getLogger(__name__) + +T = TypeVar("T") +ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] +VersionInfo = Tuple[int, int, int] +NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] + + +def get_pip_version() -> str: + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return "pip {} from {} (python {})".format( + __version__, + pip_pkg_dir, + get_major_minor_version(), + ) + + +def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]: + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast("VersionInfo", py_version_info) + + +def ensure_dir(path: str) -> None: + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog() -> str: + try: + prog = os.path.basename(sys.argv[0]) + if prog in ("__main__.py", "-c"): + return f"{sys.executable} -m pip" + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return "pip" + + +# Retry every half second for up to 3 seconds +# Tenacity raises RetryError by default, explicitly raise the original exception +@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) +def rmtree(dir: str, ignore_errors: bool = False) -> None: + shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func: Callable[..., Any], path: str, exc_info: ExcInfo) -> None: + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + try: + has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) + except OSError: + # it's equivalent to os.path.exists + return + + if has_attr_readonly: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path: str) -> str: + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if path.startswith(os.getcwd() + os.path.sep): + path = "." + path[len(os.getcwd()) :] + return path + + +def backup_dir(dir: str, ext: str = ".bak") -> str: + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message: str, options: Iterable[str]) -> str: + for action in os.environ.get("PIP_EXISTS_ACTION", "").split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message: str) -> None: + """Raise an error if no input is allowed.""" + if os.environ.get("PIP_NO_INPUT"): + raise Exception( + f"No input was expected ($PIP_NO_INPUT set); question: {message}" + ) + + +def ask(message: str, options: Iterable[str]) -> str: + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + "Your response ({!r}) was not one of the expected responses: " + "{}".format(response, ", ".join(options)) + ) + else: + return response + + +def ask_input(message: str) -> str: + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message: str) -> str: + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def strtobool(val: str) -> int: + """Convert a string representation of truth to true (1) or false (0). + + True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values + are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if + 'val' is anything else. + """ + val = val.lower() + if val in ("y", "yes", "t", "true", "on", "1"): + return 1 + elif val in ("n", "no", "f", "false", "off", "0"): + return 0 + else: + raise ValueError(f"invalid truth value {val!r}") + + +def format_size(bytes: float) -> str: + if bytes > 1000 * 1000: + return "{:.1f} MB".format(bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return "{} kB".format(int(bytes / 1000)) + elif bytes > 1000: + return "{:.1f} kB".format(bytes / 1000.0) + else: + return "{} bytes".format(int(bytes)) + + +def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]: + """Return a list of formatted rows and a list of column sizes. + + For example:: + + >>> tabulate([['foobar', 2000], [0xdeadbeef]]) + (['foobar 2000', '3735928559'], [10, 4]) + """ + rows = [tuple(map(str, row)) for row in rows] + sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue="")] + table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] + return table, sizes + + +def is_installable_dir(path: str) -> bool: + """Is path is a directory containing pyproject.toml or setup.py? + + If pyproject.toml exists, this is a PEP 517 project. Otherwise we look for + a legacy setuptools layout by identifying setup.py. We don't check for the + setup.cfg because using it without setup.py is only available for PEP 517 + projects, which are already covered by the pyproject.toml check. + """ + if not os.path.isdir(path): + return False + if os.path.isfile(os.path.join(path, "pyproject.toml")): + return True + if os.path.isfile(os.path.join(path, "setup.py")): + return True + return False + + +def read_chunks(file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE) -> Iterator[bytes]: + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path: str, resolve_symlinks: bool = True) -> str: + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = os.path.expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path: str) -> Tuple[str, str]: + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith(".tar"): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old: str, new: str) -> None: + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path: str) -> bool: + """ + Return True if this is a path pip is allowed to modify. + + If we're in a virtualenv, sys.prefix points to the virtualenv's + prefix; only sys.prefix is considered local. + + If we're not in a virtualenv, in general we can modify anything. + However, if the OS vendor has configured distutils to install + somewhere other than sys.prefix (which could be a subdirectory of + sys.prefix, e.g. /usr/local), we consider sys.prefix itself nonlocal + and the domain of the OS vendor. (In other words, everything _other + than_ sys.prefix is considered local.) + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + + path = normalize_path(path) + # Hard-coded becouse PyPy uses a different sys.prefix on Debian + prefix = '/usr' + + if running_under_virtualenv(): + return path.startswith(normalize_path(sys.prefix)) + else: + from pip._internal.locations import get_scheme + from pip._internal.models.scheme import SCHEME_KEYS + if path.startswith(prefix): + scheme = get_scheme("") + for key in SCHEME_KEYS: + local_path = getattr(scheme, key) + if path.startswith(normalize_path(local_path)): + return True + return False + else: + return True + + +def write_output(msg: Any, *args: Any) -> None: + logger.info(msg, *args) + + +class StreamWrapper(StringIO): + orig_stream: TextIO = None + + @classmethod + def from_stream(cls, orig_stream: TextIO) -> "StreamWrapper": + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + # https://github.com/python/mypy/issues/4125 + @property + def encoding(self): # type: ignore + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name: str) -> Iterator[StreamWrapper]: + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout() -> ContextManager[StreamWrapper]: + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output("stdout") + + +def captured_stderr() -> ContextManager[StreamWrapper]: + """ + See captured_stdout(). + """ + return captured_output("stderr") + + +# Simulates an enum +def enum(*sequential: Any, **named: Any) -> Type[Any]: + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums["reverse_mapping"] = reverse + return type("Enum", (), enums) + + +def build_netloc(host: str, port: Optional[int]) -> str: + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ":" in host: + # Only wrap host with square brackets when it is IPv6 + host = f"[{host}]" + return f"{host}:{port}" + + +def build_url_from_netloc(netloc: str, scheme: str = "https") -> str: + """ + Build a full URL from a netloc. + """ + if netloc.count(":") >= 2 and "@" not in netloc and "[" not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = f"[{netloc}]" + return f"{scheme}://{netloc}" + + +def parse_netloc(netloc: str) -> Tuple[str, Optional[int]]: + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib.parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc: str) -> NetlocTuple: + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if "@" not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit("@", 1) + pw: Optional[str] = None + if ":" in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user, pw = auth.split(":", 1) + else: + user, pw = auth, None + + user = urllib.parse.unquote(user) + if pw is not None: + pw = urllib.parse.unquote(pw) + + return netloc, (user, pw) + + +def redact_netloc(netloc: str) -> str: + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = "****" + password = "" + else: + user = urllib.parse.quote(user) + password = ":****" + return "{user}{password}@{netloc}".format( + user=user, password=password, netloc=netloc + ) + + +def _transform_url( + url: str, transform_netloc: Callable[[str], Tuple[Any, ...]] +) -> Tuple[str, NetlocTuple]: + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib.parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = (purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment) + surl = urllib.parse.urlunsplit(url_pieces) + return surl, cast("NetlocTuple", netloc_tuple) + + +def _get_netloc(netloc: str) -> NetlocTuple: + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc: str) -> Tuple[str]: + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url(url: str) -> Tuple[str, str, Tuple[str, str]]: + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url: str) -> str: + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url: str) -> str: + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +class HiddenText: + def __init__(self, secret: str, redacted: str) -> None: + self.secret = secret + self.redacted = redacted + + def __repr__(self) -> str: + return "".format(str(self)) + + def __str__(self) -> str: + return self.redacted + + # This is useful for testing. + def __eq__(self, other: Any) -> bool: + if type(self) != type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return self.secret == other.secret + + +def hide_value(value: str) -> HiddenText: + return HiddenText(value, redacted="****") + + +def hide_url(url: str) -> HiddenText: + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None: + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]), + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and WINDOWS and os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [sys.executable, "-m", "pip"] + sys.argv[1:] + raise CommandError( + "To modify pip, please run the following command:\n{}".format( + " ".join(new_command) + ) + ) + + +def is_console_interactive() -> bool: + """Is this console interactive?""" + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]: + """Return (hash, length) for path using hashlib.sha256()""" + + h = hashlib.sha256() + length = 0 + with open(path, "rb") as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def is_wheel_installed() -> bool: + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True + + +def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]: + """ + Return paired elements. + + For example: + s -> (s0, s1), (s2, s3), (s4, s5), ... + """ + iterable = iter(iterable) + return zip_longest(iterable, iterable) + + +def partition( + pred: Callable[[T], bool], + iterable: Iterable[T], +) -> Tuple[Iterable[T], Iterable[T]]: + """ + Use a predicate to partition entries into false entries and true entries, + like + + partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 + """ + t1, t2 = tee(iterable) + return filterfalse(pred, t1), filter(pred, t2) diff --git a/lib/python3.11/site-packages/pip/_internal/utils/models.py b/python/lib/python3.10/site-packages/pip/_internal/utils/models.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/models.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/models.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/packaging.py b/python/lib/python3.10/site-packages/pip/_internal/utils/packaging.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/packaging.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/packaging.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py b/python/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..f460c40 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,195 @@ +import sys +import textwrap +from typing import List, Optional, Sequence + +# Shim to wrap setup.py invocation with setuptools +# Note that __file__ is handled via two {!r} *and* %r, to ensure that paths on +# Windows are correctly handled (it should be "C:\\Users" not "C:\Users"). +_SETUPTOOLS_SHIM = textwrap.dedent( + """ + exec(compile(''' + # This is -- a caller that pip uses to run setup.py + # + # - It imports setuptools before invoking setup.py, to enable projects that directly + # import from `distutils.core` to work with newer packaging standards. + # - It provides a clear error message when setuptools is not installed. + # - It sets `sys.argv[0]` to the underlying `setup.py`, when invoking `setup.py` so + # setuptools doesn't think the script is `-c`. This avoids the following warning: + # manifest_maker: standard file '-c' not found". + # - It generates a shim setup.py, for handling setup.cfg-only projects. + import os, sys, tokenize + + try: + import setuptools + except ImportError as error: + print( + "ERROR: Can not execute `setup.py` since setuptools is not available in " + "the build environment.", + file=sys.stderr, + ) + sys.exit(1) + + __file__ = %r + sys.argv[0] = __file__ + + if os.path.exists(__file__): + filename = __file__ + with tokenize.open(__file__) as f: + setup_py_code = f.read() + else: + filename = "" + setup_py_code = "from setuptools import setup; setup()" + + exec(compile(setup_py_code, filename, "exec")) + ''' % ({!r},), "", "exec")) + """ +).rstrip() + + +def make_setuptools_shim_args( + setup_py_path: str, + global_options: Sequence[str] = None, + no_user_config: bool = False, + unbuffered_output: bool = False, +) -> List[str]: + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path: str, + global_options: Sequence[str], + build_options: Sequence[str], + destination_dir: str, +) -> List[str]: + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path: str, + global_options: Sequence[str], +) -> List[str]: + args = make_setuptools_shim_args( + setup_py_path, global_options=global_options, unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path: str, + global_options: Sequence[str], + install_options: Sequence[str], + no_user_config: bool, + prefix: Optional[str], + home: Optional[str], + use_user_site: bool, +) -> List[str]: + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + args += install_options + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--install-dir", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path: str, + egg_info_dir: Optional[str], + no_user_config: bool, +) -> List[str]: + args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config) + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args + + +def make_setuptools_install_args( + setup_py_path: str, + global_options: Sequence[str], + install_options: Sequence[str], + record_filename: str, + root: Optional[str], + prefix: Optional[str], + header_dir: Optional[str], + home: Optional[str], + use_user_site: bool, + no_user_config: bool, + pycompile: bool, +) -> List[str]: + assert not (use_user_site and prefix) + assert not (use_user_site and root) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + unbuffered_output=True, + ) + args += ["install", "--record", record_filename] + args += ["--single-version-externally-managed"] + + if root is not None: + args += ["--root", root] + if prefix is not None: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + if use_user_site: + args += ["--user", "--prefix="] + + if pycompile: + args += ["--compile"] + else: + args += ["--no-compile"] + + if header_dir: + args += ["--install-headers", header_dir] + + args += install_options + + return args diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py b/python/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py new file mode 100644 index 0000000..b5b7624 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py @@ -0,0 +1,260 @@ +import logging +import os +import shlex +import subprocess +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Iterable, + List, + Mapping, + Optional, + Union, +) + +from pip._vendor.rich.markup import escape + +from pip._internal.cli.spinners import SpinnerInterface, open_spinner +from pip._internal.exceptions import InstallationSubprocessError +from pip._internal.utils.logging import VERBOSE, subprocess_logger +from pip._internal.utils.misc import HiddenText + +if TYPE_CHECKING: + # Literal was introduced in Python 3.8. + # + # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7. + from typing import Literal + +CommandArgs = List[Union[str, HiddenText]] + + +def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs: + """ + Create a CommandArgs object. + """ + command_args: CommandArgs = [] + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args: Union[List[str], CommandArgs]) -> str: + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return " ".join( + shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg) + for arg in args + ) + + +def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]: + """ + Return the arguments in their raw, unredacted form. + """ + return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args] + + +def call_subprocess( + cmd: Union[List[str], CommandArgs], + show_stdout: bool = False, + cwd: Optional[str] = None, + on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise", + extra_ok_returncodes: Optional[Iterable[int]] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + unset_environ: Optional[Iterable[str]] = None, + spinner: Optional[SpinnerInterface] = None, + log_failed_cmd: Optional[bool] = True, + stdout_only: Optional[bool] = False, + *, + command_desc: str, +) -> str: + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + stdout_only: if true, return only stdout, else return both. When true, + logging of both stdout and stderr occurs when the subprocess has + terminated, else logging occurs as subprocess output is produced. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using VERBOSE. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.verbose + used_level = VERBOSE + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE, + cwd=cwd, + env=env, + errors="backslashreplace", + ) + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", + exc, + command_desc, + ) + raise + all_output = [] + if not stdout_only: + assert proc.stdout + assert proc.stdin + proc.stdin.close() + # In this mode, stdout and stderr are in the same pipe. + while True: + line: str = proc.stdout.readline() + if not line: + break + line = line.rstrip() + all_output.append(line + "\n") + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + assert spinner + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + output = "".join(all_output) + else: + # In this mode, stdout and stderr are in different pipes. + # We must use communicate() which is the only safe way to read both. + out, err = proc.communicate() + # log line by line to preserve pip log indenting + for out_line in out.splitlines(): + log_subprocess(out_line) + all_output.append(out) + for err_line in err.splitlines(): + log_subprocess(err_line) + all_output.append(err) + output = out + + proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes + if use_spinner: + assert spinner + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == "raise": + error = InstallationSubprocessError( + command_description=command_desc, + exit_code=proc.returncode, + output_lines=all_output if not showing_subprocess else None, + ) + if log_failed_cmd: + subprocess_logger.error("[present-diagnostic] %s", error) + subprocess_logger.verbose( + "[bold magenta]full command[/]: [blue]%s[/]", + escape(format_command_args(cmd)), + extra={"markup": True}, + ) + subprocess_logger.verbose( + "[bold magenta]cwd[/]: %s", + escape(cwd or "[inherit]"), + extra={"markup": True}, + ) + + raise error + elif on_returncode == "warn": + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, + proc.returncode, + cwd, + ) + elif on_returncode == "ignore": + pass + else: + raise ValueError(f"Invalid value: on_returncode={on_returncode!r}") + return output + + +def runner_with_spinner_message(message: str) -> Callable[..., None]: + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for pep517's Pep517HookCaller. Thus, the runner has + an API that matches what's expected by Pep517HookCaller.subprocess_runner. + """ + + def runner( + cmd: List[str], + cwd: Optional[str] = None, + extra_environ: Optional[Mapping[str, Any]] = None, + ) -> None: + with open_spinner(message) as spinner: + call_subprocess( + cmd, + command_desc=message, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py b/python/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..442679a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,246 @@ +import errno +import itertools +import logging +import os.path +import tempfile +from contextlib import ExitStack, contextmanager +from typing import Any, Dict, Iterator, Optional, TypeVar, Union + +from pip._internal.utils.misc import enum, rmtree + +logger = logging.getLogger(__name__) + +_T = TypeVar("_T", bound="TempDirectory") + + +# Kinds of temporary directories. Only needed for ones that are +# globally-managed. +tempdir_kinds = enum( + BUILD_ENV="build-env", + EPHEM_WHEEL_CACHE="ephem-wheel-cache", + REQ_BUILD="req-build", +) + + +_tempdir_manager: Optional[ExitStack] = None + + +@contextmanager +def global_tempdir_manager() -> Iterator[None]: + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry: + """Manages temp directory behavior""" + + def __init__(self) -> None: + self._should_delete: Dict[str, bool] = {} + + def set_delete(self, kind: str, value: bool) -> None: + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind: str) -> bool: + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry: Optional[TempDirectoryTypeRegistry] = None + + +@contextmanager +def tempdir_registry() -> Iterator[TempDirectoryTypeRegistry]: + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class _Default: + pass + + +_default = _Default() + + +class TempDirectory: + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path: Optional[str] = None, + delete: Union[bool, None, _Default] = _default, + kind: str = "temp", + globally_managed: bool = False, + ): + super().__init__() + + if delete is _default: + if path is not None: + # If we were given an explicit directory, resolve delete option + # now. + delete = False + else: + # Otherwise, we wait until cleanup and see what + # tempdir_registry says. + delete = None + + # The only time we specify path is in for editables where it + # is the value of the --src option. + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self) -> str: + assert not self._deleted, f"Attempted to access deleted path: {self._path}" + return self._path + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.path!r}>" + + def __enter__(self: _T) -> _T: + return self + + def __exit__(self, exc: Any, value: Any, tb: Any) -> None: + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind: str) -> str: + """Create a temporary directory and store its path in self.path""" + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + logger.debug("Created temporary directory: %s", path) + return path + + def cleanup(self) -> None: + """Remove the temporary directory created and reset state""" + self._deleted = True + if not os.path.exists(self._path): + return + rmtree(self._path) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original: str, delete: Optional[bool] = None) -> None: + self.original = original.rstrip("/\\") + super().__init__(delete=delete) + + @classmethod + def _generate_names(cls, name: str) -> Iterator[str]: + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1 + ): + new_name = "~" + "".join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i + ): + new_name = "~" + "".join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind: str) -> str: + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-")) + + logger.debug("Created temporary directory: %s", path) + return path diff --git a/python/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py b/python/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py new file mode 100644 index 0000000..5f63f97 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py @@ -0,0 +1,258 @@ +"""Utilities related archives. +""" + +import logging +import os +import shutil +import stat +import tarfile +import zipfile +from typing import Iterable, List, Optional +from zipfile import ZipInfo + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug("bz2 module is not available") + +try: + # Only for Python 3.3+ + import lzma # noqa + + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug("lzma module is not available") + + +def current_umask() -> int: + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path: str) -> List[str]: + path = path.lstrip("/").lstrip("\\") + if "/" in path and ( + ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path + ): + return path.split("/", 1) + elif "\\" in path: + return path.split("\\", 1) + else: + return [path, ""] + + +def has_leading_dir(paths: Iterable[str]) -> bool: + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory: str, target: str) -> bool: + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def set_extracted_file_to_default_mode_plus_executable(path: str) -> None: + """ + Make file present at path have execute for user/group/world + (chmod +x) is no-op on windows per python docs + """ + os.chmod(path, (0o777 & ~current_umask() | 0o111)) + + +def zip_item_is_executable(info: ZipInfo) -> bool: + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + return bool(mode and stat.S_ISREG(mode) and mode & 0o111) + + +def unzip_file(filename: str, location: str, flatten: bool = True) -> None: + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, "rb") + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + "The zip file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith("/") or fn.endswith("\\"): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + if zip_item_is_executable(info): + set_extracted_file_to_default_mode_plus_executable(fn) + finally: + zipfp.close() + + +def untar_file(filename: str, location: str) -> None: + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"): + mode = "r:gz" + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = "r:bz2" + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = "r:xz" + elif filename.lower().endswith(".tar"): + mode = "r" + else: + logger.warning( + "Cannot determine compression type for file %s", + filename, + ) + mode = "r:*" + tar = tarfile.open(filename, mode, encoding="utf-8") + try: + leading = has_leading_dir([member.name for member in tar.getmembers()]) + for member in tar.getmembers(): + fn = member.name + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + "The tar file ({}) has a file ({}) trying to install " + "outside target directory ({})" + ) + raise InstallationError(message.format(filename, path, location)) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + "In the tar file %s the member %s is invalid: %s", + filename, + member.name, + exc, + ) + continue + ensure_dir(os.path.dirname(path)) + assert fp is not None + with open(path, "wb") as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + set_extracted_file_to_default_mode_plus_executable(path) + finally: + tar.close() + + +def unpack_file( + filename: str, + location: str, + content_type: Optional[str] = None, +) -> None: + filename = os.path.realpath(filename) + if ( + content_type == "application/zip" + or filename.lower().endswith(ZIP_EXTENSIONS) + or zipfile.is_zipfile(filename) + ): + unzip_file(filename, location, flatten=not filename.endswith(".whl")) + elif ( + content_type == "application/x-gzip" + or tarfile.is_tarfile(filename) + or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + "Cannot unpack file %s (downloaded from %s, content-type: %s); " + "cannot detect archive format", + filename, + location, + content_type, + ) + raise InstallationError(f"Cannot determine archive format of {location}") diff --git a/lib/python3.11/site-packages/pip/_internal/utils/urls.py b/python/lib/python3.10/site-packages/pip/_internal/utils/urls.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/urls.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/urls.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py b/python/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py diff --git a/lib/python3.11/site-packages/pip/_internal/utils/wheel.py b/python/lib/python3.10/site-packages/pip/_internal/utils/wheel.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/utils/wheel.py rename to python/lib/python3.10/site-packages/pip/_internal/utils/wheel.py diff --git a/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/vcs/__init__.py rename to python/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..a7b16e2 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,101 @@ +import logging +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import HiddenText, display_path +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = "bzr" + dirname = ".bzr" + repo_name = "branch" + schemes = ( + "bzr+http", + "bzr+https", + "bzr+ssh", + "bzr+sftp", + "bzr+ftp", + "bzr+lp", + "bzr+file", + ) + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flag = "--quiet" + elif verbosity == 1: + flag = "" + else: + flag = f"-{'v'*verbosity}" + cmd_args = make_command("branch", flag, rev_options.to_args(), url, dest) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + self.run_command(make_command("switch", url), cwd=dest) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command("pull", "-q", rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "bzr+" + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location: str) -> str: + urls = cls.run_command( + ["info"], show_stdout=False, stdout_only=True, cwd=location + ) + for line in urls.splitlines(): + line = line.strip() + for x in ("checkout of branch: ", "parent branch: "): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + raise RemoteNotFoundError + + @classmethod + def get_revision(cls, location: str) -> str: + revision = cls.run_command( + ["revno"], + show_stdout=False, + stdout_only=True, + cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/lib/python3.11/site-packages/pip/_internal/vcs/git.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/git.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/vcs/git.py rename to python/lib/python3.10/site-packages/pip/_internal/vcs/git.py diff --git a/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py rename to python/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..89c8754 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,324 @@ +import logging +import os +import re +from typing import List, Optional, Tuple + +from pip._internal.utils.misc import ( + HiddenText, + display_path, + is_console_interactive, + is_installable_dir, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import CommandArgs, make_command +from pip._internal.vcs.versioncontrol import ( + AuthInfo, + RemoteNotFoundError, + RevOptions, + VersionControl, + vcs, +) + +logger = logging.getLogger(__name__) + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r"(.*)") + + +class Subversion(VersionControl): + name = "svn" + dirname = ".svn" + repo_name = "checkout" + schemes = ("svn+ssh", "svn+http", "svn+https", "svn+svn", "svn+file") + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url: str) -> bool: + return True + + @staticmethod + def get_base_rev_args(rev: str) -> List[str]: + return ["-r", rev] + + @classmethod + def get_revision(cls, location: str) -> str: + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, _ in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, "entries") + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + assert dirurl is not None + base = dirurl + "/" # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return str(revision) + + @classmethod + def get_netloc_and_auth( + cls, netloc: str, scheme: str + ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]: + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == "ssh": + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super().get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super().get_url_rev_and_auth(url) + if url.startswith("ssh://"): + url = "svn+" + url + return url, rev, user_pass + + @staticmethod + def make_rev_args( + username: Optional[str], password: Optional[HiddenText] + ) -> CommandArgs: + extra_args: CommandArgs = [] + if username: + extra_args += ["--username", username] + if password: + extra_args += ["--password", password] + + return extra_args + + @classmethod + def get_remote_url(cls, location: str) -> str: + # In cases where the source is in a subdirectory, we have to look up in + # the location until we find a valid project root. + orig_location = location + while not is_installable_dir(location): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding a Python project. + logger.warning( + "Could not find Python project for directory %s (tried all " + "parent directories)", + orig_location, + ) + raise RemoteNotFoundError + + url, _rev = cls._get_svn_url_rev(location) + if url is None: + raise RemoteNotFoundError + + return url + + @classmethod + def _get_svn_url_rev(cls, location: str) -> Tuple[Optional[str], int]: + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, "entries") + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = "" + + url = None + if data.startswith("8") or data.startswith("9") or data.startswith("10"): + entries = list(map(str.splitlines, data.split("\n\x0c\n"))) + del entries[0][0] # get rid of the '8' + url = entries[0][3] + revs = [int(d[9]) for d in entries if len(d) > 9 and d[9]] + [0] + elif data.startswith("= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ["info", "--xml", location], + show_stdout=False, + stdout_only=True, + ) + match = _svn_info_xml_url_re.search(xml) + assert match is not None + url = match.group(1) + revs = [int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml)] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool: + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive: bool = None) -> None: + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version: Optional[Tuple[int, ...]] = None + + super().__init__() + + def call_vcs_version(self) -> Tuple[int, ...]: + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) + # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 + version_prefix = "svn, version " + version = self.run_command(["--version"], show_stdout=False, stdout_only=True) + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix) :].split()[0] + version_list = version.partition("-")[0].split(".") + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self) -> Tuple[int, ...]: + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self) -> CommandArgs: + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ["--non-interactive"] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ["--force-interactive"] + + return [] + + def fetch_new( + self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int + ) -> None: + rev_display = rev_options.to_display() + logger.info( + "Checking out %s%s to %s", + url, + rev_display, + display_path(dest), + ) + if verbosity <= 0: + flag = "--quiet" + else: + flag = "" + cmd_args = make_command( + "checkout", + flag, + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "switch", + self.get_remote_call_options(), + rev_options.to_args(), + url, + dest, + ) + self.run_command(cmd_args) + + def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None: + cmd_args = make_command( + "update", + self.get_remote_call_options(), + rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py b/python/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py similarity index 100% rename from lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py rename to python/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py diff --git a/python/lib/python3.10/site-packages/pip/_internal/wheel_builder.py b/python/lib/python3.10/site-packages/pip/_internal/wheel_builder.py new file mode 100644 index 0000000..d066344 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_internal/wheel_builder.py @@ -0,0 +1,377 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +import logging +import os.path +import re +import shutil +from typing import Any, Callable, Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version +from pip._vendor.packaging.version import InvalidVersion, Version + +from pip._internal.cache import WheelCache +from pip._internal.exceptions import InvalidWheelFilename, UnsupportedWheel +from pip._internal.metadata import FilesystemWheel, get_wheel_distribution +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_editable import build_wheel_editable +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + +_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE) + +BinaryAllowedPredicate = Callable[[InstallRequirement], bool] +BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + + +def _contains_egg_info(s: str) -> bool: + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req: InstallRequirement, + need_wheel: bool, + check_binary_allowed: BinaryAllowedPredicate, +) -> bool: + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + "Skipping %s, due to already being wheel.", + req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if not req.source_dir: + return False + + if req.editable: + # we only build PEP 660 editable requirements + return req.supports_pyproject_editable() + + if req.use_pep517: + return True + + if not check_binary_allowed(req): + logger.info( + "Skipping wheel build for %s, due to binaries being disabled for it.", + req.name, + ) + return False + + if not is_wheel_installed(): + # we don't build legacy requirements if wheel is not installed + logger.info( + "Using legacy 'setup.py install' for %s, " + "since package 'wheel' is not installed.", + req.name, + ) + return False + + return True + + +def should_build_for_wheel_command( + req: InstallRequirement, +) -> bool: + return _should_build(req, need_wheel=True, check_binary_allowed=_always_true) + + +def should_build_for_install_command( + req: InstallRequirement, + check_binary_allowed: BinaryAllowedPredicate, +) -> bool: + return _should_build( + req, need_wheel=False, check_binary_allowed=check_binary_allowed + ) + + +def _should_cache( + req: InstallRequirement, +) -> Optional[bool]: + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if req.editable or not req.source_dir: + # never cache editable requirements + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + assert req.link + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req: InstallRequirement, + wheel_cache: WheelCache, +) -> str: + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + assert req.link + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _always_true(_: Any) -> bool: + return True + + +def _verify_one(req: InstallRequirement, wheel_path: str) -> None: + canonical_name = canonicalize_name(req.name or "") + w = Wheel(os.path.basename(wheel_path)) + if canonicalize_name(w.name) != canonical_name: + raise InvalidWheelFilename( + "Wheel has unexpected file name: expected {!r}, " + "got {!r}".format(canonical_name, w.name), + ) + dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name) + dist_verstr = str(dist.version) + if canonicalize_version(dist_verstr) != canonicalize_version(w.version): + raise InvalidWheelFilename( + "Wheel has unexpected file name: expected {!r}, " + "got {!r}".format(dist_verstr, w.version), + ) + metadata_version_value = dist.metadata_version + if metadata_version_value is None: + raise UnsupportedWheel("Missing Metadata-Version") + try: + metadata_version = Version(metadata_version_value) + except InvalidVersion: + msg = f"Invalid Metadata-Version: {metadata_version_value}" + raise UnsupportedWheel(msg) + if metadata_version >= Version("1.2") and not isinstance(dist.version, Version): + raise UnsupportedWheel( + "Metadata 1.2 mandates PEP 440 version, " + "but {!r} is not".format(dist_verstr) + ) + + +def _build_one( + req: InstallRequirement, + output_dir: str, + verify: bool, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + artifact = "editable" if editable else "wheel" + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building %s for %s failed: %s", + artifact, + req.name, + e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + wheel_path = _build_one_inside_env( + req, output_dir, build_options, global_options, editable + ) + if wheel_path and verify: + try: + _verify_one(req, wheel_path) + except (InvalidWheelFilename, UnsupportedWheel) as e: + logger.warning("Built %s for %s is invalid: %s", artifact, req.name, e) + return None + return wheel_path + + +def _build_one_inside_env( + req: InstallRequirement, + output_dir: str, + build_options: List[str], + global_options: List[str], + editable: bool, +) -> Optional[str]: + with TempDirectory(kind="wheel") as temp_dir: + assert req.name + if req.use_pep517: + assert req.metadata_directory + assert req.pep517_backend + if global_options: + logger.warning( + "Ignoring --global-option when building %s using PEP 517", req.name + ) + if build_options: + logger.warning( + "Ignoring --build-option when building %s using PEP 517", req.name + ) + if editable: + wheel_path = build_wheel_editable( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info( + "Created wheel for %s: filename=%s size=%d sha256=%s", + req.name, + wheel_name, + length, + wheel_hash.hexdigest(), + ) + logger.info("Stored in directory: %s", output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, + e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool: + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info("Running setup.py clean for %s", req.name) + try: + call_subprocess( + clean_args, command_desc="python setup.py clean", cwd=req.source_dir + ) + return True + except Exception: + logger.error("Failed cleaning build dir for %s", req.name) + return False + + +def build( + requirements: Iterable[InstallRequirement], + wheel_cache: WheelCache, + verify: bool, + build_options: List[str], + global_options: List[str], +) -> BuildResult: + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + "Building wheels for collected packages: %s", + ", ".join(req.name for req in requirements), # type: ignore + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + assert req.name + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, + cache_dir, + verify, + build_options, + global_options, + req.editable and req.permit_editable_wheels, + ) + if wheel_file: + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + "Successfully built %s", + " ".join([req.name for req in build_successes]), # type: ignore + ) + if build_failures: + logger.info( + "Failed to build %s", + " ".join([req.name for req in build_failures]), # type: ignore + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/python/lib/python3.10/site-packages/pip/_vendor/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..3843cb0 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,111 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("certifi") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("platformdirs") + vendored("progress") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("resolvelib") + vendored("tenacity") + vendored("tomli") + vendored("urllib3") diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8435d62 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.10" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController + +import logging +logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..44e4309 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value, expires=None): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value, expires=None): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..44becd6 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..6cd1106 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,150 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from lockfile import LockFile + from lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value, expires=None): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..720b507 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..d7e7380 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,415 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + +PERMANENT_REDIRECT_STATUSES = (301, 308) + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301, 308) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached permanent redirect, return it immediately. We + # don't need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if int(resp.status) in PERMANENT_REDIRECT_STATUSES: + msg = ( + "Returning cached permanent redirect response " + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + if "date" in response_headers: + date = calendar.timegm(parsedate_tz(response_headers["date"])) + else: + date = 0 + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + expires_time = 0 + if response_headers.get("expires"): + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires) - date + + expires_time = max(expires_time, 14 * 86400) + + logger.debug("etag object cached for {0} seconds".format(expires_time)) + logger.debug("Caching due to etag") + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body), + expires=expires_time, + ) + + # Add to the cache any permanent redirects. We do this before looking + # that the Date headers. + elif int(response.status) in PERMANENT_REDIRECT_STATUSES: + logger.debug("Caching permanent redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response, b"")) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + date = calendar.timegm(parsedate_tz(response_headers["date"])) + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + expires_time = cc["max-age"] + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body), + expires=expires_time, + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + expires = parsedate_tz(response_headers["expires"]) + if expires is not None: + expires_time = calendar.timegm(expires) - date + else: + expires_time = None + + logger.debug( + "Caching b/c of expires header. expires in {0} seconds".format( + expires_time + ) + ) + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + expires=expires_time, + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..b075df1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +# SPDX-FileCopyrightText: 2015 Eric Larson +# +# SPDX-License-Identifier: Apache-2.0 + +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +_default_body_read = object() + + +class Serializer(object): + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + # When a body isn't passed in, we'll read the response. We + # also update the response with a new file handler to be + # sure it acts as though it was never read. + body = response.read(decode_content=False) + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py b/python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py rename to python/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..8db1a0e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import contents, where + +__version__ = "2021.10.08" diff --git a/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py b/python/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py rename to python/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem b/python/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..6d0ccc0 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4362 @@ + +# 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=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=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=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 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=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: 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=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=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=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=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=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=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=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=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----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: 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=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 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=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=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV +BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk +YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV +BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN +MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF +UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD +VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v +dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj +cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q +yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH +2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX +H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL +zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR +p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz +W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ +SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn +LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 +n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B +u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L +9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej +rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK +pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 +vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq +OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ +/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 +2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI ++PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 +MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo +tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- diff --git a/python/lib/python3.10/site-packages/pip/_vendor/certifi/core.py b/python/lib/python3.10/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..f8d4313 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import os + + +class _PipPatchedCertificate(Exception): + pass + + +DEBIAN_CA_CERTS_PATH = '/etc/ssl/certs/ca-certificates.crt' + +try: + # Return a certificate file on disk for a standalone pip zipapp running in + # an isolated build environment to use. Passing --cert to the standalone + # pip does not work since requests calls where() unconditionally on import. + _PIP_STANDALONE_CERT = os.environ.get("_PIP_STANDALONE_CERT") + if _PIP_STANDALONE_CERT: + def where(): + return _PIP_STANDALONE_CERT + raise _PipPatchedCertificate() + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where(): + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_PATH = DEBIAN_CA_CERTS_PATH + + return _CACERT_PATH + +except _PipPatchedCertificate: + pass + +except ImportError: + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text(_module, _path, encoding="ascii"): + with open(where(), "r", encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where(): + return DEBIAN_CA_CERTS_PATH + + +def contents(): + with open(where(), "r", encoding="ascii") as data: + return data.read() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..80ad254 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,83 @@ +######################## 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 .universaldetector import UniversalDetector +from .enums import InputState +from .version import __version__, VERSION + + +__all__ = ['UniversalDetector', 'detect', 'detect_all', '__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: ' + '{}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() + + +def detect_all(byte_str): + """ + Detect all the possible encodings 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: ' + '{}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + + detector = UniversalDetector() + detector.feed(byte_str) + detector.close() + + if detector._input_state == InputState.HIGH_BYTE: + results = [] + for prober in detector._charset_probers: + if prober.get_confidence() > detector.MINIMUM_THRESHOLD: + charset_name = prober.charset_name + lower_charset_name = prober.charset_name.lower() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if detector._has_win_bytes: + charset_name = detector.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + results.append({ + 'encoding': charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language, + }) + if len(results) > 0: + return sorted(results, key=lambda result: -result['confidence']) + + return [detector.result] diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 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/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..5812cef --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,107 @@ +######################## 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 + self._state = ProbingState.FOUND_IT + 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/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt b/python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt rename to python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..6d6f93a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,84 @@ +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{}: {} with confidence {}'.format(name, result['encoding'], + result['confidence']) + else: + return '{}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/compat.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..8941572 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,36 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + string_types = (str, unicode) + text_type = unicode + iteritems = dict.iteritems +else: + PY2 = False + PY3 = True + string_types = (bytes, str) + text_type = str + iteritems = dict.items diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 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/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..e963a50 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,4650 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +BULGARIAN_LANG_MODEL = { + 63: { # 'e' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 1, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 0, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 45: { # '\xad' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 1, # 'М' + 36: 0, # 'Ð' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 31: { # 'Ð' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 2, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 1, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Ð' + 41: 1, # 'О' + 30: 2, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 2, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 0, # 'и' + 26: 2, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 1, # 'у' + 29: 2, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 32: { # 'Б' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 2, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 1, # 'Щ' + 61: 2, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 35: { # 'Ð’' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 0, # 'Ð¥' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 2, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 2, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 43: { # 'Г' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 1, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 37: { # 'Д' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 2, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 2, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 44: { # 'Е' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 2, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 2, # 'Ф' + 49: 1, # 'Ð¥' + 53: 2, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 0, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 1, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 55: { # 'Ж' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 47: { # 'З' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 2, # 'Ð' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 40: { # 'И' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 2, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 2, # 'М' + 36: 2, # 'Ð' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 2, # 'Я' + 1: 1, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 3, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 0, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 59: { # 'Й' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 33: { # 'К' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 2, # 'Ð' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 46: { # 'Л' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 2, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 38: { # 'М' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 2, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 36: { # 'Ð' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 2, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 41: { # 'О' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 2, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 1, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 1, # 'Й' + 33: 2, # 'К' + 46: 2, # 'Л' + 38: 2, # 'М' + 36: 2, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 0, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 1, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 0, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 1, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 1, # 'ц' + 21: 2, # 'ч' + 27: 0, # 'ш' + 24: 2, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 30: { # 'П' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 2, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 2, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 39: { # 'Р' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 2, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 3, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 28: { # 'С' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 3, # 'Ð' + 32: 2, # 'Б' + 35: 2, # 'Ð’' + 43: 1, # 'Г' + 37: 2, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 2, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 1, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 2, # 'у' + 29: 2, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 34: { # 'Т' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 2, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 2, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 1, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 1, # 'Ъ' + 60: 0, # 'Ю' + 56: 1, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 3, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 51: { # 'У' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 2, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 2, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 48: { # 'Ф' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 2, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 1, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 2, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 49: { # 'Ð¥' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 1, # 'П' + 39: 1, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 53: { # 'Ц' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 2, # 'И' + 59: 0, # 'Й' + 33: 2, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 2, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 50: { # 'Ч' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 2, # 'Ð' + 32: 1, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 2, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 54: { # 'Ш' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 1, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 1, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 2, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 57: { # 'Щ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 1, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 1, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 1, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 61: { # 'Ъ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 1, # 'Ж' + 47: 1, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 2, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 2, # 'Р' + 28: 1, # 'С' + 34: 1, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 1, # 'Ð¥' + 53: 1, # 'Ц' + 50: 1, # 'Ч' + 54: 1, # 'Ш' + 57: 1, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 1, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 60: { # 'Ю' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 1, # 'Б' + 35: 0, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 1, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 0, # 'М' + 36: 1, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 0, # 'е' + 23: 2, # 'ж' + 15: 1, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 0, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 56: { # 'Я' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 1, # 'Б' + 35: 1, # 'Ð’' + 43: 1, # 'Г' + 37: 1, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 1, # 'Л' + 38: 1, # 'М' + 36: 1, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 2, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 1, # 'и' + 26: 1, # 'й' + 12: 1, # 'к' + 10: 1, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 0, # 'о' + 13: 2, # 'п' + 7: 1, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 1: { # 'а' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 1, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 3, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 18: { # 'б' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 3, # 'у' + 29: 0, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 3, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 9: { # 'в' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 1, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 0, # 'в' + 20: 2, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 20: { # 'г' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 11: { # 'д' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 3: { # 'е' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 2, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 2, # 'у' + 29: 3, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 23: { # 'ж' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 15: { # 'з' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 2: { # 'и' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 1, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 1, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 1, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 1, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 2, # 'у' + 29: 3, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 2, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 26: { # 'й' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 2, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 1, # 'у' + 29: 2, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 12: { # 'к' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 1, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 1, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 3, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 10: { # 'л' + 63: 1, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 1, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 1, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 2, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 2, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 2, # 'ÑŒ' + 42: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 14: { # 'м' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 1, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 3, # 'у' + 29: 2, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 6: { # 'н' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 1, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 2, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 2, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 3, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 2, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 4: { # 'о' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 2, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 3, # 'и' + 26: 3, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 2, # 'у' + 29: 3, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 3, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 3, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 13: { # 'п' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 3, # 'л' + 14: 1, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 7: { # 'Ñ€' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 3, # 'е' + 23: 3, # 'ж' + 15: 2, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 1, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 2, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 3, # 'ц' + 21: 2, # 'ч' + 27: 3, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 8: { # 'Ñ' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 2, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 2, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 2, # 'ш' + 24: 0, # 'щ' + 17: 3, # 'ÑŠ' + 52: 2, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 5: { # 'Ñ‚' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 2, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 3, # 'у' + 29: 1, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 2, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 3, # 'ÑŠ' + 52: 2, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 19: { # 'у' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 2, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 1, # 'у' + 29: 2, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 3, # 'ш' + 24: 2, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 29: { # 'Ñ„' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 1, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 2, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 2, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 25: { # 'Ñ…' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 2, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 1, # 'п' + 7: 3, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 3, # 'у' + 29: 0, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 22: { # 'ц' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 2, # 'в' + 20: 1, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 1, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 2, # 'к' + 10: 1, # 'л' + 14: 1, # 'м' + 6: 1, # 'н' + 4: 2, # 'о' + 13: 1, # 'п' + 7: 1, # 'Ñ€' + 8: 1, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 2, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 1, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 21: { # 'ч' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 1, # 'б' + 9: 3, # 'в' + 20: 1, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 1, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 2, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 3, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 1, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 27: { # 'ш' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 2, # 'в' + 20: 0, # 'г' + 11: 1, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 3, # 'к' + 10: 2, # 'л' + 14: 1, # 'м' + 6: 3, # 'н' + 4: 2, # 'о' + 13: 2, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 2, # 'у' + 29: 1, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 1, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 2, # 'ÑŠ' + 52: 1, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 24: { # 'щ' + 63: 1, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 3, # 'а' + 18: 0, # 'б' + 9: 1, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 3, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 3, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 2, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 1, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 3, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 1, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 2, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 17: { # 'ÑŠ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 3, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 3, # 'ж' + 15: 3, # 'з' + 2: 1, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 3, # 'о' + 13: 3, # 'п' + 7: 3, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 1, # 'у' + 29: 1, # 'Ñ„' + 25: 2, # 'Ñ…' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 2, # 'ш' + 24: 3, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 2, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 52: { # 'ÑŒ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 1, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 1, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 1, # 'н' + 4: 3, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 1, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 1, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 42: { # 'ÑŽ' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 1, # 'а' + 18: 2, # 'б' + 9: 1, # 'в' + 20: 2, # 'г' + 11: 2, # 'д' + 3: 1, # 'е' + 23: 2, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 1, # 'й' + 12: 2, # 'к' + 10: 2, # 'л' + 14: 2, # 'м' + 6: 2, # 'н' + 4: 1, # 'о' + 13: 1, # 'п' + 7: 2, # 'Ñ€' + 8: 2, # 'Ñ' + 5: 2, # 'Ñ‚' + 19: 1, # 'у' + 29: 1, # 'Ñ„' + 25: 1, # 'Ñ…' + 22: 2, # 'ц' + 21: 3, # 'ч' + 27: 1, # 'ш' + 24: 1, # 'щ' + 17: 1, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 16: { # 'Ñ' + 63: 0, # 'e' + 45: 1, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 3, # 'б' + 9: 3, # 'в' + 20: 2, # 'г' + 11: 3, # 'д' + 3: 2, # 'е' + 23: 1, # 'ж' + 15: 2, # 'з' + 2: 1, # 'и' + 26: 2, # 'й' + 12: 3, # 'к' + 10: 3, # 'л' + 14: 3, # 'м' + 6: 3, # 'н' + 4: 1, # 'о' + 13: 2, # 'п' + 7: 2, # 'Ñ€' + 8: 3, # 'Ñ' + 5: 3, # 'Ñ‚' + 19: 1, # 'у' + 29: 1, # 'Ñ„' + 25: 3, # 'Ñ…' + 22: 2, # 'ц' + 21: 1, # 'ч' + 27: 1, # 'ш' + 24: 2, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 58: { # 'Ñ”' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, + 62: { # 'â„–' + 63: 0, # 'e' + 45: 0, # '\xad' + 31: 0, # 'Ð' + 32: 0, # 'Б' + 35: 0, # 'Ð’' + 43: 0, # 'Г' + 37: 0, # 'Д' + 44: 0, # 'Е' + 55: 0, # 'Ж' + 47: 0, # 'З' + 40: 0, # 'И' + 59: 0, # 'Й' + 33: 0, # 'К' + 46: 0, # 'Л' + 38: 0, # 'М' + 36: 0, # 'Ð' + 41: 0, # 'О' + 30: 0, # 'П' + 39: 0, # 'Р' + 28: 0, # 'С' + 34: 0, # 'Т' + 51: 0, # 'У' + 48: 0, # 'Ф' + 49: 0, # 'Ð¥' + 53: 0, # 'Ц' + 50: 0, # 'Ч' + 54: 0, # 'Ш' + 57: 0, # 'Щ' + 61: 0, # 'Ъ' + 60: 0, # 'Ю' + 56: 0, # 'Я' + 1: 0, # 'а' + 18: 0, # 'б' + 9: 0, # 'в' + 20: 0, # 'г' + 11: 0, # 'д' + 3: 0, # 'е' + 23: 0, # 'ж' + 15: 0, # 'з' + 2: 0, # 'и' + 26: 0, # 'й' + 12: 0, # 'к' + 10: 0, # 'л' + 14: 0, # 'м' + 6: 0, # 'н' + 4: 0, # 'о' + 13: 0, # 'п' + 7: 0, # 'Ñ€' + 8: 0, # 'Ñ' + 5: 0, # 'Ñ‚' + 19: 0, # 'у' + 29: 0, # 'Ñ„' + 25: 0, # 'Ñ…' + 22: 0, # 'ц' + 21: 0, # 'ч' + 27: 0, # 'ш' + 24: 0, # 'щ' + 17: 0, # 'ÑŠ' + 52: 0, # 'ÑŒ' + 42: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + 58: 0, # 'Ñ”' + 62: 0, # 'â„–' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 194, # '\x80' + 129: 195, # '\x81' + 130: 196, # '\x82' + 131: 197, # '\x83' + 132: 198, # '\x84' + 133: 199, # '\x85' + 134: 200, # '\x86' + 135: 201, # '\x87' + 136: 202, # '\x88' + 137: 203, # '\x89' + 138: 204, # '\x8a' + 139: 205, # '\x8b' + 140: 206, # '\x8c' + 141: 207, # '\x8d' + 142: 208, # '\x8e' + 143: 209, # '\x8f' + 144: 210, # '\x90' + 145: 211, # '\x91' + 146: 212, # '\x92' + 147: 213, # '\x93' + 148: 214, # '\x94' + 149: 215, # '\x95' + 150: 216, # '\x96' + 151: 217, # '\x97' + 152: 218, # '\x98' + 153: 219, # '\x99' + 154: 220, # '\x9a' + 155: 221, # '\x9b' + 156: 222, # '\x9c' + 157: 223, # '\x9d' + 158: 224, # '\x9e' + 159: 225, # '\x9f' + 160: 81, # '\xa0' + 161: 226, # 'Ð' + 162: 227, # 'Ђ' + 163: 228, # 'Ѓ' + 164: 229, # 'Є' + 165: 230, # 'Ð…' + 166: 105, # 'І' + 167: 231, # 'Ї' + 168: 232, # 'Ј' + 169: 233, # 'Љ' + 170: 234, # 'Њ' + 171: 235, # 'Ћ' + 172: 236, # 'ÐŒ' + 173: 45, # '\xad' + 174: 237, # 'ÐŽ' + 175: 238, # 'Ð' + 176: 31, # 'Ð' + 177: 32, # 'Б' + 178: 35, # 'Ð’' + 179: 43, # 'Г' + 180: 37, # 'Д' + 181: 44, # 'Е' + 182: 55, # 'Ж' + 183: 47, # 'З' + 184: 40, # 'И' + 185: 59, # 'Й' + 186: 33, # 'К' + 187: 46, # 'Л' + 188: 38, # 'М' + 189: 36, # 'Ð' + 190: 41, # 'О' + 191: 30, # 'П' + 192: 39, # 'Р' + 193: 28, # 'С' + 194: 34, # 'Т' + 195: 51, # 'У' + 196: 48, # 'Ф' + 197: 49, # 'Ð¥' + 198: 53, # 'Ц' + 199: 50, # 'Ч' + 200: 54, # 'Ш' + 201: 57, # 'Щ' + 202: 61, # 'Ъ' + 203: 239, # 'Ы' + 204: 67, # 'Ь' + 205: 240, # 'Э' + 206: 60, # 'Ю' + 207: 56, # 'Я' + 208: 1, # 'а' + 209: 18, # 'б' + 210: 9, # 'в' + 211: 20, # 'г' + 212: 11, # 'д' + 213: 3, # 'е' + 214: 23, # 'ж' + 215: 15, # 'з' + 216: 2, # 'и' + 217: 26, # 'й' + 218: 12, # 'к' + 219: 10, # 'л' + 220: 14, # 'м' + 221: 6, # 'н' + 222: 4, # 'о' + 223: 13, # 'п' + 224: 7, # 'Ñ€' + 225: 8, # 'Ñ' + 226: 5, # 'Ñ‚' + 227: 19, # 'у' + 228: 29, # 'Ñ„' + 229: 25, # 'Ñ…' + 230: 22, # 'ц' + 231: 21, # 'ч' + 232: 27, # 'ш' + 233: 24, # 'щ' + 234: 17, # 'ÑŠ' + 235: 75, # 'Ñ‹' + 236: 52, # 'ÑŒ' + 237: 241, # 'Ñ' + 238: 42, # 'ÑŽ' + 239: 16, # 'Ñ' + 240: 62, # 'â„–' + 241: 242, # 'Ñ‘' + 242: 243, # 'Ñ’' + 243: 244, # 'Ñ“' + 244: 58, # 'Ñ”' + 245: 245, # 'Ñ•' + 246: 98, # 'Ñ–' + 247: 246, # 'Ñ—' + 248: 247, # 'ј' + 249: 248, # 'Ñ™' + 250: 249, # 'Ñš' + 251: 250, # 'Ñ›' + 252: 251, # 'Ñœ' + 253: 91, # '§' + 254: 252, # 'Ñž' + 255: 253, # 'ÑŸ' +} + +ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5', + language='Bulgarian', + char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ') + +WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 77, # 'A' + 66: 90, # 'B' + 67: 99, # 'C' + 68: 100, # 'D' + 69: 72, # 'E' + 70: 109, # 'F' + 71: 107, # 'G' + 72: 101, # 'H' + 73: 79, # 'I' + 74: 185, # 'J' + 75: 81, # 'K' + 76: 102, # 'L' + 77: 76, # 'M' + 78: 94, # 'N' + 79: 82, # 'O' + 80: 110, # 'P' + 81: 186, # 'Q' + 82: 108, # 'R' + 83: 91, # 'S' + 84: 74, # 'T' + 85: 119, # 'U' + 86: 84, # 'V' + 87: 96, # 'W' + 88: 111, # 'X' + 89: 187, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 65, # 'a' + 98: 69, # 'b' + 99: 70, # 'c' + 100: 66, # 'd' + 101: 63, # 'e' + 102: 68, # 'f' + 103: 112, # 'g' + 104: 103, # 'h' + 105: 92, # 'i' + 106: 194, # 'j' + 107: 104, # 'k' + 108: 95, # 'l' + 109: 86, # 'm' + 110: 87, # 'n' + 111: 71, # 'o' + 112: 116, # 'p' + 113: 195, # 'q' + 114: 85, # 'r' + 115: 93, # 's' + 116: 97, # 't' + 117: 113, # 'u' + 118: 196, # 'v' + 119: 197, # 'w' + 120: 198, # 'x' + 121: 199, # 'y' + 122: 200, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 206, # 'Ђ' + 129: 207, # 'Ѓ' + 130: 208, # '‚' + 131: 209, # 'Ñ“' + 132: 210, # '„' + 133: 211, # '…' + 134: 212, # '†' + 135: 213, # '‡' + 136: 120, # '€' + 137: 214, # '‰' + 138: 215, # 'Љ' + 139: 216, # '‹' + 140: 217, # 'Њ' + 141: 218, # 'ÐŒ' + 142: 219, # 'Ћ' + 143: 220, # 'Ð' + 144: 221, # 'Ñ’' + 145: 78, # '‘' + 146: 64, # '’' + 147: 83, # '“' + 148: 121, # 'â€' + 149: 98, # '•' + 150: 117, # '–' + 151: 105, # '—' + 152: 222, # None + 153: 223, # 'â„¢' + 154: 224, # 'Ñ™' + 155: 225, # '›' + 156: 226, # 'Ñš' + 157: 227, # 'Ñœ' + 158: 228, # 'Ñ›' + 159: 229, # 'ÑŸ' + 160: 88, # '\xa0' + 161: 230, # 'ÐŽ' + 162: 231, # 'Ñž' + 163: 232, # 'Ј' + 164: 233, # '¤' + 165: 122, # 'Ò' + 166: 89, # '¦' + 167: 106, # '§' + 168: 234, # 'Ð' + 169: 235, # '©' + 170: 236, # 'Є' + 171: 237, # '«' + 172: 238, # '¬' + 173: 45, # '\xad' + 174: 239, # '®' + 175: 240, # 'Ї' + 176: 73, # '°' + 177: 80, # '±' + 178: 118, # 'І' + 179: 114, # 'Ñ–' + 180: 241, # 'Ò‘' + 181: 242, # 'µ' + 182: 243, # '¶' + 183: 244, # '·' + 184: 245, # 'Ñ‘' + 185: 62, # 'â„–' + 186: 58, # 'Ñ”' + 187: 246, # '»' + 188: 247, # 'ј' + 189: 248, # 'Ð…' + 190: 249, # 'Ñ•' + 191: 250, # 'Ñ—' + 192: 31, # 'Ð' + 193: 32, # 'Б' + 194: 35, # 'Ð’' + 195: 43, # 'Г' + 196: 37, # 'Д' + 197: 44, # 'Е' + 198: 55, # 'Ж' + 199: 47, # 'З' + 200: 40, # 'И' + 201: 59, # 'Й' + 202: 33, # 'К' + 203: 46, # 'Л' + 204: 38, # 'М' + 205: 36, # 'Ð' + 206: 41, # 'О' + 207: 30, # 'П' + 208: 39, # 'Р' + 209: 28, # 'С' + 210: 34, # 'Т' + 211: 51, # 'У' + 212: 48, # 'Ф' + 213: 49, # 'Ð¥' + 214: 53, # 'Ц' + 215: 50, # 'Ч' + 216: 54, # 'Ш' + 217: 57, # 'Щ' + 218: 61, # 'Ъ' + 219: 251, # 'Ы' + 220: 67, # 'Ь' + 221: 252, # 'Э' + 222: 60, # 'Ю' + 223: 56, # 'Я' + 224: 1, # 'а' + 225: 18, # 'б' + 226: 9, # 'в' + 227: 20, # 'г' + 228: 11, # 'д' + 229: 3, # 'е' + 230: 23, # 'ж' + 231: 15, # 'з' + 232: 2, # 'и' + 233: 26, # 'й' + 234: 12, # 'к' + 235: 10, # 'л' + 236: 14, # 'м' + 237: 6, # 'н' + 238: 4, # 'о' + 239: 13, # 'п' + 240: 7, # 'Ñ€' + 241: 8, # 'Ñ' + 242: 5, # 'Ñ‚' + 243: 19, # 'у' + 244: 29, # 'Ñ„' + 245: 25, # 'Ñ…' + 246: 22, # 'ц' + 247: 21, # 'ч' + 248: 27, # 'ш' + 249: 24, # 'щ' + 250: 17, # 'ÑŠ' + 251: 75, # 'Ñ‹' + 252: 52, # 'ÑŒ' + 253: 253, # 'Ñ' + 254: 42, # 'ÑŽ' + 255: 16, # 'Ñ' +} + +WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251', + language='Bulgarian', + char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER, + language_model=BULGARIAN_LANG_MODEL, + typical_positive_ratio=0.969392, + keep_ascii_letters=False, + alphabet='ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрÑтуфхцчшщъьюÑ') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..d99528e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,4398 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +GREEK_LANG_MODEL = { + 60: { # 'e' + 60: 2, # 'e' + 55: 1, # 'o' + 58: 2, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 55: { # 'o' + 60: 0, # 'e' + 55: 2, # 'o' + 58: 2, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 1, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 58: { # 't' + 60: 2, # 'e' + 55: 1, # 'o' + 58: 1, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 1, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 36: { # '·' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 61: { # 'Ά' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 1, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 1, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 46: { # 'Έ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 2, # 'β' + 20: 2, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 1, # 'σ' + 2: 2, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 54: { # 'ÎŒ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 2, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 31: { # 'Α' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 2, # 'Î’' + 43: 2, # 'Γ' + 41: 1, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 2, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 1, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Î¥' + 56: 2, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 2, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 1, # 'θ' + 5: 0, # 'ι' + 11: 2, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 2, # 'Ï‚' + 7: 2, # 'σ' + 2: 0, # 'Ï„' + 12: 3, # 'Ï…' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 51: { # 'Î’' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 1, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 43: { # 'Γ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 1, # 'Α' + 51: 0, # 'Î’' + 43: 2, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 1, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 2, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 41: { # 'Δ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 1, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 34: { # 'Ε' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 2, # 'Γ' + 41: 2, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 1, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Î¥' + 56: 0, # 'Φ' + 50: 2, # 'Χ' + 57: 2, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 1, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 1, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 2, # 'σ' + 2: 2, # 'Ï„' + 12: 2, # 'Ï…' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 1, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 40: { # 'Η' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 1, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 2, # 'Θ' + 47: 0, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 1, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 52: { # 'Θ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 1, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 1, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 47: { # 'Ι' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 1, # 'Î’' + 43: 1, # 'Γ' + 41: 2, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Î¥' + 56: 2, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 2, # 'σ' + 2: 1, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 1, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 44: { # 'Κ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 1, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 2, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 1, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 53: { # 'Λ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 2, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 2, # 'Σ' + 33: 0, # 'Τ' + 45: 2, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 1, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 38: { # 'Μ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 2, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 2, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 49: { # 'Î' + 60: 2, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 1, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 1, # 'ω' + 19: 2, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 59: { # 'Ξ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 39: { # 'Ο' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 1, # 'Î’' + 43: 2, # 'Γ' + 41: 2, # 'Δ' + 34: 2, # 'Ε' + 40: 1, # 'Η' + 52: 2, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 2, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Î¥' + 56: 2, # 'Φ' + 50: 2, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 2, # 'Ï„' + 12: 2, # 'Ï…' + 28: 1, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 35: { # 'Π' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 2, # 'Λ' + 38: 1, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 1, # 'έ' + 22: 1, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 48: { # 'Ρ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 1, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 1, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 1, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 1, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 37: { # 'Σ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 1, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 2, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 2, # 'Î¥' + 56: 0, # 'Φ' + 50: 2, # 'Χ' + 57: 2, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 2, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 2, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 2, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 33: { # 'Τ' + 60: 0, # 'e' + 55: 1, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 2, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 2, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 1, # 'Τ' + 45: 1, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 2, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 2, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 2, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 45: { # 'Î¥' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 2, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 2, # 'Η' + 52: 2, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 2, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 2, # 'Π' + 48: 1, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 56: { # 'Φ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 1, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 1, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 2, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 2, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 1, # 'Ï' + 27: 1, # 'ÏŽ' + }, + 50: { # 'Χ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 1, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 2, # 'Ε' + 40: 2, # 'Η' + 52: 0, # 'Θ' + 47: 2, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 1, # 'Î' + 59: 0, # 'Ξ' + 39: 1, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 1, # 'Χ' + 57: 1, # 'Ω' + 17: 2, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 2, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 2, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 57: { # 'Ω' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 1, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 1, # 'Λ' + 38: 0, # 'Μ' + 49: 2, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 2, # 'Ρ' + 37: 2, # 'Σ' + 33: 2, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 2, # 'Ï' + 14: 2, # 'Ï‚' + 7: 2, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 17: { # 'ά' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 3, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 3, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 18: { # 'έ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 3, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 22: { # 'ή' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 1, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 15: { # 'ί' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 3, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 1, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 1: { # 'α' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 2, # 'ε' + 32: 3, # 'ζ' + 13: 1, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 2, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 29: { # 'β' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 2, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 3, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 20: { # 'γ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 21: { # 'δ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 3: { # 'ε' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 3, # 'ί' + 1: 2, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 2, # 'ε' + 32: 2, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 32: { # 'ζ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 2, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 1, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 13: { # 'η' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 25: { # 'θ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 1, # 'λ' + 10: 3, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 5: { # 'ι' + 60: 0, # 'e' + 55: 1, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 0, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 11: { # 'κ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 2, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 16: { # 'λ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 1, # 'β' + 20: 2, # 'γ' + 21: 1, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 3, # 'λ' + 10: 2, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 10: { # 'μ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 1, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 2, # 'Ï…' + 28: 3, # 'φ' + 23: 0, # 'χ' + 42: 2, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 6: { # 'ν' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 1, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 30: { # 'ξ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 2, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 2, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 1, # 'ÏŽ' + }, + 4: { # 'ο' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 2, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 1, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 9: { # 'Ï€' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 3, # 'λ' + 10: 0, # 'μ' + 6: 2, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 2, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 8: { # 'Ï' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 1, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 3, # 'ο' + 9: 2, # 'Ï€' + 8: 2, # 'Ï' + 14: 0, # 'Ï‚' + 7: 2, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 14: { # 'Ï‚' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 2, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 0, # 'θ' + 5: 0, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 0, # 'Ï„' + 12: 0, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 7: { # 'σ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 3, # 'β' + 20: 0, # 'γ' + 21: 2, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 3, # 'θ' + 5: 3, # 'ι' + 11: 3, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 3, # 'φ' + 23: 3, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 2: { # 'Ï„' + 60: 0, # 'e' + 55: 2, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 2, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 3, # 'ι' + 11: 2, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 2, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 12: { # 'Ï…' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 2, # 'ί' + 1: 3, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 2, # 'ε' + 32: 2, # 'ζ' + 13: 2, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 3, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 2, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 28: { # 'φ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 3, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 0, # 'μ' + 6: 1, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 1, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 2, # 'Ï' + 27: 2, # 'ÏŽ' + }, + 23: { # 'χ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 3, # 'ά' + 18: 2, # 'έ' + 22: 3, # 'ή' + 15: 3, # 'ί' + 1: 3, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 3, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 2, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 3, # 'ο' + 9: 0, # 'Ï€' + 8: 3, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 3, # 'Ï„' + 12: 3, # 'Ï…' + 28: 0, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 3, # 'ω' + 19: 3, # 'ÏŒ' + 26: 3, # 'Ï' + 27: 3, # 'ÏŽ' + }, + 42: { # 'ψ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 2, # 'ά' + 18: 2, # 'έ' + 22: 1, # 'ή' + 15: 2, # 'ί' + 1: 2, # 'α' + 29: 0, # 'β' + 20: 0, # 'γ' + 21: 0, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 3, # 'η' + 25: 0, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 0, # 'λ' + 10: 0, # 'μ' + 6: 0, # 'ν' + 30: 0, # 'ξ' + 4: 2, # 'ο' + 9: 0, # 'Ï€' + 8: 0, # 'Ï' + 14: 0, # 'Ï‚' + 7: 0, # 'σ' + 2: 2, # 'Ï„' + 12: 1, # 'Ï…' + 28: 0, # 'φ' + 23: 0, # 'χ' + 42: 0, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 24: { # 'ω' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 1, # 'ά' + 18: 0, # 'έ' + 22: 2, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 2, # 'β' + 20: 3, # 'γ' + 21: 2, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 0, # 'η' + 25: 3, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 0, # 'ξ' + 4: 0, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 19: { # 'ÏŒ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 3, # 'β' + 20: 3, # 'γ' + 21: 3, # 'δ' + 3: 1, # 'ε' + 32: 2, # 'ζ' + 13: 2, # 'η' + 25: 2, # 'θ' + 5: 2, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 1, # 'ξ' + 4: 2, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 3, # 'χ' + 42: 2, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 26: { # 'Ï' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 2, # 'α' + 29: 2, # 'β' + 20: 2, # 'γ' + 21: 1, # 'δ' + 3: 3, # 'ε' + 32: 0, # 'ζ' + 13: 2, # 'η' + 25: 3, # 'θ' + 5: 0, # 'ι' + 11: 3, # 'κ' + 16: 3, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 2, # 'ξ' + 4: 3, # 'ο' + 9: 3, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 2, # 'φ' + 23: 2, # 'χ' + 42: 2, # 'ψ' + 24: 2, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, + 27: { # 'ÏŽ' + 60: 0, # 'e' + 55: 0, # 'o' + 58: 0, # 't' + 36: 0, # '·' + 61: 0, # 'Ά' + 46: 0, # 'Έ' + 54: 0, # 'ÎŒ' + 31: 0, # 'Α' + 51: 0, # 'Î’' + 43: 0, # 'Γ' + 41: 0, # 'Δ' + 34: 0, # 'Ε' + 40: 0, # 'Η' + 52: 0, # 'Θ' + 47: 0, # 'Ι' + 44: 0, # 'Κ' + 53: 0, # 'Λ' + 38: 0, # 'Μ' + 49: 0, # 'Î' + 59: 0, # 'Ξ' + 39: 0, # 'Ο' + 35: 0, # 'Π' + 48: 0, # 'Ρ' + 37: 0, # 'Σ' + 33: 0, # 'Τ' + 45: 0, # 'Î¥' + 56: 0, # 'Φ' + 50: 0, # 'Χ' + 57: 0, # 'Ω' + 17: 0, # 'ά' + 18: 0, # 'έ' + 22: 0, # 'ή' + 15: 0, # 'ί' + 1: 0, # 'α' + 29: 1, # 'β' + 20: 0, # 'γ' + 21: 3, # 'δ' + 3: 0, # 'ε' + 32: 0, # 'ζ' + 13: 1, # 'η' + 25: 2, # 'θ' + 5: 2, # 'ι' + 11: 0, # 'κ' + 16: 2, # 'λ' + 10: 3, # 'μ' + 6: 3, # 'ν' + 30: 1, # 'ξ' + 4: 0, # 'ο' + 9: 2, # 'Ï€' + 8: 3, # 'Ï' + 14: 3, # 'Ï‚' + 7: 3, # 'σ' + 2: 3, # 'Ï„' + 12: 0, # 'Ï…' + 28: 1, # 'φ' + 23: 1, # 'χ' + 42: 0, # 'ψ' + 24: 0, # 'ω' + 19: 0, # 'ÏŒ' + 26: 0, # 'Ï' + 27: 0, # 'ÏŽ' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1253_GREEK_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '€' + 129: 255, # None + 130: 255, # '‚' + 131: 255, # 'Æ’' + 132: 255, # '„' + 133: 255, # '…' + 134: 255, # '†' + 135: 255, # '‡' + 136: 255, # None + 137: 255, # '‰' + 138: 255, # None + 139: 255, # '‹' + 140: 255, # None + 141: 255, # None + 142: 255, # None + 143: 255, # None + 144: 255, # None + 145: 255, # '‘' + 146: 255, # '’' + 147: 255, # '“' + 148: 255, # 'â€' + 149: 255, # '•' + 150: 255, # '–' + 151: 255, # '—' + 152: 255, # None + 153: 255, # 'â„¢' + 154: 255, # None + 155: 255, # '›' + 156: 255, # None + 157: 255, # None + 158: 255, # None + 159: 255, # None + 160: 253, # '\xa0' + 161: 233, # 'Î…' + 162: 61, # 'Ά' + 163: 253, # '£' + 164: 253, # '¤' + 165: 253, # 'Â¥' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # None + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # '®' + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 253, # 'µ' + 182: 253, # '¶' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'ÎŒ' + 189: 253, # '½' + 190: 108, # 'ÎŽ' + 191: 123, # 'Î' + 192: 110, # 'Î' + 193: 31, # 'Α' + 194: 51, # 'Î’' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Î' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Î¥' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'Ï€' + 241: 8, # 'Ï' + 242: 14, # 'Ï‚' + 243: 7, # 'σ' + 244: 2, # 'Ï„' + 245: 12, # 'Ï…' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ÏŠ' + 251: 75, # 'Ï‹' + 252: 19, # 'ÏŒ' + 253: 26, # 'Ï' + 254: 27, # 'ÏŽ' + 255: 253, # None +} + +WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(charset_name='windows-1253', + language='Greek', + char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ') + +ISO_8859_7_GREEK_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 82, # 'A' + 66: 100, # 'B' + 67: 104, # 'C' + 68: 94, # 'D' + 69: 98, # 'E' + 70: 101, # 'F' + 71: 116, # 'G' + 72: 102, # 'H' + 73: 111, # 'I' + 74: 187, # 'J' + 75: 117, # 'K' + 76: 92, # 'L' + 77: 88, # 'M' + 78: 113, # 'N' + 79: 85, # 'O' + 80: 79, # 'P' + 81: 118, # 'Q' + 82: 105, # 'R' + 83: 83, # 'S' + 84: 67, # 'T' + 85: 114, # 'U' + 86: 119, # 'V' + 87: 95, # 'W' + 88: 99, # 'X' + 89: 109, # 'Y' + 90: 188, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 72, # 'a' + 98: 70, # 'b' + 99: 80, # 'c' + 100: 81, # 'd' + 101: 60, # 'e' + 102: 96, # 'f' + 103: 93, # 'g' + 104: 89, # 'h' + 105: 68, # 'i' + 106: 120, # 'j' + 107: 97, # 'k' + 108: 77, # 'l' + 109: 86, # 'm' + 110: 69, # 'n' + 111: 55, # 'o' + 112: 78, # 'p' + 113: 115, # 'q' + 114: 65, # 'r' + 115: 66, # 's' + 116: 58, # 't' + 117: 76, # 'u' + 118: 106, # 'v' + 119: 103, # 'w' + 120: 87, # 'x' + 121: 107, # 'y' + 122: 112, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 255, # '\x80' + 129: 255, # '\x81' + 130: 255, # '\x82' + 131: 255, # '\x83' + 132: 255, # '\x84' + 133: 255, # '\x85' + 134: 255, # '\x86' + 135: 255, # '\x87' + 136: 255, # '\x88' + 137: 255, # '\x89' + 138: 255, # '\x8a' + 139: 255, # '\x8b' + 140: 255, # '\x8c' + 141: 255, # '\x8d' + 142: 255, # '\x8e' + 143: 255, # '\x8f' + 144: 255, # '\x90' + 145: 255, # '\x91' + 146: 255, # '\x92' + 147: 255, # '\x93' + 148: 255, # '\x94' + 149: 255, # '\x95' + 150: 255, # '\x96' + 151: 255, # '\x97' + 152: 255, # '\x98' + 153: 255, # '\x99' + 154: 255, # '\x9a' + 155: 255, # '\x9b' + 156: 255, # '\x9c' + 157: 255, # '\x9d' + 158: 255, # '\x9e' + 159: 255, # '\x9f' + 160: 253, # '\xa0' + 161: 233, # '‘' + 162: 90, # '’' + 163: 253, # '£' + 164: 253, # '€' + 165: 253, # '₯' + 166: 253, # '¦' + 167: 253, # '§' + 168: 253, # '¨' + 169: 253, # '©' + 170: 253, # 'ͺ' + 171: 253, # '«' + 172: 253, # '¬' + 173: 74, # '\xad' + 174: 253, # None + 175: 253, # '―' + 176: 253, # '°' + 177: 253, # '±' + 178: 253, # '²' + 179: 253, # '³' + 180: 247, # '΄' + 181: 248, # 'Î…' + 182: 61, # 'Ά' + 183: 36, # '·' + 184: 46, # 'Έ' + 185: 71, # 'Ή' + 186: 73, # 'Ί' + 187: 253, # '»' + 188: 54, # 'ÎŒ' + 189: 253, # '½' + 190: 108, # 'ÎŽ' + 191: 123, # 'Î' + 192: 110, # 'Î' + 193: 31, # 'Α' + 194: 51, # 'Î’' + 195: 43, # 'Γ' + 196: 41, # 'Δ' + 197: 34, # 'Ε' + 198: 91, # 'Ζ' + 199: 40, # 'Η' + 200: 52, # 'Θ' + 201: 47, # 'Ι' + 202: 44, # 'Κ' + 203: 53, # 'Λ' + 204: 38, # 'Μ' + 205: 49, # 'Î' + 206: 59, # 'Ξ' + 207: 39, # 'Ο' + 208: 35, # 'Π' + 209: 48, # 'Ρ' + 210: 250, # None + 211: 37, # 'Σ' + 212: 33, # 'Τ' + 213: 45, # 'Î¥' + 214: 56, # 'Φ' + 215: 50, # 'Χ' + 216: 84, # 'Ψ' + 217: 57, # 'Ω' + 218: 120, # 'Ϊ' + 219: 121, # 'Ϋ' + 220: 17, # 'ά' + 221: 18, # 'έ' + 222: 22, # 'ή' + 223: 15, # 'ί' + 224: 124, # 'ΰ' + 225: 1, # 'α' + 226: 29, # 'β' + 227: 20, # 'γ' + 228: 21, # 'δ' + 229: 3, # 'ε' + 230: 32, # 'ζ' + 231: 13, # 'η' + 232: 25, # 'θ' + 233: 5, # 'ι' + 234: 11, # 'κ' + 235: 16, # 'λ' + 236: 10, # 'μ' + 237: 6, # 'ν' + 238: 30, # 'ξ' + 239: 4, # 'ο' + 240: 9, # 'Ï€' + 241: 8, # 'Ï' + 242: 14, # 'Ï‚' + 243: 7, # 'σ' + 244: 2, # 'Ï„' + 245: 12, # 'Ï…' + 246: 28, # 'φ' + 247: 23, # 'χ' + 248: 42, # 'ψ' + 249: 24, # 'ω' + 250: 64, # 'ÏŠ' + 251: 75, # 'Ï‹' + 252: 19, # 'ÏŒ' + 253: 26, # 'Ï' + 254: 27, # 'ÏŽ' + 255: 253, # None +} + +ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-7', + language='Greek', + char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER, + language_model=GREEK_LANG_MODEL, + typical_positive_ratio=0.982851, + keep_ascii_letters=False, + alphabet='ΆΈΉΊΌΎÎΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπÏςστυφχψωόÏÏŽ') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..484c652 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,4383 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +HEBREW_LANG_MODEL = { + 50: { # 'a' + 50: 0, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 2, # 'l' + 54: 2, # 'n' + 49: 0, # 'o' + 51: 2, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 1, # '×§' + 7: 0, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 60: { # 'c' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 61: { # 'd' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 0, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 42: { # 'e' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 2, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 2, # 'l' + 54: 2, # 'n' + 49: 1, # 'o' + 51: 2, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 1, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 53: { # 'i' + 50: 1, # 'a' + 60: 2, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 0, # 'i' + 56: 1, # 'l' + 54: 2, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 56: { # 'l' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 2, # 'e' + 53: 2, # 'i' + 56: 2, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 54: { # 'n' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 49: { # 'o' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 2, # 'n' + 49: 1, # 'o' + 51: 2, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 51: { # 'r' + 50: 2, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 2, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 2, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 43: { # 's' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 2, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 2, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 44: { # 't' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 0, # 'd' + 42: 2, # 'e' + 53: 2, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 2, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 63: { # 'u' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 34: { # '\xa0' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 1, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 2, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 1, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 2, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 1, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 55: { # '´' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 1, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 2, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 1, # 'ן' + 12: 1, # '× ' + 19: 1, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 48: { # '¼' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 39: { # '½' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 57: { # '¾' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 30: { # 'Ö°' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 2, # '×’' + 16: 2, # 'ד' + 3: 2, # '×”' + 2: 2, # 'ו' + 24: 2, # '×–' + 14: 2, # '×—' + 22: 2, # 'ט' + 1: 2, # '×™' + 25: 2, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 1, # '×' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 2, # '× ' + 19: 2, # 'ס' + 13: 2, # '×¢' + 26: 0, # '×£' + 18: 2, # 'פ' + 27: 0, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 59: { # 'Ö±' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 1, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 2, # 'ל' + 11: 0, # '×' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 41: { # 'Ö²' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 2, # 'ב' + 20: 1, # '×’' + 16: 2, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 1, # '×™' + 25: 1, # 'ך' + 15: 1, # '×›' + 4: 2, # 'ל' + 11: 0, # '×' + 6: 2, # 'מ' + 23: 0, # 'ן' + 12: 2, # '× ' + 19: 1, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 2, # 'צ' + 17: 1, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 33: { # 'Ö´' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 1, # 'Ö´' + 37: 0, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 1, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 2, # 'ב' + 20: 2, # '×’' + 16: 2, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 2, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 2, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 2, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 37: { # 'Öµ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 1, # '×’' + 16: 2, # 'ד' + 3: 2, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 2, # '×—' + 22: 1, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 1, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 1, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 1, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 1, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 36: { # 'Ö¶' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 1, # '×’' + 16: 2, # 'ד' + 3: 2, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 2, # '×—' + 22: 1, # 'ט' + 1: 2, # '×™' + 25: 2, # 'ך' + 15: 1, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 2, # 'ס' + 13: 1, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 2, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 31: { # 'Ö·' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 2, # '×’' + 16: 2, # 'ד' + 3: 2, # '×”' + 2: 1, # 'ו' + 24: 2, # '×–' + 14: 2, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 2, # 'ס' + 13: 2, # '×¢' + 26: 2, # '×£' + 18: 2, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 29: { # 'Ö¸' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 1, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 2, # '×’' + 16: 2, # 'ד' + 3: 3, # '×”' + 2: 2, # 'ו' + 24: 2, # '×–' + 14: 2, # '×—' + 22: 1, # 'ט' + 1: 2, # '×™' + 25: 2, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 1, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 2, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 35: { # 'Ö¹' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 1, # '×’' + 16: 2, # 'ד' + 3: 2, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 1, # '×™' + 25: 1, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 2, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 2, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 62: { # 'Ö»' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 1, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 2, # 'ל' + 11: 1, # '×' + 6: 1, # 'מ' + 23: 1, # 'ן' + 12: 1, # '× ' + 19: 1, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 28: { # 'Ö¼' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 3, # 'Ö°' + 59: 0, # 'Ö±' + 41: 1, # 'Ö²' + 33: 3, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 3, # 'Ö·' + 29: 3, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 2, # '×' + 45: 1, # 'ׂ' + 9: 2, # '×' + 8: 2, # 'ב' + 20: 1, # '×’' + 16: 2, # 'ד' + 3: 1, # '×”' + 2: 2, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 2, # '×™' + 25: 2, # 'ך' + 15: 2, # '×›' + 4: 2, # 'ל' + 11: 1, # '×' + 6: 2, # 'מ' + 23: 1, # 'ן' + 12: 2, # '× ' + 19: 1, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 1, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 2, # 'ר' + 10: 2, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 38: { # '×' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 2, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 45: { # 'ׂ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 1, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 1, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 2, # 'ו' + 24: 0, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 1, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 0, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 9: { # '×' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 2, # 'Ö±' + 41: 2, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 2, # '×¢' + 26: 3, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 8: { # 'ב' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 3, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 1, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 20: { # '×’' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 2, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 1, # 'Ö´' + 37: 1, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 3, # 'ב' + 20: 2, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 2, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 1, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 2, # 'פ' + 27: 1, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 16: { # 'ד' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 1, # '×–' + 14: 2, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 2, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 0, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 3: { # '×”' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 1, # 'Ö±' + 41: 2, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 3, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 0, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 2: { # 'ו' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 1, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 3, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 3, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 3, # '×£' + 18: 3, # 'פ' + 27: 3, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 24: { # '×–' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 1, # 'Ö²' + 33: 1, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 2, # 'ב' + 20: 2, # '×’' + 16: 2, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 2, # '×—' + 22: 1, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 2, # '× ' + 19: 1, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 1, # 'ש' + 5: 2, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 14: { # '×—' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 1, # 'Ö±' + 41: 2, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 3, # 'ב' + 20: 2, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 2, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 2, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 1, # '×¢' + 26: 2, # '×£' + 18: 2, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 22: { # 'ט' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 1, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 1, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 1, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 3, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 2, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 3, # 'ר' + 10: 2, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 1: { # '×™' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 3, # '×£' + 18: 3, # 'פ' + 27: 3, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 25: { # 'ך' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 1, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 15: { # '×›' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 3, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 2, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 2, # '×¢' + 26: 3, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 2, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 4: { # 'ל' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 3, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 11: { # '×' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 1, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 0, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 1, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 6: { # 'מ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 0, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 23: { # 'ן' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 1, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 1, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 1, # 'ס' + 13: 1, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 1, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 12: { # '× ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 19: { # 'ס' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 1, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 2, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 1, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 3, # '×£' + 18: 3, # 'פ' + 27: 0, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 1, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 13: { # '×¢' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 1, # 'Ö±' + 41: 2, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 1, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 2, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 2, # '×¢' + 26: 1, # '×£' + 18: 2, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 26: { # '×£' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 1, # 'ס' + 13: 0, # '×¢' + 26: 1, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 18: { # 'פ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 1, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 2, # 'ב' + 20: 3, # '×’' + 16: 2, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 2, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 2, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 27: { # '×¥' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 1, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 21: { # 'צ' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 2, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 1, # '×–' + 14: 3, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 1, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 1, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 0, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 17: { # '×§' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 1, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 2, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 1, # 'ך' + 15: 1, # '×›' + 4: 3, # 'ל' + 11: 2, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 2, # '×¥' + 21: 3, # 'צ' + 17: 2, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 7: { # 'ר' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 2, # '´' + 48: 1, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 1, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 2, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 3, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 3, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 3, # '×¥' + 21: 3, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 10: { # 'ש' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 1, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 1, # 'Ö´' + 37: 1, # 'Öµ' + 36: 1, # 'Ö¶' + 31: 1, # 'Ö·' + 29: 1, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 3, # '×' + 45: 2, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 3, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 3, # '×—' + 22: 3, # 'ט' + 1: 3, # '×™' + 25: 3, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 2, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 1, # '…' + }, + 5: { # 'ת' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 1, # '\xa0' + 55: 0, # '´' + 48: 1, # '¼' + 39: 1, # '½' + 57: 0, # '¾' + 30: 2, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 2, # 'Ö´' + 37: 2, # 'Öµ' + 36: 2, # 'Ö¶' + 31: 2, # 'Ö·' + 29: 2, # 'Ö¸' + 35: 1, # 'Ö¹' + 62: 1, # 'Ö»' + 28: 2, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 3, # '×' + 8: 3, # 'ב' + 20: 3, # '×’' + 16: 2, # 'ד' + 3: 3, # '×”' + 2: 3, # 'ו' + 24: 2, # '×–' + 14: 3, # '×—' + 22: 2, # 'ט' + 1: 3, # '×™' + 25: 2, # 'ך' + 15: 3, # '×›' + 4: 3, # 'ל' + 11: 3, # '×' + 6: 3, # 'מ' + 23: 3, # 'ן' + 12: 3, # '× ' + 19: 2, # 'ס' + 13: 3, # '×¢' + 26: 2, # '×£' + 18: 3, # 'פ' + 27: 1, # '×¥' + 21: 2, # 'צ' + 17: 3, # '×§' + 7: 3, # 'ר' + 10: 3, # 'ש' + 5: 3, # 'ת' + 32: 1, # '–' + 52: 1, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, + 32: { # '–' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 1, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 1, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 1, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 52: { # '’' + 50: 1, # 'a' + 60: 0, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 2, # 's' + 44: 2, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 1, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 47: { # '“' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 1, # 'l' + 54: 1, # 'n' + 49: 1, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 1, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 2, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 1, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 1, # '×—' + 22: 1, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 1, # 'ס' + 13: 1, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 1, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 46: { # 'â€' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 1, # 'ב' + 20: 1, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 1, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 0, # '†' + 40: 0, # '…' + }, + 58: { # '†' + 50: 0, # 'a' + 60: 0, # 'c' + 61: 0, # 'd' + 42: 0, # 'e' + 53: 0, # 'i' + 56: 0, # 'l' + 54: 0, # 'n' + 49: 0, # 'o' + 51: 0, # 'r' + 43: 0, # 's' + 44: 0, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 0, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 0, # '×”' + 2: 0, # 'ו' + 24: 0, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 0, # '×™' + 25: 0, # 'ך' + 15: 0, # '×›' + 4: 0, # 'ל' + 11: 0, # '×' + 6: 0, # 'מ' + 23: 0, # 'ן' + 12: 0, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 0, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 0, # 'ר' + 10: 0, # 'ש' + 5: 0, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 0, # 'â€' + 58: 2, # '†' + 40: 0, # '…' + }, + 40: { # '…' + 50: 1, # 'a' + 60: 1, # 'c' + 61: 1, # 'd' + 42: 1, # 'e' + 53: 1, # 'i' + 56: 0, # 'l' + 54: 1, # 'n' + 49: 0, # 'o' + 51: 1, # 'r' + 43: 1, # 's' + 44: 1, # 't' + 63: 0, # 'u' + 34: 0, # '\xa0' + 55: 0, # '´' + 48: 0, # '¼' + 39: 0, # '½' + 57: 0, # '¾' + 30: 0, # 'Ö°' + 59: 0, # 'Ö±' + 41: 0, # 'Ö²' + 33: 0, # 'Ö´' + 37: 0, # 'Öµ' + 36: 0, # 'Ö¶' + 31: 0, # 'Ö·' + 29: 0, # 'Ö¸' + 35: 0, # 'Ö¹' + 62: 0, # 'Ö»' + 28: 0, # 'Ö¼' + 38: 0, # '×' + 45: 0, # 'ׂ' + 9: 1, # '×' + 8: 0, # 'ב' + 20: 0, # '×’' + 16: 0, # 'ד' + 3: 1, # '×”' + 2: 1, # 'ו' + 24: 1, # '×–' + 14: 0, # '×—' + 22: 0, # 'ט' + 1: 1, # '×™' + 25: 0, # 'ך' + 15: 1, # '×›' + 4: 1, # 'ל' + 11: 0, # '×' + 6: 1, # 'מ' + 23: 0, # 'ן' + 12: 1, # '× ' + 19: 0, # 'ס' + 13: 0, # '×¢' + 26: 0, # '×£' + 18: 1, # 'פ' + 27: 0, # '×¥' + 21: 0, # 'צ' + 17: 0, # '×§' + 7: 1, # 'ר' + 10: 1, # 'ש' + 5: 1, # 'ת' + 32: 0, # '–' + 52: 0, # '’' + 47: 0, # '“' + 46: 1, # 'â€' + 58: 0, # '†' + 40: 2, # '…' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1255_HEBREW_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 69, # 'A' + 66: 91, # 'B' + 67: 79, # 'C' + 68: 80, # 'D' + 69: 92, # 'E' + 70: 89, # 'F' + 71: 97, # 'G' + 72: 90, # 'H' + 73: 68, # 'I' + 74: 111, # 'J' + 75: 112, # 'K' + 76: 82, # 'L' + 77: 73, # 'M' + 78: 95, # 'N' + 79: 85, # 'O' + 80: 78, # 'P' + 81: 121, # 'Q' + 82: 86, # 'R' + 83: 71, # 'S' + 84: 67, # 'T' + 85: 102, # 'U' + 86: 107, # 'V' + 87: 84, # 'W' + 88: 114, # 'X' + 89: 103, # 'Y' + 90: 115, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 50, # 'a' + 98: 74, # 'b' + 99: 60, # 'c' + 100: 61, # 'd' + 101: 42, # 'e' + 102: 76, # 'f' + 103: 70, # 'g' + 104: 64, # 'h' + 105: 53, # 'i' + 106: 105, # 'j' + 107: 93, # 'k' + 108: 56, # 'l' + 109: 65, # 'm' + 110: 54, # 'n' + 111: 49, # 'o' + 112: 66, # 'p' + 113: 110, # 'q' + 114: 51, # 'r' + 115: 43, # 's' + 116: 44, # 't' + 117: 63, # 'u' + 118: 81, # 'v' + 119: 77, # 'w' + 120: 98, # 'x' + 121: 75, # 'y' + 122: 108, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 124, # '€' + 129: 202, # None + 130: 203, # '‚' + 131: 204, # 'Æ’' + 132: 205, # '„' + 133: 40, # '…' + 134: 58, # '†' + 135: 206, # '‡' + 136: 207, # 'ˆ' + 137: 208, # '‰' + 138: 209, # None + 139: 210, # '‹' + 140: 211, # None + 141: 212, # None + 142: 213, # None + 143: 214, # None + 144: 215, # None + 145: 83, # '‘' + 146: 52, # '’' + 147: 47, # '“' + 148: 46, # 'â€' + 149: 72, # '•' + 150: 32, # '–' + 151: 94, # '—' + 152: 216, # 'Ëœ' + 153: 113, # 'â„¢' + 154: 217, # None + 155: 109, # '›' + 156: 218, # None + 157: 219, # None + 158: 220, # None + 159: 221, # None + 160: 34, # '\xa0' + 161: 116, # '¡' + 162: 222, # '¢' + 163: 118, # '£' + 164: 100, # '₪' + 165: 223, # 'Â¥' + 166: 224, # '¦' + 167: 117, # '§' + 168: 119, # '¨' + 169: 104, # '©' + 170: 125, # '×' + 171: 225, # '«' + 172: 226, # '¬' + 173: 87, # '\xad' + 174: 99, # '®' + 175: 227, # '¯' + 176: 106, # '°' + 177: 122, # '±' + 178: 123, # '²' + 179: 228, # '³' + 180: 55, # '´' + 181: 229, # 'µ' + 182: 230, # '¶' + 183: 101, # '·' + 184: 231, # '¸' + 185: 232, # '¹' + 186: 120, # '÷' + 187: 233, # '»' + 188: 48, # '¼' + 189: 39, # '½' + 190: 57, # '¾' + 191: 234, # '¿' + 192: 30, # 'Ö°' + 193: 59, # 'Ö±' + 194: 41, # 'Ö²' + 195: 88, # 'Ö³' + 196: 33, # 'Ö´' + 197: 37, # 'Öµ' + 198: 36, # 'Ö¶' + 199: 31, # 'Ö·' + 200: 29, # 'Ö¸' + 201: 35, # 'Ö¹' + 202: 235, # None + 203: 62, # 'Ö»' + 204: 28, # 'Ö¼' + 205: 236, # 'Ö½' + 206: 126, # 'Ö¾' + 207: 237, # 'Ö¿' + 208: 238, # '×€' + 209: 38, # '×' + 210: 45, # 'ׂ' + 211: 239, # '׃' + 212: 240, # '×°' + 213: 241, # '×±' + 214: 242, # 'ײ' + 215: 243, # '׳' + 216: 127, # '×´' + 217: 244, # None + 218: 245, # None + 219: 246, # None + 220: 247, # None + 221: 248, # None + 222: 249, # None + 223: 250, # None + 224: 9, # '×' + 225: 8, # 'ב' + 226: 20, # '×’' + 227: 16, # 'ד' + 228: 3, # '×”' + 229: 2, # 'ו' + 230: 24, # '×–' + 231: 14, # '×—' + 232: 22, # 'ט' + 233: 1, # '×™' + 234: 25, # 'ך' + 235: 15, # '×›' + 236: 4, # 'ל' + 237: 11, # '×' + 238: 6, # 'מ' + 239: 23, # 'ן' + 240: 12, # '× ' + 241: 19, # 'ס' + 242: 13, # '×¢' + 243: 26, # '×£' + 244: 18, # 'פ' + 245: 27, # '×¥' + 246: 21, # 'צ' + 247: 17, # '×§' + 248: 7, # 'ר' + 249: 10, # 'ש' + 250: 5, # 'ת' + 251: 251, # None + 252: 252, # None + 253: 128, # '\u200e' + 254: 96, # '\u200f' + 255: 253, # None +} + +WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(charset_name='windows-1255', + language='Hebrew', + char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER, + language_model=HEBREW_LANG_MODEL, + typical_positive_ratio=0.984004, + keep_ascii_letters=False, + alphabet='×בגדהוזחטיךכל×מןנסעףפץצקרשתװױײ') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bbc5cda --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,4650 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +HUNGARIAN_LANG_MODEL = { + 28: { # 'A' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 2, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 2, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 2, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 1, # 'Ã' + 44: 0, # 'É' + 61: 1, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 40: { # 'B' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 3, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 54: { # 'C' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 3, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 45: { # 'D' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 32: { # 'E' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 2, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 50: { # 'F' + 28: 1, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 0, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 49: { # 'G' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 2, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 38: { # 'H' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 0, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 1, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 2, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 2, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 39: { # 'I' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 2, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 53: { # 'J' + 28: 2, # 'A' + 40: 0, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 0, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 36: { # 'K' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 2, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 41: { # 'L' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 1, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 34: { # 'M' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 3, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 1, # 'ű' + }, + 35: { # 'N' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 2, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 2, # 'Y' + 52: 1, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 47: { # 'O' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 2, # 'K' + 41: 2, # 'L' + 34: 2, # 'M' + 35: 2, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 1, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 1, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 46: { # 'P' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 3, # 'á' + 15: 2, # 'é' + 30: 0, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 0, # 'ű' + }, + 43: { # 'R' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 2, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 2, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 33: { # 'S' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 3, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 1, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 37: { # 'T' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 1, # 'S' + 37: 2, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 2, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 1, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 2, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 2, # 'Ã' + 44: 2, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 57: { # 'U' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 1, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 48: { # 'V' + 28: 2, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 2, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 2, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 2, # 'o' + 23: 0, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 2, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 0, # 'Ú' + 63: 1, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 55: { # 'Y' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 1, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 2, # 'Z' + 2: 1, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 0, # 'r' + 5: 0, # 's' + 3: 0, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 1, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 52: { # 'Z' + 28: 2, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 2, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 2, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 2, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 1, # 'U' + 48: 1, # 'V' + 55: 1, # 'Y' + 52: 1, # 'Z' + 2: 1, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 0, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 2, # 'Ã' + 44: 1, # 'É' + 61: 1, # 'Ã' + 58: 1, # 'Ó' + 59: 1, # 'Ö' + 60: 1, # 'Ú' + 63: 1, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 2: { # 'a' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 18: { # 'b' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 26: { # 'c' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 1, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 2, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 2, # 'á' + 15: 2, # 'é' + 30: 2, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 17: { # 'd' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 2, # 'k' + 6: 1, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 1: { # 'e' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 2, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 27: { # 'f' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 3, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 2, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 0, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 3, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 12: { # 'g' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 20: { # 'h' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 3, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 1, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 0, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 1, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 9: { # 'i' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 2, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 3, # 'ó' + 24: 1, # 'ö' + 31: 2, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 1, # 'ű' + }, + 22: { # 'j' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 1, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 1, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 7: { # 'k' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 2, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 1, # 'ú' + 29: 3, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 6: { # 'l' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 1, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 3, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 3, # 'Å‘' + 56: 1, # 'ű' + }, + 13: { # 'm' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 1, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 3, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 3, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 2, # 'ű' + }, + 4: { # 'n' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 1, # 'x' + 16: 3, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 8: { # 'o' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 1, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 23: { # 'p' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 3, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 10: { # 'r' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 2, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'Å‘' + 56: 2, # 'ű' + }, + 5: { # 's' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 2, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 3: { # 't' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 1, # 'g' + 20: 3, # 'h' + 9: 3, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 3, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 3, # 'ú' + 29: 3, # 'ü' + 42: 3, # 'Å‘' + 56: 2, # 'ű' + }, + 21: { # 'u' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 2, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 2, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 1, # 'u' + 19: 3, # 'v' + 62: 1, # 'x' + 16: 1, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 2, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 1, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 19: { # 'v' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 2, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 2, # 'ö' + 31: 1, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 1, # 'ű' + }, + 62: { # 'x' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 0, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 1, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 1, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 1, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 16: { # 'y' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 3, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 2, # 'j' + 7: 2, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 2, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 2, # 'í' + 25: 2, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 2, # 'ü' + 42: 1, # 'Å‘' + 56: 2, # 'ű' + }, + 11: { # 'z' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 3, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 3, # 'd' + 1: 3, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 3, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 3, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 3, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 3, # 'á' + 15: 3, # 'é' + 30: 3, # 'í' + 25: 3, # 'ó' + 24: 3, # 'ö' + 31: 2, # 'ú' + 29: 3, # 'ü' + 42: 2, # 'Å‘' + 56: 1, # 'ű' + }, + 51: { # 'Ã' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 1, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 44: { # 'É' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 1, # 'E' + 50: 0, # 'F' + 49: 2, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 2, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 2, # 'R' + 33: 2, # 'S' + 37: 2, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 3, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 61: { # 'Ã' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 0, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 1, # 'm' + 4: 0, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 0, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 58: { # 'Ó' + 28: 1, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 1, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 2, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 2, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 0, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 1, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 59: { # 'Ö' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 1, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 1, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 0, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 2, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 60: { # 'Ú' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 1, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 1, # 'F' + 49: 1, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 0, # 'b' + 26: 0, # 'c' + 17: 0, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 2, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 2, # 'j' + 7: 0, # 'k' + 6: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 0, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 0, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 63: { # 'Ü' + 28: 0, # 'A' + 40: 1, # 'B' + 54: 0, # 'C' + 45: 1, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 1, # 'G' + 38: 1, # 'H' + 39: 0, # 'I' + 53: 1, # 'J' + 36: 1, # 'K' + 41: 1, # 'L' + 34: 1, # 'M' + 35: 1, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 1, # 'R' + 33: 1, # 'S' + 37: 1, # 'T' + 57: 0, # 'U' + 48: 1, # 'V' + 55: 0, # 'Y' + 52: 1, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 0, # 'f' + 12: 1, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 0, # 'j' + 7: 0, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 1, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 14: { # 'á' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 3, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 3, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 2, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 1, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 2, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 15: { # 'é' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 3, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 3, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 30: { # 'í' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 0, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 0, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 2, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 2, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 25: { # 'ó' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 2, # 'a' + 18: 3, # 'b' + 26: 2, # 'c' + 17: 3, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 2, # 'g' + 20: 2, # 'h' + 9: 2, # 'i' + 22: 2, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 8: 1, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 1, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 1, # 'ö' + 31: 1, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 24: { # 'ö' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 0, # 'a' + 18: 3, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 0, # 'e' + 27: 1, # 'f' + 12: 2, # 'g' + 20: 1, # 'h' + 9: 0, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 2, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 3, # 't' + 21: 0, # 'u' + 19: 3, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 3, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 31: { # 'ú' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 2, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 2, # 'f' + 12: 3, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 3, # 'j' + 7: 1, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 3, # 'r' + 5: 3, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 1, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 29: { # 'ü' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 3, # 'g' + 20: 2, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 3, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 8: 0, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 0, # 'u' + 19: 2, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 1, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 42: { # 'Å‘' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 2, # 'b' + 26: 1, # 'c' + 17: 2, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 2, # 'k' + 6: 3, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 8: 1, # 'o' + 23: 1, # 'p' + 10: 2, # 'r' + 5: 2, # 's' + 3: 2, # 't' + 21: 1, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 1, # 'é' + 30: 1, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 1, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, + 56: { # 'ű' + 28: 0, # 'A' + 40: 0, # 'B' + 54: 0, # 'C' + 45: 0, # 'D' + 32: 0, # 'E' + 50: 0, # 'F' + 49: 0, # 'G' + 38: 0, # 'H' + 39: 0, # 'I' + 53: 0, # 'J' + 36: 0, # 'K' + 41: 0, # 'L' + 34: 0, # 'M' + 35: 0, # 'N' + 47: 0, # 'O' + 46: 0, # 'P' + 43: 0, # 'R' + 33: 0, # 'S' + 37: 0, # 'T' + 57: 0, # 'U' + 48: 0, # 'V' + 55: 0, # 'Y' + 52: 0, # 'Z' + 2: 1, # 'a' + 18: 1, # 'b' + 26: 0, # 'c' + 17: 1, # 'd' + 1: 1, # 'e' + 27: 1, # 'f' + 12: 1, # 'g' + 20: 1, # 'h' + 9: 1, # 'i' + 22: 1, # 'j' + 7: 1, # 'k' + 6: 1, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 8: 0, # 'o' + 23: 0, # 'p' + 10: 1, # 'r' + 5: 1, # 's' + 3: 1, # 't' + 21: 0, # 'u' + 19: 1, # 'v' + 62: 0, # 'x' + 16: 0, # 'y' + 11: 2, # 'z' + 51: 0, # 'Ã' + 44: 0, # 'É' + 61: 0, # 'Ã' + 58: 0, # 'Ó' + 59: 0, # 'Ö' + 60: 0, # 'Ú' + 63: 0, # 'Ü' + 14: 0, # 'á' + 15: 0, # 'é' + 30: 0, # 'í' + 25: 0, # 'ó' + 24: 0, # 'ö' + 31: 0, # 'ú' + 29: 0, # 'ü' + 42: 0, # 'Å‘' + 56: 0, # 'ű' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 72, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 161, # '€' + 129: 162, # None + 130: 163, # '‚' + 131: 164, # None + 132: 165, # '„' + 133: 166, # '…' + 134: 167, # '†' + 135: 168, # '‡' + 136: 169, # None + 137: 170, # '‰' + 138: 171, # 'Å ' + 139: 172, # '‹' + 140: 173, # 'Åš' + 141: 174, # 'Ť' + 142: 175, # 'Ž' + 143: 176, # 'Ź' + 144: 177, # None + 145: 178, # '‘' + 146: 179, # '’' + 147: 180, # '“' + 148: 78, # 'â€' + 149: 181, # '•' + 150: 69, # '–' + 151: 182, # '—' + 152: 183, # None + 153: 184, # 'â„¢' + 154: 185, # 'Å¡' + 155: 186, # '›' + 156: 187, # 'Å›' + 157: 188, # 'Å¥' + 158: 189, # 'ž' + 159: 190, # 'ź' + 160: 191, # '\xa0' + 161: 192, # 'ˇ' + 162: 193, # '˘' + 163: 194, # 'Å' + 164: 195, # '¤' + 165: 196, # 'Ä„' + 166: 197, # '¦' + 167: 76, # '§' + 168: 198, # '¨' + 169: 199, # '©' + 170: 200, # 'Åž' + 171: 201, # '«' + 172: 202, # '¬' + 173: 203, # '\xad' + 174: 204, # '®' + 175: 205, # 'Å»' + 176: 81, # '°' + 177: 206, # '±' + 178: 207, # 'Ë›' + 179: 208, # 'Å‚' + 180: 209, # '´' + 181: 210, # 'µ' + 182: 211, # '¶' + 183: 212, # '·' + 184: 213, # '¸' + 185: 214, # 'Ä…' + 186: 215, # 'ÅŸ' + 187: 216, # '»' + 188: 217, # 'Ľ' + 189: 218, # 'Ë' + 190: 219, # 'ľ' + 191: 220, # 'ż' + 192: 221, # 'Å”' + 193: 51, # 'Ã' + 194: 83, # 'Â' + 195: 222, # 'Ä‚' + 196: 80, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'ÄŒ' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Äš' + 205: 61, # 'Ã' + 206: 230, # 'ÃŽ' + 207: 231, # 'ÄŽ' + 208: 232, # 'Ä' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Å' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Å®' + 218: 60, # 'Ú' + 219: 70, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ã' + 222: 240, # 'Å¢' + 223: 241, # 'ß' + 224: 84, # 'Å•' + 225: 14, # 'á' + 226: 75, # 'â' + 227: 242, # 'ă' + 228: 71, # 'ä' + 229: 82, # 'ĺ' + 230: 243, # 'ć' + 231: 73, # 'ç' + 232: 244, # 'Ä' + 233: 15, # 'é' + 234: 85, # 'Ä™' + 235: 79, # 'ë' + 236: 86, # 'Ä›' + 237: 30, # 'í' + 238: 77, # 'î' + 239: 87, # 'Ä' + 240: 245, # 'Ä‘' + 241: 246, # 'Å„' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 74, # 'ô' + 245: 42, # 'Å‘' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'Å™' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'Å£' + 255: 253, # 'Ë™' +} + +WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1250', + language='Hungarian', + char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéíóöúüÅőŰű') + +ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 28, # 'A' + 66: 40, # 'B' + 67: 54, # 'C' + 68: 45, # 'D' + 69: 32, # 'E' + 70: 50, # 'F' + 71: 49, # 'G' + 72: 38, # 'H' + 73: 39, # 'I' + 74: 53, # 'J' + 75: 36, # 'K' + 76: 41, # 'L' + 77: 34, # 'M' + 78: 35, # 'N' + 79: 47, # 'O' + 80: 46, # 'P' + 81: 71, # 'Q' + 82: 43, # 'R' + 83: 33, # 'S' + 84: 37, # 'T' + 85: 57, # 'U' + 86: 48, # 'V' + 87: 64, # 'W' + 88: 68, # 'X' + 89: 55, # 'Y' + 90: 52, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 2, # 'a' + 98: 18, # 'b' + 99: 26, # 'c' + 100: 17, # 'd' + 101: 1, # 'e' + 102: 27, # 'f' + 103: 12, # 'g' + 104: 20, # 'h' + 105: 9, # 'i' + 106: 22, # 'j' + 107: 7, # 'k' + 108: 6, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 8, # 'o' + 112: 23, # 'p' + 113: 67, # 'q' + 114: 10, # 'r' + 115: 5, # 's' + 116: 3, # 't' + 117: 21, # 'u' + 118: 19, # 'v' + 119: 65, # 'w' + 120: 62, # 'x' + 121: 16, # 'y' + 122: 11, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 159, # '\x80' + 129: 160, # '\x81' + 130: 161, # '\x82' + 131: 162, # '\x83' + 132: 163, # '\x84' + 133: 164, # '\x85' + 134: 165, # '\x86' + 135: 166, # '\x87' + 136: 167, # '\x88' + 137: 168, # '\x89' + 138: 169, # '\x8a' + 139: 170, # '\x8b' + 140: 171, # '\x8c' + 141: 172, # '\x8d' + 142: 173, # '\x8e' + 143: 174, # '\x8f' + 144: 175, # '\x90' + 145: 176, # '\x91' + 146: 177, # '\x92' + 147: 178, # '\x93' + 148: 179, # '\x94' + 149: 180, # '\x95' + 150: 181, # '\x96' + 151: 182, # '\x97' + 152: 183, # '\x98' + 153: 184, # '\x99' + 154: 185, # '\x9a' + 155: 186, # '\x9b' + 156: 187, # '\x9c' + 157: 188, # '\x9d' + 158: 189, # '\x9e' + 159: 190, # '\x9f' + 160: 191, # '\xa0' + 161: 192, # 'Ä„' + 162: 193, # '˘' + 163: 194, # 'Å' + 164: 195, # '¤' + 165: 196, # 'Ľ' + 166: 197, # 'Åš' + 167: 75, # '§' + 168: 198, # '¨' + 169: 199, # 'Å ' + 170: 200, # 'Åž' + 171: 201, # 'Ť' + 172: 202, # 'Ź' + 173: 203, # '\xad' + 174: 204, # 'Ž' + 175: 205, # 'Å»' + 176: 79, # '°' + 177: 206, # 'Ä…' + 178: 207, # 'Ë›' + 179: 208, # 'Å‚' + 180: 209, # '´' + 181: 210, # 'ľ' + 182: 211, # 'Å›' + 183: 212, # 'ˇ' + 184: 213, # '¸' + 185: 214, # 'Å¡' + 186: 215, # 'ÅŸ' + 187: 216, # 'Å¥' + 188: 217, # 'ź' + 189: 218, # 'Ë' + 190: 219, # 'ž' + 191: 220, # 'ż' + 192: 221, # 'Å”' + 193: 51, # 'Ã' + 194: 81, # 'Â' + 195: 222, # 'Ä‚' + 196: 78, # 'Ä' + 197: 223, # 'Ĺ' + 198: 224, # 'Ć' + 199: 225, # 'Ç' + 200: 226, # 'ÄŒ' + 201: 44, # 'É' + 202: 227, # 'Ę' + 203: 228, # 'Ë' + 204: 229, # 'Äš' + 205: 61, # 'Ã' + 206: 230, # 'ÃŽ' + 207: 231, # 'ÄŽ' + 208: 232, # 'Ä' + 209: 233, # 'Ń' + 210: 234, # 'Ň' + 211: 58, # 'Ó' + 212: 235, # 'Ô' + 213: 66, # 'Å' + 214: 59, # 'Ö' + 215: 236, # '×' + 216: 237, # 'Ř' + 217: 238, # 'Å®' + 218: 60, # 'Ú' + 219: 69, # 'Ű' + 220: 63, # 'Ü' + 221: 239, # 'Ã' + 222: 240, # 'Å¢' + 223: 241, # 'ß' + 224: 82, # 'Å•' + 225: 14, # 'á' + 226: 74, # 'â' + 227: 242, # 'ă' + 228: 70, # 'ä' + 229: 80, # 'ĺ' + 230: 243, # 'ć' + 231: 72, # 'ç' + 232: 244, # 'Ä' + 233: 15, # 'é' + 234: 83, # 'Ä™' + 235: 77, # 'ë' + 236: 84, # 'Ä›' + 237: 30, # 'í' + 238: 76, # 'î' + 239: 85, # 'Ä' + 240: 245, # 'Ä‘' + 241: 246, # 'Å„' + 242: 247, # 'ň' + 243: 25, # 'ó' + 244: 73, # 'ô' + 245: 42, # 'Å‘' + 246: 24, # 'ö' + 247: 248, # '÷' + 248: 249, # 'Å™' + 249: 250, # 'ů' + 250: 31, # 'ú' + 251: 56, # 'ű' + 252: 29, # 'ü' + 253: 251, # 'ý' + 254: 252, # 'Å£' + 255: 253, # 'Ë™' +} + +ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-2', + language='Hungarian', + char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER, + language_model=HUNGARIAN_LANG_MODEL, + typical_positive_ratio=0.947368, + keep_ascii_letters=True, + alphabet='ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÃÉÃÓÖÚÜáéíóöúüÅőŰű') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py new file mode 100644 index 0000000..5594452 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langrussianmodel.py @@ -0,0 +1,5718 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +RUSSIAN_LANG_MODEL = { + 37: { # 'Ð' + 37: 0, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 2, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 44: { # 'Б' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 2, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 33: { # 'Ð’' + 37: 2, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 46: { # 'Г' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 41: { # 'Д' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 3, # 'ж' + 20: 1, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 48: { # 'Е' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 2, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 1, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 56: { # 'Ж' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 1, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 51: { # 'З' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 1, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 42: { # 'И' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 2, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 1, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 60: { # 'Й' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 36: { # 'К' + 37: 2, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 2, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 49: { # 'Л' + 37: 2, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 0, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 38: { # 'М' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 1, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 31: { # 'Ð' + 37: 2, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 2, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 3, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 34: { # 'О' + 37: 0, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 2, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 1, # 'З' + 42: 1, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 2, # 'Л' + 38: 1, # 'М' + 31: 2, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 1, # 'Ф' + 55: 1, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 1, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 35: { # 'П' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 2, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 1, # 'Ñ‚' + 14: 2, # 'у' + 39: 1, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 45: { # 'Р' + 37: 2, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 2, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 2, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 2, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 2, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 32: { # 'С' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 2, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 2, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 2, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 40: { # 'Т' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 2, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 1, # 'Ь' + 47: 1, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 52: { # 'У' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 1, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 1, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 1, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 1, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 0, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 53: { # 'Ф' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 1, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 55: { # 'Ð¥' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 2, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 0, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 1, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 58: { # 'Ц' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 1, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 1, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 50: { # 'Ч' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 1, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 1, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 57: { # 'Ш' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 1, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 63: { # 'Щ' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 1, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 1, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 62: { # 'Ы' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 1, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 61: { # 'Ь' + 37: 0, # 'Ð' + 44: 1, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 1, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 1, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 47: { # 'Э' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 1, # 'Й' + 36: 1, # 'К' + 49: 1, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 1, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 59: { # 'Ю' + 37: 1, # 'Ð' + 44: 1, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 1, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 0, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 0, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 43: { # 'Я' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 1, # 'Ð’' + 46: 1, # 'Г' + 41: 0, # 'Д' + 48: 1, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 1, # 'С' + 40: 1, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 1, # 'Ð¥' + 58: 0, # 'Ц' + 50: 1, # 'Ч' + 57: 0, # 'Ш' + 63: 1, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 1, # 'Ю' + 43: 1, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 0, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 1, # 'й' + 11: 1, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 1, # 'п' + 9: 1, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 3: { # 'а' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 1, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 21: { # 'б' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 1, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 0, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 10: { # 'в' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 19: { # 'г' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 13: { # 'д' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 3, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 2: { # 'е' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 2, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 24: { # 'ж' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 1, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 20: { # 'з' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 1, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 4: { # 'и' + 37: 1, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 2, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 23: { # 'й' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 1, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 2, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 11: { # 'к' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 3, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 2, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 1, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 8: { # 'л' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 3, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 1, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 1, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 12: { # 'м' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 5: { # 'н' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 3, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 2, # 'щ' + 54: 1, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 1: { # 'о' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 3, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 2, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 15: { # 'п' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 3, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 1, # 'ш' + 29: 1, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 9: { # 'Ñ€' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 7: { # 'Ñ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 1, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 2, # 'ш' + 29: 1, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 6: { # 'Ñ‚' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 2, # 'щ' + 54: 2, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 14: { # 'у' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 3, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 2, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 2, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 39: { # 'Ñ„' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 0, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 2, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 2, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 2, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 26: { # 'Ñ…' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 3, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 1, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 1, # 'п' + 9: 3, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 2, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 1, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 28: { # 'ц' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 1, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 2, # 'к' + 8: 1, # 'л' + 12: 1, # 'м' + 5: 1, # 'н' + 1: 3, # 'о' + 15: 0, # 'п' + 9: 1, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 1, # 'Ñ‚' + 14: 3, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 1, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 3, # 'Ñ‹' + 17: 1, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 22: { # 'ч' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 2, # 'л' + 12: 1, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 3, # 'у' + 39: 1, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 1, # 'ч' + 25: 2, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 25: { # 'ш' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 1, # 'б' + 10: 2, # 'в' + 19: 1, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 2, # 'м' + 5: 3, # 'н' + 1: 3, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 1, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 3, # 'у' + 39: 2, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 1, # 'ц' + 22: 1, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 3, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 29: { # 'щ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 3, # 'а' + 21: 0, # 'б' + 10: 1, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 3, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 3, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 1, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 0, # 'п' + 9: 2, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 2, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 2, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 0, # 'Ñ' + }, + 54: { # 'ÑŠ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 0, # 'б' + 10: 0, # 'в' + 19: 0, # 'г' + 13: 0, # 'д' + 2: 2, # 'е' + 24: 0, # 'ж' + 20: 0, # 'з' + 4: 0, # 'и' + 23: 0, # 'й' + 11: 0, # 'к' + 8: 0, # 'л' + 12: 0, # 'м' + 5: 0, # 'н' + 1: 0, # 'о' + 15: 0, # 'п' + 9: 0, # 'Ñ€' + 7: 0, # 'Ñ' + 6: 0, # 'Ñ‚' + 14: 0, # 'у' + 39: 0, # 'Ñ„' + 26: 0, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 0, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 18: { # 'Ñ‹' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 3, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 2, # 'и' + 23: 3, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 1, # 'о' + 15: 3, # 'п' + 9: 3, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 0, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 3, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 0, # 'ÑŽ' + 16: 2, # 'Ñ' + }, + 17: { # 'ÑŒ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 2, # 'б' + 10: 2, # 'в' + 19: 2, # 'г' + 13: 2, # 'д' + 2: 3, # 'е' + 24: 1, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 0, # 'й' + 11: 3, # 'к' + 8: 0, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 2, # 'о' + 15: 2, # 'п' + 9: 1, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 2, # 'Ñ‚' + 14: 0, # 'у' + 39: 2, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 3, # 'ш' + 29: 2, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 3, # 'ÑŽ' + 16: 3, # 'Ñ' + }, + 30: { # 'Ñ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 1, # 'М' + 31: 1, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 1, # 'Р' + 32: 1, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 1, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 1, # 'б' + 10: 1, # 'в' + 19: 1, # 'г' + 13: 2, # 'д' + 2: 1, # 'е' + 24: 0, # 'ж' + 20: 1, # 'з' + 4: 0, # 'и' + 23: 2, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 2, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 2, # 'Ñ„' + 26: 1, # 'Ñ…' + 28: 0, # 'ц' + 22: 0, # 'ч' + 25: 1, # 'ш' + 29: 0, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 1, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 27: { # 'ÑŽ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 2, # 'а' + 21: 3, # 'б' + 10: 1, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 1, # 'е' + 24: 2, # 'ж' + 20: 2, # 'з' + 4: 1, # 'и' + 23: 1, # 'й' + 11: 2, # 'к' + 8: 2, # 'л' + 12: 2, # 'м' + 5: 2, # 'н' + 1: 1, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 0, # 'у' + 39: 1, # 'Ñ„' + 26: 2, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 1, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 1, # 'Ñ' + }, + 16: { # 'Ñ' + 37: 0, # 'Ð' + 44: 0, # 'Б' + 33: 0, # 'Ð’' + 46: 0, # 'Г' + 41: 0, # 'Д' + 48: 0, # 'Е' + 56: 0, # 'Ж' + 51: 0, # 'З' + 42: 0, # 'И' + 60: 0, # 'Й' + 36: 0, # 'К' + 49: 0, # 'Л' + 38: 0, # 'М' + 31: 0, # 'Ð' + 34: 0, # 'О' + 35: 0, # 'П' + 45: 0, # 'Р' + 32: 0, # 'С' + 40: 0, # 'Т' + 52: 0, # 'У' + 53: 0, # 'Ф' + 55: 0, # 'Ð¥' + 58: 0, # 'Ц' + 50: 0, # 'Ч' + 57: 0, # 'Ш' + 63: 0, # 'Щ' + 62: 0, # 'Ы' + 61: 0, # 'Ь' + 47: 0, # 'Э' + 59: 0, # 'Ю' + 43: 0, # 'Я' + 3: 0, # 'а' + 21: 2, # 'б' + 10: 3, # 'в' + 19: 2, # 'г' + 13: 3, # 'д' + 2: 3, # 'е' + 24: 3, # 'ж' + 20: 3, # 'з' + 4: 2, # 'и' + 23: 2, # 'й' + 11: 3, # 'к' + 8: 3, # 'л' + 12: 3, # 'м' + 5: 3, # 'н' + 1: 0, # 'о' + 15: 2, # 'п' + 9: 2, # 'Ñ€' + 7: 3, # 'Ñ' + 6: 3, # 'Ñ‚' + 14: 1, # 'у' + 39: 1, # 'Ñ„' + 26: 3, # 'Ñ…' + 28: 2, # 'ц' + 22: 2, # 'ч' + 25: 2, # 'ш' + 29: 3, # 'щ' + 54: 0, # 'ÑŠ' + 18: 0, # 'Ñ‹' + 17: 0, # 'ÑŒ' + 30: 0, # 'Ñ' + 27: 2, # 'ÑŽ' + 16: 2, # 'Ñ' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +IBM866_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'Ð' + 129: 44, # 'Б' + 130: 33, # 'Ð’' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Ð' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Ð¥' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 3, # 'а' + 161: 21, # 'б' + 162: 10, # 'в' + 163: 19, # 'г' + 164: 13, # 'д' + 165: 2, # 'е' + 166: 24, # 'ж' + 167: 20, # 'з' + 168: 4, # 'и' + 169: 23, # 'й' + 170: 11, # 'к' + 171: 8, # 'л' + 172: 12, # 'м' + 173: 5, # 'н' + 174: 1, # 'о' + 175: 15, # 'п' + 176: 191, # 'â–‘' + 177: 192, # 'â–’' + 178: 193, # 'â–“' + 179: 194, # '│' + 180: 195, # '┤' + 181: 196, # 'â•¡' + 182: 197, # 'â•¢' + 183: 198, # 'â•–' + 184: 199, # 'â••' + 185: 200, # 'â•£' + 186: 201, # 'â•‘' + 187: 202, # 'â•—' + 188: 203, # 'â•' + 189: 204, # '╜' + 190: 205, # 'â•›' + 191: 206, # 'â”' + 192: 207, # 'â””' + 193: 208, # 'â”´' + 194: 209, # '┬' + 195: 210, # '├' + 196: 211, # '─' + 197: 212, # '┼' + 198: 213, # '╞' + 199: 214, # '╟' + 200: 215, # '╚' + 201: 216, # 'â•”' + 202: 217, # 'â•©' + 203: 218, # '╦' + 204: 219, # 'â• ' + 205: 220, # 'â•' + 206: 221, # '╬' + 207: 222, # 'â•§' + 208: 223, # '╨' + 209: 224, # '╤' + 210: 225, # 'â•¥' + 211: 226, # 'â•™' + 212: 227, # '╘' + 213: 228, # 'â•’' + 214: 229, # 'â•“' + 215: 230, # 'â•«' + 216: 231, # '╪' + 217: 232, # '┘' + 218: 233, # '┌' + 219: 234, # 'â–ˆ' + 220: 235, # 'â–„' + 221: 236, # 'â–Œ' + 222: 237, # 'â–' + 223: 238, # 'â–€' + 224: 9, # 'Ñ€' + 225: 7, # 'Ñ' + 226: 6, # 'Ñ‚' + 227: 14, # 'у' + 228: 39, # 'Ñ„' + 229: 26, # 'Ñ…' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ÑŠ' + 235: 18, # 'Ñ‹' + 236: 17, # 'ÑŒ' + 237: 30, # 'Ñ' + 238: 27, # 'ÑŽ' + 239: 16, # 'Ñ' + 240: 239, # 'Ð' + 241: 68, # 'Ñ‘' + 242: 240, # 'Є' + 243: 241, # 'Ñ”' + 244: 242, # 'Ї' + 245: 243, # 'Ñ—' + 246: 244, # 'ÐŽ' + 247: 245, # 'Ñž' + 248: 246, # '°' + 249: 247, # '∙' + 250: 248, # '·' + 251: 249, # '√' + 252: 250, # 'â„–' + 253: 251, # '¤' + 254: 252, # 'â– ' + 255: 255, # '\xa0' +} + +IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM866', + language='Russian', + char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + +WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'Ђ' + 129: 192, # 'Ѓ' + 130: 193, # '‚' + 131: 194, # 'Ñ“' + 132: 195, # '„' + 133: 196, # '…' + 134: 197, # '†' + 135: 198, # '‡' + 136: 199, # '€' + 137: 200, # '‰' + 138: 201, # 'Љ' + 139: 202, # '‹' + 140: 203, # 'Њ' + 141: 204, # 'ÐŒ' + 142: 205, # 'Ћ' + 143: 206, # 'Ð' + 144: 207, # 'Ñ’' + 145: 208, # '‘' + 146: 209, # '’' + 147: 210, # '“' + 148: 211, # 'â€' + 149: 212, # '•' + 150: 213, # '–' + 151: 214, # '—' + 152: 215, # None + 153: 216, # 'â„¢' + 154: 217, # 'Ñ™' + 155: 218, # '›' + 156: 219, # 'Ñš' + 157: 220, # 'Ñœ' + 158: 221, # 'Ñ›' + 159: 222, # 'ÑŸ' + 160: 223, # '\xa0' + 161: 224, # 'ÐŽ' + 162: 225, # 'Ñž' + 163: 226, # 'Ј' + 164: 227, # '¤' + 165: 228, # 'Ò' + 166: 229, # '¦' + 167: 230, # '§' + 168: 231, # 'Ð' + 169: 232, # '©' + 170: 233, # 'Є' + 171: 234, # '«' + 172: 235, # '¬' + 173: 236, # '\xad' + 174: 237, # '®' + 175: 238, # 'Ї' + 176: 239, # '°' + 177: 240, # '±' + 178: 241, # 'І' + 179: 242, # 'Ñ–' + 180: 243, # 'Ò‘' + 181: 244, # 'µ' + 182: 245, # '¶' + 183: 246, # '·' + 184: 68, # 'Ñ‘' + 185: 247, # 'â„–' + 186: 248, # 'Ñ”' + 187: 249, # '»' + 188: 250, # 'ј' + 189: 251, # 'Ð…' + 190: 252, # 'Ñ•' + 191: 253, # 'Ñ—' + 192: 37, # 'Ð' + 193: 44, # 'Б' + 194: 33, # 'Ð’' + 195: 46, # 'Г' + 196: 41, # 'Д' + 197: 48, # 'Е' + 198: 56, # 'Ж' + 199: 51, # 'З' + 200: 42, # 'И' + 201: 60, # 'Й' + 202: 36, # 'К' + 203: 49, # 'Л' + 204: 38, # 'М' + 205: 31, # 'Ð' + 206: 34, # 'О' + 207: 35, # 'П' + 208: 45, # 'Р' + 209: 32, # 'С' + 210: 40, # 'Т' + 211: 52, # 'У' + 212: 53, # 'Ф' + 213: 55, # 'Ð¥' + 214: 58, # 'Ц' + 215: 50, # 'Ч' + 216: 57, # 'Ш' + 217: 63, # 'Щ' + 218: 70, # 'Ъ' + 219: 62, # 'Ы' + 220: 61, # 'Ь' + 221: 47, # 'Э' + 222: 59, # 'Ю' + 223: 43, # 'Я' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'Ñ€' + 241: 7, # 'Ñ' + 242: 6, # 'Ñ‚' + 243: 14, # 'у' + 244: 39, # 'Ñ„' + 245: 26, # 'Ñ…' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ÑŠ' + 251: 18, # 'Ñ‹' + 252: 17, # 'ÑŒ' + 253: 30, # 'Ñ' + 254: 27, # 'ÑŽ' + 255: 16, # 'Ñ' +} + +WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='windows-1251', + language='Russian', + char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + +IBM855_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # 'Ñ’' + 129: 192, # 'Ђ' + 130: 193, # 'Ñ“' + 131: 194, # 'Ѓ' + 132: 68, # 'Ñ‘' + 133: 195, # 'Ð' + 134: 196, # 'Ñ”' + 135: 197, # 'Є' + 136: 198, # 'Ñ•' + 137: 199, # 'Ð…' + 138: 200, # 'Ñ–' + 139: 201, # 'І' + 140: 202, # 'Ñ—' + 141: 203, # 'Ї' + 142: 204, # 'ј' + 143: 205, # 'Ј' + 144: 206, # 'Ñ™' + 145: 207, # 'Љ' + 146: 208, # 'Ñš' + 147: 209, # 'Њ' + 148: 210, # 'Ñ›' + 149: 211, # 'Ћ' + 150: 212, # 'Ñœ' + 151: 213, # 'ÐŒ' + 152: 214, # 'Ñž' + 153: 215, # 'ÐŽ' + 154: 216, # 'ÑŸ' + 155: 217, # 'Ð' + 156: 27, # 'ÑŽ' + 157: 59, # 'Ю' + 158: 54, # 'ÑŠ' + 159: 70, # 'Ъ' + 160: 3, # 'а' + 161: 37, # 'Ð' + 162: 21, # 'б' + 163: 44, # 'Б' + 164: 28, # 'ц' + 165: 58, # 'Ц' + 166: 13, # 'д' + 167: 41, # 'Д' + 168: 2, # 'е' + 169: 48, # 'Е' + 170: 39, # 'Ñ„' + 171: 53, # 'Ф' + 172: 19, # 'г' + 173: 46, # 'Г' + 174: 218, # '«' + 175: 219, # '»' + 176: 220, # 'â–‘' + 177: 221, # 'â–’' + 178: 222, # 'â–“' + 179: 223, # '│' + 180: 224, # '┤' + 181: 26, # 'Ñ…' + 182: 55, # 'Ð¥' + 183: 4, # 'и' + 184: 42, # 'И' + 185: 225, # 'â•£' + 186: 226, # 'â•‘' + 187: 227, # 'â•—' + 188: 228, # 'â•' + 189: 23, # 'й' + 190: 60, # 'Й' + 191: 229, # 'â”' + 192: 230, # 'â””' + 193: 231, # 'â”´' + 194: 232, # '┬' + 195: 233, # '├' + 196: 234, # '─' + 197: 235, # '┼' + 198: 11, # 'к' + 199: 36, # 'К' + 200: 236, # '╚' + 201: 237, # 'â•”' + 202: 238, # 'â•©' + 203: 239, # '╦' + 204: 240, # 'â• ' + 205: 241, # 'â•' + 206: 242, # '╬' + 207: 243, # '¤' + 208: 8, # 'л' + 209: 49, # 'Л' + 210: 12, # 'м' + 211: 38, # 'М' + 212: 5, # 'н' + 213: 31, # 'Ð' + 214: 1, # 'о' + 215: 34, # 'О' + 216: 15, # 'п' + 217: 244, # '┘' + 218: 245, # '┌' + 219: 246, # 'â–ˆ' + 220: 247, # 'â–„' + 221: 35, # 'П' + 222: 16, # 'Ñ' + 223: 248, # 'â–€' + 224: 43, # 'Я' + 225: 9, # 'Ñ€' + 226: 45, # 'Р' + 227: 7, # 'Ñ' + 228: 32, # 'С' + 229: 6, # 'Ñ‚' + 230: 40, # 'Т' + 231: 14, # 'у' + 232: 52, # 'У' + 233: 24, # 'ж' + 234: 56, # 'Ж' + 235: 10, # 'в' + 236: 33, # 'Ð’' + 237: 17, # 'ÑŒ' + 238: 61, # 'Ь' + 239: 249, # 'â„–' + 240: 250, # '\xad' + 241: 18, # 'Ñ‹' + 242: 62, # 'Ы' + 243: 20, # 'з' + 244: 51, # 'З' + 245: 25, # 'ш' + 246: 57, # 'Ш' + 247: 30, # 'Ñ' + 248: 47, # 'Э' + 249: 29, # 'щ' + 250: 63, # 'Щ' + 251: 22, # 'ч' + 252: 50, # 'Ч' + 253: 251, # '§' + 254: 252, # 'â– ' + 255: 255, # '\xa0' +} + +IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='IBM855', + language='Russian', + char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + +KOI8_R_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '─' + 129: 192, # '│' + 130: 193, # '┌' + 131: 194, # 'â”' + 132: 195, # 'â””' + 133: 196, # '┘' + 134: 197, # '├' + 135: 198, # '┤' + 136: 199, # '┬' + 137: 200, # 'â”´' + 138: 201, # '┼' + 139: 202, # 'â–€' + 140: 203, # 'â–„' + 141: 204, # 'â–ˆ' + 142: 205, # 'â–Œ' + 143: 206, # 'â–' + 144: 207, # 'â–‘' + 145: 208, # 'â–’' + 146: 209, # 'â–“' + 147: 210, # '⌠' + 148: 211, # 'â– ' + 149: 212, # '∙' + 150: 213, # '√' + 151: 214, # '≈' + 152: 215, # '≤' + 153: 216, # '≥' + 154: 217, # '\xa0' + 155: 218, # '⌡' + 156: 219, # '°' + 157: 220, # '²' + 158: 221, # '·' + 159: 222, # '÷' + 160: 223, # 'â•' + 161: 224, # 'â•‘' + 162: 225, # 'â•’' + 163: 68, # 'Ñ‘' + 164: 226, # 'â•“' + 165: 227, # 'â•”' + 166: 228, # 'â••' + 167: 229, # 'â•–' + 168: 230, # 'â•—' + 169: 231, # '╘' + 170: 232, # 'â•™' + 171: 233, # '╚' + 172: 234, # 'â•›' + 173: 235, # '╜' + 174: 236, # 'â•' + 175: 237, # '╞' + 176: 238, # '╟' + 177: 239, # 'â• ' + 178: 240, # 'â•¡' + 179: 241, # 'Ð' + 180: 242, # 'â•¢' + 181: 243, # 'â•£' + 182: 244, # '╤' + 183: 245, # 'â•¥' + 184: 246, # '╦' + 185: 247, # 'â•§' + 186: 248, # '╨' + 187: 249, # 'â•©' + 188: 250, # '╪' + 189: 251, # 'â•«' + 190: 252, # '╬' + 191: 253, # '©' + 192: 27, # 'ÑŽ' + 193: 3, # 'а' + 194: 21, # 'б' + 195: 28, # 'ц' + 196: 13, # 'д' + 197: 2, # 'е' + 198: 39, # 'Ñ„' + 199: 19, # 'г' + 200: 26, # 'Ñ…' + 201: 4, # 'и' + 202: 23, # 'й' + 203: 11, # 'к' + 204: 8, # 'л' + 205: 12, # 'м' + 206: 5, # 'н' + 207: 1, # 'о' + 208: 15, # 'п' + 209: 16, # 'Ñ' + 210: 9, # 'Ñ€' + 211: 7, # 'Ñ' + 212: 6, # 'Ñ‚' + 213: 14, # 'у' + 214: 24, # 'ж' + 215: 10, # 'в' + 216: 17, # 'ÑŒ' + 217: 18, # 'Ñ‹' + 218: 20, # 'з' + 219: 25, # 'ш' + 220: 30, # 'Ñ' + 221: 29, # 'щ' + 222: 22, # 'ч' + 223: 54, # 'ÑŠ' + 224: 59, # 'Ю' + 225: 37, # 'Ð' + 226: 44, # 'Б' + 227: 58, # 'Ц' + 228: 41, # 'Д' + 229: 48, # 'Е' + 230: 53, # 'Ф' + 231: 46, # 'Г' + 232: 55, # 'Ð¥' + 233: 42, # 'И' + 234: 60, # 'Й' + 235: 36, # 'К' + 236: 49, # 'Л' + 237: 38, # 'М' + 238: 31, # 'Ð' + 239: 34, # 'О' + 240: 35, # 'П' + 241: 43, # 'Я' + 242: 45, # 'Р' + 243: 32, # 'С' + 244: 40, # 'Т' + 245: 52, # 'У' + 246: 56, # 'Ж' + 247: 33, # 'Ð’' + 248: 61, # 'Ь' + 249: 62, # 'Ы' + 250: 51, # 'З' + 251: 57, # 'Ш' + 252: 47, # 'Э' + 253: 63, # 'Щ' + 254: 50, # 'Ч' + 255: 70, # 'Ъ' +} + +KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='KOI8-R', + language='Russian', + char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + +MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 37, # 'Ð' + 129: 44, # 'Б' + 130: 33, # 'Ð’' + 131: 46, # 'Г' + 132: 41, # 'Д' + 133: 48, # 'Е' + 134: 56, # 'Ж' + 135: 51, # 'З' + 136: 42, # 'И' + 137: 60, # 'Й' + 138: 36, # 'К' + 139: 49, # 'Л' + 140: 38, # 'М' + 141: 31, # 'Ð' + 142: 34, # 'О' + 143: 35, # 'П' + 144: 45, # 'Р' + 145: 32, # 'С' + 146: 40, # 'Т' + 147: 52, # 'У' + 148: 53, # 'Ф' + 149: 55, # 'Ð¥' + 150: 58, # 'Ц' + 151: 50, # 'Ч' + 152: 57, # 'Ш' + 153: 63, # 'Щ' + 154: 70, # 'Ъ' + 155: 62, # 'Ы' + 156: 61, # 'Ь' + 157: 47, # 'Э' + 158: 59, # 'Ю' + 159: 43, # 'Я' + 160: 191, # '†' + 161: 192, # '°' + 162: 193, # 'Ò' + 163: 194, # '£' + 164: 195, # '§' + 165: 196, # '•' + 166: 197, # '¶' + 167: 198, # 'І' + 168: 199, # '®' + 169: 200, # '©' + 170: 201, # 'â„¢' + 171: 202, # 'Ђ' + 172: 203, # 'Ñ’' + 173: 204, # '≠' + 174: 205, # 'Ѓ' + 175: 206, # 'Ñ“' + 176: 207, # '∞' + 177: 208, # '±' + 178: 209, # '≤' + 179: 210, # '≥' + 180: 211, # 'Ñ–' + 181: 212, # 'µ' + 182: 213, # 'Ò‘' + 183: 214, # 'Ј' + 184: 215, # 'Є' + 185: 216, # 'Ñ”' + 186: 217, # 'Ї' + 187: 218, # 'Ñ—' + 188: 219, # 'Љ' + 189: 220, # 'Ñ™' + 190: 221, # 'Њ' + 191: 222, # 'Ñš' + 192: 223, # 'ј' + 193: 224, # 'Ð…' + 194: 225, # '¬' + 195: 226, # '√' + 196: 227, # 'Æ’' + 197: 228, # '≈' + 198: 229, # '∆' + 199: 230, # '«' + 200: 231, # '»' + 201: 232, # '…' + 202: 233, # '\xa0' + 203: 234, # 'Ћ' + 204: 235, # 'Ñ›' + 205: 236, # 'ÐŒ' + 206: 237, # 'Ñœ' + 207: 238, # 'Ñ•' + 208: 239, # '–' + 209: 240, # '—' + 210: 241, # '“' + 211: 242, # 'â€' + 212: 243, # '‘' + 213: 244, # '’' + 214: 245, # '÷' + 215: 246, # '„' + 216: 247, # 'ÐŽ' + 217: 248, # 'Ñž' + 218: 249, # 'Ð' + 219: 250, # 'ÑŸ' + 220: 251, # 'â„–' + 221: 252, # 'Ð' + 222: 68, # 'Ñ‘' + 223: 16, # 'Ñ' + 224: 3, # 'а' + 225: 21, # 'б' + 226: 10, # 'в' + 227: 19, # 'г' + 228: 13, # 'д' + 229: 2, # 'е' + 230: 24, # 'ж' + 231: 20, # 'з' + 232: 4, # 'и' + 233: 23, # 'й' + 234: 11, # 'к' + 235: 8, # 'л' + 236: 12, # 'м' + 237: 5, # 'н' + 238: 1, # 'о' + 239: 15, # 'п' + 240: 9, # 'Ñ€' + 241: 7, # 'Ñ' + 242: 6, # 'Ñ‚' + 243: 14, # 'у' + 244: 39, # 'Ñ„' + 245: 26, # 'Ñ…' + 246: 28, # 'ц' + 247: 22, # 'ч' + 248: 25, # 'ш' + 249: 29, # 'щ' + 250: 54, # 'ÑŠ' + 251: 18, # 'Ñ‹' + 252: 17, # 'ÑŒ' + 253: 30, # 'Ñ' + 254: 27, # 'ÑŽ' + 255: 255, # '€' +} + +MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='MacCyrillic', + language='Russian', + char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + +ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 142, # 'A' + 66: 143, # 'B' + 67: 144, # 'C' + 68: 145, # 'D' + 69: 146, # 'E' + 70: 147, # 'F' + 71: 148, # 'G' + 72: 149, # 'H' + 73: 150, # 'I' + 74: 151, # 'J' + 75: 152, # 'K' + 76: 74, # 'L' + 77: 153, # 'M' + 78: 75, # 'N' + 79: 154, # 'O' + 80: 155, # 'P' + 81: 156, # 'Q' + 82: 157, # 'R' + 83: 158, # 'S' + 84: 159, # 'T' + 85: 160, # 'U' + 86: 161, # 'V' + 87: 162, # 'W' + 88: 163, # 'X' + 89: 164, # 'Y' + 90: 165, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 71, # 'a' + 98: 172, # 'b' + 99: 66, # 'c' + 100: 173, # 'd' + 101: 65, # 'e' + 102: 174, # 'f' + 103: 76, # 'g' + 104: 175, # 'h' + 105: 64, # 'i' + 106: 176, # 'j' + 107: 177, # 'k' + 108: 77, # 'l' + 109: 72, # 'm' + 110: 178, # 'n' + 111: 69, # 'o' + 112: 67, # 'p' + 113: 179, # 'q' + 114: 78, # 'r' + 115: 73, # 's' + 116: 180, # 't' + 117: 181, # 'u' + 118: 79, # 'v' + 119: 182, # 'w' + 120: 183, # 'x' + 121: 184, # 'y' + 122: 185, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 191, # '\x80' + 129: 192, # '\x81' + 130: 193, # '\x82' + 131: 194, # '\x83' + 132: 195, # '\x84' + 133: 196, # '\x85' + 134: 197, # '\x86' + 135: 198, # '\x87' + 136: 199, # '\x88' + 137: 200, # '\x89' + 138: 201, # '\x8a' + 139: 202, # '\x8b' + 140: 203, # '\x8c' + 141: 204, # '\x8d' + 142: 205, # '\x8e' + 143: 206, # '\x8f' + 144: 207, # '\x90' + 145: 208, # '\x91' + 146: 209, # '\x92' + 147: 210, # '\x93' + 148: 211, # '\x94' + 149: 212, # '\x95' + 150: 213, # '\x96' + 151: 214, # '\x97' + 152: 215, # '\x98' + 153: 216, # '\x99' + 154: 217, # '\x9a' + 155: 218, # '\x9b' + 156: 219, # '\x9c' + 157: 220, # '\x9d' + 158: 221, # '\x9e' + 159: 222, # '\x9f' + 160: 223, # '\xa0' + 161: 224, # 'Ð' + 162: 225, # 'Ђ' + 163: 226, # 'Ѓ' + 164: 227, # 'Є' + 165: 228, # 'Ð…' + 166: 229, # 'І' + 167: 230, # 'Ї' + 168: 231, # 'Ј' + 169: 232, # 'Љ' + 170: 233, # 'Њ' + 171: 234, # 'Ћ' + 172: 235, # 'ÐŒ' + 173: 236, # '\xad' + 174: 237, # 'ÐŽ' + 175: 238, # 'Ð' + 176: 37, # 'Ð' + 177: 44, # 'Б' + 178: 33, # 'Ð’' + 179: 46, # 'Г' + 180: 41, # 'Д' + 181: 48, # 'Е' + 182: 56, # 'Ж' + 183: 51, # 'З' + 184: 42, # 'И' + 185: 60, # 'Й' + 186: 36, # 'К' + 187: 49, # 'Л' + 188: 38, # 'М' + 189: 31, # 'Ð' + 190: 34, # 'О' + 191: 35, # 'П' + 192: 45, # 'Р' + 193: 32, # 'С' + 194: 40, # 'Т' + 195: 52, # 'У' + 196: 53, # 'Ф' + 197: 55, # 'Ð¥' + 198: 58, # 'Ц' + 199: 50, # 'Ч' + 200: 57, # 'Ш' + 201: 63, # 'Щ' + 202: 70, # 'Ъ' + 203: 62, # 'Ы' + 204: 61, # 'Ь' + 205: 47, # 'Э' + 206: 59, # 'Ю' + 207: 43, # 'Я' + 208: 3, # 'а' + 209: 21, # 'б' + 210: 10, # 'в' + 211: 19, # 'г' + 212: 13, # 'д' + 213: 2, # 'е' + 214: 24, # 'ж' + 215: 20, # 'з' + 216: 4, # 'и' + 217: 23, # 'й' + 218: 11, # 'к' + 219: 8, # 'л' + 220: 12, # 'м' + 221: 5, # 'н' + 222: 1, # 'о' + 223: 15, # 'п' + 224: 9, # 'Ñ€' + 225: 7, # 'Ñ' + 226: 6, # 'Ñ‚' + 227: 14, # 'у' + 228: 39, # 'Ñ„' + 229: 26, # 'Ñ…' + 230: 28, # 'ц' + 231: 22, # 'ч' + 232: 25, # 'ш' + 233: 29, # 'щ' + 234: 54, # 'ÑŠ' + 235: 18, # 'Ñ‹' + 236: 17, # 'ÑŒ' + 237: 30, # 'Ñ' + 238: 27, # 'ÑŽ' + 239: 16, # 'Ñ' + 240: 239, # 'â„–' + 241: 68, # 'Ñ‘' + 242: 240, # 'Ñ’' + 243: 241, # 'Ñ“' + 244: 242, # 'Ñ”' + 245: 243, # 'Ñ•' + 246: 244, # 'Ñ–' + 247: 245, # 'Ñ—' + 248: 246, # 'ј' + 249: 247, # 'Ñ™' + 250: 248, # 'Ñš' + 251: 249, # 'Ñ›' + 252: 250, # 'Ñœ' + 253: 251, # '§' + 254: 252, # 'Ñž' + 255: 255, # 'ÑŸ' +} + +ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-5', + language='Russian', + char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER, + language_model=RUSSIAN_LANG_MODEL, + typical_positive_ratio=0.976601, + keep_ascii_letters=False, + alphabet='ÐÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑÑ‘') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..9a37db5 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,4383 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +THAI_LANG_MODEL = { + 5: { # 'à¸' + 5: 2, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 3, # 'ฎ' + 57: 2, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 2, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 2, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 3, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 1, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 30: { # 'ข' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 0, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 2, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 2, # 'ี' + 40: 3, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 24: { # 'ค' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 2, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 2, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'à¹' + 41: 3, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 8: { # 'ง' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 1, # 'ฉ' + 34: 2, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'à¸' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 2, # 'ศ' + 46: 1, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 3, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 26: { # 'จ' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 3, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 52: { # 'ฉ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 3, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 1, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 34: { # 'ช' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 1, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 51: { # 'ซ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 3, # 'ึ' + 27: 2, # 'ื' + 32: 1, # 'ุ' + 35: 1, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 1, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 47: { # 'à¸' + 5: 1, # 'à¸' + 30: 1, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 3, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 2, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 58: { # 'ฎ' + 5: 2, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 1, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 57: { # 'à¸' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 49: { # 'à¸' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 53: { # 'ฑ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 55: { # 'ฒ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 43: { # 'ณ' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 3, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 3, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 3, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 20: { # 'ด' + 5: 2, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 2, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 1, # 'ึ' + 27: 2, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 2, # 'ๆ' + 37: 2, # '็' + 6: 1, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 19: { # 'ต' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 2, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 2, # 'ภ' + 9: 1, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 1, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 2, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 44: { # 'ถ' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 1, # 'ี' + 40: 3, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 14: { # 'ท' + 5: 1, # 'à¸' + 30: 1, # 'ข' + 24: 3, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 3, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 1, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 3, # 'ศ' + 46: 1, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 1, # 'ื' + 32: 3, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 48: { # 'ธ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 2, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 2, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 3: { # 'น' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 1, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 2, # 'ถ' + 14: 3, # 'ท' + 48: 3, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 1, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 3, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 3, # 'โ' + 29: 3, # 'ใ' + 33: 3, # 'ไ' + 50: 2, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 17: { # 'บ' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 1, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 2, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 2, # 'ื' + 32: 3, # 'ุ' + 35: 2, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 25: { # 'ป' + 5: 2, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 1, # 'ฎ' + 57: 3, # 'à¸' + 49: 1, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 1, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 1, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 2, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 1, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 39: { # 'ผ' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 1, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 0, # 'ุ' + 35: 3, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 1, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 62: { # 'à¸' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 1, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 1, # 'ี' + 40: 2, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 2, # '่' + 7: 1, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 31: { # 'พ' + 5: 1, # 'à¸' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 1, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 2, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 1, # 'ึ' + 27: 3, # 'ื' + 32: 1, # 'ุ' + 35: 2, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 1, # '็' + 6: 0, # '่' + 7: 1, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 54: { # 'ฟ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 1, # 'ื' + 32: 1, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 45: { # 'ภ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 2, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 9: { # 'ม' + 5: 2, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 3, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 2, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 1, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 2, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 16: { # 'ย' + 5: 3, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 2, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 1, # 'ึ' + 27: 2, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 2, # 'ๆ' + 37: 1, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 2: { # 'ร' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 2, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 3, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 3, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 3, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'à¸' + 31: 2, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 2, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 1, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 3, # 'เ' + 28: 3, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 3, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 61: { # 'ฤ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 2, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 15: { # 'ล' + 5: 2, # 'à¸' + 30: 3, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 3, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 2, # 'ฯ' + 22: 3, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 2, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 2, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 12: { # 'ว' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 3, # 'ิ' + 13: 2, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 2, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 42: { # 'ศ' + 5: 1, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 2, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 2, # 'ิ' + 13: 0, # 'ี' + 40: 3, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 2, # 'ู' + 11: 0, # 'เ' + 28: 1, # 'à¹' + 41: 0, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 46: { # 'ษ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 2, # 'ฎ' + 57: 1, # 'à¸' + 49: 2, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 0, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 2, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 18: { # 'ส' + 5: 2, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 3, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 2, # 'ภ' + 9: 3, # 'ม' + 16: 1, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 3, # 'ำ' + 23: 3, # 'ิ' + 13: 3, # 'ี' + 40: 2, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 3, # 'ู' + 11: 2, # 'เ' + 28: 0, # 'à¹' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 1, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 21: { # 'ห' + 5: 3, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 1, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 0, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 0, # 'ำ' + 23: 1, # 'ิ' + 13: 1, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 1, # 'ุ' + 35: 1, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 3, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 4: { # 'อ' + 5: 3, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 2, # 'ะ' + 10: 3, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 2, # 'ิ' + 13: 3, # 'ี' + 40: 0, # 'ึ' + 27: 3, # 'ื' + 32: 3, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 1, # '็' + 6: 2, # '่' + 7: 2, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 63: { # 'ฯ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 22: { # 'ะ' + 5: 3, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 1, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 10: { # 'ั' + 5: 3, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 3, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 2, # 'à¸' + 53: 0, # 'ฑ' + 55: 3, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 1: { # 'า' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 1, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 2, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 1, # 'à¸' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 3, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 3, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 36: { # 'ำ' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 1, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 23: { # 'ิ' + 5: 3, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 3, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'à¸' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 2, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 3, # 'ศ' + 46: 2, # 'ษ' + 18: 2, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 2, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 13: { # 'ี' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 1, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 2, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 40: { # 'ึ' + 5: 3, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 3, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 1, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 27: { # 'ื' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 32: { # 'ุ' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 3, # 'ค' + 8: 3, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 1, # 'ฒ' + 43: 3, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 2, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 1, # 'ภ' + 9: 3, # 'ม' + 16: 1, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 1, # 'ว' + 42: 1, # 'ศ' + 46: 2, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'à¹' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 2, # '้' + 38: 1, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 35: { # 'ู' + 5: 3, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 2, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 2, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 2, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 2, # 'น' + 17: 0, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 1, # 'à¹' + 41: 1, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 3, # '่' + 7: 3, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 11: { # 'เ' + 5: 3, # 'à¸' + 30: 3, # 'ข' + 24: 3, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 3, # 'ฉ' + 34: 3, # 'ช' + 51: 2, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 1, # 'ณ' + 20: 3, # 'ด' + 19: 3, # 'ต' + 44: 1, # 'ถ' + 14: 3, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 3, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'à¸' + 31: 3, # 'พ' + 54: 1, # 'ฟ' + 45: 3, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 3, # 'ว' + 42: 2, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 28: { # 'à¹' + 5: 3, # 'à¸' + 30: 2, # 'ข' + 24: 2, # 'ค' + 8: 1, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 3, # 'ต' + 44: 2, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 2, # 'ป' + 39: 3, # 'ผ' + 62: 0, # 'à¸' + 31: 2, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 41: { # 'โ' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 1, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 1, # 'ภ' + 9: 1, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 3, # 'ล' + 12: 0, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 0, # 'ห' + 4: 2, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 29: { # 'ใ' + 5: 2, # 'à¸' + 30: 0, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 3, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 3, # 'ส' + 21: 3, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 33: { # 'ไ' + 5: 1, # 'à¸' + 30: 2, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 3, # 'ด' + 19: 1, # 'ต' + 44: 0, # 'ถ' + 14: 3, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 1, # 'บ' + 25: 3, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 2, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 0, # 'ย' + 2: 3, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 2, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 50: { # 'ๆ' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 37: { # '็' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 2, # 'ง' + 26: 3, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 1, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 0, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 3, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 1, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 2, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 0, # 'ห' + 4: 1, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 1, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 6: { # '่' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 1, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 1, # 'ธ' + 3: 3, # 'น' + 17: 1, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 1, # 'à¸' + 31: 1, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 3, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 2, # 'ล' + 12: 3, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 1, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 1, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 3, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 1, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 7: { # '้' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 2, # 'ค' + 8: 3, # 'ง' + 26: 2, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 1, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 1, # 'ด' + 19: 2, # 'ต' + 44: 1, # 'ถ' + 14: 2, # 'ท' + 48: 0, # 'ธ' + 3: 3, # 'น' + 17: 2, # 'บ' + 25: 2, # 'ป' + 39: 2, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 3, # 'ม' + 16: 2, # 'ย' + 2: 2, # 'ร' + 61: 0, # 'ฤ' + 15: 1, # 'ล' + 12: 3, # 'ว' + 42: 1, # 'ศ' + 46: 0, # 'ษ' + 18: 2, # 'ส' + 21: 2, # 'ห' + 4: 3, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 3, # 'า' + 36: 2, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 2, # 'ใ' + 33: 2, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 38: { # '์' + 5: 2, # 'à¸' + 30: 1, # 'ข' + 24: 1, # 'ค' + 8: 0, # 'ง' + 26: 1, # 'จ' + 52: 0, # 'ฉ' + 34: 1, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 2, # 'ด' + 19: 1, # 'ต' + 44: 1, # 'ถ' + 14: 1, # 'ท' + 48: 0, # 'ธ' + 3: 1, # 'น' + 17: 1, # 'บ' + 25: 1, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 1, # 'พ' + 54: 1, # 'ฟ' + 45: 0, # 'ภ' + 9: 2, # 'ม' + 16: 0, # 'ย' + 2: 1, # 'ร' + 61: 1, # 'ฤ' + 15: 1, # 'ล' + 12: 1, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 1, # 'ส' + 21: 1, # 'ห' + 4: 2, # 'อ' + 63: 1, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 2, # 'เ' + 28: 2, # 'à¹' + 41: 1, # 'โ' + 29: 1, # 'ใ' + 33: 1, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 0, # '๑' + 59: 0, # '๒' + 60: 0, # '๕' + }, + 56: { # '๑' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 2, # '๑' + 59: 1, # '๒' + 60: 1, # '๕' + }, + 59: { # '๒' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 1, # '๑' + 59: 1, # '๒' + 60: 3, # '๕' + }, + 60: { # '๕' + 5: 0, # 'à¸' + 30: 0, # 'ข' + 24: 0, # 'ค' + 8: 0, # 'ง' + 26: 0, # 'จ' + 52: 0, # 'ฉ' + 34: 0, # 'ช' + 51: 0, # 'ซ' + 47: 0, # 'à¸' + 58: 0, # 'ฎ' + 57: 0, # 'à¸' + 49: 0, # 'à¸' + 53: 0, # 'ฑ' + 55: 0, # 'ฒ' + 43: 0, # 'ณ' + 20: 0, # 'ด' + 19: 0, # 'ต' + 44: 0, # 'ถ' + 14: 0, # 'ท' + 48: 0, # 'ธ' + 3: 0, # 'น' + 17: 0, # 'บ' + 25: 0, # 'ป' + 39: 0, # 'ผ' + 62: 0, # 'à¸' + 31: 0, # 'พ' + 54: 0, # 'ฟ' + 45: 0, # 'ภ' + 9: 0, # 'ม' + 16: 0, # 'ย' + 2: 0, # 'ร' + 61: 0, # 'ฤ' + 15: 0, # 'ล' + 12: 0, # 'ว' + 42: 0, # 'ศ' + 46: 0, # 'ษ' + 18: 0, # 'ส' + 21: 0, # 'ห' + 4: 0, # 'อ' + 63: 0, # 'ฯ' + 22: 0, # 'ะ' + 10: 0, # 'ั' + 1: 0, # 'า' + 36: 0, # 'ำ' + 23: 0, # 'ิ' + 13: 0, # 'ี' + 40: 0, # 'ึ' + 27: 0, # 'ื' + 32: 0, # 'ุ' + 35: 0, # 'ู' + 11: 0, # 'เ' + 28: 0, # 'à¹' + 41: 0, # 'โ' + 29: 0, # 'ใ' + 33: 0, # 'ไ' + 50: 0, # 'ๆ' + 37: 0, # '็' + 6: 0, # '่' + 7: 0, # '้' + 38: 0, # '์' + 56: 2, # '๑' + 59: 1, # '๒' + 60: 0, # '๕' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +TIS_620_THAI_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 254, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 254, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 253, # ' ' + 33: 253, # '!' + 34: 253, # '"' + 35: 253, # '#' + 36: 253, # '$' + 37: 253, # '%' + 38: 253, # '&' + 39: 253, # "'" + 40: 253, # '(' + 41: 253, # ')' + 42: 253, # '*' + 43: 253, # '+' + 44: 253, # ',' + 45: 253, # '-' + 46: 253, # '.' + 47: 253, # '/' + 48: 252, # '0' + 49: 252, # '1' + 50: 252, # '2' + 51: 252, # '3' + 52: 252, # '4' + 53: 252, # '5' + 54: 252, # '6' + 55: 252, # '7' + 56: 252, # '8' + 57: 252, # '9' + 58: 253, # ':' + 59: 253, # ';' + 60: 253, # '<' + 61: 253, # '=' + 62: 253, # '>' + 63: 253, # '?' + 64: 253, # '@' + 65: 182, # 'A' + 66: 106, # 'B' + 67: 107, # 'C' + 68: 100, # 'D' + 69: 183, # 'E' + 70: 184, # 'F' + 71: 185, # 'G' + 72: 101, # 'H' + 73: 94, # 'I' + 74: 186, # 'J' + 75: 187, # 'K' + 76: 108, # 'L' + 77: 109, # 'M' + 78: 110, # 'N' + 79: 111, # 'O' + 80: 188, # 'P' + 81: 189, # 'Q' + 82: 190, # 'R' + 83: 89, # 'S' + 84: 95, # 'T' + 85: 112, # 'U' + 86: 113, # 'V' + 87: 191, # 'W' + 88: 192, # 'X' + 89: 193, # 'Y' + 90: 194, # 'Z' + 91: 253, # '[' + 92: 253, # '\\' + 93: 253, # ']' + 94: 253, # '^' + 95: 253, # '_' + 96: 253, # '`' + 97: 64, # 'a' + 98: 72, # 'b' + 99: 73, # 'c' + 100: 114, # 'd' + 101: 74, # 'e' + 102: 115, # 'f' + 103: 116, # 'g' + 104: 102, # 'h' + 105: 81, # 'i' + 106: 201, # 'j' + 107: 117, # 'k' + 108: 90, # 'l' + 109: 103, # 'm' + 110: 78, # 'n' + 111: 82, # 'o' + 112: 96, # 'p' + 113: 202, # 'q' + 114: 91, # 'r' + 115: 79, # 's' + 116: 84, # 't' + 117: 104, # 'u' + 118: 105, # 'v' + 119: 97, # 'w' + 120: 98, # 'x' + 121: 92, # 'y' + 122: 203, # 'z' + 123: 253, # '{' + 124: 253, # '|' + 125: 253, # '}' + 126: 253, # '~' + 127: 253, # '\x7f' + 128: 209, # '\x80' + 129: 210, # '\x81' + 130: 211, # '\x82' + 131: 212, # '\x83' + 132: 213, # '\x84' + 133: 88, # '\x85' + 134: 214, # '\x86' + 135: 215, # '\x87' + 136: 216, # '\x88' + 137: 217, # '\x89' + 138: 218, # '\x8a' + 139: 219, # '\x8b' + 140: 220, # '\x8c' + 141: 118, # '\x8d' + 142: 221, # '\x8e' + 143: 222, # '\x8f' + 144: 223, # '\x90' + 145: 224, # '\x91' + 146: 99, # '\x92' + 147: 85, # '\x93' + 148: 83, # '\x94' + 149: 225, # '\x95' + 150: 226, # '\x96' + 151: 227, # '\x97' + 152: 228, # '\x98' + 153: 229, # '\x99' + 154: 230, # '\x9a' + 155: 231, # '\x9b' + 156: 232, # '\x9c' + 157: 233, # '\x9d' + 158: 234, # '\x9e' + 159: 235, # '\x9f' + 160: 236, # None + 161: 5, # 'à¸' + 162: 30, # 'ข' + 163: 237, # 'ฃ' + 164: 24, # 'ค' + 165: 238, # 'ฅ' + 166: 75, # 'ฆ' + 167: 8, # 'ง' + 168: 26, # 'จ' + 169: 52, # 'ฉ' + 170: 34, # 'ช' + 171: 51, # 'ซ' + 172: 119, # 'ฌ' + 173: 47, # 'à¸' + 174: 58, # 'ฎ' + 175: 57, # 'à¸' + 176: 49, # 'à¸' + 177: 53, # 'ฑ' + 178: 55, # 'ฒ' + 179: 43, # 'ณ' + 180: 20, # 'ด' + 181: 19, # 'ต' + 182: 44, # 'ถ' + 183: 14, # 'ท' + 184: 48, # 'ธ' + 185: 3, # 'น' + 186: 17, # 'บ' + 187: 25, # 'ป' + 188: 39, # 'ผ' + 189: 62, # 'à¸' + 190: 31, # 'พ' + 191: 54, # 'ฟ' + 192: 45, # 'ภ' + 193: 9, # 'ม' + 194: 16, # 'ย' + 195: 2, # 'ร' + 196: 61, # 'ฤ' + 197: 15, # 'ล' + 198: 239, # 'ฦ' + 199: 12, # 'ว' + 200: 42, # 'ศ' + 201: 46, # 'ษ' + 202: 18, # 'ส' + 203: 21, # 'ห' + 204: 76, # 'ฬ' + 205: 4, # 'อ' + 206: 66, # 'ฮ' + 207: 63, # 'ฯ' + 208: 22, # 'ะ' + 209: 10, # 'ั' + 210: 1, # 'า' + 211: 36, # 'ำ' + 212: 23, # 'ิ' + 213: 13, # 'ี' + 214: 40, # 'ึ' + 215: 27, # 'ื' + 216: 32, # 'ุ' + 217: 35, # 'ู' + 218: 86, # 'ฺ' + 219: 240, # None + 220: 241, # None + 221: 242, # None + 222: 243, # None + 223: 244, # '฿' + 224: 11, # 'เ' + 225: 28, # 'à¹' + 226: 41, # 'โ' + 227: 29, # 'ใ' + 228: 33, # 'ไ' + 229: 245, # 'ๅ' + 230: 50, # 'ๆ' + 231: 37, # '็' + 232: 6, # '่' + 233: 7, # '้' + 234: 67, # '๊' + 235: 77, # '๋' + 236: 38, # '์' + 237: 93, # 'à¹' + 238: 246, # '๎' + 239: 247, # 'à¹' + 240: 68, # 'à¹' + 241: 56, # '๑' + 242: 59, # '๒' + 243: 65, # '๓' + 244: 69, # '๔' + 245: 60, # '๕' + 246: 70, # '๖' + 247: 80, # '๗' + 248: 71, # '๘' + 249: 87, # '๙' + 250: 248, # '๚' + 251: 249, # '๛' + 252: 250, # None + 253: 251, # None + 254: 252, # None + 255: 253, # None +} + +TIS_620_THAI_MODEL = SingleByteCharSetModel(charset_name='TIS-620', + language='Thai', + char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER, + language_model=THAI_LANG_MODEL, + typical_positive_ratio=0.926386, + keep_ascii_letters=False, + alphabet='à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸¸à¸¹à¸ºà¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..43f4230 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,4383 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel + + +# 3: Positive +# 2: Likely +# 1: Unlikely +# 0: Negative + +TURKISH_LANG_MODEL = { + 23: { # 'A' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 37: { # 'B' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 47: { # 'C' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 39: { # 'D' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 29: { # 'E' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 52: { # 'F' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 1, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 2, # 'ÅŸ' + }, + 36: { # 'G' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 2, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 1, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 45: { # 'H' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 2, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 2, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ÄŸ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 53: { # 'I' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 60: { # 'J' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 16: { # 'K' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 1, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 49: { # 'L' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 2, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 20: { # 'M' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 0, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 46: { # 'N' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 42: { # 'O' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 2, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 48: { # 'P' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 44: { # 'R' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 35: { # 'S' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 1, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 2, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 31: { # 'T' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 2, # 't' + 14: 2, # 'u' + 32: 1, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 51: { # 'U' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 1, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 38: { # 'V' + 23: 1, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 2, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 1, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 62: { # 'W' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 43: { # 'Y' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 0, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 1, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 1, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 56: { # 'Z' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 1: { # 'a' + 23: 3, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 1, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 21: { # 'b' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 3, # 'g' + 25: 1, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 2, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 28: { # 'c' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 2, # 'T' + 51: 2, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 3, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 1, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 1, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 2, # 'ÄŸ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 2, # 'ÅŸ' + }, + 12: { # 'd' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 2: { # 'e' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 2, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 18: { # 'f' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 1, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 1, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 27: { # 'g' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 25: { # 'h' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 3: { # 'i' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 1, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 3, # 'g' + 25: 1, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 1, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 1, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 24: { # 'j' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 2, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 10: { # 'k' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 2, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 3, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 5: { # 'l' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 1, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 2, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 13: { # 'm' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 2, # 'u' + 32: 2, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 4: { # 'n' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 3, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 15: { # 'o' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 2, # 'L' + 20: 0, # 'M' + 46: 2, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ÄŸ' + 41: 2, # 'İ' + 6: 3, # 'ı' + 40: 2, # 'Åž' + 19: 2, # 'ÅŸ' + }, + 26: { # 'p' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 1, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 7: { # 'r' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 1, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 1, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 3, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 8: { # 's' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 2, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 9: { # 't' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 2, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 2, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 14: { # 'u' + 23: 3, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 2, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 3, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 2, # 'Z' + 1: 2, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 2, # 'e' + 18: 2, # 'f' + 27: 3, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 2, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 32: { # 'v' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 1, # 'k' + 5: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 57: { # 'w' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 1, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 1, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 2, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 58: { # 'x' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 2, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 11: { # 'y' + 23: 1, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 2, # 'r' + 8: 1, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 3, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 22: { # 'z' + 23: 2, # 'A' + 37: 2, # 'B' + 47: 1, # 'C' + 39: 2, # 'D' + 29: 3, # 'E' + 52: 1, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 2, # 'N' + 42: 2, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 3, # 'T' + 51: 2, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 1, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 2, # 'e' + 18: 3, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 3, # 'y' + 22: 2, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 2, # 'ÄŸ' + 41: 1, # 'İ' + 6: 3, # 'ı' + 40: 1, # 'Åž' + 19: 2, # 'ÅŸ' + }, + 63: { # '·' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 54: { # 'Ç' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 1, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 0, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 3, # 'i' + 24: 0, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 2, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 2, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 2, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 50: { # 'Ö' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 2, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 2, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 1, # 'N' + 42: 2, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 1, # 'f' + 27: 1, # 'g' + 25: 1, # 'h' + 3: 2, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 2, # 'p' + 7: 3, # 'r' + 8: 1, # 's' + 9: 2, # 't' + 14: 0, # 'u' + 32: 1, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 2, # 'ü' + 30: 1, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 55: { # 'Ü' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 1, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 1, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 1, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 1, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 1, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 0, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 59: { # 'â' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 0, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 2, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 2, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 33: { # 'ç' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 3, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 0, # 'Z' + 1: 0, # 'a' + 21: 3, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 2, # 'f' + 27: 1, # 'g' + 25: 3, # 'h' + 3: 3, # 'i' + 24: 0, # 'j' + 10: 3, # 'k' + 5: 0, # 'l' + 13: 0, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 3, # 't' + 14: 0, # 'u' + 32: 2, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 1, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 61: { # 'î' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 0, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 0, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 2, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 1, # 'j' + 10: 0, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 1, # 'n' + 15: 0, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 1, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 1, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 1, # 'î' + 34: 0, # 'ö' + 17: 0, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 1, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 34: { # 'ö' + 23: 0, # 'A' + 37: 1, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 1, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 1, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 2, # 'h' + 3: 1, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 2, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 0, # 'r' + 8: 3, # 's' + 9: 1, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 1, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 2, # 'ÄŸ' + 41: 1, # 'İ' + 6: 1, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 17: { # 'ü' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 0, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 1, # 'J' + 16: 1, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 0, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 0, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 0, # 'c' + 12: 1, # 'd' + 2: 3, # 'e' + 18: 1, # 'f' + 27: 2, # 'g' + 25: 0, # 'h' + 3: 1, # 'i' + 24: 1, # 'j' + 10: 2, # 'k' + 5: 3, # 'l' + 13: 2, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 2, # 'p' + 7: 2, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 3, # 'u' + 32: 1, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 2, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 30: { # 'ÄŸ' + 23: 0, # 'A' + 37: 2, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 1, # 'M' + 46: 2, # 'N' + 42: 2, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 0, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 2, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 0, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 2, # 'e' + 18: 0, # 'f' + 27: 0, # 'g' + 25: 0, # 'h' + 3: 0, # 'i' + 24: 3, # 'j' + 10: 1, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 1, # 'o' + 26: 0, # 'p' + 7: 1, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 2, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 2, # 'İ' + 6: 2, # 'ı' + 40: 2, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 41: { # 'İ' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 2, # 'G' + 45: 2, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 0, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 0, # 'Z' + 1: 1, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 2, # 'd' + 2: 1, # 'e' + 18: 0, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 2, # 'i' + 24: 2, # 'j' + 10: 2, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 1, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 2, # 't' + 14: 0, # 'u' + 32: 0, # 'v' + 57: 1, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 1, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 1, # 'ö' + 17: 1, # 'ü' + 30: 2, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 1, # 'ÅŸ' + }, + 6: { # 'ı' + 23: 2, # 'A' + 37: 0, # 'B' + 47: 0, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 2, # 'J' + 16: 3, # 'K' + 49: 0, # 'L' + 20: 3, # 'M' + 46: 1, # 'N' + 42: 0, # 'O' + 48: 0, # 'P' + 44: 0, # 'R' + 35: 0, # 'S' + 31: 2, # 'T' + 51: 0, # 'U' + 38: 0, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 3, # 'a' + 21: 2, # 'b' + 28: 1, # 'c' + 12: 3, # 'd' + 2: 3, # 'e' + 18: 3, # 'f' + 27: 3, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 3, # 'j' + 10: 3, # 'k' + 5: 3, # 'l' + 13: 3, # 'm' + 4: 3, # 'n' + 15: 0, # 'o' + 26: 3, # 'p' + 7: 3, # 'r' + 8: 3, # 's' + 9: 3, # 't' + 14: 3, # 'u' + 32: 3, # 'v' + 57: 1, # 'w' + 58: 1, # 'x' + 11: 3, # 'y' + 22: 0, # 'z' + 63: 1, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 2, # 'ç' + 61: 0, # 'î' + 34: 0, # 'ö' + 17: 3, # 'ü' + 30: 0, # 'ÄŸ' + 41: 0, # 'İ' + 6: 3, # 'ı' + 40: 0, # 'Åž' + 19: 0, # 'ÅŸ' + }, + 40: { # 'Åž' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 1, # 'D' + 29: 1, # 'E' + 52: 0, # 'F' + 36: 1, # 'G' + 45: 2, # 'H' + 53: 1, # 'I' + 60: 0, # 'J' + 16: 0, # 'K' + 49: 0, # 'L' + 20: 2, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 2, # 'P' + 44: 2, # 'R' + 35: 1, # 'S' + 31: 1, # 'T' + 51: 0, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 2, # 'Y' + 56: 1, # 'Z' + 1: 0, # 'a' + 21: 2, # 'b' + 28: 0, # 'c' + 12: 2, # 'd' + 2: 0, # 'e' + 18: 3, # 'f' + 27: 0, # 'g' + 25: 2, # 'h' + 3: 3, # 'i' + 24: 2, # 'j' + 10: 1, # 'k' + 5: 0, # 'l' + 13: 1, # 'm' + 4: 3, # 'n' + 15: 2, # 'o' + 26: 0, # 'p' + 7: 3, # 'r' + 8: 2, # 's' + 9: 2, # 't' + 14: 1, # 'u' + 32: 3, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 2, # 'y' + 22: 0, # 'z' + 63: 0, # '·' + 54: 0, # 'Ç' + 50: 0, # 'Ö' + 55: 1, # 'Ü' + 59: 0, # 'â' + 33: 0, # 'ç' + 61: 0, # 'î' + 34: 2, # 'ö' + 17: 1, # 'ü' + 30: 2, # 'ÄŸ' + 41: 0, # 'İ' + 6: 2, # 'ı' + 40: 1, # 'Åž' + 19: 2, # 'ÅŸ' + }, + 19: { # 'ÅŸ' + 23: 0, # 'A' + 37: 0, # 'B' + 47: 1, # 'C' + 39: 0, # 'D' + 29: 0, # 'E' + 52: 2, # 'F' + 36: 1, # 'G' + 45: 0, # 'H' + 53: 0, # 'I' + 60: 0, # 'J' + 16: 3, # 'K' + 49: 2, # 'L' + 20: 0, # 'M' + 46: 1, # 'N' + 42: 1, # 'O' + 48: 1, # 'P' + 44: 1, # 'R' + 35: 1, # 'S' + 31: 0, # 'T' + 51: 1, # 'U' + 38: 1, # 'V' + 62: 0, # 'W' + 43: 1, # 'Y' + 56: 0, # 'Z' + 1: 3, # 'a' + 21: 1, # 'b' + 28: 2, # 'c' + 12: 0, # 'd' + 2: 3, # 'e' + 18: 0, # 'f' + 27: 2, # 'g' + 25: 1, # 'h' + 3: 1, # 'i' + 24: 0, # 'j' + 10: 2, # 'k' + 5: 2, # 'l' + 13: 3, # 'm' + 4: 0, # 'n' + 15: 0, # 'o' + 26: 1, # 'p' + 7: 3, # 'r' + 8: 0, # 's' + 9: 0, # 't' + 14: 3, # 'u' + 32: 0, # 'v' + 57: 0, # 'w' + 58: 0, # 'x' + 11: 0, # 'y' + 22: 2, # 'z' + 63: 0, # '·' + 54: 1, # 'Ç' + 50: 2, # 'Ö' + 55: 0, # 'Ü' + 59: 0, # 'â' + 33: 1, # 'ç' + 61: 1, # 'î' + 34: 2, # 'ö' + 17: 0, # 'ü' + 30: 1, # 'ÄŸ' + 41: 1, # 'İ' + 6: 1, # 'ı' + 40: 1, # 'Åž' + 19: 1, # 'ÅŸ' + }, +} + +# 255: Undefined characters that did not exist in training text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 +# 251: Control characters + +# Character Mapping Table(s): +ISO_8859_9_TURKISH_CHAR_TO_ORDER = { + 0: 255, # '\x00' + 1: 255, # '\x01' + 2: 255, # '\x02' + 3: 255, # '\x03' + 4: 255, # '\x04' + 5: 255, # '\x05' + 6: 255, # '\x06' + 7: 255, # '\x07' + 8: 255, # '\x08' + 9: 255, # '\t' + 10: 255, # '\n' + 11: 255, # '\x0b' + 12: 255, # '\x0c' + 13: 255, # '\r' + 14: 255, # '\x0e' + 15: 255, # '\x0f' + 16: 255, # '\x10' + 17: 255, # '\x11' + 18: 255, # '\x12' + 19: 255, # '\x13' + 20: 255, # '\x14' + 21: 255, # '\x15' + 22: 255, # '\x16' + 23: 255, # '\x17' + 24: 255, # '\x18' + 25: 255, # '\x19' + 26: 255, # '\x1a' + 27: 255, # '\x1b' + 28: 255, # '\x1c' + 29: 255, # '\x1d' + 30: 255, # '\x1e' + 31: 255, # '\x1f' + 32: 255, # ' ' + 33: 255, # '!' + 34: 255, # '"' + 35: 255, # '#' + 36: 255, # '$' + 37: 255, # '%' + 38: 255, # '&' + 39: 255, # "'" + 40: 255, # '(' + 41: 255, # ')' + 42: 255, # '*' + 43: 255, # '+' + 44: 255, # ',' + 45: 255, # '-' + 46: 255, # '.' + 47: 255, # '/' + 48: 255, # '0' + 49: 255, # '1' + 50: 255, # '2' + 51: 255, # '3' + 52: 255, # '4' + 53: 255, # '5' + 54: 255, # '6' + 55: 255, # '7' + 56: 255, # '8' + 57: 255, # '9' + 58: 255, # ':' + 59: 255, # ';' + 60: 255, # '<' + 61: 255, # '=' + 62: 255, # '>' + 63: 255, # '?' + 64: 255, # '@' + 65: 23, # 'A' + 66: 37, # 'B' + 67: 47, # 'C' + 68: 39, # 'D' + 69: 29, # 'E' + 70: 52, # 'F' + 71: 36, # 'G' + 72: 45, # 'H' + 73: 53, # 'I' + 74: 60, # 'J' + 75: 16, # 'K' + 76: 49, # 'L' + 77: 20, # 'M' + 78: 46, # 'N' + 79: 42, # 'O' + 80: 48, # 'P' + 81: 69, # 'Q' + 82: 44, # 'R' + 83: 35, # 'S' + 84: 31, # 'T' + 85: 51, # 'U' + 86: 38, # 'V' + 87: 62, # 'W' + 88: 65, # 'X' + 89: 43, # 'Y' + 90: 56, # 'Z' + 91: 255, # '[' + 92: 255, # '\\' + 93: 255, # ']' + 94: 255, # '^' + 95: 255, # '_' + 96: 255, # '`' + 97: 1, # 'a' + 98: 21, # 'b' + 99: 28, # 'c' + 100: 12, # 'd' + 101: 2, # 'e' + 102: 18, # 'f' + 103: 27, # 'g' + 104: 25, # 'h' + 105: 3, # 'i' + 106: 24, # 'j' + 107: 10, # 'k' + 108: 5, # 'l' + 109: 13, # 'm' + 110: 4, # 'n' + 111: 15, # 'o' + 112: 26, # 'p' + 113: 64, # 'q' + 114: 7, # 'r' + 115: 8, # 's' + 116: 9, # 't' + 117: 14, # 'u' + 118: 32, # 'v' + 119: 57, # 'w' + 120: 58, # 'x' + 121: 11, # 'y' + 122: 22, # 'z' + 123: 255, # '{' + 124: 255, # '|' + 125: 255, # '}' + 126: 255, # '~' + 127: 255, # '\x7f' + 128: 180, # '\x80' + 129: 179, # '\x81' + 130: 178, # '\x82' + 131: 177, # '\x83' + 132: 176, # '\x84' + 133: 175, # '\x85' + 134: 174, # '\x86' + 135: 173, # '\x87' + 136: 172, # '\x88' + 137: 171, # '\x89' + 138: 170, # '\x8a' + 139: 169, # '\x8b' + 140: 168, # '\x8c' + 141: 167, # '\x8d' + 142: 166, # '\x8e' + 143: 165, # '\x8f' + 144: 164, # '\x90' + 145: 163, # '\x91' + 146: 162, # '\x92' + 147: 161, # '\x93' + 148: 160, # '\x94' + 149: 159, # '\x95' + 150: 101, # '\x96' + 151: 158, # '\x97' + 152: 157, # '\x98' + 153: 156, # '\x99' + 154: 155, # '\x9a' + 155: 154, # '\x9b' + 156: 153, # '\x9c' + 157: 152, # '\x9d' + 158: 151, # '\x9e' + 159: 106, # '\x9f' + 160: 150, # '\xa0' + 161: 149, # '¡' + 162: 148, # '¢' + 163: 147, # '£' + 164: 146, # '¤' + 165: 145, # 'Â¥' + 166: 144, # '¦' + 167: 100, # '§' + 168: 143, # '¨' + 169: 142, # '©' + 170: 141, # 'ª' + 171: 140, # '«' + 172: 139, # '¬' + 173: 138, # '\xad' + 174: 137, # '®' + 175: 136, # '¯' + 176: 94, # '°' + 177: 80, # '±' + 178: 93, # '²' + 179: 135, # '³' + 180: 105, # '´' + 181: 134, # 'µ' + 182: 133, # '¶' + 183: 63, # '·' + 184: 132, # '¸' + 185: 131, # '¹' + 186: 130, # 'º' + 187: 129, # '»' + 188: 128, # '¼' + 189: 127, # '½' + 190: 126, # '¾' + 191: 125, # '¿' + 192: 124, # 'À' + 193: 104, # 'Ã' + 194: 73, # 'Â' + 195: 99, # 'Ã' + 196: 79, # 'Ä' + 197: 85, # 'Ã…' + 198: 123, # 'Æ' + 199: 54, # 'Ç' + 200: 122, # 'È' + 201: 98, # 'É' + 202: 92, # 'Ê' + 203: 121, # 'Ë' + 204: 120, # 'ÃŒ' + 205: 91, # 'Ã' + 206: 103, # 'ÃŽ' + 207: 119, # 'Ã' + 208: 68, # 'Äž' + 209: 118, # 'Ñ' + 210: 117, # 'Ã’' + 211: 97, # 'Ó' + 212: 116, # 'Ô' + 213: 115, # 'Õ' + 214: 50, # 'Ö' + 215: 90, # '×' + 216: 114, # 'Ø' + 217: 113, # 'Ù' + 218: 112, # 'Ú' + 219: 111, # 'Û' + 220: 55, # 'Ü' + 221: 41, # 'İ' + 222: 40, # 'Åž' + 223: 86, # 'ß' + 224: 89, # 'à' + 225: 70, # 'á' + 226: 59, # 'â' + 227: 78, # 'ã' + 228: 71, # 'ä' + 229: 82, # 'Ã¥' + 230: 88, # 'æ' + 231: 33, # 'ç' + 232: 77, # 'è' + 233: 66, # 'é' + 234: 84, # 'ê' + 235: 83, # 'ë' + 236: 110, # 'ì' + 237: 75, # 'í' + 238: 61, # 'î' + 239: 96, # 'ï' + 240: 30, # 'ÄŸ' + 241: 67, # 'ñ' + 242: 109, # 'ò' + 243: 74, # 'ó' + 244: 87, # 'ô' + 245: 102, # 'õ' + 246: 34, # 'ö' + 247: 95, # '÷' + 248: 81, # 'ø' + 249: 108, # 'ù' + 250: 76, # 'ú' + 251: 72, # 'û' + 252: 17, # 'ü' + 253: 6, # 'ı' + 254: 19, # 'ÅŸ' + 255: 107, # 'ÿ' +} + +ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(charset_name='ISO-8859-9', + language='Turkish', + char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER, + language_model=TURKISH_LANG_MODEL, + typical_positive_ratio=0.97029, + keep_ascii_letters=True, + alphabet='ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş') + diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py rename to python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py new file mode 100644 index 0000000..3237d5a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/metadata/languages.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Metadata about languages used by our model training code for our +SingleByteCharSetProbers. Could be used for other things in the future. + +This code is based on the language metadata from the uchardet project. +""" +from __future__ import absolute_import, print_function + +from string import ascii_letters + + +# TODO: Add Ukranian (KOI8-U) + +class Language(object): + """Metadata about a language useful for training models + + :ivar name: The human name for the language, in English. + :type name: str + :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise, + or use another catalog as a last resort. + :type iso_code: str + :ivar use_ascii: Whether or not ASCII letters should be included in trained + models. + :type use_ascii: bool + :ivar charsets: The charsets we want to support and create data for. + :type charsets: list of str + :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is + `True`, you only need to add those not in the ASCII set. + :type alphabet: str + :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling + Wikipedia for training data. + :type wiki_start_pages: list of str + """ + def __init__(self, name=None, iso_code=None, use_ascii=True, charsets=None, + alphabet=None, wiki_start_pages=None): + super(Language, self).__init__() + self.name = name + self.iso_code = iso_code + self.use_ascii = use_ascii + self.charsets = charsets + if self.use_ascii: + if alphabet: + alphabet += ascii_letters + else: + alphabet = ascii_letters + elif not alphabet: + raise ValueError('Must supply alphabet if use_ascii is False') + self.alphabet = ''.join(sorted(set(alphabet))) if alphabet else None + self.wiki_start_pages = wiki_start_pages + + def __repr__(self): + return '{}({})'.format(self.__class__.__name__, + ', '.join('{}={!r}'.format(k, v) + for k, v in self.__dict__.items() + if not k.startswith('_'))) + + +LANGUAGES = {'Arabic': Language(name='Arabic', + iso_code='ar', + use_ascii=False, + # We only support encodings that use isolated + # forms, because the current recommendation is + # that the rendering system handles presentation + # forms. This means we purposefully skip IBM864. + charsets=['ISO-8859-6', 'WINDOWS-1256', + 'CP720', 'CP864'], + alphabet=u'ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـÙقكلمنهوىيًٌÙÙŽÙÙÙ‘', + wiki_start_pages=[u'Ø§Ù„ØµÙØ­Ø©_الرئيسية']), + 'Belarusian': Language(name='Belarusian', + iso_code='be', + use_ascii=False, + charsets=['ISO-8859-5', 'WINDOWS-1251', + 'IBM866', 'MacCyrillic'], + alphabet=(u'ÐБВГДЕÐЖЗІЙКЛМÐОПРСТУЎФХЦЧШЫЬЭЮЯ' + u'абвгдеёжзійклмнопрÑтуўфхцчшыьÑÑŽÑʼ'), + wiki_start_pages=[u'ГалоўнаÑ_Ñтаронка']), + 'Bulgarian': Language(name='Bulgarian', + iso_code='bg', + use_ascii=False, + charsets=['ISO-8859-5', 'WINDOWS-1251', + 'IBM855'], + alphabet=(u'ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЬЮЯ' + u'абвгдежзийклмнопрÑтуфхцчшщъьюÑ'), + wiki_start_pages=[u'Ðачална_Ñтраница']), + 'Czech': Language(name='Czech', + iso_code='cz', + use_ascii=True, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=u'áÄÄéěíňóřšťúůýžÃČĎÉĚÃŇÓŘŠŤÚŮÃŽ', + wiki_start_pages=[u'Hlavní_strana']), + 'Danish': Language(name='Danish', + iso_code='da', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'æøåÆØÅ', + wiki_start_pages=[u'Forside']), + 'German': Language(name='German', + iso_code='de', + use_ascii=True, + charsets=['ISO-8859-1', 'WINDOWS-1252'], + alphabet=u'äöüßÄÖÜ', + wiki_start_pages=[u'Wikipedia:Hauptseite']), + 'Greek': Language(name='Greek', + iso_code='el', + use_ascii=False, + charsets=['ISO-8859-7', 'WINDOWS-1253'], + alphabet=(u'αβγδεζηθικλμνξοπÏσςτυφχψωάέήίόÏÏŽ' + u'ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎÎ'), + wiki_start_pages=[u'ΠÏλη:ΚÏÏια']), + 'English': Language(name='English', + iso_code='en', + use_ascii=True, + charsets=['ISO-8859-1', 'WINDOWS-1252'], + wiki_start_pages=[u'Main_Page']), + 'Esperanto': Language(name='Esperanto', + iso_code='eo', + # Q, W, X, and Y not used at all + use_ascii=False, + charsets=['ISO-8859-3'], + alphabet=(u'abcĉdefgÄhÄ¥ijĵklmnoprsÅtuÅ­vz' + u'ABCĈDEFGÄœHĤIJÄ´KLMNOPRSÅœTUŬVZ'), + wiki_start_pages=[u'Vikipedio:ĈefpaÄo']), + 'Spanish': Language(name='Spanish', + iso_code='es', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'ñáéíóúüÑÃÉÃÓÚÜ', + wiki_start_pages=[u'Wikipedia:Portada']), + 'Estonian': Language(name='Estonian', + iso_code='et', + use_ascii=False, + charsets=['ISO-8859-4', 'ISO-8859-13', + 'WINDOWS-1257'], + # C, F, Å , Q, W, X, Y, Z, Ž are only for + # loanwords + alphabet=(u'ABDEGHIJKLMNOPRSTUVÕÄÖÜ' + u'abdeghijklmnoprstuvõäöü'), + wiki_start_pages=[u'Esileht']), + 'Finnish': Language(name='Finnish', + iso_code='fi', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'ÅÄÖŠŽåäöšž', + wiki_start_pages=[u'Wikipedia:Etusivu']), + 'French': Language(name='French', + iso_code='fr', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'œàâçèéîïùûêŒÀÂÇÈÉÎÃÙÛÊ', + wiki_start_pages=[u'Wikipédia:Accueil_principal', + u'BÅ“uf (animal)']), + 'Hebrew': Language(name='Hebrew', + iso_code='he', + use_ascii=False, + charsets=['ISO-8859-8', 'WINDOWS-1255'], + alphabet=u'×בגדהוזחטיךכל×מןנסעףפץצקרשתװױײ', + wiki_start_pages=[u'עמוד_ר×שי']), + 'Croatian': Language(name='Croatian', + iso_code='hr', + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=(u'abcÄćdÄ‘efghijklmnoprsÅ¡tuvzž' + u'ABCČĆDÄEFGHIJKLMNOPRSÅ TUVZŽ'), + wiki_start_pages=[u'Glavna_stranica']), + 'Hungarian': Language(name='Hungarian', + iso_code='hu', + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=(u'abcdefghijklmnoprstuvzáéíóöőúüű' + u'ABCDEFGHIJKLMNOPRSTUVZÃÉÃÓÖÅÚÜŰ'), + wiki_start_pages=[u'KezdÅ‘lap']), + 'Italian': Language(name='Italian', + iso_code='it', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'ÀÈÉÌÒÓÙàèéìòóù', + wiki_start_pages=[u'Pagina_principale']), + 'Lithuanian': Language(name='Lithuanian', + iso_code='lt', + use_ascii=False, + charsets=['ISO-8859-13', 'WINDOWS-1257', + 'ISO-8859-4'], + # Q, W, and X not used at all + alphabet=(u'AÄ„BCÄŒDEĘĖFGHIÄ®YJKLMNOPRSÅ TUŲŪVZŽ' + u'aÄ…bcÄdeęėfghiįyjklmnoprsÅ¡tuųūvzž'), + wiki_start_pages=[u'Pagrindinis_puslapis']), + 'Latvian': Language(name='Latvian', + iso_code='lv', + use_ascii=False, + charsets=['ISO-8859-13', 'WINDOWS-1257', + 'ISO-8859-4'], + # Q, W, X, Y are only for loanwords + alphabet=(u'AÄ€BCÄŒDEÄ’FGÄ¢HIĪJKĶLÄ»MNÅ…OPRSÅ TUŪVZŽ' + u'aÄbcÄdeÄ“fgÄ£hiÄ«jkÄ·lļmnņoprsÅ¡tuÅ«vzž'), + wiki_start_pages=[u'SÄkumlapa']), + 'Macedonian': Language(name='Macedonian', + iso_code='mk', + use_ascii=False, + charsets=['ISO-8859-5', 'WINDOWS-1251', + 'MacCyrillic', 'IBM855'], + alphabet=(u'ÐБВГДЃЕЖЗЅИЈКЛЉМÐЊОПРСТЌУФХЦЧÐШ' + u'абвгдѓежзѕијклљмнњопрÑтќуфхцчџш'), + wiki_start_pages=[u'Главна_Ñтраница']), + 'Dutch': Language(name='Dutch', + iso_code='nl', + use_ascii=True, + charsets=['ISO-8859-1', 'WINDOWS-1252'], + wiki_start_pages=[u'Hoofdpagina']), + 'Polish': Language(name='Polish', + iso_code='pl', + # Q and X are only used for foreign words. + use_ascii=False, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=(u'AÄ„BCĆDEĘFGHIJKLÅMNŃOÓPRSÅšTUWYZŹŻ' + u'aÄ…bcćdeÄ™fghijklÅ‚mnÅ„oóprsÅ›tuwyzźż'), + wiki_start_pages=[u'Wikipedia:Strona_główna']), + 'Portuguese': Language(name='Portuguese', + iso_code='pt', + use_ascii=True, + charsets=['ISO-8859-1', 'ISO-8859-15', + 'WINDOWS-1252'], + alphabet=u'ÃÂÃÀÇÉÊÃÓÔÕÚáâãàçéêíóôõú', + wiki_start_pages=[u'Wikipédia:Página_principal']), + 'Romanian': Language(name='Romanian', + iso_code='ro', + use_ascii=True, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=u'ăâîșțĂÂÎȘȚ', + wiki_start_pages=[u'Pagina_principală']), + 'Russian': Language(name='Russian', + iso_code='ru', + use_ascii=False, + charsets=['ISO-8859-5', 'WINDOWS-1251', + 'KOI8-R', 'MacCyrillic', 'IBM866', + 'IBM855'], + alphabet=(u'абвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ' + u'ÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ'), + wiki_start_pages=[u'ЗаглавнаÑ_Ñтраница']), + 'Slovak': Language(name='Slovak', + iso_code='sk', + use_ascii=True, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=u'áäÄÄéíĺľňóôŕšťúýžÃÄČĎÉÃĹĽŇÓÔŔŠŤÚÃŽ', + wiki_start_pages=[u'Hlavná_stránka']), + 'Slovene': Language(name='Slovene', + iso_code='sl', + # Q, W, X, Y are only used for foreign words. + use_ascii=False, + charsets=['ISO-8859-2', 'WINDOWS-1250'], + alphabet=(u'abcÄdefghijklmnoprsÅ¡tuvzž' + u'ABCÄŒDEFGHIJKLMNOPRSÅ TUVZŽ'), + wiki_start_pages=[u'Glavna_stran']), + # Serbian can be written in both Latin and Cyrillic, but there's no + # simple way to get the Latin alphabet pages from Wikipedia through + # the API, so for now we just support Cyrillic. + 'Serbian': Language(name='Serbian', + iso_code='sr', + alphabet=(u'ÐБВГДЂЕЖЗИЈКЛЉМÐЊОПРСТЋУФХЦЧÐШ' + u'абвгдђежзијклљмнњопрÑтћуфхцчџш'), + charsets=['ISO-8859-5', 'WINDOWS-1251', + 'MacCyrillic', 'IBM855'], + wiki_start_pages=[u'Главна_Ñтрана']), + 'Thai': Language(name='Thai', + iso_code='th', + use_ascii=False, + charsets=['ISO-8859-11', 'TIS-620', 'CP874'], + alphabet=u'à¸à¸‚ฃคฅฆงจฉชซฌà¸à¸Žà¸à¸à¸‘ฒณดตถทธนบปผà¸à¸žà¸Ÿà¸ à¸¡à¸¢à¸£à¸¤à¸¥à¸¦à¸§à¸¨à¸©à¸ªà¸«à¸¬à¸­à¸®à¸¯à¸°à¸±à¸²à¸³à¸´à¸µà¸¶à¸·à¸ºà¸¸à¸¹à¸¿à¹€à¹à¹‚ใไๅๆ็่้๊๋์à¹à¹Žà¹à¹à¹‘๒๓๔๕๖๗๘๙๚๛', + wiki_start_pages=[u'หน้าหลัà¸']), + 'Turkish': Language(name='Turkish', + iso_code='tr', + # Q, W, and X are not used by Turkish + use_ascii=False, + charsets=['ISO-8859-3', 'ISO-8859-9', + 'WINDOWS-1254'], + alphabet=(u'abcçdefgÄŸhıijklmnoöprsÅŸtuüvyzâîû' + u'ABCÇDEFGÄžHIİJKLMNOÖPRSÅžTUÜVYZÂÎÛ'), + wiki_start_pages=[u'Ana_Sayfa']), + 'Vietnamese': Language(name='Vietnamese', + iso_code='vi', + use_ascii=False, + # Windows-1258 is the only common 8-bit + # Vietnamese encoding supported by Python. + # From Wikipedia: + # For systems that lack support for Unicode, + # dozens of 8-bit Vietnamese code pages are + # available.[1] The most common are VISCII + # (TCVN 5712:1993), VPS, and Windows-1258.[3] + # Where ASCII is required, such as when + # ensuring readability in plain text e-mail, + # Vietnamese letters are often encoded + # according to Vietnamese Quoted-Readable + # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4] + # though usage of either variable-width + # scheme has declined dramatically following + # the adoption of Unicode on the World Wide + # Web. + charsets=['WINDOWS-1258'], + alphabet=(u'aăâbcdÄ‘eêghiklmnoôơpqrstuưvxy' + u'AĂÂBCDÄEÊGHIKLMNOÔƠPQRSTUƯVXY'), + wiki_start_pages=[u'Chữ_Quốc_ngữ']), + } diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..46ba835 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcharsetprober.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 collections import namedtuple + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +SingleByteCharSetModel = namedtuple('SingleByteCharSetModel', + ['charset_name', + 'language', + 'char_to_order_map', + 'language_model', + 'typical_positive_ratio', + 'keep_ascii_letters', + 'alphabet']) + + +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.language + + def feed(self, byte_str): + # TODO: Make filter_international_words keep things in self.alphabet + if not self._model.keep_ascii_letters: + 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 + language_model = self._model.language_model + for char in byte_str: + order = char_to_order_map.get(char, CharacterCategory.UNDEFINED) + # 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 + # TODO: Follow uchardet's lead and discount confidence for frequent + # control characters. + # See https://github.com/BYVoid/uchardet/commit/55b4f23971db61 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + lm_cat = language_model[self._last_order][order] + else: + lm_cat = language_model[order][self._last_order] + self._seq_counters[lm_cat] += 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/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..bdeef4e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,83 @@ +######################## 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 .hebrewprober import HebrewProber +from .langbulgarianmodel import (ISO_8859_5_BULGARIAN_MODEL, + WINDOWS_1251_BULGARIAN_MODEL) +from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL +from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL +# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL, +# WINDOWS_1250_HUNGARIAN_MODEL) +from .langrussianmodel import (IBM855_RUSSIAN_MODEL, IBM866_RUSSIAN_MODEL, + ISO_8859_5_RUSSIAN_MODEL, KOI8_R_RUSSIAN_MODEL, + MACCYRILLIC_RUSSIAN_MODEL, + WINDOWS_1251_RUSSIAN_MODEL) +from .langthaimodel import TIS_620_THAI_MODEL +from .langturkishmodel import ISO_8859_9_TURKISH_MODEL +from .sbcharsetprober import SingleByteCharSetProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL, + False, hebrew_prober) + # TODO: See if using ISO-8859-8 Hebrew model works better here, since + # it's actually the visual one + visual_hebrew_prober = SingleByteCharSetProber(WINDOWS_1255_HEBREW_MODEL, + True, hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, + visual_hebrew_prober) + # TODO: ORDER MATTERS HERE. I changed the order vs what was in master + # and several tests failed that did not before. Some thought + # should be put into the ordering, and we should consider making + # order not matter here, because that is very counter-intuitive. + self.probers = [ + SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL), + SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL), + SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL), + SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL), + SingleByteCharSetProber(IBM866_RUSSIAN_MODEL), + SingleByteCharSetProber(IBM855_RUSSIAN_MODEL), + SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL), + SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL), + SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL), + SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL), + # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL), + SingleByteCharSetProber(TIS_620_THAI_MODEL), + SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL), + hebrew_prober, + logical_hebrew_prober, + visual_hebrew_prober, + ] + self.reset() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..055a8ac --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() <= logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + group_prober.charset_name, + group_prober.language, + group_prober.get_confidence()) + return self.result diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/python/lib/python3.10/site-packages/pip/_vendor/chardet/version.py b/python/lib/python3.10/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..70369b9 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "4.0.0" +VERSION = __version__.split('.') diff --git a/python/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..b149ed7 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.4' diff --git a/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/ansi.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py rename to python/lib/python3.10/site-packages/pip/_vendor/colorama/ansi.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..6039a05 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,258 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command == BEL: + if paramstring.count(";") == 1: + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/initialise.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py rename to python/lib/python3.10/site-packages/pip/_vendor/colorama/initialise.py diff --git a/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/win32.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/colorama/win32.py rename to python/lib/python3.10/site-packages/pip/_vendor/colorama/win32.py diff --git a/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py b/python/lib/python3.10/site-packages/pip/_vendor/colorama/winterm.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py rename to python/lib/python3.10/site-packages/pip/_vendor/colorama/winterm.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..6878387 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2019 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.4' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/compat.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/database.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..f486994 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1345 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + try: + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + except Exception as e: + msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s' + logger.warning(msg, r.path, e) + import warnings + warnings.warn(msg % (r.path, e), stacklevel=2) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find(LEGACY_METADATA_FILENAME) + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/index.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..b1fbbf8 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,509 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from .util import _get_pypirc_command as cmd + return cmd() + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils. This populates + ``username``, ``password``, ``realm`` and ``url`` attributes from the + configuration. + """ + from .util import _load_pypirc + cfg = _load_pypirc(self) + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + """ + self.check_credentials() + from .util import _store_pypirc + _store_pypirc(self) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..c78bc9e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1300 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, ensure_slash, split_filename, get_project_data, + parse_requirement, parse_name_and_version, ServerProxy, + normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + pass # logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + # else: + # logger.debug('skipping pre-release ' + # 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(b)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.daemon = True + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/manifest.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/manifest.py diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/markers.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/markers.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/markers.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..6a26b0a --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1058 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +# Ditto for Obsoletes - see issue #140. +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides', 'Obsoletes') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + # avoid adding field names if already there + return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS) + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +# This follows the rules about transforming keys as described in +# https://www.python.org/dev/peps/pep-0566/#id17 +_ATTR2FIELD = { + name.lower().replace("-", "_"): name for name in _ALL_FIELDS +} +_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + + # PEP 566 specifies that the body be used for the description, if + # available + body = msg.get_payload() + self["Description"] = body if body else self["Description"] + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + This is as per https://www.python.org/dev/peps/pep-0566/#id17. + """ + self.set_metadata_version() + + fields = _version2fieldlist(self['Metadata-Version']) + + data = {} + + for field_name in fields: + if not skip_missing or field_name in self._fields: + key = _FIELD2ATTR[field_name] + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + ('extensions', 'python.details', 'license'): 'License', + 'summary': 'Summary', + 'description': 'Description', + ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', + ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', + ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', + 'source_url': 'Download-URL', + ('extensions', 'python.details', 'classifiers'): 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + # import pdb; pdb.set_trace() + for nk, ok in self.LEGACY_MAPPING.items(): + if not isinstance(nk, tuple): + if nk in nmd: + result[ok] = nmd[nk] + else: + d = nmd + found = True + for k in nk: + try: + d = d[k] + except (KeyError, IndexError): + found = False + break + if found: + result[ok] = d + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: any other fields wanted + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/resources.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..913912c --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,429 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, get_platform, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + +# Keep the old name around (for now), as there is at least one project using it! +_enquote_executable = enquote_executable + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + self.version_info = sys.version_info + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if not os.path.isfile(executable): + # for Python builds from source on Windows, no Python executables with + # a version suffix are created, so we use python.exe + executable = os.path.join(sysconfig.get_config_var('BINDIR'), + 'python%s' % (sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + variant_separator = '-' + + def get_script_filenames(self, name): + result = set() + if '' in self.variants: + result.add(name) + if 'X' in self.variants: + result.add('%s%s' % (name, self.version_info[0])) + if 'X.Y' in self.variants: + result.add('%s%s%s.%s' % (name, self.variant_separator, + self.version_info[0], self.version_info[1])) + return result + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + scriptnames = self.get_script_filenames(entry.name) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s is an empty file (skipping)', script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + platform_suffix = '-arm' if get_platform() == 'win-arm64' else '' + name = '%s%s%s.exe' % (kind, bits, platform_suffix) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/util.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/util.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/util.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/util.py diff --git a/lib/python3.11/site-packages/pip/_vendor/distlib/version.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/version.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/distlib/version.py rename to python/lib/python3.10/site-packages/pip/_vendor/distlib/version.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py b/python/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..48abfde --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,1053 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2020 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir, + get_platform) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp').split('-')[0] +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # if file_version < (1, 1): + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, + # LEGACY_METADATA_FILENAME] + # else: + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy, as mutated + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # sort the entries by archive path. Not needed by any spec, but it + # keeps the archive listing and RECORD tidier than they would otherwise + # be. Use the number of path segments to keep directory entries together, + # and keep the dist-info stuff at the end. + def sorter(t): + ap = t[0] + n = ap.count('/') + if '.dist-info' in ap: + n += 10000 + return (n, ap) + archive_paths = sorted(archive_paths, key=sorter) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + # Issue #147: permission bits aren't preserved. Using + # zf.extract(zinfo, libdir) should have worked, but didn't, + # see https://www.thetopsites.net/article/53834422.shtml + # So ... manually preserve permission bits as given in zinfo + if os.name == 'posix': + # just set the normal permission bits + os.chmod(outfile, (zinfo.external_attr >> 16) & 0x1FF) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' [%s]' % ','.join(v.flags) + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = path.endswith(LEGACY_METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def _get_glibc_version(): + import platform + ver = platform.libc_ver() + result = [] + if ver[0] == 'glibc': + for s in ver[1].split('.'): + result.append(int(s) if s.isdigit() else 0) + result = tuple(result) + return result + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + # manylinux + if abi != 'none' and sys.platform.startswith('linux'): + arch = arch.replace('linux_', '') + parts = _get_glibc_version() + if len(parts) == 2: + if parts >= (2, 5): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux1_%s' % arch)) + if parts >= (2, 12): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux2010_%s' % arch)) + if parts >= (2, 17): + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux2014_%s' % arch)) + result.append((''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux_%s_%s_%s' % (parts[0], parts[1], + arch))) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/python/lib/python3.10/site-packages/pip/_vendor/distro.py b/python/lib/python3.10/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..7892741 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1386 @@ +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 removed it altogether. Its +predecessor function :py:func:`platform.dist` was already deprecated since +Python 2.6 and removed in Python 3.8. Still, there are many cases in which +access to OS distribution information is needed. See `Python issue 1322 +`_ for more information. +""" + +import argparse +import json +import logging +import os +import re +import shlex +import subprocess +import sys +import warnings + +__version__ = "1.6.0" + +# Use `if False` to avoid an ImportError on Python 2. After dropping Python 2 +# support, can use typing.TYPE_CHECKING instead. See: +# https://docs.python.org/3/library/typing.html#typing.TYPE_CHECKING +if False: # pragma: nocover + from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + TextIO, + Tuple, + Type, + TypedDict, + Union, + ) + + VersionDict = TypedDict( + "VersionDict", {"major": str, "minor": str, "build_number": str} + ) + InfoDict = TypedDict( + "InfoDict", + { + "id": str, + "version": str, + "version_parts": VersionDict, + "like": str, + "codename": str, + }, + ) + + +_UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") +_UNIXUSRLIBDIR = os.environ.get("UNIXUSRLIBDIR", "/usr/lib") +_OS_RELEASE_BASENAME = "os-release" + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + "ol": "oracle", # Oracle Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + "enterpriseenterpriseas": "oracle", # Oracle Enterprise Linux 4 + "enterpriseenterpriseserver": "oracle", # Oracle Linux 5 + "redhatenterpriseworkstation": "rhel", # RHEL 6, 7 Workstation + "redhatenterpriseserver": "rhel", # RHEL 6, 7 Server + "redhatenterprisecomputenode": "rhel", # RHEL 6 ComputeNode +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + "redhat": "rhel", # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r"(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)" +) + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + "debian_version", + "lsb-release", + "oem-release", + _OS_RELEASE_BASENAME, + "system-release", + "plesk-release", + "iredmail-release", +) + + +def linux_distribution(full_distribution_name=True): + # type: (bool) -> Tuple[str, str, str] + """ + .. deprecated:: 1.6.0 + + :func:`distro.linux_distribution()` is deprecated. It should only be + used as a compatibility shim with Python's + :py:func:`platform.linux_distribution()`. Please use :func:`distro.id`, + :func:`distro.version` and :func:`distro.name` instead. + + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + warnings.warn( + "distro.linux_distribution() is deprecated. It should only be used as a " + "compatibility shim with Python's platform.linux_distribution(). Please use " + "distro.id(), distro.version() and distro.name() instead.", + DeprecationWarning, + stacklevel=2, + ) + return _distro.linux_distribution(full_distribution_name) + + +def id(): + # type: () -> str + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + "midnightbsd" MidnightBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + # type: (bool) -> str + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + # type: (bool, bool) -> str + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + # type: (bool) -> Tuple[str, str, str] + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + # type: (bool) -> str + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + # type: (bool) -> str + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + # type: (bool) -> str + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + # type: () -> str + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + # type: () -> str + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + # type: (bool, bool) -> InfoDict + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + # type: (str) -> str + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + # type: (str) -> str + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + # type: (str) -> str + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + # type: (str) -> str + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +try: + from functools import cached_property +except ImportError: + # Python < 3.8 + class cached_property(object): # type: ignore + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + + def __init__(self, f): + # type: (Callable[[Any], Any]) -> None + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + # type: (Any, Type[Any]) -> Any + assert obj is not None, "call {} on an instance".format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__( + self, + include_lsb=True, + os_release_file="", + distro_release_file="", + include_uname=True, + root_dir=None, + ): + # type: (bool, str, str, bool, Optional[str]) -> None + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_uname`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + * ``root_dir`` (string): The absolute path to the root directory to use + to find distro-related information files. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.root_dir = root_dir + self.etc_dir = os.path.join(root_dir, "etc") if root_dir else _UNIXCONFDIR + self.usr_lib_dir = ( + os.path.join(root_dir, "usr/lib") if root_dir else _UNIXUSRLIBDIR + ) + + if os_release_file: + self.os_release_file = os_release_file + else: + etc_dir_os_release_file = os.path.join(self.etc_dir, _OS_RELEASE_BASENAME) + usr_lib_os_release_file = os.path.join( + self.usr_lib_dir, _OS_RELEASE_BASENAME + ) + + # NOTE: The idea is to respect order **and** have it set + # at all times for API backwards compatibility. + if os.path.isfile(etc_dir_os_release_file) or not os.path.isfile( + usr_lib_os_release_file + ): + self.os_release_file = etc_dir_os_release_file + else: + self.os_release_file = usr_lib_os_release_file + + self.distro_release_file = distro_release_file or "" # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + # type: () -> str + """Return repr of all info""" + return ( + "LinuxDistribution(" + "os_release_file={self.os_release_file!r}, " + "distro_release_file={self.distro_release_file!r}, " + "include_lsb={self.include_lsb!r}, " + "include_uname={self.include_uname!r}, " + "_os_release_info={self._os_release_info!r}, " + "_lsb_release_info={self._lsb_release_info!r}, " + "_distro_release_info={self._distro_release_info!r}, " + "_uname_info={self._uname_info!r})".format(self=self) + ) + + def linux_distribution(self, full_distribution_name=True): + # type: (bool) -> Tuple[str, str, str] + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename(), + ) + + def id(self): + # type: () -> str + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + + def normalize(distro_id, table): + # type: (str, Dict[str, str]) -> str + distro_id = distro_id.lower().replace(" ", "_") + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr("distributor_id") + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return "" + + def name(self, pretty=False): + # type: (bool) -> str + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = ( + self.os_release_attr("name") + or self.lsb_release_attr("distributor_id") + or self.distro_release_attr("name") + or self.uname_attr("name") + ) + if pretty: + name = self.os_release_attr("pretty_name") or self.lsb_release_attr( + "description" + ) + if not name: + name = self.distro_release_attr("name") or self.uname_attr("name") + version = self.version(pretty=True) + if version: + name = name + " " + version + return name or "" + + def version(self, pretty=False, best=False): + # type: (bool, bool) -> str + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr("version_id"), + self.lsb_release_attr("release"), + self.distro_release_attr("version_id"), + self._parse_distro_release_content(self.os_release_attr("pretty_name")).get( + "version_id", "" + ), + self._parse_distro_release_content( + self.lsb_release_attr("description") + ).get("version_id", ""), + self.uname_attr("release"), + ] + version = "" + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == "": + version = v + else: + for v in versions: + if v != "": + version = v + break + if pretty and version and self.codename(): + version = "{0} ({1})".format(version, self.codename()) + return version + + def version_parts(self, best=False): + # type: (bool) -> Tuple[str, str, str] + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r"(\d+)\.?(\d+)?\.?(\d+)?") + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or "", build_number or "" + return "", "", "" + + def major_version(self, best=False): + # type: (bool) -> str + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + # type: (bool) -> str + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + # type: (bool) -> str + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + # type: () -> str + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr("id_like") or "" + + def codename(self): + # type: () -> str + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info["codename"] + except KeyError: + return ( + self.lsb_release_attr("codename") + or self.distro_release_attr("codename") + or "" + ) + + def info(self, pretty=False, best=False): + # type: (bool, bool) -> InfoDict + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best), + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + # type: () -> Dict[str, str] + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + # type: (str) -> str + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, "") + + def lsb_release_attr(self, attribute): + # type: (str) -> str + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, "") + + def distro_release_attr(self, attribute): + # type: (str) -> str + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, "") + + def uname_attr(self, attribute): + # type: (str) -> str + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_attr`. + """ + return self._uname_info.get(attribute, "") + + @cached_property + def _os_release_info(self): + # type: () -> Dict[str, str] + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + # type: (TextIO) -> Dict[str, str] + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode("iso-8859-1") + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if "=" in token: + k, v = token.split("=", 1) + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if "version_codename" in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props["codename"] = props["version_codename"] + elif "ubuntu_codename" in props: + # Same as above but a non-standard field name used on older Ubuntus + props["codename"] = props["ubuntu_codename"] + elif "version" in props: + # If there is no version_codename, parse it from the version + match = re.search(r"(\(\D+\))|,(\s+)?\D+", props["version"]) + if match: + codename = match.group() + codename = codename.strip("()") + codename = codename.strip(",") + codename = codename.strip() + # codename appears within paranthese. + props["codename"] = codename + + return props + + @cached_property + def _lsb_release_info(self): + # type: () -> Dict[str, str] + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, "wb") as devnull: + try: + cmd = ("lsb_release", "-a") + stdout = subprocess.check_output(cmd, stderr=devnull) + # Command not found or lsb_release returned error + except (OSError, subprocess.CalledProcessError): + return {} + content = self._to_str(stdout).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + # type: (Iterable[str]) -> Dict[str, str] + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip("\n").split(":", 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(" ", "_").lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + # type: () -> Dict[str, str] + with open(os.devnull, "wb") as devnull: + try: + cmd = ("uname", "-rs") + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = self._to_str(stdout).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + # type: (Sequence[str]) -> Dict[str, str] + props = {} + match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == "Linux": + return {} + props["id"] = name.lower() + props["name"] = name + props["release"] = version + return props + + @staticmethod + def _to_str(text): + # type: (Union[bytes, str]) -> str + encoding = sys.getfilesystemencoding() + encoding = "utf-8" if encoding == "ascii" else encoding + + if sys.version_info[0] >= 3: + if isinstance(text, bytes): + return text.decode(encoding) + else: + if isinstance(text, unicode): # noqa + return text.encode(encoding) + + return text + + @cached_property + def _distro_release_info(self): + # type: () -> Dict[str, str] + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file(self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if "name" in distro_info and "cloudlinux" in distro_info["name"].lower(): + distro_info["id"] = "cloudlinux" + elif match: + distro_info["id"] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(self.etc_dir) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = [ + "SuSE-release", + "arch-release", + "base-release", + "centos-release", + "fedora-release", + "gentoo-release", + "mageia-release", + "mandrake-release", + "mandriva-release", + "mandrivalinux-release", + "manjaro-release", + "oracle-release", + "redhat-release", + "sl-release", + "slackware-version", + ] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(self.etc_dir, basename) + distro_info = self._parse_distro_release_file(filepath) + if "name" in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info["id"] = match.group(1) + if "cloudlinux" in distro_info["name"].lower(): + distro_info["id"] = "cloudlinux" + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + # type: (str) -> Dict[str, str] + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/python-distro/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + # type: (str) -> Dict[str, str] + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info["name"] = matches.group(3)[::-1] + if matches.group(2): + distro_info["version_id"] = matches.group(2)[::-1] + if matches.group(1): + distro_info["codename"] = matches.group(1)[::-1] + elif line: + distro_info["name"] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + # type: () -> None + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + "--json", "-j", help="Output in machine readable format", action="store_true" + ) + + parser.add_argument( + "--root-dir", + "-r", + type=str, + dest="root_dir", + help="Path to the root filesystem directory (defaults to /)", + ) + + args = parser.parse_args() + + if args.root_dir: + dist = LinuxDistribution( + include_lsb=False, include_uname=False, root_dir=args.root_dir + ) + else: + dist = _distro + + if args.json: + logger.info(json.dumps(dist.info(), indent=4, sort_keys=True)) + else: + logger.info("Name: %s", dist.name(pretty=True)) + distribution_version = dist.version(pretty=True) + logger.info("Version: %s", distribution_version) + distribution_codename = dist.codename() + logger.info("Codename: %s", distribution_codename) + + +if __name__ == "__main__": + main() diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..d1d82f1 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.1" diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_ihatexml.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..3ff803c --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,289 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_inputstream.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..e0bb376 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,918 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re +from io import BytesIO, StringIO + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = {0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF} + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not EOF: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except Exception: + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overridden, we've been overridden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + rv = self.startswith(bytes, self.position) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + try: + self._position = self.index(bytes, self.position) + len(bytes) - 1 + except ValueError: + raise StopIteration + return True + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + if b"") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have ") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, bytes): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_tokenizer.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..5f00253 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1735 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque, OrderedDict +from sys import version_info + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + +if version_info >= (3, 7): + attributeMap = dict +else: + attributeMap = OrderedDict + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + data = attributeMap(raw) + if len(raw) > len(data): + # we had some duplicated attribute, fix so first wins + data.update(raw[::-1]) + token["data"] = data + + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": ""))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..07bad5d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie + +__all__ = ["Trie"] diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/_base.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..6b71975 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,40 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + from collections.abc import Mapping +except ImportError: # Python 2.7 + from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/py.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_utils.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..d7c4926 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,159 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +try: + from collections.abc import Mapping +except ImportError: + from collections import Mapping + +from pip._vendor.six import text_type, PY3 + +if PY3: + import xml.etree.ElementTree as default_etree +else: + try: + import xml.etree.cElementTree as default_etree + except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except Exception: + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + def __get__(self, instance, owner=None): + return BoundMethodDispatcher(instance, self) + + +class BoundMethodDispatcher(Mapping): + """Wraps a MethodDispatcher, binding its return values to `instance`""" + def __init__(self, instance, dispatcher): + self.instance = instance + self.dispatcher = dispatcher + + def __getitem__(self, key): + # see https://docs.python.org/3/reference/datamodel.html#object.__get__ + # on a function, __get__ is used to bind a function to an instance as a bound method + return self.dispatcher[key].__get__(self.instance) + + def get(self, key, default): + if key in self.dispatcher: + return self[key] + else: + return default + + def __iter__(self): + return iter(self.dispatcher) + + def __len__(self): + return len(self.dispatcher) + + def __contains__(self, key): + return key in self.dispatcher + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/constants.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..fe3e237 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2946 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring ''.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = {(ns, local): qname for qname, (prefix, local, ns) in + adjustForeignAttributes.items()} + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = {ord(c): ord(c.lower()) for c in string.ascii_uppercase} + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = {v: k for k, v in namespaces.items()} +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__init__.py similarity index 100% rename from lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py rename to python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/__init__.py diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/base.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ```` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/lint.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an optgroup + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..aa7431d --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,916 @@ +"""Deprecated from html5lib 1.1. + +See `here `_ for +information about its deprecation; `Bleach `_ +is recommended as a replacement. Please let us know in the aforementioned issue +if Bleach is unsuitable for your needs. + +""" +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +_deprecation_msg = ( + "html5lib's sanitizer is deprecated; see " + + "https://github.com/html5lib/html5lib-python/issues/443 and please let " + + "us know if Bleach is unsuitable for your needs" +) + +warnings.warn(_deprecation_msg, DeprecationWarning) + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type / + (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + + warnings.warn(_deprecation_msg, DeprecationWarning) + + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/python/lib/python3.10/site-packages/pip/_vendor/html5lib/html5parser.py b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..d06784f --- /dev/null +++ b/python/lib/python3.10/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2795 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

      This is a doc

      ') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = {name: cls(self, self.tree) for name, cls in + getPhases(debug).items()} + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.tokenizer: + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

      This is a doc

      ') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = {value: key for key, value in tokenTypes.items()} + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + info = {"type": type_names[token['type']]} + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache") + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + self.__startTagCache = {} + self.__endTagCache = {} + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__startTagCache: + func = self.__startTagCache[name] + else: + func = self.__startTagCache[name] = self.startTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__startTagCache) > len(self.startTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__startTagCache.pop(next(iter(self.__startTagCache))) + return func(token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__endTagCache: + func = self.__endTagCache[name] + else: + func = self.__endTagCache[name] = self.endTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__endTagCache) > len(self.endTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__endTagCache.pop(next(iter(self.__endTagCache))) + return func(token) + + class InitialPhase(Phase): + __slots__ = tuple() + + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + __slots__ = tuple() + + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), endTagImplyHead) + ]) + endTagHandler.default = endTagOther + + class InHeadPhase(Phase): + __slots__ = tuple() + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("title", startTagTitle), + (("noframes", "style"), startTagNoFramesStyle), + ("noscript", startTagNoscript), + ("script", startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + startTagBaseLinkCommand), + ("meta", startTagMeta), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("head", endTagHead), + (("br", "html", "body"), endTagHtmlBodyBr) + ]) + endTagHandler.default = endTagOther + + class InHeadNoscriptPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), startTagBaseLinkCommand), + (("head", "noscript"), startTagHeadNoscript), + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("noscript", endTagNoscript), + ("br", endTagBr), + ]) + endTagHandler.default = endTagOther + + class AfterHeadPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("body", startTagBody), + ("frameset", startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + startTagFromHead), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + endTagHtmlBodyBr)]) + endTagHandler.default = endTagOther + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + __slots__ = ("processSpaceCharacters",) + + def __init__(self, *args, **kwargs): + super(InBodyPhase, self).__init__(*args, **kwargs) + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
      , , and ', contains_pattern=r'\[(?s:.+)\]')
      +        metainfo = {
      +            'title': self._og_search_property('title', webpage, 'title', fatal=False),
      +            'description': self._html_search_regex(
      +                (rf']+\bid="album-desc-{suffix}"[^>]*>(.*?)' for suffix in ('more', 'dot')),
      +                webpage, 'description', flags=re.S, fatal=False),
      +            'thumbnail': self._og_search_property('image', webpage, 'thumbnail', fatal=False),
      +            'upload_date': unified_strdate(self._html_search_meta('music:release_date', webpage, 'date', fatal=False)),
      +        }
      +        return self.playlist_result(self._get_entries(songs), album_id, **metainfo)
      +
      +
      +class NetEaseMusicSingerIE(NetEaseMusicBaseIE):
      +    IE_NAME = 'netease:singer'
      +    IE_DESC = 'ç½‘æ˜“äº‘éŸ³ä¹ - 歌手'
      +    _VALID_URL = r'https?://music\.163\.com/(#/)?artist\?id=(?P[0-9]+)'
      +    _TESTS = [{
      +        'note': 'Singer has aliases.',
      +        'url': 'http://music.163.com/#/artist?id=10559',
      +        'info_dict': {
      +            'id': '10559',
      +            'title': '张惠妹 - aMEI;阿妹;阿密特',
      +        },
      +        'playlist_count': 50,
      +    }, {
      +        'note': 'Singer has translated name.',
      +        'url': 'http://music.163.com/#/artist?id=124098',
      +        'info_dict': {
      +            'id': '124098',
      +            'title': 'æŽæ˜‡åŸº - ì´ìŠ¹ê¸°',
      +        },
      +        'playlist_count': 50,
      +    }, {
      +        'note': 'Singer with both translated and alias',
      +        'url': 'https://music.163.com/#/artist?id=159692',
      +        'info_dict': {
      +            'id': '159692',
      +            'title': 'åˆéŸ³ãƒŸã‚¯ - åˆéŸ³æœªæ¥;Hatsune Miku',
      +        },
      +        'playlist_count': 50,
      +    }]
      +
      +    def _real_extract(self, url):
      +        singer_id = self._match_id(url)
      +
      +        info = self.query_api(
      +            f'artist/{singer_id}?id={singer_id}', singer_id, note='Downloading singer data')
      +
      +        name = join_nonempty(
      +            traverse_obj(info, ('artist', 'name', {str})),
      +            join_nonempty(*traverse_obj(info, ('artist', ('trans', ('alias', ...)), {str})), delim=';'),
      +            delim=' - ')
      +
      +        return self.playlist_result(self._get_entries(info, 'hotSongs'), singer_id, name)
      +
      +
      +class NetEaseMusicListIE(NetEaseMusicBaseIE):
      +    IE_NAME = 'netease:playlist'
      +    IE_DESC = 'ç½‘æ˜“äº‘éŸ³ä¹ - æ­Œå•'
      +    _VALID_URL = r'https?://music\.163\.com/(#/)?(playlist|discover/toplist)\?id=(?P[0-9]+)'
      +    _TESTS = [{
      +        'url': 'http://music.163.com/#/playlist?id=79177352',
      +        'info_dict': {
      +            'id': '79177352',
      +            'title': 'Billboard 2007 Top 100',
      +            'description': 'md5:12fd0819cab2965b9583ace0f8b7b022',
      +            'tags': ['欧美'],
      +            'uploader': '浑然破ç­',
      +            'uploader_id': '67549805',
      +            'timestamp': int,
      +            'upload_date': r're:\d{8}',
      +        },
      +        'playlist_mincount': 95,
      +    }, {
      +        'note': 'Toplist/Charts sample',
      +        'url': 'https://music.163.com/#/discover/toplist?id=60198',
      +        'info_dict': {
      +            'id': '60198',
      +            'title': 're:美国Billboard榜 [0-9]{4}-[0-9]{2}-[0-9]{2}',
      +            'description': '美国Billboard排行榜',
      +            'tags': ['æµè¡Œ', '欧美', '榜å•'],
      +            'uploader': 'Billboard公告牌',
      +            'uploader_id': '48171',
      +            'timestamp': int,
      +            'upload_date': r're:\d{8}',
      +        },
      +        'playlist_count': 100,
      +    }, {
      +        'note': 'Toplist/Charts sample',
      +        'url': 'http://music.163.com/#/discover/toplist?id=3733003',
      +        'info_dict': {
      +            'id': '3733003',
      +            'title': 're:韩国Melon排行榜周榜 [0-9]{4}-[0-9]{2}-[0-9]{2}',
      +            'description': 'md5:73ec782a612711cadc7872d9c1e134fc',
      +        },
      +        'playlist_count': 50,
      +        'skip': 'Blocked outside Mainland China',
      +    }]
      +
      +    def _real_extract(self, url):
      +        list_id = self._match_id(url)
      +
      +        info = self._download_eapi_json(
      +            '/v3/playlist/detail', list_id,
      +            {'id': list_id, 't': '-1', 'n': '500', 's': '0'},
      +            note="Downloading playlist info")
      +
      +        metainfo = traverse_obj(info, ('playlist', {
      +            'title': ('name', {str}),
      +            'description': ('description', {str}),
      +            'tags': ('tags', ..., {str}),
      +            'uploader': ('creator', 'nickname', {str}),
      +            'uploader_id': ('creator', 'userId', {str_or_none}),
      +            'timestamp': ('updateTime', {self.kilo_or_none}),
      +        }))
      +        if traverse_obj(info, ('playlist', 'specialType')) == 10:
      +            metainfo['title'] = f'{metainfo.get("title")} {strftime_or_none(metainfo.get("timestamp"), "%Y-%m-%d")}'
      +
      +        return self.playlist_result(self._get_entries(info, ('playlist', 'tracks')), list_id, **metainfo)
      +
      +
      +class NetEaseMusicMvIE(NetEaseMusicBaseIE):
      +    IE_NAME = 'netease:mv'
      +    IE_DESC = 'ç½‘æ˜“äº‘éŸ³ä¹ - MV'
      +    _VALID_URL = r'https?://music\.163\.com/(#/)?mv\?id=(?P[0-9]+)'
      +    _TESTS = [{
      +        'url': 'https://music.163.com/#/mv?id=10958064',
      +        'info_dict': {
      +            'id': '10958064',
      +            'ext': 'mp4',
      +            'title': '交æ¢ä½™ç”Ÿ',
      +            'description': 'md5:e845872cff28820642a2b02eda428fea',
      +            'creator': '林俊æ°',
      +            'upload_date': '20200916',
      +            'thumbnail': r're:http.*\.jpg',
      +            'duration': 364,
      +            'view_count': int,
      +            'like_count': int,
      +            'comment_count': int,
      +        },
      +    }, {
      +        'url': 'http://music.163.com/#/mv?id=415350',
      +        'info_dict': {
      +            'id': '415350',
      +            'ext': 'mp4',
      +            'title': 'ì´ëŸ´ê±°ë©´ 그러지ë§ì§€',
      +            'description': '白雅言自作曲唱甜蜜爱情',
      +            'creator': '白娥娟',
      +            'upload_date': '20150520',
      +            'thumbnail': r're:http.*\.jpg',
      +            'duration': 216,
      +            'view_count': int,
      +            'like_count': int,
      +            'comment_count': int,
      +        },
      +    }]
      +
      +    def _real_extract(self, url):
      +        mv_id = self._match_id(url)
      +
      +        info = self.query_api(
      +            f'mv/detail?id={mv_id}&type=mp4', mv_id, 'Downloading mv info')['data']
      +
      +        formats = [
      +            {'url': mv_url, 'ext': 'mp4', 'format_id': f'{brs}p', 'height': int_or_none(brs)}
      +            for brs, mv_url in info['brs'].items()
      +        ]
      +
      +        return {
      +            'id': mv_id,
      +            'formats': formats,
      +            **traverse_obj(info, {
      +                'title': ('name', {str}),
      +                'description': (('desc', 'briefDesc'), {str}, {lambda x: x or None}),
      +                'creator': ('artistName', {str}),
      +                'upload_date': ('publishTime', {unified_strdate}),
      +                'thumbnail': ('cover', {url_or_none}),
      +                'duration': ('duration', {self.kilo_or_none}),
      +                'view_count': ('playCount', {int_or_none}),
      +                'like_count': ('likeCount', {int_or_none}),
      +                'comment_count': ('commentCount', {int_or_none}),
      +            }, get_all=False),
      +        }
      +
      +
      +class NetEaseMusicProgramIE(NetEaseMusicBaseIE):
      +    IE_NAME = 'netease:program'
      +    IE_DESC = 'ç½‘æ˜“äº‘éŸ³ä¹ - 电å°èŠ‚ç›®'
      +    _VALID_URL = r'https?://music\.163\.com/(#/?)program\?id=(?P[0-9]+)'
      +    _TESTS = [{
      +        'url': 'http://music.163.com/#/program?id=10109055',
      +        'info_dict': {
      +            'id': '32593346',
      +            'ext': 'mp3',
      +            'title': 'ä¸ä¸¹è¶³çƒèƒŒåŽçš„æ•…事',
      +            'description': 'å–œé©¬æ‹‰é›…äººçš„è¶³çƒæ¢¦ ...',
      +            'creator': '大è¯è¥¿è—',
      +            'timestamp': 1434179287,
      +            'upload_date': '20150613',
      +            'thumbnail': r're:http.*\.jpg',
      +            'duration': 900,
      +        },
      +    }, {
      +        'note': 'This program has accompanying songs.',
      +        'url': 'http://music.163.com/#/program?id=10141022',
      +        'info_dict': {
      +            'id': '10141022',
      +            'title': '滚滚电å°çš„æœ‰å£°èŠ‚ç›®',
      +            'description': 'md5:8d594db46cc3e6509107ede70a4aaa3b',
      +            'creator': '滚滚电å°ORZ',
      +            'timestamp': 1434450733,
      +            'upload_date': '20150616',
      +            'thumbnail': r're:http.*\.jpg',
      +        },
      +        'playlist_count': 4,
      +    }, {
      +        'note': 'This program has accompanying songs.',
      +        'url': 'http://music.163.com/#/program?id=10141022',
      +        'info_dict': {
      +            'id': '32647209',
      +            'ext': 'mp3',
      +            'title': '滚滚电å°çš„æœ‰å£°èŠ‚ç›®',
      +            'description': 'md5:8d594db46cc3e6509107ede70a4aaa3b',
      +            'creator': '滚滚电å°ORZ',
      +            'timestamp': 1434450733,
      +            'upload_date': '20150616',
      +            'thumbnail': r're:http.*\.jpg',
      +            'duration': 1104,
      +        },
      +        'params': {
      +            'noplaylist': True
      +        },
      +    }]
      +
      +    def _real_extract(self, url):
      +        program_id = self._match_id(url)
      +
      +        info = self.query_api(
      +            f'dj/program/detail?id={program_id}', program_id, note='Downloading program info')['program']
      +
      +        metainfo = traverse_obj(info, {
      +            'title': ('name', {str}),
      +            'description': ('description', {str}),
      +            'creator': ('dj', 'brand', {str}),
      +            'thumbnail': ('coverUrl', {url_or_none}),
      +            'timestamp': ('createTime', {self.kilo_or_none}),
      +        })
      +
      +        if not self._yes_playlist(info['songs'] and program_id, info['mainSong']['id']):
      +            formats = self.extract_formats(info['mainSong'])
      +
      +            return {
      +                'id': str(info['mainSong']['id']),
      +                'formats': formats,
      +                'duration': traverse_obj(info, ('mainSong', 'duration', {self.kilo_or_none})),
      +                **metainfo,
      +            }
      +
      +        songs = traverse_obj(info, (('mainSong', ('songs', ...)),))
      +        return self.playlist_result(self._get_entries(songs), program_id, **metainfo)
      +
      +
      +class NetEaseMusicDjRadioIE(NetEaseMusicBaseIE):
      +    IE_NAME = 'netease:djradio'
      +    IE_DESC = 'ç½‘æ˜“äº‘éŸ³ä¹ - 电å°'
      +    _VALID_URL = r'https?://music\.163\.com/(#/)?djradio\?id=(?P[0-9]+)'
      +    _TEST = {
      +        'url': 'http://music.163.com/#/djradio?id=42',
      +        'info_dict': {
      +            'id': '42',
      +            'title': '声音蔓延',
      +            'description': 'md5:c7381ebd7989f9f367668a5aee7d5f08'
      +        },
      +        'playlist_mincount': 40,
      +    }
      +    _PAGE_SIZE = 1000
      +
      +    def _real_extract(self, url):
      +        dj_id = self._match_id(url)
      +
      +        metainfo = {}
      +        entries = []
      +        for offset in itertools.count(start=0, step=self._PAGE_SIZE):
      +            info = self.query_api(
      +                f'dj/program/byradio?asc=false&limit={self._PAGE_SIZE}&radioId={dj_id}&offset={offset}',
      +                dj_id, note=f'Downloading dj programs - {offset}')
      +
      +            entries.extend(self.url_result(
      +                f'http://music.163.com/#/program?id={program["id"]}', NetEaseMusicProgramIE,
      +                program['id'], program.get('name')) for program in info['programs'])
      +            if not metainfo:
      +                metainfo = traverse_obj(info, ('programs', 0, 'radio', {
      +                    'title': ('name', {str}),
      +                    'description': ('desc', {str}),
      +                }))
      +
      +            if not info['more']:
      +                break
      +
      +        return self.playlist_result(entries, dj_id, **metainfo)
      diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/netverse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/netverse.py
      new file mode 100644
      index 0000000..ef53e15
      --- /dev/null
      +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/netverse.py
      @@ -0,0 +1,281 @@
      +import itertools
      +
      +from .common import InfoExtractor, SearchInfoExtractor
      +from .dailymotion import DailymotionIE
      +from ..utils import smuggle_url, traverse_obj
      +
      +
      +class NetverseBaseIE(InfoExtractor):
      +    _ENDPOINTS = {
      +        'watch': 'watchvideo',
      +        'video': 'watchvideo',
      +        'webseries': 'webseries',
      +        'season': 'webseason_videos',
      +    }
      +
      +    def _call_api(self, slug, endpoint, query={}, season_id='', display_id=None):
      +        return self._download_json(
      +            f'https://api.netverse.id/medias/api/v2/{self._ENDPOINTS[endpoint]}/{slug}/{season_id}',
      +            display_id or slug, query=query)
      +
      +    def _get_comments(self, video_id):
      +        last_page_number = None
      +        for i in itertools.count(1):
      +            comment_data = self._download_json(
      +                f'https://api.netverse.id/mediadetails/api/v3/videos/comments/{video_id}',
      +                video_id, data=b'', fatal=False, query={'page': i},
      +                note=f'Downloading JSON comment metadata page {i}') or {}
      +            yield from traverse_obj(comment_data, ('response', 'comments', 'data', ..., {
      +                'id': '_id',
      +                'text': 'comment',
      +                'author_id': 'customer_id',
      +                'author': ('customer', 'name'),
      +                'author_thumbnail': ('customer', 'profile_picture'),
      +            }))
      +
      +            if not last_page_number:
      +                last_page_number = traverse_obj(comment_data, ('response', 'comments', 'last_page'))
      +            if i >= (last_page_number or 0):
      +                break
      +
      +
      +class NetverseIE(NetverseBaseIE):
      +    _VALID_URL = r'https?://(?:\w+\.)?netverse\.id/(?Pwatch|video)/(?P[^/?#&]+)'
      +    _TESTS = [{
      +        # Watch video
      +        'url': 'https://www.netverse.id/watch/waktu-indonesia-bercanda-edisi-spesial-lebaran-2016',
      +        'info_dict': {
      +            'id': 'k4yhqUwINAGtmHx3NkL',
      +            'title': 'Waktu Indonesia Bercanda - Edisi Spesial Lebaran 2016',
      +            'ext': 'mp4',
      +            'season': 'Season 2016',
      +            'description': 'md5:d41d8cd98f00b204e9800998ecf8427e',
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'episode_number': 22,
      +            'episode': 'Episode 22',
      +            'uploader_id': 'x2ir3vq',
      +            'age_limit': 0,
      +            'tags': [],
      +            'view_count': int,
      +            'display_id': 'waktu-indonesia-bercanda-edisi-spesial-lebaran-2016',
      +            'duration': 2990,
      +            'upload_date': '20210722',
      +            'timestamp': 1626919804,
      +            'like_count': int,
      +            'uploader': 'Net Prime',
      +        }
      +    }, {
      +        # series
      +        'url': 'https://www.netverse.id/watch/jadoo-seorang-model',
      +        'info_dict': {
      +            'id': 'x88izwc',
      +            'title': 'Jadoo Seorang Model',
      +            'ext': 'mp4',
      +            'season': 'Season 2',
      +            'description': 'md5:8a74f70812cca267e19ee0635f0af835',
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'episode_number': 2,
      +            'episode': 'Episode 2',
      +            'view_count': int,
      +            'like_count': int,
      +            'display_id': 'jadoo-seorang-model',
      +            'uploader_id': 'x2ir3vq',
      +            'duration': 635,
      +            'timestamp': 1646372927,
      +            'tags': ['PG069497-hellojadooseason2eps2'],
      +            'upload_date': '20220304',
      +            'uploader': 'Net Prime',
      +            'age_limit': 0,
      +        },
      +        'skip': 'video get Geo-blocked for some country'
      +    }, {
      +        # non www host
      +        'url': 'https://netverse.id/watch/tetangga-baru',
      +        'info_dict': {
      +            'id': 'k4CNGz7V0HJ7vfwZbXy',
      +            'ext': 'mp4',
      +            'title': 'Tetangga Baru',
      +            'season': 'Season 1',
      +            'description': 'md5:23fcf70e97d461d3029d25d59b2ccfb9',
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'episode_number': 1,
      +            'episode': 'Episode 1',
      +            'timestamp': 1624538169,
      +            'view_count': int,
      +            'upload_date': '20210624',
      +            'age_limit': 0,
      +            'uploader_id': 'x2ir3vq',
      +            'like_count': int,
      +            'uploader': 'Net Prime',
      +            'tags': ['PG008534', 'tetangga', 'Baru'],
      +            'display_id': 'tetangga-baru',
      +            'duration': 1406,
      +        },
      +    }, {
      +        # /video url
      +        'url': 'https://www.netverse.id/video/pg067482-hellojadoo-season1',
      +        'title': 'Namaku Choi Jadoo',
      +        'info_dict': {
      +            'id': 'x887jzz',
      +            'ext': 'mp4',
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'season': 'Season 1',
      +            'episode_number': 1,
      +            'description': 'md5:d4f627b3e7a3f9acdc55f6cdd5ea41d5',
      +            'title': 'Namaku Choi Jadoo',
      +            'episode': 'Episode 1',
      +            'age_limit': 0,
      +            'like_count': int,
      +            'view_count': int,
      +            'tags': ['PG067482', 'PG067482-HelloJadoo-season1'],
      +            'duration': 780,
      +            'display_id': 'pg067482-hellojadoo-season1',
      +            'uploader_id': 'x2ir3vq',
      +            'uploader': 'Net Prime',
      +            'timestamp': 1645764984,
      +            'upload_date': '20220225',
      +        },
      +        'skip': 'This video get Geo-blocked for some country'
      +    }, {
      +        # video with comments
      +        'url': 'https://netverse.id/video/episode-1-season-2016-ok-food',
      +        'info_dict': {
      +            'id': 'k6hetBPiQMljSxxvAy7',
      +            'ext': 'mp4',
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'display_id': 'episode-1-season-2016-ok-food',
      +            'like_count': int,
      +            'description': '',
      +            'duration': 1471,
      +            'age_limit': 0,
      +            'timestamp': 1642405848,
      +            'episode_number': 1,
      +            'season': 'Season 2016',
      +            'uploader_id': 'x2ir3vq',
      +            'title': 'Episode 1 - Season 2016 - Ok Food',
      +            'upload_date': '20220117',
      +            'tags': [],
      +            'view_count': int,
      +            'episode': 'Episode 1',
      +            'uploader': 'Net Prime',
      +            'comment_count': int,
      +        },
      +        'params': {
      +            'getcomments': True
      +        }
      +    }, {
      +        # video with multiple page comment
      +        'url': 'https://netverse.id/video/match-island-eps-1-fix',
      +        'info_dict': {
      +            'id': 'x8aznjc',
      +            'ext': 'mp4',
      +            'like_count': int,
      +            'tags': ['Match-Island', 'Pd00111'],
      +            'display_id': 'match-island-eps-1-fix',
      +            'view_count': int,
      +            'episode': 'Episode 1',
      +            'uploader': 'Net Prime',
      +            'duration': 4070,
      +            'timestamp': 1653068165,
      +            'description': 'md5:e9cf3b480ad18e9c33b999e3494f223f',
      +            'age_limit': 0,
      +            'title': 'Welcome To Match Island',
      +            'upload_date': '20220520',
      +            'episode_number': 1,
      +            'thumbnail': r're:https?://s\d+\.dmcdn\.net/v/[^/]+/x1080',
      +            'uploader_id': 'x2ir3vq',
      +            'season': 'Season 1',
      +            'comment_count': int,
      +        },
      +        'params': {
      +            'getcomments': True
      +        }
      +    }]
      +
      +    def _real_extract(self, url):
      +        display_id, sites_type = self._match_valid_url(url).group('display_id', 'type')
      +        program_json = self._call_api(display_id, sites_type)
      +        videos = program_json['response']['videos']
      +
      +        return {
      +            '_type': 'url_transparent',
      +            'ie_key': DailymotionIE.ie_key(),
      +            'url': smuggle_url(videos['dailymotion_url'], {'query': {'embedder': 'https://www.netverse.id'}}),
      +            'display_id': display_id,
      +            'title': videos.get('title'),
      +            'season': videos.get('season_name'),
      +            'thumbnail': traverse_obj(videos, ('program_detail', 'thumbnail_image')),
      +            'description': traverse_obj(videos, ('program_detail', 'description')),
      +            'episode_number': videos.get('episode_order'),
      +            '__post_extractor': self.extract_comments(display_id),
      +        }
      +
      +
      +class NetversePlaylistIE(NetverseBaseIE):
      +    _VALID_URL = r'https?://(?:\w+\.)?netverse\.id/(?Pwebseries)/(?P[^/?#&]+)'
      +    _TESTS = [{
      +        # multiple season
      +        'url': 'https://netverse.id/webseries/tetangga-masa-gitu',
      +        'info_dict': {
      +            'id': 'tetangga-masa-gitu',
      +            'title': 'Tetangga Masa Gitu',
      +        },
      +        'playlist_count': 519,
      +    }, {
      +        # single season
      +        'url': 'https://netverse.id/webseries/kelas-internasional',
      +        'info_dict': {
      +            'id': 'kelas-internasional',
      +            'title': 'Kelas Internasional',
      +        },
      +        'playlist_count': 203,
      +    }]
      +
      +    def parse_playlist(self, json_data, playlist_id):
      +        slug_sample = traverse_obj(json_data, ('related', 'data', ..., 'slug'))[0]
      +        for season in traverse_obj(json_data, ('seasons', ..., 'id')):
      +            playlist_json = self._call_api(
      +                slug_sample, 'season', display_id=playlist_id, season_id=season)
      +
      +            for current_page in range(playlist_json['response']['season_list']['last_page']):
      +                playlist_json = self._call_api(slug_sample, 'season', query={'page': current_page + 1},
      +                                               season_id=season, display_id=playlist_id)
      +                for slug in traverse_obj(playlist_json, ('response', ..., 'data', ..., 'slug')):
      +                    yield self.url_result(f'https://www.netverse.id/video/{slug}', NetverseIE)
      +
      +    def _real_extract(self, url):
      +        playlist_id, sites_type = self._match_valid_url(url).group('display_id', 'type')
      +        playlist_data = self._call_api(playlist_id, sites_type)
      +
      +        return self.playlist_result(
      +            self.parse_playlist(playlist_data['response'], playlist_id),
      +            traverse_obj(playlist_data, ('response', 'webseries_info', 'slug')),
      +            traverse_obj(playlist_data, ('response', 'webseries_info', 'title')))
      +
      +
      +class NetverseSearchIE(SearchInfoExtractor):
      +    _SEARCH_KEY = 'netsearch'
      +
      +    _TESTS = [{
      +        'url': 'netsearch10:tetangga',
      +        'info_dict': {
      +            'id': 'tetangga',
      +            'title': 'tetangga',
      +        },
      +        'playlist_count': 10,
      +    }]
      +
      +    def _search_results(self, query):
      +        last_page = None
      +        for i in itertools.count(1):
      +            search_data = self._download_json(
      +                'https://api.netverse.id/search/elastic/search', query,
      +                query={'q': query, 'page': i}, note=f'Downloading page {i}')
      +
      +            videos = traverse_obj(search_data, ('response', 'data', ...))
      +            for video in videos:
      +                yield self.url_result(f'https://netverse.id/video/{video["slug"]}', NetverseIE)
      +
      +            last_page = last_page or traverse_obj(search_data, ('response', 'lastpage'))
      +            if not videos or i >= (last_page or 0):
      +                break
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/netzkino.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/netzkino.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/netzkino.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/netzkino.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/newgrounds.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/newgrounds.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/newgrounds.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/newgrounds.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/newspicks.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/newspicks.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/newspicks.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/newspicks.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/newstube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/newstube.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/newstube.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/newstube.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/newsy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/newsy.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/newsy.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/newsy.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nextmedia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nextmedia.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/nextmedia.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nextmedia.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nexx.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nexx.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/nexx.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nexx.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nfb.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nfb.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/nfb.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nfb.py
      diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nfhsnetwork.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nfhsnetwork.py
      similarity index 100%
      rename from lib/python3.11/site-packages/yt_dlp/extractor/nfhsnetwork.py
      rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nfhsnetwork.py
      diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nfl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nfl.py
      new file mode 100644
      index 0000000..3f83cd2
      --- /dev/null
      +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nfl.py
      @@ -0,0 +1,373 @@
      +import base64
      +import json
      +import re
      +import time
      +import uuid
      +
      +from .anvato import AnvatoIE
      +from .common import InfoExtractor
      +from ..utils import (
      +    ExtractorError,
      +    clean_html,
      +    determine_ext,
      +    get_element_by_class,
      +    traverse_obj,
      +    urlencode_postdata,
      +)
      +
      +
      +class NFLBaseIE(InfoExtractor):
      +    _VALID_URL_BASE = r'''(?x)
      +                    https?://
      +                        (?P
      +                            (?:www\.)?
      +                            (?:
      +                                (?:
      +                                    nfl|
      +                                    buffalobills|
      +                                    miamidolphins|
      +                                    patriots|
      +                                    newyorkjets|
      +                                    baltimoreravens|
      +                                    bengals|
      +                                    clevelandbrowns|
      +                                    steelers|
      +                                    houstontexans|
      +                                    colts|
      +                                    jaguars|
      +                                    (?:titansonline|tennesseetitans)|
      +                                    denverbroncos|
      +                                    (?:kc)?chiefs|
      +                                    raiders|
      +                                    chargers|
      +                                    dallascowboys|
      +                                    giants|
      +                                    philadelphiaeagles|
      +                                    (?:redskins|washingtonfootball)|
      +                                    chicagobears|
      +                                    detroitlions|
      +                                    packers|
      +                                    vikings|
      +                                    atlantafalcons|
      +                                    panthers|
      +                                    neworleanssaints|
      +                                    buccaneers|
      +                                    azcardinals|
      +                                    (?:stlouis|the)rams|
      +                                    49ers|
      +                                    seahawks
      +                                )\.com|
      +                                .+?\.clubs\.nfl\.com
      +                            )
      +                        )/
      +                    '''
      +    _VIDEO_CONFIG_REGEX = r']+id="[^"]*video-config-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}[^"]*"[^>]*>\s*({.+});?\s*'
      +    _ANVATO_PREFIX = 'anvato:GXvEgwyJeWem8KCYXfeoHWknwP48Mboj:'
      +
      +    _CLIENT_DATA = {
      +        'clientKey': '4cFUW6DmwJpzT9L7LrG3qRAcABG5s04g',
      +        'clientSecret': 'CZuvCL49d9OwfGsR',
      +        'deviceId': str(uuid.uuid4()),
      +        'deviceInfo': base64.b64encode(json.dumps({
      +            'model': 'desktop',
      +            'version': 'Chrome',
      +            'osName': 'Windows',
      +            'osVersion': '10.0',
      +        }, separators=(',', ':')).encode()).decode(),
      +        'networkType': 'other',
      +        'nflClaimGroupsToAdd': [],
      +        'nflClaimGroupsToRemove': [],
      +    }
      +    _ACCOUNT_INFO = {}
      +    _API_KEY = None
      +
      +    _TOKEN = None
      +    _TOKEN_EXPIRY = 0
      +
      +    def _get_account_info(self, url, slug):
      +        if not self._API_KEY:
      +            webpage = self._download_webpage(url, slug, fatal=False) or ''
      +            self._API_KEY = self._search_regex(
      +                r'window\.gigyaApiKey\s*=\s*["\'](\w+)["\'];', webpage, 'API key',
      +                fatal=False) or '3_Qa8TkWpIB8ESCBT8tY2TukbVKgO5F6BJVc7N1oComdwFzI7H2L9NOWdm11i_BY9f'
      +
      +        cookies = self._get_cookies('https://auth-id.nfl.com/')
      +        login_token = traverse_obj(cookies, (
      +            (f'glt_{self._API_KEY}', lambda k, _: k.startswith('glt_')), {lambda x: x.value}), get_all=False)
      +        if not login_token:
      +            self.raise_login_required()
      +        if 'ucid' not in cookies:
      +            raise ExtractorError(
      +                'Required cookies for the auth-id.nfl.com domain were not found among passed cookies. '
      +                'If using --cookies, these cookies must be exported along with .nfl.com cookies, '
      +                'or else try using --cookies-from-browser instead', expected=True)
      +
      +        account = self._download_json(
      +            'https://auth-id.nfl.com/accounts.getAccountInfo', slug,
      +            note='Downloading account info', data=urlencode_postdata({
      +                'include': 'profile,data',
      +                'lang': 'en',
      +                'APIKey': self._API_KEY,
      +                'sdk': 'js_latest',
      +                'login_token': login_token,
      +                'authMode': 'cookie',
      +                'pageURL': url,
      +                'sdkBuild': traverse_obj(cookies, (
      +                    'gig_canary_ver', {lambda x: x.value.partition('-')[0]}), default='15170'),
      +                'format': 'json',
      +            }), headers={'Content-Type': 'application/x-www-form-urlencoded'})
      +
      +        self._ACCOUNT_INFO = traverse_obj(account, {
      +            'signatureTimestamp': 'signatureTimestamp',
      +            'uid': 'UID',
      +            'uidSignature': 'UIDSignature',
      +        })
      +
      +        if len(self._ACCOUNT_INFO) != 3:
      +            raise ExtractorError('Failed to retrieve account info with provided cookies', expected=True)
      +
      +    def _get_auth_token(self, url, slug):
      +        if self._TOKEN and self._TOKEN_EXPIRY > int(time.time() + 30):
      +            return
      +
      +        if not self._ACCOUNT_INFO:
      +            self._get_account_info(url, slug)
      +
      +        token = self._download_json(
      +            'https://api.nfl.com/identity/v3/token%s' % (
      +                '/refresh' if self._ACCOUNT_INFO.get('refreshToken') else ''),
      +            slug, headers={'Content-Type': 'application/json'}, note='Downloading access token',
      +            data=json.dumps({**self._CLIENT_DATA, **self._ACCOUNT_INFO}, separators=(',', ':')).encode())
      +
      +        self._TOKEN = token['accessToken']
      +        self._TOKEN_EXPIRY = token['expiresIn']
      +        self._ACCOUNT_INFO['refreshToken'] = token['refreshToken']
      +
      +    def _parse_video_config(self, video_config, display_id):
      +        video_config = self._parse_json(video_config, display_id)
      +        item = video_config['playlist'][0]
      +        mcp_id = item.get('mcpID')
      +        if mcp_id:
      +            info = self.url_result(f'{self._ANVATO_PREFIX}{mcp_id}', AnvatoIE, mcp_id)
      +        else:
      +            media_id = item.get('id') or item['entityId']
      +            title = item.get('title')
      +            item_url = item['url']
      +            info = {'id': media_id}
      +            ext = determine_ext(item_url)
      +            if ext == 'm3u8':
      +                info['formats'] = self._extract_m3u8_formats(item_url, media_id, 'mp4')
      +            else:
      +                info['url'] = item_url
      +                if item.get('audio') is True:
      +                    info['vcodec'] = 'none'
      +            is_live = video_config.get('live') is True
      +            thumbnails = None
      +            image_url = item.get(item.get('imageSrc')) or item.get(item.get('posterImage'))
      +            if image_url:
      +                thumbnails = [{
      +                    'url': image_url,
      +                    'ext': determine_ext(image_url, 'jpg'),
      +                }]
      +            info.update({
      +                'title': title,
      +                'is_live': is_live,
      +                'description': clean_html(item.get('description')),
      +                'thumbnails': thumbnails,
      +            })
      +        return info
      +
      +
      +class NFLIE(NFLBaseIE):
      +    IE_NAME = 'nfl.com'
      +    _VALID_URL = NFLBaseIE._VALID_URL_BASE + r'(?:videos?|listen|audio)/(?P[^/#?&]+)'
      +    _TESTS = [{
      +        'url': 'https://www.nfl.com/videos/baker-mayfield-s-game-changing-plays-from-3-td-game-week-14',
      +        'info_dict': {
      +            'id': '899441',
      +            'ext': 'mp4',
      +            'title': "Baker Mayfield's game-changing plays from 3-TD game Week 14",
      +            'description': 'md5:85e05a3cc163f8c344340f220521136d',
      +            'upload_date': '20201215',
      +            'timestamp': 1608009755,
      +            'thumbnail': r're:^https?://.*\.jpg$',
      +            'uploader': 'NFL',
      +            'tags': 'count:6',
      +            'duration': 157,
      +            'categories': 'count:3',
      +        }
      +    }, {
      +        'url': 'https://www.chiefs.com/listen/patrick-mahomes-travis-kelce-react-to-win-over-dolphins-the-breakdown',
      +        'md5': '6886b32c24b463038c760ceb55a34566',
      +        'info_dict': {
      +            'id': 'd87e8790-3e14-11eb-8ceb-ff05c2867f99',
      +            'ext': 'mp3',
      +            'title': 'Patrick Mahomes, Travis Kelce React to Win Over Dolphins | The Breakdown',
      +            'description': 'md5:12ada8ee70e6762658c30e223e095075',
      +        },
      +        'skip': 'HTTP Error 404: Not Found',
      +    }, {
      +        'url': 'https://www.buffalobills.com/video/buffalo-bills-military-recognition-week-14',
      +        'only_matching': True,
      +    }, {
      +        'url': 'https://www.raiders.com/audio/instant-reactions-raiders-week-14-loss-to-indianapolis-colts-espn-jason-fitz',
      +        'only_matching': True,
      +    }]
      +
      +    def _real_extract(self, url):
      +        display_id = self._match_id(url)
      +        webpage = self._download_webpage(url, display_id)
      +        return self._parse_video_config(self._search_regex(
      +            self._VIDEO_CONFIG_REGEX, webpage, 'video config'), display_id)
      +
      +
      +class NFLArticleIE(NFLBaseIE):
      +    IE_NAME = 'nfl.com:article'
      +    _VALID_URL = NFLBaseIE._VALID_URL_BASE + r'news/(?P[^/#?&]+)'
      +    _TEST = {
      +        'url': 'https://www.buffalobills.com/news/the-only-thing-we-ve-earned-is-the-noise-bills-coaches-discuss-handling-rising-e',
      +        'info_dict': {
      +            'id': 'the-only-thing-we-ve-earned-is-the-noise-bills-coaches-discuss-handling-rising-e',
      +            'title': "'The only thing we've earned is the noise' | Bills coaches discuss handling rising expectations",
      +        },
      +        'playlist_count': 4,
      +    }
      +
      +    def _real_extract(self, url):
      +        display_id = self._match_id(url)
      +        webpage = self._download_webpage(url, display_id)
      +        entries = []
      +        for video_config in re.findall(self._VIDEO_CONFIG_REGEX, webpage):
      +            entries.append(self._parse_video_config(video_config, display_id))
      +        title = clean_html(get_element_by_class(
      +            'nfl-c-article__title', webpage)) or self._html_search_meta(
      +            ['og:title', 'twitter:title'], webpage)
      +        return self.playlist_result(entries, display_id, title)
      +
      +
      +class NFLPlusReplayIE(NFLBaseIE):
      +    IE_NAME = 'nfl.com:plus:replay'
      +    _VALID_URL = r'https?://(?:www\.)?nfl\.com/plus/games/(?P[\w-]+)(?:/(?P\d+))?'
      +    _TESTS = [{
      +        'url': 'https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108',
      +        'info_dict': {
      +            'id': '1572108',
      +            'ext': 'mp4',
      +            'title': 'New York Giants at Minnesota Vikings',
      +            'description': 'New York Giants play the Minnesota Vikings at U.S. Bank Stadium on January 15, 2023',
      +            'uploader': 'NFL',
      +            'upload_date': '20230116',
      +            'timestamp': 1673864520,
      +            'duration': 7157,
      +            'categories': ['Game Highlights'],
      +            'tags': ['Minnesota Vikings', 'New York Giants', 'Minnesota Vikings vs. New York Giants'],
      +            'thumbnail': r're:^https?://.*\.jpg',
      +        },
      +        'params': {'skip_download': 'm3u8'},
      +    }, {
      +        'note': 'Subscription required',
      +        'url': 'https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1',
      +        'playlist_count': 4,
      +        'info_dict': {
      +            'id': 'giants-at-vikings-2022-post-1',
      +        },
      +    }, {
      +        'note': 'Subscription required',
      +        'url': 'https://www.nfl.com/plus/games/giants-at-patriots-2011-pre-4',
      +        'playlist_count': 2,
      +        'info_dict': {
      +            'id': 'giants-at-patriots-2011-pre-4',
      +        },
      +    }, {
      +        'note': 'Subscription required',
      +        'url': 'https://www.nfl.com/plus/games/giants-at-patriots-2011-pre-4',
      +        'info_dict': {
      +            'id': '950701',
      +            'ext': 'mp4',
      +            'title': 'Giants @ Patriots',
      +            'description': 'Giants at Patriots on September 01, 2011',
      +            'uploader': 'NFL',
      +            'upload_date': '20210724',
      +            'timestamp': 1627085874,
      +            'duration': 1532,
      +            'categories': ['Game Highlights'],
      +            'tags': ['play-by-play'],
      +            'thumbnail': r're:^https?://.*\.jpg',
      +        },
      +        'params': {
      +            'skip_download': 'm3u8',
      +            'extractor_args': {'nflplusreplay': {'type': ['condensed_game']}},
      +        },
      +    }]
      +
      +    _REPLAY_TYPES = {
      +        'full_game': 'Full Game',
      +        'full_game_spanish': 'Full Game - Spanish',
      +        'condensed_game': 'Condensed Game',
      +        'all_22': 'All-22',
      +    }
      +
      +    def _real_extract(self, url):
      +        slug, video_id = self._match_valid_url(url).group('slug', 'id')
      +        requested_types = self._configuration_arg('type', ['all'])
      +        if 'all' in requested_types:
      +            requested_types = list(self._REPLAY_TYPES.keys())
      +        requested_types = traverse_obj(self._REPLAY_TYPES, (None, requested_types))
      +
      +        if not video_id:
      +            self._get_auth_token(url, slug)
      +            headers = {'Authorization': f'Bearer {self._TOKEN}'}
      +            game_id = self._download_json(
      +                f'https://api.nfl.com/football/v2/games/externalId/slug/{slug}', slug,
      +                'Downloading game ID', query={'withExternalIds': 'true'}, headers=headers)['id']
      +            replays = self._download_json(
      +                'https://api.nfl.com/content/v1/videos/replays', slug, 'Downloading replays JSON',
      +                query={'gameId': game_id}, headers=headers)
      +            if len(requested_types) == 1:
      +                video_id = traverse_obj(replays, (
      +                    'items', lambda _, v: v['subType'] == requested_types[0], 'mcpPlaybackId'), get_all=False)
      +
      +        if video_id:
      +            return self.url_result(f'{self._ANVATO_PREFIX}{video_id}', AnvatoIE, video_id)
      +
      +        def entries():
      +            for replay in traverse_obj(
      +                replays, ('items', lambda _, v: v['mcpPlaybackId'] and v['subType'] in requested_types)
      +            ):
      +                video_id = replay['mcpPlaybackId']
      +                yield self.url_result(f'{self._ANVATO_PREFIX}{video_id}', AnvatoIE, video_id)
      +
      +        return self.playlist_result(entries(), slug)
      +
      +
      +class NFLPlusEpisodeIE(NFLBaseIE):
      +    IE_NAME = 'nfl.com:plus:episode'
      +    _VALID_URL = r'https?://(?:www\.)?nfl\.com/plus/episodes/(?P[\w-]+)'
      +    _TESTS = [{
      +        'note': 'Subscription required',
      +        'url': 'https://www.nfl.com/plus/episodes/kurt-s-qb-insider-conference-championships',
      +        'info_dict': {
      +            'id': '1576832',
      +            'ext': 'mp4',
      +            'title': 'Conference Championships',
      +            'description': 'md5:944f7fab56f7a37430bf8473f5473857',
      +            'uploader': 'NFL',
      +            'upload_date': '20230127',
      +            'timestamp': 1674782760,
      +            'duration': 730,
      +            'categories': ['Analysis'],
      +            'tags': ['Cincinnati Bengals at Kansas City Chiefs (2022-POST-3)'],
      +            'thumbnail': r're:^https?://.*\.jpg',
      +        },
      +        'params': {'skip_download': 'm3u8'},
      +    }]
      +
      +    def _real_extract(self, url):
      +        slug = self._match_id(url)
      +        self._get_auth_token(url, slug)
      +        video_id = self._download_json(
      +            f'https://api.nfl.com/content/v1/videos/episodes/{slug}', slug, headers={
      +                'Authorization': f'Bearer {self._TOKEN}',
      +            })['mcpPlaybackId']
      +
      +        return self.url_result(f'{self._ANVATO_PREFIX}{video_id}', AnvatoIE, video_id)
      diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nhk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nhk.py
      new file mode 100644
      index 0000000..f6b5c50
      --- /dev/null
      +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nhk.py
      @@ -0,0 +1,619 @@
      +import re
      +
      +from .common import InfoExtractor
      +from ..utils import (
      +    ExtractorError,
      +    int_or_none,
      +    join_nonempty,
      +    parse_duration,
      +    traverse_obj,
      +    unescapeHTML,
      +    unified_timestamp,
      +    url_or_none,
      +    urljoin,
      +)
      +
      +
      +class NhkBaseIE(InfoExtractor):
      +    _API_URL_TEMPLATE = 'https://nwapi.nhk.jp/nhkworld/%sod%slist/v7b/%s/%s/%s/all%s.json'
      +    _BASE_URL_REGEX = r'https?://www3\.nhk\.or\.jp/nhkworld/(?P[a-z]{2})/ondemand'
      +    _TYPE_REGEX = r'/(?Pvideo|audio)/'
      +
      +    def _call_api(self, m_id, lang, is_video, is_episode, is_clip):
      +        return self._download_json(
      +            self._API_URL_TEMPLATE % (
      +                'v' if is_video else 'r',
      +                'clip' if is_clip else 'esd',
      +                'episode' if is_episode else 'program',
      +                m_id, lang, '/all' if is_video else ''),
      +            m_id, query={'apikey': 'EJfK8jdS57GqlupFgAfAAwr573q01y6k'})['data']['episodes'] or []
      +
      +    def _get_api_info(self, refresh=True):
      +        if not refresh:
      +            return self.cache.load('nhk', 'api_info')
      +
      +        self.cache.store('nhk', 'api_info', {})
      +        movie_player_js = self._download_webpage(
      +            'https://movie-a.nhk.or.jp/world/player/js/movie-player.js', None,
      +            note='Downloading stream API information')
      +        api_info = {
      +            'url': self._search_regex(
      +                r'prod:[^;]+\bapiUrl:\s*[\'"]([^\'"]+)[\'"]', movie_player_js, None, 'stream API url'),
      +            'token': self._search_regex(
      +                r'prod:[^;]+\btoken:\s*[\'"]([^\'"]+)[\'"]', movie_player_js, None, 'stream API token'),
      +        }
      +        self.cache.store('nhk', 'api_info', api_info)
      +        return api_info
      +
      +    def _extract_formats_and_subtitles(self, vod_id):
      +        for refresh in (False, True):
      +            api_info = self._get_api_info(refresh)
      +            if not api_info:
      +                continue
      +
      +            api_url = api_info.pop('url')
      +            stream_url = traverse_obj(
      +                self._download_json(
      +                    api_url, vod_id, 'Downloading stream url info', fatal=False, query={
      +                        **api_info,
      +                        'type': 'json',
      +                        'optional_id': vod_id,
      +                        'active_flg': 1,
      +                    }),
      +                ('meta', 0, 'movie_url', ('mb_auto', 'auto_sp', 'auto_pc'), {url_or_none}), get_all=False)
      +            if stream_url:
      +                return self._extract_m3u8_formats_and_subtitles(stream_url, vod_id)
      +
      +        raise ExtractorError('Unable to extract stream url')
      +
      +    def _extract_episode_info(self, url, episode=None):
      +        fetch_episode = episode is None
      +        lang, m_type, episode_id = NhkVodIE._match_valid_url(url).group('lang', 'type', 'id')
      +        is_video = m_type == 'video'
      +
      +        if is_video:
      +            episode_id = episode_id[:4] + '-' + episode_id[4:]
      +
      +        if fetch_episode:
      +            episode = self._call_api(
      +                episode_id, lang, is_video, True, episode_id[:4] == '9999')[0]
      +        title = episode.get('sub_title_clean') or episode['sub_title']
      +
      +        def get_clean_field(key):
      +            return episode.get(key + '_clean') or episode.get(key)
      +
      +        series = get_clean_field('title')
      +
      +        thumbnails = []
      +        for s, w, h in [('', 640, 360), ('_l', 1280, 720)]:
      +            img_path = episode.get('image' + s)
      +            if not img_path:
      +                continue
      +            thumbnails.append({
      +                'id': '%dp' % h,
      +                'height': h,
      +                'width': w,
      +                'url': 'https://www3.nhk.or.jp' + img_path,
      +            })
      +
      +        info = {
      +            'id': episode_id + '-' + lang,
      +            'title': '%s - %s' % (series, title) if series and title else title,
      +            'description': get_clean_field('description'),
      +            'thumbnails': thumbnails,
      +            'series': series,
      +            'episode': title,
      +        }
      +        if is_video:
      +            vod_id = episode['vod_id']
      +            formats, subs = self._extract_formats_and_subtitles(vod_id)
      +
      +            info.update({
      +                'id': vod_id,
      +                'formats': formats,
      +                'subtitles': subs,
      +            })
      +
      +        else:
      +            if fetch_episode:
      +                audio_path = episode['audio']['audio']
      +                info['formats'] = self._extract_m3u8_formats(
      +                    'https://nhkworld-vh.akamaihd.net/i%s/master.m3u8' % audio_path,
      +                    episode_id, 'm4a', entry_protocol='m3u8_native',
      +                    m3u8_id='hls', fatal=False)
      +                for f in info['formats']:
      +                    f['language'] = lang
      +            else:
      +                info.update({
      +                    '_type': 'url_transparent',
      +                    'ie_key': NhkVodIE.ie_key(),
      +                    'url': url,
      +                })
      +        return info
      +
      +
      +class NhkVodIE(NhkBaseIE):
      +    # the 7-character IDs can have alphabetic chars too: assume [a-z] rather than just [a-f], eg
      +    _VALID_URL = [rf'{NhkBaseIE._BASE_URL_REGEX}/(?Pvideo)/(?P[0-9a-z]+)',
      +                  rf'{NhkBaseIE._BASE_URL_REGEX}/(?Paudio)/(?P[^/?#]+?-\d{{8}}-[0-9a-z]+)']
      +    # Content available only for a limited period of time. Visit
      +    # https://www3.nhk.or.jp/nhkworld/en/ondemand/ for working samples.
      +    _TESTS = [{
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2049126/',
      +        'info_dict': {
      +            'id': 'nw_vod_v_en_2049_126_20230413233000_01_1681398302',
      +            'ext': 'mp4',
      +            'title': 'Japan Railway Journal - The Tohoku Shinkansen: Full Speed Ahead',
      +            'description': 'md5:49f7c5b206e03868a2fdf0d0814b92f6',
      +            'thumbnail': 'md5:51bcef4a21936e7fea1ff4e06353f463',
      +            'episode': 'The Tohoku Shinkansen: Full Speed Ahead',
      +            'series': 'Japan Railway Journal',
      +        },
      +    }, {
      +        # video clip
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999011/',
      +        'md5': '153c3016dfd252ba09726588149cf0e7',
      +        'info_dict': {
      +            'id': 'lpZXIwaDE6_Z-976CPsFdxyICyWUzlT5',
      +            'ext': 'mp4',
      +            'title': 'Dining with the Chef - Chef Saito\'s Family recipe: MENCHI-KATSU',
      +            'description': 'md5:5aee4a9f9d81c26281862382103b0ea5',
      +            'thumbnail': 'md5:d6a4d9b6e9be90aaadda0bcce89631ed',
      +            'series': 'Dining with the Chef',
      +            'episode': 'Chef Saito\'s Family recipe: MENCHI-KATSU',
      +        },
      +    }, {
      +        # radio
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/audio/livinginjapan-20231001-1/',
      +        'info_dict': {
      +            'id': 'livinginjapan-20231001-1-en',
      +            'ext': 'm4a',
      +            'title': 'Living in Japan - Tips for Travelers to Japan / Ramen Vending Machines',
      +            'series': 'Living in Japan',
      +            'description': 'md5:850611969932874b4a3309e0cae06c2f',
      +            'thumbnail': 'md5:960622fb6e06054a4a1a0c97ea752545',
      +            'episode': 'Tips for Travelers to Japan / Ramen Vending Machines'
      +        },
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2015173/',
      +        'only_matching': True,
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/audio/plugin-20190404-1/',
      +        'only_matching': True,
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/fr/ondemand/audio/plugin-20190404-1/',
      +        'only_matching': True,
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/audio/j_art-20150903-1/',
      +        'only_matching': True,
      +    }, {
      +        # video, alphabetic character in ID #29670
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/video/9999a34/',
      +        'info_dict': {
      +            'id': 'qfjay6cg',
      +            'ext': 'mp4',
      +            'title': 'DESIGN TALKS plus - Fishermen’s Finery',
      +            'description': 'md5:8a8f958aaafb0d7cb59d38de53f1e448',
      +            'thumbnail': r're:^https?:/(/[a-z0-9.-]+)+\.jpg\?w=1920&h=1080$',
      +            'upload_date': '20210615',
      +            'timestamp': 1623722008,
      +        },
      +        'skip': '404 Not Found',
      +    }, {
      +        # japanese-language, longer id than english
      +        'url': 'https://www3.nhk.or.jp/nhkworld/ja/ondemand/video/0020271111/',
      +        'info_dict': {
      +            'id': 'nw_ja_v_jvod_ohayou_20231008',
      +            'ext': 'mp4',
      +            'title': 'ãŠã¯ã‚ˆã†æ—¥æœ¬ï¼ˆ7時å°ï¼‰ - 10月8日放é€',
      +            'series': 'ãŠã¯ã‚ˆã†æ—¥æœ¬ï¼ˆ7時å°ï¼‰',
      +            'episode': '10月8日放é€',
      +            'thumbnail': 'md5:d733b1c8e965ab68fb02b2d347d0e9b4',
      +            'description': 'md5:9c1d6cbeadb827b955b20e99ab920ff0',
      +        },
      +        'skip': 'expires 2023-10-15',
      +    }]
      +
      +    def _real_extract(self, url):
      +        return self._extract_episode_info(url)
      +
      +
      +class NhkVodProgramIE(NhkBaseIE):
      +    _VALID_URL = rf'{NhkBaseIE._BASE_URL_REGEX}/program{NhkBaseIE._TYPE_REGEX}(?P\w+)(?:.+?\btype=(?Pclip|(?:radio|tv)Episode))?'
      +    _TESTS = [{
      +        # video program episodes
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/program/video/sumo',
      +        'info_dict': {
      +            'id': 'sumo',
      +            'title': 'GRAND SUMO Highlights',
      +        },
      +        'playlist_mincount': 12,
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/program/video/japanrailway',
      +        'info_dict': {
      +            'id': 'japanrailway',
      +            'title': 'Japan Railway Journal',
      +        },
      +        'playlist_mincount': 12,
      +    }, {
      +        # video program clips
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/program/video/japanrailway/?type=clip',
      +        'info_dict': {
      +            'id': 'japanrailway',
      +            'title': 'Japan Railway Journal',
      +        },
      +        'playlist_mincount': 5,
      +    }, {
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/program/video/10yearshayaomiyazaki/',
      +        'only_matching': True,
      +    }, {
      +        # audio program
      +        'url': 'https://www3.nhk.or.jp/nhkworld/en/ondemand/program/audio/listener/',
      +        'only_matching': True,
      +    }]
      +
      +    def _real_extract(self, url):
      +        lang, m_type, program_id, episode_type = self._match_valid_url(url).group('lang', 'type', 'id', 'episode_type')
      +        episodes = self._call_api(
      +            program_id, lang, m_type == 'video', False, episode_type == 'clip')
      +
      +        entries = []
      +        for episode in episodes:
      +            episode_path = episode.get('url')
      +            if not episode_path:
      +                continue
      +            entries.append(self._extract_episode_info(
      +                urljoin(url, episode_path), episode))
      +
      +        program_title = None
      +        if entries:
      +            program_title = entries[0].get('series')
      +
      +        return self.playlist_result(entries, program_id, program_title)
      +
      +
      +class NhkForSchoolBangumiIE(InfoExtractor):
      +    _VALID_URL = r'https?://www2\.nhk\.or\.jp/school/movie/(?Pbangumi|clip)\.cgi\?das_id=(?P[a-zA-Z0-9_-]+)'
      +    _TESTS = [{
      +        'url': 'https://www2.nhk.or.jp/school/movie/bangumi.cgi?das_id=D0005150191_00000',
      +        'info_dict': {
      +            'id': 'D0005150191_00003',
      +            'title': 'ã«ã¦ã„ã‚‹ ã‹ãª',
      +            'duration': 599.999,
      +            'timestamp': 1396414800,
      +
      +            'upload_date': '20140402',
      +            'ext': 'mp4',
      +
      +            'chapters': 'count:12'
      +        },
      +        'params': {
      +            # m3u8 download
      +            'skip_download': True,
      +        },
      +    }]
      +
      +    def _real_extract(self, url):
      +        program_type, video_id = self._match_valid_url(url).groups()
      +
      +        webpage = self._download_webpage(
      +            f'https://www2.nhk.or.jp/school/movie/{program_type}.cgi?das_id={video_id}', video_id)
      +
      +        # searches all variables
      +        base_values = {g.group(1): g.group(2) for g in re.finditer(r'var\s+([a-zA-Z_]+)\s*=\s*"([^"]+?)";', webpage)}
      +        # and programObj values too
      +        program_values = {g.group(1): g.group(3) for g in re.finditer(r'(?:program|clip)Obj\.([a-zA-Z_]+)\s*=\s*(["\'])([^"]+?)\2;', webpage)}
      +        # extract all chapters
      +        chapter_durations = [parse_duration(g.group(1)) for g in re.finditer(r'chapterTime\.push\(\'([0-9:]+?)\'\);', webpage)]
      +        chapter_titles = [' '.join([g.group(1) or '', unescapeHTML(g.group(2))]).strip() for g in re.finditer(r'
      (scene\s*\d+)?([^<]+?)
      ', webpage)] + + # this is how player_core.js is actually doing (!) + version = base_values.get('r_version') or program_values.get('version') + if version: + video_id = f'{video_id.split("_")[0]}_{version}' + + formats = self._extract_m3u8_formats( + f'https://nhks-vh.akamaihd.net/i/das/{video_id[0:8]}/{video_id}_V_000.f4v/master.m3u8', + video_id, ext='mp4', m3u8_id='hls') + + duration = parse_duration(base_values.get('r_duration')) + + chapters = None + if chapter_durations and chapter_titles and len(chapter_durations) == len(chapter_titles): + start_time = chapter_durations + end_time = chapter_durations[1:] + [duration] + chapters = [{ + 'start_time': s, + 'end_time': e, + 'title': t, + } for s, e, t in zip(start_time, end_time, chapter_titles)] + + return { + 'id': video_id, + 'title': program_values.get('name'), + 'duration': parse_duration(base_values.get('r_duration')), + 'timestamp': unified_timestamp(base_values['r_upload']), + 'formats': formats, + 'chapters': chapters, + } + + +class NhkForSchoolSubjectIE(InfoExtractor): + IE_DESC = 'Portal page for each school subjects, like Japanese (kokugo, 国語) or math (sansuu/suugaku or 算数・数学)' + KNOWN_SUBJECTS = ( + 'rika', 'syakai', 'kokugo', + 'sansuu', 'seikatsu', 'doutoku', + 'ongaku', 'taiiku', 'zukou', + 'gijutsu', 'katei', 'sougou', + 'eigo', 'tokkatsu', + 'tokushi', 'sonota', + ) + _VALID_URL = r'https?://www\.nhk\.or\.jp/school/(?P%s)/?(?:[\?#].*)?$' % '|'.join(re.escape(s) for s in KNOWN_SUBJECTS) + + _TESTS = [{ + 'url': 'https://www.nhk.or.jp/school/sougou/', + 'info_dict': { + 'id': 'sougou', + 'title': 'ç·åˆçš„ãªå­¦ç¿’ã®æ™‚é–“', + }, + 'playlist_mincount': 16, + }, { + 'url': 'https://www.nhk.or.jp/school/rika/', + 'info_dict': { + 'id': 'rika', + 'title': 'ç†ç§‘', + }, + 'playlist_mincount': 15, + }] + + def _real_extract(self, url): + subject_id = self._match_id(url) + webpage = self._download_webpage(url, subject_id) + + return self.playlist_from_matches( + re.finditer(rf'href="((?:https?://www\.nhk\.or\.jp)?/school/{re.escape(subject_id)}/[^/]+/)"', webpage), + subject_id, + self._html_search_regex(r'(?s)\s*\s*([^<]+?)', webpage, 'title', fatal=False), + lambda g: urljoin(url, g.group(1))) + + +class NhkForSchoolProgramListIE(InfoExtractor): + _VALID_URL = r'https?://www\.nhk\.or\.jp/school/(?P(?:%s)/[a-zA-Z0-9_-]+)' % ( + '|'.join(re.escape(s) for s in NhkForSchoolSubjectIE.KNOWN_SUBJECTS) + ) + _TESTS = [{ + 'url': 'https://www.nhk.or.jp/school/sougou/q/', + 'info_dict': { + 'id': 'sougou/q', + 'title': 'Q~ã“ã©ã‚‚ã®ãŸã‚ã®å“²å­¦', + }, + 'playlist_mincount': 20, + }] + + def _real_extract(self, url): + program_id = self._match_id(url) + + webpage = self._download_webpage(f'https://www.nhk.or.jp/school/{program_id}/', program_id) + + title = (self._generic_title('', webpage) + or self._html_search_regex(r'

      ([^<]+?)ã¨ã¯ï¼Ÿ\s*

      ', webpage, 'title', fatal=False)) + title = re.sub(r'\s*\|\s*NHK\s+for\s+School\s*$', '', title) if title else None + description = self._html_search_regex( + r'(?s)\s*

      [^<]+

      ', + webpage, 'description', fatal=False, group=0) + + bangumi_list = self._download_json( + f'https://www.nhk.or.jp/school/{program_id}/meta/program.json', program_id) + # they're always bangumi + bangumis = [ + self.url_result(f'https://www2.nhk.or.jp/school/movie/bangumi.cgi?das_id={x}') + for x in traverse_obj(bangumi_list, ('part', ..., 'part-video-dasid')) or []] + + return self.playlist_result(bangumis, program_id, title, description) + + +class NhkRadiruIE(InfoExtractor): + _GEO_COUNTRIES = ['JP'] + IE_DESC = 'NHK らã˜ã‚‹ (Radiru/Rajiru)' + _VALID_URL = r'https?://www\.nhk\.or\.jp/radio/(?:player/ondemand|ondemand/detail)\.html\?p=(?P[\da-zA-Z]+)_(?P[\da-zA-Z]+)(?:_(?P[\da-zA-Z]+))?' + _TESTS = [{ + 'url': 'https://www.nhk.or.jp/radio/player/ondemand.html?p=0449_01_3853544', + 'skip': 'Episode expired on 2023-04-16', + 'info_dict': { + 'channel': 'NHK-FM', + 'description': 'md5:94b08bdeadde81a97df4ec882acce3e9', + 'ext': 'm4a', + 'id': '0449_01_3853544', + 'series': 'ジャズ・トゥナイト', + 'thumbnail': 'https://www.nhk.or.jp/prog/img/449/g449.jpg', + 'timestamp': 1680969600, + 'title': 'ジャズ・トゥナイト NEWジャズ特集', + 'upload_date': '20230408', + 'release_timestamp': 1680962400, + 'release_date': '20230408', + 'was_live': True, + }, + }, { + # playlist, airs every weekday so it should _hopefully_ be okay forever + 'url': 'https://www.nhk.or.jp/radio/ondemand/detail.html?p=0458_01', + 'info_dict': { + 'id': '0458_01', + 'title': 'ベストオブクラシック', + 'description': '世界中ã®ä¸Šè³ªãªæ¼”å¥ä¼šã‚’ã˜ã£ãり堪能ã™ã‚‹æœ¬æ ¼æ´¾ã‚¯ãƒ©ã‚·ãƒƒã‚¯ç•ªçµ„。', + 'channel': 'NHK-FM', + 'thumbnail': 'https://www.nhk.or.jp/prog/img/458/g458.jpg', + }, + 'playlist_mincount': 3, + }, { + # one with letters in the id + 'url': 'https://www.nhk.or.jp/radio/player/ondemand.html?p=F300_06_3738470', + 'note': 'Expires on 2024-03-31', + 'info_dict': { + 'id': 'F300_06_3738470', + 'ext': 'm4a', + 'title': '有島武郎「一房ã®ãµã‚™ã¨ã‚™ã†ã€', + 'description': '朗読:å·é‡Žä¸€å®‡ï¼ˆãƒ©ã‚¸ã‚ªæ·±å¤œä¾¿ã‚¢ãƒ³ã‚«ãƒ¼ï¼‰\r\n\r\n(2016å¹´12月8日放é€ã€Œãƒ©ã‚¸ã‚ªæ·±å¤œä¾¿ã€Žã‚¢ãƒ³ã‚«ãƒ¼æœ—読シリーズã€ã€ã‚ˆã‚Šï¼‰', + 'channel': 'NHKラジオ第1ã€NHK-FM', + 'timestamp': 1635757200, + 'thumbnail': 'https://www.nhk.or.jp/radioondemand/json/F300/img/corner/box_109_thumbnail.jpg', + 'release_date': '20161207', + 'series': 'らã˜ã‚‹æ–‡åº« by ラジオ深夜便 ', + 'release_timestamp': 1481126700, + 'upload_date': '20211101', + } + }, { + # news + 'url': 'https://www.nhk.or.jp/radio/player/ondemand.html?p=F261_01_3855109', + 'skip': 'Expires on 2023-04-17', + 'info_dict': { + 'id': 'F261_01_3855109', + 'ext': 'm4a', + 'channel': 'NHKラジオ第1', + 'timestamp': 1681635900, + 'release_date': '20230416', + 'series': 'NHKラジオニュース', + 'title': 'åˆå¾Œï¼–時ã®NHKニュース', + 'thumbnail': 'https://www.nhk.or.jp/radioondemand/json/F261/img/RADIONEWS_640.jpg', + 'upload_date': '20230416', + 'release_timestamp': 1681635600, + }, + }] + + def _extract_episode_info(self, headline, programme_id, series_meta): + episode_id = f'{programme_id}_{headline["headline_id"]}' + episode = traverse_obj(headline, ('file_list', 0, {dict})) + + return { + **series_meta, + 'id': episode_id, + 'formats': self._extract_m3u8_formats(episode.get('file_name'), episode_id, fatal=False), + 'container': 'm4a_dash', # force fixup, AAC-only HLS + 'was_live': True, + 'series': series_meta.get('title'), + 'thumbnail': url_or_none(headline.get('headline_image')) or series_meta.get('thumbnail'), + **traverse_obj(episode, { + 'title': 'file_title', + 'description': 'file_title_sub', + 'timestamp': ('open_time', {unified_timestamp}), + 'release_timestamp': ('aa_vinfo4', {lambda x: x.split('_')[0]}, {unified_timestamp}), + }), + } + + def _real_extract(self, url): + site_id, corner_id, headline_id = self._match_valid_url(url).group('site', 'corner', 'headline') + programme_id = f'{site_id}_{corner_id}' + + if site_id == 'F261': + json_url = 'https://www.nhk.or.jp/s-media/news/news-site/list/v1/all.json' + else: + json_url = f'https://www.nhk.or.jp/radioondemand/json/{site_id}/bangumi_{programme_id}.json' + + meta = self._download_json(json_url, programme_id)['main'] + + series_meta = traverse_obj(meta, { + 'title': 'program_name', + 'channel': 'media_name', + 'thumbnail': (('thumbnail_c', 'thumbnail_p'), {url_or_none}), + }, get_all=False) + + if headline_id: + return self._extract_episode_info( + traverse_obj(meta, ( + 'detail_list', lambda _, v: v['headline_id'] == headline_id), get_all=False), + programme_id, series_meta) + + def entries(): + for headline in traverse_obj(meta, ('detail_list', ..., {dict})): + yield self._extract_episode_info(headline, programme_id, series_meta) + + return self.playlist_result( + entries(), programme_id, playlist_description=meta.get('site_detail'), **series_meta) + + +class NhkRadioNewsPageIE(InfoExtractor): + _VALID_URL = r'https?://www\.nhk\.or\.jp/radionews/?(?:$|[?#])' + _TESTS = [{ + # airs daily, on-the-hour most hours + 'url': 'https://www.nhk.or.jp/radionews/', + 'playlist_mincount': 5, + 'info_dict': { + 'id': 'F261_01', + 'thumbnail': 'https://www.nhk.or.jp/radioondemand/json/F261/img/RADIONEWS_640.jpg', + 'description': 'md5:bf2c5b397e44bc7eb26de98d8f15d79d', + 'channel': 'NHKラジオ第1', + 'title': 'NHKラジオニュース', + } + }] + + def _real_extract(self, url): + return self.url_result('https://www.nhk.or.jp/radio/ondemand/detail.html?p=F261_01', NhkRadiruIE) + + +class NhkRadiruLiveIE(InfoExtractor): + _GEO_COUNTRIES = ['JP'] + _VALID_URL = r'https?://www\.nhk\.or\.jp/radio/player/\?ch=(?Pr[12]|fm)' + _TESTS = [{ + # radio 1, no area specified + 'url': 'https://www.nhk.or.jp/radio/player/?ch=r1', + 'info_dict': { + 'id': 'r1-tokyo', + 'title': 're:^NHKãƒãƒƒãƒˆãƒ©ã‚¸ã‚ªç¬¬1 æ±äº¬.+$', + 'ext': 'm4a', + 'thumbnail': 'https://www.nhk.or.jp/common/img/media/r1-200x200.png', + 'live_status': 'is_live', + }, + }, { + # radio 2, area specified + # (the area doesnt actually matter, r2 is national) + 'url': 'https://www.nhk.or.jp/radio/player/?ch=r2', + 'params': {'extractor_args': {'nhkradirulive': {'area': ['fukuoka']}}}, + 'info_dict': { + 'id': 'r2-fukuoka', + 'title': 're:^NHKãƒãƒƒãƒˆãƒ©ã‚¸ã‚ªç¬¬2 ç¦å²¡.+$', + 'ext': 'm4a', + 'thumbnail': 'https://www.nhk.or.jp/common/img/media/r2-200x200.png', + 'live_status': 'is_live', + }, + }, { + # fm, area specified + 'url': 'https://www.nhk.or.jp/radio/player/?ch=fm', + 'params': {'extractor_args': {'nhkradirulive': {'area': ['sapporo']}}}, + 'info_dict': { + 'id': 'fm-sapporo', + 'title': 're:^NHKãƒãƒƒãƒˆãƒ©ã‚¸ã‚ªï¼¦ï¼­ 札幌.+$', + 'ext': 'm4a', + 'thumbnail': 'https://www.nhk.or.jp/common/img/media/fm-200x200.png', + 'live_status': 'is_live', + } + }] + + _NOA_STATION_IDS = {'r1': 'n1', 'r2': 'n2', 'fm': 'n3'} + + def _real_extract(self, url): + station = self._match_id(url) + area = self._configuration_arg('area', ['tokyo'])[0] + + config = self._download_xml( + 'https://www.nhk.or.jp/radio/config/config_web.xml', station, 'Downloading area information') + data = config.find(f'.//data//area[.="{area}"]/..') + + if not data: + raise ExtractorError('Invalid area. Valid areas are: %s' % ', '.join( + [i.text for i in config.findall('.//data//area')]), expected=True) + + noa_info = self._download_json( + f'https:{config.find(".//url_program_noa").text}'.format(area=data.find('areakey').text), + station, note=f'Downloading {area} station metadata') + present_info = traverse_obj(noa_info, ('nowonair_list', self._NOA_STATION_IDS.get(station), 'present')) + + return { + 'title': ' '.join(traverse_obj(present_info, (('service', 'area',), 'name', {str}))), + 'id': join_nonempty(station, area), + 'thumbnails': traverse_obj(present_info, ('service', 'images', ..., { + 'url': 'url', + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + })), + 'formats': self._extract_m3u8_formats(data.find(f'{station}hls').text, station), + 'is_live': True, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nhl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nhl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nhl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nhl.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nick.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nick.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nick.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nick.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/niconico.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/niconico.py new file mode 100644 index 0000000..fa2d709 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/niconico.py @@ -0,0 +1,1058 @@ +import datetime +import functools +import itertools +import json +import re +import time + +from urllib.parse import urlparse + +from .common import InfoExtractor, SearchInfoExtractor +from ..dependencies import websockets +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + OnDemandPagedList, + WebSocketsWrapper, + bug_reports_message, + clean_html, + float_or_none, + int_or_none, + join_nonempty, + parse_duration, + parse_filesize, + parse_iso8601, + parse_resolution, + qualities, + remove_start, + str_or_none, + traverse_obj, + try_get, + unescapeHTML, + update_url_query, + url_or_none, + urlencode_postdata, + urljoin, +) + + +class NiconicoIE(InfoExtractor): + IE_NAME = 'niconico' + IE_DESC = 'ニコニコ動画' + + _TESTS = [{ + 'url': 'http://www.nicovideo.jp/watch/sm22312215', + 'md5': 'd1a75c0823e2f629128c43e1212760f9', + 'info_dict': { + 'id': 'sm22312215', + 'ext': 'mp4', + 'title': 'Big Buck Bunny', + 'thumbnail': r're:https?://.*', + 'uploader': 'takuya0301', + 'uploader_id': '2698420', + 'upload_date': '20131123', + 'timestamp': int, # timestamp is unstable + 'description': '(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org', + 'duration': 33, + 'view_count': int, + 'comment_count': int, + }, + 'skip': 'Requires an account', + }, { + # File downloaded with and without credentials are different, so omit + # the md5 field + 'url': 'http://www.nicovideo.jp/watch/nm14296458', + 'info_dict': { + 'id': 'nm14296458', + 'ext': 'swf', + 'title': 'ã€é¡éŸ³ãƒªãƒ³ã€‘Dance on mediaã€ã‚ªãƒªã‚¸ãƒŠãƒ«ã€‘take2!', + 'description': 'md5:689f066d74610b3b22e0f1739add0f58', + 'thumbnail': r're:https?://.*', + 'uploader': 'りょã†ãŸ', + 'uploader_id': '18822557', + 'upload_date': '20110429', + 'timestamp': 1304065916, + 'duration': 209, + }, + 'skip': 'Requires an account', + }, { + # 'video exists but is marked as "deleted" + # md5 is unstable + 'url': 'http://www.nicovideo.jp/watch/sm10000', + 'info_dict': { + 'id': 'sm10000', + 'ext': 'unknown_video', + 'description': 'deleted', + 'title': 'ドラãˆã‚‚んエターナル第3話「決戦第3æ–°æ±äº¬å¸‚ã€ï¼œå‰ç·¨ï¼ž', + 'thumbnail': r're:https?://.*', + 'upload_date': '20071224', + 'timestamp': int, # timestamp field has different value if logged in + 'duration': 304, + 'view_count': int, + }, + 'skip': 'Requires an account', + }, { + 'url': 'http://www.nicovideo.jp/watch/so22543406', + 'info_dict': { + 'id': '1388129933', + 'ext': 'mp4', + 'title': 'ã€ç¬¬1回】RADIOアニメロミックス ラブライブï¼ï½žã®ãžãˆã‚ŠRadio Garden~', + 'description': 'md5:b27d224bb0ff53d3c8269e9f8b561cf1', + 'thumbnail': r're:https?://.*', + 'timestamp': 1388851200, + 'upload_date': '20140104', + 'uploader': 'アニメロãƒãƒ£ãƒ³ãƒãƒ«', + 'uploader_id': '312', + }, + 'skip': 'The viewing period of the video you were searching for has expired.', + }, { + # video not available via `getflv`; "old" HTML5 video + 'url': 'http://www.nicovideo.jp/watch/sm1151009', + 'md5': '8fa81c364eb619d4085354eab075598a', + 'info_dict': { + 'id': 'sm1151009', + 'ext': 'mp4', + 'title': 'マスターシステム本体内蔵ã®ã‚¹ãƒšãƒãƒªã®ãƒ¡ã‚¤ãƒ³ãƒ†ãƒ¼ãƒžï¼ˆï¼°ï¼³ï¼§ç‰ˆï¼‰', + 'description': 'md5:6ee077e0581ff5019773e2e714cdd0b7', + 'thumbnail': r're:https?://.*', + 'duration': 184, + 'timestamp': 1190868283, + 'upload_date': '20070927', + 'uploader': 'denden2', + 'uploader_id': '1392194', + 'view_count': int, + 'comment_count': int, + }, + 'skip': 'Requires an account', + }, { + # "New" HTML5 video + # md5 is unstable + 'url': 'http://www.nicovideo.jp/watch/sm31464864', + 'info_dict': { + 'id': 'sm31464864', + 'ext': 'mp4', + 'title': '新作TVアニメ「戦姫絶唱シンフォギアAXZã€PV 最高画質', + 'description': 'md5:e52974af9a96e739196b2c1ca72b5feb', + 'timestamp': 1498514060, + 'upload_date': '20170626', + 'uploader': 'ゲスト', + 'uploader_id': '40826363', + 'thumbnail': r're:https?://.*', + 'duration': 198, + 'view_count': int, + 'comment_count': int, + }, + 'skip': 'Requires an account', + }, { + # Video without owner + 'url': 'http://www.nicovideo.jp/watch/sm18238488', + 'md5': 'd265680a1f92bdcbbd2a507fc9e78a9e', + 'info_dict': { + 'id': 'sm18238488', + 'ext': 'mp4', + 'title': 'ã€å®Ÿå†™ç‰ˆã€‘ミュータントタートルズ', + 'description': 'md5:15df8988e47a86f9e978af2064bf6d8e', + 'timestamp': 1341160408, + 'upload_date': '20120701', + 'uploader': None, + 'uploader_id': None, + 'thumbnail': r're:https?://.*', + 'duration': 5271, + 'view_count': int, + 'comment_count': int, + }, + 'skip': 'Requires an account', + }, { + 'url': 'http://sp.nicovideo.jp/watch/sm28964488?ss_pos=1&cp_in=wt_tg', + 'only_matching': True, + }, { + 'note': 'a video that is only served as an ENCRYPTED HLS.', + 'url': 'https://www.nicovideo.jp/watch/so38016254', + 'only_matching': True, + }] + + _VALID_URL = r'https?://(?:(?:www\.|secure\.|sp\.)?nicovideo\.jp/watch|nico\.ms)/(?P(?:[a-z]{2})?[0-9]+)' + _NETRC_MACHINE = 'niconico' + _COMMENT_API_ENDPOINTS = ( + 'https://nvcomment.nicovideo.jp/legacy/api.json', + 'https://nmsg.nicovideo.jp/api.json',) + _API_HEADERS = { + 'X-Frontend-ID': '6', + 'X-Frontend-Version': '0', + 'X-Niconico-Language': 'en-us', + 'Referer': 'https://www.nicovideo.jp/', + 'Origin': 'https://www.nicovideo.jp', + } + + def _perform_login(self, username, password): + login_ok = True + login_form_strs = { + 'mail_tel': username, + 'password': password, + } + self._request_webpage( + 'https://account.nicovideo.jp/login', None, + note='Acquiring Login session') + page = self._download_webpage( + 'https://account.nicovideo.jp/login/redirector?show_button_twitter=1&site=niconico&show_button_facebook=1', None, + note='Logging in', errnote='Unable to log in', + data=urlencode_postdata(login_form_strs), + headers={ + 'Referer': 'https://account.nicovideo.jp/login', + 'Content-Type': 'application/x-www-form-urlencoded', + }) + if 'oneTimePw' in page: + post_url = self._search_regex( + r']+action=(["\'])(?P.+?)\1', page, 'post url', group='url') + page = self._download_webpage( + urljoin('https://account.nicovideo.jp', post_url), None, + note='Performing MFA', errnote='Unable to complete MFA', + data=urlencode_postdata({ + 'otp': self._get_tfa_info('6 digits code') + }), headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + }) + if 'oneTimePw' in page or 'formError' in page: + err_msg = self._html_search_regex( + r'formError["\']+>(.*?)', page, 'form_error', + default='There\'s an error but the message can\'t be parsed.', + flags=re.DOTALL) + self.report_warning(f'Unable to log in: MFA challenge failed, "{err_msg}"') + return False + login_ok = 'class="notice error"' not in page + if not login_ok: + self.report_warning('Unable to log in: bad username or password') + return login_ok + + def _get_heartbeat_info(self, info_dict): + video_id, video_src_id, audio_src_id = info_dict['url'].split(':')[1].split('/') + dmc_protocol = info_dict['expected_protocol'] + + api_data = ( + info_dict.get('_api_data') + or self._parse_json( + self._html_search_regex( + 'data-api-data="([^"]+)"', + self._download_webpage('https://www.nicovideo.jp/watch/' + video_id, video_id), + 'API data', default='{}'), + video_id)) + + session_api_data = try_get(api_data, lambda x: x['media']['delivery']['movie']['session']) + session_api_endpoint = try_get(session_api_data, lambda x: x['urls'][0]) + + def ping(): + tracking_id = traverse_obj(api_data, ('media', 'delivery', 'trackingId')) + if tracking_id: + tracking_url = update_url_query('https://nvapi.nicovideo.jp/v1/2ab0cbaa/watch', {'t': tracking_id}) + watch_request_response = self._download_json( + tracking_url, video_id, + note='Acquiring permission for downloading video', fatal=False, + headers=self._API_HEADERS) + if traverse_obj(watch_request_response, ('meta', 'status')) != 200: + self.report_warning('Failed to acquire permission for playing video. Video download may fail.') + + yesno = lambda x: 'yes' if x else 'no' + + if dmc_protocol == 'http': + protocol = 'http' + protocol_parameters = { + 'http_output_download_parameters': { + 'use_ssl': yesno(session_api_data['urls'][0]['isSsl']), + 'use_well_known_port': yesno(session_api_data['urls'][0]['isWellKnownPort']), + } + } + elif dmc_protocol == 'hls': + protocol = 'm3u8' + segment_duration = try_get(self._configuration_arg('segment_duration'), lambda x: int(x[0])) or 6000 + parsed_token = self._parse_json(session_api_data['token'], video_id) + encryption = traverse_obj(api_data, ('media', 'delivery', 'encryption')) + protocol_parameters = { + 'hls_parameters': { + 'segment_duration': segment_duration, + 'transfer_preset': '', + 'use_ssl': yesno(session_api_data['urls'][0]['isSsl']), + 'use_well_known_port': yesno(session_api_data['urls'][0]['isWellKnownPort']), + } + } + if 'hls_encryption' in parsed_token and encryption: + protocol_parameters['hls_parameters']['encryption'] = { + parsed_token['hls_encryption']: { + 'encrypted_key': encryption['encryptedKey'], + 'key_uri': encryption['keyUri'], + } + } + else: + protocol = 'm3u8_native' + else: + raise ExtractorError(f'Unsupported DMC protocol: {dmc_protocol}') + + session_response = self._download_json( + session_api_endpoint['url'], video_id, + query={'_format': 'json'}, + headers={'Content-Type': 'application/json'}, + note='Downloading JSON metadata for %s' % info_dict['format_id'], + data=json.dumps({ + 'session': { + 'client_info': { + 'player_id': session_api_data.get('playerId'), + }, + 'content_auth': { + 'auth_type': try_get(session_api_data, lambda x: x['authTypes'][session_api_data['protocols'][0]]), + 'content_key_timeout': session_api_data.get('contentKeyTimeout'), + 'service_id': 'nicovideo', + 'service_user_id': session_api_data.get('serviceUserId') + }, + 'content_id': session_api_data.get('contentId'), + 'content_src_id_sets': [{ + 'content_src_ids': [{ + 'src_id_to_mux': { + 'audio_src_ids': [audio_src_id], + 'video_src_ids': [video_src_id], + } + }] + }], + 'content_type': 'movie', + 'content_uri': '', + 'keep_method': { + 'heartbeat': { + 'lifetime': session_api_data.get('heartbeatLifetime') + } + }, + 'priority': session_api_data['priority'], + 'protocol': { + 'name': 'http', + 'parameters': { + 'http_parameters': { + 'parameters': protocol_parameters + } + } + }, + 'recipe_id': session_api_data.get('recipeId'), + 'session_operation_auth': { + 'session_operation_auth_by_signature': { + 'signature': session_api_data.get('signature'), + 'token': session_api_data.get('token'), + } + }, + 'timing_constraint': 'unlimited' + } + }).encode()) + + info_dict['url'] = session_response['data']['session']['content_uri'] + info_dict['protocol'] = protocol + + # get heartbeat info + heartbeat_info_dict = { + 'url': session_api_endpoint['url'] + '/' + session_response['data']['session']['id'] + '?_format=json&_method=PUT', + 'data': json.dumps(session_response['data']), + # interval, convert milliseconds to seconds, then halve to make a buffer. + 'interval': float_or_none(session_api_data.get('heartbeatLifetime'), scale=3000), + 'ping': ping + } + + return info_dict, heartbeat_info_dict + + def _extract_format_for_quality(self, video_id, audio_quality, video_quality, dmc_protocol): + + if not audio_quality.get('isAvailable') or not video_quality.get('isAvailable'): + return None + + def extract_video_quality(video_quality): + return parse_filesize('%sB' % self._search_regex( + r'\| ([0-9]*\.?[0-9]*[MK])', video_quality, 'vbr', default='')) + + format_id = '-'.join( + [remove_start(s['id'], 'archive_') for s in (video_quality, audio_quality)] + [dmc_protocol]) + + vid_qual_label = traverse_obj(video_quality, ('metadata', 'label')) + vid_quality = traverse_obj(video_quality, ('metadata', 'bitrate')) + + return { + 'url': 'niconico_dmc:%s/%s/%s' % (video_id, video_quality['id'], audio_quality['id']), + 'format_id': format_id, + 'format_note': join_nonempty('DMC', vid_qual_label, dmc_protocol.upper(), delim=' '), + 'ext': 'mp4', # Session API are used in HTML5, which always serves mp4 + 'acodec': 'aac', + 'vcodec': 'h264', + 'abr': float_or_none(traverse_obj(audio_quality, ('metadata', 'bitrate')), 1000), + 'vbr': float_or_none(vid_quality if vid_quality > 0 else extract_video_quality(vid_qual_label), 1000), + 'height': traverse_obj(video_quality, ('metadata', 'resolution', 'height')), + 'width': traverse_obj(video_quality, ('metadata', 'resolution', 'width')), + 'quality': -2 if 'low' in video_quality['id'] else None, + 'protocol': 'niconico_dmc', + 'expected_protocol': dmc_protocol, # XXX: This is not a documented field + 'http_headers': { + 'Origin': 'https://www.nicovideo.jp', + 'Referer': 'https://www.nicovideo.jp/watch/' + video_id, + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + try: + webpage, handle = self._download_webpage_handle( + 'https://www.nicovideo.jp/watch/' + video_id, video_id) + if video_id.startswith('so'): + video_id = self._match_id(handle.url) + + api_data = self._parse_json(self._html_search_regex( + 'data-api-data="([^"]+)"', webpage, + 'API data', default='{}'), video_id) + except ExtractorError as e: + try: + api_data = self._download_json( + 'https://www.nicovideo.jp/api/watch/v3/%s?_frontendId=6&_frontendVersion=0&actionTrackId=AAAAAAAAAA_%d' % (video_id, round(time.time() * 1000)), video_id, + note='Downloading API JSON', errnote='Unable to fetch data')['data'] + except ExtractorError: + if not isinstance(e.cause, HTTPError): + raise + webpage = e.cause.response.read().decode('utf-8', 'replace') + error_msg = self._html_search_regex( + r'(?s)(.+?)', + webpage, 'error reason', default=None) + if not error_msg: + raise + raise ExtractorError(re.sub(r'\s+', ' ', error_msg), expected=True) + + formats = [] + + def get_video_info(*items, get_first=True, **kwargs): + return traverse_obj(api_data, ('video', *items), get_all=not get_first, **kwargs) + + quality_info = api_data['media']['delivery']['movie'] + session_api_data = quality_info['session'] + for (audio_quality, video_quality, protocol) in itertools.product(quality_info['audios'], quality_info['videos'], session_api_data['protocols']): + fmt = self._extract_format_for_quality(video_id, audio_quality, video_quality, protocol) + if fmt: + formats.append(fmt) + + # Start extracting information + tags = None + if webpage: + # use og:video:tag (not logged in) + og_video_tags = re.finditer(r'', webpage) + tags = list(filter(None, (clean_html(x.group(1)) for x in og_video_tags))) + if not tags: + # use keywords and split with comma (not logged in) + kwds = self._html_search_meta('keywords', webpage, default=None) + if kwds: + tags = [x for x in kwds.split(',') if x] + if not tags: + # find in json (logged in) + tags = traverse_obj(api_data, ('tag', 'items', ..., 'name')) + + thumb_prefs = qualities(['url', 'middleUrl', 'largeUrl', 'player', 'ogp']) + + return { + 'id': video_id, + '_api_data': api_data, + 'title': get_video_info(('originalTitle', 'title')) or self._og_search_title(webpage, default=None), + 'formats': formats, + 'thumbnails': [{ + 'id': key, + 'url': url, + 'ext': 'jpg', + 'preference': thumb_prefs(key), + **parse_resolution(url, lenient=True), + } for key, url in (get_video_info('thumbnail') or {}).items() if url], + 'description': clean_html(get_video_info('description')), + 'uploader': traverse_obj(api_data, ('owner', 'nickname'), ('channel', 'name'), ('community', 'name')), + 'uploader_id': str_or_none(traverse_obj(api_data, ('owner', 'id'), ('channel', 'id'), ('community', 'id'))), + 'timestamp': parse_iso8601(get_video_info('registeredAt')) or parse_iso8601( + self._html_search_meta('video:release_date', webpage, 'date published', default=None)), + 'channel': traverse_obj(api_data, ('channel', 'name'), ('community', 'name')), + 'channel_id': traverse_obj(api_data, ('channel', 'id'), ('community', 'id')), + 'view_count': int_or_none(get_video_info('count', 'view')), + 'tags': tags, + 'genre': traverse_obj(api_data, ('genre', 'label'), ('genre', 'key')), + 'comment_count': get_video_info('count', 'comment', expected_type=int), + 'duration': ( + parse_duration(self._html_search_meta('video:duration', webpage, 'video duration', default=None)) + or get_video_info('duration')), + 'webpage_url': url_or_none(url) or f'https://www.nicovideo.jp/watch/{video_id}', + 'subtitles': self.extract_subtitles(video_id, api_data, session_api_data), + } + + def _get_subtitles(self, video_id, api_data, session_api_data): + comment_user_key = traverse_obj(api_data, ('comment', 'keys', 'userKey')) + user_id_str = session_api_data.get('serviceUserId') + + thread_ids = traverse_obj(api_data, ('comment', 'threads', lambda _, v: v['isActive'])) + legacy_danmaku = self._extract_legacy_comments(video_id, thread_ids, user_id_str, comment_user_key) or [] + + new_comments = traverse_obj(api_data, ('comment', 'nvComment')) + new_danmaku = self._extract_new_comments( + new_comments.get('server'), video_id, + new_comments.get('params'), new_comments.get('threadKey')) + + if not legacy_danmaku and not new_danmaku: + self.report_warning(f'Failed to get comments. {bug_reports_message()}') + return + + return { + 'comments': [{ + 'ext': 'json', + 'data': json.dumps(legacy_danmaku + new_danmaku), + }], + } + + def _extract_legacy_comments(self, video_id, threads, user_id, user_key): + auth_data = { + 'user_id': user_id, + 'userkey': user_key, + } if user_id and user_key else {'user_id': ''} + + api_url = traverse_obj(threads, (..., 'server'), get_all=False) + + # Request Start + post_data = [{'ping': {'content': 'rs:0'}}] + for i, thread in enumerate(threads): + thread_id = thread['id'] + thread_fork = thread['fork'] + # Post Start (2N) + post_data.append({'ping': {'content': f'ps:{i * 2}'}}) + post_data.append({'thread': { + 'fork': thread_fork, + 'language': 0, + 'nicoru': 3, + 'scores': 1, + 'thread': thread_id, + 'version': '20090904', + 'with_global': 1, + **auth_data, + }}) + # Post Final (2N) + post_data.append({'ping': {'content': f'pf:{i * 2}'}}) + + # Post Start (2N+1) + post_data.append({'ping': {'content': f'ps:{i * 2 + 1}'}}) + post_data.append({'thread_leaves': { + # format is '-:,\d+)' + + _TESTS = [{ + 'url': 'http://www.nicovideo.jp/mylist/27411728', + 'info_dict': { + 'id': '27411728', + 'title': 'AKB48ã®ã‚ªãƒ¼ãƒ«ãƒŠã‚¤ãƒˆãƒ‹ãƒƒãƒãƒ³', + 'description': 'md5:d89694c5ded4b6c693dea2db6e41aa08', + 'uploader': 'ã®ã£ã', + 'uploader_id': '805442', + }, + 'playlist_mincount': 291, + }, { + 'url': 'https://www.nicovideo.jp/user/805442/mylist/27411728', + 'only_matching': True, + }, { + 'url': 'https://www.nicovideo.jp/my/mylist/#/68048635', + 'only_matching': True, + }] + + def _call_api(self, list_id, resource, query): + return self._download_json( + f'https://nvapi.nicovideo.jp/v2/mylists/{list_id}', list_id, + f'Downloading {resource}', query=query, + headers=self._API_HEADERS)['data']['mylist'] + + def _real_extract(self, url): + list_id = self._match_id(url) + mylist = self._call_api(list_id, 'list', { + 'pageSize': 1, + }) + return self.playlist_result( + self._entries(list_id), list_id, + mylist.get('name'), mylist.get('description'), **self._parse_owner(mylist)) + + +class NiconicoSeriesIE(InfoExtractor): + IE_NAME = 'niconico:series' + _VALID_URL = r'https?://(?:(?:www\.|sp\.)?nicovideo\.jp(?:/user/\d+)?|nico\.ms)/series/(?P\d+)' + + _TESTS = [{ + 'url': 'https://www.nicovideo.jp/user/44113208/series/110226', + 'info_dict': { + 'id': '110226', + 'title': 'ã”立派ァï¼ã®ã‚·ãƒªãƒ¼ã‚º', + }, + 'playlist_mincount': 10, + }, { + 'url': 'https://www.nicovideo.jp/series/12312/', + 'info_dict': { + 'id': '12312', + 'title': 'ãƒãƒˆãƒ«ã‚¹ãƒ”リッツ ãŠå‹§ã‚カード紹介(調整中)', + }, + 'playlist_mincount': 103, + }, { + 'url': 'https://nico.ms/series/203559', + 'only_matching': True, + }] + + def _real_extract(self, url): + list_id = self._match_id(url) + webpage = self._download_webpage(url, list_id) + + title = self._search_regex( + (r'「(.+)(全', + r'<div class="TwitterShareButton"\s+data-text="(.+)\s+https:'), + webpage, 'title', fatal=False) + if title: + title = unescapeHTML(title) + json_data = next(self._yield_json_ld(webpage, None, fatal=False)) + return self.playlist_from_matches( + traverse_obj(json_data, ('itemListElement', ..., 'url')), list_id, title, ie=NiconicoIE) + + +class NiconicoHistoryIE(NiconicoPlaylistBaseIE): + IE_NAME = 'niconico:history' + IE_DESC = 'NicoNico user history or likes. Requires cookies.' + _VALID_URL = r'https?://(?:www\.|sp\.)?nicovideo\.jp/my/(?P<id>history(?:/like)?)' + + _TESTS = [{ + 'note': 'PC page, with /video', + 'url': 'https://www.nicovideo.jp/my/history/video', + 'only_matching': True, + }, { + 'note': 'PC page, without /video', + 'url': 'https://www.nicovideo.jp/my/history', + 'only_matching': True, + }, { + 'note': 'mobile page, with /video', + 'url': 'https://sp.nicovideo.jp/my/history/video', + 'only_matching': True, + }, { + 'note': 'mobile page, without /video', + 'url': 'https://sp.nicovideo.jp/my/history', + 'only_matching': True, + }, { + 'note': 'PC page', + 'url': 'https://www.nicovideo.jp/my/history/like', + 'only_matching': True, + }, { + 'note': 'Mobile page', + 'url': 'https://sp.nicovideo.jp/my/history/like', + 'only_matching': True, + }] + + def _call_api(self, list_id, resource, query): + path = 'likes' if list_id == 'history/like' else 'watch/history' + return self._download_json( + f'https://nvapi.nicovideo.jp/v1/users/me/{path}', list_id, + f'Downloading {resource}', query=query, headers=self._API_HEADERS)['data'] + + def _real_extract(self, url): + list_id = self._match_id(url) + try: + mylist = self._call_api(list_id, 'list', {'pageSize': 1}) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + self.raise_login_required('You have to be logged in to get your history') + raise + return self.playlist_result(self._entries(list_id), list_id, **self._parse_owner(mylist)) + + +class NicovideoSearchBaseIE(InfoExtractor): + _SEARCH_TYPE = 'search' + + def _entries(self, url, item_id, query=None, note='Downloading page %(page)s'): + query = query or {} + pages = [query['page']] if 'page' in query else itertools.count(1) + for page_num in pages: + query['page'] = str(page_num) + webpage = self._download_webpage(url, item_id, query=query, note=note % {'page': page_num}) + results = re.findall(r'(?<=data-video-id=)["\']?(?P<videoid>.*?)(?=["\'])', webpage) + for item in results: + yield self.url_result(f'https://www.nicovideo.jp/watch/{item}', 'Niconico', item) + if not results: + break + + def _search_results(self, query): + return self._entries( + self._proto_relative_url(f'//www.nicovideo.jp/{self._SEARCH_TYPE}/{query}'), query) + + +class NicovideoSearchIE(NicovideoSearchBaseIE, SearchInfoExtractor): + IE_DESC = 'Nico video search' + IE_NAME = 'nicovideo:search' + _SEARCH_KEY = 'nicosearch' + + +class NicovideoSearchURLIE(NicovideoSearchBaseIE): + IE_NAME = f'{NicovideoSearchIE.IE_NAME}_url' + IE_DESC = 'Nico video search URLs' + _VALID_URL = r'https?://(?:www\.)?nicovideo\.jp/search/(?P<id>[^?#&]+)?' + _TESTS = [{ + 'url': 'http://www.nicovideo.jp/search/sm9', + 'info_dict': { + 'id': 'sm9', + 'title': 'sm9' + }, + 'playlist_mincount': 40, + }, { + 'url': 'https://www.nicovideo.jp/search/sm9?sort=h&order=d&end=2020-12-31&start=2020-01-01', + 'info_dict': { + 'id': 'sm9', + 'title': 'sm9' + }, + 'playlist_count': 31, + }] + + def _real_extract(self, url): + query = self._match_id(url) + return self.playlist_result(self._entries(url, query), query, query) + + +class NicovideoSearchDateIE(NicovideoSearchBaseIE, SearchInfoExtractor): + IE_DESC = 'Nico video search, newest first' + IE_NAME = f'{NicovideoSearchIE.IE_NAME}:date' + _SEARCH_KEY = 'nicosearchdate' + _TESTS = [{ + 'url': 'nicosearchdateall:a', + 'info_dict': { + 'id': 'a', + 'title': 'a' + }, + 'playlist_mincount': 1610, + }] + + _START_DATE = datetime.date(2007, 1, 1) + _RESULTS_PER_PAGE = 32 + _MAX_PAGES = 50 + + def _entries(self, url, item_id, start_date=None, end_date=None): + start_date, end_date = start_date or self._START_DATE, end_date or datetime.datetime.now().date() + + # If the last page has a full page of videos, we need to break down the query interval further + last_page_len = len(list(self._get_entries_for_date( + url, item_id, start_date, end_date, self._MAX_PAGES, + note=f'Checking number of videos from {start_date} to {end_date}'))) + if (last_page_len == self._RESULTS_PER_PAGE and start_date != end_date): + midpoint = start_date + ((end_date - start_date) // 2) + yield from self._entries(url, item_id, midpoint, end_date) + yield from self._entries(url, item_id, start_date, midpoint) + else: + self.to_screen(f'{item_id}: Downloading results from {start_date} to {end_date}') + yield from self._get_entries_for_date( + url, item_id, start_date, end_date, note=' Downloading page %(page)s') + + def _get_entries_for_date(self, url, item_id, start_date, end_date=None, page_num=None, note=None): + query = { + 'start': str(start_date), + 'end': str(end_date or start_date), + 'sort': 'f', + 'order': 'd', + } + if page_num: + query['page'] = str(page_num) + + yield from super()._entries(url, item_id, query=query, note=note) + + +class NicovideoTagURLIE(NicovideoSearchBaseIE): + IE_NAME = 'niconico:tag' + IE_DESC = 'NicoNico video tag URLs' + _SEARCH_TYPE = 'tag' + _VALID_URL = r'https?://(?:www\.)?nicovideo\.jp/tag/(?P<id>[^?#&]+)?' + _TESTS = [{ + 'url': 'https://www.nicovideo.jp/tag/ドキュメンタリー淫夢', + 'info_dict': { + 'id': 'ドキュメンタリー淫夢', + 'title': 'ドキュメンタリー淫夢' + }, + 'playlist_mincount': 400, + }] + + def _real_extract(self, url): + query = self._match_id(url) + return self.playlist_result(self._entries(url, query), query, query) + + +class NiconicoUserIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?nicovideo\.jp/user/(?P<id>\d+)/?(?:$|[#?])' + _TEST = { + 'url': 'https://www.nicovideo.jp/user/419948', + 'info_dict': { + 'id': '419948', + }, + 'playlist_mincount': 101, + } + _API_URL = "https://nvapi.nicovideo.jp/v1/users/%s/videos?sortKey=registeredAt&sortOrder=desc&pageSize=%s&page=%s" + _PAGE_SIZE = 100 + + _API_HEADERS = { + 'X-Frontend-ID': '6', + 'X-Frontend-Version': '0' + } + + def _entries(self, list_id): + total_count = 1 + count = page_num = 0 + while count < total_count: + json_parsed = self._download_json( + self._API_URL % (list_id, self._PAGE_SIZE, page_num + 1), list_id, + headers=self._API_HEADERS, + note='Downloading JSON metadata%s' % (' page %d' % page_num if page_num else '')) + if not page_num: + total_count = int_or_none(json_parsed['data'].get('totalCount')) + for entry in json_parsed["data"]["items"]: + count += 1 + yield self.url_result('https://www.nicovideo.jp/watch/%s' % entry['id']) + page_num += 1 + + def _real_extract(self, url): + list_id = self._match_id(url) + return self.playlist_result(self._entries(list_id), list_id, ie=NiconicoIE.ie_key()) + + +class NiconicoLiveIE(InfoExtractor): + IE_NAME = 'niconico:live' + IE_DESC = 'ニコニコ生放é€' + _VALID_URL = r'https?://(?:sp\.)?live2?\.nicovideo\.jp/(?:watch|gate)/(?P<id>lv\d+)' + _TESTS = [{ + 'note': 'this test case includes invisible characters for title, pasting them as-is', + 'url': 'https://live.nicovideo.jp/watch/lv339533123', + 'info_dict': { + 'id': 'lv339533123', + 'title': '激辛ペヤング食ã¹ã¾ã™â€ª( ;ᯅ; )‬(歌枠オーディションå‚加中)', + 'view_count': 1526, + 'comment_count': 1772, + 'description': 'åˆã‚ã¾ã—ã¦ã‚‚ã‹ã£ã¦è¨€ã„ã¾ã™â•\nã®ã‚“ã³ã‚Šè‡ªç”±ã«é©å½“ã«æš®ã‚‰ã—ã¦ã¾ã™', + 'uploader': 'ã‚‚ã‹', + 'channel': 'ゲストã•ã‚“ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£', + 'channel_id': 'co5776900', + 'channel_url': 'https://com.nicovideo.jp/community/co5776900', + 'timestamp': 1670677328, + 'is_live': True, + }, + 'skip': 'livestream', + }, { + 'url': 'https://live2.nicovideo.jp/watch/lv339533123', + 'only_matching': True, + }, { + 'url': 'https://sp.live.nicovideo.jp/watch/lv339533123', + 'only_matching': True, + }, { + 'url': 'https://sp.live2.nicovideo.jp/watch/lv339533123', + 'only_matching': True, + }] + + _KNOWN_LATENCY = ('high', 'low') + + def _real_extract(self, url): + if not websockets: + raise ExtractorError('websockets library is not available. Please install it.', expected=True) + video_id = self._match_id(url) + webpage, urlh = self._download_webpage_handle(f'https://live.nicovideo.jp/watch/{video_id}', video_id) + + embedded_data = self._parse_json(unescapeHTML(self._search_regex( + r'<script\s+id="embedded-data"\s*data-props="(.+?)"', webpage, 'embedded data')), video_id) + + ws_url = traverse_obj(embedded_data, ('site', 'relive', 'webSocketUrl')) + if not ws_url: + raise ExtractorError('The live hasn\'t started yet or already ended.', expected=True) + ws_url = update_url_query(ws_url, { + 'frontend_id': traverse_obj(embedded_data, ('site', 'frontendId')) or '9', + }) + + hostname = remove_start(urlparse(urlh.url).hostname, 'sp.') + cookies = try_get(urlh.url, self._downloader._calc_cookies) + latency = try_get(self._configuration_arg('latency'), lambda x: x[0]) + if latency not in self._KNOWN_LATENCY: + latency = 'high' + + ws = WebSocketsWrapper(ws_url, { + 'Cookies': str_or_none(cookies) or '', + 'Origin': f'https://{hostname}', + 'Accept': '*/*', + 'User-Agent': self.get_param('http_headers')['User-Agent'], + }) + + self.write_debug('[debug] Sending HLS server request') + ws.send(json.dumps({ + 'type': 'startWatching', + 'data': { + 'stream': { + 'quality': 'abr', + 'protocol': 'hls+fmp4', + 'latency': latency, + 'chasePlay': False + }, + 'room': { + 'protocol': 'webSocket', + 'commentable': True + }, + 'reconnect': False, + } + })) + + while True: + recv = ws.recv() + if not recv: + continue + data = json.loads(recv) + if not isinstance(data, dict): + continue + if data.get('type') == 'stream': + m3u8_url = data['data']['uri'] + qualities = data['data']['availableQualities'] + break + elif data.get('type') == 'disconnect': + self.write_debug(recv) + raise ExtractorError('Disconnected at middle of extraction') + elif data.get('type') == 'error': + self.write_debug(recv) + message = traverse_obj(data, ('body', 'code')) or recv + raise ExtractorError(message) + elif self.get_param('verbose', False): + if len(recv) > 100: + recv = recv[:100] + '...' + self.write_debug('Server said: %s' % recv) + + title = traverse_obj(embedded_data, ('program', 'title')) or self._html_search_meta( + ('og:title', 'twitter:title'), webpage, 'live title', fatal=False) + + raw_thumbs = traverse_obj(embedded_data, ('program', 'thumbnail')) or {} + thumbnails = [] + for name, value in raw_thumbs.items(): + if not isinstance(value, dict): + thumbnails.append({ + 'id': name, + 'url': value, + **parse_resolution(value, lenient=True), + }) + continue + + for k, img_url in value.items(): + res = parse_resolution(k, lenient=True) or parse_resolution(img_url, lenient=True) + width, height = res.get('width'), res.get('height') + + thumbnails.append({ + 'id': f'{name}_{width}x{height}', + 'url': img_url, + **res, + }) + + formats = self._extract_m3u8_formats(m3u8_url, video_id, ext='mp4', live=True) + for fmt, q in zip(formats, reversed(qualities[1:])): + fmt.update({ + 'format_id': q, + 'protocol': 'niconico_live', + 'ws': ws, + 'video_id': video_id, + 'cookies': cookies, + 'live_latency': latency, + 'origin': hostname, + }) + + return { + 'id': video_id, + 'title': title, + **traverse_obj(embedded_data, { + 'view_count': ('program', 'statistics', 'watchCount'), + 'comment_count': ('program', 'statistics', 'commentCount'), + 'uploader': ('program', 'supplier', 'name'), + 'channel': ('socialGroup', 'name'), + 'channel_id': ('socialGroup', 'id'), + 'channel_url': ('socialGroup', 'socialGroupPageUrl'), + }), + 'description': clean_html(traverse_obj(embedded_data, ('program', 'description'))), + 'timestamp': int_or_none(traverse_obj(embedded_data, ('program', 'openTime'))), + 'is_live': True, + 'thumbnails': thumbnails, + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/niconicochannelplus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/niconicochannelplus.py new file mode 100644 index 0000000..89af3f7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/niconicochannelplus.py @@ -0,0 +1,426 @@ +import functools +import json + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + OnDemandPagedList, + filter_dict, + int_or_none, + parse_qs, + str_or_none, + traverse_obj, + unified_timestamp, + url_or_none, +) + + +class NiconicoChannelPlusBaseIE(InfoExtractor): + _WEBPAGE_BASE_URL = 'https://nicochannel.jp' + + def _call_api(self, path, item_id, *args, **kwargs): + return self._download_json( + f'https://nfc-api.nicochannel.jp/fc/{path}', video_id=item_id, *args, **kwargs) + + def _find_fanclub_site_id(self, channel_name): + fanclub_list_json = self._call_api( + 'content_providers/channels', item_id=f'channels/{channel_name}', + note='Fetching channel list', errnote='Unable to fetch channel list', + )['data']['content_providers'] + fanclub_id = traverse_obj(fanclub_list_json, ( + lambda _, v: v['domain'] == f'{self._WEBPAGE_BASE_URL}/{channel_name}', 'id'), + get_all=False) + if not fanclub_id: + raise ExtractorError(f'Channel {channel_name} does not exist', expected=True) + return fanclub_id + + def _get_channel_base_info(self, fanclub_site_id): + return traverse_obj(self._call_api( + f'fanclub_sites/{fanclub_site_id}/page_base_info', item_id=f'fanclub_sites/{fanclub_site_id}', + note='Fetching channel base info', errnote='Unable to fetch channel base info', fatal=False, + ), ('data', 'fanclub_site', {dict})) or {} + + def _get_channel_user_info(self, fanclub_site_id): + return traverse_obj(self._call_api( + f'fanclub_sites/{fanclub_site_id}/user_info', item_id=f'fanclub_sites/{fanclub_site_id}', + note='Fetching channel user info', errnote='Unable to fetch channel user info', fatal=False, + data=json.dumps('null').encode('ascii'), + ), ('data', 'fanclub_site', {dict})) or {} + + +class NiconicoChannelPlusIE(NiconicoChannelPlusBaseIE): + IE_NAME = 'NiconicoChannelPlus' + IE_DESC = 'ニコニコãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラス' + _VALID_URL = r'https?://nicochannel\.jp/(?P<channel>[\w.-]+)/(?:video|live)/(?P<code>sm\w+)' + _TESTS = [{ + 'url': 'https://nicochannel.jp/kaorin/video/smsDd8EdFLcVZk9yyAhD6H7H', + 'info_dict': { + 'id': 'smsDd8EdFLcVZk9yyAhD6H7H', + 'title': 'å‰ç”°ä½³ç¹”里ã¯ãƒ‹ã‚³ç”ŸãŒã—ãŸã„ï¼', + 'ext': 'mp4', + 'channel': 'å‰ç”°ä½³ç¹”里ã®ä¸–界攻略計画', + 'channel_id': 'kaorin', + 'channel_url': 'https://nicochannel.jp/kaorin', + 'live_status': 'not_live', + 'thumbnail': 'https://nicochannel.jp/public_html/contents/video_pages/74/thumbnail_path', + 'description': 'ï¼’ï¼ï¼’ï¼‘å¹´ï¼‘ï¼‘æœˆã«æ”¾é€ã•れãŸ\n「å‰ç”°ä½³ç¹”里ã¯ãƒ‹ã‚³ç”ŸãŒã—ãŸã„ï¼ã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã«ãªã‚Šã¾ã™ã€‚', + 'timestamp': 1641360276, + 'duration': 4097, + 'comment_count': int, + 'view_count': int, + 'tags': [], + 'upload_date': '20220105', + }, + 'params': { + 'skip_download': True, + }, + }, { + # age limited video; test purpose channel. + 'url': 'https://nicochannel.jp/testman/video/smDXbcrtyPNxLx9jc4BW69Ve', + 'info_dict': { + 'id': 'smDXbcrtyPNxLx9jc4BW69Ve', + 'title': 'test oshiro', + 'ext': 'mp4', + 'channel': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン', + 'channel_id': 'testman', + 'channel_url': 'https://nicochannel.jp/testman', + 'age_limit': 18, + 'live_status': 'was_live', + 'timestamp': 1666344616, + 'duration': 86465, + 'comment_count': int, + 'view_count': int, + 'tags': [], + 'upload_date': '20221021', + }, + 'params': { + 'skip_download': True, + }, + }] + + def _real_extract(self, url): + content_code, channel_id = self._match_valid_url(url).group('code', 'channel') + fanclub_site_id = self._find_fanclub_site_id(channel_id) + + data_json = self._call_api( + f'video_pages/{content_code}', item_id=content_code, headers={'fc_use_device': 'null'}, + note='Fetching video page info', errnote='Unable to fetch video page info', + )['data']['video_page'] + + live_status, session_id = self._get_live_status_and_session_id(content_code, data_json) + + release_timestamp_str = data_json.get('live_scheduled_start_at') + + formats = [] + + if live_status == 'is_upcoming': + if release_timestamp_str: + msg = f'This live event will begin at {release_timestamp_str} UTC' + else: + msg = 'This event has not started yet' + self.raise_no_formats(msg, expected=True, video_id=content_code) + else: + formats = self._extract_m3u8_formats( + # "authenticated_url" is a format string that contains "{session_id}". + m3u8_url=data_json['video_stream']['authenticated_url'].format(session_id=session_id), + video_id=content_code) + + return { + 'id': content_code, + 'formats': formats, + '_format_sort_fields': ('tbr', 'vcodec', 'acodec'), + 'channel': self._get_channel_base_info(fanclub_site_id).get('fanclub_site_name'), + 'channel_id': channel_id, + 'channel_url': f'{self._WEBPAGE_BASE_URL}/{channel_id}', + 'age_limit': traverse_obj(self._get_channel_user_info(fanclub_site_id), ('content_provider', 'age_limit')), + 'live_status': live_status, + 'release_timestamp': unified_timestamp(release_timestamp_str), + **traverse_obj(data_json, { + 'title': ('title', {str}), + 'thumbnail': ('thumbnail_url', {url_or_none}), + 'description': ('description', {str}), + 'timestamp': ('released_at', {unified_timestamp}), + 'duration': ('active_video_filename', 'length', {int_or_none}), + 'comment_count': ('video_aggregate_info', 'number_of_comments', {int_or_none}), + 'view_count': ('video_aggregate_info', 'total_views', {int_or_none}), + 'tags': ('video_tags', ..., 'tag', {str}), + }), + '__post_extractor': self.extract_comments( + content_code=content_code, + comment_group_id=traverse_obj(data_json, ('video_comment_setting', 'comment_group_id'))), + } + + def _get_comments(self, content_code, comment_group_id): + item_id = f'{content_code}/comments' + + if not comment_group_id: + return None + + comment_access_token = self._call_api( + f'video_pages/{content_code}/comments_user_token', item_id, + note='Getting comment token', errnote='Unable to get comment token', + )['data']['access_token'] + + comment_list = self._download_json( + 'https://comm-api.sheeta.com/messages.history', video_id=item_id, + note='Fetching comments', errnote='Unable to fetch comments', + headers={'Content-Type': 'application/json'}, + query={ + 'sort_direction': 'asc', + 'limit': int_or_none(self._configuration_arg('max_comments', [''])[0]) or 120, + }, + data=json.dumps({ + 'token': comment_access_token, + 'group_id': comment_group_id, + }).encode('ascii')) + + for comment in traverse_obj(comment_list, ...): + yield traverse_obj(comment, { + 'author': ('nickname', {str}), + 'author_id': ('sender_id', {str_or_none}), + 'id': ('id', {str_or_none}), + 'text': ('message', {str}), + 'timestamp': (('updated_at', 'sent_at', 'created_at'), {unified_timestamp}), + 'author_is_uploader': ('sender_id', {lambda x: x == '-1'}), + }, get_all=False) + + def _get_live_status_and_session_id(self, content_code, data_json): + video_type = data_json.get('type') + live_finished_at = data_json.get('live_finished_at') + + payload = {} + if video_type == 'vod': + if live_finished_at: + live_status = 'was_live' + else: + live_status = 'not_live' + elif video_type == 'live': + if not data_json.get('live_started_at'): + return 'is_upcoming', '' + + if not live_finished_at: + live_status = 'is_live' + else: + live_status = 'was_live' + payload = {'broadcast_type': 'dvr'} + + video_allow_dvr_flg = traverse_obj(data_json, ('video', 'allow_dvr_flg')) + video_convert_to_vod_flg = traverse_obj(data_json, ('video', 'convert_to_vod_flg')) + + self.write_debug(f'allow_dvr_flg = {video_allow_dvr_flg}, convert_to_vod_flg = {video_convert_to_vod_flg}.') + + if not (video_allow_dvr_flg and video_convert_to_vod_flg): + raise ExtractorError( + 'Live was ended, there is no video for download.', video_id=content_code, expected=True) + else: + raise ExtractorError(f'Unknown type: {video_type}', video_id=content_code, expected=False) + + self.write_debug(f'{content_code}: video_type={video_type}, live_status={live_status}') + + session_id = self._call_api( + f'video_pages/{content_code}/session_ids', item_id=f'{content_code}/session', + data=json.dumps(payload).encode('ascii'), headers={ + 'Content-Type': 'application/json', + 'fc_use_device': 'null', + 'origin': 'https://nicochannel.jp', + }, + note='Getting session id', errnote='Unable to get session id', + )['data']['session_id'] + + return live_status, session_id + + +class NiconicoChannelPlusChannelBaseIE(NiconicoChannelPlusBaseIE): + _PAGE_SIZE = 12 + + def _fetch_paged_channel_video_list(self, path, query, channel_name, item_id, page): + response = self._call_api( + path, item_id, query={ + **query, + 'page': (page + 1), + 'per_page': self._PAGE_SIZE, + }, + headers={'fc_use_device': 'null'}, + note=f'Getting channel info (page {page + 1})', + errnote=f'Unable to get channel info (page {page + 1})') + + for content_code in traverse_obj(response, ('data', 'video_pages', 'list', ..., 'content_code')): + # "video/{content_code}" works for both VOD and live, but "live/{content_code}" doesn't work for VOD + yield self.url_result( + f'{self._WEBPAGE_BASE_URL}/{channel_name}/video/{content_code}', NiconicoChannelPlusIE) + + +class NiconicoChannelPlusChannelVideosIE(NiconicoChannelPlusChannelBaseIE): + IE_NAME = 'NiconicoChannelPlus:channel:videos' + IE_DESC = 'ニコニコãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラス - ãƒãƒ£ãƒ³ãƒãƒ« - 動画リスト. nicochannel.jp/channel/videos' + _VALID_URL = r'https?://nicochannel\.jp/(?P<id>[a-z\d\._-]+)/videos(?:\?.*)?' + _TESTS = [{ + # query: None + 'url': 'https://nicochannel.jp/testman/videos', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 18, + }, { + # query: None + 'url': 'https://nicochannel.jp/testtarou/videos', + 'info_dict': { + 'id': 'testtarou-videos', + 'title': 'ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステスト太郎-videos', + }, + 'playlist_mincount': 2, + }, { + # query: None + 'url': 'https://nicochannel.jp/testjirou/videos', + 'info_dict': { + 'id': 'testjirou-videos', + 'title': 'ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステスト二郎-videos', + }, + 'playlist_mincount': 12, + }, { + # query: tag + 'url': 'https://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 6, + }, { + # query: vodType + 'url': 'https://nicochannel.jp/testman/videos?vodType=1', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 18, + }, { + # query: sort + 'url': 'https://nicochannel.jp/testman/videos?sort=-released_at', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 18, + }, { + # query: tag, vodType + 'url': 'https://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&vodType=1', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 6, + }, { + # query: tag, sort + 'url': 'https://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&sort=-released_at', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 6, + }, { + # query: vodType, sort + 'url': 'https://nicochannel.jp/testman/videos?vodType=1&sort=-released_at', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 18, + }, { + # query: tag, vodType, sort + 'url': 'https://nicochannel.jp/testman/videos?tag=%E6%A4%9C%E8%A8%BC%E7%94%A8&vodType=1&sort=-released_at', + 'info_dict': { + 'id': 'testman-videos', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-videos', + }, + 'playlist_mincount': 6, + }] + + def _real_extract(self, url): + """ + API parameters: + sort: + -released_at å…¬é–‹æ—¥ãŒæ–°ã—ã„é † (newest to oldest) + released_at 公開日ãŒå¤ã„é † (oldest to newest) + -number_of_vod_views å†ç”Ÿæ•°ãŒå¤šã„é † (most play count) + number_of_vod_views コメントãŒå¤šã„é † (most comments) + vod_type (is "vodType" in "url"): + 0 ã™ã¹ã¦ (all) + 1 会員é™å®š (members only) + 2 一部無料 (partially free) + 3 レンタル (rental) + 4 生放é€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ– (live archives) + 5 アップロード動画 (uploaded videos) + """ + + channel_id = self._match_id(url) + fanclub_site_id = self._find_fanclub_site_id(channel_id) + channel_name = self._get_channel_base_info(fanclub_site_id).get('fanclub_site_name') + qs = parse_qs(url) + + return self.playlist_result( + OnDemandPagedList( + functools.partial( + self._fetch_paged_channel_video_list, f'fanclub_sites/{fanclub_site_id}/video_pages', + filter_dict({ + 'tag': traverse_obj(qs, ('tag', 0)), + 'sort': traverse_obj(qs, ('sort', 0), default='-released_at'), + 'vod_type': traverse_obj(qs, ('vodType', 0), default='0'), + }), + channel_id, f'{channel_id}/videos'), + self._PAGE_SIZE), + playlist_id=f'{channel_id}-videos', playlist_title=f'{channel_name}-videos') + + +class NiconicoChannelPlusChannelLivesIE(NiconicoChannelPlusChannelBaseIE): + IE_NAME = 'NiconicoChannelPlus:channel:lives' + IE_DESC = 'ニコニコãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラス - ãƒãƒ£ãƒ³ãƒãƒ« - ライブリスト. nicochannel.jp/channel/lives' + _VALID_URL = r'https?://nicochannel\.jp/(?P<id>[a-z\d\._-]+)/lives' + _TESTS = [{ + 'url': 'https://nicochannel.jp/testman/lives', + 'info_dict': { + 'id': 'testman-lives', + 'title': '本番ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステストマン-lives', + }, + 'playlist_mincount': 18, + }, { + 'url': 'https://nicochannel.jp/testtarou/lives', + 'info_dict': { + 'id': 'testtarou-lives', + 'title': 'ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステスト太郎-lives', + }, + 'playlist_mincount': 2, + }, { + 'url': 'https://nicochannel.jp/testjirou/lives', + 'info_dict': { + 'id': 'testjirou-lives', + 'title': 'ãƒãƒ£ãƒ³ãƒãƒ«ãƒ—ラステスト二郎-lives', + }, + 'playlist_mincount': 6, + }] + + def _real_extract(self, url): + """ + API parameters: + live_type: + 1 放é€ä¸­ (on air) + 2 放é€äºˆå®š (scheduled live streams, oldest to newest) + 3 éŽåŽ»ã®æ”¾é€ - ã™ã¹ã¦ (all ended live streams, newest to oldest) + 4 éŽåŽ»ã®æ”¾é€ - 生放é€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ– (all archives for live streams, oldest to newest) + We use "4" instead of "3" because some recently ended live streams could not be downloaded. + """ + + channel_id = self._match_id(url) + fanclub_site_id = self._find_fanclub_site_id(channel_id) + channel_name = self._get_channel_base_info(fanclub_site_id).get('fanclub_site_name') + + return self.playlist_result( + OnDemandPagedList( + functools.partial( + self._fetch_paged_channel_video_list, f'fanclub_sites/{fanclub_site_id}/live_pages', + { + 'live_type': 4, + }, + channel_id, f'{channel_id}/lives'), + self._PAGE_SIZE), + playlist_id=f'{channel_id}-lives', playlist_title=f'{channel_name}-lives') diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ninecninemedia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ninecninemedia.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ninecninemedia.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ninecninemedia.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ninegag.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ninegag.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ninegag.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ninegag.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/ninenow.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ninenow.py new file mode 100644 index 0000000..c655b75 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/ninenow.py @@ -0,0 +1,122 @@ +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + ExtractorError, + int_or_none, + float_or_none, + smuggle_url, + str_or_none, + try_get, + unified_strdate, + unified_timestamp, +) + + +class NineNowIE(InfoExtractor): + IE_NAME = '9now.com.au' + _VALID_URL = r'https?://(?:www\.)?9now\.com\.au/(?:[^/]+/){2}(?P<id>[^/?#]+)' + _GEO_COUNTRIES = ['AU'] + _TESTS = [{ + # clip + 'url': 'https://www.9now.com.au/afl-footy-show/2016/clip-ciql02091000g0hp5oktrnytc', + 'md5': '17cf47d63ec9323e562c9957a968b565', + 'info_dict': { + 'id': '16801', + 'ext': 'mp4', + 'title': 'St. Kilda\'s Joey Montagna on the potential for a player\'s strike', + 'description': 'Is a boycott of the NAB Cup "on the table"?', + 'uploader_id': '4460760524001', + 'upload_date': '20160713', + 'timestamp': 1468421266, + }, + 'skip': 'Only available in Australia', + }, { + # episode + 'url': 'https://www.9now.com.au/afl-footy-show/2016/episode-19', + 'only_matching': True, + }, { + # DRM protected + 'url': 'https://www.9now.com.au/andrew-marrs-history-of-the-world/season-1/episode-1', + 'only_matching': True, + }, { + # episode of series + 'url': 'https://www.9now.com.au/lego-masters/season-3/episode-3', + 'info_dict': { + 'id': '6249614030001', + 'title': 'Episode 3', + 'ext': 'mp4', + 'season_number': 3, + 'episode_number': 3, + 'description': 'In the first elimination of the competition, teams will have 10 hours to build a world inside a snow globe.', + 'uploader_id': '4460760524001', + 'timestamp': 1619002200, + 'upload_date': '20210421', + }, + 'expected_warnings': ['Ignoring subtitle tracks'], + 'params': { + 'skip_download': True, + } + }] + BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/4460760524001/default_default/index.html?videoId=%s' + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + page_data = self._parse_json(self._search_regex( + r'window\.__data\s*=\s*({.*?});', webpage, + 'page data', default='{}'), display_id, fatal=False) + if not page_data: + page_data = self._parse_json(self._parse_json(self._search_regex( + r'window\.__data\s*=\s*JSON\.parse\s*\(\s*(".+?")\s*\)\s*;', + webpage, 'page data'), display_id), display_id) + + for kind in ('episode', 'clip'): + current_key = page_data.get(kind, {}).get( + 'current%sKey' % kind.capitalize()) + if not current_key: + continue + cache = page_data.get(kind, {}).get('%sCache' % kind, {}) + if not cache: + continue + common_data = { + 'episode': (cache.get(current_key) or list(cache.values())[0])[kind], + 'season': (cache.get(current_key) or list(cache.values())[0]).get('season', None) + } + break + else: + raise ExtractorError('Unable to find video data') + + if not self.get_param('allow_unplayable_formats') and try_get(common_data, lambda x: x['episode']['video']['drm'], bool): + self.report_drm(display_id) + brightcove_id = try_get( + common_data, lambda x: x['episode']['video']['brightcoveId'], compat_str) or 'ref:%s' % common_data['episode']['video']['referenceId'] + video_id = str_or_none(try_get(common_data, lambda x: x['episode']['video']['id'])) or brightcove_id + + title = try_get(common_data, lambda x: x['episode']['name'], compat_str) + season_number = try_get(common_data, lambda x: x['season']['seasonNumber'], int) + episode_number = try_get(common_data, lambda x: x['episode']['episodeNumber'], int) + timestamp = unified_timestamp(try_get(common_data, lambda x: x['episode']['airDate'], compat_str)) + release_date = unified_strdate(try_get(common_data, lambda x: x['episode']['availability'], compat_str)) + thumbnails_data = try_get(common_data, lambda x: x['episode']['image']['sizes'], dict) or {} + thumbnails = [{ + 'id': thumbnail_id, + 'url': thumbnail_url, + 'width': int_or_none(thumbnail_id[1:]), + } for thumbnail_id, thumbnail_url in thumbnails_data.items()] + + return { + '_type': 'url_transparent', + 'url': smuggle_url( + self.BRIGHTCOVE_URL_TEMPLATE % brightcove_id, + {'geo_countries': self._GEO_COUNTRIES}), + 'id': video_id, + 'title': title, + 'description': try_get(common_data, lambda x: x['episode']['description'], compat_str), + 'duration': float_or_none(try_get(common_data, lambda x: x['episode']['video']['duration'], float), 1000), + 'thumbnails': thumbnails, + 'ie_key': 'BrightcoveNew', + 'season_number': season_number, + 'episode_number': episode_number, + 'timestamp': timestamp, + 'release_date': release_date, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nintendo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nintendo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nintendo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nintendo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nitter.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nitter.py new file mode 100644 index 0000000..35d1311 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nitter.py @@ -0,0 +1,360 @@ +from .common import InfoExtractor +from ..compat import compat_urlparse +from ..utils import ( + parse_count, + unified_timestamp, + remove_end, + determine_ext, +) +import re +import random + + +class NitterIE(InfoExtractor): + # Taken from https://github.com/zedeus/nitter/wiki/Instances + + NON_HTTP_INSTANCES = ( + '3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion', + 'nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion', + 'nitter7bryz3jv7e3uekphigvmoyoem4al3fynerxkj22dmoxoq553qd.onion', + 'npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion', + 'nitter.v6vgyqpa7yefkorazmg5d5fimstmvm2vtbirt6676mt7qmllrcnwycqd.onion', + 'i23nv6w3juvzlw32xzoxcqzktegd4i4fu3nmnc2ewv4ggiu4ledwklad.onion', + '26oq3gioiwcmfojub37nz5gzbkdiqp7fue5kvye7d4txv4ny6fb4wwid.onion', + 'vfaomgh4jxphpbdfizkm5gbtjahmei234giqj4facbwhrfjtcldauqad.onion', + 'iwgu3cv7ywf3gssed5iqtavmrlszgsxazkmwwnt4h2kdait75thdyrqd.onion', + 'erpnncl5nhyji3c32dcfmztujtl3xaddqb457jsbkulq24zqq7ifdgad.onion', + 'ckzuw5misyahmg7j5t5xwwuj3bwy62jfolxyux4brfflramzsvvd3syd.onion', + 'jebqj47jgxleaiosfcxfibx2xdahjettuydlxbg64azd4khsxv6kawid.onion', + 'nttr2iupbb6fazdpr2rgbooon2tzbbsvvkagkgkwohhodjzj43stxhad.onion', + 'nitraeju2mipeziu2wtcrqsxg7h62v5y4eqgwi75uprynkj74gevvuqd.onion', + 'nitter.lqs5fjmajyp7rvp4qvyubwofzi6d4imua7vs237rkc4m5qogitqwrgyd.onion', + 'ibsboeui2im5o7dxnik3s5yghufumgy5abevtij5nbizequfpu4qi4ad.onion', + 'ec5nvbycpfa5k6ro77blxgkyrzbkv7uy6r5cngcbkadtjj2733nm3uyd.onion', + + 'nitter.i2p', + 'u6ikd6zndl3c4dsdq4mmujpntgeevdk5qzkfb57r4tnfeccrn2qa.b32.i2p', + + 'nitterlgj3n5fgwesu3vxc5h67ruku33nqaoeoocae2mvlzhsu6k7fqd.onion', + ) + + HTTP_INSTANCES = ( + 'nitter.lacontrevoie.fr', + 'nitter.fdn.fr', + 'nitter.1d4.us', + 'nitter.kavin.rocks', + 'nitter.unixfox.eu', + 'nitter.domain.glass', + 'nitter.namazso.eu', + 'birdsite.xanny.family', + 'nitter.moomoo.me', + 'bird.trom.tf', + 'nitter.it', + 'twitter.censors.us', + 'nitter.grimneko.de', + 'twitter.076.ne.jp', + 'nitter.fly.dev', + 'notabird.site', + 'nitter.weiler.rocks', + 'nitter.sethforprivacy.com', + 'nitter.cutelab.space', + 'nitter.nl', + 'nitter.mint.lgbt', + 'nitter.bus-hit.me', + 'nitter.esmailelbob.xyz', + 'tw.artemislena.eu', + 'nitter.winscloud.net', + 'nitter.tiekoetter.com', + 'nitter.spaceint.fr', + 'nitter.privacy.com.de', + 'nitter.poast.org', + 'nitter.bird.froth.zone', + 'nitter.dcs0.hu', + 'twitter.dr460nf1r3.org', + 'nitter.garudalinux.org', + 'twitter.femboy.hu', + 'nitter.cz', + 'nitter.privacydev.net', + 'nitter.evil.site', + 'tweet.lambda.dance', + 'nitter.kylrth.com', + 'nitter.foss.wtf', + 'nitter.priv.pw', + 'nitter.tokhmi.xyz', + 'nitter.catalyst.sx', + 'unofficialbird.com', + 'nitter.projectsegfau.lt', + 'nitter.eu.projectsegfau.lt', + 'singapore.unofficialbird.com', + 'canada.unofficialbird.com', + 'india.unofficialbird.com', + 'nederland.unofficialbird.com', + 'uk.unofficialbird.com', + 'n.l5.ca', + 'nitter.slipfox.xyz', + 'nitter.soopy.moe', + 'nitter.qwik.space', + 'read.whatever.social', + 'nitter.rawbit.ninja', + 'nt.vern.cc', + 'ntr.odyssey346.dev', + 'nitter.ir', + 'nitter.privacytools.io', + 'nitter.sneed.network', + 'n.sneed.network', + 'nitter.manasiwibi.com', + 'nitter.smnz.de', + 'nitter.twei.space', + 'nitter.inpt.fr', + 'nitter.d420.de', + 'nitter.caioalonso.com', + 'nitter.at', + 'nitter.drivet.xyz', + 'nitter.pw', + 'nitter.nicfab.eu', + 'bird.habedieeh.re', + 'nitter.hostux.net', + 'nitter.adminforge.de', + 'nitter.platypush.tech', + 'nitter.mask.sh', + 'nitter.pufe.org', + 'nitter.us.projectsegfau.lt', + 'nitter.arcticfoxes.net', + 't.com.sb', + 'nitter.kling.gg', + 'nitter.ktachibana.party', + 'nitter.riverside.rocks', + 'nitter.girlboss.ceo', + 'nitter.lunar.icu', + 'twitter.moe.ngo', + 'nitter.freedit.eu', + 'ntr.frail.duckdns.org', + 'nitter.librenode.org', + 'n.opnxng.com', + 'nitter.plus.st', + ) + + DEAD_INSTANCES = ( + # maintenance + 'nitter.ethibox.fr', + + # official, rate limited + 'nitter.net', + # offline + 'is-nitter.resolv.ee', + 'lu-nitter.resolv.ee', + 'nitter.13ad.de', + 'nitter.40two.app', + 'nitter.cattube.org', + 'nitter.cc', + 'nitter.dark.fail', + 'nitter.himiko.cloud', + 'nitter.koyu.space', + 'nitter.mailstation.de', + 'nitter.mastodont.cat', + 'nitter.tedomum.net', + 'nitter.tokhmi.xyz', + 'nitter.weaponizedhumiliation.com', + 'nitter.vxempire.xyz', + 'tweet.lambda.dance', + 'nitter.ca', + 'nitter.42l.fr', + 'nitter.pussthecat.org', + 'nitter.nixnet.services', + 'nitter.eu', + 'nitter.actionsack.com', + 'nitter.hu', + 'twitr.gq', + 'nittereu.moomoo.me', + 'bird.from.tf', + 'twitter.grimneko.de', + 'nitter.alefvanoon.xyz', + 'n.hyperborea.cloud', + 'twitter.mstdn.social', + 'nitter.silkky.cloud', + 'nttr.stream', + 'fuckthesacklers.network', + 'nitter.govt.land', + 'nitter.datatunnel.xyz', + 'de.nttr.stream', + 'twtr.bch.bar', + 'nitter.exonip.de', + 'nitter.mastodon.pro', + 'nitter.notraxx.ch', + 'nitter.skrep.in', + 'nitter.snopyta.org', + ) + + INSTANCES = NON_HTTP_INSTANCES + HTTP_INSTANCES + DEAD_INSTANCES + + _INSTANCES_RE = f'(?:{"|".join(map(re.escape, INSTANCES))})' + _VALID_URL = fr'https?://{_INSTANCES_RE}/(?P<uploader_id>.+)/status/(?P<id>[0-9]+)(#.)?' + current_instance = random.choice(HTTP_INSTANCES) + + _TESTS = [ + { + # GIF (wrapped in mp4) + 'url': f'https://{current_instance}/firefox/status/1314279897502629888#m', + 'info_dict': { + 'id': '1314279897502629888', + 'ext': 'mp4', + 'title': 'md5:7890a9277da4639ab624dd899424c5d8', + 'description': 'md5:5fea96a4d3716c350f8b95b21b3111fe', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Firefox 🔥', + 'uploader_id': 'firefox', + 'uploader_url': f'https://{current_instance}/firefox', + 'upload_date': '20201008', + 'timestamp': 1602183720, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + }, { # normal video + 'url': f'https://{current_instance}/Le___Doc/status/1299715685392756737#m', + 'info_dict': { + 'id': '1299715685392756737', + 'ext': 'mp4', + 'title': 're:^.* - "Je ne prédis jamais rien"\nD Raoult, Août 2020...', + 'description': '"Je ne prédis jamais rien"\nD Raoult, Août 2020...', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 're:^Le *Doc', + 'uploader_id': 'Le___Doc', + 'uploader_url': f'https://{current_instance}/Le___Doc', + 'upload_date': '20200829', + 'timestamp': 1598711340, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + }, { # video embed in a "Streaming Political Ads" box + 'url': f'https://{current_instance}/mozilla/status/1321147074491092994#m', + 'info_dict': { + 'id': '1321147074491092994', + 'ext': 'mp4', + 'title': 'md5:8290664aabb43b9189145c008386bf12', + 'description': 'md5:9cf2762d49674bc416a191a689fb2aaa', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Mozilla', + 'uploader_id': 'mozilla', + 'uploader_url': f'https://{current_instance}/mozilla', + 'upload_date': '20201027', + 'timestamp': 1603820940, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + 'expected_warnings': ['Ignoring subtitle tracks found in the HLS manifest'], + }, { # not the first tweet but main-tweet + 'url': f'https://{current_instance}/firefox/status/1354848277481414657#m', + 'info_dict': { + 'id': '1354848277481414657', + 'ext': 'mp4', + 'title': 'md5:bef647f03bd1c6b15b687ea70dfc9700', + 'description': 'md5:5efba25e2f9dac85ebcd21160cb4341f', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Firefox 🔥', + 'uploader_id': 'firefox', + 'uploader_url': f'https://{current_instance}/firefox', + 'upload_date': '20210128', + 'timestamp': 1611855960, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + } + }, { # no OpenGraph title + 'url': f'https://{current_instance}/LocalBateman/status/1678455464038735895#m', + 'info_dict': { + 'id': '1678455464038735895', + 'ext': 'mp4', + 'title': 'Your Typical Local Man - Local man, what did Romanians ever do to you?', + 'description': 'Local man, what did Romanians ever do to you?', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Your Typical Local Man', + 'uploader_id': 'LocalBateman', + 'uploader_url': f'https://{current_instance}/LocalBateman', + 'upload_date': '20230710', + 'timestamp': 1689009900, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + 'expected_warnings': ['Ignoring subtitle tracks found in the HLS manifest'], + 'params': {'skip_download': 'm3u8'}, + } + ] + + def _real_extract(self, url): + video_id, uploader_id = self._match_valid_url(url).group('id', 'uploader_id') + parsed_url = compat_urlparse.urlparse(url) + base_url = f'{parsed_url.scheme}://{parsed_url.netloc}' + + self._set_cookie(parsed_url.netloc, 'hlsPlayback', 'on') + full_webpage = webpage = self._download_webpage(url, video_id) + + main_tweet_start = full_webpage.find('class="main-tweet"') + if main_tweet_start > 0: + webpage = full_webpage[main_tweet_start:] + + video_url = '%s%s' % (base_url, self._html_search_regex( + r'(?:<video[^>]+data-url|<source[^>]+src)="([^"]+)"', webpage, 'video url')) + ext = determine_ext(video_url) + + if ext == 'unknown_video': + formats = self._extract_m3u8_formats(video_url, video_id, ext='mp4') + else: + formats = [{ + 'url': video_url, + 'ext': ext + }] + + title = description = self._og_search_description(full_webpage, default=None) or self._html_search_regex( + r'<div class="tweet-content[^>]+>([^<]+)</div>', webpage, 'title', fatal=False) + + uploader_id = self._html_search_regex( + r'<a class="username"[^>]+title="@([^"]+)"', webpage, 'uploader id', fatal=False) or uploader_id + + uploader = self._html_search_regex( + r'<a class="fullname"[^>]+title="([^"]+)"', webpage, 'uploader name', fatal=False) + if uploader: + title = f'{uploader} - {title}' + + counts = { + f'{x[0]}_count': self._html_search_regex( + fr'<span[^>]+class="icon-{x[1]}[^>]*></span>([^<]*)</div>', + webpage, f'{x[0]} count', fatal=False) + for x in (('view', 'play'), ('like', 'heart'), ('repost', 'retweet'), ('comment', 'comment')) + } + counts = {field: 0 if count == '' else parse_count(count) for field, count in counts.items()} + + thumbnail = ( + self._html_search_meta('og:image', full_webpage, 'thumbnail url') + or remove_end('%s%s' % (base_url, self._html_search_regex( + r'<video[^>]+poster="([^"]+)"', webpage, 'thumbnail url', fatal=False)), '%3Asmall')) + + thumbnails = [ + {'id': id, 'url': f'{thumbnail}%3A{id}'} + for id in ('thumb', 'small', 'large', 'medium', 'orig') + ] + + date = self._html_search_regex( + r'<span[^>]+class="tweet-date"[^>]*><a[^>]+title="([^"]+)"', + webpage, 'upload date', default='').replace('·', '') + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'uploader': uploader, + 'timestamp': unified_timestamp(date), + 'uploader_id': uploader_id, + 'uploader_url': f'{base_url}/{uploader_id}', + 'formats': formats, + 'thumbnails': thumbnails, + 'thumbnail': thumbnail, + **counts, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/njpwworld.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/njpwworld.py new file mode 100644 index 0000000..6078381 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/njpwworld.py @@ -0,0 +1,82 @@ +import re + +from .common import InfoExtractor +from ..compat import compat_urlparse +from ..utils import ( + get_element_by_class, + urlencode_postdata, +) + + +class NJPWWorldIE(InfoExtractor): + _VALID_URL = r'https?://(front\.)?njpwworld\.com/p/(?P<id>[a-z0-9_]+)' + IE_DESC = '新日本プロレスワールド' + _NETRC_MACHINE = 'njpwworld' + + _TESTS = [{ + 'url': 'http://njpwworld.com/p/s_series_00155_1_9/', + 'info_dict': { + 'id': 's_series_00155_1_9', + 'ext': 'mp4', + 'title': '闘強導夢2000 2000å¹´1月4æ—¥ æ±äº¬ãƒ‰ãƒ¼ãƒ  第9è©¦åˆ ãƒ©ãƒ³ãƒ‡ã‚£ãƒ»ã‚µãƒ™ãƒ¼ã‚¸ VS リック・スタイナー', + 'tags': list, + }, + 'params': { + 'skip_download': True, # AES-encrypted m3u8 + }, + 'skip': 'Requires login', + }, { + 'url': 'https://front.njpwworld.com/p/s_series_00563_16_bs', + 'info_dict': { + 'id': 's_series_00563_16_bs', + 'ext': 'mp4', + 'title': 'WORLD TAG LEAGUE 2020 & BEST OF THE SUPER Jr.27 2020å¹´12月6æ—¥ ç¦å²¡ãƒ»ç¦å²¡å›½éš›ã‚»ãƒ³ã‚¿ãƒ¼ ãƒãƒƒã‚¯ã‚¹ãƒ†ãƒ¼ã‚¸ã‚³ãƒ¡ãƒ³ãƒˆï¼ˆå­—幕ã‚り)', + 'tags': ["ç¦å²¡ãƒ»ç¦å²¡å›½éš›ã‚»ãƒ³ã‚¿ãƒ¼", "ãƒãƒƒã‚¯ã‚¹ãƒ†ãƒ¼ã‚¸ã‚³ãƒ¡ãƒ³ãƒˆ", "2020", "20年代"], + }, + 'params': { + 'skip_download': True, + }, + }] + + _LOGIN_URL = 'https://front.njpwworld.com/auth/login' + + def _perform_login(self, username, password): + # Setup session (will set necessary cookies) + self._request_webpage( + 'https://njpwworld.com/', None, note='Setting up session') + + webpage, urlh = self._download_webpage_handle( + self._LOGIN_URL, None, + note='Logging in', errnote='Unable to login', + data=urlencode_postdata({'login_id': username, 'pw': password}), + headers={'Referer': 'https://front.njpwworld.com/auth'}) + # /auth/login will return 302 for successful logins + if urlh.url == self._LOGIN_URL: + self.report_warning('unable to login') + return False + + return True + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + + formats = [] + for kind, vid in re.findall(r'if\s+\(\s*imageQualityType\s*==\s*\'([^\']+)\'\s*\)\s*{\s*video_id\s*=\s*"(\d+)"', webpage): + player_path = '/intent?id=%s&type=url' % vid + player_url = compat_urlparse.urljoin(url, player_path) + formats += self._extract_m3u8_formats( + player_url, video_id, 'mp4', 'm3u8_native', m3u8_id=kind, fatal=False, quality=int(kind == 'high')) + + tag_block = get_element_by_class('tag-block', webpage) + tags = re.findall( + r'<a[^>]+class="tag-[^"]+"[^>]*>([^<]+)</a>', tag_block + ) if tag_block else None + + return { + 'id': video_id, + 'title': get_element_by_class('article-title', webpage) or self._og_search_title(webpage), + 'formats': formats, + 'tags': tags, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nobelprize.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nobelprize.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nobelprize.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nobelprize.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/noice.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/noice.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/noice.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/noice.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nonktube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nonktube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nonktube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nonktube.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/noodlemagazine.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/noodlemagazine.py new file mode 100644 index 0000000..1c1a763 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/noodlemagazine.py @@ -0,0 +1,80 @@ +from .common import InfoExtractor +from ..utils import ( + int_or_none, + parse_count, + parse_duration, + unified_strdate, + urljoin, +) +from ..utils.traversal import traverse_obj + + +class NoodleMagazineIE(InfoExtractor): + _VALID_URL = r'https?://(?:www|adult\.)?noodlemagazine\.com/watch/(?P<id>[0-9-_]+)' + _TEST = { + 'url': 'https://adult.noodlemagazine.com/watch/-67421364_456239604', + 'md5': '9e02aa763612929d0b4b850591a9248b', + 'info_dict': { + 'id': '-67421364_456239604', + 'title': 'Aria alexander manojob', + 'thumbnail': r're:^https://.*\.jpg', + 'ext': 'mp4', + 'duration': 903, + 'view_count': int, + 'like_count': int, + 'description': 'Aria alexander manojob', + 'tags': ['aria', 'alexander', 'manojob'], + 'upload_date': '20190218', + 'age_limit': 18 + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + title = self._og_search_title(webpage) + duration = parse_duration(self._html_search_meta('video:duration', webpage, 'duration', default=None)) + description = self._og_search_property('description', webpage, default='').replace(' watch online hight quality video', '') + tags = self._html_search_meta('video:tag', webpage, default='').split(', ') + view_count = parse_count(self._html_search_meta('ya:ovs:views_total', webpage, default=None)) + like_count = parse_count(self._html_search_meta('ya:ovs:likes', webpage, default=None)) + upload_date = unified_strdate(self._html_search_meta('ya:ovs:upload_date', webpage, default='')) + + def build_url(url_or_path): + return urljoin('https://adult.noodlemagazine.com', url_or_path) + + headers = {'Referer': url} + player_path = self._html_search_regex( + r'<iframe[^>]+\bid="iplayer"[^>]+\bsrc="([^"]+)"', webpage, 'player path') + player_iframe = self._download_webpage( + build_url(player_path), video_id, 'Downloading iframe page', headers=headers) + playlist_url = self._search_regex( + r'window\.playlistUrl\s*=\s*["\']([^"\']+)["\']', player_iframe, 'playlist url') + playlist_info = self._download_json(build_url(playlist_url), video_id, headers=headers) + + formats = [] + for source in traverse_obj(playlist_info, ('sources', lambda _, v: v['file'])): + if source.get('type') == 'hls': + formats.extend(self._extract_m3u8_formats( + build_url(source['file']), video_id, 'mp4', fatal=False, m3u8_id='hls')) + else: + formats.append(traverse_obj(source, { + 'url': ('file', {build_url}), + 'format_id': 'label', + 'height': ('label', {int_or_none}), + 'ext': 'type', + })) + + return { + 'id': video_id, + 'formats': formats, + 'title': title, + 'thumbnail': self._og_search_property('image', webpage, default=None) or playlist_info.get('image'), + 'duration': duration, + 'description': description, + 'tags': tags, + 'view_count': view_count, + 'like_count': like_count, + 'upload_date': upload_date, + 'age_limit': 18 + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/noovo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/noovo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/noovo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/noovo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/normalboots.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/normalboots.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/normalboots.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/normalboots.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nosnl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nosnl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nosnl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nosnl.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nosvideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nosvideo.py new file mode 100644 index 0000000..7e9688c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nosvideo.py @@ -0,0 +1,72 @@ +import re + +from .common import InfoExtractor +from ..networking import Request +from ..utils import ( + ExtractorError, + urlencode_postdata, + xpath_text, + xpath_with_ns, +) + +_x = lambda p: xpath_with_ns(p, {'xspf': 'http://xspf.org/ns/0/'}) + + +class NosVideoIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?nosvideo\.com/' + \ + r'(?:embed/|\?v=)(?P<id>[A-Za-z0-9]{12})/?' + _PLAYLIST_URL = 'http://nosvideo.com/xml/{xml_id:s}.xml' + _FILE_DELETED_REGEX = r'<b>File Not Found</b>' + _TEST = { + 'url': 'http://nosvideo.com/?v=mu8fle7g7rpq', + 'md5': '6124ed47130d8be3eacae635b071e6b6', + 'info_dict': { + 'id': 'mu8fle7g7rpq', + 'ext': 'mp4', + 'title': 'big_buck_bunny_480p_surround-fix.avi.mp4', + 'thumbnail': r're:^https?://.*\.jpg$', + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + fields = { + 'id': video_id, + 'op': 'download1', + 'method_free': 'Continue to Video', + } + req = Request(url, urlencode_postdata(fields)) + req.headers['Content-type'] = 'application/x-www-form-urlencoded' + webpage = self._download_webpage(req, video_id, + 'Downloading download page') + if re.search(self._FILE_DELETED_REGEX, webpage) is not None: + raise ExtractorError('Video %s does not exist' % video_id, + expected=True) + + xml_id = self._search_regex(r'php\|([^\|]+)\|', webpage, 'XML ID') + playlist_url = self._PLAYLIST_URL.format(xml_id=xml_id) + playlist = self._download_xml(playlist_url, video_id) + + track = playlist.find(_x('.//xspf:track')) + if track is None: + raise ExtractorError( + 'XML playlist is missing the \'track\' element', + expected=True) + title = xpath_text(track, _x('./xspf:title'), 'title') + url = xpath_text(track, _x('./xspf:file'), 'URL', fatal=True) + thumbnail = xpath_text(track, _x('./xspf:image'), 'thumbnail') + if title is not None: + title = title.strip() + + formats = [{ + 'format_id': 'sd', + 'url': url, + }] + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nova.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nova.py new file mode 100644 index 0000000..bd0c4eb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nova.py @@ -0,0 +1,296 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + determine_ext, + int_or_none, + js_to_json, + traverse_obj, + unified_strdate, + url_or_none, +) + + +class NovaEmbedIE(InfoExtractor): + _VALID_URL = r'https?://media\.cms\.nova\.cz/embed/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://media.cms.nova.cz/embed/8o0n0r?autoplay=1', + 'info_dict': { + 'id': '8o0n0r', + 'title': '2180. díl', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 2578, + }, + 'params': { + 'skip_download': True, + 'ignore_no_formats_error': True, + }, + 'expected_warnings': ['DRM protected', 'Requested format is not available'], + }, { + 'url': 'https://media.cms.nova.cz/embed/KybpWYvcgOa', + 'info_dict': { + 'id': 'KybpWYvcgOa', + 'ext': 'mp4', + 'title': 'Borhyová oslavila 60? Soutěžící z poÅ™adu odboural moderátora OndÅ™eje Sokola', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 114, + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + + has_drm = False + duration = None + formats = [] + + def process_format_list(format_list, format_id=""): + nonlocal formats, has_drm + if not isinstance(format_list, list): + format_list = [format_list] + for format_dict in format_list: + if not isinstance(format_dict, dict): + continue + if (not self.get_param('allow_unplayable_formats') + and traverse_obj(format_dict, ('drm', 'keySystem'))): + has_drm = True + continue + format_url = url_or_none(format_dict.get('src')) + format_type = format_dict.get('type') + ext = determine_ext(format_url) + if (format_type == 'application/x-mpegURL' + or format_id == 'HLS' or ext == 'm3u8'): + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', + entry_protocol='m3u8_native', m3u8_id='hls', + fatal=False)) + elif (format_type == 'application/dash+xml' + or format_id == 'DASH' or ext == 'mpd'): + formats.extend(self._extract_mpd_formats( + format_url, video_id, mpd_id='dash', fatal=False)) + else: + formats.append({ + 'url': format_url, + }) + + player = self._search_json( + r'player:', webpage, 'player', video_id, fatal=False, end_pattern=r';\s*</script>') + if player: + for src in traverse_obj(player, ('lib', 'source', 'sources', ...)): + process_format_list(src) + duration = traverse_obj(player, ('sourceInfo', 'duration', {int_or_none})) + if not formats and not has_drm: + # older code path, in use before August 2023 + player = self._parse_json( + self._search_regex( + (r'(?:(?:replacePlaceholders|processAdTagModifier).*?:\s*)?(?:replacePlaceholders|processAdTagModifier)\s*\(\s*(?P<json>{.*?})\s*\)(?:\s*\))?\s*,', + r'Player\.init\s*\([^,]+,(?P<cndn>\s*\w+\s*\?)?\s*(?P<json>{(?(cndn).+?|.+)})\s*(?(cndn):|,\s*{.+?}\s*\)\s*;)'), + webpage, 'player', group='json'), video_id) + if player: + for format_id, format_list in player['tracks'].items(): + process_format_list(format_list, format_id) + duration = int_or_none(player.get('duration')) + + if not formats and has_drm: + self.report_drm(video_id) + + title = self._og_search_title( + webpage, default=None) or self._search_regex( + (r'<value>(?P<title>[^<]+)', + r'videoTitle\s*:\s*(["\'])(?P<value>(?:(?!\1).)+)\1'), webpage, + 'title', group='value') + thumbnail = self._og_search_thumbnail( + webpage, default=None) or self._search_regex( + r'poster\s*:\s*(["\'])(?P<value>(?:(?!\1).)+)\1', webpage, + 'thumbnail', fatal=False, group='value') + duration = int_or_none(self._search_regex( + r'videoDuration\s*:\s*(\d+)', webpage, 'duration', + default=duration)) + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'duration': duration, + 'formats': formats, + } + + +class NovaIE(InfoExtractor): + IE_DESC = 'TN.cz, Prásk.tv, Nova.cz, Novaplus.cz, FANDA.tv, Krásná.cz and Doma.cz' + _VALID_URL = r'https?://(?:[^.]+\.)?(?P<site>tv(?:noviny)?|tn|novaplus|vymena|fanda|krasna|doma|prask)\.nova\.cz/(?:[^/]+/)+(?P<id>[^/]+?)(?:\.html|/|$)' + _TESTS = [{ + 'url': 'http://tn.nova.cz/clanek/tajemstvi-ukryte-v-podzemi-specialni-nemocnice-v-prazske-krci.html#player_13260', + 'md5': '249baab7d0104e186e78b0899c7d5f28', + 'info_dict': { + 'id': '1757139', + 'display_id': 'tajemstvi-ukryte-v-podzemi-specialni-nemocnice-v-prazske-krci', + 'ext': 'mp4', + 'title': 'Podzemní nemocnice v pražské KrÄi', + 'description': 'md5:f0a42dd239c26f61c28f19e62d20ef53', + 'thumbnail': r're:^https?://.*\.(?:jpg)', + } + }, { + 'url': 'http://fanda.nova.cz/clanek/fun-and-games/krvavy-epos-zaklinac-3-divoky-hon-vychazi-vyhrajte-ho-pro-sebe.html', + 'info_dict': { + 'id': '1753621', + 'ext': 'mp4', + 'title': 'ZaklínaÄ 3: Divoký hon', + 'description': 're:.*Pokud se stejnÄ› jako my nemůžete.*', + 'thumbnail': r're:https?://.*\.jpg(\?.*)?', + 'upload_date': '20150521', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + 'skip': 'gone', + }, { + # media.cms.nova.cz embed + 'url': 'https://novaplus.nova.cz/porad/ulice/epizoda/18760-2180-dil', + 'info_dict': { + 'id': '8o0n0r', + 'ext': 'mp4', + 'title': '2180. díl', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 2578, + }, + 'params': { + 'skip_download': True, + }, + 'add_ie': [NovaEmbedIE.ie_key()], + 'skip': 'CHYBA 404: STRÃNKA NENALEZENA', + }, { + 'url': 'http://sport.tn.nova.cz/clanek/sport/hokej/nhl/zivot-jde-dal-hodnotil-po-vyrazeni-z-playoff-jiri-sekac.html', + 'only_matching': True, + }, { + 'url': 'http://fanda.nova.cz/clanek/fun-and-games/krvavy-epos-zaklinac-3-divoky-hon-vychazi-vyhrajte-ho-pro-sebe.html', + 'only_matching': True, + }, { + 'url': 'http://doma.nova.cz/clanek/zdravi/prijdte-se-zapsat-do-registru-kostni-drene-jiz-ve-stredu-3-cervna.html', + 'only_matching': True, + }, { + 'url': 'http://prask.nova.cz/clanek/novinky/co-si-na-sobe-nase-hvezdy-nechaly-pojistit.html', + 'only_matching': True, + }, { + 'url': 'http://tv.nova.cz/clanek/novinky/zivot-je-zivot-bondovsky-trailer.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + display_id = mobj.group('id') + site = mobj.group('site') + + webpage = self._download_webpage(url, display_id) + + description = clean_html(self._og_search_description(webpage, default=None)) + if site == 'novaplus': + upload_date = unified_strdate(self._search_regex( + r'(\d{1,2}-\d{1,2}-\d{4})$', display_id, 'upload date', default=None)) + elif site == 'fanda': + upload_date = unified_strdate(self._search_regex( + r'<span class="date_time">(\d{1,2}\.\d{1,2}\.\d{4})', webpage, 'upload date', default=None)) + else: + upload_date = None + + # novaplus + embed_id = self._search_regex( + r'<iframe[^>]+\bsrc=["\'](?:https?:)?//media\.cms\.nova\.cz/embed/([^/?#&]+)', + webpage, 'embed url', default=None) + if embed_id: + return { + '_type': 'url_transparent', + 'url': 'https://media.cms.nova.cz/embed/%s' % embed_id, + 'ie_key': NovaEmbedIE.ie_key(), + 'id': embed_id, + 'description': description, + 'upload_date': upload_date + } + + video_id = self._search_regex( + [r"(?:media|video_id)\s*:\s*'(\d+)'", + r'media=(\d+)', + r'id="article_video_(\d+)"', + r'id="player_(\d+)"'], + webpage, 'video id') + + config_url = self._search_regex( + r'src="(https?://(?:tn|api)\.nova\.cz/bin/player/videojs/config\.php\?[^"]+)"', + webpage, 'config url', default=None) + config_params = {} + + if not config_url: + player = self._parse_json( + self._search_regex( + r'(?s)Player\s*\(.+?\s*,\s*({.+?\bmedia\b["\']?\s*:\s*["\']?\d+.+?})\s*\)', webpage, + 'player', default='{}'), + video_id, transform_source=js_to_json, fatal=False) + if player: + config_url = url_or_none(player.get('configUrl')) + params = player.get('configParams') + if isinstance(params, dict): + config_params = params + + if not config_url: + DEFAULT_SITE_ID = '23000' + SITES = { + 'tvnoviny': DEFAULT_SITE_ID, + 'novaplus': DEFAULT_SITE_ID, + 'vymena': DEFAULT_SITE_ID, + 'krasna': DEFAULT_SITE_ID, + 'fanda': '30', + 'tn': '30', + 'doma': '30', + } + + site_id = self._search_regex( + r'site=(\d+)', webpage, 'site id', default=None) or SITES.get( + site, DEFAULT_SITE_ID) + + config_url = 'https://api.nova.cz/bin/player/videojs/config.php' + config_params = { + 'site': site_id, + 'media': video_id, + 'quality': 3, + 'version': 1, + } + + config = self._download_json( + config_url, display_id, + 'Downloading config JSON', query=config_params, + transform_source=lambda s: s[s.index('{'):s.rindex('}') + 1]) + + mediafile = config['mediafile'] + video_url = mediafile['src'] + + m = re.search(r'^(?P<url>rtmpe?://[^/]+/(?P<app>[^/]+?))/&*(?P<playpath>.+)$', video_url) + if m: + formats = [{ + 'url': m.group('url'), + 'app': m.group('app'), + 'play_path': m.group('playpath'), + 'player_path': 'http://tvnoviny.nova.cz/static/shared/app/videojs/video-js.swf', + 'ext': 'flv', + }] + else: + formats = [{ + 'url': video_url, + }] + + title = mediafile.get('meta', {}).get('title') or self._og_search_title(webpage) + thumbnail = config.get('poster') + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': description, + 'upload_date': upload_date, + 'thumbnail': thumbnail, + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/novaplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/novaplay.py new file mode 100644 index 0000000..d8849cd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/novaplay.py @@ -0,0 +1,69 @@ +from .common import InfoExtractor +from ..utils import int_or_none, parse_duration, parse_iso8601 + + +class NovaPlayIE(InfoExtractor): + _VALID_URL = r'https://play\.nova\.bg/video/[^?#]+/(?P<id>\d+)' + _TESTS = [ + { + 'url': 'https://play.nova.bg/video/ochakvaite/season-0/ochakvaite-2022-07-22-sybudi-se-sat/606627', + 'md5': 'd79dff2d09d196c595a7290f48e33399', + 'info_dict': { + 'id': '606627', + 'ext': 'mp4', + 'title': 'Събуди Ñе - Ñъбота по NOVA (23.07.2022)', + 'alt_title': 'ochakvaite/season-0/ochakvaite-2022-07-22-sybudi-se-sat', + 'duration': 29.0, + 'timestamp': 1658491547, + 'upload_date': '20220722', + 'thumbnail': 'https://nbg-img.fite.tv/img/606627_460x260.jpg', + 'description': '29 Ñек', + 'view_count': False + }, + }, + { + 'url': 'https://play.nova.bg/video/ochakvaite/season-0/ochakvaite-2022-07-22-cherry-tazi/606609', + 'md5': 'f3e973e2ed1a5b9b3f498b1ab82d01b3', + 'info_dict': { + 'id': '606609', + 'ext': 'mp4', + 'title': 'Черешката на тортата - тази вечер по NOVA (22.07.2022)', + 'alt_title': 'ochakvaite/season-0/ochakvaite-2022-07-22-cherry-tazi', + 'duration': 29.0, + 'timestamp': 1658476303, + 'upload_date': '20220722', + 'thumbnail': 'https://nbg-img.fite.tv/img/606609_460x260.jpg', + 'description': '29 Ñек', + 'view_count': False + }, + } + ] + + _access_token = None + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + self._access_token = self._access_token or self._download_json( + 'https://play.nova.bg/api/client', None, note='Fetching access token')['accessToken'] + video_props = self._search_nextjs_data(webpage, video_id)['props']['pageProps']['video'] + m3u8_url = self._download_json( + f'https://nbg-api.fite.tv/api/v2/videos/{video_id}/streams', + video_id, headers={ + 'x-flipps-user-agent': 'Flipps/75/9.7', + 'x-flipps-version': '2022-05-17', + 'Authorization': f'Bearer {self._access_token}' + })[0]['links']['play']['href'] + formats = self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', m3u8_id='hls') + + return { + 'id': video_id, + 'title': video_props['title'], + 'alt_title': video_props.get('slug'), + 'thumbnail': self._og_search_thumbnail(webpage), + 'description': self._og_search_description(webpage), + 'formats': formats, + 'duration': parse_duration(video_props['duration']), + 'timestamp': parse_iso8601(video_props['published_at']), + 'view_count': int_or_none(video_props['view_count']), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nowness.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nowness.py new file mode 100644 index 0000000..a3c29f6 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nowness.py @@ -0,0 +1,142 @@ +from .brightcove import ( + BrightcoveLegacyIE, + BrightcoveNewIE, +) +from .common import InfoExtractor +from ..compat import compat_str +from ..networking import Request +from ..utils import ExtractorError + + +class NownessBaseIE(InfoExtractor): + def _extract_url_result(self, post): + if post['type'] == 'video': + for media in post['media']: + if media['type'] == 'video': + video_id = media['content'] + source = media['source'] + if source == 'brightcove': + player_code = self._download_webpage( + 'http://www.nowness.com/iframe?id=%s' % video_id, video_id, + note='Downloading player JavaScript', + errnote='Unable to download player JavaScript') + bc_url = BrightcoveLegacyIE._extract_brightcove_url(player_code) + if bc_url: + return self.url_result(bc_url, BrightcoveLegacyIE.ie_key()) + bc_url = BrightcoveNewIE._extract_url(self, player_code) + if bc_url: + return self.url_result(bc_url, BrightcoveNewIE.ie_key()) + raise ExtractorError('Could not find player definition') + elif source == 'vimeo': + return self.url_result('http://vimeo.com/%s' % video_id, 'Vimeo') + elif source == 'youtube': + return self.url_result(video_id, 'Youtube') + elif source == 'cinematique': + # yt-dlp currently doesn't support cinematique + # return self.url_result('http://cinematique.com/embed/%s' % video_id, 'Cinematique') + pass + + def _api_request(self, url, request_path): + display_id = self._match_id(url) + request = Request( + 'http://api.nowness.com/api/' + request_path % display_id, + headers={ + 'X-Nowness-Language': 'zh-cn' if 'cn.nowness.com' in url else 'en-us', + }) + return display_id, self._download_json(request, display_id) + + +class NownessIE(NownessBaseIE): + IE_NAME = 'nowness' + _VALID_URL = r'https?://(?:(?:www|cn)\.)?nowness\.com/(?:story|(?:series|category)/[^/]+)/(?P<id>[^/]+?)(?:$|[?#])' + _TESTS = [{ + 'url': 'https://www.nowness.com/story/candor-the-art-of-gesticulation', + 'md5': '068bc0202558c2e391924cb8cc470676', + 'info_dict': { + 'id': '2520295746001', + 'ext': 'mp4', + 'title': 'Candor: The Art of Gesticulation', + 'description': 'Candor: The Art of Gesticulation', + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1446745676, + 'upload_date': '20151105', + 'uploader_id': '2385340575001', + }, + 'add_ie': ['BrightcoveNew'], + }, { + 'url': 'https://cn.nowness.com/story/kasper-bjorke-ft-jaakko-eino-kalevi-tnr', + 'md5': 'e79cf125e387216f86b2e0a5b5c63aa3', + 'info_dict': { + 'id': '3716354522001', + 'ext': 'mp4', + 'title': 'Kasper Bjørke ft. Jaakko Eino Kalevi: TNR', + 'description': 'Kasper Bjørke ft. Jaakko Eino Kalevi: TNR', + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1407315371, + 'upload_date': '20140806', + 'uploader_id': '2385340575001', + }, + 'add_ie': ['BrightcoveNew'], + }, { + # vimeo + 'url': 'https://www.nowness.com/series/nowness-picks/jean-luc-godard-supercut', + 'md5': '9a5a6a8edf806407e411296ab6bc2a49', + 'info_dict': { + 'id': '130020913', + 'ext': 'mp4', + 'title': 'Bleu, Blanc, Rouge - A Godard Supercut', + 'description': 'md5:f0ea5f1857dffca02dbd37875d742cec', + 'thumbnail': r're:^https?://.*\.jpg', + 'upload_date': '20150607', + 'uploader': 'Cinema Sem Lei', + 'uploader_id': 'cinemasemlei', + }, + 'add_ie': ['Vimeo'], + }] + + def _real_extract(self, url): + _, post = self._api_request(url, 'post/getBySlug/%s') + return self._extract_url_result(post) + + +class NownessPlaylistIE(NownessBaseIE): + IE_NAME = 'nowness:playlist' + _VALID_URL = r'https?://(?:(?:www|cn)\.)?nowness\.com/playlist/(?P<id>\d+)' + _TEST = { + 'url': 'https://www.nowness.com/playlist/3286/i-guess-thats-why-they-call-it-the-blues', + 'info_dict': { + 'id': '3286', + }, + 'playlist_mincount': 8, + } + + def _real_extract(self, url): + playlist_id, playlist = self._api_request(url, 'post?PlaylistId=%s') + entries = [self._extract_url_result(item) for item in playlist['items']] + return self.playlist_result(entries, playlist_id) + + +class NownessSeriesIE(NownessBaseIE): + IE_NAME = 'nowness:series' + _VALID_URL = r'https?://(?:(?:www|cn)\.)?nowness\.com/series/(?P<id>[^/]+?)(?:$|[?#])' + _TEST = { + 'url': 'https://www.nowness.com/series/60-seconds', + 'info_dict': { + 'id': '60', + 'title': '60 Seconds', + 'description': 'One-minute wisdom in a new NOWNESS series', + }, + 'playlist_mincount': 4, + } + + def _real_extract(self, url): + display_id, series = self._api_request(url, 'series/getBySlug/%s') + entries = [self._extract_url_result(post) for post in series['posts']] + series_title = None + series_description = None + translations = series.get('translations', []) + if translations: + series_title = translations[0].get('title') or translations[0]['seoTitle'] + series_description = translations[0].get('seoDescription') + return self.playlist_result( + entries, compat_str(series['id']), series_title, series_description) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/noz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/noz.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/noz.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/noz.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/npo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/npo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/npo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/npo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/npr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/npr.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/npr.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/npr.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nrk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nrk.py new file mode 100644 index 0000000..384865a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nrk.py @@ -0,0 +1,875 @@ +import itertools +import random +import re + +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + determine_ext, + int_or_none, + parse_duration, + parse_iso8601, + str_or_none, + try_get, + url_or_none, + urljoin, +) + + +class NRKBaseIE(InfoExtractor): + _GEO_COUNTRIES = ['NO'] + _CDN_REPL_REGEX = r'''(?x):// + (?: + nrkod\d{1,2}-httpcache0-47115-cacheod0\.dna\.ip-only\.net/47115-cacheod0| + nrk-od-no\.telenorcdn\.net| + minicdn-od\.nrk\.no/od/nrkhd-osl-rr\.netwerk\.no/no + )/''' + + def _extract_nrk_formats(self, asset_url, video_id): + if re.match(r'https?://[^/]+\.akamaihd\.net/i/', asset_url): + return self._extract_akamai_formats(asset_url, video_id) + asset_url = re.sub(r'(?:bw_(?:low|high)=\d+|no_audio_only)&?', '', asset_url) + formats = self._extract_m3u8_formats( + asset_url, video_id, 'mp4', 'm3u8_native', fatal=False) + if not formats and re.search(self._CDN_REPL_REGEX, asset_url): + formats = self._extract_m3u8_formats( + re.sub(self._CDN_REPL_REGEX, '://nrk-od-%02d.akamaized.net/no/' % random.randint(0, 99), asset_url), + video_id, 'mp4', 'm3u8_native', fatal=False) + return formats + + def _raise_error(self, data): + MESSAGES = { + 'ProgramRightsAreNotReady': 'Du kan dessverre ikke se eller høre programmet', + 'ProgramRightsHasExpired': 'Programmet har gÃ¥tt ut', + 'NoProgramRights': 'Ikke tilgjengelig', + 'ProgramIsGeoBlocked': 'NRK har ikke rettigheter til Ã¥ vise dette programmet utenfor Norge', + } + message_type = data.get('messageType', '') + # Can be ProgramIsGeoBlocked or ChannelIsGeoBlocked* + if 'IsGeoBlocked' in message_type or try_get(data, lambda x: x['usageRights']['isGeoBlocked']) is True: + self.raise_geo_restricted( + msg=MESSAGES.get('ProgramIsGeoBlocked'), + countries=self._GEO_COUNTRIES) + message = data.get('endUserMessage') or MESSAGES.get(message_type, message_type) + raise ExtractorError('%s said: %s' % (self.IE_NAME, message), expected=True) + + def _call_api(self, path, video_id, item=None, note=None, fatal=True, query=None): + return self._download_json( + urljoin('https://psapi.nrk.no/', path), + video_id, note or 'Downloading %s JSON' % item, + fatal=fatal, query=query) + + +class NRKIE(NRKBaseIE): + _VALID_URL = r'''(?x) + (?: + nrk:| + https?:// + (?: + (?:www\.)?nrk\.no/video/(?:PS\*|[^_]+_)| + v8[-.]psapi\.nrk\.no/mediaelement/ + ) + ) + (?P<id>[^?\#&]+) + ''' + + _TESTS = [{ + # video + 'url': 'http://www.nrk.no/video/PS*150533', + 'md5': 'f46be075326e23ad0e524edfcb06aeb6', + 'info_dict': { + 'id': '150533', + 'ext': 'mp4', + 'title': 'Dompap og andre fugler i Piip-Show', + 'description': 'md5:d9261ba34c43b61c812cb6b0269a5c8f', + 'duration': 262, + } + }, { + # audio + 'url': 'http://www.nrk.no/video/PS*154915', + # MD5 is unstable + 'info_dict': { + 'id': '154915', + 'ext': 'mp4', + 'title': 'Slik høres internett ut nÃ¥r du er blind', + 'description': 'md5:a621f5cc1bd75c8d5104cb048c6b8568', + 'duration': 20, + } + }, { + 'url': 'nrk:ecc1b952-96dc-4a98-81b9-5296dc7a98d9', + 'only_matching': True, + }, { + 'url': 'nrk:clip/7707d5a3-ebe7-434a-87d5-a3ebe7a34a70', + 'only_matching': True, + }, { + 'url': 'https://v8-psapi.nrk.no/mediaelement/ecc1b952-96dc-4a98-81b9-5296dc7a98d9', + 'only_matching': True, + }, { + 'url': 'https://www.nrk.no/video/dompap-og-andre-fugler-i-piip-show_150533', + 'only_matching': True, + }, { + 'url': 'https://www.nrk.no/video/humor/kommentatorboksen-reiser-til-sjos_d1fda11f-a4ad-437a-a374-0398bc84e999', + 'only_matching': True, + }, { + # podcast + 'url': 'nrk:l_96f4f1b0-de54-4e6a-b4f1-b0de54fe6af8', + 'only_matching': True, + }, { + 'url': 'nrk:podcast/l_96f4f1b0-de54-4e6a-b4f1-b0de54fe6af8', + 'only_matching': True, + }, { + # clip + 'url': 'nrk:150533', + 'only_matching': True, + }, { + 'url': 'nrk:clip/150533', + 'only_matching': True, + }, { + # program + 'url': 'nrk:MDDP12000117', + 'only_matching': True, + }, { + 'url': 'nrk:program/ENRK10100318', + 'only_matching': True, + }, { + # direkte + 'url': 'nrk:nrk1', + 'only_matching': True, + }, { + 'url': 'nrk:channel/nrk1', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url).split('/')[-1] + + def call_playback_api(item, query=None): + try: + return self._call_api(f'playback/{item}/program/{video_id}', video_id, item, query=query) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 400: + return self._call_api(f'playback/{item}/{video_id}', video_id, item, query=query) + raise + + # known values for preferredCdn: akamai, iponly, minicdn and telenor + manifest = call_playback_api('manifest', {'preferredCdn': 'akamai'}) + + video_id = try_get(manifest, lambda x: x['id'], compat_str) or video_id + + if manifest.get('playability') == 'nonPlayable': + self._raise_error(manifest['nonPlayable']) + + playable = manifest['playable'] + + formats = [] + for asset in playable['assets']: + if not isinstance(asset, dict): + continue + if asset.get('encrypted'): + continue + format_url = url_or_none(asset.get('url')) + if not format_url: + continue + asset_format = (asset.get('format') or '').lower() + if asset_format == 'hls' or determine_ext(format_url) == 'm3u8': + formats.extend(self._extract_nrk_formats(format_url, video_id)) + elif asset_format == 'mp3': + formats.append({ + 'url': format_url, + 'format_id': asset_format, + 'vcodec': 'none', + }) + + data = call_playback_api('metadata') + + preplay = data['preplay'] + titles = preplay['titles'] + title = titles['title'] + alt_title = titles.get('subtitle') + + description = try_get(preplay, lambda x: x['description'].replace('\r', '\n')) + duration = parse_duration(playable.get('duration')) or parse_duration(data.get('duration')) + + thumbnails = [] + for image in try_get( + preplay, lambda x: x['poster']['images'], list) or []: + if not isinstance(image, dict): + continue + image_url = url_or_none(image.get('url')) + if not image_url: + continue + thumbnails.append({ + 'url': image_url, + 'width': int_or_none(image.get('pixelWidth')), + 'height': int_or_none(image.get('pixelHeight')), + }) + + subtitles = {} + for sub in try_get(playable, lambda x: x['subtitles'], list) or []: + if not isinstance(sub, dict): + continue + sub_url = url_or_none(sub.get('webVtt')) + if not sub_url: + continue + sub_key = str_or_none(sub.get('language')) or 'nb' + sub_type = str_or_none(sub.get('type')) + if sub_type: + sub_key += '-%s' % sub_type + subtitles.setdefault(sub_key, []).append({ + 'url': sub_url, + }) + + legal_age = try_get( + data, lambda x: x['legalAge']['body']['rating']['code'], compat_str) + # https://en.wikipedia.org/wiki/Norwegian_Media_Authority + age_limit = None + if legal_age: + if legal_age == 'A': + age_limit = 0 + elif legal_age.isdigit(): + age_limit = int_or_none(legal_age) + + is_series = try_get(data, lambda x: x['_links']['series']['name']) == 'series' + + info = { + 'id': video_id, + 'title': title, + 'alt_title': alt_title, + 'description': description, + 'duration': duration, + 'thumbnails': thumbnails, + 'age_limit': age_limit, + 'formats': formats, + 'subtitles': subtitles, + 'timestamp': parse_iso8601(try_get(manifest, lambda x: x['availability']['onDemand']['from'], str)) + } + + if is_series: + series = season_id = season_number = episode = episode_number = None + programs = self._call_api( + 'programs/%s' % video_id, video_id, 'programs', fatal=False) + if programs and isinstance(programs, dict): + series = str_or_none(programs.get('seriesTitle')) + season_id = str_or_none(programs.get('seasonId')) + season_number = int_or_none(programs.get('seasonNumber')) + episode = str_or_none(programs.get('episodeTitle')) + episode_number = int_or_none(programs.get('episodeNumber')) + if not series: + series = title + if alt_title: + title += ' - %s' % alt_title + if not season_number: + season_number = int_or_none(self._search_regex( + r'Sesong\s+(\d+)', description or '', 'season number', + default=None)) + if not episode: + episode = alt_title if is_series else None + if not episode_number: + episode_number = int_or_none(self._search_regex( + r'^(\d+)\.', episode or '', 'episode number', + default=None)) + if not episode_number: + episode_number = int_or_none(self._search_regex( + r'\((\d+)\s*:\s*\d+\)', description or '', + 'episode number', default=None)) + info.update({ + 'title': title, + 'series': series, + 'season_id': season_id, + 'season_number': season_number, + 'episode': episode, + 'episode_number': episode_number, + }) + + return info + + +class NRKTVIE(InfoExtractor): + IE_DESC = 'NRK TV and NRK Radio' + _EPISODE_RE = r'(?P<id>[a-zA-Z]{4}\d{8})' + _VALID_URL = r'https?://(?:tv|radio)\.nrk(?:super)?\.no/(?:[^/]+/)*%s' % _EPISODE_RE + _TESTS = [{ + 'url': 'https://tv.nrk.no/program/MDDP12000117', + 'md5': 'c4a5960f1b00b40d47db65c1064e0ab1', + 'info_dict': { + 'id': 'MDDP12000117', + 'ext': 'mp4', + 'title': 'Alarm Trolltunga', + 'description': 'md5:46923a6e6510eefcce23d5ef2a58f2ce', + 'duration': 2223.44, + 'age_limit': 6, + 'subtitles': { + 'nb-nor': [{ + 'ext': 'vtt', + }], + 'nb-ttv': [{ + 'ext': 'vtt', + }] + }, + }, + }, { + 'url': 'https://tv.nrk.no/serie/20-spoersmaal-tv/MUHH48000314/23-05-2014', + 'md5': '8d40dab61cea8ab0114e090b029a0565', + 'info_dict': { + 'id': 'MUHH48000314', + 'ext': 'mp4', + 'title': '20 spørsmÃ¥l - 23. mai 2014', + 'alt_title': '23. mai 2014', + 'description': 'md5:bdea103bc35494c143c6a9acdd84887a', + 'duration': 1741, + 'series': '20 spørsmÃ¥l', + 'episode': '23. mai 2014', + 'age_limit': 0, + }, + }, { + 'url': 'https://tv.nrk.no/program/mdfp15000514', + 'info_dict': { + 'id': 'MDFP15000514', + 'ext': 'mp4', + 'title': 'Kunnskapskanalen - Grunnlovsjubiléet - Stor stÃ¥hei for ingenting', + 'description': 'md5:89290c5ccde1b3a24bb8050ab67fe1db', + 'duration': 4605.08, + 'series': 'Kunnskapskanalen', + 'episode': 'Grunnlovsjubiléet - Stor stÃ¥hei for ingenting', + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + }, { + # single playlist video + 'url': 'https://tv.nrk.no/serie/tour-de-ski/MSPO40010515/06-01-2015#del=2', + 'info_dict': { + 'id': 'MSPO40010515', + 'ext': 'mp4', + 'title': 'Sprint fri teknikk, kvinner og menn 06.01.2015', + 'description': 'md5:c03aba1e917561eface5214020551b7a', + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['Failed to download m3u8 information'], + 'skip': 'particular part is not supported currently', + }, { + 'url': 'https://tv.nrk.no/serie/tour-de-ski/MSPO40010515/06-01-2015', + 'info_dict': { + 'id': 'MSPO40010515', + 'ext': 'mp4', + 'title': 'Sprint fri teknikk, kvinner og menn 06.01.2015', + 'description': 'md5:c03aba1e917561eface5214020551b7a', + 'age_limit': 0, + }, + 'expected_warnings': ['Failed to download m3u8 information'], + 'skip': 'Ikke tilgjengelig utenfor Norge', + }, { + 'url': 'https://tv.nrk.no/serie/anno/KMTE50001317/sesong-3/episode-13', + 'info_dict': { + 'id': 'KMTE50001317', + 'ext': 'mp4', + 'title': 'Anno - 13. episode', + 'description': 'md5:11d9613661a8dbe6f9bef54e3a4cbbfa', + 'duration': 2340, + 'series': 'Anno', + 'episode': '13. episode', + 'season_number': 3, + 'episode_number': 13, + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://tv.nrk.no/serie/nytt-paa-nytt/MUHH46000317/27-01-2017', + 'info_dict': { + 'id': 'MUHH46000317', + 'ext': 'mp4', + 'title': 'Nytt pÃ¥ Nytt 27.01.2017', + 'description': 'md5:5358d6388fba0ea6f0b6d11c48b9eb4b', + 'duration': 1796, + 'series': 'Nytt pÃ¥ nytt', + 'episode': '27.01.2017', + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'ProgramRightsHasExpired', + }, { + 'url': 'https://radio.nrk.no/serie/dagsnytt/NPUB21019315/12-07-2015#', + 'only_matching': True, + }, { + 'url': 'https://tv.nrk.no/serie/lindmo/2018/MUHU11006318/avspiller', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/serie/dagsnytt/sesong/201507/NPUB21019315', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + return self.url_result( + 'nrk:%s' % video_id, ie=NRKIE.ie_key(), video_id=video_id) + + +class NRKTVEpisodeIE(InfoExtractor): + _VALID_URL = r'https?://tv\.nrk\.no/serie/(?P<id>[^/]+/sesong/(?P<season_number>\d+)/episode/(?P<episode_number>\d+))' + _TESTS = [{ + 'url': 'https://tv.nrk.no/serie/hellums-kro/sesong/1/episode/2', + 'info_dict': { + 'id': 'MUHH36005220', + 'ext': 'mp4', + 'title': 'Hellums kro - 2. Kro, krig og kjærlighet', + 'description': 'md5:ad92ddffc04cea8ce14b415deef81787', + 'duration': 1563.92, + 'series': 'Hellums kro', + 'season_number': 1, + 'episode_number': 2, + 'episode': '2. Kro, krig og kjærlighet', + 'age_limit': 6, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://tv.nrk.no/serie/backstage/sesong/1/episode/8', + 'info_dict': { + 'id': 'MSUI14000816', + 'ext': 'mp4', + 'title': 'Backstage - 8. episode', + 'description': 'md5:de6ca5d5a2d56849e4021f2bf2850df4', + 'duration': 1320, + 'series': 'Backstage', + 'season_number': 1, + 'episode_number': 8, + 'episode': '8. episode', + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'ProgramRightsHasExpired', + }] + + def _real_extract(self, url): + display_id, season_number, episode_number = self._match_valid_url(url).groups() + + webpage = self._download_webpage(url, display_id) + + info = self._search_json_ld(webpage, display_id, default={}) + nrk_id = info.get('@id') or self._html_search_meta( + 'nrk:program-id', webpage, default=None) or self._search_regex( + r'data-program-id=["\'](%s)' % NRKTVIE._EPISODE_RE, webpage, + 'nrk id') + assert re.match(NRKTVIE._EPISODE_RE, nrk_id) + + info.update({ + '_type': 'url', + 'id': nrk_id, + 'url': 'nrk:%s' % nrk_id, + 'ie_key': NRKIE.ie_key(), + 'season_number': int(season_number), + 'episode_number': int(episode_number), + }) + return info + + +class NRKTVSerieBaseIE(NRKBaseIE): + def _extract_entries(self, entry_list): + if not isinstance(entry_list, list): + return [] + entries = [] + for episode in entry_list: + nrk_id = episode.get('prfId') or episode.get('episodeId') + if not nrk_id or not isinstance(nrk_id, compat_str): + continue + entries.append(self.url_result( + 'nrk:%s' % nrk_id, ie=NRKIE.ie_key(), video_id=nrk_id)) + return entries + + _ASSETS_KEYS = ('episodes', 'instalments',) + + def _extract_assets_key(self, embedded): + for asset_key in self._ASSETS_KEYS: + if embedded.get(asset_key): + return asset_key + + @staticmethod + def _catalog_name(serie_kind): + return 'podcast' if serie_kind in ('podcast', 'podkast') else 'series' + + def _entries(self, data, display_id): + for page_num in itertools.count(1): + embedded = data.get('_embedded') or data + if not isinstance(embedded, dict): + break + assets_key = self._extract_assets_key(embedded) + if not assets_key: + break + # Extract entries + entries = try_get( + embedded, + (lambda x: x[assets_key]['_embedded'][assets_key], + lambda x: x[assets_key]), + list) + for e in self._extract_entries(entries): + yield e + # Find next URL + next_url_path = try_get( + data, + (lambda x: x['_links']['next']['href'], + lambda x: x['_embedded'][assets_key]['_links']['next']['href']), + compat_str) + if not next_url_path: + break + data = self._call_api( + next_url_path, display_id, + note='Downloading %s JSON page %d' % (assets_key, page_num), + fatal=False) + if not data: + break + + +class NRKTVSeasonIE(NRKTVSerieBaseIE): + _VALID_URL = r'''(?x) + https?:// + (?P<domain>tv|radio)\.nrk\.no/ + (?P<serie_kind>serie|pod[ck]ast)/ + (?P<serie>[^/]+)/ + (?: + (?:sesong/)?(?P<id>\d+)| + sesong/(?P<id_2>[^/?#&]+) + ) + ''' + _TESTS = [{ + 'url': 'https://tv.nrk.no/serie/backstage/sesong/1', + 'info_dict': { + 'id': 'backstage/1', + 'title': 'Sesong 1', + }, + 'playlist_mincount': 30, + }, { + # no /sesong/ in path + 'url': 'https://tv.nrk.no/serie/lindmo/2016', + 'info_dict': { + 'id': 'lindmo/2016', + 'title': '2016', + }, + 'playlist_mincount': 29, + }, { + # weird nested _embedded in catalog JSON response + 'url': 'https://radio.nrk.no/serie/dickie-dick-dickens/sesong/1', + 'info_dict': { + 'id': 'dickie-dick-dickens/1', + 'title': 'Sesong 1', + }, + 'playlist_mincount': 11, + }, { + # 841 entries, multi page + 'url': 'https://radio.nrk.no/serie/dagsnytt/sesong/201509', + 'info_dict': { + 'id': 'dagsnytt/201509', + 'title': 'September 2015', + }, + 'playlist_mincount': 841, + }, { + # 180 entries, single page + 'url': 'https://tv.nrk.no/serie/spangas/sesong/1', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/podkast/hele_historien/sesong/diagnose-kverulant', + 'info_dict': { + 'id': 'hele_historien/diagnose-kverulant', + 'title': 'Diagnose kverulant', + }, + 'playlist_mincount': 3, + }, { + 'url': 'https://radio.nrk.no/podkast/loerdagsraadet/sesong/202101', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return (False if NRKTVIE.suitable(url) or NRKTVEpisodeIE.suitable(url) or NRKRadioPodkastIE.suitable(url) + else super(NRKTVSeasonIE, cls).suitable(url)) + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + domain = mobj.group('domain') + serie_kind = mobj.group('serie_kind') + serie = mobj.group('serie') + season_id = mobj.group('id') or mobj.group('id_2') + display_id = '%s/%s' % (serie, season_id) + + data = self._call_api( + '%s/catalog/%s/%s/seasons/%s' + % (domain, self._catalog_name(serie_kind), serie, season_id), + display_id, 'season', query={'pageSize': 50}) + + title = try_get(data, lambda x: x['titles']['title'], compat_str) or display_id + return self.playlist_result( + self._entries(data, display_id), + display_id, title) + + +class NRKTVSeriesIE(NRKTVSerieBaseIE): + _VALID_URL = r'https?://(?P<domain>(?:tv|radio)\.nrk|(?:tv\.)?nrksuper)\.no/(?P<serie_kind>serie|pod[ck]ast)/(?P<id>[^/]+)' + _TESTS = [{ + # new layout, instalments + 'url': 'https://tv.nrk.no/serie/groenn-glede', + 'info_dict': { + 'id': 'groenn-glede', + 'title': 'Grønn glede', + 'description': 'md5:7576e92ae7f65da6993cf90ee29e4608', + }, + 'playlist_mincount': 90, + }, { + # new layout, instalments, more entries + 'url': 'https://tv.nrk.no/serie/lindmo', + 'only_matching': True, + }, { + 'url': 'https://tv.nrk.no/serie/blank', + 'info_dict': { + 'id': 'blank', + 'title': 'Blank', + 'description': 'md5:7664b4e7e77dc6810cd3bca367c25b6e', + }, + 'playlist_mincount': 30, + }, { + # new layout, seasons + 'url': 'https://tv.nrk.no/serie/backstage', + 'info_dict': { + 'id': 'backstage', + 'title': 'Backstage', + 'description': 'md5:63692ceb96813d9a207e9910483d948b', + }, + 'playlist_mincount': 60, + }, { + # old layout + 'url': 'https://tv.nrksuper.no/serie/labyrint', + 'info_dict': { + 'id': 'labyrint', + 'title': 'Labyrint', + 'description': 'I Daidalos sin undersjøiske Labyrint venter spennende oppgaver, skumle robotskapninger og slim.', + }, + 'playlist_mincount': 3, + }, { + 'url': 'https://tv.nrk.no/serie/broedrene-dal-og-spektralsteinene', + 'only_matching': True, + }, { + 'url': 'https://tv.nrk.no/serie/saving-the-human-race', + 'only_matching': True, + }, { + 'url': 'https://tv.nrk.no/serie/postmann-pat', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/serie/dickie-dick-dickens', + 'info_dict': { + 'id': 'dickie-dick-dickens', + 'title': 'Dickie Dick Dickens', + 'description': 'md5:19e67411ffe57f7dce08a943d7a0b91f', + }, + 'playlist_mincount': 8, + }, { + 'url': 'https://nrksuper.no/serie/labyrint', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/podkast/ulrikkes_univers', + 'info_dict': { + 'id': 'ulrikkes_univers', + }, + 'playlist_mincount': 10, + }, { + 'url': 'https://radio.nrk.no/podkast/ulrikkes_univers/nrkno-poddkast-26588-134079-05042018030000', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return ( + False if any(ie.suitable(url) + for ie in (NRKTVIE, NRKTVEpisodeIE, NRKRadioPodkastIE, NRKTVSeasonIE)) + else super(NRKTVSeriesIE, cls).suitable(url)) + + def _real_extract(self, url): + site, serie_kind, series_id = self._match_valid_url(url).groups() + is_radio = site == 'radio.nrk' + domain = 'radio' if is_radio else 'tv' + + size_prefix = 'p' if is_radio else 'embeddedInstalmentsP' + series = self._call_api( + '%s/catalog/%s/%s' + % (domain, self._catalog_name(serie_kind), series_id), + series_id, 'serie', query={size_prefix + 'ageSize': 50}) + titles = try_get(series, [ + lambda x: x['titles'], + lambda x: x[x['type']]['titles'], + lambda x: x[x['seriesType']]['titles'], + ]) or {} + + entries = [] + entries.extend(self._entries(series, series_id)) + embedded = series.get('_embedded') or {} + linked_seasons = try_get(series, lambda x: x['_links']['seasons']) or [] + embedded_seasons = embedded.get('seasons') or [] + if len(linked_seasons) > len(embedded_seasons): + for season in linked_seasons: + season_url = urljoin(url, season.get('href')) + if not season_url: + season_name = season.get('name') + if season_name and isinstance(season_name, compat_str): + season_url = 'https://%s.nrk.no/serie/%s/sesong/%s' % (domain, series_id, season_name) + if season_url: + entries.append(self.url_result( + season_url, ie=NRKTVSeasonIE.ie_key(), + video_title=season.get('title'))) + else: + for season in embedded_seasons: + entries.extend(self._entries(season, series_id)) + entries.extend(self._entries( + embedded.get('extraMaterial') or {}, series_id)) + + return self.playlist_result( + entries, series_id, titles.get('title'), titles.get('subtitle')) + + +class NRKTVDirekteIE(NRKTVIE): # XXX: Do not subclass from concrete IE + IE_DESC = 'NRK TV Direkte and NRK Radio Direkte' + _VALID_URL = r'https?://(?:tv|radio)\.nrk\.no/direkte/(?P<id>[^/?#&]+)' + + _TESTS = [{ + 'url': 'https://tv.nrk.no/direkte/nrk1', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/direkte/p1_oslo_akershus', + 'only_matching': True, + }] + + +class NRKRadioPodkastIE(InfoExtractor): + _VALID_URL = r'https?://radio\.nrk\.no/pod[ck]ast/(?:[^/]+/)+(?P<id>l_[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})' + + _TESTS = [{ + 'url': 'https://radio.nrk.no/podkast/ulrikkes_univers/l_96f4f1b0-de54-4e6a-b4f1-b0de54fe6af8', + 'md5': '8d40dab61cea8ab0114e090b029a0565', + 'info_dict': { + 'id': 'MUHH48000314AA', + 'ext': 'mp4', + 'title': '20 spørsmÃ¥l 23.05.2014', + 'description': 'md5:bdea103bc35494c143c6a9acdd84887a', + 'duration': 1741, + 'series': '20 spørsmÃ¥l', + 'episode': '23.05.2014', + }, + }, { + 'url': 'https://radio.nrk.no/podcast/ulrikkes_univers/l_96f4f1b0-de54-4e6a-b4f1-b0de54fe6af8', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/podkast/ulrikkes_univers/sesong/1/l_96f4f1b0-de54-4e6a-b4f1-b0de54fe6af8', + 'only_matching': True, + }, { + 'url': 'https://radio.nrk.no/podkast/hele_historien/sesong/bortfoert-i-bergen/l_774d1a2c-7aa7-4965-8d1a-2c7aa7d9652c', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + return self.url_result( + 'nrk:%s' % video_id, ie=NRKIE.ie_key(), video_id=video_id) + + +class NRKPlaylistBaseIE(InfoExtractor): + def _extract_description(self, webpage): + pass + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + webpage = self._download_webpage(url, playlist_id) + + entries = [ + self.url_result('nrk:%s' % video_id, NRKIE.ie_key()) + for video_id in re.findall(self._ITEM_RE, webpage) + ] + + playlist_title = self._extract_title(webpage) + playlist_description = self._extract_description(webpage) + + return self.playlist_result( + entries, playlist_id, playlist_title, playlist_description) + + +class NRKPlaylistIE(NRKPlaylistBaseIE): + _VALID_URL = r'https?://(?:www\.)?nrk\.no/(?!video|skole)(?:[^/]+/)+(?P<id>[^/]+)' + _ITEM_RE = r'class="[^"]*\brich\b[^"]*"[^>]+data-video-id="([^"]+)"' + _TESTS = [{ + 'url': 'http://www.nrk.no/troms/gjenopplev-den-historiske-solformorkelsen-1.12270763', + 'info_dict': { + 'id': 'gjenopplev-den-historiske-solformorkelsen-1.12270763', + 'title': 'Gjenopplev den historiske solformørkelsen', + 'description': 'md5:c2df8ea3bac5654a26fc2834a542feed', + }, + 'playlist_count': 2, + }, { + 'url': 'http://www.nrk.no/kultur/bok/rivertonprisen-til-karin-fossum-1.12266449', + 'info_dict': { + 'id': 'rivertonprisen-til-karin-fossum-1.12266449', + 'title': 'Rivertonprisen til Karin Fossum', + 'description': 'Første kvinne pÃ¥ 15 Ã¥r til Ã¥ vinne krimlitteraturprisen.', + }, + 'playlist_count': 2, + }] + + def _extract_title(self, webpage): + return self._og_search_title(webpage, fatal=False) + + def _extract_description(self, webpage): + return self._og_search_description(webpage) + + +class NRKTVEpisodesIE(NRKPlaylistBaseIE): + _VALID_URL = r'https?://tv\.nrk\.no/program/[Ee]pisodes/[^/]+/(?P<id>\d+)' + _ITEM_RE = r'data-episode=["\']%s' % NRKTVIE._EPISODE_RE + _TESTS = [{ + 'url': 'https://tv.nrk.no/program/episodes/nytt-paa-nytt/69031', + 'info_dict': { + 'id': '69031', + 'title': 'Nytt pÃ¥ nytt, sesong: 201210', + }, + 'playlist_count': 4, + }] + + def _extract_title(self, webpage): + return self._html_search_regex( + r'<h1>([^<]+)</h1>', webpage, 'title', fatal=False) + + +class NRKSkoleIE(InfoExtractor): + IE_DESC = 'NRK Skole' + _VALID_URL = r'https?://(?:www\.)?nrk\.no/skole/?\?.*\bmediaId=(?P<id>\d+)' + + _TESTS = [{ + 'url': 'https://www.nrk.no/skole/?page=search&q=&mediaId=14099', + 'md5': '18c12c3d071953c3bf8d54ef6b2587b7', + 'info_dict': { + 'id': '6021', + 'ext': 'mp4', + 'title': 'Genetikk og eneggede tvillinger', + 'description': 'md5:3aca25dcf38ec30f0363428d2b265f8d', + 'duration': 399, + }, + }, { + 'url': 'https://www.nrk.no/skole/?page=objectives&subject=naturfag&objective=K15114&mediaId=19355', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + nrk_id = self._download_json( + 'https://nrkno-skole-prod.kube.nrk.no/skole/api/media/%s' % video_id, + video_id)['psId'] + + return self.url_result('nrk:%s' % nrk_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nrl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nrl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nrl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nrl.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ntvcojp.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ntvcojp.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ntvcojp.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ntvcojp.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ntvde.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ntvde.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ntvde.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ntvde.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ntvru.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ntvru.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ntvru.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ntvru.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/nubilesporn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nubilesporn.py new file mode 100644 index 0000000..1d630f5 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/nubilesporn.py @@ -0,0 +1,99 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + float_or_none, + format_field, + get_element_by_class, + get_element_by_id, + get_element_html_by_class, + get_elements_by_class, + int_or_none, + try_call, + unified_timestamp, + urlencode_postdata, +) + + +class NubilesPornIE(InfoExtractor): + _NETRC_MACHINE = 'nubiles-porn' + _VALID_URL = r'''(?x) + https://members\.nubiles-porn\.com/video/watch/(?P<id>\d+) + (?:/(?P<display_id>[\w\-]+-s(?P<season>\d+)e(?P<episode>\d+)))? + ''' + + _TESTS = [{ + 'url': 'https://members.nubiles-porn.com/video/watch/165320/trying-to-focus-my-one-track-mind-s3e1', + 'md5': 'fa7f09da8027c35e4bdf0f94f55eac82', + 'info_dict': { + 'id': '165320', + 'title': 'Trying To Focus My One Track Mind - S3:E1', + 'ext': 'mp4', + 'display_id': 'trying-to-focus-my-one-track-mind-s3e1', + 'thumbnail': 'https://images.nubiles-porn.com/videos/trying_to_focus_my_one_track_mind/samples/cover1280.jpg', + 'description': 'md5:81f3d4372e0e39bff5c801da277a5141', + 'timestamp': 1676160000, + 'upload_date': '20230212', + 'channel': 'Younger Mommy', + 'channel_id': '64', + 'channel_url': 'https://members.nubiles-porn.com/video/website/64', + 'like_count': int, + 'average_rating': float, + 'age_limit': 18, + 'categories': ['Big Boobs', 'Big Naturals', 'Blowjob', 'Brunette', 'Cowgirl', 'Girl Orgasm', 'Girl-Boy', + 'Glasses', 'Hardcore', 'Milf', 'Shaved Pussy', 'Tattoos', 'YoungerMommy.com'], + 'tags': list, + 'cast': ['Kenzie Love'], + 'availability': 'needs_auth', + 'series': 'Younger Mommy', + 'series_id': '64', + 'season': 'Season 3', + 'season_number': 3, + 'episode': 'Episode 1', + 'episode_number': 1 + } + }] + + def _perform_login(self, username, password): + login_webpage = self._download_webpage('https://nubiles-porn.com/login', video_id=None) + inputs = self._hidden_inputs(login_webpage) + inputs.update({'username': username, 'password': password}) + self._request_webpage('https://nubiles-porn.com/authentication/login', None, data=urlencode_postdata(inputs)) + + def _real_extract(self, url): + url_match = self._match_valid_url(url) + video_id = url_match.group('id') + page = self._download_webpage(url, video_id) + + media_entries = self._parse_html5_media_entries( + url, get_element_by_class('watch-page-video-wrapper', page), video_id)[0] + + channel_id, channel_name = self._search_regex( + r'/video/website/(?P<id>\d+).+>(?P<name>\w+).com', get_element_html_by_class('site-link', page), + 'channel', fatal=False, group=('id', 'name')) or (None, None) + channel_name = re.sub(r'([^A-Z]+)([A-Z]+)', r'\1 \2', channel_name) + + return { + 'id': video_id, + 'title': self._search_regex('<h2>([^<]+)</h2>', page, 'title', fatal=False), + 'formats': media_entries.get('formats'), + 'display_id': url_match.group('display_id'), + 'thumbnail': media_entries.get('thumbnail'), + 'description': clean_html(get_element_html_by_class('content-pane-description', page)), + 'timestamp': unified_timestamp(get_element_by_class('date', page)), + 'channel': channel_name, + 'channel_id': channel_id, + 'channel_url': format_field(channel_id, None, 'https://members.nubiles-porn.com/video/website/%s'), + 'like_count': int_or_none(get_element_by_id('likecount', page)), + 'average_rating': float_or_none(get_element_by_class('score', page)), + 'age_limit': 18, + 'categories': try_call(lambda: list(map(clean_html, get_elements_by_class('btn', get_element_by_class('categories', page))))), + 'tags': try_call(lambda: list(map(clean_html, get_elements_by_class('btn', get_elements_by_class('tags', page)[1])))), + 'cast': get_elements_by_class('content-pane-performer', page), + 'availability': 'needs_auth', + 'series': channel_name, + 'series_id': channel_id, + 'season_number': int_or_none(url_match.group('season')), + 'episode_number': int_or_none(url_match.group('episode')) + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nuevo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nuevo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nuevo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nuevo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nuvid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nuvid.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nuvid.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nuvid.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nytimes.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nytimes.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nytimes.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nytimes.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nzherald.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nzherald.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nzherald.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nzherald.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nzonscreen.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nzonscreen.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nzonscreen.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nzonscreen.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/nzz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/nzz.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/nzz.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/nzz.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/odatv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/odatv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/odatv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/odatv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/odkmedia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/odkmedia.py new file mode 100644 index 0000000..b852160 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/odkmedia.py @@ -0,0 +1,105 @@ +import json + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + GeoRestrictedError, + float_or_none, + traverse_obj, + try_call +) + + +class OnDemandChinaEpisodeIE(InfoExtractor): + _VALID_URL = r'https?://www\.ondemandchina\.com/\w+/watch/(?P<series>[\w-]+)/(?P<id>ep-(?P<ep>\d+))' + _TESTS = [{ + 'url': 'https://www.ondemandchina.com/en/watch/together-against-covid-19/ep-1', + 'info_dict': { + 'id': '264394', + 'ext': 'mp4', + 'duration': 3256.88, + 'title': 'EP 1 The Calling', + 'alt_title': '第1集 令出如山', + 'thumbnail': 'https://d2y2efdi5wgkcl.cloudfront.net/fit-in/256x256/media-io/2020/9/11/image.d9816e81.jpg', + 'description': '疫情严峻,党政军民学ã€ä¸œè¥¿å—北中ååŒåº”考', + 'tags': ['Social Humanities', 'Documentary', 'Medical', 'Social'], + } + }] + + _QUERY = ''' + query Episode($programSlug: String!, $episodeNumber: Int!) { + episode( + programSlug: $programSlug + episodeNumber: $episodeNumber + kind: "series" + part: null + ) { + id + title + titleEn + titleKo + titleZhHans + titleZhHant + synopsis + synopsisEn + synopsisKo + synopsisZhHans + synopsisZhHant + videoDuration + images { + thumbnail + } + } + }''' + + def _real_extract(self, url): + program_slug, display_id, ep_number = self._match_valid_url(url).group('series', 'id', 'ep') + webpage = self._download_webpage(url, display_id) + + video_info = self._download_json( + 'https://odc-graphql.odkmedia.io/graphql', display_id, + headers={'Content-type': 'application/json'}, + data=json.dumps({ + 'operationName': 'Episode', + 'query': self._QUERY, + 'variables': { + 'programSlug': program_slug, + 'episodeNumber': int(ep_number), + }, + }).encode())['data']['episode'] + + try: + source_json = self._download_json( + f'https://odkmedia.io/odc/api/v2/playback/{video_info["id"]}/', display_id, + headers={'Authorization': '', 'service-name': 'odc'}) + except ExtractorError as e: + if isinstance(e.cause, HTTPError): + error_data = self._parse_json(e.cause.response.read(), display_id)['detail'] + raise GeoRestrictedError(error_data) + + formats, subtitles = [], {} + for source in traverse_obj(source_json, ('sources', ...)): + if source.get('type') == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles(source.get('url'), display_id) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + self.report_warning(f'Unsupported format {source.get("type")}', display_id) + + return { + 'id': str(video_info['id']), + 'duration': float_or_none(video_info.get('videoDuration'), 1000), + 'thumbnail': (traverse_obj(video_info, ('images', 'thumbnail')) + or self._html_search_meta(['og:image', 'twitter:image'], webpage)), + 'title': (traverse_obj(video_info, 'title', 'titleEn') + or self._html_search_meta(['og:title', 'twitter:title'], webpage) + or self._html_extract_title(webpage)), + 'alt_title': traverse_obj(video_info, 'titleKo', 'titleZhHans', 'titleZhHant'), + 'description': (traverse_obj( + video_info, 'synopsisEn', 'synopsisKo', 'synopsisZhHans', 'synopsisZhHant', 'synopisis') + or self._html_search_meta(['og:description', 'twitter:description', 'description'], webpage)), + 'formats': formats, + 'subtitles': subtitles, + 'tags': try_call(lambda: self._html_search_meta('keywords', webpage).split(', ')) + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/odnoklassniki.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/odnoklassniki.py new file mode 100644 index 0000000..1be45d8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/odnoklassniki.py @@ -0,0 +1,464 @@ +import urllib.parse + +from .common import InfoExtractor +from ..compat import ( + compat_etree_fromstring, + compat_parse_qs, + compat_urllib_parse_unquote, + compat_urllib_parse_urlparse, +) +from ..networking import HEADRequest +from ..utils import ( + ExtractorError, + float_or_none, + int_or_none, + qualities, + smuggle_url, + traverse_obj, + unescapeHTML, + unified_strdate, + unsmuggle_url, + url_or_none, + urlencode_postdata, +) + + +class OdnoklassnikiIE(InfoExtractor): + _VALID_URL = r'''(?x) + https?:// + (?:(?:www|m|mobile)\.)? + (?:odnoklassniki|ok)\.ru/ + (?: + video(?P<embed>embed)?/| + web-api/video/moviePlayer/| + live/| + dk\?.*?st\.mvId= + ) + (?P<id>[\d-]+) + ''' + _EMBED_REGEX = [r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//(?:odnoklassniki|ok)\.ru/videoembed/.+?)\1'] + _TESTS = [{ + 'note': 'Coub embedded', + 'url': 'http://ok.ru/video/1484130554189', + 'info_dict': { + 'id': '1keok9', + 'ext': 'mp4', + 'timestamp': 1545580896, + 'view_count': int, + 'thumbnail': r're:^https?://.*\.jpg$', + 'title': 'ÐÐ°Ñ€Ð¾Ð´Ð½Ð°Ñ Ð·Ð°Ð±Ð°Ð²Ð°', + 'uploader': 'Nevata', + 'upload_date': '20181223', + 'age_limit': 0, + 'uploader_id': 'nevata.s', + 'like_count': int, + 'duration': 8.08, + 'repost_count': int, + }, + }, { + 'note': 'vk.com embedded', + 'url': 'https://ok.ru/video/3568183087575', + 'info_dict': { + 'id': '-165101755_456243749', + 'ext': 'mp4', + 'uploader_id': '-165101755', + 'duration': 132, + 'timestamp': 1642869935, + 'upload_date': '20220122', + 'thumbnail': str, + 'title': str, + 'uploader': str, + }, + 'skip': 'vk extractor error', + }, { + # metadata in JSON, webm_dash with Firefox UA + 'url': 'http://ok.ru/video/20079905452', + 'md5': '8f477d8931c531374a3e36daec617b2c', + 'info_dict': { + 'id': '20079905452', + 'ext': 'webm', + 'title': 'Культура менÑет Ð½Ð°Ñ (прекраÑный ролик!))', + 'thumbnail': str, + 'duration': 100, + 'upload_date': '20141207', + 'uploader_id': '330537914540', + 'uploader': 'Виталий ДобровольÑкий', + 'like_count': int, + 'age_limit': 0, + }, + 'params': { + 'format': 'bv[ext=webm]', + 'http_headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Firefox/102.0'}, + }, + }, { + # metadataUrl + 'url': 'http://ok.ru/video/63567059965189-0?fromTime=5', + 'md5': '2bae2f58eefe1b3d26f3926c4a64d2f3', + 'info_dict': { + 'id': '63567059965189-0', + 'ext': 'mp4', + 'title': 'Девушка без комплекÑов ...', + 'thumbnail': str, + 'duration': 191, + 'upload_date': '20150518', + 'uploader_id': '534380003155', + 'uploader': '☭ Ðндрей Мещанинов ☭', + 'like_count': int, + 'age_limit': 0, + 'start_time': 5, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # YouTube embed (metadataUrl, provider == USER_YOUTUBE) + 'url': 'https://ok.ru/video/3952212382174', + 'md5': '5fb5f83ce16cb212d6bf887282b5da53', + 'info_dict': { + 'id': '5axVgHHDBvU', + 'ext': 'mp4', + 'title': 'Youtube-dl 101: What is it and HOW to use it! Full Download Walkthrough and Guide', + 'description': 'md5:b57209eeb9d5c2f20c984dfb58862097', + 'uploader': 'Lod Mer', + 'uploader_id': '575186401502', + 'duration': 1529, + 'age_limit': 0, + 'upload_date': '20210405', + 'comment_count': int, + 'live_status': 'not_live', + 'view_count': int, + 'thumbnail': 'https://i.mycdn.me/i?r=AEHujHvw2RjEbemUCNEorZbxYpb_p_9AcN2FmGik64Krkcmz37YtlY093oAM5-HIEAt7Zi9s0CiBOSDmbngC-I-k&fn=external_8', + 'uploader_url': 'https://www.youtube.com/@MrKewlkid94', + 'channel_follower_count': int, + 'tags': ['youtube-dl', 'youtube playlists', 'download videos', 'download audio'], + 'channel_id': 'UCVGtvURtEURYHtJFUegdSug', + 'like_count': int, + 'availability': 'public', + 'channel_url': 'https://www.youtube.com/channel/UCVGtvURtEURYHtJFUegdSug', + 'categories': ['Education'], + 'playable_in_embed': True, + 'channel': 'BornToReact', + }, + }, { + # YouTube embed (metadata, provider == USER_YOUTUBE, no metadata.movie.title field) + 'url': 'http://ok.ru/video/62036049272859-0', + 'info_dict': { + 'id': '62036049272859-0', + 'ext': 'mp4', + 'title': 'МУЗЫКРДОЖДЯ .', + 'description': 'md5:6f1867132bd96e33bf53eda1091e8ed0', + 'upload_date': '20120106', + 'uploader_id': '473534735899', + 'uploader': 'МARINA D', + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'Video has not been found', + }, { + 'note': 'Only available in mobile webpage', + 'url': 'https://m.ok.ru/video/2361249957145', + 'info_dict': { + 'id': '2361249957145', + 'ext': 'mp4', + 'title': 'БыковÑкое крещение', + 'duration': 3038.181, + 'thumbnail': r're:^https?://i\.mycdn\.me/videoPreview\?.+', + }, + }, { + 'note': 'subtitles', + 'url': 'https://ok.ru/video/4249587550747', + 'info_dict': { + 'id': '4249587550747', + 'ext': 'mp4', + 'title': 'Small Country An African Childhood (2020) (1080p) +subtitle', + 'uploader': 'Sunflower Movies', + 'uploader_id': '595802161179', + 'upload_date': '20220816', + 'duration': 6728, + 'age_limit': 0, + 'thumbnail': r're:^https?://i\.mycdn\.me/videoPreview\?.+', + 'like_count': int, + 'subtitles': dict, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'http://ok.ru/web-api/video/moviePlayer/20079905452', + 'only_matching': True, + }, { + 'url': 'http://www.ok.ru/video/20648036891', + 'only_matching': True, + }, { + 'url': 'http://www.ok.ru/videoembed/20648036891', + 'only_matching': True, + }, { + 'url': 'http://m.ok.ru/video/20079905452', + 'only_matching': True, + }, { + 'url': 'http://mobile.ok.ru/video/20079905452', + 'only_matching': True, + }, { + 'url': 'https://www.ok.ru/live/484531969818', + 'only_matching': True, + }, { + 'url': 'https://m.ok.ru/dk?st.cmd=movieLayer&st.discId=863789452017&st.retLoc=friend&st.rtu=%2Fdk%3Fst.cmd%3DfriendMovies%26st.mode%3Down%26st.mrkId%3D%257B%2522uploadedMovieMarker%2522%253A%257B%2522marker%2522%253A%25221519410114503%2522%252C%2522hasMore%2522%253Atrue%257D%252C%2522sharedMovieMarker%2522%253A%257B%2522marker%2522%253Anull%252C%2522hasMore%2522%253Afalse%257D%257D%26st.friendId%3D561722190321%26st.frwd%3Don%26_prevCmd%3DfriendMovies%26tkn%3D7257&st.discType=MOVIE&st.mvId=863789452017&_prevCmd=friendMovies&tkn=3648#lst#', + 'only_matching': True, + }, { + # Paid video + 'url': 'https://ok.ru/video/954886983203', + 'only_matching': True, + }, { + 'url': 'https://ok.ru/videoembed/2932705602075', + 'info_dict': { + 'id': '2932705602075', + 'ext': 'mp4', + 'thumbnail': 'https://i.mycdn.me/videoPreview?id=1369902483995&type=37&idx=2&tkn=fqlnoQD_xwq5ovIlKfgNyU08qmM&fn=external_8', + 'title': 'Boosty Ð´Ð»Ñ Ñ‚ÐµÐ±Ñ!', + 'uploader_id': '597811038747', + 'like_count': 0, + 'duration': 35, + }, + }] + + _WEBPAGE_TESTS = [{ + 'url': 'https://boosty.to/ikakprosto/posts/56cedaca-b56a-4dfd-b3ed-98c79cfa0167', + 'info_dict': { + 'id': '3950343629563', + 'ext': 'mp4', + 'thumbnail': 'https://i.mycdn.me/videoPreview?id=2776238394107&type=37&idx=11&tkn=F3ejkUFcpuI4DnMRxrDGcH5YcmM&fn=external_8', + 'title': 'ЗаÑц БуÑти.mp4', + 'uploader_id': '571368965883', + 'like_count': 0, + 'duration': 10444, + }, + 'skip': 'Site no longer embeds', + }] + + def _clear_cookies(self, cdn_url): + # Direct http downloads will fail if CDN cookies are set + # so we need to reset them after each format extraction + self.cookiejar.clear(domain='.mycdn.me') + self.cookiejar.clear(domain=urllib.parse.urlparse(cdn_url).hostname) + + @classmethod + def _extract_embed_urls(cls, url, webpage): + for x in super()._extract_embed_urls(url, webpage): + yield smuggle_url(x, {'referrer': url}) + + def _real_extract(self, url): + try: + return self._extract_desktop(url) + except ExtractorError as e: + try: + return self._extract_mobile(url) + except ExtractorError: + # error message of desktop webpage is in English + raise e + + def _extract_desktop(self, url): + start_time = int_or_none(compat_parse_qs( + compat_urllib_parse_urlparse(url).query).get('fromTime', [None])[0]) + + url, smuggled = unsmuggle_url(url, {}) + video_id, is_embed = self._match_valid_url(url).group('id', 'embed') + mode = 'videoembed' if is_embed else 'video' + + webpage = self._download_webpage( + f'https://ok.ru/{mode}/{video_id}', video_id, + note='Downloading desktop webpage', + headers={'Referer': smuggled['referrer']} if smuggled.get('referrer') else {}) + + error = self._search_regex( + r'[^>]+class="vp_video_stub_txt"[^>]*>([^<]+)<', + webpage, 'error', default=None) + # Direct link from boosty + if (error == 'The author of this video has not been found or is blocked' + and not smuggled.get('referrer') and mode == 'videoembed'): + return self._extract_desktop(smuggle_url(url, {'referrer': 'https://boosty.to'})) + elif error: + raise ExtractorError(error, expected=True) + + player = self._parse_json( + unescapeHTML(self._search_regex( + r'data-options=(?P<quote>["\'])(?P<player>{.+?%s.+?})(?P=quote)' % video_id, + webpage, 'player', group='player')), + video_id) + + # embedded external player + if player.get('isExternalPlayer') and player.get('url'): + return self.url_result(player['url']) + + flashvars = player['flashvars'] + + metadata = flashvars.get('metadata') + if metadata: + metadata = self._parse_json(metadata, video_id) + else: + data = {} + st_location = flashvars.get('location') + if st_location: + data['st.location'] = st_location + metadata = self._download_json( + compat_urllib_parse_unquote(flashvars['metadataUrl']), + video_id, 'Downloading metadata JSON', + data=urlencode_postdata(data)) + + movie = metadata['movie'] + + # Some embedded videos may not contain title in movie dict (e.g. + # http://ok.ru/video/62036049272859-0) thus we allow missing title + # here and it's going to be extracted later by an extractor that + # will process the actual embed. + provider = metadata.get('provider') + title = movie['title'] if provider == 'UPLOADED_ODKL' else movie.get('title') + + thumbnail = movie.get('poster') + duration = int_or_none(movie.get('duration')) + + author = metadata.get('author', {}) + uploader_id = author.get('id') + uploader = author.get('name') + + upload_date = unified_strdate(self._html_search_meta( + 'ya:ovs:upload_date', webpage, 'upload date', default=None)) + + age_limit = None + adult = self._html_search_meta( + 'ya:ovs:adult', webpage, 'age limit', default=None) + if adult: + age_limit = 18 if adult == 'true' else 0 + + like_count = int_or_none(metadata.get('likeCount')) + + subtitles = {} + for sub in traverse_obj(metadata, ('movie', 'subtitleTracks', ...), expected_type=dict): + sub_url = sub.get('url') + if not sub_url: + continue + subtitles.setdefault(sub.get('language') or 'en', []).append({ + 'url': sub_url, + 'ext': 'vtt', + }) + + info = { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'duration': duration, + 'upload_date': upload_date, + 'uploader': uploader, + 'uploader_id': uploader_id, + 'like_count': like_count, + 'age_limit': age_limit, + 'start_time': start_time, + 'subtitles': subtitles, + } + + # pladform + if provider == 'OPEN_GRAPH': + info.update({ + '_type': 'url_transparent', + 'url': movie['contentId'], + }) + return info + + if provider == 'USER_YOUTUBE': + info.update({ + '_type': 'url_transparent', + 'url': movie['contentId'], + }) + return info + + assert title + if provider == 'LIVE_TV_APP': + info['title'] = title + + quality = qualities(('4', '0', '1', '2', '3', '5', '6', '7')) + + formats = [{ + 'url': f['url'], + 'ext': 'mp4', + 'format_id': f.get('name'), + } for f in traverse_obj(metadata, ('videos', lambda _, v: url_or_none(v['url'])))] + + m3u8_url = traverse_obj(metadata, 'hlsManifestUrl', 'ondemandHls') + if m3u8_url: + formats.extend(self._extract_m3u8_formats( + m3u8_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + self._clear_cookies(m3u8_url) + + for mpd_id, mpd_key in [('dash', 'ondemandDash'), ('webm', 'metadataWebmUrl')]: + mpd_url = metadata.get(mpd_key) + if mpd_url: + formats.extend(self._extract_mpd_formats( + mpd_url, video_id, mpd_id=mpd_id, fatal=False)) + self._clear_cookies(mpd_url) + + dash_manifest = metadata.get('metadataEmbedded') + if dash_manifest: + formats.extend(self._parse_mpd_formats( + compat_etree_fromstring(dash_manifest), 'mpd')) + + for fmt in formats: + fmt_type = self._search_regex( + r'\btype[/=](\d)', fmt['url'], + 'format type', default=None) + if fmt_type: + fmt['quality'] = quality(fmt_type) + + # Live formats + m3u8_url = metadata.get('hlsMasterPlaylistUrl') + if m3u8_url: + formats.extend(self._extract_m3u8_formats( + m3u8_url, video_id, 'mp4', m3u8_id='hls', fatal=False)) + self._clear_cookies(m3u8_url) + rtmp_url = metadata.get('rtmpUrl') + if rtmp_url: + formats.append({ + 'url': rtmp_url, + 'format_id': 'rtmp', + 'ext': 'flv', + }) + + if not formats: + payment_info = metadata.get('paymentInfo') + if payment_info: + self.raise_no_formats('This video is paid, subscribe to download it', expected=True) + + info['formats'] = formats + return info + + def _extract_mobile(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage( + 'http://m.ok.ru/video/%s' % video_id, video_id, + note='Downloading mobile webpage') + + error = self._search_regex( + r'видео</a>\s*<div\s+class="empty">(.+?)</div>', + webpage, 'error', default=None) + if error: + raise ExtractorError(error, expected=True) + + json_data = self._search_regex( + r'data-video="(.+?)"', webpage, 'json data') + json_data = self._parse_json(unescapeHTML(json_data), video_id) or {} + + redirect_url = self._request_webpage(HEADRequest( + json_data['videoSrc']), video_id, 'Requesting download URL').url + self._clear_cookies(redirect_url) + + return { + 'id': video_id, + 'title': json_data.get('videoName'), + 'duration': float_or_none(json_data.get('videoDuration'), scale=1000), + 'thumbnail': json_data.get('videoPosterSrc'), + 'formats': [{ + 'format_id': 'mobile', + 'url': redirect_url, + 'ext': 'mp4', + }] + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/oftv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/oftv.py new file mode 100644 index 0000000..4cac518 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/oftv.py @@ -0,0 +1,54 @@ +from .common import InfoExtractor +from .zype import ZypeIE +from ..utils import traverse_obj + + +class OfTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?of\.tv/video/(?P<id>\w+)' + _TESTS = [{ + 'url': 'https://of.tv/video/627d7d95b353db0001dadd1a', + 'md5': 'cb9cd5db3bb9ee0d32bfd7e373d6ef0a', + 'info_dict': { + 'id': '627d7d95b353db0001dadd1a', + 'ext': 'mp4', + 'title': 'E1: Jacky vs Eric', + 'thumbnail': r're:^https?://.*\.jpg', + 'average_rating': 0, + 'description': 'md5:dd16e3e2a8d27d922e7a989f85986853', + 'display_id': '', + 'duration': 1423, + 'timestamp': 1652391300, + 'upload_date': '20220512', + 'view_count': 0, + 'creator': 'This is Fire' + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + info = next(ZypeIE.extract_from_webpage(self._downloader, url, webpage)) + info['_type'] = 'url_transparent' + info['creator'] = self._search_regex(r'<a[^>]+class=\"creator-name\"[^>]+>([^<]+)', webpage, 'creator') + return info + + +class OfTVPlaylistIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?of\.tv/creators/(?P<id>[a-zA-Z0-9-]+)/?(?:$|[?#])' + _TESTS = [{ + 'url': 'https://of.tv/creators/this-is-fire/', + 'playlist_count': 8, + 'info_dict': { + 'id': 'this-is-fire' + } + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + webpage = self._download_webpage(url, playlist_id) + + json_match = self._search_json( + r'var\s*remaining_videos\s*=', webpage, 'oftv playlists', playlist_id, contains_pattern=r'\[.+\]') + + return self.playlist_from_matches( + traverse_obj(json_match, (..., 'discovery_url')), playlist_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/oktoberfesttv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/oktoberfesttv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/oktoberfesttv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/oktoberfesttv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/olympics.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/olympics.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/olympics.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/olympics.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/on24.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/on24.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/on24.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/on24.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/once.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/once.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/once.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/once.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ondemandkorea.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ondemandkorea.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ondemandkorea.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ondemandkorea.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/onefootball.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/onefootball.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/onefootball.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/onefootball.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/onenewsnz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/onenewsnz.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/onenewsnz.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/onenewsnz.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/oneplace.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/oneplace.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/oneplace.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/oneplace.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/onet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/onet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/onet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/onet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/onionstudios.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/onionstudios.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/onionstudios.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/onionstudios.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ooyala.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ooyala.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ooyala.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ooyala.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/opencast.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/opencast.py new file mode 100644 index 0000000..1fafd9a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/opencast.py @@ -0,0 +1,183 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + parse_iso8601, + traverse_obj, + variadic, +) + + +class OpencastBaseIE(InfoExtractor): + _INSTANCES_RE = r'''(?: + opencast\.informatik\.kit\.edu| + electures\.uni-muenster\.de| + oc-presentation\.ltcc\.tuwien\.ac\.at| + medien\.ph-noe\.ac\.at| + oc-video\.ruhr-uni-bochum\.de| + oc-video1\.ruhr-uni-bochum\.de| + opencast\.informatik\.uni-goettingen\.de| + heicast\.uni-heidelberg\.de| + opencast\.hawk\.de:8080| + opencast\.hs-osnabrueck\.de| + video[0-9]+\.virtuos\.uni-osnabrueck\.de| + opencast\.uni-koeln\.de| + media\.opencast\.hochschule-rhein-waal\.de| + matterhorn\.dce\.harvard\.edu| + hs-harz\.opencast\.uni-halle\.de| + videocampus\.urz\.uni-leipzig\.de| + media\.uct\.ac\.za| + vid\.igb\.illinois\.edu| + cursosabertos\.c3sl\.ufpr\.br| + mcmedia\.missioncollege\.org| + clases\.odon\.edu\.uy + )''' + _UUID_RE = r'[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}' + + def _call_api(self, host, video_id, **kwargs): + return self._download_json(self._API_BASE % (host, video_id), video_id, **kwargs) + + def _parse_mediapackage(self, video): + video_id = video.get('id') + if video_id is None: + raise ExtractorError('Video id was not found') + + formats = [] + for track in variadic(traverse_obj(video, ('media', 'track')) or []): + href = track.get('url') + if href is None: + continue + ext = determine_ext(href, None) + + transport = track.get('transport') + + if transport == 'DASH' or ext == 'mpd': + formats.extend(self._extract_mpd_formats(href, video_id, mpd_id='dash', fatal=False)) + elif transport == 'HLS' or ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + href, video_id, m3u8_id='hls', entry_protocol='m3u8_native', fatal=False)) + elif transport == 'HDS' or ext == 'f4m': + formats.extend(self._extract_f4m_formats(href, video_id, f4m_id='hds', fatal=False)) + elif transport == 'SMOOTH': + formats.extend(self._extract_ism_formats(href, video_id, ism_id='smooth', fatal=False)) + elif ext == 'smil': + formats.extend(self._extract_smil_formats(href, video_id, fatal=False)) + else: + track_obj = { + 'url': href, + 'ext': ext, + 'format_note': track.get('transport'), + 'resolution': traverse_obj(track, ('video', 'resolution')), + 'fps': int_or_none(traverse_obj(track, ('video', 'framerate'))), + 'vbr': int_or_none(traverse_obj(track, ('video', 'bitrate')), scale=1000), + 'vcodec': traverse_obj(track, ('video', 'encoder', 'type')) if track.get('video') else 'none', + 'abr': int_or_none(traverse_obj(track, ('audio', 'bitrate')), scale=1000), + 'asr': int_or_none(traverse_obj(track, ('audio', 'samplingrate'))), + 'acodec': traverse_obj(track, ('audio', 'encoder', 'type')) if track.get('audio') else 'none', + } + + if transport == 'RTMP': + m_obj = re.search(r'(?:rtmp://[^/]+/(?P<app>[^/]+))/(?P<ext>.+):(?P<playpath>.+)', href) + if not m_obj: + continue + track_obj.update({ + 'app': m_obj.group('app'), + 'ext': m_obj.group('ext'), + 'play_path': m_obj.group('ext') + ':' + m_obj.group('playpath'), + 'rtmp_live': True, + 'preference': -2, + }) + formats.append(track_obj) + + return { + 'id': video_id, + 'formats': formats, + 'title': video.get('title'), + 'series': video.get('seriestitle'), + 'season_id': video.get('series'), + 'creator': traverse_obj(video, ('creators', 'creator')), + 'timestamp': parse_iso8601(video.get('start')), + 'thumbnail': traverse_obj(video, ('attachments', 'attachment', ..., 'url'), get_all=False), + } + + +class OpencastIE(OpencastBaseIE): + _VALID_URL = rf'''(?x) + https?://(?P<host>{OpencastBaseIE._INSTANCES_RE})/paella/ui/watch\.html\? + (?:[^#]+&)?id=(?P<id>{OpencastBaseIE._UUID_RE})''' + + _API_BASE = 'https://%s/search/episode.json?id=%s' + + _TESTS = [ + { + 'url': 'https://oc-video1.ruhr-uni-bochum.de/paella/ui/watch.html?id=ed063cd5-72c8-46b5-a60a-569243edcea8', + 'md5': '554c8e99a90f7be7e874619fcf2a3bc9', + 'info_dict': { + 'id': 'ed063cd5-72c8-46b5-a60a-569243edcea8', + 'ext': 'mp4', + 'title': '11 - Kryptographie - 24.11.2015', + 'thumbnail': r're:^https?://.*\.jpg$', + 'timestamp': 1606208400, + 'upload_date': '20201124', + 'season_id': 'cf68a4a1-36b1-4a53-a6ba-61af5705a0d0', + 'series': 'Kryptographie - WiSe 15/16', + 'creator': 'Alexander May', + }, + } + ] + + def _real_extract(self, url): + host, video_id = self._match_valid_url(url).group('host', 'id') + return self._parse_mediapackage( + self._call_api(host, video_id)['search-results']['result']['mediapackage']) + + +class OpencastPlaylistIE(OpencastBaseIE): + _VALID_URL = rf'''(?x) + https?://(?P<host>{OpencastBaseIE._INSTANCES_RE})(?: + /engage/ui/index\.html\?(?:[^#]+&)?epFrom=| + /ltitools/index\.html\?(?:[^#]+&)?series= + )(?P<id>{OpencastBaseIE._UUID_RE})''' + + _API_BASE = 'https://%s/search/episode.json?sid=%s' + + _TESTS = [ + { + 'url': 'https://oc-video1.ruhr-uni-bochum.de/engage/ui/index.html?epFrom=cf68a4a1-36b1-4a53-a6ba-61af5705a0d0', + 'info_dict': { + 'id': 'cf68a4a1-36b1-4a53-a6ba-61af5705a0d0', + 'title': 'Kryptographie - WiSe 15/16', + }, + 'playlist_mincount': 29, + }, + { + 'url': 'https://oc-video1.ruhr-uni-bochum.de/ltitools/index.html?subtool=series&series=cf68a4a1-36b1-4a53-a6ba-61af5705a0d0&lng=de', + 'info_dict': { + 'id': 'cf68a4a1-36b1-4a53-a6ba-61af5705a0d0', + 'title': 'Kryptographie - WiSe 15/16', + }, + 'playlist_mincount': 29, + }, + { + 'url': 'https://electures.uni-muenster.de/engage/ui/index.html?e=1&p=1&epFrom=39391d10-a711-4d23-b21d-afd2ed7d758c', + 'info_dict': { + 'id': '39391d10-a711-4d23-b21d-afd2ed7d758c', + 'title': '021670 Theologische Themen bei Hans Blumenberg WiSe 2017/18', + }, + 'playlist_mincount': 13, + }, + ] + + def _real_extract(self, url): + host, video_id = self._match_valid_url(url).group('host', 'id') + + entries = [ + self._parse_mediapackage(episode['mediapackage']) + for episode in variadic(self._call_api(host, video_id)['search-results']['result']) + if episode.get('mediapackage') + ] + + return self.playlist_result(entries, video_id, traverse_obj(entries, (0, 'series'))) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/openload.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/openload.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/openload.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/openload.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/openrec.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/openrec.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/openrec.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/openrec.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ora.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ora.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ora.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ora.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/orf.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/orf.py new file mode 100644 index 0000000..cc3c003 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/orf.py @@ -0,0 +1,526 @@ +import functools +import re + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + clean_html, + determine_ext, + float_or_none, + InAdvancePagedList, + int_or_none, + join_nonempty, + orderedSet, + remove_end, + make_archive_id, + smuggle_url, + strip_jsonp, + try_call, + unescapeHTML, + unified_strdate, + unsmuggle_url, + url_or_none, +) + + +class ORFTVthekIE(InfoExtractor): + IE_NAME = 'orf:tvthek' + IE_DESC = 'ORF TVthek' + _VALID_URL = r'(?P<url>https?://tvthek\.orf\.at/(?:(?:[^/]+/){2}){1,2}(?P<id>\d+))(/[^/]+/(?P<vid>\d+))?(?:$|[?#])' + + _TESTS = [{ + 'url': 'https://tvthek.orf.at/profile/ZIB-2/1211/ZIB-2/14121079', + 'info_dict': { + 'id': '14121079', + }, + 'playlist_count': 11, + 'params': {'noplaylist': True} + }, { + 'url': 'https://tvthek.orf.at/profile/ZIB-2/1211/ZIB-2/14121079/Umfrage-Welches-Tier-ist-Sebastian-Kurz/15083150', + 'info_dict': { + 'id': '14121079', + }, + 'playlist_count': 1, + 'params': {'playlist_items': '5'} + }, { + 'url': 'https://tvthek.orf.at/profile/ZIB-2/1211/ZIB-2/14121079/Umfrage-Welches-Tier-ist-Sebastian-Kurz/15083150', + 'info_dict': { + 'id': '14121079', + 'playlist_count': 1 + }, + 'playlist': [{ + 'info_dict': { + 'id': '15083150', + 'ext': 'mp4', + 'description': 'md5:7be1c485425f5f255a5e4e4815e77d04', + 'thumbnail': 'https://api-tvthek.orf.at/uploads/media/segments/0130/59/824271ea35cd8931a0fb08ab316a5b0a1562342c.jpeg', + 'title': 'Umfrage: Welches Tier ist Sebastian Kurz?', + } + }], + 'playlist_count': 1, + 'params': {'noplaylist': True, 'skip_download': 'm3u8'} + }, { + 'url': 'http://tvthek.orf.at/program/Aufgetischt/2745173/Aufgetischt-Mit-der-Steirischen-Tafelrunde/8891389', + 'playlist': [{ + 'md5': '2942210346ed779588f428a92db88712', + 'info_dict': { + 'id': '8896777', + 'ext': 'mp4', + 'title': 'Aufgetischt: Mit der Steirischen Tafelrunde', + 'description': 'md5:c1272f0245537812d4e36419c207b67d', + 'duration': 2668, + 'upload_date': '20141208', + }, + }], + 'skip': 'Blocked outside of Austria / Germany', + }, { + 'url': 'http://tvthek.orf.at/topic/Im-Wandel-der-Zeit/8002126/Best-of-Ingrid-Thurnher/7982256', + 'info_dict': { + 'id': '7982259', + 'ext': 'mp4', + 'title': 'Best of Ingrid Thurnher', + 'upload_date': '20140527', + 'description': 'Viele Jahre war Ingrid Thurnher das "Gesicht" der ZIB 2. Vor ihrem Wechsel zur ZIB 2 im Jahr 1995 moderierte sie unter anderem "Land und Leute", "Österreich-Bild" und "Niederösterreich heute".', + }, + 'params': { + 'skip_download': True, # rtsp downloads + }, + 'skip': 'Blocked outside of Austria / Germany', + }, { + 'url': 'http://tvthek.orf.at/topic/Fluechtlingskrise/10463081/Heimat-Fremde-Heimat/13879132/Senioren-betreuen-Migrantenkinder/13879141', + 'only_matching': True, + }, { + 'url': 'http://tvthek.orf.at/profile/Universum/35429', + 'only_matching': True, + }] + + def _pagefunc(self, url, data_jsb, n, *, image=None): + sd = data_jsb[n] + video_id, title = str(sd['id']), sd['title'] + formats = [] + for fd in sd['sources']: + src = url_or_none(fd.get('src')) + if not src: + continue + format_id = join_nonempty('delivery', 'quality', 'quality_string', from_dict=fd) + ext = determine_ext(src) + if ext == 'm3u8': + m3u8_formats = self._extract_m3u8_formats( + src, video_id, 'mp4', m3u8_id=format_id, fatal=False, note=f'Downloading {format_id} m3u8 manifest') + if any('/geoprotection' in f['url'] for f in m3u8_formats): + self.raise_geo_restricted() + formats.extend(m3u8_formats) + elif ext == 'f4m': + formats.extend(self._extract_f4m_formats( + src, video_id, f4m_id=format_id, fatal=False)) + elif ext == 'mpd': + formats.extend(self._extract_mpd_formats( + src, video_id, mpd_id=format_id, fatal=False, note=f'Downloading {format_id} mpd manifest')) + else: + formats.append({ + 'format_id': format_id, + 'url': src, + 'protocol': fd.get('protocol'), + }) + + # Check for geoblocking. + # There is a property is_geoprotection, but that's always false + geo_str = sd.get('geoprotection_string') + http_url = next( + (f['url'] for f in formats if re.match(r'^https?://.*\.mp4$', f['url'])), + None) if geo_str else None + if http_url: + self._request_webpage( + HEADRequest(http_url), video_id, fatal=False, note='Testing for geoblocking', + errnote=f'This video seems to be blocked outside of {geo_str}. You may want to try the streaming-* formats') + + subtitles = {} + for sub in sd.get('subtitles', []): + sub_src = sub.get('src') + if not sub_src: + continue + subtitles.setdefault(sub.get('lang', 'de-AT'), []).append({ + 'url': sub_src, + }) + + upload_date = unified_strdate(sd.get('created_date')) + + thumbnails = [] + preview = sd.get('preview_image_url') + if preview: + thumbnails.append({ + 'id': 'preview', + 'url': preview, + 'preference': 0, + }) + image = sd.get('image_full_url') or image + if image: + thumbnails.append({ + 'id': 'full', + 'url': image, + 'preference': 1, + }) + + yield { + 'id': video_id, + 'title': title, + 'webpage_url': smuggle_url(f'{url}/part/{video_id}', {'force_noplaylist': True}), + 'formats': formats, + 'subtitles': subtitles, + 'description': sd.get('description'), + 'duration': int_or_none(sd.get('duration_in_seconds')), + 'upload_date': upload_date, + 'thumbnails': thumbnails, + } + + def _real_extract(self, url): + url, smuggled_data = unsmuggle_url(url) + playlist_id, video_id, base_url = self._match_valid_url(url).group('id', 'vid', 'url') + webpage = self._download_webpage(url, playlist_id) + + data_jsb = self._parse_json( + self._search_regex( + r'<div[^>]+class=(["\']).*?VideoPlaylist.*?\1[^>]+data-jsb=(["\'])(?P<json>.+?)\2', + webpage, 'playlist', group='json'), + playlist_id, transform_source=unescapeHTML)['playlist']['videos'] + + if not self._yes_playlist(playlist_id, video_id, smuggled_data): + data_jsb = [sd for sd in data_jsb if str(sd.get('id')) == video_id] + + playlist_count = len(data_jsb) + image = self._og_search_thumbnail(webpage) if playlist_count == 1 else None + + page_func = functools.partial(self._pagefunc, base_url, data_jsb, image=image) + return { + '_type': 'playlist', + 'entries': InAdvancePagedList(page_func, playlist_count, 1), + 'id': playlist_id, + } + + +class ORFRadioIE(InfoExtractor): + IE_NAME = 'orf:radio' + + STATION_INFO = { + 'fm4': ('fm4', 'fm4', 'orffm4'), + 'noe': ('noe', 'oe2n', 'orfnoe'), + 'wien': ('wie', 'oe2w', 'orfwie'), + 'burgenland': ('bgl', 'oe2b', 'orfbgl'), + 'ooe': ('ooe', 'oe2o', 'orfooe'), + 'steiermark': ('stm', 'oe2st', 'orfstm'), + 'kaernten': ('ktn', 'oe2k', 'orfktn'), + 'salzburg': ('sbg', 'oe2s', 'orfsbg'), + 'tirol': ('tir', 'oe2t', 'orftir'), + 'vorarlberg': ('vbg', 'oe2v', 'orfvbg'), + 'oe3': ('oe3', 'oe3', 'orfoe3'), + 'oe1': ('oe1', 'oe1', 'orfoe1'), + } + _STATION_RE = '|'.join(map(re.escape, STATION_INFO.keys())) + + _VALID_URL = rf'''(?x) + https?://(?: + (?P<station>{_STATION_RE})\.orf\.at/player| + radiothek\.orf\.at/(?P<station2>{_STATION_RE}) + )/(?P<date>[0-9]+)/(?P<show>\w+)''' + + _TESTS = [{ + 'url': 'https://radiothek.orf.at/ooe/20220801/OGMO', + 'info_dict': { + 'id': 'OGMO', + 'title': 'Guten Morgen OÖ', + 'description': 'md5:a3f6083399ef92b8cbe2d421b180835a', + }, + 'playlist': [{ + 'md5': 'f33147d954a326e338ea52572c2810e8', + 'info_dict': { + 'id': '2022-08-01_0459_tl_66_7DaysMon1_319062', + 'ext': 'mp3', + 'title': 'Guten Morgen OÖ', + 'upload_date': '20220801', + 'duration': 18000, + 'timestamp': 1659322789, + 'description': 'md5:a3f6083399ef92b8cbe2d421b180835a', + } + }] + }, { + 'url': 'https://ooe.orf.at/player/20220801/OGMO', + 'info_dict': { + 'id': 'OGMO', + 'title': 'Guten Morgen OÖ', + 'description': 'md5:a3f6083399ef92b8cbe2d421b180835a', + }, + 'playlist': [{ + 'md5': 'f33147d954a326e338ea52572c2810e8', + 'info_dict': { + 'id': '2022-08-01_0459_tl_66_7DaysMon1_319062', + 'ext': 'mp3', + 'title': 'Guten Morgen OÖ', + 'upload_date': '20220801', + 'duration': 18000, + 'timestamp': 1659322789, + 'description': 'md5:a3f6083399ef92b8cbe2d421b180835a', + } + }] + }, { + 'url': 'http://fm4.orf.at/player/20170107/4CC', + 'only_matching': True, + }, { + 'url': 'https://noe.orf.at/player/20200423/NGM', + 'only_matching': True, + }, { + 'url': 'https://wien.orf.at/player/20200423/WGUM', + 'only_matching': True, + }, { + 'url': 'https://burgenland.orf.at/player/20200423/BGM', + 'only_matching': True, + }, { + 'url': 'https://steiermark.orf.at/player/20200423/STGMS', + 'only_matching': True, + }, { + 'url': 'https://kaernten.orf.at/player/20200423/KGUMO', + 'only_matching': True, + }, { + 'url': 'https://salzburg.orf.at/player/20200423/SGUM', + 'only_matching': True, + }, { + 'url': 'https://tirol.orf.at/player/20200423/TGUMO', + 'only_matching': True, + }, { + 'url': 'https://vorarlberg.orf.at/player/20200423/VGUM', + 'only_matching': True, + }, { + 'url': 'https://oe3.orf.at/player/20200424/3WEK', + 'only_matching': True, + }, { + 'url': 'http://oe1.orf.at/player/20170108/456544', + 'md5': '34d8a6e67ea888293741c86a099b745b', + 'info_dict': { + 'id': '2017-01-08_0759_tl_51_7DaysSun6_256141', + 'ext': 'mp3', + 'title': 'Morgenjournal', + 'duration': 609, + 'timestamp': 1483858796, + 'upload_date': '20170108', + }, + 'skip': 'Shows from ORF radios are only available for 7 days.' + }] + + def _entries(self, data, station): + _, loop_station, old_ie = self.STATION_INFO[station] + for info in data['streams']: + item_id = info.get('loopStreamId') + if not item_id: + continue + video_id = item_id.replace('.mp3', '') + yield { + 'id': video_id, + 'ext': 'mp3', + 'url': f'https://loopstream01.apa.at/?channel={loop_station}&id={item_id}', + '_old_archive_ids': [make_archive_id(old_ie, video_id)], + 'title': data.get('title'), + 'description': clean_html(data.get('subtitle')), + 'duration': try_call(lambda: (info['end'] - info['start']) / 1000), + 'timestamp': int_or_none(info.get('start'), scale=1000), + 'series': data.get('programTitle'), + } + + def _real_extract(self, url): + station, station2, show_date, show_id = self._match_valid_url(url).group('station', 'station2', 'date', 'show') + api_station, _, _ = self.STATION_INFO[station or station2] + data = self._download_json( + f'http://audioapi.orf.at/{api_station}/api/json/current/broadcast/{show_id}/{show_date}', show_id) + + return self.playlist_result( + self._entries(data, station or station2), show_id, data.get('title'), clean_html(data.get('subtitle'))) + + +class ORFIPTVIE(InfoExtractor): + IE_NAME = 'orf:iptv' + IE_DESC = 'iptv.ORF.at' + _VALID_URL = r'https?://iptv\.orf\.at/(?:#/)?stories/(?P<id>\d+)' + + _TEST = { + 'url': 'http://iptv.orf.at/stories/2275236/', + 'md5': 'c8b22af4718a4b4af58342529453e3e5', + 'info_dict': { + 'id': '350612', + 'ext': 'flv', + 'title': 'Weitere Evakuierungen um Vulkan Calbuco', + 'description': 'md5:d689c959bdbcf04efeddedbf2299d633', + 'duration': 68.197, + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20150425', + }, + } + + def _real_extract(self, url): + story_id = self._match_id(url) + + webpage = self._download_webpage( + 'http://iptv.orf.at/stories/%s' % story_id, story_id) + + video_id = self._search_regex( + r'data-video(?:id)?="(\d+)"', webpage, 'video id') + + data = self._download_json( + 'http://bits.orf.at/filehandler/static-api/json/current/data.json?file=%s' % video_id, + video_id)[0] + + duration = float_or_none(data['duration'], 1000) + + video = data['sources']['default'] + load_balancer_url = video['loadBalancerUrl'] + abr = int_or_none(video.get('audioBitrate')) + vbr = int_or_none(video.get('bitrate')) + fps = int_or_none(video.get('videoFps')) + width = int_or_none(video.get('videoWidth')) + height = int_or_none(video.get('videoHeight')) + thumbnail = video.get('preview') + + rendition = self._download_json( + load_balancer_url, video_id, transform_source=strip_jsonp) + + f = { + 'abr': abr, + 'vbr': vbr, + 'fps': fps, + 'width': width, + 'height': height, + } + + formats = [] + for format_id, format_url in rendition['redirect'].items(): + if format_id == 'rtmp': + ff = f.copy() + ff.update({ + 'url': format_url, + 'format_id': format_id, + }) + formats.append(ff) + elif determine_ext(format_url) == 'f4m': + formats.extend(self._extract_f4m_formats( + format_url, video_id, f4m_id=format_id)) + elif determine_ext(format_url) == 'm3u8': + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', m3u8_id=format_id)) + else: + continue + + title = remove_end(self._og_search_title(webpage), ' - iptv.ORF.at') + description = self._og_search_description(webpage) + upload_date = unified_strdate(self._html_search_meta( + 'dc.date', webpage, 'upload date')) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'duration': duration, + 'thumbnail': thumbnail, + 'upload_date': upload_date, + 'formats': formats, + } + + +class ORFFM4StoryIE(InfoExtractor): + IE_NAME = 'orf:fm4:story' + IE_DESC = 'fm4.orf.at stories' + _VALID_URL = r'https?://fm4\.orf\.at/stories/(?P<id>\d+)' + + _TEST = { + 'url': 'http://fm4.orf.at/stories/2865738/', + 'playlist': [{ + 'md5': 'e1c2c706c45c7b34cf478bbf409907ca', + 'info_dict': { + 'id': '547792', + 'ext': 'flv', + 'title': 'Manu Delago und Inner Tongue live', + 'description': 'Manu Delago und Inner Tongue haben bei der FM4 Soundpark Session live alles gegeben. Hier gibt es Fotos und die gesamte Session als Video.', + 'duration': 1748.52, + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20170913', + }, + }, { + 'md5': 'c6dd2179731f86f4f55a7b49899d515f', + 'info_dict': { + 'id': '547798', + 'ext': 'flv', + 'title': 'Manu Delago und Inner Tongue live (2)', + 'duration': 1504.08, + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20170913', + 'description': 'Manu Delago und Inner Tongue haben bei der FM4 Soundpark Session live alles gegeben. Hier gibt es Fotos und die gesamte Session als Video.', + }, + }], + } + + def _real_extract(self, url): + story_id = self._match_id(url) + webpage = self._download_webpage(url, story_id) + + entries = [] + all_ids = orderedSet(re.findall(r'data-video(?:id)?="(\d+)"', webpage)) + for idx, video_id in enumerate(all_ids): + data = self._download_json( + 'http://bits.orf.at/filehandler/static-api/json/current/data.json?file=%s' % video_id, + video_id)[0] + + duration = float_or_none(data['duration'], 1000) + + video = data['sources']['q8c'] + load_balancer_url = video['loadBalancerUrl'] + abr = int_or_none(video.get('audioBitrate')) + vbr = int_or_none(video.get('bitrate')) + fps = int_or_none(video.get('videoFps')) + width = int_or_none(video.get('videoWidth')) + height = int_or_none(video.get('videoHeight')) + thumbnail = video.get('preview') + + rendition = self._download_json( + load_balancer_url, video_id, transform_source=strip_jsonp) + + f = { + 'abr': abr, + 'vbr': vbr, + 'fps': fps, + 'width': width, + 'height': height, + } + + formats = [] + for format_id, format_url in rendition['redirect'].items(): + if format_id == 'rtmp': + ff = f.copy() + ff.update({ + 'url': format_url, + 'format_id': format_id, + }) + formats.append(ff) + elif determine_ext(format_url) == 'f4m': + formats.extend(self._extract_f4m_formats( + format_url, video_id, f4m_id=format_id)) + elif determine_ext(format_url) == 'm3u8': + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', m3u8_id=format_id)) + else: + continue + + title = remove_end(self._og_search_title(webpage), ' - fm4.ORF.at') + if idx >= 1: + # Titles are duplicates, make them unique + title += ' (' + str(idx + 1) + ')' + description = self._og_search_description(webpage) + upload_date = unified_strdate(self._html_search_meta( + 'dc.date', webpage, 'upload date')) + + entries.append({ + 'id': video_id, + 'title': title, + 'description': description, + 'duration': duration, + 'thumbnail': thumbnail, + 'upload_date': upload_date, + 'formats': formats, + }) + + return self.playlist_result(entries) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/outsidetv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/outsidetv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/outsidetv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/outsidetv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/owncloud.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/owncloud.py new file mode 100644 index 0000000..79fd830 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/owncloud.py @@ -0,0 +1,80 @@ +import re +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + determine_ext, + url_or_none, + urlencode_postdata, +) + + +class OwnCloudIE(InfoExtractor): + _INSTANCES_RE = '|'.join(( + r'(?:[^\.]+\.)?sciebo\.de', + r'cloud\.uni-koblenz-landau\.de', + )) + _VALID_URL = rf'https?://(?:{_INSTANCES_RE})/s/(?P<id>[\w.-]+)' + + _TESTS = [ + { + 'url': 'https://ruhr-uni-bochum.sciebo.de/s/wWhqZzh9jTumVFN', + 'info_dict': { + 'id': 'wWhqZzh9jTumVFN', + 'ext': 'mp4', + 'title': 'CmvpJST.mp4', + }, + }, + { + 'url': 'https://ruhr-uni-bochum.sciebo.de/s/WNDuFu0XuFtmm3f', + 'info_dict': { + 'id': 'WNDuFu0XuFtmm3f', + 'ext': 'mp4', + 'title': 'CmvpJST.mp4', + }, + 'params': { + 'videopassword': '12345', + }, + }, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage, urlh = self._download_webpage_handle(url, video_id) + + if re.search(r'<label[^>]+for="password"', webpage): + webpage = self._verify_video_password(webpage, urlh.url, video_id) + + hidden_inputs = self._hidden_inputs(webpage) + title = hidden_inputs.get('filename') + parsed_url = urllib.parse.urlparse(url) + + return { + 'id': video_id, + 'title': title, + 'url': url_or_none(hidden_inputs.get('downloadURL')) or parsed_url._replace( + path=urllib.parse.urljoin(parsed_url.path, 'download')).geturl(), + 'ext': determine_ext(title), + } + + def _verify_video_password(self, webpage, url, video_id): + password = self.get_param('videopassword') + if password is None: + raise ExtractorError( + 'This video is protected by a password, use the --video-password option', + expected=True) + + validation_response = self._download_webpage( + url, video_id, 'Validating Password', 'Wrong password?', + data=urlencode_postdata({ + 'requesttoken': self._hidden_inputs(webpage)['requesttoken'], + 'password': password, + })) + + if re.search(r'<label[^>]+for="password"', validation_response): + warning = self._search_regex( + r'<div[^>]+class="warning">([^<]*)</div>', validation_response, + 'warning', default='The password is wrong') + raise ExtractorError(f'Opening the video failed, {self.IE_NAME} said: {warning!r}', expected=True) + return validation_response diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/packtpub.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/packtpub.py new file mode 100644 index 0000000..5620330 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/packtpub.py @@ -0,0 +1,155 @@ +import json + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + clean_html, + ExtractorError, + # remove_end, + str_or_none, + strip_or_none, + unified_timestamp, + # urljoin, +) + + +class PacktPubBaseIE(InfoExtractor): + # _PACKT_BASE = 'https://www.packtpub.com' + _STATIC_PRODUCTS_BASE = 'https://static.packt-cdn.com/products/' + + +class PacktPubIE(PacktPubBaseIE): + _VALID_URL = r'https?://(?:(?:www\.)?packtpub\.com/mapt|subscription\.packtpub\.com)/video/[^/]+/(?P<course_id>\d+)/(?P<chapter_id>[^/]+)/(?P<id>[^/]+)(?:/(?P<display_id>[^/?&#]+))?' + + _TESTS = [{ + 'url': 'https://www.packtpub.com/mapt/video/web-development/9781787122215/20528/20530/Project+Intro', + 'md5': '1e74bd6cfd45d7d07666f4684ef58f70', + 'info_dict': { + 'id': '20530', + 'ext': 'mp4', + 'title': 'Project Intro', + 'thumbnail': r're:(?i)^https?://.*\.jpg', + 'timestamp': 1490918400, + 'upload_date': '20170331', + }, + }, { + 'url': 'https://subscription.packtpub.com/video/web_development/9781787122215/20528/20530/project-intro', + 'only_matching': True, + }, { + 'url': 'https://subscription.packtpub.com/video/programming/9781838988906/p1/video1_1/business-card-project', + 'only_matching': True, + }] + _NETRC_MACHINE = 'packtpub' + _TOKEN = None + + def _perform_login(self, username, password): + try: + self._TOKEN = self._download_json( + 'https://services.packtpub.com/auth-v1/users/tokens', None, + 'Downloading Authorization Token', data=json.dumps({ + 'username': username, + 'password': password, + }).encode())['data']['access'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status in (400, 401, 404): + message = self._parse_json(e.cause.response.read().decode(), None)['message'] + raise ExtractorError(message, expected=True) + raise + + def _real_extract(self, url): + course_id, chapter_id, video_id, display_id = self._match_valid_url(url).groups() + + headers = {} + if self._TOKEN: + headers['Authorization'] = 'Bearer ' + self._TOKEN + try: + video_url = self._download_json( + 'https://services.packtpub.com/products-v1/products/%s/%s/%s' % (course_id, chapter_id, video_id), video_id, + 'Downloading JSON video', headers=headers)['data'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 400: + self.raise_login_required('This video is locked') + raise + + # TODO: find a better way to avoid duplicating course requests + # metadata = self._download_json( + # '%s/products/%s/chapters/%s/sections/%s/metadata' + # % (self._MAPT_REST, course_id, chapter_id, video_id), + # video_id)['data'] + + # title = metadata['pageTitle'] + # course_title = metadata.get('title') + # if course_title: + # title = remove_end(title, ' - %s' % course_title) + # timestamp = unified_timestamp(metadata.get('publicationDate')) + # thumbnail = urljoin(self._PACKT_BASE, metadata.get('filepath')) + + return { + 'id': video_id, + 'url': video_url, + 'title': display_id or video_id, # title, + # 'thumbnail': thumbnail, + # 'timestamp': timestamp, + } + + +class PacktPubCourseIE(PacktPubBaseIE): + _VALID_URL = r'(?P<url>https?://(?:(?:www\.)?packtpub\.com/mapt|subscription\.packtpub\.com)/video/[^/]+/(?P<id>\d+))' + _TESTS = [{ + 'url': 'https://www.packtpub.com/mapt/video/web-development/9781787122215', + 'info_dict': { + 'id': '9781787122215', + 'title': 'Learn Nodejs by building 12 projects [Video]', + 'description': 'md5:489da8d953f416e51927b60a1c7db0aa', + }, + 'playlist_count': 90, + }, { + 'url': 'https://subscription.packtpub.com/video/web_development/9781787122215', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if PacktPubIE.suitable(url) else super( + PacktPubCourseIE, cls).suitable(url) + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + url, course_id = mobj.group('url', 'id') + + course = self._download_json( + self._STATIC_PRODUCTS_BASE + '%s/toc' % course_id, course_id) + metadata = self._download_json( + self._STATIC_PRODUCTS_BASE + '%s/summary' % course_id, + course_id, fatal=False) or {} + + entries = [] + for chapter_num, chapter in enumerate(course['chapters'], 1): + chapter_id = str_or_none(chapter.get('id')) + sections = chapter.get('sections') + if not chapter_id or not isinstance(sections, list): + continue + chapter_info = { + 'chapter': chapter.get('title'), + 'chapter_number': chapter_num, + 'chapter_id': chapter_id, + } + for section in sections: + section_id = str_or_none(section.get('id')) + if not section_id or section.get('contentType') != 'video': + continue + entry = { + '_type': 'url_transparent', + 'url': '/'.join([url, chapter_id, section_id]), + 'title': strip_or_none(section.get('title')), + 'description': clean_html(section.get('summary')), + 'thumbnail': metadata.get('coverImage'), + 'timestamp': unified_timestamp(metadata.get('publicationDate')), + 'ie_key': PacktPubIE.ie_key(), + } + entry.update(chapter_info) + entries.append(entry) + + return self.playlist_result( + entries, course_id, metadata.get('title'), + clean_html(metadata.get('about'))) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/palcomp3.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/palcomp3.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/palcomp3.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/palcomp3.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pandoratv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pandoratv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pandoratv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pandoratv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/panopto.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/panopto.py new file mode 100644 index 0000000..5ab2b2b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/panopto.py @@ -0,0 +1,600 @@ +import calendar +import json +import functools +from datetime import datetime, timezone +from random import random + +from .common import InfoExtractor +from ..compat import ( + compat_urllib_parse_urlparse, + compat_urlparse +) + +from ..utils import ( + bug_reports_message, + ExtractorError, + get_first, + int_or_none, + OnDemandPagedList, + parse_qs, + srt_subtitles_timecode, + traverse_obj, +) + + +class PanoptoBaseIE(InfoExtractor): + BASE_URL_RE = r'(?P<base_url>https?://[\w.-]+\.panopto.(?:com|eu)/Panopto)' + + # see panopto core.js + _SUB_LANG_MAPPING = { + 0: 'en-US', + 1: 'en-GB', + 2: 'es-MX', + 3: 'es-ES', + 4: 'de-DE', + 5: 'fr-FR', + 6: 'nl-NL', + 7: 'th-TH', + 8: 'zh-CN', + 9: 'zh-TW', + 10: 'ko-KR', + 11: 'ja-JP', + 12: 'ru-RU', + 13: 'pt-PT', + 14: 'pl-PL', + 15: 'en-AU', + 16: 'da-DK', + 17: 'fi-FI', + 18: 'hu-HU', + 19: 'nb-NO', + 20: 'sv-SE', + 21: 'it-IT' + } + + def _call_api(self, base_url, path, video_id, data=None, fatal=True, **kwargs): + response = self._download_json( + base_url + path, video_id, data=json.dumps(data).encode('utf8') if data else None, + fatal=fatal, headers={'accept': 'application/json', 'content-type': 'application/json'}, **kwargs) + if not response: + return + error_code = traverse_obj(response, 'ErrorCode') + if error_code == 2: + self.raise_login_required(method='cookies') + elif error_code is not None: + msg = f'Panopto said: {response.get("ErrorMessage")}' + if fatal: + raise ExtractorError(msg, video_id=video_id, expected=True) + else: + self.report_warning(msg, video_id=video_id) + return response + + @staticmethod + def _parse_fragment(url): + return {k: json.loads(v[0]) for k, v in compat_urlparse.parse_qs(compat_urllib_parse_urlparse(url).fragment).items()} + + +class PanoptoIE(PanoptoBaseIE): + _VALID_URL = PanoptoBaseIE.BASE_URL_RE + r'/Pages/(Viewer|Embed)\.aspx.*(?:\?|&)id=(?P<id>[a-f0-9-]+)' + _EMBED_REGEX = [rf'<iframe[^>]+src=["\'](?P<url>{PanoptoBaseIE.BASE_URL_RE}/Pages/(Viewer|Embed|Sessions/List)\.aspx[^"\']+)'] + _TESTS = [ + { + 'url': 'https://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=26b3ae9e-4a48-4dcc-96ba-0befba08a0fb', + 'info_dict': { + 'id': '26b3ae9e-4a48-4dcc-96ba-0befba08a0fb', + 'title': 'Panopto for Business - Use Cases', + 'timestamp': 1459184200, + 'thumbnail': r're:https://demo\.hosted\.panopto\.com/.+', + 'upload_date': '20160328', + 'ext': 'mp4', + 'cast': [], + 'chapters': [], + 'duration': 88.17099999999999, + 'average_rating': int, + 'uploader_id': '2db6b718-47a0-4b0b-9e17-ab0b00f42b1e', + 'channel_id': 'e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63a', + 'channel': 'Showcase Videos' + }, + }, + { + 'url': 'https://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=ed01b077-c9e5-4c7b-b8ff-15fa306d7a59', + 'info_dict': { + 'id': 'ed01b077-c9e5-4c7b-b8ff-15fa306d7a59', + 'title': 'Overcoming Top 4 Challenges of Enterprise Video', + 'uploader': 'Panopto Support', + 'timestamp': 1449409251, + 'thumbnail': r're:https://demo\.hosted\.panopto\.com/.+', + 'upload_date': '20151206', + 'ext': 'mp4', + 'chapters': 'count:12', + 'cast': ['Panopto Support'], + 'uploader_id': 'a96d1a31-b4de-489b-9eee-b4a5b414372c', + 'average_rating': int, + 'description': 'md5:4391837802b3fc856dadf630c4b375d1', + 'duration': 1088.2659999999998, + 'channel_id': '9f3c1921-43bb-4bda-8b3a-b8d2f05a8546', + 'channel': 'Webcasts', + }, + }, + { + # Extra params in URL + 'url': 'https://howtovideos.hosted.panopto.com/Panopto/Pages/Viewer.aspx?randomparam=thisisnotreal&id=5fa74e93-3d87-4694-b60e-aaa4012214ed&advance=true', + 'info_dict': { + 'id': '5fa74e93-3d87-4694-b60e-aaa4012214ed', + 'ext': 'mp4', + 'duration': 129.513, + 'cast': ['Kathryn Kelly'], + 'uploader_id': '316a0a58-7fa2-4cd9-be1c-64270d284a56', + 'timestamp': 1569845768, + 'tags': ['Viewer', 'Enterprise'], + 'chapters': [], + 'upload_date': '20190930', + 'thumbnail': r're:https://howtovideos\.hosted\.panopto\.com/.+', + 'description': 'md5:2d844aaa1b1a14ad0e2601a0993b431f', + 'title': 'Getting Started: View a Video', + 'average_rating': int, + 'uploader': 'Kathryn Kelly', + 'channel_id': 'fb93bc3c-6750-4b80-a05b-a921013735d3', + 'channel': 'Getting Started', + } + }, + { + # Does not allow normal Viewer.aspx. AUDIO livestream has no url, so should be skipped and only give one stream. + 'url': 'https://unisa.au.panopto.com/Panopto/Pages/Embed.aspx?id=9d9a0fa3-e99a-4ebd-a281-aac2017f4da4', + 'info_dict': { + 'id': '9d9a0fa3-e99a-4ebd-a281-aac2017f4da4', + 'ext': 'mp4', + 'cast': ['LTS CLI Script'], + 'chapters': [], + 'duration': 2178.45, + 'description': 'md5:ee5cf653919f55b72bce2dbcf829c9fa', + 'channel_id': 'b23e673f-c287-4cb1-8344-aae9005a69f8', + 'average_rating': int, + 'uploader_id': '38377323-6a23-41e2-9ff6-a8e8004bf6f7', + 'uploader': 'LTS CLI Script', + 'timestamp': 1572458134, + 'title': 'WW2 Vets Interview 3 Ronald Stanley George', + 'thumbnail': r're:https://unisa\.au\.panopto\.com/.+', + 'channel': 'World War II Veteran Interviews', + 'upload_date': '20191030', + }, + }, + { + # Slides/storyboard + 'url': 'https://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=a7f12f1d-3872-4310-84b0-f8d8ab15326b', + 'info_dict': { + 'id': 'a7f12f1d-3872-4310-84b0-f8d8ab15326b', + 'ext': 'mhtml', + 'timestamp': 1448798857, + 'duration': 4712.681, + 'title': 'Cache Memory - CompSci 15-213, Lecture 12', + 'channel_id': 'e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63a', + 'uploader_id': 'a96d1a31-b4de-489b-9eee-b4a5b414372c', + 'upload_date': '20151129', + 'average_rating': 0, + 'uploader': 'Panopto Support', + 'channel': 'Showcase Videos', + 'description': 'md5:55e51d54233ddb0e6c2ed388ca73822c', + 'cast': ['ISR Videographer', 'Panopto Support'], + 'chapters': 'count:28', + 'thumbnail': r're:https://demo\.hosted\.panopto\.com/.+', + }, + 'params': {'format': 'mhtml', 'skip_download': True} + }, + { + 'url': 'https://na-training-1.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=8285224a-9a2b-4957-84f2-acb0000c4ea9', + 'info_dict': { + 'id': '8285224a-9a2b-4957-84f2-acb0000c4ea9', + 'ext': 'mp4', + 'chapters': [], + 'title': 'Company Policy', + 'average_rating': 0, + 'timestamp': 1615058901, + 'channel': 'Human Resources', + 'tags': ['HumanResources'], + 'duration': 1604.243, + 'thumbnail': r're:https://na-training-1\.hosted\.panopto\.com/.+', + 'uploader_id': '8e8ba0a3-424f-40df-a4f1-ab3a01375103', + 'uploader': 'Cait M.', + 'upload_date': '20210306', + 'cast': ['Cait M.'], + 'subtitles': {'en-US': [{'ext': 'srt', 'data': 'md5:a3f4d25963fdeace838f327097c13265'}], + 'es-ES': [{'ext': 'srt', 'data': 'md5:57e9dad365fd0fbaf0468eac4949f189'}]}, + }, + 'params': {'writesubtitles': True, 'skip_download': True} + }, { + # On Panopto there are two subs: "Default" and en-US. en-US is blank and should be skipped. + 'url': 'https://na-training-1.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=940cbd41-f616-4a45-b13e-aaf1000c915b', + 'info_dict': { + 'id': '940cbd41-f616-4a45-b13e-aaf1000c915b', + 'ext': 'mp4', + 'subtitles': 'count:1', + 'title': 'HR Benefits Review Meeting*', + 'cast': ['Panopto Support'], + 'chapters': [], + 'timestamp': 1575024251, + 'thumbnail': r're:https://na-training-1\.hosted\.panopto\.com/.+', + 'channel': 'Zoom', + 'description': 'md5:04f90a9c2c68b7828144abfb170f0106', + 'uploader': 'Panopto Support', + 'average_rating': 0, + 'duration': 409.34499999999997, + 'uploader_id': 'b6ac04ad-38b8-4724-a004-a851004ea3df', + 'upload_date': '20191129', + + }, + 'params': {'writesubtitles': True, 'skip_download': True} + }, + { + 'url': 'https://ucc.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=0e8484a4-4ceb-4d98-a63f-ac0200b455cb', + 'only_matching': True + }, + { + 'url': 'https://brown.hosted.panopto.com/Panopto/Pages/Embed.aspx?id=0b3ff73b-36a0-46c5-8455-aadf010a3638', + 'only_matching': True + }, + ] + + @classmethod + def suitable(cls, url): + return False if PanoptoPlaylistIE.suitable(url) else super().suitable(url) + + def _mark_watched(self, base_url, video_id, delivery_info): + duration = traverse_obj(delivery_info, ('Delivery', 'Duration'), expected_type=float) + invocation_id = delivery_info.get('InvocationId') + stream_id = traverse_obj(delivery_info, ('Delivery', 'Streams', ..., 'PublicID'), get_all=False, expected_type=str) + if invocation_id and stream_id and duration: + timestamp_str = f'/Date({calendar.timegm(datetime.now(timezone.utc).timetuple())}000)/' + data = { + 'streamRequests': [ + { + 'ClientTimeStamp': timestamp_str, + 'ID': 0, + 'InvocationID': invocation_id, + 'PlaybackSpeed': 1, + 'SecondsListened': duration - 1, + 'SecondsRejected': 0, + 'StartPosition': 0, + 'StartReason': 2, + 'StopReason': None, + 'StreamID': stream_id, + 'TimeStamp': timestamp_str, + 'UpdatesRejected': 0 + }, + ]} + + self._download_webpage( + base_url + '/Services/Analytics.svc/AddStreamRequests', video_id, + fatal=False, data=json.dumps(data).encode('utf8'), headers={'content-type': 'application/json'}, + note='Marking watched', errnote='Unable to mark watched') + + @staticmethod + def _extract_chapters(timestamps): + chapters = [] + for timestamp in timestamps or []: + caption = timestamp.get('Caption') + start, duration = int_or_none(timestamp.get('Time')), int_or_none(timestamp.get('Duration')) + if not caption or start is None or duration is None: + continue + chapters.append({ + 'start_time': start, + 'end_time': start + duration, + 'title': caption + }) + return chapters + + @staticmethod + def _extract_mhtml_formats(base_url, timestamps): + image_frags = {} + for timestamp in timestamps or []: + duration = timestamp.get('Duration') + obj_id, obj_sn = timestamp.get('ObjectIdentifier'), timestamp.get('ObjectSequenceNumber'), + if timestamp.get('EventTargetType') == 'PowerPoint' and obj_id is not None and obj_sn is not None: + image_frags.setdefault('slides', []).append({ + 'url': base_url + f'/Pages/Viewer/Image.aspx?id={obj_id}&number={obj_sn}', + 'duration': duration + }) + + obj_pid, session_id, abs_time = timestamp.get('ObjectPublicIdentifier'), timestamp.get('SessionID'), timestamp.get('AbsoluteTime') + if None not in (obj_pid, session_id, abs_time): + image_frags.setdefault('chapter', []).append({ + 'url': base_url + f'/Pages/Viewer/Thumb.aspx?eventTargetPID={obj_pid}&sessionPID={session_id}&number={obj_sn}&isPrimary=false&absoluteTime={abs_time}', + 'duration': duration, + }) + for name, fragments in image_frags.items(): + yield { + 'format_id': name, + 'ext': 'mhtml', + 'protocol': 'mhtml', + 'acodec': 'none', + 'vcodec': 'none', + 'url': 'about:invalid', + 'fragments': fragments + } + + @staticmethod + def _json2srt(data, delivery): + def _gen_lines(): + for i, line in enumerate(data): + start_time = line['Time'] + duration = line.get('Duration') + if duration: + end_time = start_time + duration + else: + end_time = traverse_obj(data, (i + 1, 'Time')) or delivery['Duration'] + yield f'{i + 1}\n{srt_subtitles_timecode(start_time)} --> {srt_subtitles_timecode(end_time)}\n{line["Caption"]}' + return '\n\n'.join(_gen_lines()) + + def _get_subtitles(self, base_url, video_id, delivery): + subtitles = {} + for lang in delivery.get('AvailableLanguages') or []: + response = self._call_api( + base_url, '/Pages/Viewer/DeliveryInfo.aspx', video_id, fatal=False, + note='Downloading captions JSON metadata', query={ + 'deliveryId': video_id, + 'getCaptions': True, + 'language': str(lang), + 'responseType': 'json' + } + ) + if not isinstance(response, list): + continue + subtitles.setdefault(self._SUB_LANG_MAPPING.get(lang) or 'default', []).append({ + 'ext': 'srt', + 'data': self._json2srt(response, delivery), + }) + return subtitles + + def _extract_streams_formats_and_subtitles(self, video_id, streams, **fmt_kwargs): + formats = [] + subtitles = {} + for stream in streams or []: + stream_formats = [] + http_stream_url = stream.get('StreamHttpUrl') + stream_url = stream.get('StreamUrl') + + if http_stream_url: + stream_formats.append({'url': http_stream_url}) + + if stream_url: + media_type = stream.get('ViewerMediaFileTypeName') + if media_type in ('hls', ): + m3u8_formats, stream_subtitles = self._extract_m3u8_formats_and_subtitles(stream_url, video_id) + stream_formats.extend(m3u8_formats) + subtitles = self._merge_subtitles(subtitles, stream_subtitles) + else: + stream_formats.append({ + 'url': stream_url + }) + for fmt in stream_formats: + fmt.update({ + 'format_note': stream.get('Tag'), + **fmt_kwargs + }) + formats.extend(stream_formats) + + return formats, subtitles + + def _real_extract(self, url): + base_url, video_id = self._match_valid_url(url).group('base_url', 'id') + delivery_info = self._call_api( + base_url, '/Pages/Viewer/DeliveryInfo.aspx', video_id, + query={ + 'deliveryId': video_id, + 'invocationId': '', + 'isLiveNotes': 'false', + 'refreshAuthCookie': 'true', + 'isActiveBroadcast': 'false', + 'isEditing': 'false', + 'isKollectiveAgentInstalled': 'false', + 'isEmbed': 'false', + 'responseType': 'json', + } + ) + + delivery = delivery_info['Delivery'] + session_start_time = int_or_none(delivery.get('SessionStartTime')) + timestamps = delivery.get('Timestamps') + + # Podcast stream is usually the combined streams. We will prefer that by default. + podcast_formats, podcast_subtitles = self._extract_streams_formats_and_subtitles( + video_id, delivery.get('PodcastStreams'), format_note='PODCAST') + + streams_formats, streams_subtitles = self._extract_streams_formats_and_subtitles( + video_id, delivery.get('Streams'), preference=-10) + + formats = podcast_formats + streams_formats + formats.extend(self._extract_mhtml_formats(base_url, timestamps)) + subtitles = self._merge_subtitles( + podcast_subtitles, streams_subtitles, self.extract_subtitles(base_url, video_id, delivery)) + + self.mark_watched(base_url, video_id, delivery_info) + + return { + 'id': video_id, + 'title': delivery.get('SessionName'), + 'cast': traverse_obj(delivery, ('Contributors', ..., 'DisplayName'), expected_type=lambda x: x or None), + 'timestamp': session_start_time - 11640000000 if session_start_time else None, + 'duration': delivery.get('Duration'), + 'thumbnail': base_url + f'/Services/FrameGrabber.svc/FrameRedirect?objectId={video_id}&mode=Delivery&random={random()}', + 'average_rating': delivery.get('AverageRating'), + 'chapters': self._extract_chapters(timestamps), + 'uploader': delivery.get('OwnerDisplayName') or None, + 'uploader_id': delivery.get('OwnerId'), + 'description': delivery.get('SessionAbstract'), + 'tags': traverse_obj(delivery, ('Tags', ..., 'Content')), + 'channel_id': delivery.get('SessionGroupPublicID'), + 'channel': traverse_obj(delivery, 'SessionGroupLongName', 'SessionGroupShortName', get_all=False), + 'formats': formats, + 'subtitles': subtitles + } + + +class PanoptoPlaylistIE(PanoptoBaseIE): + _VALID_URL = PanoptoBaseIE.BASE_URL_RE + r'/Pages/(Viewer|Embed)\.aspx.*(?:\?|&)pid=(?P<id>[a-f0-9-]+)' + _TESTS = [ + { + 'url': 'https://howtovideos.hosted.panopto.com/Panopto/Pages/Viewer.aspx?pid=f3b39fcf-882f-4849-93d6-a9f401236d36&id=5fa74e93-3d87-4694-b60e-aaa4012214ed&advance=true', + 'info_dict': { + 'title': 'Featured Video Tutorials', + 'id': 'f3b39fcf-882f-4849-93d6-a9f401236d36', + 'description': '', + }, + 'playlist_mincount': 36 + }, + { + 'url': 'https://utsa.hosted.panopto.com/Panopto/Pages/Viewer.aspx?pid=e2900555-3ad4-4bdb-854d-ad2401686190', + 'info_dict': { + 'title': 'Library Website Introduction Playlist', + 'id': 'e2900555-3ad4-4bdb-854d-ad2401686190', + 'description': 'md5:f958bca50a1cbda15fdc1e20d32b3ecb', + }, + 'playlist_mincount': 4 + }, + + ] + + def _entries(self, base_url, playlist_id, session_list_id): + session_list_info = self._call_api( + base_url, f'/Api/SessionLists/{session_list_id}?collections[0].maxCount=500&collections[0].name=items', playlist_id) + + items = session_list_info['Items'] + for item in items: + if item.get('TypeName') != 'Session': + self.report_warning('Got an item in the playlist that is not a Session' + bug_reports_message(), only_once=True) + continue + yield { + '_type': 'url', + 'id': item.get('Id'), + 'url': item.get('ViewerUri'), + 'title': item.get('Name'), + 'description': item.get('Description'), + 'duration': item.get('Duration'), + 'channel': traverse_obj(item, ('Parent', 'Name')), + 'channel_id': traverse_obj(item, ('Parent', 'Id')) + } + + def _real_extract(self, url): + base_url, playlist_id = self._match_valid_url(url).group('base_url', 'id') + + video_id = get_first(parse_qs(url), 'id') + if video_id: + if self.get_param('noplaylist'): + self.to_screen('Downloading just video %s because of --no-playlist' % video_id) + return self.url_result(base_url + f'/Pages/Viewer.aspx?id={video_id}', ie_key=PanoptoIE.ie_key(), video_id=video_id) + else: + self.to_screen(f'Downloading playlist {playlist_id}; add --no-playlist to just download video {video_id}') + + playlist_info = self._call_api(base_url, f'/Api/Playlists/{playlist_id}', playlist_id) + return self.playlist_result( + self._entries(base_url, playlist_id, playlist_info['SessionListId']), + playlist_id=playlist_id, playlist_title=playlist_info.get('Name'), + playlist_description=playlist_info.get('Description')) + + +class PanoptoListIE(PanoptoBaseIE): + _VALID_URL = PanoptoBaseIE.BASE_URL_RE + r'/Pages/Sessions/List\.aspx' + _PAGE_SIZE = 250 + _TESTS = [ + { + 'url': 'https://demo.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63a%22', + 'info_dict': { + 'id': 'e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63a', + 'title': 'Showcase Videos' + }, + 'playlist_mincount': 140 + + }, + { + 'url': 'https://demo.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#view=2&maxResults=250', + 'info_dict': { + 'id': 'panopto_list', + 'title': 'panopto_list' + }, + 'playlist_mincount': 300 + }, + { + # Folder that contains 8 folders and a playlist + 'url': 'https://howtovideos.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx?noredirect=true#folderID=%224b9de7ae-0080-4158-8496-a9ba01692c2e%22', + 'info_dict': { + 'id': '4b9de7ae-0080-4158-8496-a9ba01692c2e', + 'title': 'Video Tutorials' + }, + 'playlist_mincount': 9 + } + + ] + + def _fetch_page(self, base_url, query_params, display_id, page): + + params = { + 'sortColumn': 1, + 'getFolderData': True, + 'includePlaylists': True, + **query_params, + 'page': page, + 'maxResults': self._PAGE_SIZE, + } + + response = self._call_api( + base_url, '/Services/Data.svc/GetSessions', f'{display_id} page {page+1}', + data={'queryParameters': params}, fatal=False) + + for result in get_first(response, 'Results', default=[]): + # This could be a video, playlist (or maybe something else) + item_id = result.get('DeliveryID') + yield { + '_type': 'url', + 'id': item_id, + 'title': result.get('SessionName'), + 'url': traverse_obj(result, 'ViewerUrl', 'EmbedUrl', get_all=False) or (base_url + f'/Pages/Viewer.aspx?id={item_id}'), + 'duration': result.get('Duration'), + 'channel': result.get('FolderName'), + 'channel_id': result.get('FolderID'), + } + + for folder in get_first(response, 'Subfolders', default=[]): + folder_id = folder.get('ID') + yield self.url_result( + base_url + f'/Pages/Sessions/List.aspx#folderID="{folder_id}"', + ie_key=PanoptoListIE.ie_key(), video_id=folder_id, title=folder.get('Name')) + + def _extract_folder_metadata(self, base_url, folder_id): + response = self._call_api( + base_url, '/Services/Data.svc/GetFolderInfo', folder_id, + data={'folderID': folder_id}, fatal=False) + return { + 'title': get_first(response, 'Name') + } + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + base_url = mobj.group('base_url') + + query_params = self._parse_fragment(url) + folder_id, display_id = query_params.get('folderID'), 'panopto_list' + + if query_params.get('isSubscriptionsPage'): + display_id = 'subscriptions' + if not query_params.get('subscribableTypes'): + query_params['subscribableTypes'] = [0, 1, 2] + elif query_params.get('isSharedWithMe'): + display_id = 'sharedwithme' + elif folder_id: + display_id = folder_id + + query = query_params.get('query') + if query: + display_id += f': query "{query}"' + + info = { + '_type': 'playlist', + 'id': display_id, + 'title': display_id, + } + if folder_id: + info.update(self._extract_folder_metadata(base_url, folder_id)) + + info['entries'] = OnDemandPagedList( + functools.partial(self._fetch_page, base_url, query_params, display_id), self._PAGE_SIZE) + + return info diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/paramountplus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/paramountplus.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/paramountplus.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/paramountplus.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/parler.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/parler.py new file mode 100644 index 0000000..2af805e --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/parler.py @@ -0,0 +1,91 @@ +import functools + +from .common import InfoExtractor +from .youtube import YoutubeIE +from ..utils import ( + clean_html, + int_or_none, + strip_or_none, + traverse_obj, + unified_timestamp, + urljoin, +) + + +class ParlerIE(InfoExtractor): + IE_DESC = 'Posts on parler.com' + _VALID_URL = r'https://parler\.com/feed/(?P<id>[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12})' + _TESTS = [ + { + 'url': 'https://parler.com/feed/df79fdba-07cc-48fe-b085-3293897520d7', + 'md5': '16e0f447bf186bb3cf64de5bbbf4d22d', + 'info_dict': { + 'id': 'df79fdba-07cc-48fe-b085-3293897520d7', + 'ext': 'mp4', + 'thumbnail': 'https://bl-images.parler.com/videos/6ce7cdf3-a27a-4d72-bf9c-d3e17ce39a66/thumbnail.jpeg', + 'title': 'Parler video #df79fdba-07cc-48fe-b085-3293897520d7', + 'description': 'md5:6f220bde2df4a97cbb89ac11f1fd8197', + 'timestamp': 1659785481, + 'upload_date': '20220806', + 'uploader': 'Tulsi Gabbard', + 'uploader_id': 'TulsiGabbard', + 'uploader_url': 'https://parler.com/TulsiGabbard', + 'view_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + { + 'url': 'https://parler.com/feed/f23b85c1-6558-470f-b9ff-02c145f28da5', + 'md5': 'eaba1ff4a10fe281f5ce74e930ab2cb4', + 'info_dict': { + 'id': 'r5vkSaz8PxQ', + 'ext': 'mp4', + 'live_status': 'not_live', + 'comment_count': int, + 'duration': 1267, + 'like_count': int, + 'channel_follower_count': int, + 'channel_id': 'UCox6YeMSY1PQInbCtTaZj_w', + 'upload_date': '20220716', + 'thumbnail': 'https://i.ytimg.com/vi/r5vkSaz8PxQ/maxresdefault.jpg', + 'tags': 'count:17', + 'availability': 'public', + 'categories': ['Entertainment'], + 'playable_in_embed': True, + 'channel': 'Who Knows What! With Mahesh & Friends', + 'title': 'Tom MacDonald Names Reaction', + 'uploader': 'Who Knows What! With Mahesh & Friends', + 'uploader_id': '@maheshchookolingo', + 'age_limit': 0, + 'description': 'md5:33c21f0d35ae6dc2edf3007d6696baea', + 'channel_url': 'https://www.youtube.com/channel/UCox6YeMSY1PQInbCtTaZj_w', + 'view_count': int, + 'uploader_url': 'http://www.youtube.com/@maheshchookolingo', + }, + }, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + data = self._download_json(f'https://api.parler.com/v0/public/parleys/{video_id}', + video_id)['data'] + if data.get('link'): + return self.url_result(data['link'], YoutubeIE) + + return { + 'id': video_id, + 'title': strip_or_none(data.get('title')) or '', + **traverse_obj(data, { + 'url': ('video', 'videoSrc'), + 'thumbnail': ('video', 'thumbnailUrl'), + 'description': ('body', {clean_html}), + 'timestamp': ('date_created', {unified_timestamp}), + 'uploader': ('user', 'name', {strip_or_none}), + 'uploader_id': ('user', 'username', {str}), + 'uploader_url': ('user', 'username', {functools.partial(urljoin, 'https://parler.com/')}), + 'view_count': ('views', {int_or_none}), + 'comment_count': ('total_comments', {int_or_none}), + 'repost_count': ('echos', {int_or_none}), + }) + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/parlview.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/parlview.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/parlview.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/parlview.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/patreon.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/patreon.py new file mode 100644 index 0000000..9316789 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/patreon.py @@ -0,0 +1,454 @@ +import itertools + +from .common import InfoExtractor +from .vimeo import VimeoIE +from ..compat import compat_urllib_parse_unquote +from ..networking.exceptions import HTTPError +from ..utils import ( + KNOWN_EXTENSIONS, + ExtractorError, + clean_html, + determine_ext, + int_or_none, + mimetype2ext, + parse_iso8601, + str_or_none, + traverse_obj, + try_get, + url_or_none, + urljoin, +) + + +class PatreonBaseIE(InfoExtractor): + USER_AGENT = 'Patreon/7.6.28 (Android; Android 11; Scale/2.10)' + + def _call_api(self, ep, item_id, query=None, headers=None, fatal=True, note=None): + if headers is None: + headers = {} + if 'User-Agent' not in headers: + headers['User-Agent'] = self.USER_AGENT + if query: + query.update({'json-api-version': 1.0}) + + try: + return self._download_json( + f'https://www.patreon.com/api/{ep}', + item_id, note='Downloading API JSON' if not note else note, + query=query, fatal=fatal, headers=headers) + except ExtractorError as e: + if not isinstance(e.cause, HTTPError) or mimetype2ext(e.cause.response.headers.get('Content-Type')) != 'json': + raise + err_json = self._parse_json(self._webpage_read_content(e.cause.response, None, item_id), item_id, fatal=False) + err_message = traverse_obj(err_json, ('errors', ..., 'detail'), get_all=False) + if err_message: + raise ExtractorError(f'Patreon said: {err_message}', expected=True) + raise + + +class PatreonIE(PatreonBaseIE): + _VALID_URL = r'https?://(?:www\.)?patreon\.com/(?:creation\?hid=|posts/(?:[\w-]+-)?)(?P<id>\d+)' + _TESTS = [{ + 'url': 'http://www.patreon.com/creation?hid=743933', + 'md5': 'e25505eec1053a6e6813b8ed369875cc', + 'info_dict': { + 'id': '743933', + 'ext': 'mp3', + 'title': 'Episode 166: David Smalley of Dogma Debate', + 'description': 'md5:34d207dd29aa90e24f1b3f58841b81c7', + 'uploader': 'Cognitive Dissonance Podcast', + 'thumbnail': 're:^https?://.*$', + 'timestamp': 1406473987, + 'upload_date': '20140727', + 'uploader_id': '87145', + 'like_count': int, + 'comment_count': int, + 'uploader_url': 'https://www.patreon.com/dissonancepod', + 'channel_id': '80642', + 'channel_url': 'https://www.patreon.com/dissonancepod', + 'channel_follower_count': int, + }, + }, { + 'url': 'http://www.patreon.com/creation?hid=754133', + 'md5': '3eb09345bf44bf60451b8b0b81759d0a', + 'info_dict': { + 'id': '754133', + 'ext': 'mp3', + 'title': 'CD 167 Extra', + 'uploader': 'Cognitive Dissonance Podcast', + 'thumbnail': 're:^https?://.*$', + 'like_count': int, + 'comment_count': int, + 'uploader_url': 'https://www.patreon.com/dissonancepod', + }, + 'skip': 'Patron-only content', + }, { + 'url': 'https://www.patreon.com/creation?hid=1682498', + 'info_dict': { + 'id': 'SU4fj_aEMVw', + 'ext': 'mp4', + 'title': 'I\'m on Patreon!', + 'uploader': 'TraciJHines', + 'thumbnail': 're:^https?://.*$', + 'upload_date': '20150211', + 'description': 'md5:8af6425f50bd46fbf29f3db0fc3a8364', + 'uploader_id': 'TraciJHines', + 'categories': ['Entertainment'], + 'duration': 282, + 'view_count': int, + 'tags': 'count:39', + 'age_limit': 0, + 'channel': 'TraciJHines', + 'channel_url': 'https://www.youtube.com/channel/UCGLim4T2loE5rwCMdpCIPVg', + 'live_status': 'not_live', + 'like_count': int, + 'channel_id': 'UCGLim4T2loE5rwCMdpCIPVg', + 'availability': 'public', + 'channel_follower_count': int, + 'playable_in_embed': True, + 'uploader_url': 'http://www.youtube.com/user/TraciJHines', + 'comment_count': int, + }, + 'params': { + 'noplaylist': True, + 'skip_download': True, + } + }, { + 'url': 'https://www.patreon.com/posts/episode-166-of-743933', + 'only_matching': True, + }, { + 'url': 'https://www.patreon.com/posts/743933', + 'only_matching': True, + }, { + 'url': 'https://www.patreon.com/posts/kitchen-as-seen-51706779', + 'md5': '96656690071f6d64895866008484251b', + 'info_dict': { + 'id': '555089736', + 'ext': 'mp4', + 'title': 'KITCHEN AS SEEN ON DEEZ NUTS EXTENDED!', + 'uploader': 'Cold Ones', + 'thumbnail': 're:^https?://.*$', + 'upload_date': '20210526', + 'description': 'md5:557a409bd79d3898689419094934ba79', + 'uploader_id': '14936315', + }, + 'skip': 'Patron-only content' + }, { + # m3u8 video (https://github.com/yt-dlp/yt-dlp/issues/2277) + 'url': 'https://www.patreon.com/posts/video-sketchbook-32452882', + 'info_dict': { + 'id': '32452882', + 'ext': 'mp4', + 'comment_count': int, + 'uploader_id': '4301314', + 'like_count': int, + 'timestamp': 1576696962, + 'upload_date': '20191218', + 'thumbnail': r're:^https?://.*$', + 'uploader_url': 'https://www.patreon.com/loish', + 'description': 'md5:e2693e97ee299c8ece47ffdb67e7d9d2', + 'title': 'VIDEO // sketchbook flipthrough', + 'uploader': 'Loish ', + 'tags': ['sketchbook', 'video'], + 'channel_id': '1641751', + 'channel_url': 'https://www.patreon.com/loish', + 'channel_follower_count': int, + } + }, { + # bad videos under media (if media is included). Real one is under post_file + 'url': 'https://www.patreon.com/posts/premium-access-70282931', + 'info_dict': { + 'id': '70282931', + 'ext': 'mp4', + 'title': '[Premium Access + Uncut] The Office - 2x6 The Fight - Group Reaction', + 'channel_url': 'https://www.patreon.com/thenormies', + 'channel_id': '573397', + 'uploader_id': '2929435', + 'uploader': 'The Normies', + 'description': 'md5:79c9fd8778e2cef84049a94c058a5e23', + 'comment_count': int, + 'upload_date': '20220809', + 'thumbnail': r're:^https?://.*$', + 'channel_follower_count': int, + 'like_count': int, + 'timestamp': 1660052820, + 'tags': ['The Office', 'early access', 'uncut'], + 'uploader_url': 'https://www.patreon.com/thenormies', + }, + 'skip': 'Patron-only content', + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + post = self._call_api( + f'posts/{video_id}', video_id, query={ + 'fields[media]': 'download_url,mimetype,size_bytes', + 'fields[post]': 'comment_count,content,embed,image,like_count,post_file,published_at,title,current_user_can_view', + 'fields[user]': 'full_name,url', + 'fields[post_tag]': 'value', + 'fields[campaign]': 'url,name,patron_count', + 'json-api-use-default-includes': 'false', + 'include': 'audio,user,user_defined_tags,campaign,attachments_media', + }) + attributes = post['data']['attributes'] + title = attributes['title'].strip() + image = attributes.get('image') or {} + info = { + 'id': video_id, + 'title': title, + 'description': clean_html(attributes.get('content')), + 'thumbnail': image.get('large_url') or image.get('url'), + 'timestamp': parse_iso8601(attributes.get('published_at')), + 'like_count': int_or_none(attributes.get('like_count')), + 'comment_count': int_or_none(attributes.get('comment_count')), + } + can_view_post = traverse_obj(attributes, 'current_user_can_view') + if can_view_post and info['comment_count']: + info['__post_extractor'] = self.extract_comments(video_id) + + for i in post.get('included', []): + i_type = i.get('type') + if i_type == 'media': + media_attributes = i.get('attributes') or {} + download_url = media_attributes.get('download_url') + ext = mimetype2ext(media_attributes.get('mimetype')) + + # if size_bytes is None, this media file is likely unavailable + # See: https://github.com/yt-dlp/yt-dlp/issues/4608 + size_bytes = int_or_none(media_attributes.get('size_bytes')) + if download_url and ext in KNOWN_EXTENSIONS and size_bytes is not None: + # XXX: what happens if there are multiple attachments? + return { + **info, + 'ext': ext, + 'filesize': size_bytes, + 'url': download_url, + } + elif i_type == 'user': + user_attributes = i.get('attributes') + if user_attributes: + info.update({ + 'uploader': user_attributes.get('full_name'), + 'uploader_id': str_or_none(i.get('id')), + 'uploader_url': user_attributes.get('url'), + }) + + elif i_type == 'post_tag': + info.setdefault('tags', []).append(traverse_obj(i, ('attributes', 'value'))) + + elif i_type == 'campaign': + info.update({ + 'channel': traverse_obj(i, ('attributes', 'title')), + 'channel_id': str_or_none(i.get('id')), + 'channel_url': traverse_obj(i, ('attributes', 'url')), + 'channel_follower_count': int_or_none(traverse_obj(i, ('attributes', 'patron_count'))), + }) + + # handle Vimeo embeds + if try_get(attributes, lambda x: x['embed']['provider']) == 'Vimeo': + embed_html = try_get(attributes, lambda x: x['embed']['html']) + v_url = url_or_none(compat_urllib_parse_unquote( + self._search_regex(r'(https(?:%3A%2F%2F|://)player\.vimeo\.com.+app_id(?:=|%3D)+\d+)', embed_html, 'vimeo url', fatal=False))) + if v_url: + return { + **info, + '_type': 'url_transparent', + 'url': VimeoIE._smuggle_referrer(v_url, 'https://patreon.com'), + 'ie_key': 'Vimeo', + } + + embed_url = try_get(attributes, lambda x: x['embed']['url']) + if embed_url: + return { + **info, + '_type': 'url', + 'url': embed_url, + } + + post_file = traverse_obj(attributes, 'post_file') + if post_file: + name = post_file.get('name') + ext = determine_ext(name) + if ext in KNOWN_EXTENSIONS: + return { + **info, + 'ext': ext, + 'url': post_file['url'], + } + elif name == 'video': + formats, subtitles = self._extract_m3u8_formats_and_subtitles(post_file['url'], video_id) + return { + **info, + 'formats': formats, + 'subtitles': subtitles, + } + + if can_view_post is False: + self.raise_no_formats('You do not have access to this post', video_id=video_id, expected=True) + else: + self.raise_no_formats('No supported media found in this post', video_id=video_id, expected=True) + return info + + def _get_comments(self, post_id): + cursor = None + count = 0 + params = { + 'page[count]': 50, + 'include': 'parent.commenter.campaign,parent.post.user,parent.post.campaign.creator,parent.replies.parent,parent.replies.commenter.campaign,parent.replies.post.user,parent.replies.post.campaign.creator,commenter.campaign,post.user,post.campaign.creator,replies.parent,replies.commenter.campaign,replies.post.user,replies.post.campaign.creator,on_behalf_of_campaign', + 'fields[comment]': 'body,created,is_by_creator', + 'fields[user]': 'image_url,full_name,url', + 'filter[flair]': 'image_tiny_url,name', + 'sort': '-created', + 'json-api-version': 1.0, + 'json-api-use-default-includes': 'false', + } + + for page in itertools.count(1): + + params.update({'page[cursor]': cursor} if cursor else {}) + response = self._call_api( + f'posts/{post_id}/comments', post_id, query=params, note='Downloading comments page %d' % page) + + cursor = None + for comment in traverse_obj(response, (('data', ('included', lambda _, v: v['type'] == 'comment')), ...)): + count += 1 + comment_id = comment.get('id') + attributes = comment.get('attributes') or {} + if comment_id is None: + continue + author_id = traverse_obj(comment, ('relationships', 'commenter', 'data', 'id')) + author_info = traverse_obj( + response, ('included', lambda _, v: v['id'] == author_id and v['type'] == 'user', 'attributes'), + get_all=False, expected_type=dict, default={}) + + yield { + 'id': comment_id, + 'text': attributes.get('body'), + 'timestamp': parse_iso8601(attributes.get('created')), + 'parent': traverse_obj(comment, ('relationships', 'parent', 'data', 'id'), default='root'), + 'author_is_uploader': attributes.get('is_by_creator'), + 'author_id': author_id, + 'author': author_info.get('full_name'), + 'author_thumbnail': author_info.get('image_url'), + } + + if count < traverse_obj(response, ('meta', 'count')): + cursor = traverse_obj(response, ('data', -1, 'id')) + + if cursor is None: + break + + +class PatreonCampaignIE(PatreonBaseIE): + + _VALID_URL = r'https?://(?:www\.)?patreon\.com/(?!rss)(?:(?:m/(?P<campaign_id>\d+))|(?P<vanity>[-\w]+))' + _TESTS = [{ + 'url': 'https://www.patreon.com/dissonancepod/', + 'info_dict': { + 'title': 'Cognitive Dissonance Podcast', + 'channel_url': 'https://www.patreon.com/dissonancepod', + 'id': '80642', + 'description': 'md5:eb2fa8b83da7ab887adeac34da6b7af7', + 'channel_id': '80642', + 'channel': 'Cognitive Dissonance Podcast', + 'age_limit': 0, + 'channel_follower_count': int, + 'uploader_id': '87145', + 'uploader_url': 'https://www.patreon.com/dissonancepod', + 'uploader': 'Cognitive Dissonance Podcast', + 'thumbnail': r're:^https?://.*$', + }, + 'playlist_mincount': 68, + }, { + 'url': 'https://www.patreon.com/m/4767637/posts', + 'info_dict': { + 'title': 'Not Just Bikes', + 'channel_follower_count': int, + 'id': '4767637', + 'channel_id': '4767637', + 'channel_url': 'https://www.patreon.com/notjustbikes', + 'description': 'md5:595c6e7dca76ae615b1d38c298a287a1', + 'age_limit': 0, + 'channel': 'Not Just Bikes', + 'uploader_url': 'https://www.patreon.com/notjustbikes', + 'uploader': 'Not Just Bikes', + 'uploader_id': '37306634', + 'thumbnail': r're:^https?://.*$', + }, + 'playlist_mincount': 71 + }, { + 'url': 'https://www.patreon.com/dissonancepod/posts', + 'only_matching': True + }, { + 'url': 'https://www.patreon.com/m/5932659', + 'only_matching': True + }] + + @classmethod + def suitable(cls, url): + return False if PatreonIE.suitable(url) else super(PatreonCampaignIE, cls).suitable(url) + + def _entries(self, campaign_id): + cursor = None + params = { + 'fields[post]': 'patreon_url,url', + 'filter[campaign_id]': campaign_id, + 'filter[is_draft]': 'false', + 'sort': '-published_at', + 'json-api-use-default-includes': 'false', + } + + for page in itertools.count(1): + + params.update({'page[cursor]': cursor} if cursor else {}) + posts_json = self._call_api('posts', campaign_id, query=params, note='Downloading posts page %d' % page) + + cursor = traverse_obj(posts_json, ('meta', 'pagination', 'cursors', 'next')) + for post_url in traverse_obj(posts_json, ('data', ..., 'attributes', 'patreon_url')): + yield self.url_result(urljoin('https://www.patreon.com/', post_url), PatreonIE) + + if cursor is None: + break + + def _real_extract(self, url): + + campaign_id, vanity = self._match_valid_url(url).group('campaign_id', 'vanity') + if campaign_id is None: + webpage = self._download_webpage(url, vanity, headers={'User-Agent': self.USER_AGENT}) + campaign_id = self._search_regex(r'https://www.patreon.com/api/campaigns/(\d+)/?', webpage, 'Campaign ID') + + params = { + 'json-api-use-default-includes': 'false', + 'fields[user]': 'full_name,url', + 'fields[campaign]': 'name,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_url', + 'include': 'creator' + } + + campaign_response = self._call_api( + f'campaigns/{campaign_id}', campaign_id, + note='Downloading campaign info', fatal=False, + query=params) or {} + + campaign_info = campaign_response.get('data') or {} + channel_name = traverse_obj(campaign_info, ('attributes', 'name')) + user_info = traverse_obj( + campaign_response, ('included', lambda _, v: v['type'] == 'user'), + default={}, expected_type=dict, get_all=False) + + return { + '_type': 'playlist', + 'id': campaign_id, + 'title': channel_name, + 'entries': self._entries(campaign_id), + 'description': clean_html(traverse_obj(campaign_info, ('attributes', 'summary'))), + 'channel_url': traverse_obj(campaign_info, ('attributes', 'url')), + 'channel_follower_count': int_or_none(traverse_obj(campaign_info, ('attributes', 'patron_count'))), + 'channel_id': campaign_id, + 'channel': channel_name, + 'uploader_url': traverse_obj(user_info, ('attributes', 'url')), + 'uploader_id': str_or_none(user_info.get('id')), + 'uploader': traverse_obj(user_info, ('attributes', 'full_name')), + 'playlist_count': traverse_obj(campaign_info, ('attributes', 'creation_count')), + 'age_limit': 18 if traverse_obj(campaign_info, ('attributes', 'is_nsfw')) else 0, + 'thumbnail': url_or_none(traverse_obj(campaign_info, ('attributes', 'avatar_photo_url'))), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pbs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pbs.py new file mode 100644 index 0000000..2bb2ea9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pbs.py @@ -0,0 +1,757 @@ +import re + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + ExtractorError, + determine_ext, + int_or_none, + float_or_none, + js_to_json, + orderedSet, + strip_jsonp, + strip_or_none, + traverse_obj, + unified_strdate, + url_or_none, + US_RATINGS, +) + + +class PBSIE(InfoExtractor): + _STATIONS = ( + (r'(?:video|www|player)\.pbs\.org', 'PBS: Public Broadcasting Service'), # http://www.pbs.org/ + (r'video\.aptv\.org', 'APT - Alabama Public Television (WBIQ)'), # http://aptv.org/ + (r'video\.gpb\.org', 'GPB/Georgia Public Broadcasting (WGTV)'), # http://www.gpb.org/ + (r'video\.mpbonline\.org', 'Mississippi Public Broadcasting (WMPN)'), # http://www.mpbonline.org + (r'video\.wnpt\.org', 'Nashville Public Television (WNPT)'), # http://www.wnpt.org + (r'video\.wfsu\.org', 'WFSU-TV (WFSU)'), # http://wfsu.org/ + (r'video\.wsre\.org', 'WSRE (WSRE)'), # http://www.wsre.org + (r'video\.wtcitv\.org', 'WTCI (WTCI)'), # http://www.wtcitv.org + (r'video\.pba\.org', 'WPBA/Channel 30 (WPBA)'), # http://pba.org/ + (r'video\.alaskapublic\.org', 'Alaska Public Media (KAKM)'), # http://alaskapublic.org/kakm + # (r'kuac\.org', 'KUAC (KUAC)'), # http://kuac.org/kuac-tv/ + # (r'ktoo\.org', '360 North (KTOO)'), # http://www.ktoo.org/ + # (r'azpm\.org', 'KUAT 6 (KUAT)'), # http://www.azpm.org/ + (r'video\.azpbs\.org', 'Arizona PBS (KAET)'), # http://www.azpbs.org + (r'portal\.knme\.org', 'KNME-TV/Channel 5 (KNME)'), # http://www.newmexicopbs.org/ + (r'video\.vegaspbs\.org', 'Vegas PBS (KLVX)'), # http://vegaspbs.org/ + (r'watch\.aetn\.org', 'AETN/ARKANSAS ETV NETWORK (KETS)'), # http://www.aetn.org/ + (r'video\.ket\.org', 'KET (WKLE)'), # http://www.ket.org/ + (r'video\.wkno\.org', 'WKNO/Channel 10 (WKNO)'), # http://www.wkno.org/ + (r'video\.lpb\.org', 'LPB/LOUISIANA PUBLIC BROADCASTING (WLPB)'), # http://www.lpb.org/ + (r'videos\.oeta\.tv', 'OETA (KETA)'), # http://www.oeta.tv + (r'video\.optv\.org', 'Ozarks Public Television (KOZK)'), # http://www.optv.org/ + (r'watch\.wsiu\.org', 'WSIU Public Broadcasting (WSIU)'), # http://www.wsiu.org/ + (r'video\.keet\.org', 'KEET TV (KEET)'), # http://www.keet.org + (r'pbs\.kixe\.org', 'KIXE/Channel 9 (KIXE)'), # http://kixe.org/ + (r'video\.kpbs\.org', 'KPBS San Diego (KPBS)'), # http://www.kpbs.org/ + (r'video\.kqed\.org', 'KQED (KQED)'), # http://www.kqed.org + (r'vids\.kvie\.org', 'KVIE Public Television (KVIE)'), # http://www.kvie.org + (r'video\.pbssocal\.org', 'PBS SoCal/KOCE (KOCE)'), # http://www.pbssocal.org/ + (r'video\.valleypbs\.org', 'ValleyPBS (KVPT)'), # http://www.valleypbs.org/ + (r'video\.cptv\.org', 'CONNECTICUT PUBLIC TELEVISION (WEDH)'), # http://cptv.org + (r'watch\.knpb\.org', 'KNPB Channel 5 (KNPB)'), # http://www.knpb.org/ + (r'video\.soptv\.org', 'SOPTV (KSYS)'), # http://www.soptv.org + # (r'klcs\.org', 'KLCS/Channel 58 (KLCS)'), # http://www.klcs.org + # (r'krcb\.org', 'KRCB Television & Radio (KRCB)'), # http://www.krcb.org + # (r'kvcr\.org', 'KVCR TV/DT/FM :: Vision for the Future (KVCR)'), # http://kvcr.org + (r'video\.rmpbs\.org', 'Rocky Mountain PBS (KRMA)'), # http://www.rmpbs.org + (r'video\.kenw\.org', 'KENW-TV3 (KENW)'), # http://www.kenw.org + (r'video\.kued\.org', 'KUED Channel 7 (KUED)'), # http://www.kued.org + (r'video\.wyomingpbs\.org', 'Wyoming PBS (KCWC)'), # http://www.wyomingpbs.org + (r'video\.cpt12\.org', 'Colorado Public Television / KBDI 12 (KBDI)'), # http://www.cpt12.org/ + (r'video\.kbyueleven\.org', 'KBYU-TV (KBYU)'), # http://www.kbyutv.org/ + (r'video\.thirteen\.org', 'Thirteen/WNET New York (WNET)'), # http://www.thirteen.org + (r'video\.wgbh\.org', 'WGBH/Channel 2 (WGBH)'), # http://wgbh.org + (r'video\.wgby\.org', 'WGBY (WGBY)'), # http://www.wgby.org + (r'watch\.njtvonline\.org', 'NJTV Public Media NJ (WNJT)'), # http://www.njtvonline.org/ + # (r'ripbs\.org', 'Rhode Island PBS (WSBE)'), # http://www.ripbs.org/home/ + (r'watch\.wliw\.org', 'WLIW21 (WLIW)'), # http://www.wliw.org/ + (r'video\.mpt\.tv', 'mpt/Maryland Public Television (WMPB)'), # http://www.mpt.org + (r'watch\.weta\.org', 'WETA Television and Radio (WETA)'), # http://www.weta.org + (r'video\.whyy\.org', 'WHYY (WHYY)'), # http://www.whyy.org + (r'video\.wlvt\.org', 'PBS 39 (WLVT)'), # http://www.wlvt.org/ + (r'video\.wvpt\.net', 'WVPT - Your Source for PBS and More! (WVPT)'), # http://www.wvpt.net + (r'video\.whut\.org', 'Howard University Television (WHUT)'), # http://www.whut.org + (r'video\.wedu\.org', 'WEDU PBS (WEDU)'), # http://www.wedu.org + (r'video\.wgcu\.org', 'WGCU Public Media (WGCU)'), # http://www.wgcu.org/ + # (r'wjct\.org', 'WJCT Public Broadcasting (WJCT)'), # http://www.wjct.org + (r'video\.wpbt2\.org', 'WPBT2 (WPBT)'), # http://www.wpbt2.org + (r'video\.wucftv\.org', 'WUCF TV (WUCF)'), # http://wucftv.org + (r'video\.wuft\.org', 'WUFT/Channel 5 (WUFT)'), # http://www.wuft.org + (r'watch\.wxel\.org', 'WXEL/Channel 42 (WXEL)'), # http://www.wxel.org/home/ + (r'video\.wlrn\.org', 'WLRN/Channel 17 (WLRN)'), # http://www.wlrn.org/ + (r'video\.wusf\.usf\.edu', 'WUSF Public Broadcasting (WUSF)'), # http://wusf.org/ + (r'video\.scetv\.org', 'ETV (WRLK)'), # http://www.scetv.org + (r'video\.unctv\.org', 'UNC-TV (WUNC)'), # http://www.unctv.org/ + # (r'pbsguam\.org', 'PBS Guam (KGTF)'), # http://www.pbsguam.org/ + (r'video\.pbshawaii\.org', 'PBS Hawaii - Oceanic Cable Channel 10 (KHET)'), # http://www.pbshawaii.org/ + (r'video\.idahoptv\.org', 'Idaho Public Television (KAID)'), # http://idahoptv.org + (r'video\.ksps\.org', 'KSPS (KSPS)'), # http://www.ksps.org/home/ + (r'watch\.opb\.org', 'OPB (KOPB)'), # http://www.opb.org + (r'watch\.nwptv\.org', 'KWSU/Channel 10 & KTNW/Channel 31 (KWSU)'), # http://www.kwsu.org + (r'video\.will\.illinois\.edu', 'WILL-TV (WILL)'), # http://will.illinois.edu/ + (r'video\.networkknowledge\.tv', 'Network Knowledge - WSEC/Springfield (WSEC)'), # http://www.wsec.tv + (r'video\.wttw\.com', 'WTTW11 (WTTW)'), # http://www.wttw.com/ + # (r'wtvp\.org', 'WTVP & WTVP.org, Public Media for Central Illinois (WTVP)'), # http://www.wtvp.org/ + (r'video\.iptv\.org', 'Iowa Public Television/IPTV (KDIN)'), # http://www.iptv.org/ + (r'video\.ninenet\.org', 'Nine Network (KETC)'), # http://www.ninenet.org + (r'video\.wfwa\.org', 'PBS39 Fort Wayne (WFWA)'), # http://wfwa.org/ + (r'video\.wfyi\.org', 'WFYI Indianapolis (WFYI)'), # http://www.wfyi.org + (r'video\.mptv\.org', 'Milwaukee Public Television (WMVS)'), # http://www.mptv.org + (r'video\.wnin\.org', 'WNIN (WNIN)'), # http://www.wnin.org/ + (r'video\.wnit\.org', 'WNIT Public Television (WNIT)'), # http://www.wnit.org/ + (r'video\.wpt\.org', 'WPT (WPNE)'), # http://www.wpt.org/ + (r'video\.wvut\.org', 'WVUT/Channel 22 (WVUT)'), # http://wvut.org/ + (r'video\.weiu\.net', 'WEIU/Channel 51 (WEIU)'), # http://www.weiu.net + (r'video\.wqpt\.org', 'WQPT-TV (WQPT)'), # http://www.wqpt.org + (r'video\.wycc\.org', 'WYCC PBS Chicago (WYCC)'), # http://www.wycc.org + # (r'lakeshorepublicmedia\.org', 'Lakeshore Public Television (WYIN)'), # http://lakeshorepublicmedia.org/ + (r'video\.wipb\.org', 'WIPB-TV (WIPB)'), # http://wipb.org + (r'video\.indianapublicmedia\.org', 'WTIU (WTIU)'), # http://indianapublicmedia.org/tv/ + (r'watch\.cetconnect\.org', 'CET (WCET)'), # http://www.cetconnect.org + (r'video\.thinktv\.org', 'ThinkTVNetwork (WPTD)'), # http://www.thinktv.org + (r'video\.wbgu\.org', 'WBGU-TV (WBGU)'), # http://wbgu.org + (r'video\.wgvu\.org', 'WGVU TV (WGVU)'), # http://www.wgvu.org/ + (r'video\.netnebraska\.org', 'NET1 (KUON)'), # http://netnebraska.org + (r'video\.pioneer\.org', 'Pioneer Public Television (KWCM)'), # http://www.pioneer.org + (r'watch\.sdpb\.org', 'SDPB Television (KUSD)'), # http://www.sdpb.org + (r'video\.tpt\.org', 'TPT (KTCA)'), # http://www.tpt.org + (r'watch\.ksmq\.org', 'KSMQ (KSMQ)'), # http://www.ksmq.org/ + (r'watch\.kpts\.org', 'KPTS/Channel 8 (KPTS)'), # http://www.kpts.org/ + (r'watch\.ktwu\.org', 'KTWU/Channel 11 (KTWU)'), # http://ktwu.org + # (r'shptv\.org', 'Smoky Hills Public Television (KOOD)'), # http://www.shptv.org + # (r'kcpt\.org', 'KCPT Kansas City Public Television (KCPT)'), # http://kcpt.org/ + # (r'blueridgepbs\.org', 'Blue Ridge PBS (WBRA)'), # http://www.blueridgepbs.org/ + (r'watch\.easttennesseepbs\.org', 'East Tennessee PBS (WSJK)'), # http://easttennesseepbs.org + (r'video\.wcte\.tv', 'WCTE-TV (WCTE)'), # http://www.wcte.org + (r'video\.wljt\.org', 'WLJT, Channel 11 (WLJT)'), # http://wljt.org/ + (r'video\.wosu\.org', 'WOSU TV (WOSU)'), # http://wosu.org/ + (r'video\.woub\.org', 'WOUB/WOUC (WOUB)'), # http://woub.org/tv/index.php?section=5 + (r'video\.wvpublic\.org', 'WVPB (WVPB)'), # http://wvpublic.org/ + (r'video\.wkyupbs\.org', 'WKYU-PBS (WKYU)'), # http://www.wkyupbs.org + # (r'wyes\.org', 'WYES-TV/New Orleans (WYES)'), # http://www.wyes.org + (r'video\.kera\.org', 'KERA 13 (KERA)'), # http://www.kera.org/ + (r'video\.mpbn\.net', 'MPBN (WCBB)'), # http://www.mpbn.net/ + (r'video\.mountainlake\.org', 'Mountain Lake PBS (WCFE)'), # http://www.mountainlake.org/ + (r'video\.nhptv\.org', 'NHPTV (WENH)'), # http://nhptv.org/ + (r'video\.vpt\.org', 'Vermont PBS (WETK)'), # http://www.vpt.org + (r'video\.witf\.org', 'witf (WITF)'), # http://www.witf.org + (r'watch\.wqed\.org', 'WQED Multimedia (WQED)'), # http://www.wqed.org/ + (r'video\.wmht\.org', 'WMHT Educational Telecommunications (WMHT)'), # http://www.wmht.org/home/ + (r'video\.deltabroadcasting\.org', 'Q-TV (WDCQ)'), # http://www.deltabroadcasting.org + (r'video\.dptv\.org', 'WTVS Detroit Public TV (WTVS)'), # http://www.dptv.org/ + (r'video\.wcmu\.org', 'CMU Public Television (WCMU)'), # http://www.wcmu.org + (r'video\.wkar\.org', 'WKAR-TV (WKAR)'), # http://wkar.org/ + (r'wnmuvideo\.nmu\.edu', 'WNMU-TV Public TV 13 (WNMU)'), # http://wnmutv.nmu.edu + (r'video\.wdse\.org', 'WDSE - WRPT (WDSE)'), # http://www.wdse.org/ + (r'video\.wgte\.org', 'WGTE TV (WGTE)'), # http://www.wgte.org + (r'video\.lptv\.org', 'Lakeland Public Television (KAWE)'), # http://www.lakelandptv.org + # (r'prairiepublic\.org', 'PRAIRIE PUBLIC (KFME)'), # http://www.prairiepublic.org/ + (r'video\.kmos\.org', 'KMOS-TV - Channels 6.1, 6.2 and 6.3 (KMOS)'), # http://www.kmos.org/ + (r'watch\.montanapbs\.org', 'MontanaPBS (KUSM)'), # http://montanapbs.org + (r'video\.krwg\.org', 'KRWG/Channel 22 (KRWG)'), # http://www.krwg.org + (r'video\.kacvtv\.org', 'KACV (KACV)'), # http://www.panhandlepbs.org/home/ + (r'video\.kcostv\.org', 'KCOS/Channel 13 (KCOS)'), # www.kcostv.org + (r'video\.wcny\.org', 'WCNY/Channel 24 (WCNY)'), # http://www.wcny.org + (r'video\.wned\.org', 'WNED (WNED)'), # http://www.wned.org/ + (r'watch\.wpbstv\.org', 'WPBS (WPBS)'), # http://www.wpbstv.org + (r'video\.wskg\.org', 'WSKG Public TV (WSKG)'), # http://wskg.org + (r'video\.wxxi\.org', 'WXXI (WXXI)'), # http://wxxi.org + (r'video\.wpsu\.org', 'WPSU (WPSU)'), # http://www.wpsu.org + # (r'wqln\.org', 'WQLN/Channel 54 (WQLN)'), # http://www.wqln.org + (r'on-demand\.wvia\.org', 'WVIA Public Media Studios (WVIA)'), # http://www.wvia.org/ + (r'video\.wtvi\.org', 'WTVI (WTVI)'), # http://www.wtvi.org/ + # (r'whro\.org', 'WHRO (WHRO)'), # http://whro.org + (r'video\.westernreservepublicmedia\.org', 'Western Reserve PBS (WNEO)'), # http://www.WesternReservePublicMedia.org/ + (r'video\.ideastream\.org', 'WVIZ/PBS ideastream (WVIZ)'), # http://www.wviz.org/ + (r'video\.kcts9\.org', 'KCTS 9 (KCTS)'), # http://kcts9.org/ + (r'video\.basinpbs\.org', 'Basin PBS (KPBT)'), # http://www.basinpbs.org + (r'video\.houstonpbs\.org', 'KUHT / Channel 8 (KUHT)'), # http://www.houstonpublicmedia.org/ + # (r'tamu\.edu', 'KAMU - TV (KAMU)'), # http://KAMU.tamu.edu + # (r'kedt\.org', 'KEDT/Channel 16 (KEDT)'), # http://www.kedt.org + (r'video\.klrn\.org', 'KLRN (KLRN)'), # http://www.klrn.org + (r'video\.klru\.tv', 'KLRU (KLRU)'), # http://www.klru.org + # (r'kmbh\.org', 'KMBH-TV (KMBH)'), # http://www.kmbh.org + # (r'knct\.org', 'KNCT (KNCT)'), # http://www.knct.org + # (r'ktxt\.org', 'KTTZ-TV (KTXT)'), # http://www.ktxt.org + (r'video\.wtjx\.org', 'WTJX Channel 12 (WTJX)'), # http://www.wtjx.org/ + (r'video\.ideastations\.org', 'WCVE PBS (WCVE)'), # http://ideastations.org/ + (r'video\.kbtc\.org', 'KBTC Public Television (KBTC)'), # http://kbtc.org + ) + + IE_NAME = 'pbs' + IE_DESC = 'Public Broadcasting Service (PBS) and member stations: %s' % ', '.join(list(zip(*_STATIONS))[1]) + + _VALID_URL = r'''(?x)https?:// + (?: + # Direct video URL + (?:%s)/(?:(?:vir|port)alplayer|video)/(?P<id>[0-9]+)(?:[?/]|$) | + # Article with embedded player (or direct video) + (?:www\.)?pbs\.org/(?:[^/]+/){1,5}(?P<presumptive_id>[^/]+?)(?:\.html)?/?(?:$|[?\#]) | + # Player + (?:video|player)\.pbs\.org/(?:widget/)?partnerplayer/(?P<player_id>[^/]+) + ) + ''' % '|'.join(list(zip(*_STATIONS))[0]) + + _GEO_COUNTRIES = ['US'] + + _TESTS = [ + { + 'url': 'http://www.pbs.org/tpt/constitution-usa-peter-sagal/watch/a-more-perfect-union/', + 'md5': '173dc391afd361fa72eab5d3d918968d', + 'info_dict': { + 'id': '2365006249', + 'ext': 'mp4', + 'title': 'Constitution USA with Peter Sagal - A More Perfect Union', + 'description': 'md5:31b664af3c65fd07fa460d306b837d00', + 'duration': 3190, + }, + }, + { + 'url': 'http://www.pbs.org/wgbh/pages/frontline/losing-iraq/', + 'md5': '6f722cb3c3982186d34b0f13374499c7', + 'info_dict': { + 'id': '2365297690', + 'ext': 'mp4', + 'title': 'FRONTLINE - Losing Iraq', + 'description': 'md5:5979a4d069b157f622d02bff62fbe654', + 'duration': 5050, + }, + }, + { + 'url': 'http://www.pbs.org/newshour/bb/education-jan-june12-cyberschools_02-23/', + 'md5': 'b19856d7f5351b17a5ab1dc6a64be633', + 'info_dict': { + 'id': '2201174722', + 'ext': 'mp4', + 'title': 'PBS NewsHour - Cyber Schools Gain Popularity, but Quality Questions Persist', + 'description': 'md5:86ab9a3d04458b876147b355788b8781', + 'duration': 801, + }, + }, + { + 'url': 'http://www.pbs.org/wnet/gperf/dudamel-conducts-verdi-requiem-hollywood-bowl-full-episode/3374/', + 'md5': 'c62859342be2a0358d6c9eb306595978', + 'info_dict': { + 'id': '2365297708', + 'ext': 'mp4', + 'title': 'Great Performances - Dudamel Conducts Verdi Requiem at the Hollywood Bowl - Full', + 'description': 'md5:657897370e09e2bc6bf0f8d2cd313c6b', + 'duration': 6559, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + }, + { + 'url': 'http://www.pbs.org/wgbh/nova/earth/killer-typhoon.html', + 'md5': '908f3e5473a693b266b84e25e1cf9703', + 'info_dict': { + 'id': '2365160389', + 'display_id': 'killer-typhoon', + 'ext': 'mp4', + 'description': 'md5:c741d14e979fc53228c575894094f157', + 'title': 'NOVA - Killer Typhoon', + 'duration': 3172, + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20140122', + 'age_limit': 10, + }, + }, + { + 'url': 'http://www.pbs.org/wgbh/pages/frontline/united-states-of-secrets/', + 'info_dict': { + 'id': 'united-states-of-secrets', + }, + 'playlist_count': 2, + }, + { + 'url': 'http://www.pbs.org/wgbh/americanexperience/films/great-war/', + 'info_dict': { + 'id': 'great-war', + }, + 'playlist_count': 3, + }, + { + 'url': 'http://www.pbs.org/wgbh/americanexperience/films/death/player/', + 'info_dict': { + 'id': '2276541483', + 'display_id': 'player', + 'ext': 'mp4', + 'title': 'American Experience - Death and the Civil War, Chapter 1', + 'description': 'md5:67fa89a9402e2ee7d08f53b920674c18', + 'duration': 682, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + 'params': { + 'skip_download': True, # requires ffmpeg + }, + }, + { + 'url': 'http://www.pbs.org/video/2365245528/', + 'md5': '115223d41bd55cda8ae5cd5ed4e11497', + 'info_dict': { + 'id': '2365245528', + 'display_id': '2365245528', + 'ext': 'mp4', + 'title': 'FRONTLINE - United States of Secrets (Part One)', + 'description': 'md5:55756bd5c551519cc4b7703e373e217e', + 'duration': 6851, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + }, + { + # Video embedded in iframe containing angle brackets as attribute's value (e.g. + # "<iframe style='position: absolute;<br />\ntop: 0; left: 0;' ...", see + # https://github.com/ytdl-org/youtube-dl/issues/7059) + 'url': 'http://www.pbs.org/food/features/a-chefs-life-season-3-episode-5-prickly-business/', + 'md5': '59b0ef5009f9ac8a319cc5efebcd865e', + 'info_dict': { + 'id': '2365546844', + 'display_id': 'a-chefs-life-season-3-episode-5-prickly-business', + 'ext': 'mp4', + 'title': "A Chef's Life - Season 3, Ep. 5: Prickly Business", + 'description': 'md5:c0ff7475a4b70261c7e58f493c2792a5', + 'duration': 1480, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + }, + { + # Frontline video embedded via flp2012.js + 'url': 'http://www.pbs.org/wgbh/pages/frontline/the-atomic-artists', + 'info_dict': { + 'id': '2070868960', + 'display_id': 'the-atomic-artists', + 'ext': 'mp4', + 'title': 'FRONTLINE - The Atomic Artists', + 'description': 'md5:f677e4520cfacb4a5ce1471e31b57800', + 'duration': 723, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + 'params': { + 'skip_download': True, # requires ffmpeg + }, + }, + { + # Serves hd only via wigget/partnerplayer page + 'url': 'http://www.pbs.org/video/2365641075/', + 'md5': 'fdf907851eab57211dd589cf12006666', + 'info_dict': { + 'id': '2365641075', + 'ext': 'mp4', + 'title': 'FRONTLINE - Netanyahu at War', + 'duration': 6852, + 'thumbnail': r're:^https?://.*\.jpg$', + 'formats': 'mincount:8', + }, + }, + { + # https://github.com/ytdl-org/youtube-dl/issues/13801 + 'url': 'https://www.pbs.org/video/pbs-newshour-full-episode-july-31-2017-1501539057/', + 'info_dict': { + 'id': '3003333873', + 'ext': 'mp4', + 'title': 'PBS NewsHour - full episode July 31, 2017', + 'description': 'md5:d41d8cd98f00b204e9800998ecf8427e', + 'duration': 3265, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'http://www.pbs.org/wgbh/roadshow/watch/episode/2105-indianapolis-hour-2/', + 'info_dict': { + 'id': '2365936247', + 'ext': 'mp4', + 'title': 'Antiques Roadshow - Indianapolis, Hour 2', + 'description': 'md5:524b32249db55663e7231b6b8d1671a2', + 'duration': 3180, + 'thumbnail': r're:^https?://.*\.jpg$', + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['HTTP Error 403: Forbidden'], + }, + { + 'url': 'https://www.pbs.org/wgbh/masterpiece/episodes/victoria-s2-e1/', + 'info_dict': { + 'id': '3007193718', + 'ext': 'mp4', + 'title': "Victoria - A Soldier's Daughter / The Green-Eyed Monster", + 'description': 'md5:37efbac85e0c09b009586523ec143652', + 'duration': 6292, + 'thumbnail': r're:^https?://.*\.(?:jpg|JPG)$', + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['HTTP Error 403: Forbidden'], + }, + { + 'url': 'https://player.pbs.org/partnerplayer/tOz9tM5ljOXQqIIWke53UA==/', + 'info_dict': { + 'id': '3011407934', + 'ext': 'mp4', + 'title': 'Stories from the Stage - Road Trip', + 'duration': 1619, + 'thumbnail': r're:^https?://.*\.(?:jpg|JPG)$', + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['HTTP Error 403: Forbidden'], + }, + { + 'url': 'http://player.pbs.org/widget/partnerplayer/2365297708/?start=0&end=0&chapterbar=false&endscreen=false&topbar=true', + 'only_matching': True, + }, + { + 'url': 'http://watch.knpb.org/video/2365616055/', + 'only_matching': True, + }, + { + 'url': 'https://player.pbs.org/portalplayer/3004638221/?uid=', + 'only_matching': True, + } + ] + _ERRORS = { + 101: 'We\'re sorry, but this video is not yet available.', + 403: 'We\'re sorry, but this video is not available in your region due to right restrictions.', + 404: 'We are experiencing technical difficulties that are preventing us from playing the video at this time. Please check back again soon.', + 410: 'This video has expired and is no longer available for online streaming.', + } + + def _real_initialize(self): + cookie = (self._download_json( + 'http://localization.services.pbs.org/localize/auto/cookie/', + None, headers=self.geo_verification_headers(), fatal=False) or {}).get('cookie') + if cookie: + station = self._search_regex(r'#?s=\["([^"]+)"', cookie, 'station') + if station: + self._set_cookie('.pbs.org', 'pbsol.station', station) + + def _extract_webpage(self, url): + mobj = self._match_valid_url(url) + + description = None + + presumptive_id = mobj.group('presumptive_id') + display_id = presumptive_id + if presumptive_id: + webpage = self._download_webpage(url, display_id) + + description = strip_or_none(self._og_search_description( + webpage, default=None) or self._html_search_meta( + 'description', webpage, default=None)) + upload_date = unified_strdate(self._search_regex( + r'<input type="hidden" id="air_date_[0-9]+" value="([^"]+)"', + webpage, 'upload date', default=None)) + + # tabbed frontline videos + MULTI_PART_REGEXES = ( + r'<div[^>]+class="videotab[^"]*"[^>]+vid="(\d+)"', + r'<a[^>]+href=["\']#(?:video-|part)\d+["\'][^>]+data-cove[Ii]d=["\'](\d+)', + ) + for p in MULTI_PART_REGEXES: + tabbed_videos = orderedSet(re.findall(p, webpage)) + if tabbed_videos: + return tabbed_videos, presumptive_id, upload_date, description + + MEDIA_ID_REGEXES = [ + r"div\s*:\s*'videoembed'\s*,\s*mediaid\s*:\s*'(\d+)'", # frontline video embed + r'class="coveplayerid">([^<]+)<', # coveplayer + r'<section[^>]+data-coveid="(\d+)"', # coveplayer from http://www.pbs.org/wgbh/frontline/film/real-csi/ + r'<input type="hidden" id="pbs_video_id_[0-9]+" value="([0-9]+)"/>', # jwplayer + r"(?s)window\.PBS\.playerConfig\s*=\s*{.*?id\s*:\s*'([0-9]+)',", + r'<div[^>]+\bdata-cove-id=["\'](\d+)"', # http://www.pbs.org/wgbh/roadshow/watch/episode/2105-indianapolis-hour-2/ + r'<iframe[^>]+\bsrc=["\'](?:https?:)?//video\.pbs\.org/widget/partnerplayer/(\d+)', # https://www.pbs.org/wgbh/masterpiece/episodes/victoria-s2-e1/ + ] + + media_id = self._search_regex( + MEDIA_ID_REGEXES, webpage, 'media ID', fatal=False, default=None) + if media_id: + return media_id, presumptive_id, upload_date, description + + # Frontline video embedded via flp + video_id = self._search_regex( + r'videoid\s*:\s*"([\d+a-z]{7,})"', webpage, 'videoid', default=None) + if video_id: + # pkg_id calculation is reverse engineered from + # http://www.pbs.org/wgbh/pages/frontline/js/flp2012.js + prg_id = self._search_regex( + r'videoid\s*:\s*"([\d+a-z]{7,})"', webpage, 'videoid')[7:] + if 'q' in prg_id: + prg_id = prg_id.split('q')[1] + prg_id = int(prg_id, 16) + getdir = self._download_json( + 'http://www.pbs.org/wgbh/pages/frontline/.json/getdir/getdir%d.json' % prg_id, + presumptive_id, 'Downloading getdir JSON', + transform_source=strip_jsonp) + return getdir['mid'], presumptive_id, upload_date, description + + for iframe in re.findall(r'(?s)<iframe(.+?)></iframe>', webpage): + url = self._search_regex( + r'src=(["\'])(?P<url>.+?partnerplayer.+?)\1', iframe, + 'player URL', default=None, group='url') + if url: + break + + if not url: + url = self._og_search_url(webpage) + + mobj = re.match( + self._VALID_URL, self._proto_relative_url(url.strip())) + + player_id = mobj.group('player_id') + if not display_id: + display_id = player_id + if player_id: + player_page = self._download_webpage( + url, display_id, note='Downloading player page', + errnote='Could not download player page') + video_id = self._search_regex( + r'<div\s+id=["\']video_(\d+)', player_page, 'video ID', + default=None) + if not video_id: + video_info = self._extract_video_data( + player_page, 'video data', display_id) + video_id = compat_str( + video_info.get('id') or video_info['contentID']) + else: + video_id = mobj.group('id') + display_id = video_id + + return video_id, display_id, None, description + + def _extract_video_data(self, string, name, video_id, fatal=True): + return self._parse_json( + self._search_regex( + [r'(?s)PBS\.videoData\s*=\s*({.+?});\n', + r'window\.videoBridge\s*=\s*({.+?});'], + string, name, default='{}'), + video_id, transform_source=js_to_json, fatal=fatal) + + def _real_extract(self, url): + video_id, display_id, upload_date, description = self._extract_webpage(url) + + if isinstance(video_id, list): + entries = [self.url_result( + 'http://video.pbs.org/video/%s' % vid_id, 'PBS', vid_id) + for vid_id in video_id] + return self.playlist_result(entries, display_id) + + info = {} + redirects = [] + redirect_urls = set() + + def extract_redirect_urls(info): + for encoding_name in ('recommended_encoding', 'alternate_encoding'): + redirect = info.get(encoding_name) + if not redirect: + continue + redirect_url = redirect.get('url') + if redirect_url and redirect_url not in redirect_urls: + redirects.append(redirect) + redirect_urls.add(redirect_url) + encodings = info.get('encodings') + if isinstance(encodings, list): + for encoding in encodings: + encoding_url = url_or_none(encoding) + if encoding_url and encoding_url not in redirect_urls: + redirects.append({'url': encoding_url}) + redirect_urls.add(encoding_url) + + chapters = [] + # Player pages may also serve different qualities + for page in ('widget/partnerplayer', 'portalplayer'): + player = self._download_webpage( + 'http://player.pbs.org/%s/%s' % (page, video_id), + display_id, 'Downloading %s page' % page, fatal=False) + if player: + video_info = self._extract_video_data( + player, '%s video data' % page, display_id, fatal=False) + if video_info: + extract_redirect_urls(video_info) + if not info: + info = video_info + if not chapters: + raw_chapters = video_info.get('chapters') or [] + if not raw_chapters: + for chapter_data in re.findall(r'(?s)chapters\.push\(({.*?})\)', player): + chapter = self._parse_json(chapter_data, video_id, js_to_json, fatal=False) + if not chapter: + continue + raw_chapters.append(chapter) + for chapter in raw_chapters: + start_time = float_or_none(chapter.get('start_time'), 1000) + duration = float_or_none(chapter.get('duration'), 1000) + if start_time is None or duration is None: + continue + chapters.append({ + 'start_time': start_time, + 'end_time': start_time + duration, + 'title': chapter.get('title'), + }) + + formats = [] + http_url = None + hls_subs = {} + for num, redirect in enumerate(redirects): + redirect_id = redirect.get('eeid') + + redirect_info = self._download_json( + '%s?format=json' % redirect['url'], display_id, + 'Downloading %s video url info' % (redirect_id or num), + headers=self.geo_verification_headers()) + + if redirect_info['status'] == 'error': + message = self._ERRORS.get( + redirect_info['http_code'], redirect_info['message']) + if redirect_info['http_code'] == 403: + self.raise_geo_restricted( + msg=message, countries=self._GEO_COUNTRIES) + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, message), expected=True) + + format_url = redirect_info.get('url') + if not format_url: + continue + + if determine_ext(format_url) == 'm3u8': + hls_formats, hls_subs = self._extract_m3u8_formats_and_subtitles( + format_url, display_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(hls_formats) + else: + formats.append({ + 'url': format_url, + 'format_id': redirect_id, + }) + if re.search(r'^https?://.*(?:\d+k|baseline)', format_url): + http_url = format_url + self._remove_duplicate_formats(formats) + m3u8_formats = list(filter( + lambda f: f.get('protocol') == 'm3u8' and f.get('vcodec') != 'none', + formats)) + if http_url: + for m3u8_format in m3u8_formats: + bitrate = self._search_regex(r'(\d+)k', m3u8_format['url'], 'bitrate', default=None) + # Lower qualities (150k and 192k) are not available as HTTP formats (see [1]), + # we won't try extracting them. + # Since summer 2016 higher quality formats (4500k and 6500k) are also available + # albeit they are not documented in [2]. + # 1. https://github.com/ytdl-org/youtube-dl/commit/cbc032c8b70a038a69259378c92b4ba97b42d491#commitcomment-17313656 + # 2. https://projects.pbs.org/confluence/display/coveapi/COVE+Video+Specifications + if not bitrate or int(bitrate) < 400: + continue + f_url = re.sub(r'\d+k|baseline', bitrate + 'k', http_url) + # This may produce invalid links sometimes (e.g. + # http://www.pbs.org/wgbh/frontline/film/suicide-plan) + if not self._is_valid_url(f_url, display_id, 'http-%sk video' % bitrate): + continue + f = m3u8_format.copy() + f.update({ + 'url': f_url, + 'format_id': m3u8_format['format_id'].replace('hls', 'http'), + 'protocol': 'http', + }) + formats.append(f) + for f in formats: + if (f.get('format_note') or '').endswith(' AD'): # Audio description + f['language_preference'] = -10 + + rating_str = info.get('rating') + if rating_str is not None: + rating_str = rating_str.rpartition('-')[2] + age_limit = US_RATINGS.get(rating_str) + + subtitles = {} + captions = info.get('cc') or {} + for caption_url in captions.values(): + subtitles.setdefault('en', []).append({ + 'url': caption_url + }) + subtitles = self._merge_subtitles(subtitles, hls_subs) + + # info['title'] is often incomplete (e.g. 'Full Episode', 'Episode 5', etc) + # Try turning it to 'program - title' naming scheme if possible + alt_title = info.get('program', {}).get('title') + if alt_title: + info['title'] = alt_title + ' - ' + re.sub(r'^' + alt_title + r'[\s\-:]+', '', info['title']) + + description = info.get('description') or info.get( + 'program', {}).get('description') or description + + return { + 'id': video_id, + 'display_id': display_id, + 'title': info['title'], + 'description': description, + 'thumbnail': info.get('image_url'), + 'duration': int_or_none(info.get('duration')), + 'age_limit': age_limit, + 'upload_date': upload_date, + 'formats': formats, + 'subtitles': subtitles, + 'chapters': chapters, + } + + +class PBSKidsIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?pbskids\.org/video/[\w-]+/(?P<id>\d+)' + _TESTS = [ + { + 'url': 'https://pbskids.org/video/molly-of-denali/3030407927', + 'md5': '1ded20a017cc6b53446238f1804ce4c7', + 'info_dict': { + 'id': '3030407927', + 'title': 'Bird in the Hand/Bye-Bye Birdie', + 'channel': 'molly-of-denali', + 'duration': 1540, + 'ext': 'mp4', + 'series': 'Molly of Denali', + 'description': 'md5:d006b2211633685d8ebc8d03b6d5611e', + 'categories': ['Episode'], + 'upload_date': '20190718', + } + }, + { + 'url': 'https://pbskids.org/video/plum-landing/2365205059', + 'md5': '92e5d189851a64ae1d0237a965be71f5', + 'info_dict': { + 'id': '2365205059', + 'title': 'Cooper\'s Favorite Place in Nature', + 'channel': 'plum-landing', + 'duration': 67, + 'ext': 'mp4', + 'series': 'Plum Landing', + 'description': 'md5:657e5fc4356a84ead1c061eb280ff05d', + 'categories': ['Episode'], + 'upload_date': '20140302', + } + } + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + meta = self._search_json(r'window\._PBS_KIDS_DEEPLINK\s*=', webpage, 'video info', video_id) + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + traverse_obj(meta, ('video_obj', 'URI', {url_or_none})), video_id, ext='mp4') + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(meta, { + 'categories': ('video_obj', 'video_type', {str}, {lambda x: [x] if x else None}), + 'channel': ('show_slug', {str}), + 'description': ('video_obj', 'description', {str}), + 'duration': ('video_obj', 'duration', {int_or_none}), + 'series': ('video_obj', 'program_title', {str}), + 'title': ('video_obj', 'title', {str}), + 'upload_date': ('video_obj', 'air_date', {unified_strdate}), + }) + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pearvideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pearvideo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pearvideo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pearvideo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/peekvids.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/peekvids.py new file mode 100644 index 0000000..41f591b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/peekvids.py @@ -0,0 +1,190 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + get_element_by_class, + int_or_none, + merge_dicts, + url_or_none, +) + + +class PeekVidsBaseIE(InfoExtractor): + def _real_extract(self, url): + domain, video_id = self._match_valid_url(url).group('domain', 'id') + webpage = self._download_webpage(url, video_id, expected_status=429) + if '>Rate Limit Exceeded' in webpage: + raise ExtractorError( + f'You are suspected as a bot. Wait, or pass the captcha on the site and provide cookies. {self._login_hint()}', + video_id=video_id, expected=True) + + title = self._html_search_regex(r'(?s)<h1\b[^>]*>(.+?)</h1>', webpage, 'title') + + display_id = video_id + video_id = self._search_regex(r'(?s)<video\b[^>]+\bdata-id\s*=\s*["\']?([\w-]+)', webpage, 'short video ID') + srcs = self._download_json( + f'https://www.{domain}/v-alt/{video_id}', video_id, + note='Downloading list of source files') + + formats = [] + for k, v in srcs.items(): + f_url = url_or_none(v) + if not f_url: + continue + + height = self._search_regex(r'^data-src(\d{3,})$', k, 'height', default=None) + if not height: + continue + + formats.append({ + 'url': f_url, + 'format_id': height, + 'height': int_or_none(height), + }) + + if not formats: + formats = [{'url': url} for url in srcs.values()] + + info = self._search_json_ld(webpage, video_id, expected_type='VideoObject', default={}) + info.pop('url', None) + + # may not have found the thumbnail if it was in a list in the ld+json + info.setdefault('thumbnail', self._og_search_thumbnail(webpage)) + detail = (get_element_by_class('detail-video-block', webpage) + or get_element_by_class('detail-block', webpage) or '') + info['description'] = self._html_search_regex( + rf'(?s)(.+?)(?:{re.escape(info.get("description", ""))}\s*<|<ul\b)', + detail, 'description', default=None) or None + info['title'] = re.sub(r'\s*[,-][^,-]+$', '', info.get('title') or title) or self._generic_title(url) + + def cat_tags(name, html): + l = self._html_search_regex( + rf'(?s)<span\b[^>]*>\s*{re.escape(name)}\s*:\s*</span>(.+?)</li>', + html, name, default='') + return list(filter(None, re.split(r'\s+', l))) + + return merge_dicts({ + 'id': video_id, + 'display_id': display_id, + 'age_limit': 18, + 'formats': formats, + 'categories': cat_tags('Categories', detail), + 'tags': cat_tags('Tags', detail), + 'uploader': self._html_search_regex(r'[Uu]ploaded\s+by\s(.+?)"', webpage, 'uploader', default=None), + }, info) + + +class PeekVidsIE(PeekVidsBaseIE): + _VALID_URL = r'''(?x) + https?://(?:www\.)?(?P<domain>peekvids\.com)/ + (?:(?:[^/?#]+/){2}|embed/?\?(?:[^#]*&)?v=) + (?P<id>[^/?&#]*) + ''' + _TESTS = [{ + 'url': 'https://peekvids.com/pc/dane-jones-cute-redhead-with-perfect-tits-with-mini-vamp/BSyLMbN0YCd', + 'md5': '2ff6a357a9717dc9dc9894b51307e9a2', + 'info_dict': { + 'id': '1262717', + 'display_id': 'BSyLMbN0YCd', + 'title': ' Dane Jones - Cute redhead with perfect tits with Mini Vamp', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:0a61df3620de26c0af8963b1a730cd69', + 'timestamp': 1642579329, + 'upload_date': '20220119', + 'duration': 416, + 'view_count': int, + 'age_limit': 18, + 'uploader': 'SEXYhub.com', + 'categories': list, + 'tags': list, + }, + }] + + +class PlayVidsIE(PeekVidsBaseIE): + _VALID_URL = r'https?://(?:www\.)?(?P<domain>playvids\.com)/(?:embed/|\w\w?/)?(?P<id>[^/?#]*)' + _TESTS = [{ + 'url': 'https://www.playvids.com/U3pBrYhsjXM/pc/dane-jones-cute-redhead-with-perfect-tits-with-mini-vamp', + 'md5': '2f12e50213dd65f142175da633c4564c', + 'info_dict': { + 'id': '1978030', + 'display_id': 'U3pBrYhsjXM', + 'title': ' Dane Jones - Cute redhead with perfect tits with Mini Vamp', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:0a61df3620de26c0af8963b1a730cd69', + 'timestamp': 1640435839, + 'upload_date': '20211225', + 'duration': 416, + 'view_count': int, + 'age_limit': 18, + 'uploader': 'SEXYhub.com', + 'categories': list, + 'tags': list, + }, + }, { + 'url': 'https://www.playvids.com/es/U3pBrYhsjXM/pc/dane-jones-cute-redhead-with-perfect-tits-with-mini-vamp', + 'only_matching': True, + }, { + 'url': 'https://www.playvids.com/embed/U3pBrYhsjXM', + 'only_matching': True, + }, { + 'url': 'https://www.playvids.com/bKmGLe3IwjZ/sv/brazzers-800-phone-sex-madison-ivy-always-on-the-line', + 'md5': 'e783986e596cafbf46411a174ab42ba6', + 'info_dict': { + 'id': '762385', + 'display_id': 'bKmGLe3IwjZ', + 'ext': 'mp4', + 'title': 'Brazzers - 1 800 Phone Sex: Madison Ivy Always On The Line 6', + 'description': 'md5:bdcd2db2b8ad85831a491d7c8605dcef', + 'timestamp': 1516958544, + 'upload_date': '20180126', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 480, + 'uploader': 'Brazzers', + 'age_limit': 18, + 'view_count': int, + 'categories': list, + 'tags': list, + }, + }, { + 'url': 'https://www.playvids.com/v/47iUho33toY', + 'md5': 'b056b5049d34b648c1e86497cf4febce', + 'info_dict': { + 'id': '700621', + 'display_id': '47iUho33toY', + 'ext': 'mp4', + 'title': 'KATEE OWEN STRIPTIASE IN SEXY RED LINGERIE', + 'description': None, + 'timestamp': 1507052209, + 'upload_date': '20171003', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 332, + 'uploader': 'Cacerenele', + 'age_limit': 18, + 'view_count': int, + 'categories': list, + 'tags': list, + }, + }, { + 'url': 'https://www.playvids.com/z3_7iwWCmqt/sexy-teen-filipina-striptease-beautiful-pinay-bargirl-strips-and-dances', + 'md5': 'efa09be9f031314b7b7e3bc6510cd0df', + 'info_dict': { + 'id': '1523518', + 'display_id': 'z3_7iwWCmqt', + 'ext': 'mp4', + 'title': 'SEXY TEEN FILIPINA STRIPTEASE - Beautiful Pinay Bargirl Strips and Dances', + 'description': None, + 'timestamp': 1607470323, + 'upload_date': '20201208', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 593, + 'uploader': 'yorours', + 'age_limit': 18, + 'view_count': int, + 'categories': list, + 'tags': list, + }, + }] diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/peertube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/peertube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/peertube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/peertube.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/peertv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/peertv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/peertv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/peertv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/peloton.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/peloton.py new file mode 100644 index 0000000..7864299 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/peloton.py @@ -0,0 +1,215 @@ +import json +import re +import urllib.parse + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + float_or_none, + str_or_none, + traverse_obj, + url_or_none, +) + + +class PelotonIE(InfoExtractor): + IE_NAME = 'peloton' + _NETRC_MACHINE = 'peloton' + _VALID_URL = r'https?://members\.onepeloton\.com/classes/player/(?P<id>[a-f0-9]+)' + _TESTS = [{ + 'url': 'https://members.onepeloton.com/classes/player/0e9653eb53544eeb881298c8d7a87b86', + 'info_dict': { + 'id': '0e9653eb53544eeb881298c8d7a87b86', + 'title': '20 min Chest & Back Strength', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.+\.jpg', + 'description': 'md5:fcd5be9b9eda0194b470e13219050a66', + 'creator': 'Chase Tucker', + 'release_timestamp': 1556141400, + 'timestamp': 1556141400, + 'upload_date': '20190424', + 'duration': 1389, + 'categories': ['Strength'], + 'tags': ['Workout Mat', 'Light Weights', 'Medium Weights'], + 'is_live': False, + 'chapters': 'count:1', + 'subtitles': {'en': [{ + 'url': r're:^https?://.+', + 'ext': 'vtt' + }]}, + }, 'params': { + 'skip_download': 'm3u8', + }, + '_skip': 'Account needed' + }, { + 'url': 'https://members.onepeloton.com/classes/player/26603d53d6bb4de1b340514864a6a6a8', + 'info_dict': { + 'id': '26603d53d6bb4de1b340514864a6a6a8', + 'title': '30 min Earth Day Run', + 'ext': 'm4a', + 'thumbnail': r're:https://.+\.jpg', + 'description': 'md5:adc065a073934d7ee0475d217afe0c3d', + 'creator': 'Selena Samuela', + 'release_timestamp': 1587567600, + 'timestamp': 1587567600, + 'upload_date': '20200422', + 'duration': 1802, + 'categories': ['Running'], + 'is_live': False, + 'chapters': 'count:3' + }, 'params': { + 'skip_download': 'm3u8', + }, + '_skip': 'Account needed' + }] + + _MANIFEST_URL_TEMPLATE = '%s?hdnea=%s' + + def _start_session(self, video_id): + self._download_webpage('https://api.onepeloton.com/api/started_client_session', video_id, note='Starting session') + + def _login(self, video_id): + username, password = self._get_login_info() + if not (username and password): + self.raise_login_required() + try: + self._download_json( + 'https://api.onepeloton.com/auth/login', video_id, note='Logging in', + data=json.dumps({ + 'username_or_email': username, + 'password': password, + 'with_pubsub': False + }).encode(), + headers={'Content-Type': 'application/json', 'User-Agent': 'web'}) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + json_string = self._webpage_read_content(e.cause.response, None, video_id) + res = self._parse_json(json_string, video_id) + raise ExtractorError(res['message'], expected=res['message'] == 'Login failed') + else: + raise + + def _get_token(self, video_id): + try: + subscription = self._download_json( + 'https://api.onepeloton.com/api/subscription/stream', video_id, note='Downloading token', + data=json.dumps({}).encode(), headers={'Content-Type': 'application/json'}) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + json_string = self._webpage_read_content(e.cause.response, None, video_id) + res = self._parse_json(json_string, video_id) + raise ExtractorError(res['message'], expected=res['message'] == 'Stream limit reached') + else: + raise + return subscription['token'] + + def _real_extract(self, url): + video_id = self._match_id(url) + try: + self._start_session(video_id) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + self._login(video_id) + self._start_session(video_id) + else: + raise + + metadata = self._download_json('https://api.onepeloton.com/api/ride/%s/details?stream_source=multichannel' % video_id, video_id) + ride_data = metadata.get('ride') + if not ride_data: + raise ExtractorError('Missing stream metadata') + token = self._get_token(video_id) + + is_live = False + if ride_data.get('content_format') == 'audio': + url = self._MANIFEST_URL_TEMPLATE % (ride_data.get('vod_stream_url'), urllib.parse.quote(token)) + formats = [{ + 'url': url, + 'ext': 'm4a', + 'format_id': 'audio', + 'vcodec': 'none', + }] + subtitles = {} + else: + if ride_data.get('vod_stream_url'): + url = 'https://members.onepeloton.com/.netlify/functions/m3u8-proxy?displayLanguage=en&acceptedSubtitles=%s&url=%s?hdnea=%s' % ( + ','.join([re.sub('^([a-z]+)-([A-Z]+)$', r'\1', caption) for caption in ride_data['captions']]), + ride_data['vod_stream_url'], + urllib.parse.quote(urllib.parse.quote(token))) + elif ride_data.get('live_stream_url'): + url = self._MANIFEST_URL_TEMPLATE % (ride_data.get('live_stream_url'), urllib.parse.quote(token)) + is_live = True + else: + raise ExtractorError('Missing video URL') + formats, subtitles = self._extract_m3u8_formats_and_subtitles(url, video_id, 'mp4') + + if metadata.get('instructor_cues'): + subtitles['cues'] = [{ + 'data': json.dumps(metadata.get('instructor_cues')), + 'ext': 'json' + }] + + category = ride_data.get('fitness_discipline_display_name') + chapters = [{ + 'start_time': segment.get('start_time_offset'), + 'end_time': segment.get('start_time_offset') + segment.get('length'), + 'title': segment.get('name') + } for segment in traverse_obj(metadata, ('segments', 'segment_list'))] + + return { + 'id': video_id, + 'title': ride_data.get('title'), + 'formats': formats, + 'thumbnail': url_or_none(ride_data.get('image_url')), + 'description': str_or_none(ride_data.get('description')), + 'creator': traverse_obj(ride_data, ('instructor', 'name')), + 'release_timestamp': ride_data.get('original_air_time'), + 'timestamp': ride_data.get('original_air_time'), + 'subtitles': subtitles, + 'duration': float_or_none(ride_data.get('length')), + 'categories': [category] if category else None, + 'tags': traverse_obj(ride_data, ('equipment_tags', ..., 'name')), + 'is_live': is_live, + 'chapters': chapters + } + + +class PelotonLiveIE(InfoExtractor): + IE_NAME = 'peloton:live' + IE_DESC = 'Peloton Live' + _VALID_URL = r'https?://members\.onepeloton\.com/player/live/(?P<id>[a-f0-9]+)' + _TEST = { + 'url': 'https://members.onepeloton.com/player/live/eedee2d19f804a9788f53aa8bd38eb1b', + 'info_dict': { + 'id': '32edc92d28044be5bf6c7b6f1f8d1cbc', + 'title': '30 min HIIT Ride: Live from Home', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.+\.png', + 'description': 'md5:f0d7d8ed3f901b7ee3f62c1671c15817', + 'creator': 'Alex Toussaint', + 'release_timestamp': 1587736620, + 'timestamp': 1587736620, + 'upload_date': '20200424', + 'duration': 2014, + 'categories': ['Cycling'], + 'is_live': False, + 'chapters': 'count:3' + }, + 'params': { + 'skip_download': 'm3u8', + }, + '_skip': 'Account needed' + } + + def _real_extract(self, url): + workout_id = self._match_id(url) + peloton = self._download_json(f'https://api.onepeloton.com/api/peloton/{workout_id}', workout_id) + + if peloton.get('ride_id'): + if not peloton.get('is_live') or peloton.get('is_encore') or peloton.get('status') != 'PRE_START': + return self.url_result('https://members.onepeloton.com/classes/player/%s' % peloton['ride_id']) + else: + raise ExtractorError('Ride has not started', expected=True) + else: + raise ExtractorError('Missing video ID') diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/people.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/people.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/people.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/people.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/performgroup.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/performgroup.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/performgroup.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/performgroup.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/periscope.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/periscope.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/periscope.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/periscope.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pgatour.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pgatour.py new file mode 100644 index 0000000..36c2c62 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pgatour.py @@ -0,0 +1,47 @@ +from .brightcove import BrightcoveNewIE +from .common import InfoExtractor + + +class PGATourIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?pgatour\.com/video/[\w-]+/(?P<tc>T)?(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.pgatour.com/video/competition/T6322447785112/adam-hadwin-2023-the-players-round-4-18th-hole-shot-1', + 'info_dict': { + 'id': '6322447785112', + 'ext': 'mp4', + 'title': 'Adam Hadwin | 2023 THE PLAYERS | Round 4 | 18th hole | Shot 1', + 'uploader_id': '6116716431001', + 'upload_date': '20230312', + 'timestamp': 1678653136, + 'duration': 20.011, + 'thumbnail': r're:^https://.+\.jpg', + 'tags': 'count:7', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://www.pgatour.com/video/features/6322506425112/follow-the-players-trophy-on-championship-sunday', + 'info_dict': { + 'id': '6322506425112', + 'ext': 'mp4', + 'title': 'Follow THE PLAYERS trophy on Championship Sunday', + 'description': 'md5:4d29e4bdfa03694a0ebfd08950398568', + 'uploader_id': '6082840763001', + 'upload_date': '20230313', + 'timestamp': 1678739835, + 'duration': 123.435, + 'thumbnail': r're:^https://.+\.jpg', + 'tags': 'count:8', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + video_id, is_tourcast = self._match_valid_url(url).group('id', 'tc') + + # From https://www.pgatour.com/_next/static/chunks/pages/_app-8bcf849560daf38d.js + account_id = '6116716431001' if is_tourcast else '6082840763001' + player_id = 'Vsd5Umu8r' if is_tourcast else 'FWIBYMBPj' + + return self.url_result( + f'https://players.brightcove.net/{account_id}/{player_id}_default/index.html?videoId={video_id}', + BrightcoveNewIE) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/philharmoniedeparis.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/philharmoniedeparis.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/philharmoniedeparis.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/philharmoniedeparis.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/phoenix.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/phoenix.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/phoenix.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/phoenix.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/photobucket.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/photobucket.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/photobucket.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/photobucket.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/piapro.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/piapro.py new file mode 100644 index 0000000..5f39e06 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/piapro.py @@ -0,0 +1,118 @@ +from .common import InfoExtractor +from ..compat import compat_urlparse +from ..utils import ( + ExtractorError, + parse_duration, + parse_filesize, + str_to_int, + unified_timestamp, + urlencode_postdata, +) + + +class PiaproIE(InfoExtractor): + _NETRC_MACHINE = 'piapro' + _VALID_URL = r'https?://piapro\.jp/(?:t|content)/(?P<id>\w+)/?' + _TESTS = [{ + 'url': 'https://piapro.jp/t/NXYR', + 'md5': 'f7c0f760913fb1d44a1c45a4af793909', + 'info_dict': { + 'id': 'NXYR', + 'ext': 'mp3', + 'uploader': 'wowaka', + 'uploader_id': 'wowaka', + 'title': 'è£è¡¨ãƒ©ãƒãƒ¼ã‚º', + 'description': 'http://www.nicovideo.jp/watch/sm8082467', + 'duration': 189.0, + 'timestamp': 1251785475, + 'thumbnail': r're:^https?://.*\.(?:png|jpg)$', + 'upload_date': '20090901', + 'view_count': int, + } + }, { + 'note': 'There are break lines in description, mandating (?s) flag', + 'url': 'https://piapro.jp/t/9cSd', + 'md5': '952bb6d1e8de95050206408a87790676', + 'info_dict': { + 'id': '9cSd', + 'ext': 'mp3', + 'title': 'é’ã«æº¶ã‘ãŸé¢¨èˆ¹ / åˆéŸ³ãƒŸã‚¯', + 'description': 'md5:d395a9bd151447631a5a1460bc7f9132', + 'uploader': 'シアン・キノ', + 'duration': 229.0, + 'timestamp': 1644030039, + 'upload_date': '20220205', + 'view_count': int, + 'thumbnail': r're:^https?://.*\.(?:png|jpg)$', + 'uploader_id': 'cyankino', + } + }, { + 'url': 'https://piapro.jp/content/hcw0z3a169wtemz6', + 'only_matching': True + }] + + _login_status = False + + def _perform_login(self, username, password): + login_ok = True + login_form_strs = { + '_username': username, + '_password': password, + '_remember_me': 'on', + 'login': 'ログイン' + } + self._request_webpage('https://piapro.jp/login/', None) + urlh = self._request_webpage( + 'https://piapro.jp/login/exe', None, + note='Logging in', errnote='Unable to log in', + data=urlencode_postdata(login_form_strs)) + if urlh is False: + login_ok = False + else: + parts = compat_urlparse.urlparse(urlh.url) + if parts.path != '/': + login_ok = False + if not login_ok: + self.report_warning( + 'unable to log in: bad username or password') + self._login_status = login_ok + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + category_id = self._search_regex(r'categoryId=(.+)">', webpage, 'category ID') + if category_id not in ('1', '2', '21', '22', '23', '24', '25'): + raise ExtractorError('The URL does not contain audio.', expected=True) + + str_duration, str_filesize = self._search_regex( + r'サイズ:</span>(.+?)/\(([0-9,]+?[KMG]?B))', webpage, 'duration and size', + group=(1, 2), default=(None, None)) + str_viewcount = self._search_regex(r'閲覧数:</span>([0-9,]+)\s+', webpage, 'view count', fatal=False) + + uploader_id, uploader = self._search_regex( + r'<a\s+class="cd_user-name"\s+href="/(.*)">([^<]+)ã•ã‚“<', webpage, 'uploader', + group=(1, 2), default=(None, None)) + content_id = self._search_regex(r'contentId\:\'(.+)\'', webpage, 'content ID') + create_date = self._search_regex(r'createDate\:\'(.+)\'', webpage, 'timestamp') + + player_webpage = self._download_webpage( + f'https://piapro.jp/html5_player_popup/?id={content_id}&cdate={create_date}', + video_id, note='Downloading player webpage') + + return { + 'id': video_id, + 'title': self._html_search_regex(r'<h1\s+class="cd_works-title">(.+?)</h1>', webpage, 'title', fatal=False), + 'description': self._html_search_regex(r'(?s)<p\s+class="cd_dtl_cap">(.+?)</p>\s*<div', webpage, 'description', fatal=False), + 'uploader': uploader, + 'uploader_id': uploader_id, + 'timestamp': unified_timestamp(create_date, False), + 'duration': parse_duration(str_duration), + 'view_count': str_to_int(str_viewcount), + 'thumbnail': self._html_search_meta('twitter:image', webpage), + + 'filesize_approx': parse_filesize(str_filesize.replace(',', '')), + 'url': self._search_regex(r'mp3:\s*\'(.*?)\'\}', player_webpage, 'url'), + 'ext': 'mp3', + 'vcodec': 'none', + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/piaulizaportal.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/piaulizaportal.py new file mode 100644 index 0000000..1eb6d92 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/piaulizaportal.py @@ -0,0 +1,70 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + parse_qs, + time_seconds, + traverse_obj, +) + + +class PIAULIZAPortalIE(InfoExtractor): + IE_DESC = 'ulizaportal.jp - PIA LIVE STREAM' + _VALID_URL = r'https?://(?:www\.)?ulizaportal\.jp/pages/(?P<id>[\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12})' + _TESTS = [{ + 'url': 'https://ulizaportal.jp/pages/005f18b7-e810-5618-cb82-0987c5755d44', + 'info_dict': { + 'id': '005f18b7-e810-5618-cb82-0987c5755d44', + 'title': 'プレゼンテーションプレイヤーã®ã‚µãƒ³ãƒ—ル', + 'live_status': 'not_live', + }, + 'params': { + 'skip_download': True, + 'ignore_no_formats_error': True, + }, + }, { + 'url': 'https://ulizaportal.jp/pages/005e1b23-fe93-5780-19a0-98e917cc4b7d?expires=4102412400&signature=f422a993b683e1068f946caf406d211c17d1ef17da8bef3df4a519502155aa91&version=1', + 'info_dict': { + 'id': '005e1b23-fe93-5780-19a0-98e917cc4b7d', + 'title': 'ã€ç¢ºèªç”¨ã€‘視è´ã‚µãƒ³ãƒ—ルページ(ULIZA)', + 'live_status': 'not_live', + }, + 'params': { + 'skip_download': True, + 'ignore_no_formats_error': True, + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + expires = int_or_none(traverse_obj(parse_qs(url), ('expires', 0))) + if expires and expires <= time_seconds(): + raise ExtractorError('The link is expired.', video_id=video_id, expected=True) + + webpage = self._download_webpage(url, video_id) + + player_data = self._download_webpage( + self._search_regex( + r'<script [^>]*\bsrc="(https://player-api\.p\.uliza\.jp/v1/players/[^"]+)"', + webpage, 'player data url'), + video_id, headers={'Referer': 'https://ulizaportal.jp/'}, + note='Fetching player data', errnote='Unable to fetch player data') + + formats = self._extract_m3u8_formats( + self._search_regex( + r'["\'](https://vms-api\.p\.uliza\.jp/v1/prog-index\.m3u8[^"\']+)', player_data, + 'm3u8 url', default=None), + video_id, fatal=False) + m3u8_type = self._search_regex( + r'/hls/(dvr|video)/', traverse_obj(formats, (0, 'url')), 'm3u8 type', default=None) + + return { + 'id': video_id, + 'title': self._html_extract_title(webpage), + 'formats': formats, + 'live_status': { + 'video': 'is_live', + 'dvr': 'was_live', # short-term archives + }.get(m3u8_type, 'not_live'), # VOD or long-term archives + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/picarto.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/picarto.py new file mode 100644 index 0000000..d415ba2 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/picarto.py @@ -0,0 +1,152 @@ +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + str_or_none, + traverse_obj, +) + + +class PicartoIE(InfoExtractor): + _VALID_URL = r'https?://(?:www.)?picarto\.tv/(?P<id>[a-zA-Z0-9]+)' + _TEST = { + 'url': 'https://picarto.tv/Setz', + 'info_dict': { + 'id': 'Setz', + 'ext': 'mp4', + 'title': 're:^Setz [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'timestamp': int, + 'is_live': True + }, + 'skip': 'Stream is offline', + } + + @classmethod + def suitable(cls, url): + return False if PicartoVodIE.suitable(url) else super(PicartoIE, cls).suitable(url) + + def _real_extract(self, url): + channel_id = self._match_id(url) + + data = self._download_json( + 'https://ptvintern.picarto.tv/ptvapi', channel_id, query={ + 'query': '''{ + channel(name: "%s") { + adult + id + online + stream_name + title + } + getLoadBalancerUrl(channel_name: "%s") { + url + } +}''' % (channel_id, channel_id), + })['data'] + metadata = data['channel'] + + if metadata.get('online') == 0: + raise ExtractorError('Stream is offline', expected=True) + title = metadata['title'] + + cdn_data = self._download_json( + data['getLoadBalancerUrl']['url'] + '/stream/json_' + metadata['stream_name'] + '.js', + channel_id, 'Downloading load balancing info') + + formats = [] + for source in (cdn_data.get('source') or []): + source_url = source.get('url') + if not source_url: + continue + source_type = source.get('type') + if source_type == 'html5/application/vnd.apple.mpegurl': + formats.extend(self._extract_m3u8_formats( + source_url, channel_id, 'mp4', m3u8_id='hls', fatal=False)) + elif source_type == 'html5/video/mp4': + formats.append({ + 'url': source_url, + }) + + mature = metadata.get('adult') + if mature is None: + age_limit = None + else: + age_limit = 18 if mature is True else 0 + + return { + 'id': channel_id, + 'title': title.strip(), + 'is_live': True, + 'channel': channel_id, + 'channel_id': metadata.get('id'), + 'channel_url': 'https://picarto.tv/%s' % channel_id, + 'age_limit': age_limit, + 'formats': formats, + } + + +class PicartoVodIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?picarto\.tv/(?:videopopout|\w+/videos)/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://picarto.tv/videopopout/ArtofZod_2017.12.12.00.13.23.flv', + 'md5': '3ab45ba4352c52ee841a28fb73f2d9ca', + 'info_dict': { + 'id': 'ArtofZod_2017.12.12.00.13.23.flv', + 'ext': 'mp4', + 'title': 'ArtofZod_2017.12.12.00.13.23.flv', + 'thumbnail': r're:^https?://.*\.jpg' + }, + 'skip': 'The VOD does not exist', + }, { + 'url': 'https://picarto.tv/ArtofZod/videos/772650', + 'md5': '00067a0889f1f6869cc512e3e79c521b', + 'info_dict': { + 'id': '772650', + 'ext': 'mp4', + 'title': 'Art of Zod - Drawing and Painting', + 'thumbnail': r're:^https?://.*\.jpg', + 'channel': 'ArtofZod', + 'age_limit': 18, + } + }, { + 'url': 'https://picarto.tv/videopopout/Plague', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + data = self._download_json( + 'https://ptvintern.picarto.tv/ptvapi', video_id, query={ + 'query': f'''{{ + video(id: "{video_id}") {{ + id + title + adult + file_name + video_recording_image_url + channel {{ + name + }} + }} +}}''' + })['data']['video'] + + file_name = data['file_name'] + netloc = urllib.parse.urlparse(data['video_recording_image_url']).netloc + + formats = self._extract_m3u8_formats( + f'https://{netloc}/stream/hls/{file_name}/index.m3u8', video_id, 'mp4', m3u8_id='hls') + + return { + 'id': video_id, + **traverse_obj(data, { + 'id': ('id', {str_or_none}), + 'title': ('title', {str}), + 'thumbnail': 'video_recording_image_url', + 'channel': ('channel', 'name', {str}), + 'age_limit': ('adult', {lambda x: 18 if x else 0}), + }), + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/piksel.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/piksel.py new file mode 100644 index 0000000..97a9bf5 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/piksel.py @@ -0,0 +1,174 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + dict_get, + ExtractorError, + int_or_none, + join_nonempty, + parse_iso8601, + traverse_obj, + try_get, + unescapeHTML, + urljoin, +) + + +class PikselIE(InfoExtractor): + _VALID_URL = r'''(?x)https?:// + (?: + (?: + player\. + (?: + olympusattelecom| + vibebyvista + )| + (?:api|player)\.multicastmedia| + (?:api-ovp|player)\.piksel + )\.com| + (?: + mz-edge\.stream\.co| + movie-s\.nhk\.or + )\.jp| + vidego\.baltimorecity\.gov + )/v/(?:refid/(?P<refid>[^/]+)/prefid/)?(?P<id>[\w-]+)''' + _EMBED_REGEX = [r'<iframe[^>]+src=["\'](?P<url>(?:https?:)?//player\.piksel\.com/v/[a-z0-9]+)'] + _TESTS = [ + { + 'url': 'http://player.piksel.com/v/ums2867l', + 'md5': '34e34c8d89dc2559976a6079db531e85', + 'info_dict': { + 'id': 'ums2867l', + 'ext': 'mp4', + 'title': 'GX-005 with Caption', + 'timestamp': 1481335659, + 'upload_date': '20161210' + } + }, + { + # Original source: http://www.uscourts.gov/cameras-courts/state-washington-vs-donald-j-trump-et-al + 'url': 'https://player.piksel.com/v/v80kqp41', + 'md5': '753ddcd8cc8e4fa2dda4b7be0e77744d', + 'info_dict': { + 'id': 'v80kqp41', + 'ext': 'mp4', + 'title': 'WAW- State of Washington vs. Donald J. Trump, et al', + 'description': 'State of Washington vs. Donald J. Trump, et al, Case Number 17-CV-00141-JLR, TRO Hearing, Civil Rights Case, 02/3/2017, 1:00 PM (PST), Seattle Federal Courthouse, Seattle, WA, Judge James L. Robart presiding.', + 'timestamp': 1486171129, + 'upload_date': '20170204' + } + }, + { + # https://www3.nhk.or.jp/nhkworld/en/ondemand/video/2019240/ + 'url': 'http://player.piksel.com/v/refid/nhkworld/prefid/nw_vod_v_en_2019_240_20190823233000_02_1566873477', + 'only_matching': True, + } + ] + + def _call_api(self, app_token, resource, display_id, query, host='https://player.piksel.com', fatal=True): + url = urljoin(host, f'/ws/ws_{resource}/api/{app_token}/mode/json/apiv/5') + response = traverse_obj( + self._download_json(url, display_id, query=query, fatal=fatal), ('response', {dict})) or {} + failure = traverse_obj(response, ('failure', 'reason')) if response else 'Empty response from API' + if failure: + if fatal: + raise ExtractorError(failure, expected=True) + self.report_warning(failure) + return response + + def _real_extract(self, url): + ref_id, display_id = self._match_valid_url(url).groups() + webpage = self._download_webpage(url, display_id) + app_token = self._search_regex([ + r'clientAPI\s*:\s*"([^"]+)"', + r'data-de-api-key\s*=\s*"([^"]+)"' + ], webpage, 'app token') + query = {'refid': ref_id, 'prefid': display_id} if ref_id else {'v': display_id} + program = self._call_api( + app_token, 'program', display_id, query, url)['WsProgramResponse']['program'] + video_id = program['uuid'] + video_data = program['asset'] + title = video_data['title'] + asset_type = dict_get(video_data, ['assetType', 'asset_type']) + + formats = [] + + def process_asset_file(asset_file): + if not asset_file: + return + # TODO: extract rtmp formats + http_url = asset_file.get('http_url') + if not http_url: + return + tbr = None + vbr = int_or_none(asset_file.get('videoBitrate'), 1024) + abr = int_or_none(asset_file.get('audioBitrate'), 1024) + if asset_type == 'video': + tbr = vbr + abr + elif asset_type == 'audio': + tbr = abr + + formats.append({ + 'format_id': join_nonempty('http', tbr), + 'url': unescapeHTML(http_url), + 'vbr': vbr, + 'abr': abr, + 'width': int_or_none(asset_file.get('videoWidth')), + 'height': int_or_none(asset_file.get('videoHeight')), + 'filesize': int_or_none(asset_file.get('filesize')), + 'tbr': tbr, + }) + + def process_asset_files(asset_files): + for asset_file in (asset_files or []): + process_asset_file(asset_file) + + process_asset_files(video_data.get('assetFiles')) + process_asset_file(video_data.get('referenceFile')) + if not formats: + asset_id = video_data.get('assetid') or program.get('assetid') + if asset_id: + process_asset_files(try_get(self._call_api( + app_token, 'asset_file', display_id, { + 'assetid': asset_id, + }, url, False), lambda x: x['WsAssetFileResponse']['AssetFiles'])) + + m3u8_url = dict_get(video_data, [ + 'm3u8iPadURL', + 'ipadM3u8Url', + 'm3u8AndroidURL', + 'm3u8iPhoneURL', + 'iphoneM3u8Url']) + if m3u8_url: + formats.extend(self._extract_m3u8_formats( + m3u8_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + + smil_url = dict_get(video_data, ['httpSmil', 'hdSmil', 'rtmpSmil']) + if smil_url: + transform_source = None + if ref_id == 'nhkworld': + # TODO: figure out if this is something to be fixed in urljoin, + # _parse_smil_formats or keep it here + transform_source = lambda x: x.replace('src="/', 'src="').replace('/media"', '/media/"') + formats.extend(self._extract_smil_formats( + re.sub(r'/od/[^/]+/', '/od/http/', smil_url), video_id, + transform_source=transform_source, fatal=False)) + + subtitles = {} + for caption in video_data.get('captions', []): + caption_url = caption.get('url') + if caption_url: + subtitles.setdefault(caption.get('locale', 'en'), []).append({ + 'url': caption_url}) + + return { + 'id': video_id, + 'title': title, + 'description': video_data.get('description'), + 'thumbnail': video_data.get('thumbnailUrl'), + 'timestamp': parse_iso8601(video_data.get('dateadd')), + 'formats': formats, + 'subtitles': subtitles, + '_format_sort_fields': ('tbr', ), # Incomplete resolution information + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pinkbike.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pinkbike.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pinkbike.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pinkbike.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pinterest.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pinterest.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pinterest.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pinterest.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pixivsketch.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pixivsketch.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pixivsketch.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pixivsketch.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pladform.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pladform.py new file mode 100644 index 0000000..0050068 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pladform.py @@ -0,0 +1,136 @@ +from .common import InfoExtractor +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + parse_qs, + xpath_text, + qualities, +) + + +class PladformIE(InfoExtractor): + _VALID_URL = r'''(?x) + https?:// + (?: + (?: + out\.pladform\.ru/player| + static\.pladform\.ru/player\.swf + ) + \?.*\bvideoid=| + video\.pladform\.ru/catalog/video/videoid/ + ) + (?P<id>\d+) + ''' + _EMBED_REGEX = [r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//out\.pladform\.ru/player\?.+?)\1'] + _TESTS = [{ + 'url': 'http://out.pladform.ru/player?pl=18079&type=html5&videoid=100231282', + 'info_dict': { + 'id': '6216d548e755edae6e8280667d774791', + 'ext': 'mp4', + 'timestamp': 1406117012, + 'title': 'Гарик МартироÑÑн и Гарик Харламов - КаÑтинг на концерт ко Дню милиции', + 'age_limit': 0, + 'upload_date': '20140723', + 'thumbnail': str, + 'view_count': int, + 'description': str, + 'category': list, + 'uploader_id': '12082', + 'uploader': 'Comedy Club', + 'duration': 367, + }, + 'expected_warnings': ['HTTP Error 404: Not Found'] + }, { + 'url': 'https://out.pladform.ru/player?pl=64471&videoid=3777899&vk_puid15=0&vk_puid34=0', + 'md5': '53362fac3a27352da20fa2803cc5cd6f', + 'info_dict': { + 'id': '3777899', + 'ext': 'mp4', + 'title': 'СТУДИЯ СОЮЗ • Шоу Ð¡Ñ‚ÑƒÐ´Ð¸Ñ Ð¡Ð¾ÑŽÐ·, 24 выпуÑк (01.02.2018) Ðурлан Сабуров и Слава КомиÑÑаренко', + 'description': 'md5:05140e8bf1b7e2d46e7ba140be57fd95', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 3190, + }, + }, { + 'url': 'http://static.pladform.ru/player.swf?pl=21469&videoid=100183293&vkcid=0', + 'only_matching': True, + }, { + 'url': 'http://video.pladform.ru/catalog/video/videoid/100183293/vkcid/0', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + qs = parse_qs(url) + pl = qs.get('pl', ['1'])[0] + + video = self._download_xml( + 'http://out.pladform.ru/getVideo', video_id, query={ + 'pl': pl, + 'videoid': video_id, + }, fatal=False) + + def fail(text): + raise ExtractorError( + '%s returned error: %s' % (self.IE_NAME, text), + expected=True) + + if not video: + targetUrl = self._request_webpage(url, video_id, note='Resolving final URL').url + if targetUrl == url: + raise ExtractorError('Can\'t parse page') + return self.url_result(targetUrl) + + if video.tag == 'error': + fail(video.text) + + quality = qualities(('ld', 'sd', 'hd')) + + formats = [] + for src in video.findall('./src'): + if src is None: + continue + format_url = src.text + if not format_url: + continue + if src.get('type') == 'hls' or determine_ext(format_url) == 'm3u8': + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + else: + formats.append({ + 'url': src.text, + 'format_id': src.get('quality'), + 'quality': quality(src.get('quality')), + }) + + if not formats: + error = xpath_text(video, './cap', 'error', default=None) + if error: + fail(error) + + webpage = self._download_webpage( + 'http://video.pladform.ru/catalog/video/videoid/%s' % video_id, + video_id) + + title = self._og_search_title(webpage, fatal=False) or xpath_text( + video, './/title', 'title', fatal=True) + description = self._search_regex( + r'</h3>\s*<p>([^<]+)</p>', webpage, 'description', fatal=False) + thumbnail = self._og_search_thumbnail(webpage) or xpath_text( + video, './/cover', 'cover') + + duration = int_or_none(xpath_text(video, './/time', 'duration')) + age_limit = int_or_none(xpath_text(video, './/age18', 'age limit')) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'duration': duration, + 'age_limit': age_limit, + 'formats': formats, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/planetmarathi.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/planetmarathi.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/planetmarathi.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/planetmarathi.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/platzi.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/platzi.py new file mode 100644 index 0000000..166b98c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/platzi.py @@ -0,0 +1,213 @@ +from .common import InfoExtractor +from ..compat import ( + compat_b64decode, + compat_str, +) +from ..utils import ( + clean_html, + ExtractorError, + int_or_none, + str_or_none, + try_get, + url_or_none, + urlencode_postdata, + urljoin, +) + + +class PlatziBaseIE(InfoExtractor): + _LOGIN_URL = 'https://platzi.com/login/' + _NETRC_MACHINE = 'platzi' + + def _perform_login(self, username, password): + login_page = self._download_webpage( + self._LOGIN_URL, None, 'Downloading login page') + + login_form = self._hidden_inputs(login_page) + + login_form.update({ + 'email': username, + 'password': password, + }) + + urlh = self._request_webpage( + self._LOGIN_URL, None, 'Logging in', + data=urlencode_postdata(login_form), + headers={'Referer': self._LOGIN_URL}) + + # login succeeded + if 'platzi.com/login' not in urlh.url: + return + + login_error = self._webpage_read_content( + urlh, self._LOGIN_URL, None, 'Downloading login error page') + + login = self._parse_json( + self._search_regex( + r'login\s*=\s*({.+?})(?:\s*;|\s*</script)', login_error, 'login'), + None) + + for kind in ('error', 'password', 'nonFields'): + error = str_or_none(login.get('%sError' % kind)) + if error: + raise ExtractorError( + 'Unable to login: %s' % error, expected=True) + raise ExtractorError('Unable to log in') + + +class PlatziIE(PlatziBaseIE): + _VALID_URL = r'''(?x) + https?:// + (?: + platzi\.com/clases| # es version + courses\.platzi\.com/classes # en version + )/[^/]+/(?P<id>\d+)-[^/?\#&]+ + ''' + + _TESTS = [{ + 'url': 'https://platzi.com/clases/1311-next-js/12074-creando-nuestra-primera-pagina/', + 'md5': '8f56448241005b561c10f11a595b37e3', + 'info_dict': { + 'id': '12074', + 'ext': 'mp4', + 'title': 'Creando nuestra primera página', + 'description': 'md5:4c866e45034fc76412fbf6e60ae008bc', + 'duration': 420, + }, + 'skip': 'Requires platzi account credentials', + }, { + 'url': 'https://courses.platzi.com/classes/1367-communication-codestream/13430-background/', + 'info_dict': { + 'id': '13430', + 'ext': 'mp4', + 'title': 'Background', + 'description': 'md5:49c83c09404b15e6e71defaf87f6b305', + 'duration': 360, + }, + 'skip': 'Requires platzi account credentials', + 'params': { + 'skip_download': True, + }, + }] + + def _real_extract(self, url): + lecture_id = self._match_id(url) + + webpage = self._download_webpage(url, lecture_id) + + data = self._parse_json( + self._search_regex( + # client_data may contain "};" so that we have to try more + # strict regex first + (r'client_data\s*=\s*({.+?})\s*;\s*\n', + r'client_data\s*=\s*({.+?})\s*;'), + webpage, 'client data'), + lecture_id) + + material = data['initialState']['material'] + desc = material['description'] + title = desc['title'] + + formats = [] + for server_id, server in material['videos'].items(): + if not isinstance(server, dict): + continue + for format_id in ('hls', 'dash'): + format_url = url_or_none(server.get(format_id)) + if not format_url: + continue + if format_id == 'hls': + formats.extend(self._extract_m3u8_formats( + format_url, lecture_id, 'mp4', + entry_protocol='m3u8_native', m3u8_id=format_id, + note='Downloading %s m3u8 information' % server_id, + fatal=False)) + elif format_id == 'dash': + formats.extend(self._extract_mpd_formats( + format_url, lecture_id, mpd_id=format_id, + note='Downloading %s MPD manifest' % server_id, + fatal=False)) + + content = str_or_none(desc.get('content')) + description = (clean_html(compat_b64decode(content).decode('utf-8')) + if content else None) + duration = int_or_none(material.get('duration'), invscale=60) + + return { + 'id': lecture_id, + 'title': title, + 'description': description, + 'duration': duration, + 'formats': formats, + } + + +class PlatziCourseIE(PlatziBaseIE): + _VALID_URL = r'''(?x) + https?:// + (?: + platzi\.com/clases| # es version + courses\.platzi\.com/classes # en version + )/(?P<id>[^/?\#&]+) + ''' + _TESTS = [{ + 'url': 'https://platzi.com/clases/next-js/', + 'info_dict': { + 'id': '1311', + 'title': 'Curso de Next.js', + }, + 'playlist_count': 22, + }, { + 'url': 'https://courses.platzi.com/classes/communication-codestream/', + 'info_dict': { + 'id': '1367', + 'title': 'Codestream Course', + }, + 'playlist_count': 14, + }] + + @classmethod + def suitable(cls, url): + return False if PlatziIE.suitable(url) else super(PlatziCourseIE, cls).suitable(url) + + def _real_extract(self, url): + course_name = self._match_id(url) + + webpage = self._download_webpage(url, course_name) + + props = self._parse_json( + self._search_regex(r'data\s*=\s*({.+?})\s*;', webpage, 'data'), + course_name)['initialProps'] + + entries = [] + for chapter_num, chapter in enumerate(props['concepts'], 1): + if not isinstance(chapter, dict): + continue + materials = chapter.get('materials') + if not materials or not isinstance(materials, list): + continue + chapter_title = chapter.get('title') + chapter_id = str_or_none(chapter.get('id')) + for material in materials: + if not isinstance(material, dict): + continue + if material.get('material_type') != 'video': + continue + video_url = urljoin(url, material.get('url')) + if not video_url: + continue + entries.append({ + '_type': 'url_transparent', + 'url': video_url, + 'title': str_or_none(material.get('name')), + 'id': str_or_none(material.get('id')), + 'ie_key': PlatziIE.ie_key(), + 'chapter': chapter_title, + 'chapter_number': chapter_num, + 'chapter_id': chapter_id, + }) + + course_id = compat_str(try_get(props, lambda x: x['course']['id'])) + course_title = try_get(props, lambda x: x['course']['name'], compat_str) + + return self.playlist_result(entries, course_id, course_title) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/playfm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playfm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/playfm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/playfm.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/playplustv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playplustv.py new file mode 100644 index 0000000..a4439c8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/playplustv.py @@ -0,0 +1,100 @@ +import json + +from .common import InfoExtractor +from ..networking import PUTRequest +from ..networking.exceptions import HTTPError +from ..utils import ExtractorError, clean_html, int_or_none + + +class PlayPlusTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?playplus\.(?:com|tv)/VOD/(?P<project_id>[0-9]+)/(?P<id>[0-9a-f]{32})' + _TEST = { + 'url': 'https://www.playplus.tv/VOD/7572/db8d274a5163424e967f35a30ddafb8e', + 'md5': 'd078cb89d7ab6b9df37ce23c647aef72', + 'info_dict': { + 'id': 'db8d274a5163424e967f35a30ddafb8e', + 'ext': 'mp4', + 'title': 'Capítulo 179 - Final', + 'description': 'md5:01085d62d8033a1e34121d3c3cabc838', + 'timestamp': 1529992740, + 'upload_date': '20180626', + }, + 'skip': 'Requires account credential', + } + _NETRC_MACHINE = 'playplustv' + _GEO_COUNTRIES = ['BR'] + _token = None + _profile_id = None + + def _call_api(self, resource, video_id=None, query=None): + return self._download_json('https://api.playplus.tv/api/media/v2/get' + resource, video_id, headers={ + 'Authorization': 'Bearer ' + self._token, + }, query=query) + + def _perform_login(self, username, password): + req = PUTRequest( + 'https://api.playplus.tv/api/web/login', json.dumps({ + 'email': username, + 'password': password, + }).encode(), { + 'Content-Type': 'application/json; charset=utf-8', + }) + + try: + self._token = self._download_json(req, None)['token'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + raise ExtractorError(self._parse_json( + e.cause.response.read(), None)['errorMessage'], expected=True) + raise + + self._profile = self._call_api('Profiles')['list'][0]['_id'] + + def _real_initialize(self): + if not self._token: + self.raise_login_required(method='password') + + def _real_extract(self, url): + project_id, media_id = self._match_valid_url(url).groups() + media = self._call_api( + 'Media', media_id, { + 'profileId': self._profile, + 'projectId': project_id, + 'mediaId': media_id, + })['obj'] + title = media['title'] + + formats = [] + for f in media.get('files', []): + f_url = f.get('url') + if not f_url: + continue + file_info = f.get('fileInfo') or {} + formats.append({ + 'url': f_url, + 'width': int_or_none(file_info.get('width')), + 'height': int_or_none(file_info.get('height')), + }) + + thumbnails = [] + for thumb in media.get('thumbs', []): + thumb_url = thumb.get('url') + if not thumb_url: + continue + thumbnails.append({ + 'url': thumb_url, + 'width': int_or_none(thumb.get('width')), + 'height': int_or_none(thumb.get('height')), + }) + + return { + 'id': media_id, + 'title': title, + 'formats': formats, + 'thumbnails': thumbnails, + 'description': clean_html(media.get('description')) or media.get('shortDescription'), + 'timestamp': int_or_none(media.get('publishDate'), 1000), + 'view_count': int_or_none(media.get('numberOfViews')), + 'comment_count': int_or_none(media.get('numberOfComments')), + 'tags': media.get('tags'), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/plays.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/plays.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/plays.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/plays.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/playstuff.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playstuff.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/playstuff.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/playstuff.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/playsuisse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playsuisse.py new file mode 100644 index 0000000..76288c7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/playsuisse.py @@ -0,0 +1,187 @@ +import json + +from .common import InfoExtractor +from ..utils import int_or_none, traverse_obj + + +class PlaySuisseIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?playsuisse\.ch/(?:watch|detail)/(?:[^#]*[?&]episodeId=)?(?P<id>[0-9]+)' + _TESTS = [ + { + # Old URL + 'url': 'https://www.playsuisse.ch/watch/763211/0', + 'only_matching': True, + }, + { + # episode in a series + 'url': 'https://www.playsuisse.ch/watch/763182?episodeId=763211', + 'md5': '82df2a470b2dfa60c2d33772a8a60cf8', + 'info_dict': { + 'id': '763211', + 'ext': 'mp4', + 'title': 'Knochen', + 'description': 'md5:8ea7a8076ba000cd9e8bc132fd0afdd8', + 'duration': 3344, + 'series': 'Wilder', + 'season': 'Season 1', + 'season_number': 1, + 'episode': 'Knochen', + 'episode_number': 1, + 'thumbnail': 're:https://playsuisse-img.akamaized.net/', + } + }, { + # film + 'url': 'https://www.playsuisse.ch/watch/808675', + 'md5': '818b94c1d2d7c4beef953f12cb8f3e75', + 'info_dict': { + 'id': '808675', + 'ext': 'mp4', + 'title': 'Der Läufer', + 'description': 'md5:9f61265c7e6dcc3e046137a792b275fd', + 'duration': 5280, + 'thumbnail': 're:https://playsuisse-img.akamaized.net/', + } + }, { + # series (treated as a playlist) + 'url': 'https://www.playsuisse.ch/detail/1115687', + 'info_dict': { + 'description': 'md5:e4a2ae29a8895823045b5c3145a02aa3', + 'id': '1115687', + 'series': 'They all came out to Montreux', + 'title': 'They all came out to Montreux', + }, + 'playlist': [{ + 'info_dict': { + 'description': 'md5:f2462744834b959a31adc6292380cda2', + 'duration': 3180, + 'episode': 'Folge 1', + 'episode_number': 1, + 'id': '1112663', + 'season': 'Season 1', + 'season_number': 1, + 'series': 'They all came out to Montreux', + 'thumbnail': 're:https://playsuisse-img.akamaized.net/', + 'title': 'Folge 1', + 'ext': 'mp4' + }, + }, { + 'info_dict': { + 'description': 'md5:9dfd308699fe850d3bce12dc1bad9b27', + 'duration': 2935, + 'episode': 'Folge 2', + 'episode_number': 2, + 'id': '1112661', + 'season': 'Season 1', + 'season_number': 1, + 'series': 'They all came out to Montreux', + 'thumbnail': 're:https://playsuisse-img.akamaized.net/', + 'title': 'Folge 2', + 'ext': 'mp4' + }, + }, { + 'info_dict': { + 'description': 'md5:14a93a3356b2492a8f786ab2227ef602', + 'duration': 2994, + 'episode': 'Folge 3', + 'episode_number': 3, + 'id': '1112664', + 'season': 'Season 1', + 'season_number': 1, + 'series': 'They all came out to Montreux', + 'thumbnail': 're:https://playsuisse-img.akamaized.net/', + 'title': 'Folge 3', + 'ext': 'mp4' + } + }], + } + ] + + _GRAPHQL_QUERY = ''' + query AssetWatch($assetId: ID!) { + assetV2(id: $assetId) { + ...Asset + episodes { + ...Asset + } + } + } + fragment Asset on AssetV2 { + id + name + description + duration + episodeNumber + seasonNumber + seriesName + medias { + type + url + } + thumbnail16x9 { + ...ImageDetails + } + thumbnail2x3 { + ...ImageDetails + } + thumbnail16x9WithTitle { + ...ImageDetails + } + thumbnail2x3WithTitle { + ...ImageDetails + } + } + fragment ImageDetails on AssetImage { + id + url + }''' + + def _get_media_data(self, media_id): + # NOTE In the web app, the "locale" header is used to switch between languages, + # However this doesn't seem to take effect when passing the header here. + response = self._download_json( + 'https://4bbepzm4ef.execute-api.eu-central-1.amazonaws.com/prod/graphql', + media_id, data=json.dumps({ + 'operationName': 'AssetWatch', + 'query': self._GRAPHQL_QUERY, + 'variables': {'assetId': media_id} + }).encode('utf-8'), + headers={'Content-Type': 'application/json', 'locale': 'de'}) + + return response['data']['assetV2'] + + def _real_extract(self, url): + media_id = self._match_id(url) + media_data = self._get_media_data(media_id) + info = self._extract_single(media_data) + if media_data.get('episodes'): + info.update({ + '_type': 'playlist', + 'entries': map(self._extract_single, media_data['episodes']), + }) + return info + + def _extract_single(self, media_data): + thumbnails = traverse_obj(media_data, lambda k, _: k.startswith('thumbnail')) + + formats, subtitles = [], {} + for media in traverse_obj(media_data, 'medias', default=[]): + if not media.get('url') or media.get('type') != 'HLS': + continue + f, subs = self._extract_m3u8_formats_and_subtitles( + media['url'], media_data['id'], 'mp4', m3u8_id='HLS', fatal=False) + formats.extend(f) + self._merge_subtitles(subs, target=subtitles) + + return { + 'id': media_data['id'], + 'title': media_data.get('name'), + 'description': media_data.get('description'), + 'thumbnails': thumbnails, + 'duration': int_or_none(media_data.get('duration')), + 'formats': formats, + 'subtitles': subtitles, + 'series': media_data.get('seriesName'), + 'season_number': int_or_none(media_data.get('seasonNumber')), + 'episode': media_data.get('name') if media_data.get('episodeNumber') else None, + 'episode_number': int_or_none(media_data.get('episodeNumber')), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/playtvak.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playtvak.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/playtvak.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/playtvak.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/playvid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playvid.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/playvid.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/playvid.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/playwire.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/playwire.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/playwire.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/playwire.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pluralsight.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pluralsight.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pluralsight.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pluralsight.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/plutotv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/plutotv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/plutotv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/plutotv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/podbayfm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/podbayfm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/podbayfm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/podbayfm.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/podchaser.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/podchaser.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/podchaser.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/podchaser.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/podomatic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/podomatic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/podomatic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/podomatic.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pokemon.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pokemon.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pokemon.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pokemon.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pokergo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pokergo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pokergo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pokergo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/polsatgo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/polsatgo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/polsatgo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/polsatgo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/polskieradio.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/polskieradio.py new file mode 100644 index 0000000..5bf92b9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/polskieradio.py @@ -0,0 +1,610 @@ +import itertools +import json +import math +import re +import urllib.parse + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + ExtractorError, + InAdvancePagedList, + determine_ext, + extract_attributes, + int_or_none, + js_to_json, + parse_iso8601, + strip_or_none, + traverse_obj, + unescapeHTML, + unified_timestamp, + url_or_none, + urljoin, +) + + +class PolskieRadioBaseExtractor(InfoExtractor): + def _extract_webpage_player_entries(self, webpage, playlist_id, base_data): + media_urls = set() + + for data_media in re.findall(r'<[^>]+data-media="?({[^>]+})"?', webpage): + media = self._parse_json(data_media, playlist_id, transform_source=unescapeHTML, fatal=False) + if not media.get('file') or not media.get('desc'): + continue + media_url = self._proto_relative_url(media['file']) + if media_url in media_urls: + continue + media_urls.add(media_url) + entry = base_data.copy() + entry.update({ + 'id': compat_str(media['id']), + 'url': media_url, + 'duration': int_or_none(media.get('length')), + 'vcodec': 'none' if media.get('provider') == 'audio' else None, + }) + entry_title = urllib.parse.unquote(media['desc']) + if entry_title: + entry['title'] = entry_title + yield entry + + +class PolskieRadioLegacyIE(PolskieRadioBaseExtractor): + # legacy sites + IE_NAME = 'polskieradio:legacy' + _VALID_URL = r'https?://(?:www\.)?polskieradio(?:24)?\.pl/\d+/\d+/[Aa]rtykul/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.polskieradio.pl/8/2382/Artykul/2534482,Zagarysci-Poezja-jak-spoiwo', + 'info_dict': { + 'id': '2534482', + 'title': 'Å»agaryÅ›ci. Poezja jak spoiwo', + 'description': 'md5:f18d95d5dcba747a09b635e21a4c0695', + }, + 'playlist': [{ + 'md5': 'd07559829f61d5a93a75755987ded760', + 'info_dict': { + 'id': '2516679', + 'ext': 'mp3', + 'title': 'md5:c6e1234e0b747ad883cb91b7ad06b98c', + 'timestamp': 1592654400, + 'upload_date': '20200620', + 'duration': 1430, + 'thumbnail': r're:^https?://static\.prsa\.pl/images/.*\.jpg$' + }, + }], + }, { + # PR4 audition - other frontend + 'url': 'https://www.polskieradio.pl/10/6071/Artykul/2610977,Poglos-29-pazdziernika-godz-2301', + 'info_dict': { + 'id': '2610977', + 'ext': 'mp3', + 'title': 'PogÅ‚os 29 października godz. 23:01', + }, + }, { + 'url': 'https://polskieradio24.pl/130/4503/Artykul/2621876,Narusza-nasza-suwerennosc-Publicysci-o-uzaleznieniu-funduszy-UE-od-praworzadnosci', + 'only_matching': True, + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + webpage, urlh = self._download_webpage_handle(url, playlist_id) + if PolskieRadioIE.suitable(urlh.url): + return self.url_result(urlh.url, PolskieRadioIE, playlist_id) + + content = self._search_regex( + r'(?s)<div[^>]+class="\s*this-article\s*"[^>]*>(.+?)<div[^>]+class="tags"[^>]*>', + webpage, 'content', default=None) + + timestamp = unified_timestamp(self._html_search_regex( + r'(?s)<span[^>]+id="datetime2"[^>]*>(.+?)</span>', + webpage, 'timestamp', default=None)) + + thumbnail_url = self._og_search_thumbnail(webpage, default=None) + + title = self._og_search_title(webpage).strip() + + description = strip_or_none(self._og_search_description(webpage, default=None)) + description = description.replace('\xa0', ' ') if description is not None else None + + if not content: + return { + 'id': playlist_id, + 'url': self._proto_relative_url( + self._search_regex( + r"source:\s*'(//static\.prsa\.pl/[^']+)'", + webpage, 'audition record url')), + 'title': title, + 'description': description, + 'timestamp': timestamp, + 'thumbnail': thumbnail_url, + } + + entries = self._extract_webpage_player_entries(content, playlist_id, { + 'title': title, + 'timestamp': timestamp, + 'thumbnail': thumbnail_url, + }) + + return self.playlist_result(entries, playlist_id, title, description) + + +class PolskieRadioIE(PolskieRadioBaseExtractor): + # new next.js sites + _VALID_URL = r'https?://(?:[^/]+\.)?(?:polskieradio(?:24)?|radiokierowcow)\.pl/artykul/(?P<id>\d+)' + _TESTS = [{ + # articleData, attachments + 'url': 'https://jedynka.polskieradio.pl/artykul/1587943', + 'info_dict': { + 'id': '1587943', + 'title': 'Prof. Andrzej Nowak: o historii nie da siÄ™ myÅ›leć beznamiÄ™tnie', + 'description': 'md5:12f954edbf3120c5e7075e17bf9fc5c5', + }, + 'playlist': [{ + 'md5': '2984ee6ce9046d91fc233bc1a864a09a', + 'info_dict': { + 'id': '7a85d429-5356-4def-a347-925e4ae7406b', + 'ext': 'mp3', + 'title': 'md5:d4623290d4ac983bf924061c75c23a0d', + }, + }], + }, { + # post, legacy html players + 'url': 'https://trojka.polskieradio.pl/artykul/2589163,Czy-wciaz-otrzymujemy-zdjecia-z-sond-Voyager', + 'info_dict': { + 'id': '2589163', + 'title': 'Czy wciąż otrzymujemy zdjÄ™cia z sond Voyager?', + 'description': 'md5:cf1a7f348d63a2db9c0d7a63d1669473', + }, + 'playlist': [{ + 'info_dict': { + 'id': '2577880', + 'ext': 'mp3', + 'title': 'md5:a57d10a0c02abd34dd675cb33707ad5a', + 'duration': 321, + }, + }], + }, { + # data, legacy + 'url': 'https://radiokierowcow.pl/artykul/2694529', + 'info_dict': { + 'id': '2694529', + 'title': 'Zielona fala reliktem przeszÅ‚oÅ›ci?', + 'description': 'md5:f20a9a7ed9cb58916c54add94eae3bc0', + }, + 'playlist_count': 3, + }, { + 'url': 'https://trojka.polskieradio.pl/artykul/1632955', + 'only_matching': True, + }, { + # with mp4 video + 'url': 'https://trojka.polskieradio.pl/artykul/1634903', + 'only_matching': True, + }, { + 'url': 'https://jedynka.polskieradio.pl/artykul/3042436,Polityka-wschodnia-ojca-i-syna-Wladyslawa-Lokietka-i-Kazimierza-Wielkiego', + 'only_matching': True, + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + webpage = self._download_webpage(url, playlist_id) + + article_data = traverse_obj( + self._search_nextjs_data(webpage, playlist_id), ( + 'props', 'pageProps', (('data', 'articleData'), 'post', 'data')), get_all=False) + + title = strip_or_none(article_data['title']) + + description = strip_or_none(article_data.get('lead')) + + entries = [{ + 'url': entry['file'], + 'ext': determine_ext(entry.get('fileName')), + 'id': self._search_regex( + r'([a-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12})', entry['file'], 'entry id'), + 'title': strip_or_none(entry.get('description')) or title, + } for entry in article_data.get('attachments') or () if entry.get('fileType') in ('Audio', )] + + if not entries: + # some legacy articles have no json attachments, but players in body + entries = self._extract_webpage_player_entries(article_data['content'], playlist_id, { + 'title': title, + }) + + return self.playlist_result(entries, playlist_id, title, description) + + +class PolskieRadioAuditionIE(InfoExtractor): + # new next.js sites + IE_NAME = 'polskieradio:audition' + _VALID_URL = r'https?://(?:[^/]+\.)?polskieradio\.pl/audycj[ae]/(?P<id>\d+)' + _TESTS = [{ + # articles, PR1 + 'url': 'https://jedynka.polskieradio.pl/audycje/5102', + 'info_dict': { + 'id': '5102', + 'title': 'Historia żywa', + 'thumbnail': r're:https://static\.prsa\.pl/images/.+', + }, + 'playlist_mincount': 38, + }, { + # episodes, PR1 + 'url': 'https://jedynka.polskieradio.pl/audycje/5769', + 'info_dict': { + 'id': '5769', + 'title': 'AgroFakty', + 'thumbnail': r're:https://static\.prsa\.pl/images/.+', + }, + 'playlist_mincount': 269, + }, { + # both episodes and articles, PR3 + 'url': 'https://trojka.polskieradio.pl/audycja/8906', + 'info_dict': { + 'id': '8906', + 'title': 'Trójka budzi', + 'thumbnail': r're:https://static\.prsa\.pl/images/.+', + }, + 'playlist_mincount': 722, + }, { + # some articles were "promoted to main page" and thus link to old frontend + 'url': 'https://trojka.polskieradio.pl/audycja/305', + 'info_dict': { + 'id': '305', + 'title': 'Co w mowie piszczy?', + 'thumbnail': r're:https://static\.prsa\.pl/images/.+', + }, + 'playlist_count': 1523, + }] + + def _call_lp3(self, path, query, video_id, note): + return self._download_json( + f'https://lp3test.polskieradio.pl/{path}', video_id, note, + query=query, headers={'x-api-key': '9bf6c5a2-a7d0-4980-9ed7-a3f7291f2a81'}) + + def _entries(self, playlist_id, has_episodes, has_articles): + for i in itertools.count(1) if has_episodes else []: + page = self._call_lp3( + 'AudioArticle/GetListByCategoryId', { + 'categoryId': playlist_id, + 'PageSize': 10, + 'skip': i, + 'format': 400, + }, playlist_id, f'Downloading episode list page {i}') + if not traverse_obj(page, 'data'): + break + for episode in page['data']: + yield { + 'id': str(episode['id']), + 'url': episode['file'], + 'title': episode.get('title'), + 'duration': int_or_none(episode.get('duration')), + 'timestamp': parse_iso8601(episode.get('datePublic')), + } + + for i in itertools.count(1) if has_articles else []: + page = self._call_lp3( + 'Article/GetListByCategoryId', { + 'categoryId': playlist_id, + 'PageSize': 9, + 'skip': i, + 'format': 400, + }, playlist_id, f'Downloading article list page {i}') + if not traverse_obj(page, 'data'): + break + for article in page['data']: + yield { + '_type': 'url_transparent', + 'id': str(article['id']), + 'url': article['url'], + 'title': article.get('shortTitle'), + 'description': traverse_obj(article, ('description', 'lead')), + 'timestamp': parse_iso8601(article.get('datePublic')), + } + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + page_props = traverse_obj( + self._search_nextjs_data(self._download_webpage(url, playlist_id), playlist_id), + ('props', 'pageProps', ('data', None)), get_all=False) + + has_episodes = bool(traverse_obj(page_props, 'episodes', 'audios')) + has_articles = bool(traverse_obj(page_props, 'articles')) + + return self.playlist_result( + self._entries(playlist_id, has_episodes, has_articles), playlist_id, + title=traverse_obj(page_props, ('details', 'name')), + description=traverse_obj(page_props, ('details', 'description', 'lead')), + thumbnail=traverse_obj(page_props, ('details', 'photo'))) + + +class PolskieRadioCategoryIE(InfoExtractor): + # legacy sites + IE_NAME = 'polskieradio:category' + _VALID_URL = r'https?://(?:www\.)?polskieradio\.pl/(?:\d+(?:,[^/]+)?/|[^/]+/Tag)(?P<id>\d+)' + _TESTS = [{ + 'url': 'http://www.polskieradio.pl/37,RedakcjaKatolicka/4143,Kierunek-Krakow', + 'info_dict': { + 'id': '4143', + 'title': 'Kierunek Kraków', + }, + 'playlist_mincount': 61 + }, { + 'url': 'http://www.polskieradio.pl/10,czworka/214,muzyka', + 'info_dict': { + 'id': '214', + 'title': 'Muzyka', + }, + 'playlist_mincount': 61 + }, { + # billennium tabs + 'url': 'https://www.polskieradio.pl/8/2385', + 'info_dict': { + 'id': '2385', + 'title': 'Droga przez mÄ…kÄ™', + }, + 'playlist_mincount': 111, + }, { + 'url': 'https://www.polskieradio.pl/10/4930', + 'info_dict': { + 'id': '4930', + 'title': 'Teraz K-pop!', + }, + 'playlist_mincount': 392, + }, { + # post back pages, audio content directly without articles + 'url': 'https://www.polskieradio.pl/8,dwojka/7376,nowa-mowa', + 'info_dict': { + 'id': '7376', + 'title': 'Nowa mowa', + }, + 'playlist_mincount': 244, + }, { + 'url': 'https://www.polskieradio.pl/Krzysztof-Dziuba/Tag175458', + 'info_dict': { + 'id': '175458', + 'title': 'Krzysztof Dziuba', + }, + 'playlist_mincount': 420, + }, { + 'url': 'http://www.polskieradio.pl/8,Dwojka/196,Publicystyka', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if PolskieRadioLegacyIE.suitable(url) else super().suitable(url) + + def _entries(self, url, page, category_id): + content = page + is_billennium_tabs = 'onclick="TB_LoadTab(' in page + is_post_back = 'onclick="__doPostBack(' in page + pagination = page if is_billennium_tabs else None + for page_num in itertools.count(2): + for a_entry, entry_id in re.findall( + r'(?s)<article[^>]+>.*?(<a[^>]+href=["\'](?:(?:https?)?://[^/]+)?/\d+/\d+/Artykul/(\d+)[^>]+>).*?</article>', + content): + entry = extract_attributes(a_entry) + if entry.get('href'): + yield self.url_result( + urljoin(url, entry['href']), PolskieRadioLegacyIE, entry_id, entry.get('title')) + for a_entry in re.findall(r'<span data-media=({[^ ]+})', content): + yield traverse_obj(self._parse_json(a_entry, category_id), { + 'url': 'file', + 'id': 'uid', + 'duration': 'length', + 'title': ('title', {urllib.parse.unquote}), + 'description': ('desc', {urllib.parse.unquote}), + }) + if is_billennium_tabs: + params = self._search_json( + r'<div[^>]+class=["\']next["\'][^>]*>\s*<a[^>]+onclick=["\']TB_LoadTab\(', + pagination, 'next page params', category_id, default=None, close_objects=1, + contains_pattern='.+', transform_source=lambda x: '[%s' % js_to_json(unescapeHTML(x))) + if not params: + break + tab_content = self._download_json( + 'https://www.polskieradio.pl/CMS/TemplateBoxesManagement/TemplateBoxTabContent.aspx/GetTabContent', + category_id, f'Downloading page {page_num}', headers={'content-type': 'application/json'}, + data=json.dumps(dict(zip(( + 'boxInstanceId', 'tabId', 'categoryType', 'sectionId', 'categoryId', 'pagerMode', + 'subjectIds', 'tagIndexId', 'queryString', 'name', 'openArticlesInParentTemplate', + 'idSectionFromUrl', 'maxDocumentAge', 'showCategoryForArticle', 'pageNumber' + ), params))).encode())['d'] + content, pagination = tab_content['Content'], tab_content.get('PagerContent') + elif is_post_back: + target = self._search_regex( + r'onclick=(?:["\'])__doPostBack\((?P<q1>["\'])(?P<target>[\w$]+)(?P=q1)\s*,\s*(?P<q2>["\'])Next(?P=q2)', + content, 'pagination postback target', group='target', default=None) + if not target: + break + content = self._download_webpage( + url, category_id, f'Downloading page {page_num}', + data=urllib.parse.urlencode({ + **self._hidden_inputs(content), + '__EVENTTARGET': target, + '__EVENTARGUMENT': 'Next', + }).encode()) + else: + next_url = urljoin(url, self._search_regex( + r'<div[^>]+class=["\']next["\'][^>]*>\s*<a[^>]+href=(["\'])(?P<url>(?:(?!\1).)+)\1', + content, 'next page url', group='url', default=None)) + if not next_url: + break + content = self._download_webpage(next_url, category_id, f'Downloading page {page_num}') + + def _real_extract(self, url): + category_id = self._match_id(url) + webpage, urlh = self._download_webpage_handle(url, category_id) + if PolskieRadioAuditionIE.suitable(urlh.url): + return self.url_result(urlh.url, PolskieRadioAuditionIE, category_id) + title = self._html_search_regex( + r'<title>([^<]+)(?: - [^<]+ - [^<]+| w [Pp]olskie[Rr]adio\.pl\s*)', + webpage, 'title', fatal=False) + return self.playlist_result( + self._entries(url, webpage, category_id), + category_id, title) + + +class PolskieRadioPlayerIE(InfoExtractor): + IE_NAME = 'polskieradio:player' + _VALID_URL = r'https?://player\.polskieradio\.pl/anteny/(?P[^/]+)' + + _BASE_URL = 'https://player.polskieradio.pl' + _PLAYER_URL = 'https://player.polskieradio.pl/main.bundle.js' + _STATIONS_API_URL = 'https://apipr.polskieradio.pl/api/stacje' + + _TESTS = [{ + 'url': 'https://player.polskieradio.pl/anteny/trojka', + 'info_dict': { + 'id': '3', + 'ext': 'm4a', + 'title': 'Trójka', + }, + 'params': { + 'format': 'bestaudio', + 'skip_download': 'endless stream', + }, + }] + + def _get_channel_list(self, channel_url='no_channel'): + player_code = self._download_webpage( + self._PLAYER_URL, channel_url, + note='Downloading js player') + channel_list = js_to_json(self._search_regex( + r';var r="anteny",a=(\[.+?\])},', player_code, 'channel list')) + return self._parse_json(channel_list, channel_url) + + def _real_extract(self, url): + channel_url = self._match_id(url) + channel_list = self._get_channel_list(channel_url) + + channel = next((c for c in channel_list if c.get('url') == channel_url), None) + + if not channel: + raise ExtractorError('Channel not found') + + station_list = self._download_json(self._STATIONS_API_URL, channel_url, + note='Downloading stream url list', + headers={ + 'Accept': 'application/json', + 'Referer': url, + 'Origin': self._BASE_URL, + }) + station = next((s for s in station_list + if s.get('Name') == (channel.get('streamName') or channel.get('name'))), None) + if not station: + raise ExtractorError('Station not found even though we extracted channel') + + formats = [] + for stream_url in station['Streams']: + stream_url = self._proto_relative_url(stream_url) + if stream_url.endswith('/playlist.m3u8'): + formats.extend(self._extract_m3u8_formats(stream_url, channel_url, live=True)) + elif stream_url.endswith('/manifest.f4m'): + formats.extend(self._extract_mpd_formats(stream_url, channel_url)) + elif stream_url.endswith('/Manifest'): + formats.extend(self._extract_ism_formats(stream_url, channel_url)) + else: + formats.append({ + 'url': stream_url, + }) + + return { + 'id': compat_str(channel['id']), + 'formats': formats, + 'title': channel.get('name') or channel.get('streamName'), + 'display_id': channel_url, + 'thumbnail': f'{self._BASE_URL}/images/{channel_url}-color-logo.png', + 'is_live': True, + } + + +class PolskieRadioPodcastBaseExtractor(InfoExtractor): + _API_BASE = 'https://apipodcasts.polskieradio.pl/api' + + def _parse_episode(self, data): + return { + 'id': data['guid'], + 'formats': [{ + 'url': data['url'], + 'filesize': int_or_none(data.get('fileSize')), + }], + 'title': data['title'], + 'description': data.get('description'), + 'duration': int_or_none(data.get('length')), + 'timestamp': parse_iso8601(data.get('publishDate')), + 'thumbnail': url_or_none(data.get('image')), + 'series': data.get('podcastTitle'), + 'episode': data['title'], + } + + +class PolskieRadioPodcastListIE(PolskieRadioPodcastBaseExtractor): + IE_NAME = 'polskieradio:podcast:list' + _VALID_URL = r'https?://podcasty\.polskieradio\.pl/podcast/(?P\d+)' + _TESTS = [{ + 'url': 'https://podcasty.polskieradio.pl/podcast/8/', + 'info_dict': { + 'id': '8', + 'title': 'Åšniadanie w Trójce', + 'description': 'md5:57abcc27bc4c6a6b25baa3061975b9ef', + 'uploader': 'Beata Michniewicz', + }, + 'playlist_mincount': 714, + }] + _PAGE_SIZE = 10 + + def _call_api(self, podcast_id, page): + return self._download_json( + f'{self._API_BASE}/Podcasts/{podcast_id}/?pageSize={self._PAGE_SIZE}&page={page}', + podcast_id, f'Downloading page {page}') + + def _real_extract(self, url): + podcast_id = self._match_id(url) + data = self._call_api(podcast_id, 1) + + def get_page(page_num): + page_data = self._call_api(podcast_id, page_num + 1) if page_num else data + yield from (self._parse_episode(ep) for ep in page_data['items']) + + return { + '_type': 'playlist', + 'entries': InAdvancePagedList( + get_page, math.ceil(data['itemCount'] / self._PAGE_SIZE), self._PAGE_SIZE), + 'id': str(data['id']), + 'title': data.get('title'), + 'description': data.get('description'), + 'uploader': data.get('announcer'), + } + + +class PolskieRadioPodcastIE(PolskieRadioPodcastBaseExtractor): + IE_NAME = 'polskieradio:podcast' + _VALID_URL = r'https?://podcasty\.polskieradio\.pl/track/(?P[a-f\d]{8}(?:-[a-f\d]{4}){4}[a-f\d]{8})' + _TESTS = [{ + 'url': 'https://podcasty.polskieradio.pl/track/6eafe403-cb8f-4756-b896-4455c3713c32', + 'info_dict': { + 'id': '6eafe403-cb8f-4756-b896-4455c3713c32', + 'ext': 'mp3', + 'title': 'Theresa May rezygnuje. Co dalej z brexitem?', + 'description': 'md5:e41c409a29d022b70ef0faa61dbded60', + 'episode': 'Theresa May rezygnuje. Co dalej z brexitem?', + 'duration': 2893, + 'thumbnail': 'https://static.prsa.pl/images/58649376-c8a0-4ba2-a714-78b383285f5f.jpg', + 'series': 'Raport o stanie Å›wiata', + }, + }] + + def _real_extract(self, url): + podcast_id = self._match_id(url) + data = self._download_json( + f'{self._API_BASE}/audio', + podcast_id, 'Downloading podcast metadata', + data=json.dumps({ + 'guids': [podcast_id], + }).encode('utf-8'), + headers={ + 'Content-Type': 'application/json', + }) + return self._parse_episode(data[0]) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/popcorntimes.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/popcorntimes.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/popcorntimes.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/popcorntimes.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/popcorntv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/popcorntv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/popcorntv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/popcorntv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/porn91.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/porn91.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/porn91.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/porn91.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pornbox.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornbox.py new file mode 100644 index 0000000..c381382 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornbox.py @@ -0,0 +1,113 @@ +from .common import InfoExtractor +from ..compat import functools +from ..utils import ( + int_or_none, + parse_duration, + parse_iso8601, + qualities, + str_or_none, + traverse_obj, + url_or_none, +) + + +class PornboxIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?pornbox\.com/application/watch-page/(?P[0-9]+)' + _TESTS = [{ + 'url': 'https://pornbox.com/application/watch-page/212108', + 'md5': '3ff6b6e206f263be4c5e987a3162ac6e', + 'info_dict': { + 'id': '212108', + 'ext': 'mp4', + 'title': 'md5:ececc5c6e6c9dd35d290c45fed05fd49', + 'uploader': 'Lily Strong', + 'timestamp': 1665871200, + 'upload_date': '20221015', + 'age_limit': 18, + 'availability': 'needs_auth', + 'duration': 1505, + 'cast': ['Lily Strong', 'John Strong'], + 'tags': 'count:11', + 'description': 'md5:589c7f33e183aa8aa939537300efb859', + 'thumbnail': r're:^https?://cdn-image\.gtflixtv\.com.*\.jpg.*$' + } + }, { + 'url': 'https://pornbox.com/application/watch-page/216045', + 'info_dict': { + 'id': '216045', + 'title': 'md5:3e48528e73a9a2b12f7a2772ed0b26a2', + 'description': 'md5:3e631dcaac029f15ed434e402d1b06c7', + 'uploader': 'VK Studio', + 'timestamp': 1618264800, + 'upload_date': '20210412', + 'age_limit': 18, + 'availability': 'premium_only', + 'duration': 2710, + 'cast': 'count:3', + 'tags': 'count:29', + 'thumbnail': r're:^https?://cdn-image\.gtflixtv\.com.*\.jpg.*$', + 'subtitles': 'count:6' + }, + 'params': { + 'skip_download': True, + 'ignore_no_formats_error': True + }, + 'expected_warnings': [ + 'You are either not logged in or do not have access to this scene', + 'No video formats found', 'Requested format is not available'] + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + public_data = self._download_json(f'https://pornbox.com/contents/{video_id}', video_id) + + subtitles = {country_code: [{ + 'url': f'https://pornbox.com/contents/{video_id}/subtitles/{country_code}', + 'ext': 'srt' + }] for country_code in traverse_obj(public_data, ('subtitles', ..., {str}))} + + is_free_scene = traverse_obj( + public_data, ('price', 'is_available_for_free', {bool}), default=False) + + metadata = { + 'id': video_id, + **traverse_obj(public_data, { + 'title': ('scene_name', {str.strip}), + 'description': ('small_description', {str.strip}), + 'uploader': 'studio', + 'duration': ('runtime', {parse_duration}), + 'cast': (('models', 'male_models'), ..., 'model_name'), + 'thumbnail': ('player_poster', {url_or_none}), + 'tags': ('niches', ..., 'niche'), + }), + 'age_limit': 18, + 'timestamp': parse_iso8601(traverse_obj( + public_data, ('studios', 'release_date'), 'publish_date')), + 'availability': self._availability(needs_auth=True, needs_premium=not is_free_scene), + 'subtitles': subtitles, + } + + if not public_data.get('is_purchased') or not is_free_scene: + self.raise_login_required( + 'You are either not logged in or do not have access to this scene', metadata_available=True) + return metadata + + media_id = traverse_obj(public_data, ( + 'medias', lambda _, v: v['title'] == 'Full video', 'media_id', {int}), get_all=False) + if not media_id: + self.raise_no_formats('Could not find stream id', video_id=video_id) + + stream_data = self._download_json( + f'https://pornbox.com/media/{media_id}/stream', video_id=video_id, note='Getting manifest urls') + + get_quality = qualities(['web', 'vga', 'hd', '1080p', '4k', '8k']) + metadata['formats'] = traverse_obj(stream_data, ('qualities', lambda _, v: v['src'], { + 'url': 'src', + 'vbr': ('bitrate', {functools.partial(int_or_none, scale=1000)}), + 'format_id': ('quality', {str_or_none}), + 'quality': ('quality', {get_quality}), + 'width': ('size', {lambda x: int(x[:-1])}), + })) + + return metadata diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/porncom.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/porncom.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/porncom.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/porncom.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pornez.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornez.py new file mode 100644 index 0000000..bc45f86 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornez.py @@ -0,0 +1,60 @@ +from .common import InfoExtractor +from ..utils import ( + clean_html, + int_or_none, + get_element_by_class, + urljoin, +) + + +class PornezIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?pornez\.net/(?:video(?P\w+)|watch)/' + _TESTS = [{ + 'url': 'https://pornez.net/video344819/mistresst-funny_penis_names-wmv/', + 'info_dict': { + 'id': '344819', + 'ext': 'mp4', + 'title': 'mistresst funny_penis_names wmv', + 'thumbnail': r're:^https?://.*\.jpg$', + 'age_limit': 18, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://pornez.net/watch/leana+lovings+stiff+for+stepdaughter/', + 'info_dict': { + 'id': '156161', + 'ext': 'mp4', + 'title': 'Watch leana lovings stiff for stepdaughter porn video.', + 'age_limit': 18, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://pornez.net/videovzs27fj/tutor4k-e14-blue-wave-1080p-nbq-tutor4k-e14-blue-wave/', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + if not video_id: + video_id = self._search_regex( + r']+\bhref=["\']https?://pornez.net/\?p=(\w+)["\']', webpage, 'id') + + iframe_src = self._html_search_regex(r']+src="([^"]+)"', webpage, 'iframe') + iframe = self._download_webpage(urljoin('https://pornez.net', iframe_src), video_id) + + entries = self._parse_html5_media_entries(iframe_src, iframe, video_id)[0] + for fmt in entries['formats']: + height = self._search_regex(r'_(\d+)\.m3u8', fmt['url'], 'height') + fmt['format_id'] = '%sp' % height + fmt['height'] = int_or_none(height) + + entries.update({ + 'id': video_id, + 'title': (clean_html(get_element_by_class('video-title', webpage)) + or self._html_search_meta( + ['twitter:title', 'og:title', 'description'], webpage, 'title', default=None)), + 'thumbnail': self._html_search_meta(['thumbnailUrl'], webpage, 'thumb', default=None), + 'age_limit': 18, + }) + return entries diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pornflip.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornflip.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pornflip.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pornflip.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pornhd.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornhd.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pornhd.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pornhd.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pornhub.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornhub.py new file mode 100644 index 0000000..999d038 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornhub.py @@ -0,0 +1,825 @@ +import functools +import itertools +import math +import operator +import re + +from .common import InfoExtractor +from .openload import PhantomJSwrapper +from ..compat import compat_str +from ..networking import Request +from ..networking.exceptions import HTTPError +from ..utils import ( + NO_DEFAULT, + ExtractorError, + clean_html, + determine_ext, + format_field, + int_or_none, + merge_dicts, + orderedSet, + remove_quotes, + remove_start, + str_to_int, + update_url_query, + url_or_none, + urlencode_postdata, +) + + +class PornHubBaseIE(InfoExtractor): + _NETRC_MACHINE = 'pornhub' + _PORNHUB_HOST_RE = r'(?:(?Ppornhub(?:premium)?\.(?:com|net|org))|pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd\.onion)' + + def _download_webpage_handle(self, *args, **kwargs): + def dl(*args, **kwargs): + return super(PornHubBaseIE, self)._download_webpage_handle(*args, **kwargs) + + ret = dl(*args, **kwargs) + + if not ret: + return ret + + webpage, urlh = ret + + if any(re.search(p, webpage) for p in ( + r']+\bonload=["\']go\(\)', + r'document\.cookie\s*=\s*["\']RNKEY=', + r'document\.location\.reload\(true\)')): + url_or_request = args[0] + url = (url_or_request.url + if isinstance(url_or_request, Request) + else url_or_request) + phantom = PhantomJSwrapper(self, required_version='2.0') + phantom.get(url, html=webpage) + webpage, urlh = dl(*args, **kwargs) + + return webpage, urlh + + def _real_initialize(self): + self._logged_in = False + + def _set_age_cookies(self, host): + self._set_cookie(host, 'age_verified', '1') + self._set_cookie(host, 'accessAgeDisclaimerPH', '1') + self._set_cookie(host, 'accessAgeDisclaimerUK', '1') + self._set_cookie(host, 'accessPH', '1') + + def _login(self, host): + if self._logged_in: + return + + site = host.split('.')[0] + + # Both sites pornhub and pornhubpremium have separate accounts + # so there should be an option to provide credentials for both. + # At the same time some videos are available under the same video id + # on both sites so that we have to identify them as the same video. + # For that purpose we have to keep both in the same extractor + # but under different netrc machines. + username, password = self._get_login_info(netrc_machine=site) + if username is None: + return + + login_url = 'https://www.%s/%slogin' % (host, 'premium/' if 'premium' in host else '') + login_page = self._download_webpage( + login_url, None, 'Downloading %s login page' % site) + + def is_logged(webpage): + return any(re.search(p, webpage) for p in ( + r'class=["\']signOut', + r'>Sign\s+[Oo]ut\s*<')) + + if is_logged(login_page): + self._logged_in = True + return + + login_form = self._hidden_inputs(login_page) + + login_form.update({ + 'username': username, + 'password': password, + }) + + response = self._download_json( + 'https://www.%s/front/authenticate' % host, None, + 'Logging in to %s' % site, + data=urlencode_postdata(login_form), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Referer': login_url, + 'X-Requested-With': 'XMLHttpRequest', + }) + + if response.get('success') == '1': + self._logged_in = True + return + + message = response.get('message') + if message is not None: + raise ExtractorError( + 'Unable to login: %s' % message, expected=True) + + raise ExtractorError('Unable to log in') + + +class PornHubIE(PornHubBaseIE): + IE_DESC = 'PornHub and Thumbzilla' + _VALID_URL = r'''(?x) + https?:// + (?: + (?:[^/]+\.)? + %s + /(?:(?:view_video\.php|video/show)\?viewkey=|embed/)| + (?:www\.)?thumbzilla\.com/video/ + ) + (?P[\da-z]+) + ''' % PornHubBaseIE._PORNHUB_HOST_RE + _EMBED_REGEX = [r']+?src=["\'](?P(?:https?:)?//(?:www\.)?pornhub(?:premium)?\.(?:com|net|org)/embed/[\da-z]+)'] + _TESTS = [{ + 'url': 'http://www.pornhub.com/view_video.php?viewkey=648719015', + 'md5': 'a6391306d050e4547f62b3f485dd9ba9', + 'info_dict': { + 'id': '648719015', + 'ext': 'mp4', + 'title': 'Seductive Indian beauty strips down and fingers her pink pussy', + 'uploader': 'Babes', + 'upload_date': '20130628', + 'timestamp': 1372447216, + 'duration': 361, + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 18, + 'tags': list, + 'categories': list, + 'cast': list, + }, + }, { + # non-ASCII title + 'url': 'http://www.pornhub.com/view_video.php?viewkey=1331683002', + 'info_dict': { + 'id': '1331683002', + 'ext': 'mp4', + 'title': 'é‡åº†å©·å©·å¥³çŽ‹è¶³äº¤', + 'upload_date': '20150213', + 'timestamp': 1423804862, + 'duration': 1753, + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 18, + 'tags': list, + 'categories': list, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'Video has been flagged for verification in accordance with our trust and safety policy', + }, { + # subtitles + 'url': 'https://www.pornhub.com/view_video.php?viewkey=ph5af5fef7c2aa7', + 'info_dict': { + 'id': 'ph5af5fef7c2aa7', + 'ext': 'mp4', + 'title': 'BFFS - Cute Teen Girls Share Cock On the Floor', + 'uploader': 'BFFs', + 'duration': 622, + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 18, + 'tags': list, + 'categories': list, + 'subtitles': { + 'en': [{ + "ext": 'srt' + }] + }, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This video has been disabled', + }, { + 'url': 'http://www.pornhub.com/view_video.php?viewkey=ph601dc30bae19a', + 'info_dict': { + 'id': 'ph601dc30bae19a', + 'uploader': 'Projekt Melody', + 'uploader_id': 'projekt-melody', + 'upload_date': '20210205', + 'title': '"Welcome to My Pussy Mansion" - CB Stream (02/03/21)', + 'thumbnail': r're:https?://.+', + }, + }, { + 'url': 'http://www.pornhub.com/view_video.php?viewkey=ph557bbb6676d2d', + 'only_matching': True, + }, { + # removed at the request of cam4.com + 'url': 'http://fr.pornhub.com/view_video.php?viewkey=ph55ca2f9760862', + 'only_matching': True, + }, { + # removed at the request of the copyright owner + 'url': 'http://www.pornhub.com/view_video.php?viewkey=788152859', + 'only_matching': True, + }, { + # removed by uploader + 'url': 'http://www.pornhub.com/view_video.php?viewkey=ph572716d15a111', + 'only_matching': True, + }, { + # private video + 'url': 'http://www.pornhub.com/view_video.php?viewkey=ph56fd731fce6b7', + 'only_matching': True, + }, { + 'url': 'https://www.thumbzilla.com/video/ph56c6114abd99a/horny-girlfriend-sex', + 'only_matching': True, + }, { + 'url': 'http://www.pornhub.com/video/show?viewkey=648719015', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.net/view_video.php?viewkey=203640933', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.org/view_video.php?viewkey=203640933', + 'only_matching': True, + }, { + 'url': 'https://www.pornhubpremium.com/view_video.php?viewkey=ph5e4acdae54a82', + 'only_matching': True, + }, { + # Some videos are available with the same id on both premium + # and non-premium sites (e.g. this and the following test) + 'url': 'https://www.pornhub.com/view_video.php?viewkey=ph5f75b0f4b18e3', + 'only_matching': True, + }, { + 'url': 'https://www.pornhubpremium.com/view_video.php?viewkey=ph5f75b0f4b18e3', + 'only_matching': True, + }, { + # geo restricted + 'url': 'https://www.pornhub.com/view_video.php?viewkey=ph5a9813bfa7156', + 'only_matching': True, + }, { + 'url': 'http://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/view_video.php?viewkey=ph5a9813bfa7156', + 'only_matching': True, + }] + + def _extract_count(self, pattern, webpage, name): + return str_to_int(self._search_regex(pattern, webpage, '%s count' % name, default=None)) + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + host = mobj.group('host') or 'pornhub.com' + video_id = mobj.group('id') + + self._login(host) + self._set_age_cookies(host) + + def dl_webpage(platform): + self._set_cookie(host, 'platform', platform) + return self._download_webpage( + 'https://www.%s/view_video.php?viewkey=%s' % (host, video_id), + video_id, 'Downloading %s webpage' % platform) + + webpage = dl_webpage('pc') + + error_msg = self._html_search_regex( + (r'(?s)]+class=(["\'])(?:(?!\1).)*\b(?:removed|userMessageSection)\b(?:(?!\1).)*\1[^>]*>(?P.+?)', + r'(?s)]+class=["\']noVideo["\'][^>]*>(?P.+?)'), + webpage, 'error message', default=None, group='error') + if error_msg: + error_msg = re.sub(r'\s+', ' ', error_msg) + raise ExtractorError( + 'PornHub said: %s' % error_msg, + expected=True, video_id=video_id) + + if any(re.search(p, webpage) for p in ( + r'class=["\']geoBlocked["\']', + r'>\s*This content is unavailable in your country')): + self.raise_geo_restricted() + + # video_title from flashvars contains whitespace instead of non-ASCII (see + # http://www.pornhub.com/view_video.php?viewkey=1331683002), not relying + # on that anymore. + title = self._html_search_meta( + 'twitter:title', webpage, default=None) or self._html_search_regex( + (r'(?s)]+class=["\']title["\'][^>]*>(?P.+?)</h1>', + r'<div[^>]+data-video-title=(["\'])(?P<title>(?:(?!\1).)+)\1', + r'shareTitle["\']\s*[=:]\s*(["\'])(?P<title>(?:(?!\1).)+)\1'), + webpage, 'title', group='title') + + video_urls = [] + video_urls_set = set() + subtitles = {} + + flashvars = self._parse_json( + self._search_regex( + r'var\s+flashvars_\d+\s*=\s*({.+?});', webpage, 'flashvars', default='{}'), + video_id) + if flashvars: + subtitle_url = url_or_none(flashvars.get('closedCaptionsFile')) + if subtitle_url: + subtitles.setdefault('en', []).append({ + 'url': subtitle_url, + 'ext': 'srt', + }) + thumbnail = flashvars.get('image_url') + duration = int_or_none(flashvars.get('video_duration')) + media_definitions = flashvars.get('mediaDefinitions') + if isinstance(media_definitions, list): + for definition in media_definitions: + if not isinstance(definition, dict): + continue + video_url = definition.get('videoUrl') + if not video_url or not isinstance(video_url, compat_str): + continue + if video_url in video_urls_set: + continue + video_urls_set.add(video_url) + video_urls.append( + (video_url, int_or_none(definition.get('quality')))) + else: + thumbnail, duration = [None] * 2 + + def extract_js_vars(webpage, pattern, default=NO_DEFAULT): + assignments = self._search_regex( + pattern, webpage, 'encoded url', default=default) + if not assignments: + return {} + + assignments = assignments.split(';') + + js_vars = {} + + def parse_js_value(inp): + inp = re.sub(r'/\*(?:(?!\*/).)*?\*/', '', inp) + if '+' in inp: + inps = inp.split('+') + return functools.reduce( + operator.concat, map(parse_js_value, inps)) + inp = inp.strip() + if inp in js_vars: + return js_vars[inp] + return remove_quotes(inp) + + for assn in assignments: + assn = assn.strip() + if not assn: + continue + assn = re.sub(r'var\s+', '', assn) + vname, value = assn.split('=', 1) + js_vars[vname] = parse_js_value(value) + return js_vars + + def add_video_url(video_url): + v_url = url_or_none(video_url) + if not v_url: + return + if v_url in video_urls_set: + return + video_urls.append((v_url, None)) + video_urls_set.add(v_url) + + def parse_quality_items(quality_items): + q_items = self._parse_json(quality_items, video_id, fatal=False) + if not isinstance(q_items, list): + return + for item in q_items: + if isinstance(item, dict): + add_video_url(item.get('url')) + + if not video_urls: + FORMAT_PREFIXES = ('media', 'quality', 'qualityItems') + js_vars = extract_js_vars( + webpage, r'(var\s+(?:%s)_.+)' % '|'.join(FORMAT_PREFIXES), + default=None) + if js_vars: + for key, format_url in js_vars.items(): + if key.startswith(FORMAT_PREFIXES[-1]): + parse_quality_items(format_url) + elif any(key.startswith(p) for p in FORMAT_PREFIXES[:2]): + add_video_url(format_url) + if not video_urls and re.search( + r'<[^>]+\bid=["\']lockedPlayer', webpage): + raise ExtractorError( + 'Video %s is locked' % video_id, expected=True) + + if not video_urls: + js_vars = extract_js_vars( + dl_webpage('tv'), r'(var.+?mediastring.+?)</script>') + add_video_url(js_vars['mediastring']) + + for mobj in re.finditer( + r'<a[^>]+\bclass=["\']downloadBtn\b[^>]+\bhref=(["\'])(?P<url>(?:(?!\1).)+)\1', + webpage): + video_url = mobj.group('url') + if video_url not in video_urls_set: + video_urls.append((video_url, None)) + video_urls_set.add(video_url) + + upload_date = None + formats = [] + + def add_format(format_url, height=None): + ext = determine_ext(format_url) + if ext == 'mpd': + formats.extend(self._extract_mpd_formats( + format_url, video_id, mpd_id='dash', fatal=False)) + return + if ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + return + if not height: + height = int_or_none(self._search_regex( + r'(?P<height>\d+)[pP]?_\d+[kK]', format_url, 'height', + default=None)) + formats.append({ + 'url': format_url, + 'format_id': format_field(height, None, '%dp'), + 'height': height, + }) + + for video_url, height in video_urls: + if not upload_date: + upload_date = self._search_regex( + r'/(\d{6}/\d{2})/', video_url, 'upload data', default=None) + if upload_date: + upload_date = upload_date.replace('/', '') + if '/video/get_media' in video_url: + medias = self._download_json(video_url, video_id, fatal=False) + if isinstance(medias, list): + for media in medias: + if not isinstance(media, dict): + continue + video_url = url_or_none(media.get('videoUrl')) + if not video_url: + continue + height = int_or_none(media.get('quality')) + add_format(video_url, height) + continue + add_format(video_url) + + model_profile = self._search_json( + r'var\s+MODEL_PROFILE\s*=', webpage, 'model profile', video_id, fatal=False) + video_uploader = self._html_search_regex( + r'(?s)From: .+?<(?:a\b[^>]+\bhref=["\']/(?:(?:user|channel)s|model|pornstar)/|span\b[^>]+\bclass=["\']username)[^>]+>(.+?)<', + webpage, 'uploader', default=None) or model_profile.get('username') + + def extract_vote_count(kind, name): + return self._extract_count( + (r'<span[^>]+\bclass="votes%s"[^>]*>([\d,\.]+)</span>' % kind, + r'<span[^>]+\bclass=["\']votes%s["\'][^>]*\bdata-rating=["\'](\d+)' % kind), + webpage, name) + + view_count = self._extract_count( + r'<span class="count">([\d,\.]+)</span> [Vv]iews', webpage, 'view') + like_count = extract_vote_count('Up', 'like') + dislike_count = extract_vote_count('Down', 'dislike') + comment_count = self._extract_count( + r'All Comments\s*<span>\(([\d,.]+)\)', webpage, 'comment') + + def extract_list(meta_key): + div = self._search_regex( + r'(?s)<div[^>]+\bclass=["\'].*?\b%sWrapper[^>]*>(.+?)</div>' + % meta_key, webpage, meta_key, default=None) + if div: + return [clean_html(x).strip() for x in re.findall(r'(?s)<a[^>]+\bhref=[^>]+>.+?</a>', div)] + + info = self._search_json_ld(webpage, video_id, default={}) + # description provided in JSON-LD is irrelevant + info['description'] = None + + return merge_dicts({ + 'id': video_id, + 'uploader': video_uploader, + 'uploader_id': remove_start(model_profile.get('modelProfileLink'), '/model/'), + 'upload_date': upload_date, + 'title': title, + 'thumbnail': thumbnail, + 'duration': duration, + 'view_count': view_count, + 'like_count': like_count, + 'dislike_count': dislike_count, + 'comment_count': comment_count, + 'formats': formats, + 'age_limit': 18, + 'tags': extract_list('tags'), + 'categories': extract_list('categories'), + 'cast': extract_list('pornstars'), + 'subtitles': subtitles, + }, info) + + +class PornHubPlaylistBaseIE(PornHubBaseIE): + def _extract_page(self, url): + return int_or_none(self._search_regex( + r'\bpage=(\d+)', url, 'page', default=None)) + + def _extract_entries(self, webpage, host): + # Only process container div with main playlist content skipping + # drop-down menu that uses similar pattern for videos (see + # https://github.com/ytdl-org/youtube-dl/issues/11594). + container = self._search_regex( + r'(?s)(<div[^>]+class=["\']container.+)', webpage, + 'container', default=webpage) + + return [ + self.url_result( + 'http://www.%s/%s' % (host, video_url), + PornHubIE.ie_key(), video_title=title) + for video_url, title in orderedSet(re.findall( + r'href="/?(view_video\.php\?.*\bviewkey=[\da-z]+[^"]*)"[^>]*\s+title="([^"]+)"', + container)) + ] + + +class PornHubUserIE(PornHubPlaylistBaseIE): + _VALID_URL = r'(?P<url>https?://(?:[^/]+\.)?%s/(?:(?:user|channel)s|model|pornstar)/(?P<id>[^/?#&]+))(?:[?#&]|/(?!videos)|$)' % PornHubBaseIE._PORNHUB_HOST_RE + _TESTS = [{ + 'url': 'https://www.pornhub.com/model/zoe_ph', + 'playlist_mincount': 118, + }, { + 'url': 'https://www.pornhub.com/pornstar/liz-vicious', + 'info_dict': { + 'id': 'liz-vicious', + }, + 'playlist_mincount': 118, + }, { + 'url': 'https://www.pornhub.com/users/russianveet69', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/channels/povd', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/model/zoe_ph?abc=1', + 'only_matching': True, + }, { + # Unavailable via /videos page, but available with direct pagination + # on pornstar page (see [1]), requires premium + # 1. https://github.com/ytdl-org/youtube-dl/issues/27853 + 'url': 'https://www.pornhubpremium.com/pornstar/sienna-west', + 'only_matching': True, + }, { + # Same as before, multi page + 'url': 'https://www.pornhubpremium.com/pornstar/lily-labeau', + 'only_matching': True, + }, { + 'url': 'https://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/model/zoe_ph', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + user_id = mobj.group('id') + videos_url = '%s/videos' % mobj.group('url') + self._set_age_cookies(mobj.group('host')) + page = self._extract_page(url) + if page: + videos_url = update_url_query(videos_url, {'page': page}) + return self.url_result( + videos_url, ie=PornHubPagedVideoListIE.ie_key(), video_id=user_id) + + +class PornHubPagedPlaylistBaseIE(PornHubPlaylistBaseIE): + @staticmethod + def _has_more(webpage): + return re.search( + r'''(?x) + <li[^>]+\bclass=["\']page_next| + <link[^>]+\brel=["\']next| + <button[^>]+\bid=["\']moreDataBtn + ''', webpage) is not None + + def _entries(self, url, host, item_id): + page = self._extract_page(url) + + VIDEOS = '/videos' + + def download_page(base_url, num, fallback=False): + note = 'Downloading page %d%s' % (num, ' (switch to fallback)' if fallback else '') + return self._download_webpage( + base_url, item_id, note, query={'page': num}) + + def is_404(e): + return isinstance(e.cause, HTTPError) and e.cause.status == 404 + + base_url = url + has_page = page is not None + first_page = page if has_page else 1 + for page_num in (first_page, ) if has_page else itertools.count(first_page): + try: + try: + webpage = download_page(base_url, page_num) + except ExtractorError as e: + # Some sources may not be available via /videos page, + # trying to fallback to main page pagination (see [1]) + # 1. https://github.com/ytdl-org/youtube-dl/issues/27853 + if is_404(e) and page_num == first_page and VIDEOS in base_url: + base_url = base_url.replace(VIDEOS, '') + webpage = download_page(base_url, page_num, fallback=True) + else: + raise + except ExtractorError as e: + if is_404(e) and page_num != first_page: + break + raise + page_entries = self._extract_entries(webpage, host) + if not page_entries: + break + for e in page_entries: + yield e + if not self._has_more(webpage): + break + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + host = mobj.group('host') + item_id = mobj.group('id') + + self._login(host) + self._set_age_cookies(host) + + return self.playlist_result(self._entries(url, host, item_id), item_id) + + +class PornHubPagedVideoListIE(PornHubPagedPlaylistBaseIE): + _VALID_URL = r'https?://(?:[^/]+\.)?%s/(?!playlist/)(?P<id>(?:[^/]+/)*[^/?#&]+)' % PornHubBaseIE._PORNHUB_HOST_RE + _TESTS = [{ + 'url': 'https://www.pornhub.com/model/zoe_ph/videos', + 'only_matching': True, + }, { + 'url': 'http://www.pornhub.com/users/rushandlia/videos', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/pornstar/jenny-blighe/videos', + 'info_dict': { + 'id': 'pornstar/jenny-blighe/videos', + }, + 'playlist_mincount': 149, + }, { + 'url': 'https://www.pornhub.com/pornstar/jenny-blighe/videos?page=3', + 'info_dict': { + 'id': 'pornstar/jenny-blighe/videos', + }, + 'playlist_mincount': 40, + }, { + # default sorting as Top Rated Videos + 'url': 'https://www.pornhub.com/channels/povd/videos', + 'info_dict': { + 'id': 'channels/povd/videos', + }, + 'playlist_mincount': 293, + }, { + # Top Rated Videos + 'url': 'https://www.pornhub.com/channels/povd/videos?o=ra', + 'only_matching': True, + }, { + # Most Recent Videos + 'url': 'https://www.pornhub.com/channels/povd/videos?o=da', + 'only_matching': True, + }, { + # Most Viewed Videos + 'url': 'https://www.pornhub.com/channels/povd/videos?o=vi', + 'only_matching': True, + }, { + 'url': 'http://www.pornhub.com/users/zoe_ph/videos/public', + 'only_matching': True, + }, { + # Most Viewed Videos + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos?o=mv', + 'only_matching': True, + }, { + # Top Rated Videos + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos?o=tr', + 'only_matching': True, + }, { + # Longest Videos + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos?o=lg', + 'only_matching': True, + }, { + # Newest Videos + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos?o=cm', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos/paid', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/pornstar/liz-vicious/videos/fanonly', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/video', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/video?page=3', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/video/search?search=123', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/categories/teen', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/categories/teen?page=3', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/hd', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/hd?page=3', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/described-video', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/described-video?page=2', + 'only_matching': True, + }, { + 'url': 'https://www.pornhub.com/video/incategories/60fps-1/hd-porn', + 'only_matching': True, + }, { + 'url': 'https://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/model/zoe_ph/videos', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return (False + if PornHubIE.suitable(url) or PornHubUserIE.suitable(url) or PornHubUserVideosUploadIE.suitable(url) + else super(PornHubPagedVideoListIE, cls).suitable(url)) + + +class PornHubUserVideosUploadIE(PornHubPagedPlaylistBaseIE): + _VALID_URL = r'(?P<url>https?://(?:[^/]+\.)?%s/(?:(?:user|channel)s|model|pornstar)/(?P<id>[^/]+)/videos/upload)' % PornHubBaseIE._PORNHUB_HOST_RE + _TESTS = [{ + 'url': 'https://www.pornhub.com/pornstar/jenny-blighe/videos/upload', + 'info_dict': { + 'id': 'jenny-blighe', + }, + 'playlist_mincount': 129, + }, { + 'url': 'https://www.pornhub.com/model/zoe_ph/videos/upload', + 'only_matching': True, + }, { + 'url': 'http://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/pornstar/jenny-blighe/videos/upload', + 'only_matching': True, + }] + + +class PornHubPlaylistIE(PornHubPlaylistBaseIE): + _VALID_URL = r'(?P<url>https?://(?:[^/]+\.)?%s/playlist/(?P<id>[^/?#&]+))' % PornHubBaseIE._PORNHUB_HOST_RE + _TESTS = [{ + 'url': 'https://www.pornhub.com/playlist/44121572', + 'info_dict': { + 'id': '44121572', + }, + 'playlist_count': 77, + }, { + 'url': 'https://www.pornhub.com/playlist/4667351', + 'only_matching': True, + }, { + 'url': 'https://de.pornhub.com/playlist/4667351', + 'only_matching': True, + }, { + 'url': 'https://de.pornhub.com/playlist/4667351?page=2', + 'only_matching': True, + }] + + def _entries(self, url, host, item_id): + webpage = self._download_webpage(url, item_id, 'Downloading page 1') + playlist_id = self._search_regex(r'var\s+playlistId\s*=\s*"([^"]+)"', webpage, 'playlist_id') + video_count = int_or_none( + self._search_regex(r'var\s+itemsCount\s*=\s*([0-9]+)\s*\|\|', webpage, 'video_count')) + token = self._search_regex(r'var\s+token\s*=\s*"([^"]+)"', webpage, 'token') + page_count = math.ceil((video_count - 36) / 40.) + 1 + page_entries = self._extract_entries(webpage, host) + + def download_page(page_num): + note = 'Downloading page {}'.format(page_num) + page_url = 'https://www.{}/playlist/viewChunked'.format(host) + return self._download_webpage(page_url, item_id, note, query={ + 'id': playlist_id, + 'page': page_num, + 'token': token, + }) + + for page_num in range(1, page_count + 1): + if page_num > 1: + webpage = download_page(page_num) + page_entries = self._extract_entries(webpage, host) + if not page_entries: + break + for e in page_entries: + yield e + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + host = mobj.group('host') + item_id = mobj.group('id') + + self._login(host) + self._set_age_cookies(host) + + return self.playlist_result(self._entries(mobj.group('url'), host, item_id), item_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pornotube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornotube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pornotube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pornotube.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pornovoisines.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornovoisines.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pornovoisines.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pornovoisines.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pornoxo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pornoxo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pornoxo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pornoxo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/pr0gramm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pr0gramm.py new file mode 100644 index 0000000..c8e0bb4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/pr0gramm.py @@ -0,0 +1,155 @@ +import json +from datetime import date +from urllib.parse import unquote + +from .common import InfoExtractor +from ..compat import functools +from ..utils import ExtractorError, make_archive_id, urljoin +from ..utils.traversal import traverse_obj + + +class Pr0grammIE(InfoExtractor): + _VALID_URL = r'https?://pr0gramm\.com\/(?:[^/?#]+/)+(?P<id>[\d]+)(?:[/?#:]|$)' + _TESTS = [{ + # Tags require account + 'url': 'https://pr0gramm.com/new/video/5466437', + 'info_dict': { + 'id': '5466437', + 'ext': 'mp4', + 'title': 'pr0gramm-5466437 by g11st', + 'tags': ['Neon Genesis Evangelion', 'Touhou Project', 'Fly me to the Moon', 'Marisad', 'Marisa Kirisame', 'video', 'sound', 'Marisa', 'Anime'], + 'uploader': 'g11st', + 'uploader_id': 394718, + 'upload_timestamp': 1671590240, + 'upload_date': '20221221', + 'like_count': int, + 'dislike_count': int, + 'age_limit': 0, + 'thumbnail': r're:^https://thumb\.pr0gramm\.com/.*\.jpg', + }, + }, { + # Tags require account + 'url': 'https://pr0gramm.com/new/3052805:comment28391322', + 'info_dict': { + 'id': '3052805', + 'ext': 'mp4', + 'title': 'pr0gramm-3052805 by Hansking1', + 'tags': 'count:15', + 'uploader': 'Hansking1', + 'uploader_id': 385563, + 'upload_timestamp': 1552930408, + 'upload_date': '20190318', + 'like_count': int, + 'dislike_count': int, + 'age_limit': 0, + 'thumbnail': r're:^https://thumb\.pr0gramm\.com/.*\.jpg', + }, + }, { + # Requires verified account + 'url': 'https://pr0gramm.com/new/Gianna%20Michaels/5848332', + 'info_dict': { + 'id': '5848332', + 'ext': 'mp4', + 'title': 'pr0gramm-5848332 by erd0pfel', + 'tags': 'count:18', + 'uploader': 'erd0pfel', + 'uploader_id': 349094, + 'upload_timestamp': 1694489652, + 'upload_date': '20230912', + 'like_count': int, + 'dislike_count': int, + 'age_limit': 18, + 'thumbnail': r're:^https://thumb\.pr0gramm\.com/.*\.jpg', + }, + }, { + 'url': 'https://pr0gramm.com/static/5466437', + 'only_matching': True, + }, { + 'url': 'https://pr0gramm.com/new/rowan%20atkinson%20herr%20bohne/3052805', + 'only_matching': True, + }, { + 'url': 'https://pr0gramm.com/user/froschler/dafur-ist-man-hier/5091290', + 'only_matching': True, + }] + + BASE_URL = 'https://pr0gramm.com' + + @functools.cached_property + def _is_logged_in(self): + return 'pp' in self._get_cookies(self.BASE_URL) + + @functools.cached_property + def _maximum_flags(self): + # We need to guess the flags for the content otherwise the api will raise an error + # We can guess the maximum allowed flags for the account from the cookies + # Bitflags are (msbf): nsfp, nsfl, nsfw, sfw + flags = 0b0001 + if self._is_logged_in: + flags |= 0b1000 + cookies = self._get_cookies(self.BASE_URL) + if 'me' not in cookies: + self._download_webpage(self.BASE_URL, None, 'Refreshing verification information') + if traverse_obj(cookies, ('me', {lambda x: x.value}, {unquote}, {json.loads}, 'verified')): + flags |= 0b0110 + + return flags + + def _call_api(self, endpoint, video_id, query={}, note='Downloading API json'): + data = self._download_json( + f'https://pr0gramm.com/api/items/{endpoint}', + video_id, note, query=query, expected_status=403) + + error = traverse_obj(data, ('error', {str})) + if error in ('nsfwRequired', 'nsflRequired', 'nsfpRequired', 'verificationRequired'): + if not self._is_logged_in: + self.raise_login_required() + raise ExtractorError(f'Unverified account cannot access NSFW/NSFL ({error})', expected=True) + elif error: + message = traverse_obj(data, ('msg', {str})) or error + raise ExtractorError(f'API returned error: {message}', expected=True) + + return data + + def _real_extract(self, url): + video_id = self._match_id(url) + video_info = traverse_obj( + self._call_api('get', video_id, {'id': video_id, 'flags': self._maximum_flags}), + ('items', 0, {dict})) + + source = urljoin('https://img.pr0gramm.com', video_info.get('image')) + if not source or not source.endswith('mp4'): + self.raise_no_formats('Could not extract a video', expected=bool(source), video_id=video_id) + + tags = None + if self._is_logged_in: + metadata = self._call_api('info', video_id, {'itemId': video_id}) + tags = traverse_obj(metadata, ('tags', ..., 'tag', {str})) + # Sorted by "confidence", higher confidence = earlier in list + confidences = traverse_obj(metadata, ('tags', ..., 'confidence', ({int}, {float}))) + if confidences: + tags = [tag for _, tag in sorted(zip(confidences, tags), reverse=True)] + + return { + 'id': video_id, + 'title': f'pr0gramm-{video_id} by {video_info.get("user")}', + 'formats': [{ + 'url': source, + 'ext': 'mp4', + **traverse_obj(video_info, { + 'width': ('width', {int}), + 'height': ('height', {int}), + }), + }], + 'tags': tags, + 'age_limit': 18 if traverse_obj(video_info, ('flags', {0b110.__and__})) else 0, + '_old_archive_ids': [make_archive_id('Pr0grammStatic', video_id)], + **traverse_obj(video_info, { + 'uploader': ('user', {str}), + 'uploader_id': ('userId', {int}), + 'like_count': ('up', {int}), + 'dislike_count': ('down', {int}), + 'upload_timestamp': ('created', {int}), + 'upload_date': ('created', {int}, {date.fromtimestamp}, {lambda x: x.strftime('%Y%m%d')}), + 'thumbnail': ('thumb', {lambda x: urljoin('https://thumb.pr0gramm.com', x)}) + }), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/prankcast.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/prankcast.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/prankcast.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/prankcast.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/premiershiprugby.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/premiershiprugby.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/premiershiprugby.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/premiershiprugby.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/presstv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/presstv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/presstv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/presstv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/projectveritas.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/projectveritas.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/projectveritas.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/projectveritas.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/prosiebensat1.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/prosiebensat1.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/prosiebensat1.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/prosiebensat1.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/prx.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/prx.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/prx.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/prx.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/puhutv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/puhutv.py new file mode 100644 index 0000000..4b8e5e9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/puhutv.py @@ -0,0 +1,233 @@ +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + float_or_none, + parse_resolution, + str_or_none, + try_get, + unified_timestamp, + url_or_none, + urljoin, +) + + +class PuhuTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?puhutv\.com/(?P<id>[^/?#&]+)-izle' + IE_NAME = 'puhutv' + _TESTS = [{ + # film + 'url': 'https://puhutv.com/sut-kardesler-izle', + 'md5': 'a347470371d56e1585d1b2c8dab01c96', + 'info_dict': { + 'id': '5085', + 'display_id': 'sut-kardesler', + 'ext': 'mp4', + 'title': 'Süt KardeÅŸler', + 'description': 'md5:ca09da25b7e57cbb5a9280d6e48d17aa', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 4832.44, + 'creator': 'Arzu Film', + 'timestamp': 1561062602, + 'upload_date': '20190620', + 'release_year': 1976, + 'view_count': int, + 'tags': list, + }, + }, { + # episode, geo restricted, bypassable with --geo-verification-proxy + 'url': 'https://puhutv.com/jet-sosyete-1-bolum-izle', + 'only_matching': True, + }, { + # 4k, with subtitles + 'url': 'https://puhutv.com/dip-1-bolum-izle', + 'only_matching': True, + }] + _SUBTITLE_LANGS = { + 'English': 'en', + 'Deutsch': 'de', + 'عربى': 'ar' + } + + def _real_extract(self, url): + display_id = self._match_id(url) + + info = self._download_json( + urljoin(url, '/api/slug/%s-izle' % display_id), + display_id)['data'] + + video_id = compat_str(info['id']) + show = info.get('title') or {} + title = info.get('name') or show['name'] + if info.get('display_name'): + title = '%s %s' % (title, info['display_name']) + + try: + videos = self._download_json( + 'https://puhutv.com/api/assets/%s/videos' % video_id, + display_id, 'Downloading video JSON', + headers=self.geo_verification_headers()) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + self.raise_geo_restricted() + raise + + urls = [] + formats = [] + + for video in videos['data']['videos']: + media_url = url_or_none(video.get('url')) + if not media_url or media_url in urls: + continue + urls.append(media_url) + + playlist = video.get('is_playlist') + if (video.get('stream_type') == 'hls' and playlist is True) or 'playlist.m3u8' in media_url: + formats.extend(self._extract_m3u8_formats( + media_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + continue + + quality = int_or_none(video.get('quality')) + f = { + 'url': media_url, + 'ext': 'mp4', + 'height': quality + } + video_format = video.get('video_format') + is_hls = (video_format == 'hls' or '/hls/' in media_url or '/chunklist.m3u8' in media_url) and playlist is False + if is_hls: + format_id = 'hls' + f['protocol'] = 'm3u8_native' + elif video_format == 'mp4': + format_id = 'http' + else: + continue + if quality: + format_id += '-%sp' % quality + f['format_id'] = format_id + formats.append(f) + + creator = try_get( + show, lambda x: x['producer']['name'], compat_str) + + content = info.get('content') or {} + + images = try_get( + content, lambda x: x['images']['wide'], dict) or {} + thumbnails = [] + for image_id, image_url in images.items(): + if not isinstance(image_url, compat_str): + continue + if not image_url.startswith(('http', '//')): + image_url = 'https://%s' % image_url + t = parse_resolution(image_id) + t.update({ + 'id': image_id, + 'url': image_url + }) + thumbnails.append(t) + + tags = [] + for genre in show.get('genres') or []: + if not isinstance(genre, dict): + continue + genre_name = genre.get('name') + if genre_name and isinstance(genre_name, compat_str): + tags.append(genre_name) + + subtitles = {} + for subtitle in content.get('subtitles') or []: + if not isinstance(subtitle, dict): + continue + lang = subtitle.get('language') + sub_url = url_or_none(subtitle.get('url') or subtitle.get('file')) + if not lang or not isinstance(lang, compat_str) or not sub_url: + continue + subtitles[self._SUBTITLE_LANGS.get(lang, lang)] = [{ + 'url': sub_url + }] + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': info.get('description') or show.get('description'), + 'season_id': str_or_none(info.get('season_id')), + 'season_number': int_or_none(info.get('season_number')), + 'episode_number': int_or_none(info.get('episode_number')), + 'release_year': int_or_none(show.get('released_at')), + 'timestamp': unified_timestamp(info.get('created_at')), + 'creator': creator, + 'view_count': int_or_none(content.get('watch_count')), + 'duration': float_or_none(content.get('duration_in_ms'), 1000), + 'tags': tags, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'formats': formats + } + + +class PuhuTVSerieIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?puhutv\.com/(?P<id>[^/?#&]+)-detay' + IE_NAME = 'puhutv:serie' + _TESTS = [{ + 'url': 'https://puhutv.com/deniz-yildizi-detay', + 'info_dict': { + 'title': 'Deniz Yıldızı', + 'id': 'deniz-yildizi', + }, + 'playlist_mincount': 205, + }, { + # a film detail page which is using same url with serie page + 'url': 'https://puhutv.com/kaybedenler-kulubu-detay', + 'only_matching': True, + }] + + def _extract_entries(self, seasons): + for season in seasons: + season_id = season.get('id') + if not season_id: + continue + page = 1 + has_more = True + while has_more is True: + season = self._download_json( + 'https://galadriel.puhutv.com/seasons/%s' % season_id, + season_id, 'Downloading page %s' % page, query={ + 'page': page, + 'per': 40, + }) + episodes = season.get('episodes') + if isinstance(episodes, list): + for ep in episodes: + slug_path = str_or_none(ep.get('slugPath')) + if not slug_path: + continue + video_id = str_or_none(int_or_none(ep.get('id'))) + yield self.url_result( + 'https://puhutv.com/%s' % slug_path, + ie=PuhuTVIE.ie_key(), video_id=video_id, + video_title=ep.get('name') or ep.get('eventLabel')) + page += 1 + has_more = season.get('hasMore') + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + info = self._download_json( + urljoin(url, '/api/slug/%s-detay' % playlist_id), + playlist_id)['data'] + + seasons = info.get('seasons') + if seasons: + return self.playlist_result( + self._extract_entries(seasons), playlist_id, info.get('name')) + + # For films, these are using same url with series + video_id = info.get('slug') or info['assets'][0]['slug'] + return self.url_result( + 'https://puhutv.com/%s-izle' % video_id, + PuhuTVIE.ie_key(), video_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/puls4.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/puls4.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/puls4.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/puls4.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/pyvideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/pyvideo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/pyvideo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/pyvideo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/qdance.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/qdance.py new file mode 100644 index 0000000..d817677 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/qdance.py @@ -0,0 +1,150 @@ +import json +import time + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + jwt_decode_hs256, + str_or_none, + traverse_obj, + try_call, + url_or_none, +) + + +class QDanceIE(InfoExtractor): + _NETRC_MACHINE = 'qdance' + _VALID_URL = r'https?://(?:www\.)?q-dance\.com/network/(?:library|live)/(?P<id>\d+)' + _TESTS = [{ + 'note': 'vod', + 'url': 'https://www.q-dance.com/network/library/146542138', + 'info_dict': { + 'id': '146542138', + 'ext': 'mp4', + 'title': 'Sound Rush [LIVE] | Defqon.1 Weekend Festival 2022 | Friday | RED', + 'display_id': 'sound-rush-live-v3-defqon-1-weekend-festival-2022-friday-red', + 'description': 'Relive Defqon.1 - Primal Energy 2022 with the sounds of Sound Rush LIVE at the RED on Friday! 🔥', + 'season': 'Defqon.1 Weekend Festival 2022', + 'season_id': '31840632', + 'series': 'Defqon.1', + 'series_id': '31840378', + 'thumbnail': 'https://images.q-dance.network/1674829540-20220624171509-220624171509_delio_dn201093-2.jpg', + 'availability': 'premium_only', + 'duration': 1829, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'note': 'livestream', + 'url': 'https://www.q-dance.com/network/live/149170353', + 'info_dict': { + 'id': '149170353', + 'ext': 'mp4', + 'title': r're:^Defqon\.1 2023 - Friday - RED', + 'display_id': 'defqon-1-2023-friday-red', + 'description': 'md5:3c73fbbd4044e578e696adfc64019163', + 'season': 'Defqon.1 Weekend Festival 2023', + 'season_id': '141735599', + 'series': 'Defqon.1', + 'series_id': '31840378', + 'thumbnail': 'https://images.q-dance.network/1686849069-area-thumbs_red.png', + 'availability': 'subscriber_only', + 'live_status': 'is_live', + 'channel_id': 'qdancenetwork.video_149170353', + }, + 'skip': 'Completed livestream', + }] + + _access_token = None + _refresh_token = None + + def _call_login_api(self, data, note='Logging in'): + login = self._download_json( + 'https://members.id-t.com/api/auth/login', None, note, headers={ + 'content-type': 'application/json', + 'brand': 'qdance', + 'origin': 'https://www.q-dance.com', + 'referer': 'https://www.q-dance.com/', + }, data=json.dumps(data, separators=(',', ':')).encode(), + expected_status=lambda x: True) + + tokens = traverse_obj(login, ('data', { + '_id-t-accounts-token': ('accessToken', {str}), + '_id-t-accounts-refresh': ('refreshToken', {str}), + '_id-t-accounts-id-token': ('idToken', {str}), + })) + + if not tokens.get('_id-t-accounts-token'): + error = ': '.join(traverse_obj(login, ('error', ('code', 'message'), {str}))) + if 'validation_error' not in error: + raise ExtractorError(f'Q-Dance API said "{error}"') + msg = 'Invalid username or password' if 'email' in data else 'Refresh token has expired' + raise ExtractorError(msg, expected=True) + + for name, value in tokens.items(): + self._set_cookie('.q-dance.com', name, value) + + def _perform_login(self, username, password): + self._call_login_api({'email': username, 'password': password}) + + def _real_initialize(self): + cookies = self._get_cookies('https://www.q-dance.com/') + self._refresh_token = try_call(lambda: cookies['_id-t-accounts-refresh'].value) + self._access_token = try_call(lambda: cookies['_id-t-accounts-token'].value) + if not self._access_token: + self.raise_login_required() + + def _get_auth(self): + if (try_call(lambda: jwt_decode_hs256(self._access_token)['exp']) or 0) <= int(time.time() - 120): + if not self._refresh_token: + raise ExtractorError( + 'Cannot refresh access token, login with yt-dlp or refresh cookies in browser') + self._call_login_api({'refreshToken': self._refresh_token}, note='Refreshing access token') + self._real_initialize() + + return {'Authorization': self._access_token} + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + data = self._search_nuxt_data(webpage, video_id, traverse=('data', 0, 'data')) + + def extract_availability(level): + level = int_or_none(level) or 0 + return self._availability( + needs_premium=(level >= 20), needs_subscription=(level >= 15), needs_auth=True) + + info = traverse_obj(data, { + 'title': ('title', {str.strip}), + 'description': ('description', {str.strip}), + 'display_id': ('slug', {str}), + 'thumbnail': ('thumbnail', {url_or_none}), + 'duration': ('durationInSeconds', {int_or_none}, {lambda x: x or None}), + 'availability': ('subscription', 'level', {extract_availability}), + 'is_live': ('type', {lambda x: x.lower() == 'live'}), + 'artist': ('acts', ..., {str}), + 'series': ('event', 'title', {str.strip}), + 'series_id': ('event', 'id', {str_or_none}), + 'season': ('eventEdition', 'title', {str.strip}), + 'season_id': ('eventEdition', 'id', {str_or_none}), + 'channel_id': ('pubnub', 'channelName', {str}), + }) + + stream = self._download_json( + f'https://dc9h6qmsoymbq.cloudfront.net/api/content/videos/{video_id}/url', + video_id, headers=self._get_auth(), expected_status=401) + + m3u8_url = traverse_obj(stream, ('data', 'url', {url_or_none})) + if not m3u8_url and traverse_obj(stream, ('error', 'code')) == 'unauthorized': + raise ExtractorError('Your account does not have access to this content', expected=True) + + formats = self._extract_m3u8_formats( + m3u8_url, video_id, fatal=False, live=True) if m3u8_url else [] + if not formats: + self.raise_no_formats('No active streams found', expected=bool(info.get('is_live'))) + + return { + **info, + 'id': video_id, + 'formats': formats, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/qingting.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/qingting.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/qingting.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/qingting.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/qqmusic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/qqmusic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/qqmusic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/qqmusic.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/r7.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/r7.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/r7.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/r7.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/radiko.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiko.py new file mode 100644 index 0000000..c363d9b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiko.py @@ -0,0 +1,252 @@ +import base64 +import random +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + clean_html, + time_seconds, + try_call, + unified_timestamp, + update_url_query, +) + + +class RadikoBaseIE(InfoExtractor): + _GEO_BYPASS = False + _FULL_KEY = None + _HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED = ( + 'https://c-rpaa.smartstream.ne.jp', + 'https://si-c-radiko.smartstream.ne.jp', + 'https://tf-f-rpaa-radiko.smartstream.ne.jp', + 'https://tf-c-rpaa-radiko.smartstream.ne.jp', + 'https://si-f-radiko.smartstream.ne.jp', + 'https://rpaa.smartstream.ne.jp', + ) + _HOSTS_FOR_TIME_FREE_FFMPEG_SUPPORTED = ( + 'https://rd-wowza-radiko.radiko-cf.com', + 'https://radiko.jp', + 'https://f-radiko.smartstream.ne.jp', + ) + # Following URL forcibly connects not Time Free but Live + _HOSTS_FOR_LIVE = ( + 'https://c-radiko.smartstream.ne.jp', + ) + + def _negotiate_token(self): + _, auth1_handle = self._download_webpage_handle( + 'https://radiko.jp/v2/api/auth1', None, 'Downloading authentication page', + headers={ + 'x-radiko-app': 'pc_html5', + 'x-radiko-app-version': '0.0.1', + 'x-radiko-device': 'pc', + 'x-radiko-user': 'dummy_user', + }) + auth1_header = auth1_handle.headers + + auth_token = auth1_header['X-Radiko-AuthToken'] + kl = int(auth1_header['X-Radiko-KeyLength']) + ko = int(auth1_header['X-Radiko-KeyOffset']) + raw_partial_key = self._extract_full_key()[ko:ko + kl] + partial_key = base64.b64encode(raw_partial_key).decode() + + area_id = self._download_webpage( + 'https://radiko.jp/v2/api/auth2', None, 'Authenticating', + headers={ + 'x-radiko-device': 'pc', + 'x-radiko-user': 'dummy_user', + 'x-radiko-authtoken': auth_token, + 'x-radiko-partialkey': partial_key, + }).split(',')[0] + + if area_id == 'OUT': + self.raise_geo_restricted(countries=['JP']) + + auth_data = (auth_token, area_id) + self.cache.store('radiko', 'auth_data', auth_data) + return auth_data + + def _auth_client(self): + cachedata = self.cache.load('radiko', 'auth_data') + if cachedata is not None: + response = self._download_webpage( + 'https://radiko.jp/v2/api/auth_check', None, 'Checking cached token', expected_status=401, + headers={'X-Radiko-AuthToken': cachedata[0], 'X-Radiko-AreaId': cachedata[1]}) + if response == 'OK': + return cachedata + return self._negotiate_token() + + def _extract_full_key(self): + if self._FULL_KEY: + return self._FULL_KEY + + jscode = self._download_webpage( + 'https://radiko.jp/apps/js/playerCommon.js', None, + note='Downloading player js code') + full_key = self._search_regex( + (r"RadikoJSPlayer\([^,]*,\s*(['\"])pc_html5\1,\s*(['\"])(?P<fullkey>[0-9a-f]+)\2,\s*{"), + jscode, 'full key', fatal=False, group='fullkey') + + if full_key: + full_key = full_key.encode() + else: # use only full key ever known + full_key = b'bcd151073c03b352e1ef2fd66c32209da9ca0afa' + + self._FULL_KEY = full_key + return full_key + + def _find_program(self, video_id, station, cursor): + station_program = self._download_xml( + 'https://radiko.jp/v3/program/station/weekly/%s.xml' % station, video_id, + note='Downloading radio program for %s station' % station) + + prog = None + for p in station_program.findall('.//prog'): + ft_str, to_str = p.attrib['ft'], p.attrib['to'] + ft = unified_timestamp(ft_str, False) + to = unified_timestamp(to_str, False) + if ft <= cursor and cursor < to: + prog = p + break + if not prog: + raise ExtractorError('Cannot identify radio program to download!') + assert ft, to + return prog, station_program, ft, ft_str, to_str + + def _extract_formats(self, video_id, station, is_onair, ft, cursor, auth_token, area_id, query): + m3u8_playlist_data = self._download_xml( + f'https://radiko.jp/v3/station/stream/pc_html5/{station}.xml', video_id, + note='Downloading stream information') + + formats = [] + found = set() + + timefree_int = 0 if is_onair else 1 + + for element in m3u8_playlist_data.findall(f'.//url[@timefree="{timefree_int}"]/playlist_create_url'): + pcu = element.text + if pcu in found: + continue + found.add(pcu) + playlist_url = update_url_query(pcu, { + 'station_id': station, + **query, + 'l': '15', + 'lsid': ''.join(random.choices('0123456789abcdef', k=32)), + 'type': 'b', + }) + + time_to_skip = None if is_onair else cursor - ft + + domain = urllib.parse.urlparse(playlist_url).netloc + subformats = self._extract_m3u8_formats( + playlist_url, video_id, ext='m4a', + live=True, fatal=False, m3u8_id=domain, + note=f'Downloading m3u8 information from {domain}', + headers={ + 'X-Radiko-AreaId': area_id, + 'X-Radiko-AuthToken': auth_token, + }) + for sf in subformats: + if (is_onair ^ pcu.startswith(self._HOSTS_FOR_LIVE)) or ( + not is_onair and pcu.startswith(self._HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED)): + sf['preference'] = -100 + sf['format_note'] = 'not preferred' + if not is_onair and timefree_int == 1 and time_to_skip: + sf['downloader_options'] = {'ffmpeg_args': ['-ss', str(time_to_skip)]} + formats.extend(subformats) + + return formats + + +class RadikoIE(RadikoBaseIE): + _VALID_URL = r'https?://(?:www\.)?radiko\.jp/#!/ts/(?P<station>[A-Z0-9-]+)/(?P<id>\d+)' + + _TESTS = [{ + # QRR (文化放é€) station provides <desc> + 'url': 'https://radiko.jp/#!/ts/QRR/20210425101300', + 'only_matching': True, + }, { + # FMT (TOKYO FM) station does not provide <desc> + 'url': 'https://radiko.jp/#!/ts/FMT/20210810150000', + 'only_matching': True, + }, { + 'url': 'https://radiko.jp/#!/ts/JOAK-FM/20210509090000', + 'only_matching': True, + }] + + def _real_extract(self, url): + station, video_id = self._match_valid_url(url).groups() + vid_int = unified_timestamp(video_id, False) + prog, station_program, ft, radio_begin, radio_end = self._find_program(video_id, station, vid_int) + + auth_token, area_id = self._auth_client() + + return { + 'id': video_id, + 'title': try_call(lambda: prog.find('title').text), + 'description': clean_html(try_call(lambda: prog.find('info').text)), + 'uploader': try_call(lambda: station_program.find('.//name').text), + 'uploader_id': station, + 'timestamp': vid_int, + 'is_live': True, + 'formats': self._extract_formats( + video_id=video_id, station=station, is_onair=False, + ft=ft, cursor=vid_int, auth_token=auth_token, area_id=area_id, + query={ + 'start_at': radio_begin, + 'ft': radio_begin, + 'end_at': radio_end, + 'to': radio_end, + 'seek': video_id + } + ), + } + + +class RadikoRadioIE(RadikoBaseIE): + _VALID_URL = r'https?://(?:www\.)?radiko\.jp/#!/live/(?P<id>[A-Z0-9-]+)' + + _TESTS = [{ + # QRR (文化放é€) station provides <desc> + 'url': 'https://radiko.jp/#!/live/QRR', + 'only_matching': True, + }, { + # FMT (TOKYO FM) station does not provide <desc> + 'url': 'https://radiko.jp/#!/live/FMT', + 'only_matching': True, + }, { + 'url': 'https://radiko.jp/#!/live/JOAK-FM', + 'only_matching': True, + }] + + def _real_extract(self, url): + station = self._match_id(url) + self.report_warning('Downloader will not stop at the end of the program! Press Ctrl+C to stop') + + auth_token, area_id = self._auth_client() + # get current time in JST (GMT+9:00 w/o DST) + vid_now = time_seconds(hours=9) + + prog, station_program, ft, _, _ = self._find_program(station, station, vid_now) + + title = prog.find('title').text + description = clean_html(prog.find('info').text) + station_name = station_program.find('.//name').text + + formats = self._extract_formats( + video_id=station, station=station, is_onair=True, + ft=ft, cursor=vid_now, auth_token=auth_token, area_id=area_id, + query={}) + + return { + 'id': station, + 'title': title, + 'description': description, + 'uploader': station_name, + 'uploader_id': station, + 'timestamp': ft, + 'formats': formats, + 'is_live': True, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radiobremen.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiobremen.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radiobremen.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radiobremen.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/radiocanada.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiocanada.py new file mode 100644 index 0000000..1a5a635 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiocanada.py @@ -0,0 +1,165 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + unified_strdate, +) + + +class RadioCanadaIE(InfoExtractor): + IE_NAME = 'radiocanada' + _VALID_URL = r'(?:radiocanada:|https?://ici\.radio-canada\.ca/widgets/mediaconsole/)(?P<app_code>[^:/]+)[:/](?P<id>[0-9]+)' + _TESTS = [ + { + 'url': 'http://ici.radio-canada.ca/widgets/mediaconsole/medianet/7184272', + 'info_dict': { + 'id': '7184272', + 'ext': 'mp4', + 'title': 'Le parcours du tireur capté sur vidéo', + 'description': 'Images des caméras de surveillance fournies par la GRC montrant le parcours du tireur d\'Ottawa', + 'upload_date': '20141023', + }, + 'params': { + # m3u8 download + 'skip_download': True, + } + }, + { + # empty Title + 'url': 'http://ici.radio-canada.ca/widgets/mediaconsole/medianet/7754998/', + 'info_dict': { + 'id': '7754998', + 'ext': 'mp4', + 'title': 'letelejournal22h', + 'description': 'INTEGRALE WEB 22H-TJ', + 'upload_date': '20170720', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, + { + # with protectionType but not actually DRM protected + 'url': 'radiocanada:toutv:140872', + 'info_dict': { + 'id': '140872', + 'title': 'Épisode 1', + 'series': 'District 31', + }, + 'only_matching': True, + } + ] + _GEO_COUNTRIES = ['CA'] + _access_token = None + _claims = None + + def _call_api(self, path, video_id=None, app_code=None, query=None): + if not query: + query = {} + query.update({ + 'client_key': '773aea60-0e80-41bb-9c7f-e6d7c3ad17fb', + 'output': 'json', + }) + if video_id: + query.update({ + 'appCode': app_code, + 'idMedia': video_id, + }) + if self._access_token: + query['access_token'] = self._access_token + try: + return self._download_json( + 'https://services.radio-canada.ca/media/' + path, video_id, query=query) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status in (401, 422): + data = self._parse_json(e.cause.response.read().decode(), None) + error = data.get('error_description') or data['errorMessage']['text'] + raise ExtractorError(error, expected=True) + raise + + def _extract_info(self, app_code, video_id): + metas = self._call_api('meta/v1/index.ashx', video_id, app_code)['Metas'] + + def get_meta(name): + for meta in metas: + if meta.get('name') == name: + text = meta.get('text') + if text: + return text + + # protectionType does not necessarily mean the video is DRM protected (see + # https://github.com/ytdl-org/youtube-dl/pull/18609). + if get_meta('protectionType'): + self.report_warning('This video is probably DRM protected.') + + query = { + 'connectionType': 'hd', + 'deviceType': 'ipad', + 'multibitrate': 'true', + } + if self._claims: + query['claims'] = self._claims + v_data = self._call_api('validation/v2/', video_id, app_code, query) + v_url = v_data.get('url') + if not v_url: + error = v_data['message'] + if error == "Le contenu sélectionné n'est pas disponible dans votre pays": + raise self.raise_geo_restricted(error, self._GEO_COUNTRIES) + if error == 'Le contenu sélectionné est disponible seulement en premium': + self.raise_login_required(error) + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, error), expected=True) + formats = self._extract_m3u8_formats(v_url, video_id, 'mp4') + + subtitles = {} + closed_caption_url = get_meta('closedCaption') or get_meta('closedCaptionHTML5') + if closed_caption_url: + subtitles['fr'] = [{ + 'url': closed_caption_url, + 'ext': determine_ext(closed_caption_url, 'vtt'), + }] + + return { + 'id': video_id, + 'title': get_meta('Title') or get_meta('AV-nomEmission'), + 'description': get_meta('Description') or get_meta('ShortDescription'), + 'thumbnail': get_meta('imageHR') or get_meta('imageMR') or get_meta('imageBR'), + 'duration': int_or_none(get_meta('length')), + 'series': get_meta('Emission'), + 'season_number': int_or_none('SrcSaison'), + 'episode_number': int_or_none('SrcEpisode'), + 'upload_date': unified_strdate(get_meta('Date')), + 'subtitles': subtitles, + 'formats': formats, + } + + def _real_extract(self, url): + return self._extract_info(*self._match_valid_url(url).groups()) + + +class RadioCanadaAudioVideoIE(InfoExtractor): + IE_NAME = 'radiocanada:audiovideo' + _VALID_URL = r'https?://ici\.radio-canada\.ca/([^/]+/)*media-(?P<id>[0-9]+)' + _TESTS = [{ + 'url': 'http://ici.radio-canada.ca/audio-video/media-7527184/barack-obama-au-vietnam', + 'info_dict': { + 'id': '7527184', + 'ext': 'mp4', + 'title': 'Barack Obama au Vietnam', + 'description': 'Les États-Unis lèvent l\'embargo sur la vente d\'armes qui datait de la guerre du Vietnam', + 'upload_date': '20160523', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + 'url': 'https://ici.radio-canada.ca/info/videos/media-7527184/barack-obama-au-vietnam', + 'only_matching': True, + }] + + def _real_extract(self, url): + return self.url_result('radiocanada:medianet:%s' % self._match_id(url)) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radiode.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiode.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radiode.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radiode.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/radiofrance.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiofrance.py new file mode 100644 index 0000000..ec1b976 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiofrance.py @@ -0,0 +1,473 @@ +import itertools +import re +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + int_or_none, + join_nonempty, + js_to_json, + parse_duration, + strftime_or_none, + traverse_obj, + unified_strdate, + urljoin, +) + + +class RadioFranceIE(InfoExtractor): + _VALID_URL = r'^https?://maison\.radiofrance\.fr/radiovisions/(?P<id>[^?#]+)' + IE_NAME = 'radiofrance' + + _TEST = { + 'url': 'http://maison.radiofrance.fr/radiovisions/one-one', + 'md5': 'bdbb28ace95ed0e04faab32ba3160daf', + 'info_dict': { + 'id': 'one-one', + 'ext': 'ogg', + 'title': 'One to one', + 'description': "Plutôt que d'imaginer la radio de demain comme technologie ou comme création de contenu, je veux montrer que quelles que soient ses évolutions, j'ai l'intime conviction que la radio continuera d'être un grand média de proximité pour les auditeurs.", + 'uploader': 'Thomas Hercouët', + }, + } + + def _real_extract(self, url): + m = self._match_valid_url(url) + video_id = m.group('id') + + webpage = self._download_webpage(url, video_id) + title = self._html_search_regex(r'<h1>(.*?)</h1>', webpage, 'title') + description = self._html_search_regex( + r'<div class="bloc_page_wrapper"><div class="text">(.*?)</div>', + webpage, 'description', fatal=False) + uploader = self._html_search_regex( + r'<div class="credit">  © (.*?)</div>', + webpage, 'uploader', fatal=False) + + formats_str = self._html_search_regex( + r'class="jp-jplayer[^"]*" data-source="([^"]+)">', + webpage, 'audio URLs') + formats = [ + { + 'format_id': fm[0], + 'url': fm[1], + 'vcodec': 'none', + 'quality': i, + } + for i, fm in + enumerate(re.findall(r"([a-z0-9]+)\s*:\s*'([^']+)'", formats_str)) + ] + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'description': description, + 'uploader': uploader, + } + + +class RadioFranceBaseIE(InfoExtractor): + _VALID_URL_BASE = r'https?://(?:www\.)?radiofrance\.fr' + + _STATIONS_RE = '|'.join(map(re.escape, ( + 'franceculture', + 'franceinfo', + 'franceinter', + 'francemusique', + 'fip', + 'mouv', + ))) + + def _extract_data_from_webpage(self, webpage, display_id, key): + return traverse_obj(self._search_json( + r'\bconst\s+data\s*=', webpage, key, display_id, + contains_pattern=r'\[\{(?s:.+)\}\]', transform_source=js_to_json), + (..., 'data', key, {dict}), get_all=False) or {} + + +class FranceCultureIE(RadioFranceBaseIE): + _VALID_URL = rf'''(?x) + {RadioFranceBaseIE._VALID_URL_BASE} + /(?:{RadioFranceBaseIE._STATIONS_RE}) + /podcasts/(?:[^?#]+/)?(?P<display_id>[^?#]+)-(?P<id>\d{{6,}})(?:$|[?#]) + ''' + + _TESTS = [ + { + 'url': 'https://www.radiofrance.fr/franceculture/podcasts/science-en-questions/la-physique-d-einstein-aiderait-elle-a-comprendre-le-cerveau-8440487', + 'info_dict': { + 'id': '8440487', + 'display_id': 'la-physique-d-einstein-aiderait-elle-a-comprendre-le-cerveau', + 'ext': 'mp3', + 'title': 'La physique d’Einstein aiderait-elle à comprendre le cerveau ?', + 'description': 'Existerait-il un pont conceptuel entre la physique de l’espace-temps et les neurosciences ?', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'upload_date': '20220514', + 'duration': 2750, + }, + }, + { + 'url': 'https://www.radiofrance.fr/franceinter/podcasts/le-7-9-30/le-7-9-30-du-vendredi-10-mars-2023-2107675', + 'info_dict': { + 'id': '2107675', + 'display_id': 'le-7-9-30-du-vendredi-10-mars-2023', + 'title': 'Inflation alimentaire : comment en sortir ? - Régis Debray et Claude Grange - Cybèle Idelot', + 'description': 'md5:36ee74351ede77a314fdebb94026b916', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'upload_date': '20230310', + 'duration': 8977, + 'ext': 'mp3', + }, + }, + { + 'url': 'https://www.radiofrance.fr/franceinter/podcasts/la-rafle-du-vel-d-hiv-une-affaire-d-etat/les-racines-du-crime-episode-1-3715507', + 'only_matching': True, + }, { + 'url': 'https://www.radiofrance.fr/franceinfo/podcasts/le-billet-sciences/sante-bientot-un-vaccin-contre-l-asthme-allergique-3057200', + 'only_matching': True, + } + ] + + def _real_extract(self, url): + video_id, display_id = self._match_valid_url(url).group('id', 'display_id') + webpage = self._download_webpage(url, display_id) + + # _search_json_ld doesn't correctly handle this. See https://github.com/yt-dlp/yt-dlp/pull/3874#discussion_r891903846 + video_data = self._search_json('', webpage, 'audio data', display_id, contains_pattern=r'{\s*"@type"\s*:\s*"AudioObject".+}') + + return { + 'id': video_id, + 'display_id': display_id, + 'url': video_data['contentUrl'], + 'vcodec': 'none' if video_data.get('encodingFormat') == 'mp3' else None, + 'duration': parse_duration(video_data.get('duration')), + 'title': self._html_search_regex(r'(?s)<h1[^>]*itemprop="[^"]*name[^"]*"[^>]*>(.+?)</h1>', + webpage, 'title', default=self._og_search_title(webpage)), + 'description': self._html_search_regex( + r'(?s)<meta name="description"\s*content="([^"]+)', webpage, 'description', default=None), + 'thumbnail': self._og_search_thumbnail(webpage), + 'uploader': self._html_search_regex( + r'(?s)<span class="author">(.*?)</span>', webpage, 'uploader', default=None), + 'upload_date': unified_strdate(self._search_regex( + r'"datePublished"\s*:\s*"([^"]+)', webpage, 'timestamp', fatal=False)) + } + + +class RadioFranceLiveIE(RadioFranceBaseIE): + _VALID_URL = rf'''(?x) + https?://(?:www\.)?radiofrance\.fr + /(?P<id>{RadioFranceBaseIE._STATIONS_RE}) + /?(?P<substation_id>radio-[\w-]+)?(?:[#?]|$) + ''' + + _TESTS = [{ + 'url': 'https://www.radiofrance.fr/franceinter/', + 'info_dict': { + 'id': 'franceinter', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/franceculture', + 'info_dict': { + 'id': 'franceculture', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/mouv/radio-musique-kids-family', + 'info_dict': { + 'id': 'mouv-radio-musique-kids-family', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/mouv/radio-rnb-soul', + 'info_dict': { + 'id': 'mouv-radio-rnb-soul', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/mouv/radio-musique-mix', + 'info_dict': { + 'id': 'mouv-radio-musique-mix', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/fip/radio-rock', + 'info_dict': { + 'id': 'fip-radio-rock', + 'title': str, + 'live_status': 'is_live', + 'ext': 'aac', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.radiofrance.fr/mouv', + 'only_matching': True, + }] + + def _real_extract(self, url): + station_id, substation_id = self._match_valid_url(url).group('id', 'substation_id') + + if substation_id: + webpage = self._download_webpage(url, station_id) + api_response = self._extract_data_from_webpage(webpage, station_id, 'webRadioData') + else: + api_response = self._download_json( + f'https://www.radiofrance.fr/{station_id}/api/live', station_id) + + formats, subtitles = [], {} + for media_source in traverse_obj(api_response, (('now', None), 'media', 'sources', lambda _, v: v['url'])): + if media_source.get('format') == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles(media_source['url'], station_id, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'url': media_source['url'], + 'abr': media_source.get('bitrate'), + }) + + return { + 'id': join_nonempty(station_id, substation_id), + 'title': traverse_obj(api_response, ('visual', 'legend')) or join_nonempty( + ('now', 'firstLine', 'title'), ('now', 'secondLine', 'title'), from_dict=api_response, delim=' - '), + 'formats': formats, + 'subtitles': subtitles, + 'is_live': True, + } + + +class RadioFrancePlaylistBase(RadioFranceBaseIE): + """Subclasses must set _METADATA_KEY""" + + def _call_api(self, content_id, cursor, page_num): + raise NotImplementedError('This method must be implemented by subclasses') + + def _generate_playlist_entries(self, content_id, content_response): + for page_num in itertools.count(2): + for entry in content_response['items']: + yield self.url_result( + f'https://www.radiofrance.fr/{entry["path"]}', url_transparent=True, **traverse_obj(entry, { + 'title': 'title', + 'description': 'standFirst', + 'timestamp': ('publishedDate', {int_or_none}), + 'thumbnail': ('visual', 'src'), + })) + + next_cursor = traverse_obj(content_response, (('pagination', None), 'next'), get_all=False) + if not next_cursor: + break + + content_response = self._call_api(content_id, next_cursor, page_num) + + def _real_extract(self, url): + display_id = self._match_id(url) + + metadata = self._download_json( + 'https://www.radiofrance.fr/api/v2.1/path', display_id, + query={'value': urllib.parse.urlparse(url).path})['content'] + + content_id = metadata['id'] + + return self.playlist_result( + self._generate_playlist_entries(content_id, metadata[self._METADATA_KEY]), content_id, + display_id=display_id, **{**traverse_obj(metadata, { + 'title': 'title', + 'description': 'standFirst', + 'thumbnail': ('visual', 'src'), + }), **traverse_obj(metadata, { + 'title': 'name', + 'description': 'role', + })}) + + +class RadioFrancePodcastIE(RadioFrancePlaylistBase): + _VALID_URL = rf'''(?x) + {RadioFranceBaseIE._VALID_URL_BASE} + /(?:{RadioFranceBaseIE._STATIONS_RE}) + /podcasts/(?P<id>[\w-]+)/?(?:[?#]|$) + ''' + + _TESTS = [{ + 'url': 'https://www.radiofrance.fr/franceinfo/podcasts/le-billet-vert', + 'info_dict': { + 'id': 'eaf6ef81-a980-4f1c-a7d1-8a75ecd54b17', + 'display_id': 'le-billet-vert', + 'title': 'Le billet sciences', + 'description': 'md5:eb1007b34b0c0a680daaa71525bbd4c1', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 11, + }, { + 'url': 'https://www.radiofrance.fr/franceinter/podcasts/jean-marie-le-pen-l-obsession-nationale', + 'info_dict': { + 'id': '566fd524-3074-4fbc-ac69-8696f2152a54', + 'display_id': 'jean-marie-le-pen-l-obsession-nationale', + 'title': 'Jean-Marie Le Pen, l\'obsession nationale', + 'description': 'md5:a07c0cfb894f6d07a62d0ad12c4b7d73', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_count': 7, + }, { + 'url': 'https://www.radiofrance.fr/franceculture/podcasts/serie-thomas-grjebine', + 'info_dict': { + 'id': '63c1ddc9-9f15-457a-98b2-411bac63f48d', + 'display_id': 'serie-thomas-grjebine', + 'title': 'Thomas Grjebine', + }, + 'playlist_count': 1, + }, { + 'url': 'https://www.radiofrance.fr/fip/podcasts/certains-l-aiment-fip', + 'info_dict': { + 'id': '143dff38-e956-4a5d-8576-1c0b7242b99e', + 'display_id': 'certains-l-aiment-fip', + 'title': 'Certains l’aiment Fip', + 'description': 'md5:ff974672ba00d4fd5be80fb001c5b27e', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 321, + }, { + 'url': 'https://www.radiofrance.fr/franceinter/podcasts/le-7-9', + 'only_matching': True, + }, { + 'url': 'https://www.radiofrance.fr/mouv/podcasts/dirty-mix', + 'only_matching': True, + }] + + _METADATA_KEY = 'expressions' + + def _call_api(self, podcast_id, cursor, page_num): + return self._download_json( + f'https://www.radiofrance.fr/api/v2.1/concepts/{podcast_id}/expressions', podcast_id, + note=f'Downloading page {page_num}', query={'pageCursor': cursor}) + + +class RadioFranceProfileIE(RadioFrancePlaylistBase): + _VALID_URL = rf'{RadioFranceBaseIE._VALID_URL_BASE}/personnes/(?P<id>[\w-]+)' + + _TESTS = [{ + 'url': 'https://www.radiofrance.fr/personnes/thomas-pesquet?p=3', + 'info_dict': { + 'id': '86c62790-e481-11e2-9f7b-782bcb6744eb', + 'display_id': 'thomas-pesquet', + 'title': 'Thomas Pesquet', + 'description': 'Astronaute à l\'agence spatiale européenne', + }, + 'playlist_mincount': 212, + }, { + 'url': 'https://www.radiofrance.fr/personnes/eugenie-bastie', + 'info_dict': { + 'id': '9593050b-0183-4972-a0b5-d8f699079e02', + 'display_id': 'eugenie-bastie', + 'title': 'Eugénie Bastié', + 'description': 'Journaliste et essayiste', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 39, + }, { + 'url': 'https://www.radiofrance.fr/personnes/lea-salame', + 'only_matching': True, + }] + + _METADATA_KEY = 'documents' + + def _call_api(self, profile_id, cursor, page_num): + resp = self._download_json( + f'https://www.radiofrance.fr/api/v2.1/taxonomy/{profile_id}/documents', profile_id, + note=f'Downloading page {page_num}', query={ + 'relation': 'personality', + 'cursor': cursor, + }) + + resp['next'] = traverse_obj(resp, ('pagination', 'next')) + return resp + + +class RadioFranceProgramScheduleIE(RadioFranceBaseIE): + _VALID_URL = rf'''(?x) + {RadioFranceBaseIE._VALID_URL_BASE} + /(?P<station>{RadioFranceBaseIE._STATIONS_RE}) + /grille-programmes(?:\?date=(?P<date>[\d-]+))? + ''' + + _TESTS = [{ + 'url': 'https://www.radiofrance.fr/franceinter/grille-programmes?date=17-02-2023', + 'info_dict': { + 'id': 'franceinter-program-20230217', + 'upload_date': '20230217', + }, + 'playlist_count': 25, + }, { + 'url': 'https://www.radiofrance.fr/franceculture/grille-programmes?date=01-02-2023', + 'info_dict': { + 'id': 'franceculture-program-20230201', + 'upload_date': '20230201', + }, + 'playlist_count': 25, + }, { + 'url': 'https://www.radiofrance.fr/mouv/grille-programmes?date=19-03-2023', + 'info_dict': { + 'id': 'mouv-program-20230319', + 'upload_date': '20230319', + }, + 'playlist_count': 3, + }, { + 'url': 'https://www.radiofrance.fr/francemusique/grille-programmes?date=18-03-2023', + 'info_dict': { + 'id': 'francemusique-program-20230318', + 'upload_date': '20230318', + }, + 'playlist_count': 15, + }, { + 'url': 'https://www.radiofrance.fr/franceculture/grille-programmes', + 'only_matching': True, + }] + + def _generate_playlist_entries(self, webpage_url, api_response): + for entry in traverse_obj(api_response, ('steps', lambda _, v: v['expression']['path'])): + yield self.url_result( + urljoin(webpage_url, f'/{entry["expression"]["path"]}'), ie=FranceCultureIE, + url_transparent=True, **traverse_obj(entry, { + 'title': ('expression', 'title'), + 'thumbnail': ('expression', 'visual', 'src'), + 'timestamp': ('startTime', {int_or_none}), + 'series_id': ('concept', 'id'), + 'series': ('concept', 'title'), + })) + + def _real_extract(self, url): + station, date = self._match_valid_url(url).group('station', 'date') + webpage = self._download_webpage(url, station) + grid_data = self._extract_data_from_webpage(webpage, station, 'grid') + upload_date = strftime_or_none(grid_data.get('date'), '%Y%m%d') + + return self.playlist_result( + self._generate_playlist_entries(url, grid_data), + join_nonempty(station, 'program', upload_date), upload_date=upload_date) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radiojavan.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiojavan.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radiojavan.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radiojavan.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radiokapital.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiokapital.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radiokapital.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radiokapital.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radiozet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radiozet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radiozet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radiozet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/radlive.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/radlive.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/radlive.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/radlive.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rai.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rai.py new file mode 100644 index 0000000..df4102a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rai.py @@ -0,0 +1,783 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + determine_ext, + ExtractorError, + filter_dict, + GeoRestrictedError, + int_or_none, + join_nonempty, + parse_duration, + remove_start, + strip_or_none, + traverse_obj, + try_get, + unified_strdate, + unified_timestamp, + update_url_query, + urljoin, + xpath_text, +) + + +class RaiBaseIE(InfoExtractor): + _UUID_RE = r'[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}' + _GEO_COUNTRIES = ['IT'] + _GEO_BYPASS = False + + def _extract_relinker_info(self, relinker_url, video_id, audio_only=False): + def fix_cdata(s): + # remove \r\n\t before and after <![CDATA[ ]]> to avoid + # polluted text with xpath_text + s = re.sub(r'(\]\]>)[\r\n\t]+(</)', '\\1\\2', s) + return re.sub(r'(>)[\r\n\t]+(<!\[CDATA\[)', '\\1\\2', s) + + if not re.match(r'https?://', relinker_url): + return {'formats': [{'url': relinker_url}]} + + # set User-Agent to generic 'Rai' to avoid quality filtering from + # the media server and get the maximum qualities available + relinker = self._download_xml( + relinker_url, video_id, note='Downloading XML metadata', + transform_source=fix_cdata, query={'output': 64}, + headers={**self.geo_verification_headers(), 'User-Agent': 'Rai'}) + + if xpath_text(relinker, './license_url', default='{}') != '{}': + self.report_drm(video_id) + + is_live = xpath_text(relinker, './is_live', default='N') == 'Y' + duration = parse_duration(xpath_text(relinker, './duration', default=None)) + media_url = xpath_text(relinker, './url[@type="content"]', default=None) + + if not media_url: + self.raise_no_formats('The relinker returned no media url') + + # geo flag is a bit unreliable and not properly set all the time + geoprotection = xpath_text(relinker, './geoprotection', default='N') == 'Y' + + ext = determine_ext(media_url) + formats = [] + + if ext == 'mp3': + formats.append({ + 'url': media_url, + 'vcodec': 'none', + 'acodec': 'mp3', + 'format_id': 'https-mp3', + }) + elif ext == 'm3u8' or 'format=m3u8' in media_url: + formats.extend(self._extract_m3u8_formats( + media_url, video_id, 'mp4', m3u8_id='hls', fatal=False)) + elif ext == 'f4m': + # very likely no longer needed. Cannot find any url that uses it. + manifest_url = update_url_query( + media_url.replace('manifest#live_hds.f4m', 'manifest.f4m'), + {'hdcore': '3.7.0', 'plugin': 'aasp-3.7.0.39.44'}) + formats.extend(self._extract_f4m_formats( + manifest_url, video_id, f4m_id='hds', fatal=False)) + elif ext == 'mp4': + bitrate = int_or_none(xpath_text(relinker, './bitrate')) + formats.append({ + 'url': media_url, + 'tbr': bitrate if bitrate > 0 else None, + 'format_id': join_nonempty('https', bitrate, delim='-'), + }) + else: + raise ExtractorError('Unrecognized media file found') + + if (not formats and geoprotection is True) or '/video_no_available.mp4' in media_url: + self.raise_geo_restricted(countries=self._GEO_COUNTRIES, metadata_available=True) + + if not audio_only and not is_live: + formats.extend(self._create_http_urls(media_url, relinker_url, formats)) + + return filter_dict({ + 'is_live': is_live, + 'duration': duration, + 'formats': formats, + }) + + def _create_http_urls(self, manifest_url, relinker_url, fmts): + _MANIFEST_REG = r'/(?P<id>\w+)(?:_(?P<quality>[\d\,]+))?(?:\.mp4)?(?:\.csmil)?/playlist\.m3u8' + _MP4_TMPL = '%s&overrideUserAgentRule=mp4-%s' + _QUALITY = { + # tbr: w, h + 250: [352, 198], + 400: [512, 288], + 600: [512, 288], + 700: [512, 288], + 800: [700, 394], + 1200: [736, 414], + 1500: [920, 518], + 1800: [1024, 576], + 2400: [1280, 720], + 3200: [1440, 810], + 3600: [1440, 810], + 5000: [1920, 1080], + 10000: [1920, 1080], + } + + def percentage(number, target, pc=20, roof=125): + '''check if the target is in the range of number +/- percent''' + if not number or number < 0: + return False + return abs(target - number) < min(float(number) * float(pc) / 100.0, roof) + + def get_format_info(tbr): + import math + br = int_or_none(tbr) + if len(fmts) == 1 and not br: + br = fmts[0].get('tbr') + if br and br > 300: + tbr = math.floor(br / 100) * 100 + else: + tbr = 250 + + # try extracting info from available m3u8 formats + format_copy = [None, None] + for f in fmts: + if f.get('tbr'): + if percentage(tbr, f['tbr']): + format_copy[0] = f.copy() + if [f.get('width'), f.get('height')] == _QUALITY.get(tbr): + format_copy[1] = f.copy() + format_copy[1]['tbr'] = tbr + + # prefer format with similar bitrate because there might be + # multiple video with the same resolution but different bitrate + format_copy = format_copy[0] or format_copy[1] or {} + return { + 'format_id': f'https-{tbr}', + 'width': format_copy.get('width'), + 'height': format_copy.get('height'), + 'tbr': format_copy.get('tbr'), + 'vcodec': format_copy.get('vcodec'), + 'acodec': format_copy.get('acodec'), + 'fps': format_copy.get('fps'), + } if format_copy else { + 'format_id': f'https-{tbr}', + 'width': _QUALITY[tbr][0], + 'height': _QUALITY[tbr][1], + 'tbr': tbr, + 'vcodec': 'avc1', + 'acodec': 'mp4a', + 'fps': 25, + } + + # filter out single-stream formats + fmts = [f for f in fmts + if not f.get('vcodec') == 'none' and not f.get('acodec') == 'none'] + + mobj = re.search(_MANIFEST_REG, manifest_url) + if not mobj: + return [] + available_qualities = mobj.group('quality').split(',') if mobj.group('quality') else ['*'] + + formats = [] + for q in filter(None, available_qualities): + self.write_debug(f'Creating https format for quality {q}') + formats.append({ + 'url': _MP4_TMPL % (relinker_url, q), + 'protocol': 'https', + 'ext': 'mp4', + **get_format_info(q) + }) + return formats + + @staticmethod + def _get_thumbnails_list(thumbs, url): + return [{ + 'url': urljoin(url, thumb_url), + } for thumb_url in (thumbs or {}).values() if thumb_url] + + @staticmethod + def _extract_subtitles(url, video_data): + STL_EXT = 'stl' + SRT_EXT = 'srt' + subtitles = {} + subtitles_array = video_data.get('subtitlesArray') or video_data.get('subtitleList') or [] + for k in ('subtitles', 'subtitlesUrl'): + subtitles_array.append({'url': video_data.get(k)}) + for subtitle in subtitles_array: + sub_url = subtitle.get('url') + if sub_url and isinstance(sub_url, str): + sub_lang = subtitle.get('language') or 'it' + sub_url = urljoin(url, sub_url) + sub_ext = determine_ext(sub_url, SRT_EXT) + subtitles.setdefault(sub_lang, []).append({ + 'ext': sub_ext, + 'url': sub_url, + }) + if STL_EXT == sub_ext: + subtitles[sub_lang].append({ + 'ext': SRT_EXT, + 'url': sub_url[:-len(STL_EXT)] + SRT_EXT, + }) + return subtitles + + +class RaiPlayIE(RaiBaseIE): + _VALID_URL = rf'(?P<base>https?://(?:www\.)?raiplay\.it/.+?-(?P<id>{RaiBaseIE._UUID_RE}))\.(?:html|json)' + _TESTS = [{ + 'url': 'https://www.raiplay.it/video/2014/04/Report-del-07042014-cb27157f-9dd0-4aee-b788-b1f67643a391.html', + 'md5': '8970abf8caf8aef4696e7b1f2adfc696', + 'info_dict': { + 'id': 'cb27157f-9dd0-4aee-b788-b1f67643a391', + 'ext': 'mp4', + 'title': 'Report del 07/04/2014', + 'alt_title': 'St 2013/14 - Report - Espresso nel caffè - 07/04/2014', + 'description': 'md5:d730c168a58f4bb35600fc2f881ec04e', + 'thumbnail': r're:^https?://www\.raiplay\.it/.+\.jpg', + 'uploader': 'Rai 3', + 'creator': 'Rai 3', + 'duration': 6160, + 'series': 'Report', + 'season': '2013/14', + 'subtitles': {'it': 'count:4'}, + 'release_year': 2022, + 'episode': 'Espresso nel caffè - 07/04/2014', + 'timestamp': 1396919880, + 'upload_date': '20140408', + 'formats': 'count:4', + }, + 'params': {'skip_download': True}, + }, { + # 1080p direct mp4 url + 'url': 'https://www.raiplay.it/video/2021/11/Blanca-S1E1-Senza-occhi-b1255a4a-8e72-4a2f-b9f3-fc1308e00736.html', + 'md5': 'aeda7243115380b2dd5e881fd42d949a', + 'info_dict': { + 'id': 'b1255a4a-8e72-4a2f-b9f3-fc1308e00736', + 'ext': 'mp4', + 'title': 'Blanca - S1E1 - Senza occhi', + 'alt_title': 'St 1 Ep 1 - Blanca - Senza occhi', + 'description': 'md5:75f95d5c030ec8bac263b1212322e28c', + 'thumbnail': r're:^https://www\.raiplay\.it/dl/img/.+\.jpg', + 'uploader': 'Rai Premium', + 'creator': 'Rai Fiction', + 'duration': 6493, + 'series': 'Blanca', + 'season': 'Season 1', + 'episode_number': 1, + 'release_year': 2021, + 'season_number': 1, + 'episode': 'Senza occhi', + 'timestamp': 1637318940, + 'upload_date': '20211119', + 'formats': 'count:12', + }, + 'params': {'skip_download': True}, + 'expected_warnings': ['Video not available. Likely due to geo-restriction.'] + }, { + # 1500 quality + 'url': 'https://www.raiplay.it/video/2012/09/S1E11---Tutto-cio-che-luccica-0cab3323-732e-45d6-8e86-7704acab6598.html', + 'md5': 'a634d20e8ab2d43724c273563f6bf87a', + 'info_dict': { + 'id': '0cab3323-732e-45d6-8e86-7704acab6598', + 'ext': 'mp4', + 'title': 'Mia and Me - S1E11 - Tutto ciò che luccica', + 'alt_title': 'St 1 Ep 11 - Mia and Me - Tutto ciò che luccica', + 'description': 'md5:4969e594184b1920c4c1f2b704da9dea', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Rai Gulp', + 'series': 'Mia and Me', + 'season': 'Season 1', + 'episode_number': 11, + 'release_year': 2015, + 'season_number': 1, + 'episode': 'Tutto ciò che luccica', + 'timestamp': 1348495020, + 'upload_date': '20120924', + }, + }, { + 'url': 'http://www.raiplay.it/video/2016/11/gazebotraindesi-efebe701-969c-4593-92f3-285f0d1ce750.html?', + 'only_matching': True, + }, { + # subtitles at 'subtitlesArray' key (see #27698) + 'url': 'https://www.raiplay.it/video/2020/12/Report---04-01-2021-2e90f1de-8eee-4de4-ac0e-78d21db5b600.html', + 'only_matching': True, + }, { + # DRM protected + 'url': 'https://www.raiplay.it/video/2021/06/Lo-straordinario-mondo-di-Zoey-S2E1-Lo-straordinario-ritorno-di-Zoey-3ba992de-2332-41ad-9214-73e32ab209f4.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + base, video_id = self._match_valid_url(url).groups() + + media = self._download_json( + f'{base}.json', video_id, 'Downloading video JSON') + + if not self.get_param('allow_unplayable_formats'): + if traverse_obj(media, (('program_info', None), 'rights_management', 'rights', 'drm')): + self.report_drm(video_id) + + video = media['video'] + relinker_info = self._extract_relinker_info(video['content_url'], video_id) + date_published = join_nonempty( + media.get('date_published'), media.get('time_published'), delim=' ') + season = media.get('season') + alt_title = join_nonempty(media.get('subtitle'), media.get('toptitle'), delim=' - ') + + return { + 'id': remove_start(media.get('id'), 'ContentItem-') or video_id, + 'display_id': video_id, + 'title': media.get('name'), + 'alt_title': strip_or_none(alt_title or None), + 'description': media.get('description'), + 'uploader': strip_or_none( + traverse_obj(media, ('program_info', 'channel')) + or media.get('channel') or None), + 'creator': strip_or_none( + traverse_obj(media, ('program_info', 'editor')) + or media.get('editor') or None), + 'duration': parse_duration(video.get('duration')), + 'timestamp': unified_timestamp(date_published), + 'thumbnails': self._get_thumbnails_list(media.get('images'), url), + 'series': traverse_obj(media, ('program_info', 'name')), + 'season_number': int_or_none(season), + 'season': season if (season and not season.isdigit()) else None, + 'episode': media.get('episode_title'), + 'episode_number': int_or_none(media.get('episode')), + 'subtitles': self._extract_subtitles(url, video), + 'release_year': int_or_none(traverse_obj(media, ('track_info', 'edit_year'))), + **relinker_info + } + + +class RaiPlayLiveIE(RaiPlayIE): # XXX: Do not subclass from concrete IE + _VALID_URL = r'(?P<base>https?://(?:www\.)?raiplay\.it/dirette/(?P<id>[^/?#&]+))' + _TESTS = [{ + 'url': 'http://www.raiplay.it/dirette/rainews24', + 'info_dict': { + 'id': 'd784ad40-e0ae-4a69-aa76-37519d238a9c', + 'display_id': 'rainews24', + 'ext': 'mp4', + 'title': 're:^Diretta di Rai News 24 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'description': 'md5:4d00bcf6dc98b27c6ec480de329d1497', + 'uploader': 'Rai News 24', + 'creator': 'Rai News 24', + 'is_live': True, + 'live_status': 'is_live', + 'upload_date': '20090502', + 'timestamp': 1241276220, + 'formats': 'count:3', + }, + 'params': {'skip_download': True}, + }] + + +class RaiPlayPlaylistIE(InfoExtractor): + _VALID_URL = r'(?P<base>https?://(?:www\.)?raiplay\.it/programmi/(?P<id>[^/?#&]+))(?:/(?P<extra_id>[^?#&]+))?' + _TESTS = [{ + # entire series episodes + extras... + 'url': 'https://www.raiplay.it/programmi/nondirloalmiocapo/', + 'info_dict': { + 'id': 'nondirloalmiocapo', + 'title': 'Non dirlo al mio capo', + 'description': 'md5:98ab6b98f7f44c2843fd7d6f045f153b', + }, + 'playlist_mincount': 30, + }, { + # single season + 'url': 'https://www.raiplay.it/programmi/nondirloalmiocapo/episodi/stagione-2/', + 'info_dict': { + 'id': 'nondirloalmiocapo', + 'title': 'Non dirlo al mio capo - Stagione 2', + 'description': 'md5:98ab6b98f7f44c2843fd7d6f045f153b', + }, + 'playlist_count': 12, + }] + + def _real_extract(self, url): + base, playlist_id, extra_id = self._match_valid_url(url).groups() + + program = self._download_json( + f'{base}.json', playlist_id, 'Downloading program JSON') + + if extra_id: + extra_id = extra_id.upper().rstrip('/') + + playlist_title = program.get('name') + entries = [] + for b in (program.get('blocks') or []): + for s in (b.get('sets') or []): + if extra_id: + if extra_id != join_nonempty( + b.get('name'), s.get('name'), delim='/').replace(' ', '-').upper(): + continue + playlist_title = join_nonempty(playlist_title, s.get('name'), delim=' - ') + + s_id = s.get('id') + if not s_id: + continue + medias = self._download_json( + f'{base}/{s_id}.json', s_id, + 'Downloading content set JSON', fatal=False) + if not medias: + continue + for m in (medias.get('items') or []): + path_id = m.get('path_id') + if not path_id: + continue + video_url = urljoin(url, path_id) + entries.append(self.url_result( + video_url, ie=RaiPlayIE.ie_key(), + video_id=RaiPlayIE._match_id(video_url))) + + return self.playlist_result( + entries, playlist_id, playlist_title, + try_get(program, lambda x: x['program_info']['description'])) + + +class RaiPlaySoundIE(RaiBaseIE): + _VALID_URL = rf'(?P<base>https?://(?:www\.)?raiplaysound\.it/.+?-(?P<id>{RaiBaseIE._UUID_RE}))\.(?:html|json)' + _TESTS = [{ + 'url': 'https://www.raiplaysound.it/audio/2021/12/IL-RUGGITO-DEL-CONIGLIO-1ebae2a7-7cdb-42bb-842e-fe0d193e9707.html', + 'md5': '8970abf8caf8aef4696e7b1f2adfc696', + 'info_dict': { + 'id': '1ebae2a7-7cdb-42bb-842e-fe0d193e9707', + 'ext': 'mp3', + 'title': 'Il Ruggito del Coniglio del 10/12/2021', + 'alt_title': 'md5:0e6476cd57858bb0f3fcc835d305b455', + 'description': 'md5:2a17d2107e59a4a8faa0e18334139ee2', + 'thumbnail': r're:^https?://.+\.jpg$', + 'uploader': 'rai radio 2', + 'duration': 5685, + 'series': 'Il Ruggito del Coniglio', + 'episode': 'Il Ruggito del Coniglio del 10/12/2021', + 'creator': 'rai radio 2', + 'timestamp': 1638346620, + 'upload_date': '20211201', + }, + 'params': {'skip_download': True}, + }] + + def _real_extract(self, url): + base, audio_id = self._match_valid_url(url).group('base', 'id') + media = self._download_json(f'{base}.json', audio_id, 'Downloading audio JSON') + uid = try_get(media, lambda x: remove_start(remove_start(x['uniquename'], 'ContentItem-'), 'Page-')) + + info = {} + formats = [] + relinkers = set(traverse_obj(media, (('downloadable_audio', 'audio', ('live', 'cards', 0, 'audio')), 'url'))) + for r in relinkers: + info = self._extract_relinker_info(r, audio_id, True) + formats.extend(info.get('formats')) + + date_published = try_get(media, (lambda x: f'{x["create_date"]} {x.get("create_time") or ""}', + lambda x: x['live']['create_date'])) + + podcast_info = traverse_obj(media, 'podcast_info', ('live', 'cards', 0)) or {} + + return { + **info, + 'id': uid or audio_id, + 'display_id': audio_id, + 'title': traverse_obj(media, 'title', 'episode_title'), + 'alt_title': traverse_obj(media, ('track_info', 'media_name'), expected_type=strip_or_none), + 'description': media.get('description'), + 'uploader': traverse_obj(media, ('track_info', 'channel'), expected_type=strip_or_none), + 'creator': traverse_obj(media, ('track_info', 'editor'), expected_type=strip_or_none), + 'timestamp': unified_timestamp(date_published), + 'thumbnails': self._get_thumbnails_list(podcast_info.get('images'), url), + 'series': podcast_info.get('title'), + 'season_number': int_or_none(media.get('season')), + 'episode': media.get('episode_title'), + 'episode_number': int_or_none(media.get('episode')), + 'formats': formats, + } + + +class RaiPlaySoundLiveIE(RaiPlaySoundIE): # XXX: Do not subclass from concrete IE + _VALID_URL = r'(?P<base>https?://(?:www\.)?raiplaysound\.it/(?P<id>[^/?#&]+)$)' + _TESTS = [{ + 'url': 'https://www.raiplaysound.it/radio2', + 'info_dict': { + 'id': 'b00a50e6-f404-4af6-8f8c-ff3b9af73a44', + 'display_id': 'radio2', + 'ext': 'mp4', + 'title': r're:Rai Radio 2 \d+-\d+-\d+ \d+:\d+', + 'thumbnail': r're:^https://www\.raiplaysound\.it/dl/img/.+\.png', + 'uploader': 'rai radio 2', + 'series': 'Rai Radio 2', + 'creator': 'raiplaysound', + 'is_live': True, + 'live_status': 'is_live', + }, + 'params': {'skip_download': True}, + }] + + +class RaiPlaySoundPlaylistIE(InfoExtractor): + _VALID_URL = r'(?P<base>https?://(?:www\.)?raiplaysound\.it/(?:programmi|playlist|audiolibri)/(?P<id>[^/?#&]+))(?:/(?P<extra_id>[^?#&]+))?' + _TESTS = [{ + # entire show + 'url': 'https://www.raiplaysound.it/programmi/ilruggitodelconiglio', + 'info_dict': { + 'id': 'ilruggitodelconiglio', + 'title': 'Il Ruggito del Coniglio', + 'description': 'md5:48cff6972435964284614d70474132e6', + }, + 'playlist_mincount': 65, + }, { + # single season + 'url': 'https://www.raiplaysound.it/programmi/ilruggitodelconiglio/puntate/prima-stagione-1995', + 'info_dict': { + 'id': 'ilruggitodelconiglio_puntate_prima-stagione-1995', + 'title': 'Prima Stagione 1995', + }, + 'playlist_count': 1, + }] + + def _real_extract(self, url): + base, playlist_id, extra_id = self._match_valid_url(url).group('base', 'id', 'extra_id') + url = f'{base}.json' + program = self._download_json(url, playlist_id, 'Downloading program JSON') + + if extra_id: + extra_id = extra_id.rstrip('/') + playlist_id += '_' + extra_id.replace('/', '_') + path = next(c['path_id'] for c in program.get('filters') or [] if extra_id in c.get('weblink')) + program = self._download_json( + urljoin('https://www.raiplaysound.it', path), playlist_id, 'Downloading program secondary JSON') + + entries = [ + self.url_result(urljoin(base, c['path_id']), ie=RaiPlaySoundIE.ie_key()) + for c in traverse_obj(program, 'cards', ('block', 'cards')) or [] + if c.get('path_id')] + + return self.playlist_result(entries, playlist_id, program.get('title'), + traverse_obj(program, ('podcast_info', 'description'))) + + +class RaiIE(RaiBaseIE): + _VALID_URL = rf'https?://[^/]+\.(?:rai\.(?:it|tv))/.+?-(?P<id>{RaiBaseIE._UUID_RE})(?:-.+?)?\.html' + _TESTS = [{ + 'url': 'https://www.raisport.rai.it/dl/raiSport/media/rassegna-stampa-04a9f4bd-b563-40cf-82a6-aad3529cb4a9.html', + 'info_dict': { + 'id': '04a9f4bd-b563-40cf-82a6-aad3529cb4a9', + 'ext': 'mp4', + 'title': 'TG PRIMO TEMPO', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 1758, + 'upload_date': '20140612', + }, + 'params': {'skip_download': True}, + 'expected_warnings': ['Video not available. Likely due to geo-restriction.'] + }, { + 'url': 'https://www.rai.it/dl/RaiTV/programmi/media/ContentItem-efb17665-691c-45d5-a60c-5301333cbb0c.html', + 'info_dict': { + 'id': 'efb17665-691c-45d5-a60c-5301333cbb0c', + 'ext': 'mp4', + 'title': 'TG1 ore 20:00 del 03/11/2016', + 'description': 'TG1 edizione integrale ore 20:00 del giorno 03/11/2016', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 2214, + 'upload_date': '20161103' + }, + 'params': {'skip_download': True}, + }, { + # Direct MMS: Media URL no longer works. + 'url': 'http://www.rai.it/dl/RaiTV/programmi/media/ContentItem-b63a4089-ac28-48cf-bca5-9f5b5bc46df5.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + content_id = self._match_id(url) + media = self._download_json( + f'https://www.rai.tv/dl/RaiTV/programmi/media/ContentItem-{content_id}.html?json', + content_id, 'Downloading video JSON', fatal=False, expected_status=404) + + if media is None: + return None + + if 'Audio' in media['type']: + relinker_info = { + 'formats': [{ + 'format_id': join_nonempty('https', media.get('formatoAudio'), delim='-'), + 'url': media['audioUrl'], + 'ext': media.get('formatoAudio'), + 'vcodec': 'none', + 'acodec': media.get('formatoAudio'), + }] + } + elif 'Video' in media['type']: + relinker_info = self._extract_relinker_info(media['mediaUri'], content_id) + else: + raise ExtractorError('not a media file') + + thumbnails = self._get_thumbnails_list( + {image_type: media.get(image_type) for image_type in ( + 'image', 'image_medium', 'image_300')}, url) + + return { + 'id': content_id, + 'title': strip_or_none(media.get('name') or media.get('title')), + 'description': strip_or_none(media.get('desc')) or None, + 'thumbnails': thumbnails, + 'uploader': strip_or_none(media.get('author')) or None, + 'upload_date': unified_strdate(media.get('date')), + 'duration': parse_duration(media.get('length')), + 'subtitles': self._extract_subtitles(url, media), + **relinker_info + } + + +class RaiNewsIE(RaiIE): # XXX: Do not subclass from concrete IE + _VALID_URL = rf'https?://(www\.)?rainews\.it/(?!articoli)[^?#]+-(?P<id>{RaiBaseIE._UUID_RE})(?:-[^/?#]+)?\.html' + _EMBED_REGEX = [rf'<iframe[^>]+data-src="(?P<url>/iframe/[^?#]+?{RaiBaseIE._UUID_RE}\.html)'] + _TESTS = [{ + # new rainews player (#3911) + 'url': 'https://www.rainews.it/rubriche/24mm/video/2022/05/24mm-del-29052022-12cf645d-1ffd-4220-b27c-07c226dbdecf.html', + 'info_dict': { + 'id': '12cf645d-1ffd-4220-b27c-07c226dbdecf', + 'ext': 'mp4', + 'title': 'Puntata del 29/05/2022', + 'duration': 1589, + 'upload_date': '20220529', + 'uploader': 'rainews', + }, + 'params': {'skip_download': True}, + }, { + # old content with fallback method to extract media urls + 'url': 'https://www.rainews.it/dl/rainews/media/Weekend-al-cinema-da-Hollywood-arriva-il-thriller-di-Tate-Taylor-La-ragazza-del-treno-1632c009-c843-4836-bb65-80c33084a64b.html', + 'info_dict': { + 'id': '1632c009-c843-4836-bb65-80c33084a64b', + 'ext': 'mp4', + 'title': 'Weekend al cinema, da Hollywood arriva il thriller di Tate Taylor "La ragazza del treno"', + 'description': 'I film in uscita questa settimana.', + 'thumbnail': r're:^https?://.*\.png$', + 'duration': 833, + 'upload_date': '20161103' + }, + 'params': {'skip_download': True}, + 'expected_warnings': ['unable to extract player_data'], + }, { + # iframe + drm + 'url': 'https://www.rainews.it/iframe/video/2022/07/euro2022-europei-calcio-femminile-italia-belgio-gol-0-1-video-4de06a69-de75-4e32-a657-02f0885f8118.html', + 'only_matching': True, + }] + _PLAYER_TAG = 'news' + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + + player_data = self._search_json( + rf'<rai{self._PLAYER_TAG}-player\s*data=\'', webpage, 'player_data', video_id, + transform_source=clean_html, default={}) + track_info = player_data.get('track_info') + relinker_url = traverse_obj(player_data, 'mediapolis', 'content_url') + + if not relinker_url: + # fallback on old implementation for some old content + try: + return self._extract_from_content_id(video_id, url) + except GeoRestrictedError: + raise + except ExtractorError as e: + raise ExtractorError('Relinker URL not found', cause=e) + + relinker_info = self._extract_relinker_info(urljoin(url, relinker_url), video_id) + + return { + 'id': video_id, + 'title': player_data.get('title') or track_info.get('title') or self._og_search_title(webpage), + 'upload_date': unified_strdate(track_info.get('date')), + 'uploader': strip_or_none(track_info.get('editor') or None), + **relinker_info + } + + +class RaiCulturaIE(RaiNewsIE): # XXX: Do not subclass from concrete IE + _VALID_URL = rf'https?://(www\.)?raicultura\.it/(?!articoli)[^?#]+-(?P<id>{RaiBaseIE._UUID_RE})(?:-[^/?#]+)?\.html' + _EMBED_REGEX = [rf'<iframe[^>]+data-src="(?P<url>/iframe/[^?#]+?{RaiBaseIE._UUID_RE}\.html)'] + _TESTS = [{ + 'url': 'https://www.raicultura.it/letteratura/articoli/2018/12/Alberto-Asor-Rosa-Letteratura-e-potere-05ba8775-82b5-45c5-a89d-dd955fbde1fb.html', + 'info_dict': { + 'id': '05ba8775-82b5-45c5-a89d-dd955fbde1fb', + 'ext': 'mp4', + 'title': 'Alberto Asor Rosa: Letteratura e potere', + 'duration': 1756, + 'upload_date': '20181206', + 'uploader': 'raicultura', + 'formats': 'count:2', + }, + 'params': {'skip_download': True}, + }] + _PLAYER_TAG = 'cultura' + + +class RaiSudtirolIE(RaiBaseIE): + _VALID_URL = r'https?://raisudtirol\.rai\.it/.+media=(?P<id>\w+)' + _TESTS = [{ + # mp4 file + 'url': 'https://raisudtirol.rai.it/la/index.php?media=Ptv1619729460', + 'info_dict': { + 'id': 'Ptv1619729460', + 'ext': 'mp4', + 'title': 'Euro: trasmisciun d\'economia - 29-04-2021 20:51', + 'series': 'Euro: trasmisciun d\'economia', + 'upload_date': '20210429', + 'thumbnail': r're:https://raisudtirol\.rai\.it/img/.+\.jpg', + 'uploader': 'raisudtirol', + 'formats': 'count:1', + }, + 'params': {'skip_download': True}, + }, { + # m3u manifest + 'url': 'https://raisudtirol.rai.it/it/kidsplayer.php?lang=it&media=GUGGUG_P1.smil', + 'info_dict': { + 'id': 'GUGGUG_P1', + 'ext': 'mp4', + 'title': 'GUGGUG! La Prospettiva - Die Perspektive', + 'uploader': 'raisudtirol', + 'formats': 'count:6', + }, + 'params': {'skip_download': True}, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + video_date = self._html_search_regex( + r'<span class="med_data">(.+?)</span>', webpage, 'video_date', default=None) + video_title = self._html_search_regex([ + r'<span class="med_title">(.+?)</span>', r'title: \'(.+?)\','], + webpage, 'video_title', default=None) + video_url = self._html_search_regex([ + r'sources:\s*\[\{file:\s*"(.+?)"\}\]', + r'<source\s+src="(.+?)"\s+type="application/x-mpegURL"'], + webpage, 'video_url', default=None) + + ext = determine_ext(video_url) + if ext == 'm3u8': + formats = self._extract_m3u8_formats(video_url, video_id) + elif ext == 'mp4': + formats = [{ + 'format_id': 'https-mp4', + 'url': self._proto_relative_url(video_url), + 'width': 1024, + 'height': 576, + 'fps': 25, + 'vcodec': 'avc1', + 'acodec': 'mp4a', + }] + else: + formats = [] + self.raise_no_formats(f'Unrecognized media file: {video_url}') + + return { + 'id': video_id, + 'title': join_nonempty(video_title, video_date, delim=' - '), + 'series': video_title if video_date else None, + 'upload_date': unified_strdate(video_date), + 'thumbnail': urljoin('https://raisudtirol.rai.it/', self._html_search_regex( + r'image: \'(.+?)\'', webpage, 'video_thumb', default=None)), + 'uploader': 'raisudtirol', + 'formats': formats, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/raywenderlich.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/raywenderlich.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/raywenderlich.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/raywenderlich.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rbgtum.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rbgtum.py new file mode 100644 index 0000000..c8a331f --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rbgtum.py @@ -0,0 +1,142 @@ +import re + +from .common import InfoExtractor +from ..utils import parse_qs, remove_start, traverse_obj, ExtractorError + + +class RbgTumIE(InfoExtractor): + _VALID_URL = r'https://(?:live\.rbg\.tum\.de|tum\.live)/w/(?P<id>[^?#]+)' + _TESTS = [{ + # Combined view + 'url': 'https://live.rbg.tum.de/w/cpp/22128', + 'md5': '53a5e7b3e07128e33bbf36687fe1c08f', + 'info_dict': { + 'id': 'cpp/22128', + 'ext': 'mp4', + 'title': 'Lecture: October 18. 2022', + 'series': 'Concepts of C++ programming (IN2377)', + } + }, { + # Presentation only + 'url': 'https://live.rbg.tum.de/w/I2DL/12349/PRES', + 'md5': '36c584272179f3e56b0db5d880639cba', + 'info_dict': { + 'id': 'I2DL/12349/PRES', + 'ext': 'mp4', + 'title': 'Lecture 3: Introduction to Neural Networks', + 'series': 'Introduction to Deep Learning (IN2346)', + } + }, { + # Camera only + 'url': 'https://live.rbg.tum.de/w/fvv-info/16130/CAM', + 'md5': 'e04189d92ff2f56aedf5cede65d37aad', + 'info_dict': { + 'id': 'fvv-info/16130/CAM', + 'ext': 'mp4', + 'title': 'Fachschaftsvollversammlung', + 'series': 'Fachschaftsvollversammlung Informatik', + } + }, { + 'url': 'https://tum.live/w/linalginfo/27102', + 'only_matching': True, + }, ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + m3u8 = self._html_search_regex(r'"(https://[^"]+\.m3u8[^"]*)', webpage, 'm3u8') + lecture_title = self._html_search_regex(r'<h1[^>]*>([^<]+)</h1>', webpage, 'title', fatal=False) + lecture_series_title = remove_start(self._html_extract_title(webpage), 'TUM-Live | ') + + formats = self._extract_m3u8_formats(m3u8, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls') + + return { + 'id': video_id, + 'title': lecture_title, + 'series': lecture_series_title, + 'formats': formats, + } + + +class RbgTumCourseIE(InfoExtractor): + _VALID_URL = r'https://(?P<hostname>(?:live\.rbg\.tum\.de|tum\.live))/old/course/(?P<id>(?P<year>\d+)/(?P<term>\w+)/(?P<slug>[^/?#]+))' + _TESTS = [{ + 'url': 'https://live.rbg.tum.de/old/course/2022/S/fpv', + 'info_dict': { + 'title': 'Funktionale Programmierung und Verifikation (IN0003)', + 'id': '2022/S/fpv', + }, + 'params': { + 'noplaylist': False, + }, + 'playlist_count': 13, + }, { + 'url': 'https://live.rbg.tum.de/old/course/2022/W/set', + 'info_dict': { + 'title': 'SET FSMPIC', + 'id': '2022/W/set', + }, + 'params': { + 'noplaylist': False, + }, + 'playlist_count': 6, + }, { + 'url': 'https://tum.live/old/course/2023/S/linalginfo', + 'only_matching': True, + }, ] + + def _real_extract(self, url): + course_id, hostname, year, term, slug = self._match_valid_url(url).group('id', 'hostname', 'year', 'term', 'slug') + meta = self._download_json( + f'https://{hostname}/api/courses/{slug}/', course_id, fatal=False, + query={'year': year, 'term': term}) or {} + lecture_series_title = meta.get('Name') + lectures = [self.url_result(f'https://{hostname}/w/{slug}/{stream_id}', RbgTumIE) + for stream_id in traverse_obj(meta, ('Streams', ..., 'ID'))] + + if not lectures: + webpage = self._download_webpage(url, course_id) + lecture_series_title = remove_start(self._html_extract_title(webpage), 'TUM-Live | ') + lectures = [self.url_result(f'https://{hostname}{lecture_path}', RbgTumIE) + for lecture_path in re.findall(r'href="(/w/[^/"]+/[^/"]+)"', webpage)] + + return self.playlist_result(lectures, course_id, lecture_series_title) + + +class RbgTumNewCourseIE(InfoExtractor): + _VALID_URL = r'https://(?P<hostname>(?:live\.rbg\.tum\.de|tum\.live))/\?' + _TESTS = [{ + 'url': 'https://live.rbg.tum.de/?year=2022&term=S&slug=fpv&view=3', + 'info_dict': { + 'title': 'Funktionale Programmierung und Verifikation (IN0003)', + 'id': '2022/S/fpv', + }, + 'params': { + 'noplaylist': False, + }, + 'playlist_count': 13, + }, { + 'url': 'https://live.rbg.tum.de/?year=2022&term=W&slug=set&view=3', + 'info_dict': { + 'title': 'SET FSMPIC', + 'id': '2022/W/set', + }, + 'params': { + 'noplaylist': False, + }, + 'playlist_count': 6, + }, { + 'url': 'https://tum.live/?year=2023&term=S&slug=linalginfo&view=3', + 'only_matching': True, + }] + + def _real_extract(self, url): + query = parse_qs(url) + errors = [key for key in ('year', 'term', 'slug') if not query.get(key)] + if errors: + raise ExtractorError(f'Input URL is missing query parameters: {", ".join(errors)}') + year, term, slug = query['year'][0], query['term'][0], query['slug'][0] + hostname = self._match_valid_url(url).group('hostname') + + return self.url_result(f'https://{hostname}/old/course/{year}/{term}/{slug}', RbgTumCourseIE) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rbmaradio.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rbmaradio.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rbmaradio.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rbmaradio.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rcs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rcs.py new file mode 100644 index 0000000..b865f63 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rcs.py @@ -0,0 +1,372 @@ +import re + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + ExtractorError, + base_url, + clean_html, + extract_attributes, + get_element_html_by_class, + get_element_html_by_id, + int_or_none, + js_to_json, + mimetype2ext, + sanitize_url, + traverse_obj, + try_call, + url_basename, + urljoin, +) + + +class RCSBaseIE(InfoExtractor): + # based on VideoPlayerLoader.prototype.getVideoSrc + # and VideoPlayerLoader.prototype.transformSrc from + # https://js2.corriereobjects.it/includes2013/LIBS/js/corriere_video.sjs + _UUID_RE = r'[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}' + _RCS_ID_RE = r'[\w-]+-\d{10}' + _MIGRATION_MAP = { + 'videoamica-vh.akamaihd': 'amica', + 'media2-amica-it.akamaized': 'amica', + 'corrierevam-vh.akamaihd': 'corriere', + 'media2vam-corriere-it.akamaized': 'corriere', + 'cormezzogiorno-vh.akamaihd': 'corrieredelmezzogiorno', + 'media2vam-mezzogiorno-corriere-it.akamaized': 'corrieredelmezzogiorno', + 'corveneto-vh.akamaihd': 'corrieredelveneto', + 'media2vam-veneto-corriere-it.akamaized': 'corrieredelveneto', + 'corbologna-vh.akamaihd': 'corrieredibologna', + 'media2vam-bologna-corriere-it.akamaized': 'corrieredibologna', + 'corfiorentino-vh.akamaihd': 'corrierefiorentino', + 'media2vam-fiorentino-corriere-it.akamaized': 'corrierefiorentino', + 'corinnovazione-vh.akamaihd': 'corriereinnovazione', + 'media2-gazzanet-gazzetta-it.akamaized': 'gazzanet', + 'videogazzanet-vh.akamaihd': 'gazzanet', + 'videogazzaworld-vh.akamaihd': 'gazzaworld', + 'gazzettavam-vh.akamaihd': 'gazzetta', + 'media2vam-gazzetta-it.akamaized': 'gazzetta', + 'videoiodonna-vh.akamaihd': 'iodonna', + 'media2-leitv-it.akamaized': 'leitv', + 'videoleitv-vh.akamaihd': 'leitv', + 'videoliving-vh.akamaihd': 'living', + 'media2-living-corriere-it.akamaized': 'living', + 'media2-oggi-it.akamaized': 'oggi', + 'videooggi-vh.akamaihd': 'oggi', + 'media2-quimamme-it.akamaized': 'quimamme', + 'quimamme-vh.akamaihd': 'quimamme', + 'videorunning-vh.akamaihd': 'running', + 'media2-style-corriere-it.akamaized': 'style', + 'style-vh.akamaihd': 'style', + 'videostyle-vh.akamaihd': 'style', + 'media2-stylepiccoli-it.akamaized': 'stylepiccoli', + 'stylepiccoli-vh.akamaihd': 'stylepiccoli', + 'doveviaggi-vh.akamaihd': 'viaggi', + 'media2-doveviaggi-it.akamaized': 'viaggi', + 'media2-vivimilano-corriere-it.akamaized': 'vivimilano', + 'vivimilano-vh.akamaihd': 'vivimilano', + 'media2-youreporter-it.akamaized': 'youreporter' + } + + def _get_video_src(self, video): + for source in traverse_obj(video, ( + 'mediaProfile', 'mediaFile', lambda _, v: v.get('mimeType'))): + url = source['value'] + for s, r in ( + ('media2vam.corriere.it.edgesuite.net', 'media2vam-corriere-it.akamaized.net'), + ('media.youreporter.it.edgesuite.net', 'media-youreporter-it.akamaized.net'), + ('corrierepmd.corriere.it.edgesuite.net', 'corrierepmd-corriere-it.akamaized.net'), + ('media2vam-corriere-it.akamaized.net/fcs.quotidiani/vr/videos/', 'video.corriere.it/vr360/videos/'), + ('http://', 'https://'), + ): + url = url.replace(s, r) + + type_ = mimetype2ext(source['mimeType']) + if type_ == 'm3u8' and '-vh.akamaihd' in url: + # still needed for some old content: see _TESTS #3 + matches = re.search(r'(?:https?:)?//(?P<host>[\w\.\-]+)\.net/i(?P<path>.+)$', url) + if matches: + url = f'https://vod.rcsobjects.it/hls/{self._MIGRATION_MAP[matches.group("host")]}{matches.group("path")}' + if traverse_obj(video, ('mediaProfile', 'geoblocking')) or ( + type_ == 'm3u8' and 'fcs.quotidiani_!' in url): + url = url.replace('vod.rcsobjects', 'vod-it.rcsobjects') + if type_ == 'm3u8' and 'vod' in url: + url = url.replace('.csmil', '.urlset') + if type_ == 'mp3': + url = url.replace('media2vam-corriere-it.akamaized.net', 'vod.rcsobjects.it/corriere') + + yield { + 'type': type_, + 'url': url, + 'bitrate': source.get('bitrate') + } + + def _create_http_formats(self, m3u8_formats, video_id): + for f in m3u8_formats: + if f['vcodec'] == 'none': + continue + http_url = re.sub(r'(https?://[^/]+)/hls/([^?#]+?\.mp4).+', r'\g<1>/\g<2>', f['url']) + if http_url == f['url']: + continue + + http_f = f.copy() + del http_f['manifest_url'] + format_id = try_call(lambda: http_f['format_id'].replace('hls-', 'https-')) + urlh = self._request_webpage(HEADRequest(http_url), video_id, fatal=False, + note=f'Check filesize for {format_id}') + if not urlh: + continue + + http_f.update({ + 'format_id': format_id, + 'url': http_url, + 'protocol': 'https', + 'filesize_approx': int_or_none(urlh.headers.get('Content-Length', None)), + }) + yield http_f + + def _create_formats(self, sources, video_id): + for source in sources: + if source['type'] == 'm3u8': + m3u8_formats = self._extract_m3u8_formats( + source['url'], video_id, 'mp4', m3u8_id='hls', fatal=False) + yield from m3u8_formats + yield from self._create_http_formats(m3u8_formats, video_id) + elif source['type'] == 'mp3': + yield { + 'format_id': 'https-mp3', + 'ext': 'mp3', + 'acodec': 'mp3', + 'vcodec': 'none', + 'abr': source.get('bitrate'), + 'url': source['url'], + } + + def _real_extract(self, url): + cdn, video_id = self._match_valid_url(url).group('cdn', 'id') + display_id, video_data = None, None + + if re.match(self._UUID_RE, video_id) or re.match(self._RCS_ID_RE, video_id): + url = f'https://video.{cdn}/video-json/{video_id}' + else: + webpage = self._download_webpage(url, video_id) + data_config = get_element_html_by_id('divVideoPlayer', webpage) or get_element_html_by_class('divVideoPlayer', webpage) + + if data_config: + data_config = self._parse_json( + extract_attributes(data_config).get('data-config'), + video_id, fatal=False) or {} + if data_config.get('newspaper'): + cdn = f'{data_config["newspaper"]}.it' + display_id, video_id = video_id, data_config.get('uuid') or video_id + url = f'https://video.{cdn}/video-json/{video_id}' + else: + json_url = self._search_regex( + r'''(?x)url\s*=\s*(["']) + (?P<url> + (?:https?:)?//video\.rcs\.it + /fragment-includes/video-includes/[^"']+?\.json + )\1;''', + webpage, video_id, group='url', default=None) + if json_url: + video_data = self._download_json(sanitize_url(json_url, scheme='https'), video_id) + display_id, video_id = video_id, video_data.get('id') or video_id + + if not video_data: + webpage = self._download_webpage(url, video_id) + + video_data = self._search_json( + '##start-video##', webpage, 'video data', video_id, default=None, + end_pattern='##end-video##', transform_source=js_to_json) + + if not video_data: + # try search for iframes + emb = RCSEmbedsIE._extract_url(webpage) + if emb: + return { + '_type': 'url_transparent', + 'url': emb, + 'ie_key': RCSEmbedsIE.ie_key() + } + + if not video_data: + raise ExtractorError('Video data not found in the page') + + return { + 'id': video_id, + 'display_id': display_id, + 'title': video_data.get('title'), + 'description': (clean_html(video_data.get('description')) + or clean_html(video_data.get('htmlDescription')) + or self._html_search_meta('description', webpage)), + 'uploader': video_data.get('provider') or cdn, + 'formats': list(self._create_formats(self._get_video_src(video_data), video_id)), + } + + +class RCSEmbedsIE(RCSBaseIE): + _VALID_URL = r'''(?x) + https?://(?P<vid>video)\. + (?P<cdn> + (?: + rcs| + (?:corriere\w+\.)?corriere| + (?:gazzanet\.)?gazzetta + )\.it) + /video-embed/(?P<id>[^/=&\?]+?)(?:$|\?)''' + _EMBED_REGEX = [r'''(?x) + (?: + data-frame-src=| + <iframe[^\n]+src= + ) + (["']) + (?P<url>(?:https?:)?//video\. + (?: + rcs| + (?:corriere\w+\.)?corriere| + (?:gazzanet\.)?gazzetta + ) + \.it/video-embed/.+?) + \1'''] + _TESTS = [{ + 'url': 'https://video.rcs.it/video-embed/iodonna-0001585037', + 'md5': '0faca97df525032bb9847f690bc3720c', + 'info_dict': { + 'id': 'iodonna-0001585037', + 'ext': 'mp4', + 'title': 'Sky Arte racconta Madonna nella serie "Artist to icon"', + 'description': 'md5:65b09633df9ffee57f48b39e34c9e067', + 'uploader': 'rcs.it', + } + }, { + 'url': 'https://video.gazzanet.gazzetta.it/video-embed/gazzanet-mo05-0000260789', + 'only_matching': True + }, { + 'url': 'https://video.gazzetta.it/video-embed/49612410-00ca-11eb-bcd8-30d4253e0140', + 'only_matching': True + }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.iodonna.it/video-iodonna/personaggi-video/monica-bellucci-piu-del-lavoro-oggi-per-me-sono-importanti-lamicizia-e-la-famiglia/', + 'info_dict': { + 'id': 'iodonna-0002033648', + 'ext': 'mp4', + 'title': 'Monica Bellucci: «Più del lavoro, oggi per me sono importanti l\'amicizia e la famiglia»', + 'description': 'md5:daea6d9837351e56b1ab615c06bebac1', + 'uploader': 'rcs.it', + } + }] + + @staticmethod + def _sanitize_url(url): + url = sanitize_url(url, scheme='https') + return urljoin(base_url(url), url_basename(url)) + + @classmethod + def _extract_embed_urls(cls, url, webpage): + return map(cls._sanitize_url, super()._extract_embed_urls(url, webpage)) + + +class RCSIE(RCSBaseIE): + _VALID_URL = r'''(?x)https?://(?P<vid>video|viaggi)\. + (?P<cdn> + (?: + corrieredelmezzogiorno\. + |corrieredelveneto\. + |corrieredibologna\. + |corrierefiorentino\. + )?corriere\.it + |(?:gazzanet\.)?gazzetta\.it) + /(?!video-embed/)[^?#]+?/(?P<id>[^/\?]+)(?=\?|/$|$)''' + _TESTS = [{ + # json iframe directly from id + 'url': 'https://video.corriere.it/sport/formula-1/vettel-guida-ferrari-sf90-mugello-suo-fianco-c-elecrerc-bendato-video-esilarante/b727632a-f9d0-11ea-91b0-38d50a849abb', + 'md5': '14946840dec46ecfddf66ba4eea7d2b2', + 'info_dict': { + 'id': 'b727632a-f9d0-11ea-91b0-38d50a849abb', + 'ext': 'mp4', + 'title': 'Vettel guida la Ferrari SF90 al Mugello e al suo fianco c\'è Leclerc (bendato): il video è esilarante', + 'description': 'md5:3915ce5ebb3d2571deb69a5eb85ac9b5', + 'uploader': 'Corriere Tv', + } + }, { + # search for video id inside the page + 'url': 'https://viaggi.corriere.it/video/norvegia-il-nuovo-ponte-spettacolare-sopra-la-cascata-di-voringsfossen/', + 'md5': 'f22a92d9e666e80f2fffbf2825359c81', + 'info_dict': { + 'id': '5b7cd134-e2c1-11ea-89b3-b56dd0df2aa2', + 'display_id': 'norvegia-il-nuovo-ponte-spettacolare-sopra-la-cascata-di-voringsfossen', + 'ext': 'mp4', + 'title': 'La nuova spettacolare attrazione in Norvegia: il ponte sopra Vøringsfossen', + 'description': 'md5:18b35a291f6746c0c8dacd16e5f5f4f8', + 'uploader': 'DOVE Viaggi', + } + }, { + # only audio format https://github.com/yt-dlp/yt-dlp/issues/5683 + 'url': 'https://video.corriere.it/cronaca/audio-telefonata-il-papa-becciu-santita-lettera-che-mi-ha-inviato-condanna/b94c0d20-70c2-11ed-9572-e4b947a0ebd2', + 'md5': 'aaffb08d02f2ce4292a4654694c78150', + 'info_dict': { + 'id': 'b94c0d20-70c2-11ed-9572-e4b947a0ebd2', + 'ext': 'mp3', + 'title': 'L\'audio della telefonata tra il Papa e Becciu: «Santità, la lettera che mi ha inviato è una condanna»', + 'description': 'md5:c0ddb61bd94a8d4e0d4bb9cda50a689b', + 'uploader': 'Corriere Tv', + 'formats': [{'format_id': 'https-mp3', 'ext': 'mp3'}], + } + }, { + # old content still needs cdn migration + 'url': 'https://viaggi.corriere.it/video/milano-varallo-sesia-sul-treno-a-vapore/', + 'md5': '2dfdce7af249654ad27eeba03fe1e08d', + 'info_dict': { + 'id': 'd8f6c8d0-f7d7-11e8-bfca-f74cf4634191', + 'display_id': 'milano-varallo-sesia-sul-treno-a-vapore', + 'ext': 'mp4', + 'title': 'Milano-Varallo Sesia sul treno a vapore', + 'description': 'md5:6348f47aac230397fe341a74f7678d53', + 'uploader': 'DOVE Viaggi', + } + }, { + 'url': 'https://video.corriere.it/video-360/metro-copenaghen-tutta-italiana/a248a7f0-e2db-11e9-9830-af2de6b1f945', + 'only_matching': True + }] + + +class RCSVariousIE(RCSBaseIE): + _VALID_URL = r'''(?x)https?://www\. + (?P<cdn> + leitv\.it| + youreporter\.it| + amica\.it + )/(?:[^/]+/)?(?P<id>[^/]+?)(?:$|\?|/)''' + _TESTS = [{ + 'url': 'https://www.leitv.it/benessere/mal-di-testa/', + 'md5': '3b7a683d105a7313ec7513b014443631', + 'info_dict': { + 'id': 'leitv-0000125151', + 'display_id': 'mal-di-testa', + 'ext': 'mp4', + 'title': 'Cervicalgia e mal di testa, il video con i suggerimenti dell\'esperto', + 'description': 'md5:ae21418f34cee0b8d02a487f55bcabb5', + 'uploader': 'leitv.it', + } + }, { + 'url': 'https://www.youreporter.it/fiume-sesia-3-ottobre-2020/', + 'md5': '3989b6d603482611a2abd2f32b79f739', + 'info_dict': { + 'id': 'youreporter-0000332574', + 'display_id': 'fiume-sesia-3-ottobre-2020', + 'ext': 'mp4', + 'title': 'Fiume Sesia 3 ottobre 2020', + 'description': 'md5:0070eef1cc884d13c970a4125063de55', + 'uploader': 'youreporter.it', + } + }, { + 'url': 'https://www.amica.it/video-post/saint-omer-al-cinema-il-film-leone-dargento-che-ribalta-gli-stereotipi/', + 'md5': '187cce524dfd0343c95646c047375fc4', + 'info_dict': { + 'id': 'amica-0001225365', + 'display_id': 'saint-omer-al-cinema-il-film-leone-dargento-che-ribalta-gli-stereotipi', + 'ext': 'mp4', + 'title': '"Saint Omer": al cinema il film Leone d\'argento che ribalta gli stereotipi', + 'description': 'md5:b1c8869c2dcfd6073a2a311ba0008aa8', + 'uploader': 'rcs.it', + } + }] diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rcti.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rcti.py new file mode 100644 index 0000000..79d9c8e --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rcti.py @@ -0,0 +1,373 @@ +import json +import random +import time + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + dict_get, + ExtractorError, + strip_or_none, + traverse_obj, + try_get +) + + +class RCTIPlusBaseIE(InfoExtractor): + def _real_initialize(self): + self._AUTH_KEY = self._download_json( + 'https://api.rctiplus.com/api/v1/visitor?platform=web', # platform can be web, mweb, android, ios + None, 'Fetching authorization key')['data']['access_token'] + + def _call_api(self, url, video_id, note=None): + json = self._download_json( + url, video_id, note=note, headers={'Authorization': self._AUTH_KEY}) + if json.get('status', {}).get('code', 0) != 0: + raise ExtractorError(f'{self.IE_NAME} said: {json["status"]["message_client"]}', cause=json) + return json.get('data'), json.get('meta') + + +class RCTIPlusIE(RCTIPlusBaseIE): + _VALID_URL = r'https://www\.rctiplus\.com/(?:programs/\d+?/.*?/)?(?P<type>episode|clip|extra|live-event|missed-event)/(?P<id>\d+)/(?P<display_id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://www.rctiplus.com/programs/1259/kiko-untuk-lola/episode/22124/untuk-lola', + 'md5': '56ed45affad45fa18d5592a1bc199997', + 'info_dict': { + 'id': 'v_e22124', + 'title': 'Untuk Lola', + 'display_id': 'untuk-lola', + 'description': 'md5:2b809075c0b1e071e228ad6d13e41deb', + 'ext': 'mp4', + 'duration': 1400, + 'timestamp': 1615978800, + 'upload_date': '20210317', + 'series': 'Kiko : Untuk Lola', + 'season_number': 1, + 'episode_number': 1, + 'channel': 'RCTI', + }, + 'params': { + 'fixup': 'never', + }, + }, { # Clip; Series title doesn't appear on metadata JSON + 'url': 'https://www.rctiplus.com/programs/316/cahaya-terindah/clip/3921/make-a-wish', + 'md5': 'd179b2ff356f0e91a53bcc6a4d8504f0', + 'info_dict': { + 'id': 'v_c3921', + 'title': 'Make A Wish', + 'display_id': 'make-a-wish', + 'description': 'Make A Wish', + 'ext': 'mp4', + 'duration': 288, + 'timestamp': 1571652600, + 'upload_date': '20191021', + 'series': 'Cahaya Terindah', + 'channel': 'RCTI', + }, + 'params': { + 'fixup': 'never', + }, + }, { # Extra + 'url': 'https://www.rctiplus.com/programs/616/inews-malam/extra/9438/diungkapkan-melalui-surat-terbuka-ceo-ruangguru-belva-devara-mundur-dari-staf-khusus-presiden', + 'md5': 'c48106afdbce609749f5e0c007d9278a', + 'info_dict': { + 'id': 'v_ex9438', + 'title': 'md5:2ede828c0f8bde249e0912be150314ca', + 'display_id': 'md5:62b8d4e9ff096db527a1ad797e8a9933', + 'description': 'md5:2ede828c0f8bde249e0912be150314ca', + 'ext': 'mp4', + 'duration': 93, + 'timestamp': 1587561540, + 'upload_date': '20200422', + 'series': 'iNews Malam', + 'channel': 'INews', + }, + }, { # Missed event/replay + 'url': 'https://www.rctiplus.com/missed-event/2507/mou-signing-ceremony-27-juli-2021-1400-wib', + 'md5': '649c5f27250faed1452ca8b91e06922d', + 'info_dict': { + 'id': 'v_pe2507', + 'title': 'MOU Signing Ceremony | 27 Juli 2021 | 14.00 WIB', + 'display_id': 'mou-signing-ceremony-27-juli-2021-1400-wib', + 'ext': 'mp4', + 'timestamp': 1627142400, + 'upload_date': '20210724', + 'was_live': True, + 'release_timestamp': 1627369200, + }, + 'params': { + 'fixup': 'never', + }, + }, { # Live event; Cloudfront CDN + 'url': 'https://www.rctiplus.com/live-event/2530/dai-muda-charging-imun-dengan-iman-4-agustus-2021-1600-wib', + 'info_dict': { + 'id': 'v_le2530', + 'title': 'Dai Muda : Charging Imun dengan Iman | 4 Agustus 2021 | 16.00 WIB', + 'display_id': 'dai-muda-charging-imun-dengan-iman-4-agustus-2021-1600-wib', + 'ext': 'mp4', + 'timestamp': 1627898400, + 'upload_date': '20210802', + 'release_timestamp': 1628067600, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This live event has ended.', + }, { # TV; live_at is null + 'url': 'https://www.rctiplus.com/live-event/1/rcti', + 'info_dict': { + 'id': 'v_lt1', + 'title': 'RCTI', + 'display_id': 'rcti', + 'ext': 'mp4', + 'timestamp': 1546344000, + 'upload_date': '20190101', + 'is_live': True, + }, + 'params': { + 'skip_download': True, + }, + }] + _CONVIVA_JSON_TEMPLATE = { + 't': 'CwsSessionHb', + 'cid': 'ff84ae928c3b33064b76dec08f12500465e59a6f', + 'clid': '0', + 'sid': 0, + 'seq': 0, + 'caps': 0, + 'sf': 7, + 'sdk': True, + } + + def _real_extract(self, url): + match = self._match_valid_url(url).groupdict() + video_type, video_id, display_id = match['type'], match['id'], match['display_id'] + + url_api_version = 'v2' if video_type == 'missed-event' else 'v1' + appier_id = '23984824_' + str(random.randint(0, 10000000000)) # Based on the webpage's uuidRandom generator + video_json = self._call_api( + f'https://api.rctiplus.com/api/{url_api_version}/{video_type}/{video_id}/url?appierid={appier_id}', display_id, 'Downloading video URL JSON')[0] + video_url = video_json['url'] + + is_upcoming = try_get(video_json, lambda x: x['current_date'] < x['live_at']) + if is_upcoming is None: + is_upcoming = try_get(video_json, lambda x: x['current_date'] < x['start_date']) + if is_upcoming: + self.raise_no_formats( + 'This event will start at %s.' % video_json['live_label'] if video_json.get('live_label') else 'This event has not started yet.', expected=True) + if 'akamaized' in video_url: + # For some videos hosted on Akamai's CDN (possibly AES-encrypted ones?), a session needs to at least be made via Conviva's API + conviva_json_data = { + **self._CONVIVA_JSON_TEMPLATE, + 'url': video_url, + 'sst': int(time.time()) + } + conviva_json_res = self._download_json( + 'https://ff84ae928c3b33064b76dec08f12500465e59a6f.cws.conviva.com/0/wsg', display_id, + 'Creating Conviva session', 'Failed to create Conviva session', + fatal=False, data=json.dumps(conviva_json_data).encode('utf-8')) + if conviva_json_res and conviva_json_res.get('err') != 'ok': + self.report_warning('Conviva said: %s' % str(conviva_json_res.get('err'))) + + video_meta, meta_paths = self._call_api( + 'https://api.rctiplus.com/api/v1/%s/%s' % (video_type, video_id), display_id, 'Downloading video metadata') + + thumbnails, image_path = [], meta_paths.get('image_path', 'https://rstatic.akamaized.net/media/') + if video_meta.get('portrait_image'): + thumbnails.append({ + 'id': 'portrait_image', + 'url': '%s%d%s' % (image_path, 2000, video_meta['portrait_image']) # 2000px seems to be the highest resolution that can be given + }) + if video_meta.get('landscape_image'): + thumbnails.append({ + 'id': 'landscape_image', + 'url': '%s%d%s' % (image_path, 2000, video_meta['landscape_image']) + }) + try: + formats = self._extract_m3u8_formats(video_url, display_id, 'mp4', headers={'Referer': 'https://www.rctiplus.com/'}) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + self.raise_geo_restricted(countries=['ID'], metadata_available=True) + else: + raise e + for f in formats: + if 'akamaized' in f['url'] or 'cloudfront' in f['url']: + f.setdefault('http_headers', {})['Referer'] = 'https://www.rctiplus.com/' # Referer header is required for akamai/cloudfront CDNs + + return { + 'id': video_meta.get('product_id') or video_json.get('product_id'), + 'title': dict_get(video_meta, ('title', 'name')) or dict_get(video_json, ('content_name', 'assets_name')), + 'display_id': display_id, + 'description': video_meta.get('summary'), + 'timestamp': video_meta.get('release_date') or video_json.get('start_date'), + 'duration': video_meta.get('duration'), + 'categories': [video_meta['genre']] if video_meta.get('genre') else None, + 'average_rating': video_meta.get('star_rating'), + 'series': video_meta.get('program_title') or video_json.get('program_title'), + 'season_number': video_meta.get('season'), + 'episode_number': video_meta.get('episode'), + 'channel': video_json.get('tv_name'), + 'channel_id': video_json.get('tv_id'), + 'formats': formats, + 'thumbnails': thumbnails, + 'is_live': video_type == 'live-event' and not is_upcoming, + 'was_live': video_type == 'missed-event', + 'live_status': 'is_upcoming' if is_upcoming else None, + 'release_timestamp': video_json.get('live_at'), + } + + +class RCTIPlusSeriesIE(RCTIPlusBaseIE): + _VALID_URL = r'https://www\.rctiplus\.com/programs/(?P<id>\d+)/(?P<display_id>[^/?#&]+)(?:/(?P<type>episodes|extras|clips))?' + _TESTS = [{ + 'url': 'https://www.rctiplus.com/programs/829/putri-untuk-pangeran', + 'playlist_mincount': 1019, + 'info_dict': { + 'id': '829', + 'title': 'Putri Untuk Pangeran', + 'description': 'md5:aca7b54d05bd95a67d4f4613cc1d622d', + 'age_limit': 2, + 'cast': ['Verrel Bramasta', 'Ranty Maria', 'Riza Syah', 'Ivan Fadilla', 'Nicole Parham', 'Dll', 'Aviv Elham'], + 'display_id': 'putri-untuk-pangeran', + 'tag': 'count:18', + }, + }, { # No episodes + 'url': 'https://www.rctiplus.com/programs/615/inews-pagi', + 'playlist_mincount': 388, + 'info_dict': { + 'id': '615', + 'title': 'iNews Pagi', + 'description': 'md5:f18ee3d4643cfb41c358e5a9b693ee04', + 'age_limit': 2, + 'tag': 'count:11', + 'display_id': 'inews-pagi', + } + }] + _AGE_RATINGS = { # Based off https://id.wikipedia.org/wiki/Sistem_rating_konten_televisi with additional ratings + 'S-SU': 2, + 'SU': 2, + 'P': 2, + 'A': 7, + 'R': 13, + 'R-R/1': 17, # Labelled as 17+ despite being R + 'D': 18, + } + + @classmethod + def suitable(cls, url): + return False if RCTIPlusIE.suitable(url) else super(RCTIPlusSeriesIE, cls).suitable(url) + + def _entries(self, url, display_id=None, note='Downloading entries JSON', metadata={}): + total_pages = 0 + try: + total_pages = self._call_api( + '%s&length=20&page=0' % url, + display_id, note)[1]['pagination']['total_page'] + except ExtractorError as e: + if 'not found' in str(e): + return [] + raise e + if total_pages <= 0: + return [] + + for page_num in range(1, total_pages + 1): + episode_list = self._call_api( + '%s&length=20&page=%s' % (url, page_num), + display_id, '%s page %s' % (note, page_num))[0] or [] + + for video_json in episode_list: + yield { + '_type': 'url', + 'url': video_json['share_link'], + 'ie_key': RCTIPlusIE.ie_key(), + 'id': video_json.get('product_id'), + 'title': video_json.get('title'), + 'display_id': video_json.get('title_code').replace('_', '-'), + 'description': video_json.get('summary'), + 'timestamp': video_json.get('release_date'), + 'duration': video_json.get('duration'), + 'season_number': video_json.get('season'), + 'episode_number': video_json.get('episode'), + **metadata + } + + def _series_entries(self, series_id, display_id=None, video_type=None, metadata={}): + if not video_type or video_type in 'episodes': + try: + seasons_list = self._call_api( + f'https://api.rctiplus.com/api/v1/program/{series_id}/season', + display_id, 'Downloading seasons list JSON')[0] + except ExtractorError as e: + if 'not found' not in str(e): + raise + seasons_list = [] + for season in seasons_list: + yield from self._entries( + f'https://api.rctiplus.com/api/v2/program/{series_id}/episode?season={season["season"]}', + display_id, f'Downloading season {season["season"]} episode entries', metadata) + if not video_type or video_type in 'extras': + yield from self._entries( + f'https://api.rctiplus.com/api/v2/program/{series_id}/extra?content_id=0', + display_id, 'Downloading extra entries', metadata) + if not video_type or video_type in 'clips': + yield from self._entries( + f'https://api.rctiplus.com/api/v2/program/{series_id}/clip?content_id=0', + display_id, 'Downloading clip entries', metadata) + + def _real_extract(self, url): + series_id, display_id, video_type = self._match_valid_url(url).group('id', 'display_id', 'type') + if video_type: + self.report_warning( + f'Only {video_type} will be downloaded. ' + f'To download everything from the series, remove "/{video_type}" from the URL') + + series_meta, meta_paths = self._call_api( + f'https://api.rctiplus.com/api/v1/program/{series_id}/detail', display_id, 'Downloading series metadata') + metadata = { + 'age_limit': try_get(series_meta, lambda x: self._AGE_RATINGS[x['age_restriction'][0]['code']]), + 'cast': traverse_obj(series_meta, (('starring', 'creator', 'writer'), ..., 'name'), + expected_type=lambda x: strip_or_none(x) or None), + 'tag': traverse_obj(series_meta, ('tag', ..., 'name'), + expected_type=lambda x: strip_or_none(x) or None), + } + return self.playlist_result( + self._series_entries(series_id, display_id, video_type, metadata), series_id, + series_meta.get('title'), series_meta.get('summary'), display_id=display_id, **metadata) + + +class RCTIPlusTVIE(RCTIPlusBaseIE): + _VALID_URL = r'https://www\.rctiplus\.com/((tv/(?P<tvname>\w+))|(?P<eventname>live-event|missed-event))' + _TESTS = [{ + 'url': 'https://www.rctiplus.com/tv/rcti', + 'info_dict': { + 'id': 'v_lt1', + 'title': 'RCTI', + 'ext': 'mp4', + 'timestamp': 1546344000, + 'upload_date': '20190101', + }, + 'params': { + 'skip_download': True, + } + }, { + # Returned video will always change + 'url': 'https://www.rctiplus.com/live-event', + 'only_matching': True, + }, { + # Returned video will also always change + 'url': 'https://www.rctiplus.com/missed-event', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if RCTIPlusIE.suitable(url) else super(RCTIPlusTVIE, cls).suitable(url) + + def _real_extract(self, url): + match = self._match_valid_url(url).groupdict() + tv_id = match.get('tvname') or match.get('eventname') + webpage = self._download_webpage(url, tv_id) + video_type, video_id = self._search_regex( + r'url\s*:\s*["\']https://api\.rctiplus\.com/api/v./(?P<type>[^/]+)/(?P<id>\d+)/url', + webpage, 'video link', group=('type', 'id')) + return self.url_result(f'https://www.rctiplus.com/{video_type}/{video_id}/{tv_id}', 'RCTIPlus') diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rds.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rds.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rds.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rds.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/recurbate.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/recurbate.py new file mode 100644 index 0000000..d7294cb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/recurbate.py @@ -0,0 +1,42 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ExtractorError, merge_dicts + + +class RecurbateIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?recurbate\.com/play\.php\?video=(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://recurbate.com/play.php?video=39161415', + 'md5': 'dd2b4ec57aa3e3572cb5cf0997fca99f', + 'info_dict': { + 'id': '39161415', + 'ext': 'mp4', + 'description': 'md5:db48d09e4d93fc715f47fd3d6b7edd51', + 'title': 'Performer zsnicole33 show on 2022-10-25 20:23, Chaturbate Archive – Recurbate', + 'age_limit': 18, + }, + 'skip': 'Website require membership.', + }] + + def _real_extract(self, url): + SUBSCRIPTION_MISSING_MESSAGE = 'This video is only available for registered users; Set your authenticated browser user agent via the --user-agent parameter.' + video_id = self._match_id(url) + try: + webpage = self._download_webpage(url, video_id) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + self.raise_login_required(msg=SUBSCRIPTION_MISSING_MESSAGE, method='cookies') + raise + token = self._html_search_regex(r'data-token="([^"]+)"', webpage, 'token') + video_url = f'https://recurbate.com/api/get.php?video={video_id}&token={token}' + + video_webpage = self._download_webpage(video_url, video_id) + if video_webpage == 'shall_subscribe': + self.raise_login_required(msg=SUBSCRIPTION_MISSING_MESSAGE, method='cookies') + entries = self._parse_html5_media_entries(video_url, video_webpage, video_id) + return merge_dicts({ + 'id': video_id, + 'title': self._html_extract_title(webpage, 'title'), + 'description': self._og_search_description(webpage), + 'age_limit': self._rta_search(webpage), + }, entries[0]) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/redbee.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/redbee.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/redbee.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/redbee.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/redbulltv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/redbulltv.py new file mode 100644 index 0000000..d1de249 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/redbulltv.py @@ -0,0 +1,224 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + float_or_none, + ExtractorError, +) + + +class RedBullTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?redbull(?:\.tv|\.com(?:/[^/]+)?(?:/tv)?)(?:/events/[^/]+)?/(?:videos?|live|(?:film|episode)s)/(?P<id>AP-\w+)' + _TESTS = [{ + # film + 'url': 'https://www.redbull.tv/video/AP-1Q6XCDTAN1W11', + 'md5': 'fb0445b98aa4394e504b413d98031d1f', + 'info_dict': { + 'id': 'AP-1Q6XCDTAN1W11', + 'ext': 'mp4', + 'title': 'ABC of... WRC - ABC of... S1E6', + 'description': 'md5:5c7ed8f4015c8492ecf64b6ab31e7d31', + 'duration': 1582.04, + }, + }, { + # episode + 'url': 'https://www.redbull.tv/video/AP-1PMHKJFCW1W11', + 'info_dict': { + 'id': 'AP-1PMHKJFCW1W11', + 'ext': 'mp4', + 'title': 'Grime - Hashtags S2E4', + 'description': 'md5:5546aa612958c08a98faaad4abce484d', + 'duration': 904, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://www.redbull.com/int-en/tv/video/AP-1UWHCAR9S1W11/rob-meets-sam-gaze?playlist=playlists::3f81040a-2f31-4832-8e2e-545b1d39d173', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/us-en/videos/AP-1YM9QCYE52111', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/us-en/events/AP-1XV2K61Q51W11/live/AP-1XUJ86FDH1W11', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/films/AP-1ZSMAW8FH2111', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/episodes/AP-1TQWK7XE11W11', + 'only_matching': True, + }] + + def extract_info(self, video_id): + session = self._download_json( + 'https://api.redbull.tv/v3/session', video_id, + note='Downloading access token', query={ + 'category': 'personal_computer', + 'os_family': 'http', + }) + if session.get('code') == 'error': + raise ExtractorError('%s said: %s' % ( + self.IE_NAME, session['message'])) + token = session['token'] + + try: + video = self._download_json( + 'https://api.redbull.tv/v3/products/' + video_id, + video_id, note='Downloading video information', + headers={'Authorization': token} + ) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 404: + error_message = self._parse_json( + e.cause.response.read().decode(), video_id)['error'] + raise ExtractorError('%s said: %s' % ( + self.IE_NAME, error_message), expected=True) + raise + + title = video['title'].strip() + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + 'https://dms.redbull.tv/v3/%s/%s/playlist.m3u8' % (video_id, token), + video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls') + + for resource in video.get('resources', []): + if resource.startswith('closed_caption_'): + splitted_resource = resource.split('_') + if splitted_resource[2]: + subtitles.setdefault('en', []).append({ + 'url': 'https://resources.redbull.tv/%s/%s' % (video_id, resource), + 'ext': splitted_resource[2], + }) + + subheading = video.get('subheading') + if subheading: + title += ' - %s' % subheading + + return { + 'id': video_id, + 'title': title, + 'description': video.get('long_description') or video.get( + 'short_description'), + 'duration': float_or_none(video.get('duration'), scale=1000), + 'formats': formats, + 'subtitles': subtitles, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + return self.extract_info(video_id) + + +class RedBullEmbedIE(RedBullTVIE): # XXX: Do not subclass from concrete IE + _VALID_URL = r'https?://(?:www\.)?redbull\.com/embed/(?P<id>rrn:content:[^:]+:[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}:[a-z]{2}-[A-Z]{2,3})' + _TESTS = [{ + # HLS manifest accessible only using assetId + 'url': 'https://www.redbull.com/embed/rrn:content:episode-videos:f3021f4f-3ed4-51ac-915a-11987126e405:en-INT', + 'only_matching': True, + }] + _VIDEO_ESSENSE_TMPL = '''... on %s { + videoEssence { + attributes + } + }''' + + def _real_extract(self, url): + rrn_id = self._match_id(url) + asset_id = self._download_json( + 'https://edge-graphql.crepo-production.redbullaws.com/v1/graphql', + rrn_id, headers={ + 'Accept': 'application/json', + 'API-KEY': 'e90a1ff11335423998b100c929ecc866', + }, query={ + 'query': '''{ + resource(id: "%s", enforceGeoBlocking: false) { + %s + %s + } +}''' % (rrn_id, self._VIDEO_ESSENSE_TMPL % 'LiveVideo', self._VIDEO_ESSENSE_TMPL % 'VideoResource'), + })['data']['resource']['videoEssence']['attributes']['assetId'] + return self.extract_info(asset_id) + + +class RedBullTVRrnContentIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?redbull\.com/(?P<region>[a-z]{2,3})-(?P<lang>[a-z]{2})/tv/(?:video|live|film)/(?P<id>rrn:content:[^:]+:[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})' + _TESTS = [{ + 'url': 'https://www.redbull.com/int-en/tv/video/rrn:content:live-videos:e3e6feb4-e95f-50b7-962a-c70f8fd13c73/mens-dh-finals-fort-william', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/tv/video/rrn:content:videos:a36a0f36-ff1b-5db8-a69d-ee11a14bf48b/tn-ts-style?playlist=rrn:content:event-profiles:83f05926-5de8-5389-b5e4-9bb312d715e8:extras', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/tv/film/rrn:content:films:d1f4d00e-4c04-5d19-b510-a805ffa2ab83/follow-me', + 'only_matching': True, + }] + + def _real_extract(self, url): + region, lang, rrn_id = self._match_valid_url(url).groups() + rrn_id += ':%s-%s' % (lang, region.upper()) + return self.url_result( + 'https://www.redbull.com/embed/' + rrn_id, + RedBullEmbedIE.ie_key(), rrn_id) + + +class RedBullIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?redbull\.com/(?P<region>[a-z]{2,3})-(?P<lang>[a-z]{2})/(?P<type>(?:episode|film|(?:(?:recap|trailer)-)?video)s|live)/(?!AP-|rrn:content:)(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://www.redbull.com/int-en/episodes/grime-hashtags-s02-e04', + 'md5': 'db8271a7200d40053a1809ed0dd574ff', + 'info_dict': { + 'id': 'AA-1MT8DQWA91W14', + 'ext': 'mp4', + 'title': 'Grime - Hashtags S2E4', + 'description': 'md5:5546aa612958c08a98faaad4abce484d', + }, + }, { + 'url': 'https://www.redbull.com/int-en/films/kilimanjaro-mountain-of-greatness', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/recap-videos/uci-mountain-bike-world-cup-2017-mens-xco-finals-from-vallnord', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/trailer-videos/kings-of-content', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/videos/tnts-style-red-bull-dance-your-style-s1-e12', + 'only_matching': True, + }, { + 'url': 'https://www.redbull.com/int-en/live/mens-dh-finals-fort-william', + 'only_matching': True, + }, { + # only available on the int-en website so a fallback is need for the API + # https://www.redbull.com/v3/api/graphql/v1/v3/query/en-GB>en-INT?filter[uriSlug]=fia-wrc-saturday-recap-estonia&rb3Schema=v1:hero + 'url': 'https://www.redbull.com/gb-en/live/fia-wrc-saturday-recap-estonia', + 'only_matching': True, + }] + _INT_FALLBACK_LIST = ['de', 'en', 'es', 'fr'] + _LAT_FALLBACK_MAP = ['ar', 'bo', 'car', 'cl', 'co', 'mx', 'pe'] + + def _real_extract(self, url): + region, lang, filter_type, display_id = self._match_valid_url(url).groups() + if filter_type == 'episodes': + filter_type = 'episode-videos' + elif filter_type == 'live': + filter_type = 'live-videos' + + regions = [region.upper()] + if region != 'int': + if region in self._LAT_FALLBACK_MAP: + regions.append('LAT') + if lang in self._INT_FALLBACK_LIST: + regions.append('INT') + locale = '>'.join(['%s-%s' % (lang, reg) for reg in regions]) + + rrn_id = self._download_json( + 'https://www.redbull.com/v3/api/graphql/v1/v3/query/' + locale, + display_id, query={ + 'filter[type]': filter_type, + 'filter[uriSlug]': display_id, + 'rb3Schema': 'v1:hero', + })['data']['id'] + + return self.url_result( + 'https://www.redbull.com/embed/' + rrn_id, + RedBullEmbedIE.ie_key(), rrn_id) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/reddit.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/reddit.py new file mode 100644 index 0000000..62f669f --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/reddit.py @@ -0,0 +1,353 @@ +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + float_or_none, + int_or_none, + traverse_obj, + try_get, + unescapeHTML, + urlencode_postdata, + url_or_none, +) + + +class RedditIE(InfoExtractor): + _NETRC_MACHINE = 'reddit' + _VALID_URL = r'https?://(?P<host>(?:\w+\.)?reddit(?:media)?\.com)/(?P<slug>(?:(?:r|user)/[^/]+/)?comments/(?P<id>[^/?#&]+))' + _TESTS = [{ + 'url': 'https://www.reddit.com/r/videos/comments/6rrwyj/that_small_heart_attack/', + 'info_dict': { + 'id': 'zv89llsvexdz', + 'ext': 'mp4', + 'display_id': '6rrwyj', + 'title': 'That small heart attack.', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:4', + 'timestamp': 1501941939, + 'upload_date': '20170805', + 'uploader': 'Antw87', + 'duration': 12, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 0, + 'channel_id': 'videos', + }, + 'params': { + 'skip_download': True, + }, + }, { + # 1080p fallback format + 'url': 'https://www.reddit.com/r/aww/comments/90bu6w/heat_index_was_110_degrees_so_we_offered_him_a/', + 'md5': '8b5902cfda3006bf90faea7adf765a49', + 'info_dict': { + 'id': 'gyh95hiqc0b11', + 'ext': 'mp4', + 'display_id': '90bu6w', + 'title': 'Heat index was 110 degrees so we offered him a cold drink. He went for a full body soak instead', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:7', + 'timestamp': 1532051078, + 'upload_date': '20180720', + 'uploader': 'FootLoosePickleJuice', + 'duration': 14, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 0, + 'channel_id': 'aww', + }, + }, { + # User post + 'url': 'https://www.reddit.com/user/creepyt0es/comments/nip71r/i_plan_to_make_more_stickers_and_prints_check/', + 'info_dict': { + 'id': 'zasobba6wp071', + 'ext': 'mp4', + 'display_id': 'nip71r', + 'title': 'I plan to make more stickers and prints! Check them out on my Etsy! Or get them through my Patreon. Links below.', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:5', + 'timestamp': 1621709093, + 'upload_date': '20210522', + 'uploader': 'creepyt0es', + 'duration': 6, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 0, + 'channel_id': 'u_creepyt0es', + }, + 'params': { + 'skip_download': True, + }, + }, { + # videos embedded in reddit text post + 'url': 'https://www.reddit.com/r/KamenRider/comments/wzqkxp/finale_kamen_rider_revice_episode_50_family_to/', + 'playlist_count': 2, + 'info_dict': { + 'id': 'wzqkxp', + 'title': 'md5:72d3d19402aa11eff5bd32fc96369b37', + }, + }, { + # crossposted reddit-hosted media + 'url': 'https://www.reddit.com/r/dumbfuckers_club/comments/zjjw82/cringe/', + 'md5': '746180895c7b75a9d6b05341f507699a', + 'info_dict': { + 'id': 'a1oneun6pa5a1', + 'ext': 'mp4', + 'display_id': 'zjjw82', + 'title': 'Cringe', + 'uploader': 'Otaku-senpai69420', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'upload_date': '20221212', + 'timestamp': 1670812309, + 'duration': 16, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'age_limit': 0, + 'channel_id': 'dumbfuckers_club', + }, + }, { + # post link without subreddit + 'url': 'https://www.reddit.com/comments/124pp33', + 'md5': '15eec9d828adcef4468b741a7e45a395', + 'info_dict': { + 'id': 'antsenjc2jqa1', + 'ext': 'mp4', + 'display_id': '124pp33', + 'title': 'Harmless prank of some old friends', + 'uploader': 'Dudezila', + 'channel_id': 'ContagiousLaughter', + 'duration': 17, + 'upload_date': '20230328', + 'timestamp': 1680012043, + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'age_limit': 0, + 'comment_count': int, + 'dislike_count': int, + 'like_count': int, + }, + }, { + # quarantined subreddit post + 'url': 'https://old.reddit.com/r/GenZedong/comments/12fujy3/based_hasan/', + 'md5': '3156ea69e3c1f1b6259683c5abd36e71', + 'info_dict': { + 'id': '8bwtclfggpsa1', + 'ext': 'mp4', + 'display_id': '12fujy3', + 'title': 'Based Hasan?', + 'uploader': 'KingNigelXLII', + 'channel_id': 'GenZedong', + 'duration': 16, + 'upload_date': '20230408', + 'timestamp': 1680979138, + 'age_limit': 0, + 'comment_count': int, + 'dislike_count': int, + 'like_count': int, + }, + 'skip': 'Requires account that has opted-in to the GenZedong subreddit', + }, { + 'url': 'https://www.reddit.com/r/videos/comments/6rrwyj', + 'only_matching': True, + }, { + # imgur + 'url': 'https://www.reddit.com/r/MadeMeSmile/comments/6t7wi5/wait_for_it/', + 'only_matching': True, + }, { + # imgur @ old reddit + 'url': 'https://old.reddit.com/r/MadeMeSmile/comments/6t7wi5/wait_for_it/', + 'only_matching': True, + }, { + # streamable + 'url': 'https://www.reddit.com/r/videos/comments/6t7sg9/comedians_hilarious_joke_about_the_guam_flag/', + 'only_matching': True, + }, { + # youtube + 'url': 'https://www.reddit.com/r/videos/comments/6t75wq/southern_man_tries_to_speak_without_an_accent/', + 'only_matching': True, + }, { + # reddit video @ nm reddit + 'url': 'https://nm.reddit.com/r/Cricket/comments/8idvby/lousy_cameraman_finds_himself_in_cairns_line_of/', + 'only_matching': True, + }, { + 'url': 'https://www.redditmedia.com/r/serbia/comments/pu9wbx/ako_vu%C4%8Di%C4%87_izgubi_izbore_ja_%C4%87u_da_crknem/', + 'only_matching': True, + }] + + def _perform_login(self, username, password): + captcha = self._download_json( + 'https://www.reddit.com/api/requires_captcha/login.json', None, + 'Checking login requirement')['required'] + if captcha: + raise ExtractorError('Reddit is requiring captcha before login', expected=True) + login = self._download_json( + f'https://www.reddit.com/api/login/{username}', None, data=urlencode_postdata({ + 'op': 'login-main', + 'user': username, + 'passwd': password, + 'api_type': 'json', + }), note='Logging in', errnote='Login request failed') + errors = '; '.join(traverse_obj(login, ('json', 'errors', ..., 1))) + if errors: + raise ExtractorError(f'Unable to login, Reddit API says {errors}', expected=True) + elif not traverse_obj(login, ('json', 'data', 'cookie', {str})): + raise ExtractorError('Unable to login, no cookie was returned') + + def _real_extract(self, url): + host, slug, video_id = self._match_valid_url(url).group('host', 'slug', 'id') + + data = self._download_json( + f'https://{host}/{slug}/.json', video_id, fatal=False, expected_status=403) + if not data: + fallback_host = 'old.reddit.com' if host != 'old.reddit.com' else 'www.reddit.com' + self.to_screen(f'{host} request failed, retrying with {fallback_host}') + data = self._download_json( + f'https://{fallback_host}/{slug}/.json', video_id, expected_status=403) + + if traverse_obj(data, 'error') == 403: + reason = data.get('reason') + if reason == 'quarantined': + self.raise_login_required('Quarantined subreddit; an account that has opted in is required') + elif reason == 'private': + self.raise_login_required('Private subreddit; an account that has been approved is required') + else: + raise ExtractorError(f'HTTP Error 403 Forbidden; reason given: {reason}') + + data = data[0]['data']['children'][0]['data'] + video_url = data['url'] + + over_18 = data.get('over_18') + if over_18 is True: + age_limit = 18 + elif over_18 is False: + age_limit = 0 + else: + age_limit = None + + thumbnails = [] + + def add_thumbnail(src): + if not isinstance(src, dict): + return + thumbnail_url = url_or_none(src.get('url')) + if not thumbnail_url: + return + thumbnails.append({ + 'url': unescapeHTML(thumbnail_url), + 'width': int_or_none(src.get('width')), + 'height': int_or_none(src.get('height')), + 'http_headers': {'Accept': '*/*'}, + }) + + for image in try_get(data, lambda x: x['preview']['images']) or []: + if not isinstance(image, dict): + continue + add_thumbnail(image.get('source')) + resolutions = image.get('resolutions') + if isinstance(resolutions, list): + for resolution in resolutions: + add_thumbnail(resolution) + + info = { + 'title': data.get('title'), + 'thumbnails': thumbnails, + 'timestamp': float_or_none(data.get('created_utc')), + 'uploader': data.get('author'), + 'channel_id': data.get('subreddit'), + 'like_count': int_or_none(data.get('ups')), + 'dislike_count': int_or_none(data.get('downs')), + 'comment_count': int_or_none(data.get('num_comments')), + 'age_limit': age_limit, + } + + parsed_url = urllib.parse.urlparse(video_url) + + # Check for embeds in text posts, or else raise to avoid recursing into the same reddit URL + if 'reddit.com' in parsed_url.netloc and f'/{video_id}/' in parsed_url.path: + entries = [] + for media in traverse_obj(data, ('media_metadata', ...), expected_type=dict): + if not media.get('id') or media.get('e') != 'RedditVideo': + continue + formats = [] + if media.get('hlsUrl'): + formats.extend(self._extract_m3u8_formats( + unescapeHTML(media['hlsUrl']), video_id, 'mp4', m3u8_id='hls', fatal=False)) + if media.get('dashUrl'): + formats.extend(self._extract_mpd_formats( + unescapeHTML(media['dashUrl']), video_id, mpd_id='dash', fatal=False)) + if formats: + entries.append({ + 'id': media['id'], + 'display_id': video_id, + 'formats': formats, + **info, + }) + if entries: + return self.playlist_result(entries, video_id, info.get('title')) + raise ExtractorError('No media found', expected=True) + + # Check if media is hosted on reddit: + reddit_video = traverse_obj(data, ( + (None, ('crosspost_parent_list', ...)), ('secure_media', 'media'), 'reddit_video'), get_all=False) + if reddit_video: + playlist_urls = [ + try_get(reddit_video, lambda x: unescapeHTML(x[y])) + for y in ('dash_url', 'hls_url') + ] + + # Update video_id + display_id = video_id + video_id = self._search_regex( + r'https?://v\.redd\.it/(?P<id>[^/?#&]+)', reddit_video['fallback_url'], + 'video_id', default=display_id) + + dash_playlist_url = playlist_urls[0] or f'https://v.redd.it/{video_id}/DASHPlaylist.mpd' + hls_playlist_url = playlist_urls[1] or f'https://v.redd.it/{video_id}/HLSPlaylist.m3u8' + + formats = [{ + 'url': unescapeHTML(reddit_video['fallback_url']), + 'height': int_or_none(reddit_video.get('height')), + 'width': int_or_none(reddit_video.get('width')), + 'tbr': int_or_none(reddit_video.get('bitrate_kbps')), + 'acodec': 'none', + 'vcodec': 'h264', + 'ext': 'mp4', + 'format_id': 'fallback', + 'format_note': 'DASH video, mp4_dash', + }] + hls_fmts, subtitles = self._extract_m3u8_formats_and_subtitles( + hls_playlist_url, display_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(hls_fmts) + dash_fmts, dash_subs = self._extract_mpd_formats_and_subtitles( + dash_playlist_url, display_id, mpd_id='dash', fatal=False) + formats.extend(dash_fmts) + self._merge_subtitles(dash_subs, target=subtitles) + + return { + **info, + 'id': video_id, + 'display_id': display_id, + 'formats': formats, + 'subtitles': subtitles, + 'duration': int_or_none(reddit_video.get('duration')), + } + + if parsed_url.netloc == 'v.redd.it': + self.raise_no_formats('This video is processing', expected=True, video_id=video_id) + return { + **info, + 'id': parsed_url.path.split('/')[1], + 'display_id': video_id, + } + + # Not hosted on reddit, must continue extraction + return { + **info, + 'display_id': video_id, + '_type': 'url_transparent', + 'url': video_url, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/redgifs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/redgifs.py new file mode 100644 index 0000000..f945320 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/redgifs.py @@ -0,0 +1,260 @@ +import functools + +from .common import InfoExtractor +from ..compat import compat_parse_qs +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + qualities, + try_get, + OnDemandPagedList, +) + + +class RedGifsBaseInfoExtractor(InfoExtractor): + _FORMATS = { + 'gif': 250, + 'sd': 480, + 'hd': None, + } + + _API_HEADERS = { + 'referer': 'https://www.redgifs.com/', + 'origin': 'https://www.redgifs.com', + 'content-type': 'application/json', + } + + def _parse_gif_data(self, gif_data): + video_id = gif_data.get('id') + quality = qualities(tuple(self._FORMATS.keys())) + + orig_height = int_or_none(gif_data.get('height')) + aspect_ratio = try_get(gif_data, lambda x: orig_height / x['width']) + + formats = [] + for format_id, height in self._FORMATS.items(): + video_url = gif_data['urls'].get(format_id) + if not video_url: + continue + height = min(orig_height, height or orig_height) + formats.append({ + 'url': video_url, + 'format_id': format_id, + 'width': height * aspect_ratio if aspect_ratio else None, + 'height': height, + 'quality': quality(format_id), + }) + + return { + 'id': video_id, + 'webpage_url': f'https://redgifs.com/watch/{video_id}', + 'extractor_key': RedGifsIE.ie_key(), + 'extractor': 'RedGifs', + 'title': ' '.join(gif_data.get('tags') or []) or 'RedGifs', + 'timestamp': int_or_none(gif_data.get('createDate')), + 'uploader': gif_data.get('userName'), + 'duration': int_or_none(gif_data.get('duration')), + 'view_count': int_or_none(gif_data.get('views')), + 'like_count': int_or_none(gif_data.get('likes')), + 'categories': gif_data.get('tags') or [], + 'tags': gif_data.get('tags'), + 'age_limit': 18, + 'formats': formats, + } + + def _fetch_oauth_token(self, video_id): + # https://github.com/Redgifs/api/wiki/Temporary-tokens + auth = self._download_json('https://api.redgifs.com/v2/auth/temporary', + video_id, note='Fetching temporary token') + if not auth.get('token'): + raise ExtractorError('Unable to get temporary token') + self._API_HEADERS['authorization'] = f'Bearer {auth["token"]}' + + def _call_api(self, ep, video_id, *args, **kwargs): + for first_attempt in True, False: + if 'authorization' not in self._API_HEADERS: + self._fetch_oauth_token(video_id) + try: + headers = dict(self._API_HEADERS) + headers['x-customheader'] = f'https://www.redgifs.com/watch/{video_id}' + data = self._download_json( + f'https://api.redgifs.com/v2/{ep}', video_id, headers=headers, *args, **kwargs) + break + except ExtractorError as e: + if first_attempt and isinstance(e.cause, HTTPError) and e.cause.status == 401: + del self._API_HEADERS['authorization'] # refresh the token + continue + raise + + if 'error' in data: + raise ExtractorError(f'RedGifs said: {data["error"]}', expected=True, video_id=video_id) + return data + + def _fetch_page(self, ep, video_id, query, page): + query['page'] = page + 1 + data = self._call_api( + ep, video_id, query=query, note=f'Downloading JSON metadata page {page + 1}') + + for entry in data['gifs']: + yield self._parse_gif_data(entry) + + def _prepare_api_query(self, query, fields): + api_query = [ + (field_name, query.get(field_name, (default,))[0]) + for field_name, default in fields.items()] + + return {key: val for key, val in api_query if val is not None} + + def _paged_entries(self, ep, item_id, query, fields): + page = int_or_none(query.get('page', (None,))[0]) + page_fetcher = functools.partial( + self._fetch_page, ep, item_id, self._prepare_api_query(query, fields)) + return page_fetcher(page) if page else OnDemandPagedList(page_fetcher, self._PAGE_SIZE) + + +class RedGifsIE(RedGifsBaseInfoExtractor): + _VALID_URL = r'https?://(?:(?:www\.)?redgifs\.com/watch/|thumbs2\.redgifs\.com/)(?P<id>[^-/?#\.]+)' + _TESTS = [{ + 'url': 'https://www.redgifs.com/watch/squeakyhelplesswisent', + 'info_dict': { + 'id': 'squeakyhelplesswisent', + 'ext': 'mp4', + 'title': 'Hotwife Legs Thick', + 'timestamp': 1636287915, + 'upload_date': '20211107', + 'uploader': 'ignored52', + 'duration': 16, + 'view_count': int, + 'like_count': int, + 'categories': list, + 'age_limit': 18, + 'tags': list, + } + }, { + 'url': 'https://thumbs2.redgifs.com/SqueakyHelplessWisent-mobile.mp4#t=0', + 'info_dict': { + 'id': 'squeakyhelplesswisent', + 'ext': 'mp4', + 'title': 'Hotwife Legs Thick', + 'timestamp': 1636287915, + 'upload_date': '20211107', + 'uploader': 'ignored52', + 'duration': 16, + 'view_count': int, + 'like_count': int, + 'categories': list, + 'age_limit': 18, + 'tags': list, + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url).lower() + video_info = self._call_api( + f'gifs/{video_id}?views=yes', video_id, note='Downloading video info') + return self._parse_gif_data(video_info['gif']) + + +class RedGifsSearchIE(RedGifsBaseInfoExtractor): + IE_DESC = 'Redgifs search' + _VALID_URL = r'https?://(?:www\.)?redgifs\.com/browse\?(?P<query>[^#]+)' + _PAGE_SIZE = 80 + _TESTS = [ + { + 'url': 'https://www.redgifs.com/browse?tags=Lesbian', + 'info_dict': { + 'id': 'tags=Lesbian', + 'title': 'Lesbian', + 'description': 'RedGifs search for Lesbian, ordered by trending' + }, + 'playlist_mincount': 100, + }, + { + 'url': 'https://www.redgifs.com/browse?type=g&order=latest&tags=Lesbian', + 'info_dict': { + 'id': 'type=g&order=latest&tags=Lesbian', + 'title': 'Lesbian', + 'description': 'RedGifs search for Lesbian, ordered by latest' + }, + 'playlist_mincount': 100, + }, + { + 'url': 'https://www.redgifs.com/browse?type=g&order=latest&tags=Lesbian&page=2', + 'info_dict': { + 'id': 'type=g&order=latest&tags=Lesbian&page=2', + 'title': 'Lesbian', + 'description': 'RedGifs search for Lesbian, ordered by latest' + }, + 'playlist_count': 80, + } + ] + + def _real_extract(self, url): + query_str = self._match_valid_url(url).group('query') + query = compat_parse_qs(query_str) + if not query.get('tags'): + raise ExtractorError('Invalid query tags', expected=True) + + tags = query.get('tags')[0] + order = query.get('order', ('trending',))[0] + + query['search_text'] = [tags] + entries = self._paged_entries('gifs/search', query_str, query, { + 'search_text': None, + 'order': 'trending', + 'type': None, + }) + + return self.playlist_result( + entries, query_str, tags, f'RedGifs search for {tags}, ordered by {order}') + + +class RedGifsUserIE(RedGifsBaseInfoExtractor): + IE_DESC = 'Redgifs user' + _VALID_URL = r'https?://(?:www\.)?redgifs\.com/users/(?P<username>[^/?#]+)(?:\?(?P<query>[^#]+))?' + _PAGE_SIZE = 30 + _TESTS = [ + { + 'url': 'https://www.redgifs.com/users/lamsinka89', + 'info_dict': { + 'id': 'lamsinka89', + 'title': 'lamsinka89', + 'description': 'RedGifs user lamsinka89, ordered by recent' + }, + 'playlist_mincount': 100, + }, + { + 'url': 'https://www.redgifs.com/users/lamsinka89?page=3', + 'info_dict': { + 'id': 'lamsinka89?page=3', + 'title': 'lamsinka89', + 'description': 'RedGifs user lamsinka89, ordered by recent' + }, + 'playlist_count': 30, + }, + { + 'url': 'https://www.redgifs.com/users/lamsinka89?order=best&type=g', + 'info_dict': { + 'id': 'lamsinka89?order=best&type=g', + 'title': 'lamsinka89', + 'description': 'RedGifs user lamsinka89, ordered by best' + }, + 'playlist_mincount': 100, + } + ] + + def _real_extract(self, url): + username, query_str = self._match_valid_url(url).group('username', 'query') + playlist_id = f'{username}?{query_str}' if query_str else username + + query = compat_parse_qs(query_str) + order = query.get('order', ('recent',))[0] + + entries = self._paged_entries(f'users/{username}/search', playlist_id, query, { + 'order': 'recent', + 'type': None, + }) + + return self.playlist_result( + entries, playlist_id, username, f'RedGifs user {username}, ordered by {order}') diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/redtube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/redtube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/redtube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/redtube.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/regiotv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/regiotv.py new file mode 100644 index 0000000..edb6ae5 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/regiotv.py @@ -0,0 +1,55 @@ +from .common import InfoExtractor +from ..networking import Request +from ..utils import xpath_text, xpath_with_ns + + +class RegioTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?regio-tv\.de/video/(?P<id>[0-9]+)' + _TESTS = [{ + 'url': 'http://www.regio-tv.de/video/395808.html', + 'info_dict': { + 'id': '395808', + 'ext': 'mp4', + 'title': 'Wir in Ludwigsburg', + 'description': 'Mit unseren zuckersüßen Adventskindern, außerdem besuchen wir die Abendsterne!', + } + }, { + 'url': 'http://www.regio-tv.de/video/395808', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + + key = self._search_regex( + r'key\s*:\s*(["\'])(?P<key>.+?)\1', webpage, 'key', group='key') + title = self._og_search_title(webpage) + + SOAP_TEMPLATE = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><{0} xmlns="http://v.telvi.de/"><key xsi:type="xsd:string">{1}</key></{0}></soap:Body></soap:Envelope>' + + request = Request( + 'http://v.telvi.de/', + SOAP_TEMPLATE.format('GetHTML5VideoData', key).encode('utf-8')) + video_data = self._download_xml(request, video_id, 'Downloading video XML') + + NS_MAP = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'soap': 'http://schemas.xmlsoap.org/soap/envelope/', + } + + video_url = xpath_text( + video_data, xpath_with_ns('.//video', NS_MAP), 'video url', fatal=True) + thumbnail = xpath_text( + video_data, xpath_with_ns('.//image', NS_MAP), 'thumbnail') + description = self._og_search_description( + webpage) or self._html_search_meta('description', webpage) + + return { + 'id': video_id, + 'url': video_url, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rentv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rentv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rentv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rentv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/restudy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/restudy.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/restudy.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/restudy.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/reuters.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/reuters.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/reuters.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/reuters.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/reverbnation.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/reverbnation.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/reverbnation.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/reverbnation.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rheinmaintv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rheinmaintv.py new file mode 100644 index 0000000..c3b352d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rheinmaintv.py @@ -0,0 +1,94 @@ +from .common import InfoExtractor +from ..utils import extract_attributes, merge_dicts, remove_end + + +class RheinMainTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rheinmaintv\.de/sendungen/(?:[\w-]+/)*(?P<video_id>(?P<display_id>[\w-]+)/vom-\d{2}\.\d{2}\.\d{4}(?:/\d+)?)' + _TESTS = [{ + 'url': 'https://www.rheinmaintv.de/sendungen/beitrag-video/auf-dem-weg-zur-deutschen-meisterschaft/vom-07.11.2022/', + 'info_dict': { + 'id': 'auf-dem-weg-zur-deutschen-meisterschaft-vom-07.11.2022', + 'ext': 'ismv', # ismv+isma will be merged into mp4 + 'alt_title': 'Auf dem Weg zur Deutschen Meisterschaft', + 'title': 'Auf dem Weg zur Deutschen Meisterschaft', + 'upload_date': '20221108', + 'view_count': int, + 'display_id': 'auf-dem-weg-zur-deutschen-meisterschaft', + 'thumbnail': r're:^https://.+\.jpg', + 'description': 'md5:48c59b74192bc819a9b34af1d5ed1eb9', + 'timestamp': 1667933057, + 'duration': 243.0, + }, + 'params': {'skip_download': 'ism'}, + }, { + 'url': 'https://www.rheinmaintv.de/sendungen/beitrag-video/formationsgemeinschaft-rhein-main-bei-den-deutschen-meisterschaften/vom-14.11.2022/', + 'info_dict': { + 'id': 'formationsgemeinschaft-rhein-main-bei-den-deutschen-meisterschaften-vom-14.11.2022', + 'ext': 'ismv', + 'title': 'Formationsgemeinschaft Rhein-Main bei den Deutschen Meisterschaften', + 'timestamp': 1668526214, + 'display_id': 'formationsgemeinschaft-rhein-main-bei-den-deutschen-meisterschaften', + 'alt_title': 'Formationsgemeinschaft Rhein-Main bei den Deutschen Meisterschaften', + 'view_count': int, + 'thumbnail': r're:^https://.+\.jpg', + 'duration': 345.0, + 'description': 'md5:9370ba29526984006c2cba1372e5c5a0', + 'upload_date': '20221115', + }, + 'params': {'skip_download': 'ism'}, + }, { + 'url': 'https://www.rheinmaintv.de/sendungen/beitrag-video/casino-mainz-bei-den-deutschen-meisterschaften/vom-14.11.2022/', + 'info_dict': { + 'id': 'casino-mainz-bei-den-deutschen-meisterschaften-vom-14.11.2022', + 'ext': 'ismv', + 'title': 'Casino Mainz bei den Deutschen Meisterschaften', + 'view_count': int, + 'timestamp': 1668527402, + 'alt_title': 'Casino Mainz bei den Deutschen Meisterschaften', + 'upload_date': '20221115', + 'display_id': 'casino-mainz-bei-den-deutschen-meisterschaften', + 'duration': 348.0, + 'thumbnail': r're:^https://.+\.jpg', + 'description': 'md5:70fc1660eeba96da17199e5bdff4c0aa', + }, + 'params': {'skip_download': 'ism'}, + }, { + 'url': 'https://www.rheinmaintv.de/sendungen/beitrag-video/bricks4kids/vom-22.06.2022/', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + display_id = mobj.group('display_id') + video_id = mobj.group('video_id').replace('/', '-') + webpage = self._download_webpage(url, video_id) + + source, img = self._search_regex(r'(?s)(?P<source><source[^>]*>)(?P<img><img[^>]*>)', + webpage, 'video', group=('source', 'img')) + source = extract_attributes(source) + img = extract_attributes(img) + + raw_json_ld = list(self._yield_json_ld(webpage, video_id)) + json_ld = self._json_ld(raw_json_ld, video_id) + json_ld.pop('url', None) + + ism_manifest_url = ( + source.get('src') + or next(json_ld.get('embedUrl') for json_ld in raw_json_ld if json_ld.get('@type') == 'VideoObject') + ) + formats, subtitles = self._extract_ism_formats_and_subtitles(ism_manifest_url, video_id) + + return merge_dicts({ + 'id': video_id, + 'display_id': display_id, + 'title': + self._html_search_regex(r'<h1><span class="title">([^<]*)</span>', + webpage, 'headline', default=None) + or img.get('title') or json_ld.get('title') or self._og_search_title(webpage) + or remove_end(self._html_extract_title(webpage), ' -'), + 'alt_title': img.get('alt'), + 'description': json_ld.get('description') or self._og_search_description(webpage), + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': [{'url': img['src']}] if 'src' in img else json_ld.get('thumbnails'), + }, json_ld) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rice.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rice.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rice.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rice.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rmcdecouverte.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rmcdecouverte.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rmcdecouverte.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rmcdecouverte.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rockstargames.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rockstargames.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rockstargames.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rockstargames.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rokfin.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rokfin.py new file mode 100644 index 0000000..cad76f0 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rokfin.py @@ -0,0 +1,456 @@ +import itertools +import json +import re +import urllib.parse +from datetime import datetime + +from .common import InfoExtractor, SearchInfoExtractor +from ..utils import ( + ExtractorError, + determine_ext, + float_or_none, + format_field, + int_or_none, + str_or_none, + traverse_obj, + try_get, + unescapeHTML, + unified_timestamp, + url_or_none, + urlencode_postdata, +) + +_API_BASE_URL = 'https://prod-api-v2.production.rokfin.com/api/v2/public/' + + +class RokfinIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rokfin\.com/(?P<id>(?P<type>post|stream)/\d+)' + _NETRC_MACHINE = 'rokfin' + _AUTH_BASE = 'https://secure.rokfin.com/auth/realms/rokfin-web/protocol/openid-connect' + _access_mgmt_tokens = {} # OAuth 2.0: RFC 6749, Sec. 1.4-5 + _TESTS = [{ + 'url': 'https://www.rokfin.com/post/57548/Mitt-Romneys-Crazy-Solution-To-Climate-Change', + 'info_dict': { + 'id': 'post/57548', + 'ext': 'mp4', + 'title': 'Mitt Romney\'s Crazy Solution To Climate Change', + 'thumbnail': r're:https://img\.production\.rokfin\.com/.+', + 'upload_date': '20211023', + 'timestamp': 1634998029, + 'channel': 'Jimmy Dore', + 'channel_id': 65429, + 'channel_url': 'https://rokfin.com/TheJimmyDoreShow', + 'availability': 'public', + 'live_status': 'not_live', + 'dislike_count': int, + 'like_count': int, + 'duration': 213, + } + }, { + 'url': 'https://rokfin.com/post/223/Julian-Assange-Arrested-Streaming-In-Real-Time', + 'info_dict': { + 'id': 'post/223', + 'ext': 'mp4', + 'title': 'Julian Assange Arrested: Streaming In Real Time', + 'thumbnail': r're:https://img\.production\.rokfin\.com/.+', + 'upload_date': '20190412', + 'timestamp': 1555052644, + 'channel': 'Ron Placone', + 'channel_id': 10, + 'channel_url': 'https://rokfin.com/RonPlacone', + 'availability': 'public', + 'live_status': 'not_live', + 'dislike_count': int, + 'like_count': int, + 'tags': ['FreeThinkingMedia^', 'RealProgressives^'], + } + }, { + 'url': 'https://www.rokfin.com/stream/10543/Its-A-Crazy-Mess-Regional-Director-Blows-Whistle-On-Pfizers-Vaccine-Trial-Data', + 'info_dict': { + 'id': 'stream/10543', + 'ext': 'mp4', + 'title': '"It\'s A Crazy Mess" Regional Director Blows Whistle On Pfizer\'s Vaccine Trial Data', + 'thumbnail': r're:https://img\.production\.rokfin\.com/.+', + 'description': 'md5:324ce2d3e3b62e659506409e458b9d8e', + 'channel': 'TLAVagabond', + 'channel_id': 53856, + 'channel_url': 'https://rokfin.com/TLAVagabond', + 'availability': 'public', + 'is_live': False, + 'was_live': True, + 'live_status': 'was_live', + 'timestamp': 1635874720, + 'release_timestamp': 1635874720, + 'release_date': '20211102', + 'upload_date': '20211102', + 'dislike_count': int, + 'like_count': int, + 'tags': ['FreeThinkingMedia^'], + 'duration': None, + } + }, { + 'url': 'https://rokfin.com/post/126703/Brave-New-World--Aldous-Huxley-DEEPDIVE--Chpts-13--Quite-Frankly--Jay-Dyer', + 'info_dict': { + 'id': 'post/126703', + 'ext': 'mp4', + 'title': 'Brave New World - Aldous Huxley DEEPDIVE! (Chpts 1-3) - Quite Frankly & Jay Dyer', + 'thumbnail': r're:https://img\.production\.rokfin\.com/.+', + 'channel': 'Jay Dyer', + 'channel_id': 186881, + 'channel_url': 'https://rokfin.com/jaydyer', + 'availability': 'premium_only', + 'live_status': 'not_live', + 'dislike_count': int, + 'like_count': int, + 'timestamp': 1678213357, + 'upload_date': '20230307', + 'tags': ['FreeThinkingMedia^', 'OpenMind^'], + 'description': 'md5:cb04e32e68326c9b2b251b297bacff35', + 'duration': 3100, + } + }, { + 'url': 'https://rokfin.com/stream/31332/The-Grayzone-live-on-Nordstream-blame-game', + 'info_dict': { + 'id': 'stream/31332', + 'ext': 'mp4', + 'title': 'The Grayzone live on Nordstream blame game', + 'thumbnail': r're:https://image\.v\.rokfin\.com/.+', + 'channel': 'Max Blumenthal', + 'channel_id': 248902, + 'channel_url': 'https://rokfin.com/MaxBlumenthal', + 'availability': 'premium_only', + 'live_status': 'was_live', + 'dislike_count': int, + 'like_count': int, + 'timestamp': 1678475166, + 'release_timestamp': 1678475166.0, + 'release_date': '20230310', + 'upload_date': '20230310', + 'tags': ['FreeThinkingMedia^'], + } + }] + + def _real_extract(self, url): + video_id, video_type = self._match_valid_url(url).group('id', 'type') + metadata = self._download_json_using_access_token(f'{_API_BASE_URL}{video_id}', video_id) + + scheduled = unified_timestamp(metadata.get('scheduledAt')) + live_status = ('was_live' if metadata.get('stoppedAt') + else 'is_upcoming' if scheduled + else 'is_live' if video_type == 'stream' + else 'not_live') + + video_url = traverse_obj(metadata, 'url', ('content', 'contentUrl'), expected_type=url_or_none) + if video_url in (None, 'fake.m3u8'): + video_url = format_field(self._search_regex( + r'https?://[^/]+/([^/]+)/storyboard.vtt', + traverse_obj(metadata, 'timelineUrl', ('content', 'timelineUrl'), expected_type=url_or_none), + video_id, default=None), None, 'https://stream.v.rokfin.com/%s.m3u8') + + formats, subtitles = [{'url': video_url}] if video_url else [], {} + if determine_ext(video_url) == 'm3u8': + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + video_url, video_id, fatal=False, live=live_status == 'is_live') + + if not formats: + if traverse_obj(metadata, 'premiumPlan', 'premium'): + self.raise_login_required('This video is only available to premium users', True, method='cookies') + elif scheduled: + self.raise_no_formats( + f'Stream is offline; scheduled for {datetime.fromtimestamp(scheduled).strftime("%Y-%m-%d %H:%M:%S")}', + video_id=video_id, expected=True) + + uploader = traverse_obj(metadata, ('createdBy', 'username'), ('creator', 'username')) + timestamp = (scheduled or float_or_none(metadata.get('postedAtMilli'), 1000) + or unified_timestamp(metadata.get('creationDateTime'))) + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + 'title': str_or_none(traverse_obj(metadata, 'title', ('content', 'contentTitle'))), + 'duration': float_or_none(traverse_obj(metadata, ('content', 'duration'))), + 'thumbnail': url_or_none(traverse_obj(metadata, 'thumbnail', ('content', 'thumbnailUrl1'))), + 'description': str_or_none(traverse_obj(metadata, 'description', ('content', 'contentDescription'))), + 'like_count': int_or_none(metadata.get('likeCount')), + 'dislike_count': int_or_none(metadata.get('dislikeCount')), + 'channel': str_or_none(traverse_obj(metadata, ('createdBy', 'name'), ('creator', 'name'))), + 'channel_id': traverse_obj(metadata, ('createdBy', 'id'), ('creator', 'id')), + 'channel_url': url_or_none(f'https://rokfin.com/{uploader}') if uploader else None, + 'timestamp': timestamp, + 'release_timestamp': timestamp if live_status != 'not_live' else None, + 'tags': traverse_obj(metadata, ('tags', ..., 'title'), expected_type=str_or_none), + 'live_status': live_status, + 'availability': self._availability( + needs_premium=bool(traverse_obj(metadata, 'premiumPlan', 'premium')), + is_private=False, needs_subscription=False, needs_auth=False, is_unlisted=False), + # 'comment_count': metadata.get('numComments'), # Data provided by website is wrong + '__post_extractor': self.extract_comments(video_id) if video_type == 'post' else None, + } + + def _get_comments(self, video_id): + pages_total = None + for page_n in itertools.count(): + raw_comments = self._download_json( + f'{_API_BASE_URL}comment?postId={video_id[5:]}&page={page_n}&size=50', + video_id, note=f'Downloading viewer comments page {page_n + 1}{format_field(pages_total, None, " of %s")}', + fatal=False) or {} + + for comment in raw_comments.get('content') or []: + yield { + 'text': str_or_none(comment.get('comment')), + 'author': str_or_none(comment.get('name')), + 'id': comment.get('commentId'), + 'author_id': comment.get('userId'), + 'parent': 'root', + 'like_count': int_or_none(comment.get('numLikes')), + 'dislike_count': int_or_none(comment.get('numDislikes')), + 'timestamp': unified_timestamp(comment.get('postedAt')) + } + + pages_total = int_or_none(raw_comments.get('totalPages')) or None + is_last = raw_comments.get('last') + if not raw_comments.get('content') or is_last or (page_n > pages_total if pages_total else is_last is not False): + return + + def _perform_login(self, username, password): + # https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth (Sec. 3.1) + login_page = self._download_webpage( + f'{self._AUTH_BASE}/auth?client_id=web&redirect_uri=https%3A%2F%2Frokfin.com%2Ffeed&response_mode=fragment&response_type=code&scope=openid', + None, note='loading login page', errnote='error loading login page') + authentication_point_url = unescapeHTML(self._search_regex( + r'<form\s+[^>]+action\s*=\s*"(https://secure\.rokfin\.com/auth/realms/rokfin-web/login-actions/authenticate\?[^"]+)"', + login_page, name='Authentication URL')) + + resp_body = self._download_webpage( + authentication_point_url, None, note='logging in', fatal=False, expected_status=404, + data=urlencode_postdata({'username': username, 'password': password, 'rememberMe': 'off', 'credentialId': ''})) + if not self._authentication_active(): + if re.search(r'(?i)(invalid\s+username\s+or\s+password)', resp_body or ''): + raise ExtractorError('invalid username/password', expected=True) + raise ExtractorError('Login failed') + + urlh = self._request_webpage( + f'{self._AUTH_BASE}/auth', None, + note='granting user authorization', errnote='user authorization rejected by Rokfin', + query={ + 'client_id': 'web', + 'prompt': 'none', + 'redirect_uri': 'https://rokfin.com/silent-check-sso.html', + 'response_mode': 'fragment', + 'response_type': 'code', + 'scope': 'openid', + }) + self._access_mgmt_tokens = self._download_json( + f'{self._AUTH_BASE}/token', None, + note='getting access credentials', errnote='error getting access credentials', + data=urlencode_postdata({ + 'code': urllib.parse.parse_qs(urllib.parse.urldefrag(urlh.url).fragment).get('code')[0], + 'client_id': 'web', + 'grant_type': 'authorization_code', + 'redirect_uri': 'https://rokfin.com/silent-check-sso.html' + })) + + def _authentication_active(self): + return not ( + {'KEYCLOAK_IDENTITY', 'KEYCLOAK_IDENTITY_LEGACY', 'KEYCLOAK_SESSION', 'KEYCLOAK_SESSION_LEGACY'} + - set(self._get_cookies(self._AUTH_BASE))) + + def _get_auth_token(self): + return try_get(self._access_mgmt_tokens, lambda x: ' '.join([x['token_type'], x['access_token']])) + + def _download_json_using_access_token(self, url_or_request, video_id, headers={}, query={}): + assert 'authorization' not in headers + headers = headers.copy() + auth_token = self._get_auth_token() + refresh_token = self._access_mgmt_tokens.get('refresh_token') + if auth_token: + headers['authorization'] = auth_token + + json_string, urlh = self._download_webpage_handle( + url_or_request, video_id, headers=headers, query=query, expected_status=401) + if not auth_token or urlh.status != 401 or refresh_token is None: + return self._parse_json(json_string, video_id) + + self._access_mgmt_tokens = self._download_json( + f'{self._AUTH_BASE}/token', video_id, + note='User authorization expired or canceled by Rokfin. Re-authorizing ...', errnote='Failed to re-authorize', + data=urlencode_postdata({ + 'grant_type': 'refresh_token', + 'refresh_token': refresh_token, + 'client_id': 'web' + })) + headers['authorization'] = self._get_auth_token() + if headers['authorization'] is None: + raise ExtractorError('User authorization lost', expected=True) + + return self._download_json(url_or_request, video_id, headers=headers, query=query) + + +class RokfinPlaylistBaseIE(InfoExtractor): + _TYPES = { + 'video': 'post', + 'audio': 'post', + 'stream': 'stream', + 'dead_stream': 'stream', + 'stack': 'stack', + } + + def _get_video_data(self, metadata): + for content in metadata.get('content') or []: + media_type = self._TYPES.get(content.get('mediaType')) + video_id = content.get('id') if media_type == 'post' else content.get('mediaId') + if not media_type or not video_id: + continue + + yield self.url_result(f'https://rokfin.com/{media_type}/{video_id}', video_id=f'{media_type}/{video_id}', + video_title=str_or_none(traverse_obj(content, ('content', 'contentTitle')))) + + +class RokfinStackIE(RokfinPlaylistBaseIE): + IE_NAME = 'rokfin:stack' + IE_DESC = 'Rokfin Stacks' + _VALID_URL = r'https?://(?:www\.)?rokfin\.com/stack/(?P<id>[^/]+)' + _TESTS = [{ + 'url': 'https://www.rokfin.com/stack/271/Tulsi-Gabbard-Portsmouth-Townhall-FULL--Feb-9-2020', + 'playlist_count': 8, + 'info_dict': { + 'id': '271', + }, + }] + + def _real_extract(self, url): + list_id = self._match_id(url) + return self.playlist_result(self._get_video_data( + self._download_json(f'{_API_BASE_URL}stack/{list_id}', list_id)), list_id) + + +class RokfinChannelIE(RokfinPlaylistBaseIE): + IE_NAME = 'rokfin:channel' + IE_DESC = 'Rokfin Channels' + _VALID_URL = r'https?://(?:www\.)?rokfin\.com/(?!((feed/?)|(discover/?)|(channels/?))$)(?P<id>[^/]+)/?$' + _TESTS = [{ + 'url': 'https://rokfin.com/TheConvoCouch', + 'playlist_mincount': 100, + 'info_dict': { + 'id': '12071-new', + 'title': 'TheConvoCouch - New', + 'description': 'md5:bb622b1bca100209b91cd685f7847f06', + }, + }] + + _TABS = { + 'new': 'posts', + 'top': 'top', + 'videos': 'video', + 'podcasts': 'audio', + 'streams': 'stream', + 'stacks': 'stack', + } + + def _real_initialize(self): + self._validate_extractor_args() + + def _validate_extractor_args(self): + requested_tabs = self._configuration_arg('tab', None) + if requested_tabs is not None and (len(requested_tabs) > 1 or requested_tabs[0] not in self._TABS): + raise ExtractorError(f'Invalid extractor-arg "tab". Must be one of {", ".join(self._TABS)}', expected=True) + + def _entries(self, channel_id, channel_name, tab): + pages_total = None + for page_n in itertools.count(0): + if tab in ('posts', 'top'): + data_url = f'{_API_BASE_URL}user/{channel_name}/{tab}?page={page_n}&size=50' + else: + data_url = f'{_API_BASE_URL}post/search/{tab}?page={page_n}&size=50&creator={channel_id}' + metadata = self._download_json( + data_url, channel_name, + note=f'Downloading video metadata page {page_n + 1}{format_field(pages_total, None, " of %s")}') + + yield from self._get_video_data(metadata) + pages_total = int_or_none(metadata.get('totalPages')) or None + is_last = metadata.get('last') + if is_last or (page_n > pages_total if pages_total else is_last is not False): + return + + def _real_extract(self, url): + channel_name = self._match_id(url) + channel_info = self._download_json(f'{_API_BASE_URL}user/{channel_name}', channel_name) + channel_id = channel_info['id'] + tab = self._configuration_arg('tab', default=['new'])[0] + + return self.playlist_result( + self._entries(channel_id, channel_name, self._TABS[tab]), + f'{channel_id}-{tab}', f'{channel_name} - {tab.title()}', str_or_none(channel_info.get('description'))) + + +class RokfinSearchIE(SearchInfoExtractor): + IE_NAME = 'rokfin:search' + IE_DESC = 'Rokfin Search' + _SEARCH_KEY = 'rkfnsearch' + _TYPES = { + 'video': (('id', 'raw'), 'post'), + 'audio': (('id', 'raw'), 'post'), + 'stream': (('content_id', 'raw'), 'stream'), + 'dead_stream': (('content_id', 'raw'), 'stream'), + 'stack': (('content_id', 'raw'), 'stack'), + } + _TESTS = [{ + 'url': 'rkfnsearch5:"zelenko"', + 'playlist_count': 5, + 'info_dict': { + 'id': '"zelenko"', + 'title': '"zelenko"', + } + }] + _db_url = None + _db_access_key = None + + def _real_initialize(self): + self._db_url, self._db_access_key = self.cache.load(self.ie_key(), 'auth', default=(None, None)) + if not self._db_url: + self._get_db_access_credentials() + + def _search_results(self, query): + total_pages = None + for page_number in itertools.count(1): + search_results = self._run_search_query( + query, data={'query': query, 'page': {'size': 100, 'current': page_number}}, + note=f'Downloading page {page_number}{format_field(total_pages, None, " of ~%s")}') + total_pages = traverse_obj(search_results, ('meta', 'page', 'total_pages'), expected_type=int_or_none) + + for result in search_results.get('results') or []: + video_id_key, video_type = self._TYPES.get(traverse_obj(result, ('content_type', 'raw')), (None, None)) + video_id = traverse_obj(result, video_id_key, expected_type=int_or_none) + if video_id and video_type: + yield self.url_result(url=f'https://rokfin.com/{video_type}/{video_id}') + if not search_results.get('results'): + return + + def _run_search_query(self, video_id, data, **kwargs): + data = json.dumps(data).encode() + for attempt in range(2): + search_results = self._download_json( + self._db_url, video_id, data=data, fatal=(attempt == 1), + headers={'authorization': self._db_access_key}, **kwargs) + if search_results: + return search_results + self.write_debug('Updating access credentials') + self._get_db_access_credentials(video_id) + + def _get_db_access_credentials(self, video_id=None): + auth_data = {'SEARCH_KEY': None, 'ENDPOINT_BASE': None} + notfound_err_page = self._download_webpage( + 'https://rokfin.com/discover', video_id, expected_status=404, note='Downloading home page') + for js_file_path in re.findall(r'<script\b[^>]*\ssrc\s*=\s*"(/static/js/[^">]+)"', notfound_err_page): + js_content = self._download_webpage( + f'https://rokfin.com{js_file_path}', video_id, note='Downloading JavaScript file', fatal=False) + auth_data.update(re.findall( + rf'REACT_APP_({"|".join(auth_data.keys())})\s*:\s*"([^"]+)"', js_content or '')) + if not all(auth_data.values()): + continue + + self._db_url = url_or_none(f'{auth_data["ENDPOINT_BASE"]}/api/as/v1/engines/rokfin-search/search.json') + self._db_access_key = f'Bearer {auth_data["SEARCH_KEY"]}' + self.cache.store(self.ie_key(), 'auth', (self._db_url, self._db_access_key)) + return + raise ExtractorError('Unable to extract access credentials') diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/roosterteeth.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/roosterteeth.py new file mode 100644 index 0000000..94e673b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/roosterteeth.py @@ -0,0 +1,211 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + join_nonempty, + LazyList, + parse_qs, + str_or_none, + traverse_obj, + url_or_none, + urlencode_postdata, + urljoin, + update_url_query, +) + + +class RoosterTeethBaseIE(InfoExtractor): + _NETRC_MACHINE = 'roosterteeth' + _API_BASE = 'https://svod-be.roosterteeth.com' + _API_BASE_URL = f'{_API_BASE}/api/v1' + + def _perform_login(self, username, password): + if self._get_cookies(self._API_BASE_URL).get('rt_access_token'): + return + + try: + self._download_json( + 'https://auth.roosterteeth.com/oauth/token', + None, 'Logging in', data=urlencode_postdata({ + 'client_id': '4338d2b4bdc8db1239360f28e72f0d9ddb1fd01e7a38fbb07b4b1f4ba4564cc5', + 'grant_type': 'password', + 'username': username, + 'password': password, + })) + except ExtractorError as e: + msg = 'Unable to login' + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + resp = self._parse_json(e.cause.response.read().decode(), None, fatal=False) + if resp: + error = resp.get('extra_info') or resp.get('error_description') or resp.get('error') + if error: + msg += ': ' + error + self.report_warning(msg) + + def _extract_video_info(self, data): + thumbnails = [] + for image in traverse_obj(data, ('included', 'images')): + if image.get('type') not in ('episode_image', 'bonus_feature_image'): + continue + thumbnails.extend([{ + 'id': name, + 'url': url, + } for name, url in (image.get('attributes') or {}).items() if url_or_none(url)]) + + attributes = data.get('attributes') or {} + title = traverse_obj(attributes, 'title', 'display_title') + sub_only = attributes.get('is_sponsors_only') + + return { + 'id': str(data.get('id')), + 'display_id': attributes.get('slug'), + 'title': title, + 'description': traverse_obj(attributes, 'description', 'caption'), + 'series': attributes.get('show_title'), + 'season_number': int_or_none(attributes.get('season_number')), + 'season_id': attributes.get('season_id'), + 'episode': title, + 'episode_number': int_or_none(attributes.get('number')), + 'episode_id': str_or_none(data.get('uuid')), + 'channel_id': attributes.get('channel_id'), + 'duration': int_or_none(attributes.get('length')), + 'thumbnails': thumbnails, + 'availability': self._availability( + needs_premium=sub_only, needs_subscription=sub_only, needs_auth=sub_only, + is_private=False, is_unlisted=False), + 'tags': attributes.get('genres') + } + + +class RoosterTeethIE(RoosterTeethBaseIE): + _VALID_URL = r'https?://(?:.+?\.)?roosterteeth\.com/(?:episode|watch)/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'http://roosterteeth.com/episode/million-dollars-but-season-2-million-dollars-but-the-game-announcement', + 'info_dict': { + 'id': '9156', + 'display_id': 'million-dollars-but-season-2-million-dollars-but-the-game-announcement', + 'ext': 'mp4', + 'title': 'Million Dollars, But... The Game Announcement', + 'description': 'md5:168a54b40e228e79f4ddb141e89fe4f5', + 'thumbnail': r're:^https?://.*\.png$', + 'series': 'Million Dollars, But...', + 'episode': 'Million Dollars, But... The Game Announcement', + }, + 'params': {'skip_download': True}, + }, { + 'url': 'https://roosterteeth.com/watch/rwby-bonus-25', + 'info_dict': { + 'id': '40432', + 'display_id': 'rwby-bonus-25', + 'title': 'Grimm', + 'description': 'md5:f30ff570741213418a8d2c19868b93ab', + 'episode': 'Grimm', + 'channel_id': '92f780eb-ebfe-4bf5-a3b5-c6ad5460a5f1', + 'thumbnail': r're:^https?://.*\.(png|jpe?g)$', + 'ext': 'mp4', + }, + 'params': {'skip_download': True}, + }, { + 'url': 'http://achievementhunter.roosterteeth.com/episode/off-topic-the-achievement-hunter-podcast-2016-i-didn-t-think-it-would-pass-31', + 'only_matching': True, + }, { + 'url': 'http://funhaus.roosterteeth.com/episode/funhaus-shorts-2016-austin-sucks-funhaus-shorts', + 'only_matching': True, + }, { + 'url': 'http://screwattack.roosterteeth.com/episode/death-battle-season-3-mewtwo-vs-shadow', + 'only_matching': True, + }, { + 'url': 'http://theknow.roosterteeth.com/episode/the-know-game-news-season-1-boring-steam-sales-are-better', + 'only_matching': True, + }, { + # only available for FIRST members + 'url': 'http://roosterteeth.com/episode/rt-docs-the-world-s-greatest-head-massage-the-world-s-greatest-head-massage-an-asmr-journey-part-one', + 'only_matching': True, + }, { + 'url': 'https://roosterteeth.com/watch/million-dollars-but-season-2-million-dollars-but-the-game-announcement', + 'only_matching': True, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + api_episode_url = f'{self._API_BASE_URL}/watch/{display_id}' + + try: + video_data = self._download_json( + api_episode_url + '/videos', display_id, + 'Downloading video JSON metadata')['data'][0] + m3u8_url = video_data['attributes']['url'] + # XXX: additional URL at video_data['links']['download'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + if self._parse_json(e.cause.response.read().decode(), display_id).get('access') is False: + self.raise_login_required( + '%s is only available for FIRST members' % display_id) + raise + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + m3u8_url, display_id, 'mp4', 'm3u8_native', m3u8_id='hls') + + episode = self._download_json( + api_episode_url, display_id, + 'Downloading episode JSON metadata')['data'][0] + + return { + 'display_id': display_id, + 'formats': formats, + 'subtitles': subtitles, + **self._extract_video_info(episode) + } + + +class RoosterTeethSeriesIE(RoosterTeethBaseIE): + _VALID_URL = r'https?://(?:.+?\.)?roosterteeth\.com/series/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://roosterteeth.com/series/rwby?season=7', + 'playlist_count': 13, + 'info_dict': { + 'id': 'rwby-7', + 'title': 'RWBY - Season 7', + } + }, { + 'url': 'https://roosterteeth.com/series/role-initiative', + 'playlist_mincount': 16, + 'info_dict': { + 'id': 'role-initiative', + 'title': 'Role Initiative', + } + }, { + 'url': 'https://roosterteeth.com/series/let-s-play-minecraft?season=9', + 'playlist_mincount': 50, + 'info_dict': { + 'id': 'let-s-play-minecraft-9', + 'title': 'Let\'s Play Minecraft - Season 9', + } + }] + + def _entries(self, series_id, season_number): + display_id = join_nonempty(series_id, season_number) + # TODO: extract bonus material + for data in self._download_json( + f'{self._API_BASE_URL}/shows/{series_id}/seasons?order=asc&order_by', display_id)['data']: + idx = traverse_obj(data, ('attributes', 'number')) + if season_number and idx != season_number: + continue + season_url = update_url_query(urljoin(self._API_BASE, data['links']['episodes']), {'per_page': 1000}) + season = self._download_json(season_url, display_id, f'Downloading season {idx} JSON metadata')['data'] + for episode in season: + yield self.url_result( + f'https://www.roosterteeth.com{episode["canonical_links"]["self"]}', + RoosterTeethIE.ie_key(), + **self._extract_video_info(episode)) + + def _real_extract(self, url): + series_id = self._match_id(url) + season_number = traverse_obj(parse_qs(url), ('season', 0), expected_type=int_or_none) + + entries = LazyList(self._entries(series_id, season_number)) + return self.playlist_result( + entries, + join_nonempty(series_id, season_number), + join_nonempty(entries[0].get('series'), season_number, delim=' - Season ')) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rottentomatoes.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rottentomatoes.py new file mode 100644 index 0000000..e357175 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rottentomatoes.py @@ -0,0 +1,80 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + clean_html, + float_or_none, + get_element_by_class, + join_nonempty, + traverse_obj, + url_or_none, +) + + +class RottenTomatoesIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rottentomatoes\.com/m/(?P<playlist>[^/]+)(?:/(?P<tr>trailers)(?:/(?P<id>\w+))?)?' + + _TESTS = [{ + 'url': 'http://www.rottentomatoes.com/m/toy_story_3/trailers/11028566/', + 'info_dict': { + 'id': '11028566', + 'ext': 'mp4', + 'title': 'Toy Story 3', + 'description': 'From the creators of the beloved TOY STORY films, comes a story that will reunite the gang in a whole new way.' + }, + 'skip': 'No longer available', + }, { + 'url': 'https://www.rottentomatoes.com/m/toy_story_3/trailers/VycaVoBKhGuk', + 'info_dict': { + 'id': 'VycaVoBKhGuk', + 'ext': 'mp4', + 'title': 'Toy Story 3: Trailer 2', + 'description': '', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 149.941 + }, + }, { + 'url': 'http://www.rottentomatoes.com/m/toy_story_3', + 'info_dict': { + 'id': 'toy_story_3', + 'title': 'Toy Story 3', + }, + 'playlist_mincount': 4, + }, { + 'url': 'http://www.rottentomatoes.com/m/toy_story_3/trailers', + 'info_dict': { + 'id': 'toy_story_3-trailers', + }, + 'playlist_mincount': 5, + }] + + def _extract_videos(self, data, display_id): + for video in traverse_obj(data, (lambda _, v: v['publicId'] and v['file'] and v['type'] == 'hls')): + yield { + 'formats': self._extract_m3u8_formats( + video['file'], display_id, 'mp4', m3u8_id='hls', fatal=False), + **traverse_obj(video, { + 'id': 'publicId', + 'title': 'title', + 'description': 'description', + 'duration': ('durationInSeconds', {float_or_none}), + 'thumbnail': ('image', {url_or_none}), + }), + } + + def _real_extract(self, url): + playlist_id, trailers, video_id = self._match_valid_url(url).group('playlist', 'tr', 'id') + playlist_id = join_nonempty(playlist_id, trailers) + webpage = self._download_webpage(url, playlist_id) + data = self._search_json( + r'<script[^>]+\bid=["\'](?:heroV|v)ideos["\'][^>]*>', webpage, + 'data', playlist_id, contains_pattern=r'\[{(?s:.+)}\]') + + if video_id: + video_data = traverse_obj(data, lambda _, v: v['publicId'] == video_id) + if not video_data: + raise ExtractorError('Unable to extract video from webpage') + return next(self._extract_videos(video_data, video_id)) + + return self.playlist_result( + self._extract_videos(data, playlist_id), playlist_id, + clean_html(get_element_by_class('scoreboard__title', webpage))) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rozhlas.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rozhlas.py new file mode 100644 index 0000000..6313432 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rozhlas.py @@ -0,0 +1,343 @@ +import itertools + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + extract_attributes, + int_or_none, + remove_start, + str_or_none, + traverse_obj, + unified_timestamp, + url_or_none, +) + + +class RozhlasIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?prehravac\.rozhlas\.cz/audio/(?P<id>[0-9]+)' + _TESTS = [{ + 'url': 'http://prehravac.rozhlas.cz/audio/3421320', + 'md5': '504c902dbc9e9a1fd50326eccf02a7e2', + 'info_dict': { + 'id': '3421320', + 'ext': 'mp3', + 'title': 'Echo Pavla Klusáka (30.06.2015 21:00)', + 'description': 'Osmdesátiny Terryho Rileyho jsou skvÄ›lou příležitostí proletÄ›t se elektronickými i akustickými díly zakladatatele minimalismu, který je aktivní už pÅ™es padesát let' + } + }, { + 'url': 'http://prehravac.rozhlas.cz/audio/3421320/embed', + 'only_matching': True, + }] + + def _real_extract(self, url): + audio_id = self._match_id(url) + + webpage = self._download_webpage( + 'http://prehravac.rozhlas.cz/audio/%s' % audio_id, audio_id) + + title = self._html_search_regex( + r'<h3>(.+?)</h3>\s*<p[^>]*>.*?</p>\s*<div[^>]+id=["\']player-track', + webpage, 'title', default=None) or remove_start( + self._og_search_title(webpage), 'Radio Wave - ') + description = self._html_search_regex( + r'<p[^>]+title=(["\'])(?P<url>(?:(?!\1).)+)\1[^>]*>.*?</p>\s*<div[^>]+id=["\']player-track', + webpage, 'description', fatal=False, group='url') + duration = int_or_none(self._search_regex( + r'data-duration=["\'](\d+)', webpage, 'duration', default=None)) + + return { + 'id': audio_id, + 'url': 'http://media.rozhlas.cz/_audio/%s.mp3' % audio_id, + 'title': title, + 'description': description, + 'duration': duration, + 'vcodec': 'none', + } + + +class RozhlasBaseIE(InfoExtractor): + def _extract_formats(self, entry, audio_id): + formats = [] + for audio in traverse_obj(entry, ('audioLinks', lambda _, v: url_or_none(v['url']))): + ext = audio.get('variant') + for retry in self.RetryManager(): + if retry.attempt > 1: + self._sleep(1, audio_id) + try: + if ext == 'dash': + formats.extend(self._extract_mpd_formats( + audio['url'], audio_id, mpd_id=ext)) + elif ext == 'hls': + formats.extend(self._extract_m3u8_formats( + audio['url'], audio_id, 'm4a', m3u8_id=ext)) + else: + formats.append({ + 'url': audio['url'], + 'ext': ext, + 'format_id': ext, + 'abr': int_or_none(audio.get('bitrate')), + 'acodec': ext, + 'vcodec': 'none', + }) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 429: + retry.error = e.cause + else: + self.report_warning(e.msg) + + return formats + + +class RozhlasVltavaIE(RozhlasBaseIE): + _VALID_URL = r'https?://(?:\w+\.rozhlas|english\.radio)\.cz/[\w-]+-(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://wave.rozhlas.cz/papej-masicko-porcujeme-a-bilancujeme-filmy-a-serialy-ktere-letos-zabily-8891337', + 'md5': 'ba2fdbc1242fc16771c7695d271ec355', + 'info_dict': { + 'id': '8891337', + 'title': 'md5:21f99739d04ab49d8c189ec711eef4ec', + }, + 'playlist_count': 1, + 'playlist': [{ + 'md5': 'ba2fdbc1242fc16771c7695d271ec355', + 'info_dict': { + 'id': '10520988', + 'ext': 'mp3', + 'title': 'Papej masíÄko! Porcujeme a bilancujeme filmy a seriály, které to letos zabily', + 'description': 'md5:1c6d29fb9564e1f17fc1bb83ae7da0bc', + 'duration': 1574, + 'artist': 'AleÅ¡ Stuchlý', + 'channel_id': 'radio-wave', + }, + }] + }, { + 'url': 'https://wave.rozhlas.cz/poslechnete-si-neklid-podcastovy-thriller-o-vine-strachu-a-vztahu-ktery-zasel-8554744', + 'info_dict': { + 'id': '8554744', + 'title': 'PoslechnÄ›te si Neklid. Podcastový thriller o vinÄ›, strachu a vztahu, který zaÅ¡el příliÅ¡ daleko', + }, + 'playlist_count': 5, + 'playlist': [{ + 'md5': '93d4109cf8f40523699ae9c1d4600bdd', + 'info_dict': { + 'id': '9890713', + 'ext': 'mp3', + 'title': 'Neklid #1', + 'description': '1. díl: Neklid: 1. díl', + 'duration': 1025, + 'artist': 'Josef Kokta', + 'channel_id': 'radio-wave', + 'chapter': 'Neklid #1', + 'chapter_number': 1, + }, + }, { + 'md5': 'e9763235be4a6dcf94bc8a5bac1ca126', + 'info_dict': { + 'id': '9890716', + 'ext': 'mp3', + 'title': 'Neklid #2', + 'description': '2. díl: Neklid: 2. díl', + 'duration': 768, + 'artist': 'Josef Kokta', + 'channel_id': 'radio-wave', + 'chapter': 'Neklid #2', + 'chapter_number': 2, + }, + }, { + 'md5': '00b642ea94b78cc949ac84da09f87895', + 'info_dict': { + 'id': '9890722', + 'ext': 'mp3', + 'title': 'Neklid #3', + 'description': '3. díl: Neklid: 3. díl', + 'duration': 607, + 'artist': 'Josef Kokta', + 'channel_id': 'radio-wave', + 'chapter': 'Neklid #3', + 'chapter_number': 3, + }, + }, { + 'md5': 'faef97b1b49da7df874740f118c19dea', + 'info_dict': { + 'id': '9890728', + 'ext': 'mp3', + 'title': 'Neklid #4', + 'description': '4. díl: Neklid: 4. díl', + 'duration': 621, + 'artist': 'Josef Kokta', + 'channel_id': 'radio-wave', + 'chapter': 'Neklid #4', + 'chapter_number': 4, + }, + }, { + 'md5': '6e729fa39b647325b868d419c76f3efa', + 'info_dict': { + 'id': '9890734', + 'ext': 'mp3', + 'title': 'Neklid #5', + 'description': '5. díl: Neklid: 5. díl', + 'duration': 908, + 'artist': 'Josef Kokta', + 'channel_id': 'radio-wave', + 'chapter': 'Neklid #5', + 'chapter_number': 5, + }, + }] + }, { + 'url': 'https://dvojka.rozhlas.cz/karel-siktanc-cerny-jezdec-bily-kun-napinava-pohadka-o-tajemnem-prizraku-8946969', + 'info_dict': { + 'id': '8946969', + 'title': 'Karel Å iktanc: ÄŒerný jezdec, bílý kůň. Napínavá pohádka o tajemném přízraku', + }, + 'playlist_count': 1, + 'playlist': [{ + 'info_dict': { + 'id': '10631121', + 'ext': 'm4a', + 'title': 'Karel Å iktanc: ÄŒerný jezdec, bílý kůň. Napínavá pohádka o tajemném přízraku', + 'description': 'Karel Å iktanc: ÄŒerný jezdec, bílý kůň', + 'duration': 2656, + 'artist': 'TvůrÄí skupina Drama a literatura', + 'channel_id': 'dvojka', + }, + }], + 'params': {'skip_download': 'dash'}, + }] + + def _extract_video(self, entry): + audio_id = entry['meta']['ga']['contentId'] + chapter_number = traverse_obj(entry, ('meta', 'ga', 'contentSerialPart', {int_or_none})) + + return { + 'id': audio_id, + 'chapter': traverse_obj(entry, ('meta', 'ga', 'contentNameShort')) if chapter_number else None, + 'chapter_number': chapter_number, + 'formats': self._extract_formats(entry, audio_id), + **traverse_obj(entry, { + 'title': ('meta', 'ga', 'contentName'), + 'description': 'title', + 'duration': ('duration', {int_or_none}), + 'artist': ('meta', 'ga', 'contentAuthor'), + 'channel_id': ('meta', 'ga', 'contentCreator'), + }) + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + # FIXME: Use get_element_text_and_html_by_tag when it accepts less strict html + data = self._parse_json(extract_attributes(self._search_regex( + r'(<div class="mujRozhlasPlayer" data-player=\'[^\']+\'>)', + webpage, 'player'))['data-player'], video_id)['data'] + + return { + '_type': 'playlist', + 'id': str_or_none(data.get('embedId')) or video_id, + 'title': traverse_obj(data, ('series', 'title')), + 'entries': map(self._extract_video, data['playlist']), + } + + +class MujRozhlasIE(RozhlasBaseIE): + _VALID_URL = r'https?://(?:www\.)?mujrozhlas\.cz/(?:[^/]+/)*(?P<id>[^/?#&]+)' + _TESTS = [{ + # single episode extraction + 'url': 'https://www.mujrozhlas.cz/vykopavky/ach-jo-zase-teleci-rizek-je-mnohem-min-cesky-nez-jsme-si-mysleli', + 'md5': '6f8fd68663e64936623e67c152a669e0', + 'info_dict': { + 'id': '10739193', + 'ext': 'mp3', + 'title': 'Ach jo, zase to telecí! Řízek je mnohem míň Äeský, než jsme si mysleli', + 'description': 'md5:db7141e9caaedc9041ec7cefb9a62908', + 'timestamp': 1684915200, + 'modified_timestamp': 1684922446, + 'series': 'Vykopávky', + 'thumbnail': 'https://portal.rozhlas.cz/sites/default/files/images/84377046610af6ddc54d910b1dd7a22b.jpg', + 'channel_id': 'radio-wave', + 'upload_date': '20230524', + 'modified_date': '20230524', + }, + }, { + # serial extraction + 'url': 'https://www.mujrozhlas.cz/radiokniha/jaroslava-janackova-pribeh-tajemneho-psani-o-pramenech-genezi-babicky', + 'playlist_mincount': 7, + 'info_dict': { + 'id': 'bb2b5f4e-ffb4-35a6-a34a-046aa62d6f6b', + 'title': 'Jaroslava JanáÄková: PříbÄ›h tajemného psaní. O pramenech a genezi BabiÄky', + 'description': 'md5:7434d8fac39ac9fee6df098e11dfb1be', + }, + }, { + # show extraction + 'url': 'https://www.mujrozhlas.cz/nespavci', + 'playlist_mincount': 14, + 'info_dict': { + 'id': '09db9b37-d0f4-368c-986a-d3439f741f08', + 'title': 'Nespavci', + 'description': 'md5:c430adcbf9e2b9eac88b745881e814dc', + }, + }] + + def _call_api(self, path, item_id, msg='API JSON'): + return self._download_json( + f'https://api.mujrozhlas.cz/{path}/{item_id}', item_id, + note=f'Downloading {msg}', errnote=f'Failed to download {msg}')['data'] + + def _extract_audio_entry(self, entry): + audio_id = entry['meta']['ga']['contentId'] + + return { + 'id': audio_id, + 'formats': self._extract_formats(entry['attributes'], audio_id), + **traverse_obj(entry, { + 'title': ('attributes', 'title'), + 'description': ('attributes', 'description'), + 'episode_number': ('attributes', 'part'), + 'series': ('attributes', 'mirroredShow', 'title'), + 'chapter': ('attributes', 'mirroredSerial', 'title'), + 'artist': ('meta', 'ga', 'contentAuthor'), + 'channel_id': ('meta', 'ga', 'contentCreator'), + 'timestamp': ('attributes', 'since', {unified_timestamp}), + 'modified_timestamp': ('attributes', 'updated', {unified_timestamp}), + 'thumbnail': ('attributes', 'asset', 'url', {url_or_none}), + }) + } + + def _entries(self, api_url, playlist_id): + for page in itertools.count(1): + episodes = self._download_json( + api_url, playlist_id, note=f'Downloading episodes page {page}', + errnote=f'Failed to download episodes page {page}', fatal=False) + for episode in traverse_obj(episodes, ('data', lambda _, v: v['meta']['ga']['contentId'])): + yield self._extract_audio_entry(episode) + api_url = traverse_obj(episodes, ('links', 'next', {url_or_none})) + if not api_url: + break + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + info = self._search_json(r'\bvar\s+dl\s*=', webpage, 'info json', display_id) + + entity = info['siteEntityBundle'] + + if entity == 'episode': + return self._extract_audio_entry(self._call_api( + 'episodes', info['contentId'], 'episode info API JSON')) + + elif entity in ('show', 'serial'): + playlist_id = info['contentShow'].split(':')[0] if entity == 'show' else info['contentId'] + data = self._call_api(f'{entity}s', playlist_id, f'{entity} playlist JSON') + api_url = data['relationships']['episodes']['links']['related'] + return self.playlist_result( + self._entries(api_url, playlist_id), playlist_id, + **traverse_obj(data, ('attributes', { + 'title': 'title', + 'description': 'description', + }))) + + else: + # `entity == 'person'` not implemented yet by API, ref: + # https://api.mujrozhlas.cz/persons/8367e456-2a57-379a-91bb-e699619bea49/participation + raise ExtractorError(f'Unsupported entity type "{entity}"') diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rte.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rte.py new file mode 100644 index 0000000..7ba80d4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rte.py @@ -0,0 +1,162 @@ +import re + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + float_or_none, + parse_iso8601, + str_or_none, + try_get, + unescapeHTML, + url_or_none, + ExtractorError, +) + + +class RteBaseIE(InfoExtractor): + def _real_extract(self, url): + item_id = self._match_id(url) + + info_dict = {} + formats = [] + + ENDPOINTS = ( + 'https://feeds.rasset.ie/rteavgen/player/playlist?type=iptv&format=json&showId=', + 'http://www.rte.ie/rteavgen/getplaylist/?type=web&format=json&id=', + ) + + for num, ep_url in enumerate(ENDPOINTS, start=1): + try: + data = self._download_json(ep_url + item_id, item_id) + except ExtractorError as ee: + if num < len(ENDPOINTS) or formats: + continue + if isinstance(ee.cause, HTTPError) and ee.cause.status == 404: + error_info = self._parse_json(ee.cause.response.read().decode(), item_id, fatal=False) + if error_info: + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, error_info['message']), + expected=True) + raise + + # NB the string values in the JSON are stored using XML escaping(!) + show = try_get(data, lambda x: x['shows'][0], dict) + if not show: + continue + + if not info_dict: + title = unescapeHTML(show['title']) + description = unescapeHTML(show.get('description')) + thumbnail = show.get('thumbnail') + duration = float_or_none(show.get('duration'), 1000) + timestamp = parse_iso8601(show.get('published')) + info_dict = { + 'id': item_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'timestamp': timestamp, + 'duration': duration, + } + + mg = try_get(show, lambda x: x['media:group'][0], dict) + if not mg: + continue + + if mg.get('url'): + m = re.match(r'(?P<url>rtmpe?://[^/]+)/(?P<app>.+)/(?P<playpath>mp4:.*)', mg['url']) + if m: + m = m.groupdict() + formats.append({ + 'url': m['url'] + '/' + m['app'], + 'app': m['app'], + 'play_path': m['playpath'], + 'player_url': url, + 'ext': 'flv', + 'format_id': 'rtmp', + }) + + if mg.get('hls_server') and mg.get('hls_url'): + formats.extend(self._extract_m3u8_formats( + mg['hls_server'] + mg['hls_url'], item_id, 'mp4', + entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)) + + if mg.get('hds_server') and mg.get('hds_url'): + formats.extend(self._extract_f4m_formats( + mg['hds_server'] + mg['hds_url'], item_id, + f4m_id='hds', fatal=False)) + + mg_rte_server = str_or_none(mg.get('rte:server')) + mg_url = str_or_none(mg.get('url')) + if mg_rte_server and mg_url: + hds_url = url_or_none(mg_rte_server + mg_url) + if hds_url: + formats.extend(self._extract_f4m_formats( + hds_url, item_id, f4m_id='hds', fatal=False)) + + info_dict['formats'] = formats + return info_dict + + +class RteIE(RteBaseIE): + IE_NAME = 'rte' + IE_DESC = 'Raidió Teilifís Éireann TV' + _VALID_URL = r'https?://(?:www\.)?rte\.ie/player/[^/]{2,3}/show/[^/]+/(?P<id>[0-9]+)' + _TEST = { + 'url': 'http://www.rte.ie/player/ie/show/iwitness-862/10478715/', + 'md5': '4a76eb3396d98f697e6e8110563d2604', + 'info_dict': { + 'id': '10478715', + 'ext': 'mp4', + 'title': 'iWitness', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'The spirit of Ireland, one voice and one minute at a time.', + 'duration': 60.046, + 'upload_date': '20151012', + 'timestamp': 1444694160, + }, + } + + +class RteRadioIE(RteBaseIE): + IE_NAME = 'rte:radio' + IE_DESC = 'Raidió Teilifís Éireann radio' + # Radioplayer URLs have two distinct specifier formats, + # the old format #!rii=<channel_id>:<id>:<playable_item_id>:<date>: + # the new format #!rii=b<channel_id>_<id>_<playable_item_id>_<date>_ + # where the IDs are int/empty, the date is DD-MM-YYYY, and the specifier may be truncated. + # An <id> uniquely defines an individual recording, and is the only part we require. + _VALID_URL = r'https?://(?:www\.)?rte\.ie/radio/utils/radioplayer/rteradioweb\.html#!rii=(?:b?[0-9]*)(?:%3A|:|%5F|_)(?P<id>[0-9]+)' + + _TESTS = [{ + # Old-style player URL; HLS and RTMPE formats + 'url': 'http://www.rte.ie/radio/utils/radioplayer/rteradioweb.html#!rii=16:10507902:2414:27-12-2015:', + 'md5': 'c79ccb2c195998440065456b69760411', + 'info_dict': { + 'id': '10507902', + 'ext': 'mp4', + 'title': 'Gloria', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:9ce124a7fb41559ec68f06387cabddf0', + 'timestamp': 1451203200, + 'upload_date': '20151227', + 'duration': 7230.0, + }, + }, { + # New-style player URL; RTMPE formats only + 'url': 'http://rte.ie/radio/utils/radioplayer/rteradioweb.html#!rii=b16_3250678_8861_06-04-2012_', + 'info_dict': { + 'id': '3250678', + 'ext': 'flv', + 'title': 'The Lyric Concert with Paul Herriott', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': '', + 'timestamp': 1333742400, + 'upload_date': '20120406', + 'duration': 7199.016, + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }] diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtl2.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtl2.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtl2.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtl2.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtlnl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtlnl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtlnl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtlnl.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtnews.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtnews.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtnews.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtnews.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtp.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtp.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtp.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtp.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtrfm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtrfm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtrfm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtrfm.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rts.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rts.py new file mode 100644 index 0000000..9f73d18 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rts.py @@ -0,0 +1,231 @@ +import re + +from .srgssr import SRGSSRIE +from ..compat import compat_str +from ..utils import ( + determine_ext, + int_or_none, + parse_duration, + parse_iso8601, + unescapeHTML, + urljoin, +) + + +class RTSIE(SRGSSRIE): # XXX: Do not subclass from concrete IE + IE_DESC = 'RTS.ch' + _VALID_URL = r'rts:(?P<rts_id>\d+)|https?://(?:.+?\.)?rts\.ch/(?:[^/]+/){2,}(?P<id>[0-9]+)-(?P<display_id>.+?)\.html' + + _TESTS = [ + { + 'url': 'http://www.rts.ch/archives/tv/divers/3449373-les-enfants-terribles.html', + 'md5': '753b877968ad8afaeddccc374d4256a5', + 'info_dict': { + 'id': '3449373', + 'display_id': 'les-enfants-terribles', + 'ext': 'mp4', + 'duration': 1488, + 'title': 'Les Enfants Terribles', + 'description': 'France Pommier et sa soeur Luce Feral, les deux filles de ce groupe de 5.', + 'uploader': 'Divers', + 'upload_date': '19680921', + 'timestamp': -40280400, + 'thumbnail': r're:^https?://.*\.image', + 'view_count': int, + }, + 'expected_warnings': ['Unable to download f4m manifest', 'Failed to download m3u8 information'], + }, + { + 'url': 'http://www.rts.ch/emissions/passe-moi-les-jumelles/5624067-entre-ciel-et-mer.html', + 'info_dict': { + 'id': '5624065', + 'title': 'Passe-moi les jumelles', + }, + 'playlist_mincount': 4, + }, + { + 'url': 'http://www.rts.ch/video/sport/hockey/5745975-1-2-kloten-fribourg-5-2-second-but-pour-gotteron-par-kwiatowski.html', + 'info_dict': { + 'id': '5745975', + 'display_id': '1-2-kloten-fribourg-5-2-second-but-pour-gotteron-par-kwiatowski', + 'ext': 'mp4', + 'duration': 48, + 'title': '1/2, Kloten - Fribourg (5-2): second but pour Gottéron par Kwiatowski', + 'description': 'Hockey - Playoff', + 'uploader': 'Hockey', + 'upload_date': '20140403', + 'timestamp': 1396556882, + 'thumbnail': r're:^https?://.*\.image', + 'view_count': int, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'expected_warnings': ['Unable to download f4m manifest', 'Failed to download m3u8 information'], + 'skip': 'Blocked outside Switzerland', + }, + { + 'url': 'http://www.rts.ch/video/info/journal-continu/5745356-londres-cachee-par-un-epais-smog.html', + 'md5': '9bb06503773c07ce83d3cbd793cebb91', + 'info_dict': { + 'id': '5745356', + 'display_id': 'londres-cachee-par-un-epais-smog', + 'ext': 'mp4', + 'duration': 33, + 'title': 'Londres cachée par un épais smog', + 'description': 'Un important voile de smog recouvre Londres depuis mercredi, provoqué par la pollution et du sable du Sahara.', + 'uploader': 'L\'actu en vidéo', + 'upload_date': '20140403', + 'timestamp': 1396537322, + 'thumbnail': r're:^https?://.*\.image', + 'view_count': int, + }, + 'expected_warnings': ['Unable to download f4m manifest', 'Failed to download m3u8 information'], + }, + { + 'url': 'http://www.rts.ch/audio/couleur3/programmes/la-belle-video-de-stephane-laurenceau/5706148-urban-hippie-de-damien-krisl-03-04-2014.html', + 'md5': 'dd8ef6a22dff163d063e2a52bc8adcae', + 'info_dict': { + 'id': '5706148', + 'display_id': 'urban-hippie-de-damien-krisl-03-04-2014', + 'ext': 'mp3', + 'duration': 123, + 'title': '"Urban Hippie", de Damien Krisl', + 'description': 'Des Hippies super glam.', + 'upload_date': '20140403', + 'timestamp': 1396551600, + }, + }, + { + # article with videos on rhs + 'url': 'http://www.rts.ch/sport/hockey/6693917-hockey-davos-decroche-son-31e-titre-de-champion-de-suisse.html', + 'info_dict': { + 'id': '6693917', + 'title': 'Hockey: Davos décroche son 31e titre de champion de Suisse', + }, + 'playlist_mincount': 5, + }, + { + 'url': 'http://pages.rts.ch/emissions/passe-moi-les-jumelles/5624065-entre-ciel-et-mer.html', + 'only_matching': True, + } + ] + + def _real_extract(self, url): + m = self._match_valid_url(url) + media_id = m.group('rts_id') or m.group('id') + display_id = m.group('display_id') or media_id + + def download_json(internal_id): + return self._download_json( + 'http://www.rts.ch/a/%s.html?f=json/article' % internal_id, + display_id) + + all_info = download_json(media_id) + + # media_id extracted out of URL is not always a real id + if 'video' not in all_info and 'audio' not in all_info: + entries = [] + + for item in all_info.get('items', []): + item_url = item.get('url') + if not item_url: + continue + entries.append(self.url_result(item_url, 'RTS')) + + if not entries: + page, urlh = self._download_webpage_handle(url, display_id) + if re.match(self._VALID_URL, urlh.url).group('id') != media_id: + return self.url_result(urlh.url, 'RTS') + + # article with videos on rhs + videos = re.findall( + r'<article[^>]+class="content-item"[^>]*>\s*<a[^>]+data-video-urn="urn:([^"]+)"', + page) + if not videos: + videos = re.findall( + r'(?s)<iframe[^>]+class="srg-player"[^>]+src="[^"]+urn:([^"]+)"', + page) + if videos: + entries = [self.url_result('srgssr:%s' % video_urn, 'SRGSSR') for video_urn in videos] + + if entries: + return self.playlist_result(entries, media_id, all_info.get('title')) + + internal_id = self._html_search_regex( + r'<(?:video|audio) data-id="([0-9]+)"', page, + 'internal video id') + all_info = download_json(internal_id) + + media_type = 'video' if 'video' in all_info else 'audio' + + # check for errors + self._get_media_data('rts', media_type, media_id) + + info = all_info['video']['JSONinfo'] if 'video' in all_info else all_info['audio'] + + title = info['title'] + + def extract_bitrate(url): + return int_or_none(self._search_regex( + r'-([0-9]+)k\.', url, 'bitrate', default=None)) + + formats = [] + streams = info.get('streams', {}) + for format_id, format_url in streams.items(): + if format_id == 'hds_sd' and 'hds' in streams: + continue + if format_id == 'hls_sd' and 'hls' in streams: + continue + ext = determine_ext(format_url) + if ext in ('m3u8', 'f4m'): + format_url = self._get_tokenized_src(format_url, media_id, format_id) + if ext == 'f4m': + formats.extend(self._extract_f4m_formats( + format_url + ('?' if '?' not in format_url else '&') + 'hdcore=3.4.0', + media_id, f4m_id=format_id, fatal=False)) + else: + formats.extend(self._extract_m3u8_formats( + format_url, media_id, 'mp4', 'm3u8_native', m3u8_id=format_id, fatal=False)) + else: + formats.append({ + 'format_id': format_id, + 'url': format_url, + 'tbr': extract_bitrate(format_url), + }) + + download_base = 'http://rtsww%s-d.rts.ch/' % ('-a' if media_type == 'audio' else '') + for media in info.get('media', []): + media_url = media.get('url') + if not media_url or re.match(r'https?://', media_url): + continue + rate = media.get('rate') + ext = media.get('ext') or determine_ext(media_url, 'mp4') + format_id = ext + if rate: + format_id += '-%dk' % rate + formats.append({ + 'format_id': format_id, + 'url': urljoin(download_base, media_url), + 'tbr': rate or extract_bitrate(media_url), + }) + + self._check_formats(formats, media_id) + + duration = info.get('duration') or info.get('cutout') or info.get('cutduration') + if isinstance(duration, compat_str): + duration = parse_duration(duration) + + return { + 'id': media_id, + 'display_id': display_id, + 'formats': formats, + 'title': title, + 'description': info.get('intro'), + 'duration': duration, + 'view_count': int_or_none(info.get('plays')), + 'uploader': info.get('programName'), + 'timestamp': parse_iso8601(info.get('broadcast_date')), + 'thumbnail': unescapeHTML(info.get('preview_image_url')), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvcplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvcplay.py new file mode 100644 index 0000000..741c472 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvcplay.py @@ -0,0 +1,285 @@ +import re + +from .common import InfoExtractor, ExtractorError +from ..utils import ( + clean_html, + determine_ext, + int_or_none, + float_or_none, + js_to_json, + mimetype2ext, + traverse_obj, + urljoin, + url_or_none, +) + + +class RTVCPlayBaseIE(InfoExtractor): + _BASE_VALID_URL = r'https?://(?:www\.)?rtvcplay\.co' + + def _extract_player_config(self, webpage, video_id): + return self._search_json( + r'<script\b[^>]*>[^<]*(?:var|let|const)\s+config\s*=', re.sub(r'"\s*\+\s*"', '', webpage), + 'player_config', video_id, transform_source=js_to_json) + + def _extract_formats_and_subtitles_player_config(self, player_config, video_id): + formats, subtitles = [], {} + for source in traverse_obj(player_config, ('sources', ..., lambda _, v: url_or_none(v['url']))): + ext = mimetype2ext(source.get('mimetype'), default=determine_ext(source['url'])) + if ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + source['url'], video_id, 'mp4', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'url': source['url'], + 'ext': ext, + }) + + return formats, subtitles + + +class RTVCPlayIE(RTVCPlayBaseIE): + _VALID_URL = RTVCPlayBaseIE._BASE_VALID_URL + r'/(?P<category>(?!embed)[^/]+)/(?:[^?#]+/)?(?P<id>[\w-]+)' + + _TESTS = [{ + 'url': 'https://www.rtvcplay.co/en-vivo/canal-institucional', + 'info_dict': { + 'id': 'canal-institucional', + 'title': r're:^Canal Institucional', + 'description': 'md5:eff9e548394175928059320c006031ea', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.rtvcplay.co/en-vivo/senal-colombia', + 'info_dict': { + 'id': 'senal-colombia', + 'title': r're:^Señal Colombia', + 'description': 'md5:799f16a401d97f40c33a2c6a3e2a507b', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.rtvcplay.co/en-vivo/radio-nacional', + 'info_dict': { + 'id': 'radio-nacional', + 'title': r're:^Radio Nacional', + 'description': 'md5:5de009bc6a9fa79d2a6cf0b73f977d53', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }, { + 'url': 'https://www.rtvcplay.co/peliculas-ficcion/senoritas', + 'md5': '1288ee6f6d1330d880f98bff2ed710a3', + 'info_dict': { + 'id': 'senoritas', + 'title': 'Señoritas', + 'description': 'md5:f095a2bb52cb6cf279daf6302f86fb32', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'ext': 'mp4', + }, + }, { + 'url': 'https://www.rtvcplay.co/competencias-basicas-ciudadanas-y-socioemocionales/profe-en-tu-casa/james-regresa-clases-28022022', + 'md5': 'f040a7380a269ad633cf837384d5e9fc', + 'info_dict': { + 'id': 'james-regresa-clases-28022022', + 'title': 'James regresa a clases - 28/02/2022', + 'description': 'md5:c5dcdf757c7ab29305e8763c6007e675', + 'ext': 'mp4', + }, + }, { + 'url': 'https://www.rtvcplay.co/peliculas-documentales/llinas-el-cerebro-y-el-universo', + 'info_dict': { + 'id': 'llinas-el-cerebro-y-el-universo', + 'title': 'Llinás, el cerebro y el universo', + 'description': 'md5:add875bf2309bb52b3e8b9b06116d9b0', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 3, + }, { + 'url': 'https://www.rtvcplay.co/competencias-basicas-ciudadanas-y-socioemocionales/profe-en-tu-casa', + 'info_dict': { + 'id': 'profe-en-tu-casa', + 'title': 'Profe en tu casa', + 'description': 'md5:47dbe20e263194413b1db2a2805a4f2e', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 537, + }, { + 'url': 'https://www.rtvcplay.co/series-al-oido/relato-de-un-naufrago-una-travesia-del-periodismo-a-la-literatura', + 'info_dict': { + 'id': 'relato-de-un-naufrago-una-travesia-del-periodismo-a-la-literatura', + 'title': 'Relato de un náufrago: una travesía del periodismo a la literatura', + 'description': 'md5:6da28fdca4a5a568ea47ef65ef775603', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 5, + }, { + 'url': 'https://www.rtvcplay.co/series-al-oido/diez-versiones', + 'info_dict': { + 'id': 'diez-versiones', + 'title': 'Diez versiones', + 'description': 'md5:997471ed971cb3fd8e41969457675306', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + }, + 'playlist_mincount': 20, + }] + + def _real_extract(self, url): + video_id, category = self._match_valid_url(url).group('id', 'category') + webpage = self._download_webpage(url, video_id) + + hydration = self._search_json( + r'window\.__RTVCPLAY_STATE__\s*=', webpage, 'hydration', + video_id, transform_source=js_to_json)['content']['currentContent'] + + asset_id = traverse_obj(hydration, ('video', 'assetid')) + if asset_id: + hls_url = hydration['base_url_hls'].replace('[node:field_asset_id]', asset_id) + else: + hls_url = traverse_obj(hydration, ('channel', 'hls')) + + metadata = traverse_obj(hydration, { + 'title': 'title', + 'description': 'description', + 'thumbnail': ((('channel', 'image', 'logo'), ('resource', 'image', 'cover_desktop')), 'path'), + }, get_all=False) + + # Probably it's a program's page + if not hls_url: + seasons = traverse_obj( + hydration, ('widgets', lambda _, y: y['type'] == 'seasonList', 'contents'), + get_all=False) + if not seasons: + podcast_episodes = hydration.get('audios') + if not podcast_episodes: + raise ExtractorError('Could not find asset_id nor program playlist nor podcast episodes') + + return self.playlist_result([ + self.url_result(episode['file'], url_transparent=True, **traverse_obj(episode, { + 'title': 'title', + 'description': ('description', {clean_html}), + 'episode_number': ('chapter_number', {float_or_none}, {int_or_none}), + 'season_number': ('season', {int_or_none}), + })) for episode in podcast_episodes], video_id, **metadata) + + entries = [self.url_result( + urljoin(url, episode['slug']), url_transparent=True, + **traverse_obj(season, { + 'season': 'title', + 'season_number': ('season', {int_or_none}), + }), **traverse_obj(episode, { + 'title': 'title', + 'thumbnail': ('image', 'cover', 'path'), + 'episode_number': ('chapter_number', {int_or_none}), + })) for season in seasons for episode in traverse_obj(season, ('contents', ...))] + + return self.playlist_result(entries, video_id, **metadata) + + formats, subtitles = self._extract_m3u8_formats_and_subtitles(hls_url, video_id, 'mp4') + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + 'is_live': category == 'en-vivo', + **metadata, + } + + +class RTVCPlayEmbedIE(RTVCPlayBaseIE): + _VALID_URL = RTVCPlayBaseIE._BASE_VALID_URL + r'/embed/(?P<id>[\w-]+)' + + _TESTS = [{ + 'url': 'https://www.rtvcplay.co/embed/72b0e699-248b-4929-a4a8-3782702fa7f9', + 'md5': 'ed529aeaee7aa2a72afe91ac7d1177a8', + 'info_dict': { + 'id': '72b0e699-248b-4929-a4a8-3782702fa7f9', + 'title': 'Tráiler: Señoritas', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'ext': 'mp4', + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + player_config = self._extract_player_config(webpage, video_id) + formats, subtitles = self._extract_formats_and_subtitles_player_config(player_config, video_id) + + asset_id = traverse_obj(player_config, ('rtvcplay', 'assetid')) + metadata = {} if not asset_id else self._download_json( + f'https://cms.rtvcplay.co/api/v1/video/asset-id/{asset_id}', video_id, fatal=False) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(metadata, { + 'title': 'title', + 'description': 'description', + 'thumbnail': ('image', ..., 'thumbnail', 'path'), + }, get_all=False) + } + + +class RTVCKalturaIE(RTVCPlayBaseIE): + _VALID_URL = r'https?://media\.rtvc\.gov\.co/kalturartvc/(?P<id>[\w-]+)' + + _TESTS = [{ + 'url': 'https://media.rtvc.gov.co/kalturartvc/indexSC.html', + 'info_dict': { + 'id': 'indexSC', + 'title': r're:^Señal Colombia', + 'description': 'md5:799f16a401d97f40c33a2c6a3e2a507b', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + player_config = self._extract_player_config(webpage, video_id) + formats, subtitles = self._extract_formats_and_subtitles_player_config(player_config, video_id) + + channel_id = traverse_obj(player_config, ('rtvcplay', 'channelId')) + metadata = {} if not channel_id else self._download_json( + f'https://cms.rtvcplay.co/api/v1/taxonomy_term/streaming/{channel_id}', video_id, fatal=False) + + fmts, subs = self._extract_m3u8_formats_and_subtitles( + traverse_obj(metadata, ('channel', 'hls')), video_id, 'mp4', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + 'is_live': True, + **traverse_obj(metadata, { + 'title': 'title', + 'description': 'description', + 'thumbnail': ('channel', 'image', 'logo', 'path'), + }) + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtve.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtve.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtve.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtve.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtvnh.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvnh.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtvnh.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtvnh.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rtvs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvs.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rtvs.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rtvs.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvslo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvslo.py new file mode 100644 index 0000000..39ace7c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rtvslo.py @@ -0,0 +1,166 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + parse_duration, + traverse_obj, + unified_timestamp, + url_or_none, +) + + +class RTVSLOIE(InfoExtractor): + IE_NAME = 'rtvslo.si' + _VALID_URL = r'''(?x) + https?://(?: + (?:365|4d)\.rtvslo.si/arhiv/[^/?#&;]+| + (?:www\.)?rtvslo\.si/rtv365/arhiv + )/(?P<id>\d+)''' + _GEO_COUNTRIES = ['SI'] + + _API_BASE = 'https://api.rtvslo.si/ava/{}/{}?client_id=82013fb3a531d5414f478747c1aca622' + SUB_LANGS_MAP = {'Slovenski': 'sl'} + + _TESTS = [ + { + 'url': 'https://www.rtvslo.si/rtv365/arhiv/174842550?s=tv', + 'info_dict': { + 'id': '174842550', + 'ext': 'mp4', + 'release_timestamp': 1643140032, + 'upload_date': '20220125', + 'series': 'Dnevnik', + 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/92/dnevnik_3_wide2.jpg', + 'description': 'md5:76a18692757aeb8f0f51221106277dd2', + 'timestamp': 1643137046, + 'title': 'Dnevnik', + 'series_id': '92', + 'release_date': '20220125', + 'duration': 1789, + }, + }, { + 'url': 'https://365.rtvslo.si/arhiv/utrip/174843754', + 'info_dict': { + 'id': '174843754', + 'ext': 'mp4', + 'series_id': '94', + 'release_date': '20220129', + 'timestamp': 1643484455, + 'title': 'Utrip', + 'duration': 813, + 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/94/utrip_1_wide2.jpg', + 'description': 'md5:77f2892630c7b17bb7a5bb84319020c9', + 'release_timestamp': 1643485825, + 'upload_date': '20220129', + 'series': 'Utrip', + }, + }, { + 'url': 'https://365.rtvslo.si/arhiv/il-giornale-della-sera/174844609', + 'info_dict': { + 'id': '174844609', + 'ext': 'mp3', + 'series_id': '106615841', + 'title': 'Il giornale della sera', + 'duration': 1328, + 'series': 'Il giornale della sera', + 'timestamp': 1643743800, + 'release_timestamp': 1643745424, + 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/il-giornale-della-sera_wide2.jpg', + 'upload_date': '20220201', + 'tbr': 128000, + 'release_date': '20220201', + }, + }, { + 'url': 'https://365.rtvslo.si/arhiv/razred-zase/148350750', + 'info_dict': { + 'id': '148350750', + 'ext': 'mp4', + 'title': 'Prvi Å¡olski dan, mozaiÄna oddaja za mlade', + 'series': 'Razred zase', + 'series_id': '148185730', + 'duration': 1481, + 'upload_date': '20121019', + 'timestamp': 1350672122, + 'release_date': '20121019', + 'release_timestamp': 1350672122, + 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/148185730/razred_zase_2014_logo_4d_wide2.jpg', + }, + }, { + 'url': 'https://4d.rtvslo.si/arhiv/dnevnik/174842550', + 'only_matching': True + } + ] + + def _real_extract(self, url): + v_id = self._match_id(url) + meta = self._download_json(self._API_BASE.format('getRecordingDrm', v_id), v_id)['response'] + + thumbs = [{'id': k, 'url': v, 'http_headers': {'Accept': 'image/jpeg'}} + for k, v in (meta.get('images') or {}).items()] + + subs = {} + for s in traverse_obj(meta, 'subs', 'subtitles', default=[]): + lang = self.SUB_LANGS_MAP.get(s.get('language'), s.get('language') or 'und') + subs.setdefault(lang, []).append({ + 'url': s.get('file'), + 'ext': traverse_obj(s, 'format', expected_type=str.lower), + }) + + jwt = meta.get('jwt') + if not jwt: + raise ExtractorError('Site did not provide an authentication token, cannot proceed.') + + media = self._download_json(self._API_BASE.format('getMedia', v_id), v_id, query={'jwt': jwt})['response'] + + formats = [] + skip_protocols = ['smil', 'f4m', 'dash'] + adaptive_url = traverse_obj(media, ('addaptiveMedia', 'hls_sec'), expected_type=url_or_none) + if adaptive_url: + formats = self._extract_wowza_formats(adaptive_url, v_id, skip_protocols=skip_protocols) + + adaptive_url = traverse_obj(media, ('addaptiveMedia_sl', 'hls_sec'), expected_type=url_or_none) + if adaptive_url: + for f in self._extract_wowza_formats(adaptive_url, v_id, skip_protocols=skip_protocols): + formats.append({ + **f, + 'format_id': 'sign-' + f['format_id'], + 'format_note': 'Sign language interpretation', 'preference': -10, + 'language': ( + 'slv' if f.get('language') == 'eng' and f.get('acodec') != 'none' + else f.get('language')) + }) + + for mediafile in traverse_obj(media, ('mediaFiles', lambda _, v: url_or_none(v['streams']['https']))): + formats.append(traverse_obj(mediafile, { + 'url': ('streams', 'https'), + 'ext': ('mediaType', {str.lower}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + 'tbr': ('bitrate', {int_or_none}), + 'filesize': ('filesize', {int_or_none}), + })) + + for mediafile in traverse_obj(media, ('mediaFiles', lambda _, v: url_or_none(v['streams']['hls_sec']))): + formats.extend(self._extract_wowza_formats( + mediafile['streams']['hls_sec'], v_id, skip_protocols=skip_protocols)) + + if any('intermission.mp4' in x['url'] for x in formats): + self.raise_geo_restricted(countries=self._GEO_COUNTRIES, metadata_available=True) + if any('dummy_720p.mp4' in x.get('manifest_url', '') for x in formats) and meta.get('stub') == 'error': + raise ExtractorError(f'{self.IE_NAME} said: Clip not available', expected=True) + + return { + 'id': v_id, + 'webpage_url': ''.join(traverse_obj(meta, ('canonical', ('domain', 'path')))), + 'title': meta.get('title'), + 'formats': formats, + 'subtitles': subs, + 'thumbnails': thumbs, + 'description': meta.get('description'), + 'timestamp': unified_timestamp(traverse_obj(meta, 'broadcastDate', ('broadcastDates', 0))), + 'release_timestamp': unified_timestamp(meta.get('recordingDate')), + 'duration': meta.get('duration') or parse_duration(meta.get('length')), + 'tags': meta.get('genre'), + 'series': meta.get('showName'), + 'series_id': meta.get('showId'), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ruhd.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ruhd.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ruhd.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ruhd.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rule34video.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rule34video.py new file mode 100644 index 0000000..f3250b5 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rule34video.py @@ -0,0 +1,65 @@ +import re + +from ..utils import parse_duration, unescapeHTML +from .common import InfoExtractor + + +class Rule34VideoIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rule34video\.com/videos/(?P<id>\d+)' + _TESTS = [ + { + 'url': 'https://rule34video.com/videos/3065157/shot-it-mmd-hmv/', + 'md5': 'ffccac2c23799dabbd192621ae4d04f3', + 'info_dict': { + 'id': '3065157', + 'ext': 'mp4', + 'title': 'Shot It-(mmd hmv)', + 'thumbnail': 'https://rule34video.com/contents/videos_screenshots/3065000/3065157/preview.jpg', + 'duration': 347.0, + 'age_limit': 18, + 'tags': 'count:14' + } + }, + { + 'url': 'https://rule34video.com/videos/3065296/lara-in-trouble-ep-7-wildeerstudio/', + 'md5': '6bb5169f9f6b38cd70882bf2e64f6b86', + 'info_dict': { + 'id': '3065296', + 'ext': 'mp4', + 'title': 'Lara in Trouble Ep. 7 [WildeerStudio]', + 'thumbnail': 'https://rule34video.com/contents/videos_screenshots/3065000/3065296/preview.jpg', + 'duration': 938.0, + 'age_limit': 18, + 'tags': 'count:50' + } + }, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + formats = [] + + for mobj in re.finditer(r'<a[^>]+href="(?P<video_url>[^"]+download=true[^"]+)".*>(?P<ext>[^\s]+) (?P<quality>[^<]+)p</a>', webpage): + url, ext, quality = mobj.groups() + formats.append({ + 'url': url, + 'ext': ext.lower(), + 'quality': quality, + }) + + title = self._html_extract_title(webpage) + thumbnail = self._html_search_regex(r'preview_url:\s+\'([^\']+)\'', webpage, 'thumbnail', default=None) + duration = self._html_search_regex(r'"icon-clock"></i>\s+<span>((?:\d+:?)+)', webpage, 'duration', default=None) + + return { + 'id': video_id, + 'formats': formats, + 'title': title, + 'thumbnail': thumbnail, + 'duration': parse_duration(duration), + 'age_limit': 18, + 'tags': list(map(unescapeHTML, re.findall( + r'<a class="tag_item"[^>]+\bhref="https://rule34video\.com/tags/\d+/"[^>]*>(?P<tag>[^>]*)</a>', webpage))), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/rumble.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rumble.py new file mode 100644 index 0000000..85567d9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/rumble.py @@ -0,0 +1,391 @@ +import itertools +import re + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + UnsupportedError, + clean_html, + determine_ext, + format_field, + get_element_by_class, + int_or_none, + join_nonempty, + parse_count, + parse_iso8601, + traverse_obj, + unescapeHTML, +) + + +class RumbleEmbedIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rumble\.com/embed/(?:[0-9a-z]+\.)?(?P<id>[0-9a-z]+)' + _EMBED_REGEX = [fr'(?:<(?:script|iframe)[^>]+\bsrc=|["\']embedUrl["\']\s*:\s*)["\'](?P<url>{_VALID_URL})'] + _TESTS = [{ + 'url': 'https://rumble.com/embed/v5pv5f', + 'md5': '36a18a049856720189f30977ccbb2c34', + 'info_dict': { + 'id': 'v5pv5f', + 'ext': 'mp4', + 'title': 'WMAR 2 News Latest Headlines | October 20, 6pm', + 'timestamp': 1571611968, + 'upload_date': '20191020', + 'channel_url': 'https://rumble.com/c/WMAR', + 'channel': 'WMAR', + 'thumbnail': 'https://sp.rmbl.ws/s8/1/5/M/z/1/5Mz1a.qR4e-small-WMAR-2-News-Latest-Headline.jpg', + 'duration': 234, + 'uploader': 'WMAR', + 'live_status': 'not_live', + } + }, { + 'url': 'https://rumble.com/embed/vslb7v', + 'md5': '7418035de1a30a178b8af34dc2b6a52b', + 'info_dict': { + 'id': 'vslb7v', + 'ext': 'mp4', + 'title': 'Defense Sec. says US Commitment to NATO Defense \'Ironclad\'', + 'timestamp': 1645142135, + 'upload_date': '20220217', + 'channel_url': 'https://rumble.com/c/CyberTechNews', + 'channel': 'CTNews', + 'thumbnail': 'https://sp.rmbl.ws/s8/6/7/i/9/h/7i9hd.OvCc.jpg', + 'duration': 901, + 'uploader': 'CTNews', + 'live_status': 'not_live', + } + }, { + 'url': 'https://rumble.com/embed/vunh1h', + 'info_dict': { + 'id': 'vunh1h', + 'ext': 'mp4', + 'title': '‘Gideon, op zoek naar de waarheid’ including ENG SUBS', + 'timestamp': 1647197663, + 'upload_date': '20220313', + 'channel_url': 'https://rumble.com/user/BLCKBX', + 'channel': 'BLCKBX', + 'thumbnail': r're:https://.+\.jpg', + 'duration': 5069, + 'uploader': 'BLCKBX', + 'live_status': 'not_live', + 'subtitles': { + 'en': [ + { + 'url': r're:https://.+\.vtt', + 'name': 'English', + 'ext': 'vtt' + } + ] + }, + }, + 'params': {'skip_download': True} + }, { + 'url': 'https://rumble.com/embed/v1essrt', + 'info_dict': { + 'id': 'v1essrt', + 'ext': 'mp4', + 'title': 'startswith:lofi hip hop radio 📚 - beats to relax/study to', + 'timestamp': 1661519399, + 'upload_date': '20220826', + 'channel_url': 'https://rumble.com/c/LofiGirl', + 'channel': 'Lofi Girl', + 'thumbnail': r're:https://.+\.jpg', + 'duration': None, + 'uploader': 'Lofi Girl', + 'live_status': 'is_live', + }, + 'params': {'skip_download': True} + }, { + 'url': 'https://rumble.com/embed/v1amumr', + 'info_dict': { + 'id': 'v1amumr', + 'ext': 'mp4', + 'fps': 60, + 'title': 'Turning Point USA 2022 Student Action Summit DAY 1 - Rumble Exclusive Live', + 'timestamp': 1658518457, + 'upload_date': '20220722', + 'channel_url': 'https://rumble.com/c/RumbleEvents', + 'channel': 'Rumble Events', + 'thumbnail': r're:https://.+\.jpg', + 'duration': 16427, + 'uploader': 'Rumble Events', + 'live_status': 'was_live', + }, + 'params': {'skip_download': True} + }, { + 'url': 'https://rumble.com/embed/ufe9n.v5pv5f', + 'only_matching': True, + }] + + _WEBPAGE_TESTS = [ + { + 'note': 'Rumble JS embed', + 'url': 'https://therightscoop.com/what-does-9-plus-1-plus-1-equal-listen-to-this-audio-of-attempted-kavanaugh-assassins-call-and-youll-get-it', + 'md5': '4701209ac99095592e73dbba21889690', + 'info_dict': { + 'id': 'v15eqxl', + 'ext': 'mp4', + 'channel': 'Mr Producer Media', + 'duration': 92, + 'title': '911 Audio From The Man Who Wanted To Kill Supreme Court Justice Kavanaugh', + 'channel_url': 'https://rumble.com/c/RichSementa', + 'thumbnail': 'https://sp.rmbl.ws/s8/1/P/j/f/A/PjfAe.qR4e-small-911-Audio-From-The-Man-Who-.jpg', + 'timestamp': 1654892716, + 'uploader': 'Mr Producer Media', + 'upload_date': '20220610', + 'live_status': 'not_live', + } + }, + ] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + embeds = tuple(super()._extract_embed_urls(url, webpage)) + if embeds: + return embeds + return [f'https://rumble.com/embed/{mobj.group("id")}' for mobj in re.finditer( + r'<script>[^<]*\bRumble\(\s*"play"\s*,\s*{[^}]*[\'"]?video[\'"]?\s*:\s*[\'"](?P<id>[0-9a-z]+)[\'"]', webpage)] + + def _real_extract(self, url): + video_id = self._match_id(url) + video = self._download_json( + 'https://rumble.com/embedJS/u3/', video_id, + query={'request': 'video', 'ver': 2, 'v': video_id}) + + sys_msg = traverse_obj(video, ('sys', 'msg')) + if sys_msg: + self.report_warning(sys_msg, video_id=video_id) + + if video.get('live') == 0: + live_status = 'not_live' if video.get('livestream_has_dvr') is None else 'was_live' + elif video.get('live') == 1: + live_status = 'is_upcoming' if video.get('livestream_has_dvr') else 'was_live' + elif video.get('live') == 2: + live_status = 'is_live' + else: + live_status = None + + formats = [] + for ext, ext_info in (video.get('ua') or {}).items(): + if isinstance(ext_info, dict): + for height, video_info in ext_info.items(): + if not traverse_obj(video_info, ('meta', 'h', {int_or_none})): + video_info.setdefault('meta', {})['h'] = height + ext_info = ext_info.values() + + for video_info in ext_info: + meta = video_info.get('meta') or {} + if not video_info.get('url'): + continue + if ext == 'hls': + if meta.get('live') is True and video.get('live') == 1: + live_status = 'post_live' + formats.extend(self._extract_m3u8_formats( + video_info['url'], video_id, + ext='mp4', m3u8_id='hls', fatal=False, live=live_status == 'is_live')) + continue + timeline = ext == 'timeline' + if timeline: + ext = determine_ext(video_info['url']) + formats.append({ + 'ext': ext, + 'acodec': 'none' if timeline else None, + 'url': video_info['url'], + 'format_id': join_nonempty(ext, format_field(meta, 'h', '%sp')), + 'format_note': 'Timeline' if timeline else None, + 'fps': None if timeline else video.get('fps'), + **traverse_obj(meta, { + 'tbr': 'bitrate', + 'filesize': 'size', + 'width': 'w', + 'height': 'h', + }, expected_type=lambda x: int(x) or None) + }) + + subtitles = { + lang: [{ + 'url': sub_info['path'], + 'name': sub_info.get('language') or '', + }] for lang, sub_info in (video.get('cc') or {}).items() if sub_info.get('path') + } + + author = video.get('author') or {} + thumbnails = traverse_obj(video, ('t', ..., {'url': 'i', 'width': 'w', 'height': 'h'})) + if not thumbnails and video.get('i'): + thumbnails = [{'url': video['i']}] + + if live_status in {'is_live', 'post_live'}: + duration = None + else: + duration = int_or_none(video.get('duration')) + + return { + 'id': video_id, + 'title': unescapeHTML(video.get('title')), + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'timestamp': parse_iso8601(video.get('pubDate')), + 'channel': author.get('name'), + 'channel_url': author.get('url'), + 'duration': duration, + 'uploader': author.get('name'), + 'live_status': live_status, + } + + +class RumbleIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?rumble\.com/(?P<id>v(?!ideos)[\w.-]+)[^/]*$' + _EMBED_REGEX = [ + r'<a class=video-item--a href=(?P<url>/v[\w.-]+\.html)>', + r'<a[^>]+class="videostream__link link"[^>]+href=(?P<url>/v[\w.-]+\.html)[^>]*>'] + _TESTS = [{ + 'add_ie': ['RumbleEmbed'], + 'url': 'https://rumble.com/vdmum1-moose-the-dog-helps-girls-dig-a-snow-fort.html', + 'md5': '53af34098a7f92c4e51cf0bd1c33f009', + 'info_dict': { + 'id': 'vb0ofn', + 'ext': 'mp4', + 'timestamp': 1612662578, + 'uploader': 'LovingMontana', + 'channel': 'LovingMontana', + 'upload_date': '20210207', + 'title': 'Winter-loving dog helps girls dig a snow fort ', + 'description': 'Moose the dog is more than happy to help with digging out this epic snow fort. Great job, Moose!', + 'channel_url': 'https://rumble.com/c/c-546523', + 'thumbnail': r're:https://.+\.jpg', + 'duration': 103, + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + 'live_status': 'not_live', + } + }, { + 'url': 'http://www.rumble.com/vDMUM1?key=value', + 'only_matching': True, + }, { + 'note': 'timeline format', + 'url': 'https://rumble.com/v2ea9qb-the-u.s.-cannot-hide-this-in-ukraine-anymore-redacted-with-natali-and-clayt.html', + 'md5': '40d61fec6c0945bca3d0e1dc1aa53d79', + 'params': {'format': 'wv'}, + 'info_dict': { + 'id': 'v2bou5f', + 'ext': 'mp4', + 'uploader': 'Redacted News', + 'upload_date': '20230322', + 'timestamp': 1679445010, + 'title': 'The U.S. CANNOT hide this in Ukraine anymore | Redacted with Natali and Clayton Morris', + 'duration': 892, + 'channel': 'Redacted News', + 'description': 'md5:aaad0c5c3426d7a361c29bdaaced7c42', + 'channel_url': 'https://rumble.com/c/Redacted', + 'live_status': 'not_live', + 'thumbnail': 'https://sp.rmbl.ws/s8/1/d/x/2/O/dx2Oi.qR4e-small-The-U.S.-CANNOT-hide-this-i.jpg', + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + }, + }, { + 'url': 'https://rumble.com/v2e7fju-the-covid-twitter-files-drop-protecting-fauci-while-censoring-the-truth-wma.html', + 'info_dict': { + 'id': 'v2blzyy', + 'ext': 'mp4', + 'live_status': 'was_live', + 'release_timestamp': 1679446804, + 'description': 'md5:2ac4908ccfecfb921f8ffa4b30c1e636', + 'release_date': '20230322', + 'timestamp': 1679445692, + 'duration': 4435, + 'upload_date': '20230322', + 'title': 'The Covid Twitter Files Drop: Protecting Fauci While Censoring The Truth w/Matt Taibbi', + 'uploader': 'Kim Iversen', + 'channel_url': 'https://rumble.com/c/KimIversen', + 'channel': 'Kim Iversen', + 'thumbnail': 'https://sp.rmbl.ws/s8/1/6/b/w/O/6bwOi.qR4e-small-The-Covid-Twitter-Files-Dro.jpg', + 'like_count': int, + 'dislike_count': int, + 'view_count': int, + }, + }] + + _WEBPAGE_TESTS = [{ + 'url': 'https://rumble.com/videos?page=2', + 'playlist_mincount': 24, + 'info_dict': { + 'id': 'videos?page=2', + 'title': 'All videos', + 'description': 'Browse videos uploaded to Rumble.com', + 'age_limit': 0, + }, + }, { + 'url': 'https://rumble.com/browse/live', + 'playlist_mincount': 25, + 'info_dict': { + 'id': 'live', + 'title': 'Browse', + 'age_limit': 0, + }, + }, { + 'url': 'https://rumble.com/search/video?q=rumble&sort=views', + 'playlist_mincount': 24, + 'info_dict': { + 'id': 'video?q=rumble&sort=views', + 'title': 'Search results for: rumble', + 'age_limit': 0, + }, + }] + + def _real_extract(self, url): + page_id = self._match_id(url) + webpage = self._download_webpage(url, page_id) + url_info = next(RumbleEmbedIE.extract_from_webpage(self._downloader, url, webpage), None) + if not url_info: + raise UnsupportedError(url) + + return { + '_type': 'url_transparent', + 'ie_key': url_info['ie_key'], + 'url': url_info['url'], + 'release_timestamp': parse_iso8601(self._search_regex( + r'(?:Livestream begins|Streamed on):\s+<time datetime="([^"]+)', webpage, 'release date', default=None)), + 'view_count': int_or_none(self._search_regex( + r'"userInteractionCount"\s*:\s*(\d+)', webpage, 'view count', default=None)), + 'like_count': parse_count(self._search_regex( + r'<span data-js="rumbles_up_votes">\s*([\d,.KM]+)', webpage, 'like count', default=None)), + 'dislike_count': parse_count(self._search_regex( + r'<span data-js="rumbles_down_votes">\s*([\d,.KM]+)', webpage, 'dislike count', default=None)), + 'description': clean_html(get_element_by_class('media-description', webpage)) + } + + +class RumbleChannelIE(InfoExtractor): + _VALID_URL = r'(?P<url>https?://(?:www\.)?rumble\.com/(?:c|user)/(?P<id>[^&?#$/]+))' + + _TESTS = [{ + 'url': 'https://rumble.com/c/Styxhexenhammer666', + 'playlist_mincount': 1160, + 'info_dict': { + 'id': 'Styxhexenhammer666', + }, + }, { + 'url': 'https://rumble.com/user/goldenpoodleharleyeuna', + 'playlist_mincount': 4, + 'info_dict': { + 'id': 'goldenpoodleharleyeuna', + }, + }] + + def entries(self, url, playlist_id): + for page in itertools.count(1): + try: + webpage = self._download_webpage(f'{url}?page={page}', playlist_id, note='Downloading page %d' % page) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 404: + break + raise + for video_url in re.findall(r'class=video-item--a\s?href=([^>]+\.html)', webpage): + yield self.url_result('https://rumble.com' + video_url) + + def _real_extract(self, url): + url, playlist_id = self._match_valid_url(url).groups() + return self.playlist_result(self.entries(url, playlist_id), playlist_id=playlist_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rutube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rutube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rutube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rutube.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/rutv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/rutv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/rutv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/rutv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ruutu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ruutu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ruutu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ruutu.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ruv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ruv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ruv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ruv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/s4c.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/s4c.py new file mode 100644 index 0000000..67eff72 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/s4c.py @@ -0,0 +1,103 @@ +from .common import InfoExtractor +from ..utils import traverse_obj, url_or_none + + +class S4CIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?s4c\.cymru/clic/programme/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.s4c.cymru/clic/programme/861362209', + 'info_dict': { + 'id': '861362209', + 'ext': 'mp4', + 'title': 'Y Swn', + 'description': 'md5:f7681a30e4955b250b3224aa9fe70cf0', + 'duration': 5340, + 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Y_Swn_2023S4C_099_ii.jpg' + }, + }, { + 'url': 'https://www.s4c.cymru/clic/programme/856636948', + 'info_dict': { + 'id': '856636948', + 'ext': 'mp4', + 'title': 'Am Dro', + 'duration': 2880, + 'description': 'md5:100d8686fc9a632a0cb2db52a3433ffe', + 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Am_Dro_2022-23S4C_P6_4005.jpg' + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + details = self._download_json( + f'https://www.s4c.cymru/df/full_prog_details?lang=e&programme_id={video_id}', + video_id, fatal=False) + + player_config = self._download_json( + 'https://player-api.s4c-cdn.co.uk/player-configuration/prod', video_id, query={ + 'programme_id': video_id, + 'signed': '0', + 'lang': 'en', + 'mode': 'od', + 'appId': 'clic', + 'streamName': '', + }, note='Downloading player config JSON') + subtitles = {} + for sub in traverse_obj(player_config, ('subtitles', lambda _, v: url_or_none(v['0']))): + subtitles.setdefault(sub.get('3', 'en'), []).append({ + 'url': sub['0'], + 'name': sub.get('1'), + }) + m3u8_url = self._download_json( + 'https://player-api.s4c-cdn.co.uk/streaming-urls/prod', video_id, query={ + 'mode': 'od', + 'application': 'clic', + 'region': 'WW', + 'extra': 'false', + 'thirdParty': 'false', + 'filename': player_config['filename'], + }, note='Downloading streaming urls JSON')['hls'] + + return { + 'id': video_id, + 'formats': self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', m3u8_id='hls'), + 'subtitles': subtitles, + 'thumbnail': url_or_none(player_config.get('poster')), + **traverse_obj(details, ('full_prog_details', 0, { + 'title': (('programme_title', 'series_title'), {str}), + 'description': ('full_billing', {str.strip}), + 'duration': ('duration', {lambda x: int(x) * 60}), + }), get_all=False), + } + + +class S4CSeriesIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?s4c\.cymru/clic/series/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.s4c.cymru/clic/series/864982911', + 'playlist_mincount': 6, + 'info_dict': { + 'id': '864982911', + 'title': 'Iaith ar Daith', + }, + }, { + 'url': 'https://www.s4c.cymru/clic/series/866852587', + 'playlist_mincount': 8, + 'info_dict': { + 'id': '866852587', + 'title': 'FFIT Cymru', + }, + }] + + def _real_extract(self, url): + series_id = self._match_id(url) + series_details = self._download_json( + 'https://www.s4c.cymru/df/series_details', series_id, query={ + 'lang': 'e', + 'series_id': series_id, + 'show_prog_in_series': 'Y' + }, note='Downloading series details JSON') + + return self.playlist_result( + [self.url_result(f'https://www.s4c.cymru/clic/programme/{episode_id}', S4CIE, episode_id) + for episode_id in traverse_obj(series_details, ('other_progs_in_series', ..., 'id'))], + series_id, traverse_obj(series_details, ('full_prog_details', 0, 'series_title', {str}))) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/safari.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/safari.py new file mode 100644 index 0000000..8d322d7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/safari.py @@ -0,0 +1,259 @@ +import json +import re + +from .common import InfoExtractor + +from ..compat import ( + compat_parse_qs, + compat_urlparse, +) +from ..utils import ( + ExtractorError, + update_url_query, +) + + +class SafariBaseIE(InfoExtractor): + _LOGIN_URL = 'https://learning.oreilly.com/accounts/login/' + _NETRC_MACHINE = 'safari' + + _API_BASE = 'https://learning.oreilly.com/api/v1' + _API_FORMAT = 'json' + + LOGGED_IN = False + + def _perform_login(self, username, password): + _, urlh = self._download_webpage_handle( + 'https://learning.oreilly.com/accounts/login-check/', None, + 'Downloading login page') + + def is_logged(urlh): + return 'learning.oreilly.com/home/' in urlh.url + + if is_logged(urlh): + self.LOGGED_IN = True + return + + redirect_url = urlh.url + parsed_url = compat_urlparse.urlparse(redirect_url) + qs = compat_parse_qs(parsed_url.query) + next_uri = compat_urlparse.urljoin( + 'https://api.oreilly.com', qs['next'][0]) + + auth, urlh = self._download_json_handle( + 'https://www.oreilly.com/member/auth/login/', None, 'Logging in', + data=json.dumps({ + 'email': username, + 'password': password, + 'redirect_uri': next_uri, + }).encode(), headers={ + 'Content-Type': 'application/json', + 'Referer': redirect_url, + }, expected_status=400) + + credentials = auth.get('credentials') + if (not auth.get('logged_in') and not auth.get('redirect_uri') + and credentials): + raise ExtractorError( + 'Unable to login: %s' % credentials, expected=True) + + # oreilly serves two same instances of the following cookies + # in Set-Cookie header and expects first one to be actually set + for cookie in ('groot_sessionid', 'orm-jwt', 'orm-rt'): + self._apply_first_set_cookie_header(urlh, cookie) + + _, urlh = self._download_webpage_handle( + auth.get('redirect_uri') or next_uri, None, 'Completing login',) + + if is_logged(urlh): + self.LOGGED_IN = True + return + + raise ExtractorError('Unable to log in') + + +class SafariIE(SafariBaseIE): + IE_NAME = 'safari' + IE_DESC = 'safaribooksonline.com online video' + _VALID_URL = r'''(?x) + https?:// + (?:www\.)?(?:safaribooksonline|(?:learning\.)?oreilly)\.com/ + (?: + library/view/[^/]+/(?P<course_id>[^/]+)/(?P<part>[^/?\#&]+)\.html| + videos/[^/]+/[^/]+/(?P<reference_id>[^-]+-[^/?\#&]+) + ) + ''' + + _TESTS = [{ + 'url': 'https://www.safaribooksonline.com/library/view/hadoop-fundamentals-livelessons/9780133392838/part00.html', + 'md5': 'dcc5a425e79f2564148652616af1f2a3', + 'info_dict': { + 'id': '0_qbqx90ic', + 'ext': 'mp4', + 'title': 'Introduction to Hadoop Fundamentals LiveLessons', + 'timestamp': 1437758058, + 'upload_date': '20150724', + 'uploader_id': 'stork', + }, + }, { + # non-digits in course id + 'url': 'https://www.safaribooksonline.com/library/view/create-a-nodejs/100000006A0210/part00.html', + 'only_matching': True, + }, { + 'url': 'https://www.safaribooksonline.com/library/view/learning-path-red/9780134664057/RHCE_Introduction.html', + 'only_matching': True, + }, { + 'url': 'https://www.safaribooksonline.com/videos/python-programming-language/9780134217314/9780134217314-PYMC_13_00', + 'only_matching': True, + }, { + 'url': 'https://learning.oreilly.com/videos/hadoop-fundamentals-livelessons/9780133392838/9780133392838-00_SeriesIntro', + 'only_matching': True, + }, { + 'url': 'https://www.oreilly.com/library/view/hadoop-fundamentals-livelessons/9780133392838/00_SeriesIntro.html', + 'only_matching': True, + }] + + _PARTNER_ID = '1926081' + _UICONF_ID = '29375172' + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + + reference_id = mobj.group('reference_id') + if reference_id: + video_id = reference_id + partner_id = self._PARTNER_ID + ui_id = self._UICONF_ID + else: + video_id = '%s-%s' % (mobj.group('course_id'), mobj.group('part')) + + webpage, urlh = self._download_webpage_handle(url, video_id) + + mobj = re.match(self._VALID_URL, urlh.url) + reference_id = mobj.group('reference_id') + if not reference_id: + reference_id = self._search_regex( + r'data-reference-id=(["\'])(?P<id>(?:(?!\1).)+)\1', + webpage, 'kaltura reference id', group='id') + partner_id = self._search_regex( + r'data-partner-id=(["\'])(?P<id>(?:(?!\1).)+)\1', + webpage, 'kaltura widget id', default=self._PARTNER_ID, + group='id') + ui_id = self._search_regex( + r'data-ui-id=(["\'])(?P<id>(?:(?!\1).)+)\1', + webpage, 'kaltura uiconf id', default=self._UICONF_ID, + group='id') + + query = { + 'wid': '_%s' % partner_id, + 'uiconf_id': ui_id, + 'flashvars[referenceId]': reference_id, + } + + if self.LOGGED_IN: + kaltura_session = self._download_json( + '%s/player/kaltura_session/?reference_id=%s' % (self._API_BASE, reference_id), + video_id, 'Downloading kaltura session JSON', + 'Unable to download kaltura session JSON', fatal=False, + headers={'Accept': 'application/json'}) + if kaltura_session: + session = kaltura_session.get('session') + if session: + query['flashvars[ks]'] = session + + return self.url_result(update_url_query( + 'https://cdnapisec.kaltura.com/html5/html5lib/v2.37.1/mwEmbedFrame.php', query), + 'Kaltura') + + +class SafariApiIE(SafariBaseIE): + IE_NAME = 'safari:api' + _VALID_URL = r'https?://(?:www\.)?(?:safaribooksonline|(?:learning\.)?oreilly)\.com/api/v1/book/(?P<course_id>[^/]+)/chapter(?:-content)?/(?P<part>[^/?#&]+)\.html' + + _TESTS = [{ + 'url': 'https://www.safaribooksonline.com/api/v1/book/9780133392838/chapter/part00.html', + 'only_matching': True, + }, { + 'url': 'https://www.safaribooksonline.com/api/v1/book/9780134664057/chapter/RHCE_Introduction.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + part = self._download_json( + url, '%s/%s' % (mobj.group('course_id'), mobj.group('part')), + 'Downloading part JSON') + web_url = part['web_url'] + if 'library/view' in web_url: + web_url = web_url.replace('library/view', 'videos') + natural_keys = part['natural_key'] + web_url = f'{web_url.rsplit("/", 1)[0]}/{natural_keys[0]}-{natural_keys[1][:-5]}' + return self.url_result(web_url, SafariIE.ie_key()) + + +class SafariCourseIE(SafariBaseIE): + IE_NAME = 'safari:course' + IE_DESC = 'safaribooksonline.com online courses' + + _VALID_URL = r'''(?x) + https?:// + (?: + (?:www\.)?(?:safaribooksonline|(?:learning\.)?oreilly)\.com/ + (?: + library/view/[^/]+| + api/v1/book| + videos/[^/]+ + )| + techbus\.safaribooksonline\.com + ) + /(?P<id>[^/]+) + ''' + + _TESTS = [{ + 'url': 'https://www.safaribooksonline.com/library/view/hadoop-fundamentals-livelessons/9780133392838/', + 'info_dict': { + 'id': '9780133392838', + 'title': 'Hadoop Fundamentals LiveLessons', + }, + 'playlist_count': 22, + 'skip': 'Requires safaribooksonline account credentials', + }, { + 'url': 'https://www.safaribooksonline.com/api/v1/book/9781449396459/?override_format=json', + 'only_matching': True, + }, { + 'url': 'http://techbus.safaribooksonline.com/9780134426365', + 'only_matching': True, + }, { + 'url': 'https://www.safaribooksonline.com/videos/python-programming-language/9780134217314', + 'only_matching': True, + }, { + 'url': 'https://learning.oreilly.com/videos/hadoop-fundamentals-livelessons/9780133392838', + 'only_matching': True, + }, { + 'url': 'https://www.oreilly.com/library/view/hadoop-fundamentals-livelessons/9780133392838/', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return (False if SafariIE.suitable(url) or SafariApiIE.suitable(url) + else super(SafariCourseIE, cls).suitable(url)) + + def _real_extract(self, url): + course_id = self._match_id(url) + + course_json = self._download_json( + '%s/book/%s/?override_format=%s' % (self._API_BASE, course_id, self._API_FORMAT), + course_id, 'Downloading course JSON') + + if 'chapters' not in course_json: + raise ExtractorError( + 'No chapters found for course %s' % course_id, expected=True) + + entries = [ + self.url_result(chapter, SafariApiIE.ie_key()) + for chapter in course_json['chapters']] + + course_title = course_json['title'] + + return self.playlist_result(entries, course_id, course_title) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/saitosan.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/saitosan.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/saitosan.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/saitosan.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/samplefocus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/samplefocus.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/samplefocus.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/samplefocus.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sapo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sapo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sapo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sapo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/savefrom.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/savefrom.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/savefrom.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/savefrom.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sbs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sbs.py new file mode 100644 index 0000000..7a91150 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sbs.py @@ -0,0 +1,158 @@ +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + float_or_none, + int_or_none, + parse_duration, + parse_iso8601, + traverse_obj, + update_url_query, + url_or_none, +) + + +class SBSIE(InfoExtractor): + IE_DESC = 'sbs.com.au' + _VALID_URL = r'''(?x) + https?://(?:www\.)?sbs\.com\.au/(?: + ondemand(?: + /video/(?:single/)?| + /(?:movie|tv-program)/[^/]+/| + /(?:tv|news)-series/(?:[^/]+/){3}| + .*?\bplay=|/watch/ + )|news/(?:embeds/)?video/ + )(?P<id>[0-9]+)''' + _EMBED_REGEX = [r'''(?x)] + (?: + <meta\s+property="og:video"\s+content=| + <iframe[^>]+?src= + ) + (["\'])(?P<url>https?://(?:www\.)?sbs\.com\.au/ondemand/video/.+?)\1'''] + + _TESTS = [{ + # Original URL is handled by the generic IE which finds the iframe: + # http://www.sbs.com.au/thefeed/blog/2014/08/21/dingo-conservation + 'url': 'http://www.sbs.com.au/ondemand/video/single/320403011771/?source=drupal&vertical=thefeed', + 'md5': '31f84a7a19b53635db63c73f8ab0c4a7', + 'info_dict': { + 'id': '320403011771', # '_rFBPRPO4pMR', + 'ext': 'mp4', + 'title': 'Dingo Conservation (The Feed)', + 'description': 'md5:f250a9856fca50d22dec0b5b8015f8a5', + 'thumbnail': r're:https?://.*\.jpg', + 'duration': 308, + 'timestamp': 1408613220, + 'upload_date': '20140821', + 'uploader': 'SBSC', + 'tags': None, + 'categories': None, + }, + 'expected_warnings': ['Unable to download JSON metadata'], + }, { + 'url': 'http://www.sbs.com.au/ondemand/video/320403011771/Dingo-Conservation-The-Feed', + 'only_matching': True, + }, { + 'url': 'http://www.sbs.com.au/news/video/471395907773/The-Feed-July-9', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/?play=1836638787723', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/program/inside-windsor-castle?play=1283505731842', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/news/embeds/video/1840778819866', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/watch/1698704451971', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/movie/coherence/1469404227931', + 'only_matching': True, + }, { + 'note': 'Live stream', + 'url': 'https://www.sbs.com.au/ondemand/video/1726824003663/sbs-24x7-live-stream-nsw', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/news-series/dateline/dateline-2022/dateline-s2022-ep26/2072245827515', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/tv-series/the-handmaids-tale/season-5/the-handmaids-tale-s5-ep1/2065631811776', + 'only_matching': True, + }, { + 'url': 'https://www.sbs.com.au/ondemand/tv-program/autun-romes-forgotten-sister/2116212803602', + 'only_matching': True, + }] + + _GEO_COUNTRIES = ['AU'] + _AUS_TV_PARENTAL_GUIDELINES = { + 'P': 0, + 'C': 7, + 'G': 0, + 'PG': 0, + 'M': 14, + 'MA15+': 15, + 'MAV15+': 15, + 'R18+': 18, + } + _PLAYER_API = 'https://www.sbs.com.au/api/v3' + + def _real_extract(self, url): + video_id = self._match_id(url) + formats, subtitles = self._extract_smil_formats_and_subtitles( + update_url_query(f'{self._PLAYER_API}/video_smil', {'id': video_id}), video_id) + + if not formats: + urlh = self._request_webpage( + HEADRequest('https://sbs-vod-prod-01.akamaized.net/'), video_id, + note='Checking geo-restriction', fatal=False, expected_status=403) + if urlh: + error_reasons = urlh.headers.get_all('x-error-reason') or [] + if 'geo-blocked' in error_reasons: + self.raise_geo_restricted(countries=['AU']) + self.raise_no_formats('No formats are available', video_id=video_id) + + media = traverse_obj(self._download_json( + f'{self._PLAYER_API}/video_stream', video_id, fatal=False, + query={'id': video_id, 'context': 'tv'}), ('video_object', {dict})) or {} + + media.update(self._download_json( + f'https://catalogue.pr.sbsod.com/mpx-media/{video_id}', + video_id, fatal=not media) or {}) + + # For named episodes, use the catalogue's title to set episode, rather than generic 'Episode N'. + if traverse_obj(media, ('partOfSeries', {dict})): + media['epName'] = traverse_obj(media, ('title', {str})) + + return { + 'id': video_id, + **traverse_obj(media, { + 'title': ('name', {str}), + 'description': ('description', {str}), + 'channel': ('taxonomy', 'channel', 'name', {str}), + 'series': ((('partOfSeries', 'name'), 'seriesTitle'), {str}), + 'series_id': ((('partOfSeries', 'uuid'), 'seriesID'), {str}), + 'season_number': ('seasonNumber', {int_or_none}), + 'episode': ('epName', {str}), + 'episode_number': ('episodeNumber', {int_or_none}), + 'timestamp': (('datePublished', ('publication', 'startDate')), {parse_iso8601}), + 'release_year': ('releaseYear', {int_or_none}), + 'duration': ('duration', ({float_or_none}, {parse_duration})), + 'is_live': ('liveStream', {bool}), + 'age_limit': (('classificationID', 'contentRating'), {str.upper}, { + lambda x: self._AUS_TV_PARENTAL_GUIDELINES.get(x)}), # dict.get is unhashable in py3.7 + }, get_all=False), + **traverse_obj(media, { + 'categories': (('genres', ...), ('taxonomy', ('genre', 'subgenre'), 'name'), {str}), + 'tags': (('consumerAdviceTexts', ('sbsSubCertification', 'consumerAdvice')), ..., {str}), + 'thumbnails': ('thumbnails', lambda _, v: url_or_none(v['contentUrl']), { + 'id': ('name', {str}), + 'url': 'contentUrl', + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + }), + }), + 'formats': formats, + 'subtitles': subtitles, + 'uploader': 'SBSC', + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/screen9.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/screen9.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/screen9.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/screen9.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/screencast.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/screencast.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/screencast.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/screencast.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/screencastify.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/screencastify.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/screencastify.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/screencastify.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/screencastomatic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/screencastomatic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/screencastomatic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/screencastomatic.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/scrippsnetworks.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/scrippsnetworks.py new file mode 100644 index 0000000..7f0bc96 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/scrippsnetworks.py @@ -0,0 +1,153 @@ +import json +import hashlib + +from .aws import AWSIE +from .anvato import AnvatoIE +from .common import InfoExtractor +from ..utils import ( + smuggle_url, + urlencode_postdata, + xpath_text, +) + + +class ScrippsNetworksWatchIE(AWSIE): + IE_NAME = 'scrippsnetworks:watch' + _VALID_URL = r'''(?x) + https?:// + watch\. + (?P<site>geniuskitchen)\.com/ + (?: + player\.[A-Z0-9]+\.html\#| + show/(?:[^/]+/){2}| + player/ + ) + (?P<id>\d+) + ''' + _TESTS = [{ + 'url': 'http://watch.geniuskitchen.com/player/3787617/Ample-Hills-Ice-Cream-Bike/', + 'info_dict': { + 'id': '4194875', + 'ext': 'mp4', + 'title': 'Ample Hills Ice Cream Bike', + 'description': 'Courtney Rada churns up a signature GK Now ice cream with The Scoopmaster.', + 'uploader': 'ANV', + 'upload_date': '20171011', + 'timestamp': 1507698000, + }, + 'params': { + 'skip_download': True, + }, + 'add_ie': [AnvatoIE.ie_key()], + 'skip': '404 Not Found', + }] + + _SNI_TABLE = { + 'geniuskitchen': 'genius', + } + + _AWS_API_KEY = 'E7wSQmq0qK6xPrF13WmzKiHo4BQ7tip4pQcSXVl1' + _AWS_PROXY_HOST = 'web.api.video.snidigital.com' + + _AWS_USER_AGENT = 'aws-sdk-js/2.80.0 callback' + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + site_id, video_id = mobj.group('site', 'id') + + aws_identity_id_json = json.dumps({ + 'IdentityId': '%s:7655847c-0ae7-4d9b-80d6-56c062927eb3' % self._AWS_REGION + }).encode('utf-8') + token = self._download_json( + 'https://cognito-identity.%s.amazonaws.com/' % self._AWS_REGION, video_id, + data=aws_identity_id_json, + headers={ + 'Accept': '*/*', + 'Content-Type': 'application/x-amz-json-1.1', + 'Referer': url, + 'X-Amz-Content-Sha256': hashlib.sha256(aws_identity_id_json).hexdigest(), + 'X-Amz-Target': 'AWSCognitoIdentityService.GetOpenIdToken', + 'X-Amz-User-Agent': self._AWS_USER_AGENT, + })['Token'] + + sts = self._download_xml( + 'https://sts.amazonaws.com/', video_id, data=urlencode_postdata({ + 'Action': 'AssumeRoleWithWebIdentity', + 'RoleArn': 'arn:aws:iam::710330595350:role/Cognito_WebAPIUnauth_Role', + 'RoleSessionName': 'web-identity', + 'Version': '2011-06-15', + 'WebIdentityToken': token, + }), headers={ + 'Referer': url, + 'X-Amz-User-Agent': self._AWS_USER_AGENT, + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + }) + + def get(key): + return xpath_text( + sts, './/{https://sts.amazonaws.com/doc/2011-06-15/}%s' % key, + fatal=True) + + mcp_id = self._aws_execute_api({ + 'uri': '/1/web/brands/%s/episodes/scrid/%s' % (self._SNI_TABLE[site_id], video_id), + 'access_key': get('AccessKeyId'), + 'secret_key': get('SecretAccessKey'), + 'session_token': get('SessionToken'), + }, video_id)['results'][0]['mcpId'] + + return self.url_result( + smuggle_url( + 'anvato:anvato_scripps_app_web_prod_0837996dbe373629133857ae9eb72e740424d80a:%s' % mcp_id, + {'geo_countries': ['US']}), + AnvatoIE.ie_key(), video_id=mcp_id) + + +class ScrippsNetworksIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?(?P<site>cookingchanneltv|discovery|(?:diy|food)network|hgtv|travelchannel)\.com/videos/[0-9a-z-]+-(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.cookingchanneltv.com/videos/the-best-of-the-best-0260338', + 'info_dict': { + 'id': '0260338', + 'ext': 'mp4', + 'title': 'The Best of the Best', + 'description': 'Catch a new episode of MasterChef Canada Tuedsay at 9/8c.', + 'timestamp': 1475678834, + 'upload_date': '20161005', + 'uploader': 'SCNI-SCND', + 'duration': 29.995, + 'chapters': [{'start_time': 0.0, 'end_time': 29.995, 'title': '<Untitled Chapter 1>'}], + 'thumbnail': 'https://images.dds.discovery.com/up/tp/Scripps_-_Food_Category_Prod/122/987/0260338_630x355.jpg', + }, + 'add_ie': ['ThePlatform'], + 'expected_warnings': ['No HLS formats found'], + }, { + 'url': 'https://www.diynetwork.com/videos/diy-barnwood-tablet-stand-0265790', + 'only_matching': True, + }, { + 'url': 'https://www.foodnetwork.com/videos/chocolate-strawberry-cake-roll-7524591', + 'only_matching': True, + }, { + 'url': 'https://www.hgtv.com/videos/cookie-decorating-101-0301929', + 'only_matching': True, + }, { + 'url': 'https://www.travelchannel.com/videos/two-climates-one-bag-5302184', + 'only_matching': True, + }, { + 'url': 'https://www.discovery.com/videos/guardians-of-the-glades-cooking-with-tom-cobb-5578368', + 'only_matching': True, + }] + _ACCOUNT_MAP = { + 'cookingchanneltv': 2433005105, + 'discovery': 2706091867, + 'diynetwork': 2433004575, + 'foodnetwork': 2433005105, + 'hgtv': 2433004575, + 'travelchannel': 2433005739, + } + _TP_TEMPL = 'https://link.theplatform.com/s/ip77QC/media/guid/%d/%s?mbr=true' + + def _real_extract(self, url): + site, guid = self._match_valid_url(url).groups() + return self.url_result(smuggle_url( + self._TP_TEMPL % (self._ACCOUNT_MAP[site], guid), + {'force_smil_url': True}), 'ThePlatform', guid) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/scrolller.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/scrolller.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/scrolller.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/scrolller.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/scte.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/scte.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/scte.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/scte.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/seeker.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/seeker.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/seeker.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/seeker.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/senalcolombia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/senalcolombia.py new file mode 100644 index 0000000..f3c066d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/senalcolombia.py @@ -0,0 +1,31 @@ +from .common import InfoExtractor +from .rtvcplay import RTVCKalturaIE + + +class SenalColombiaLiveIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?senalcolombia\.tv/(?P<id>senal-en-vivo)' + + _TESTS = [{ + 'url': 'https://www.senalcolombia.tv/senal-en-vivo', + 'info_dict': { + 'id': 'indexSC', + 'title': 're:^Señal Colombia', + 'description': 'md5:799f16a401d97f40c33a2c6a3e2a507b', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + hydration = self._search_json( + r'<script\b[^>]*data-drupal-selector\s*=\s*"[^"]*drupal-settings-json[^"]*"[^>]*>', + webpage, 'hydration', display_id) + + return self.url_result(hydration['envivosrc'], RTVCKalturaIE, display_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/senategov.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/senategov.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/senategov.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/senategov.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sendtonews.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sendtonews.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sendtonews.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sendtonews.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/servus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/servus.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/servus.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/servus.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sevenplus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sevenplus.py new file mode 100644 index 0000000..6c688d1 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sevenplus.py @@ -0,0 +1,132 @@ +import json +import re + +from .brightcove import BrightcoveNewBaseIE +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + try_get, + update_url_query, +) + + +class SevenPlusIE(BrightcoveNewBaseIE): + IE_NAME = '7plus' + _VALID_URL = r'https?://(?:www\.)?7plus\.com\.au/(?P<path>[^?]+\?.*?\bepisode-id=(?P<id>[^&#]+))' + _TESTS = [{ + 'url': 'https://7plus.com.au/MTYS?episode-id=MTYS7-003', + 'info_dict': { + 'id': 'MTYS7-003', + 'ext': 'mp4', + 'title': 'S7 E3 - Wind Surf', + 'description': 'md5:29c6a69f21accda7601278f81b46483d', + 'uploader_id': '5303576322001', + 'upload_date': '20171201', + 'timestamp': 1512106377, + 'series': 'Mighty Ships', + 'season_number': 7, + 'episode_number': 3, + 'episode': 'Wind Surf', + }, + 'params': { + 'skip_download': True, + } + }, { + 'url': 'https://7plus.com.au/UUUU?episode-id=AUMS43-001', + 'only_matching': True, + }] + + def _real_initialize(self): + self.token = None + + cookies = self._get_cookies('https://7plus.com.au') + api_key = next((x for x in cookies if x.startswith('glt_')), '')[4:] + if not api_key: # Cookies are signed out, skip login + return + + login_resp = self._download_json( + 'https://login.7plus.com.au/accounts.getJWT', None, 'Logging in', fatal=False, + query={ + 'APIKey': api_key, + 'sdk': 'js_latest', + 'login_token': cookies[f'glt_{api_key}'].value, + 'authMode': 'cookie', + 'pageURL': 'https://7plus.com.au/', + 'sdkBuild': '12471', + 'format': 'json', + }) or {} + + if 'errorMessage' in login_resp: + self.report_warning(f'Unable to login: 7plus said: {login_resp["errorMessage"]}') + return + id_token = login_resp.get('id_token') + if not id_token: + self.report_warning('Unable to login: Could not extract id token') + return + + token_resp = self._download_json( + 'https://7plus.com.au/auth/token', None, 'Getting auth token', fatal=False, + headers={'Content-Type': 'application/json'}, data=json.dumps({ + 'idToken': id_token, + 'platformId': 'web', + 'regSource': '7plus', + }).encode('utf-8')) or {} + self.token = token_resp.get('token') + if not self.token: + self.report_warning('Unable to log in: Could not extract auth token') + + def _real_extract(self, url): + path, episode_id = self._match_valid_url(url).groups() + + headers = {} + if self.token: + headers['Authorization'] = f'Bearer {self.token}' + + try: + media = self._download_json( + 'https://videoservice.swm.digital/playback', episode_id, query={ + 'appId': '7plus', + 'deviceType': 'web', + 'platformType': 'web', + 'accountId': 5303576322001, + 'referenceId': 'ref:' + episode_id, + 'deliveryId': 'csai', + 'videoType': 'vod', + }, headers=headers)['media'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + raise ExtractorError(self._parse_json( + e.cause.response.read().decode(), episode_id)[0]['error_code'], expected=True) + raise + + for source in media.get('sources', {}): + src = source.get('src') + if not src: + continue + source['src'] = update_url_query(src, {'rule': ''}) + + info = self._parse_brightcove_metadata(media, episode_id) + + content = self._download_json( + 'https://component-cdn.swm.digital/content/' + path, + episode_id, headers={ + 'market-id': 4, + }, fatal=False) or {} + for item in content.get('items', {}): + if item.get('componentData', {}).get('componentType') == 'infoPanel': + for src_key, dst_key in [('title', 'title'), ('shortSynopsis', 'description')]: + value = item.get(src_key) + if value: + info[dst_key] = value + info['series'] = try_get( + item, lambda x: x['seriesLogo']['name'], compat_str) + mobj = re.search(r'^S(\d+)\s+E(\d+)\s+-\s+(.+)$', info['title']) + if mobj: + info.update({ + 'season_number': int(mobj.group(1)), + 'episode_number': int(mobj.group(2)), + 'episode': mobj.group(3), + }) + + return info diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sexu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sexu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sexu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sexu.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/seznamzpravy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/seznamzpravy.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/seznamzpravy.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/seznamzpravy.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/shahid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/shahid.py new file mode 100644 index 0000000..d509e88 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/shahid.py @@ -0,0 +1,217 @@ +import json +import math +import re + +from .aws import AWSIE +from ..networking.exceptions import HTTPError +from ..utils import ( + clean_html, + ExtractorError, + InAdvancePagedList, + int_or_none, + parse_iso8601, + str_or_none, + urlencode_postdata, +) + + +class ShahidBaseIE(AWSIE): + _AWS_PROXY_HOST = 'api2.shahid.net' + _AWS_API_KEY = '2RRtuMHx95aNI1Kvtn2rChEuwsCogUd4samGPjLh' + _VALID_URL_BASE = r'https?://shahid\.mbc\.net/[a-z]{2}/' + + def _handle_error(self, e): + fail_data = self._parse_json( + e.cause.response.read().decode('utf-8'), None, fatal=False) + if fail_data: + faults = fail_data.get('faults', []) + faults_message = ', '.join([clean_html(fault['userMessage']) for fault in faults if fault.get('userMessage')]) + if faults_message: + raise ExtractorError(faults_message, expected=True) + + def _call_api(self, path, video_id, request=None): + query = {} + if request: + query['request'] = json.dumps(request) + try: + return self._aws_execute_api({ + 'uri': '/proxy/v2/' + path, + 'access_key': 'AKIAI6X4TYCIXM2B7MUQ', + 'secret_key': '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', + }, video_id, query) + except ExtractorError as e: + if isinstance(e.cause, HTTPError): + self._handle_error(e) + raise + + +class ShahidIE(ShahidBaseIE): + _NETRC_MACHINE = 'shahid' + _VALID_URL = ShahidBaseIE._VALID_URL_BASE + r'(?:serie|show|movie)s/[^/]+/(?P<type>episode|clip|movie)-(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://shahid.mbc.net/ar/shows/%D9%85%D8%AA%D8%AD%D9%81-%D8%A7%D9%84%D8%AF%D8%AD%D9%8A%D8%AD-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D9%83%D9%84%D9%8A%D8%A8-1/clip-816924', + 'info_dict': { + 'id': '816924', + 'ext': 'mp4', + 'title': 'متح٠الدحيح الموسم 1 كليب 1', + 'timestamp': 1602806400, + 'upload_date': '20201016', + 'description': 'برومو', + 'duration': 22, + 'categories': ['كوميديا'], + }, + 'params': { + # m3u8 download + 'skip_download': True, + } + }, { + 'url': 'https://shahid.mbc.net/ar/movies/%D8%A7%D9%84%D9%82%D9%86%D8%A7%D8%B5%D8%A9/movie-151746', + 'only_matching': True + }, { + # shahid plus subscriber only + 'url': 'https://shahid.mbc.net/ar/series/%D9%85%D8%B1%D8%A7%D9%8A%D8%A7-2011-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1/episode-90511', + 'only_matching': True + }, { + 'url': 'https://shahid.mbc.net/en/shows/Ramez-Fi-Al-Shallal-season-1-episode-1/episode-359319', + 'only_matching': True + }] + + def _perform_login(self, username, password): + try: + user_data = self._download_json( + 'https://shahid.mbc.net/wd/service/users/login', + None, 'Logging in', data=json.dumps({ + 'email': username, + 'password': password, + 'basic': 'false', + }).encode('utf-8'), headers={ + 'Content-Type': 'application/json; charset=UTF-8', + })['user'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError): + self._handle_error(e) + raise + + self._download_webpage( + 'https://shahid.mbc.net/populateContext', + None, 'Populate Context', data=urlencode_postdata({ + 'firstName': user_data['firstName'], + 'lastName': user_data['lastName'], + 'userName': user_data['email'], + 'csg_user_name': user_data['email'], + 'subscriberId': user_data['id'], + 'sessionId': user_data['sessionId'], + })) + + def _real_extract(self, url): + page_type, video_id = self._match_valid_url(url).groups() + if page_type == 'clip': + page_type = 'episode' + + playout = self._call_api( + 'playout/new/url/' + video_id, video_id)['playout'] + + if not self.get_param('allow_unplayable_formats') and playout.get('drm'): + self.report_drm(video_id) + + formats = self._extract_m3u8_formats(re.sub( + # https://docs.aws.amazon.com/mediapackage/latest/ug/manifest-filtering.html + r'aws\.manifestfilter=[\w:;,-]+&?', + '', playout['url']), video_id, 'mp4') + + # video = self._call_api( + # 'product/id', video_id, { + # 'id': video_id, + # 'productType': 'ASSET', + # 'productSubType': page_type.upper() + # })['productModel'] + + response = self._download_json( + 'http://api.shahid.net/api/v1_1/%s/%s' % (page_type, video_id), + video_id, 'Downloading video JSON', query={ + 'apiKey': 'sh@hid0nlin3', + 'hash': 'b2wMCTHpSmyxGqQjJFOycRmLSex+BpTK/ooxy6vHaqs=', + }) + data = response.get('data', {}) + error = data.get('error') + if error: + raise ExtractorError( + '%s returned error: %s' % (self.IE_NAME, '\n'.join(error.values())), + expected=True) + + video = data[page_type] + title = video['title'] + categories = [ + category['name'] + for category in video.get('genres', []) if 'name' in category] + + return { + 'id': video_id, + 'title': title, + 'description': video.get('description'), + 'thumbnail': video.get('thumbnailUrl'), + 'duration': int_or_none(video.get('duration')), + 'timestamp': parse_iso8601(video.get('referenceDate')), + 'categories': categories, + 'series': video.get('showTitle') or video.get('showName'), + 'season': video.get('seasonTitle'), + 'season_number': int_or_none(video.get('seasonNumber')), + 'season_id': str_or_none(video.get('seasonId')), + 'episode_number': int_or_none(video.get('number')), + 'episode_id': video_id, + 'formats': formats, + } + + +class ShahidShowIE(ShahidBaseIE): + _VALID_URL = ShahidBaseIE._VALID_URL_BASE + r'(?:show|serie)s/[^/]+/(?:show|series)-(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://shahid.mbc.net/ar/shows/%D8%B1%D8%A7%D9%85%D8%B2-%D9%82%D8%B1%D8%B4-%D8%A7%D9%84%D8%A8%D8%AD%D8%B1/show-79187', + 'info_dict': { + 'id': '79187', + 'title': 'رامز قرش البحر', + 'description': 'md5:c88fa7e0f02b0abd39d417aee0d046ff', + }, + 'playlist_mincount': 32, + }, { + 'url': 'https://shahid.mbc.net/ar/series/How-to-live-Longer-(The-Big-Think)/series-291861', + 'only_matching': True + }] + _PAGE_SIZE = 30 + + def _real_extract(self, url): + show_id = self._match_id(url) + + product = self._call_api( + 'playableAsset', show_id, {'showId': show_id})['productModel'] + playlist = product['playlist'] + playlist_id = playlist['id'] + show = product.get('show', {}) + + def page_func(page_num): + playlist = self._call_api( + 'product/playlist', show_id, { + 'playListId': playlist_id, + 'pageNumber': page_num, + 'pageSize': 30, + 'sorts': [{ + 'order': 'DESC', + 'type': 'SORTDATE' + }], + }) + for product in playlist.get('productList', {}).get('products', []): + product_url = product.get('productUrl', []).get('url') + if not product_url: + continue + yield self.url_result( + product_url, 'Shahid', + str_or_none(product.get('id')), + product.get('title')) + + entries = InAdvancePagedList( + page_func, + math.ceil(playlist['count'] / self._PAGE_SIZE), + self._PAGE_SIZE) + + return self.playlist_result( + entries, show_id, show.get('title'), show.get('description')) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/shared.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/shared.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/shared.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/shared.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sharevideos.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sharevideos.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sharevideos.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sharevideos.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/shemaroome.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/shemaroome.py new file mode 100644 index 0000000..ec9938b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/shemaroome.py @@ -0,0 +1,102 @@ +from .common import InfoExtractor +from ..aes import aes_cbc_decrypt, unpad_pkcs7 +from ..compat import ( + compat_b64decode, +) +from ..utils import ( + bytes_to_intlist, + ExtractorError, + intlist_to_bytes, + unified_strdate, +) + + +class ShemarooMeIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?shemaroome\.com/(?:movies|shows)/(?P<id>[^?#]+)' + _TESTS = [{ + 'url': 'https://www.shemaroome.com/movies/dil-hai-tumhaara', + 'info_dict': { + 'id': 'dil-hai-tumhaara', + 'ext': 'mp4', + 'title': 'Dil Hai Tumhaara', + 'release_date': '20020906', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:2782c4127807103cf5a6ae2ca33645ce', + }, + 'params': { + 'skip_download': True + } + }, { + 'url': 'https://www.shemaroome.com/shows/jurm-aur-jazbaat/laalach', + 'info_dict': { + 'id': 'jurm-aur-jazbaat_laalach', + 'ext': 'mp4', + 'title': 'Laalach', + 'description': 'md5:92b79c2dcb539b0ab53f9fa5a048f53c', + 'thumbnail': r're:^https?://.*\.jpg$', + 'release_date': '20210507', + }, + 'params': { + 'skip_download': True + }, + 'skip': 'Premium videos cannot be downloaded yet.' + }, { + 'url': 'https://www.shemaroome.com/shows/jai-jai-jai-bajrang-bali/jai-jai-jai-bajrang-bali-episode-99', + 'info_dict': { + 'id': 'jai-jai-jai-bajrang-bali_jai-jai-jai-bajrang-bali-episode-99', + 'ext': 'mp4', + 'title': 'Jai Jai Jai Bajrang Bali Episode 99', + 'description': 'md5:850d127a18ee3f9529d7fbde2f49910d', + 'thumbnail': r're:^https?://.*\.jpg$', + 'release_date': '20110101', + }, + 'params': { + 'skip_download': True + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url).replace('/', '_') + webpage = self._download_webpage(url, video_id) + title = self._search_regex(r'id=\"ma_title\" value=\"([^\"]+)', webpage, 'title') + thumbnail = self._og_search_thumbnail(webpage) + content_def = self._search_regex(r'id=\"content_definition\" value=\"([^\"]+)', webpage, 'content_def') + catalog_id = self._search_regex(r'id=\"catalog_id\" value=\"([^\"]+)', webpage, 'catalog_id') + item_category = self._search_regex(r'id=\"item_category\" value=\"([^\"]+)', webpage, 'item_category') + content_id = self._search_regex(r'id=\"content_id\" value=\"([^\"]+)', webpage, 'content_id') + + data = f'catalog_id={catalog_id}&content_id={content_id}&category={item_category}&content_def={content_def}' + data_json = self._download_json('https://www.shemaroome.com/users/user_all_lists', video_id, data=data.encode()) + if not data_json.get('status'): + raise ExtractorError('Premium videos cannot be downloaded yet.', expected=True) + url_data = bytes_to_intlist(compat_b64decode(data_json['new_play_url'])) + key = bytes_to_intlist(compat_b64decode(data_json['key'])) + iv = [0] * 16 + m3u8_url = unpad_pkcs7(intlist_to_bytes(aes_cbc_decrypt(url_data, key, iv))).decode('ascii') + headers = {'stream_key': data_json['stream_key']} + formats, m3u8_subs = self._extract_m3u8_formats_and_subtitles(m3u8_url, video_id, fatal=False, headers=headers) + for fmt in formats: + fmt['http_headers'] = headers + + release_date = self._html_search_regex( + (r'itemprop="uploadDate">\s*([\d-]+)', r'id="release_date" value="([\d-]+)'), + webpage, 'release date', fatal=False) + + subtitles = {} + sub_url = data_json.get('subtitle') + if sub_url: + subtitles.setdefault('EN', []).append({ + 'url': self._proto_relative_url(sub_url), + }) + subtitles = self._merge_subtitles(subtitles, m3u8_subs) + description = self._html_search_regex(r'(?s)>Synopsis(</.+?)</', webpage, 'description', fatal=False) + + return { + 'id': video_id, + 'formats': formats, + 'title': title, + 'thumbnail': thumbnail, + 'release_date': unified_strdate(release_date), + 'description': description, + 'subtitles': subtitles, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/showroomlive.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/showroomlive.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/showroomlive.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/showroomlive.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sibnet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sibnet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sibnet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sibnet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/simplecast.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/simplecast.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/simplecast.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/simplecast.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sina.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sina.py new file mode 100644 index 0000000..eeb9ebb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sina.py @@ -0,0 +1,109 @@ +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + ExtractorError, + clean_html, + get_element_by_attribute, + int_or_none, + qualities, + update_url_query, +) + + +class SinaIE(InfoExtractor): + _VALID_URL = r'''(?x)https?://(?:[^/?#]+\.)?video\.sina\.com\.cn/ + (?: + (?:view/|.*\#)(?P<id>\d+)| + .+?/(?P<pseudo_id>[^/?#]+)(?:\.s?html)| + # This is used by external sites like Weibo + api/sinawebApi/outplay.php/(?P<token>.+?)\.swf + ) + ''' + + _TESTS = [ + { + 'url': 'http://video.sina.com.cn/news/spj/topvideoes20160504/?opsubject_id=top1#250576622', + 'md5': 'd38433e2fc886007729735650ae4b3e9', + 'info_dict': { + 'id': '250576622', + 'ext': 'mp4', + 'title': '现场:å…‹é²å…¹å®£å¸ƒé€€é€‰ 特朗普将稳获æå', + } + }, + { + 'url': 'http://video.sina.com.cn/v/b/101314253-1290078633.html', + 'info_dict': { + 'id': '101314253', + 'ext': 'flv', + 'title': '军方æé«˜å¯¹æœæƒ…报监视级别', + }, + 'skip': 'the page does not exist or has been deleted', + }, + { + 'url': 'http://video.sina.com.cn/view/250587748.html', + 'md5': '3d1807a25c775092aab3bc157fff49b4', + 'info_dict': { + 'id': '250587748', + 'ext': 'mp4', + 'title': '瞬间泪目:8年剿±¶å·åœ°éœ‡ç贵视频首æ›å…‰', + }, + }, + ] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + + video_id = mobj.group('id') + if not video_id: + if mobj.group('token') is not None: + # The video id is in the redirected url + self.to_screen('Getting video id') + request = HEADRequest(url) + _, urlh = self._download_webpage_handle(request, 'NA', False) + return self._real_extract(urlh.url) + else: + pseudo_id = mobj.group('pseudo_id') + webpage = self._download_webpage(url, pseudo_id) + error = get_element_by_attribute('class', 'errtitle', webpage) + if error: + raise ExtractorError('%s said: %s' % ( + self.IE_NAME, clean_html(error)), expected=True) + video_id = self._search_regex( + r"video_id\s*:\s*'(\d+)'", webpage, 'video id') + + video_data = self._download_json( + 'http://s.video.sina.com.cn/video/h5play', + video_id, query={'video_id': video_id}) + if video_data['code'] != 1: + raise ExtractorError('%s said: %s' % ( + self.IE_NAME, video_data['message']), expected=True) + else: + video_data = video_data['data'] + title = video_data['title'] + description = video_data.get('description') + if description: + description = description.strip() + + preference = qualities(['cif', 'sd', 'hd', 'fhd', 'ffd']) + formats = [] + for quality_id, quality in video_data.get('videos', {}).get('mp4', {}).items(): + file_api = quality.get('file_api') + file_id = quality.get('file_id') + if not file_api or not file_id: + continue + formats.append({ + 'format_id': quality_id, + 'url': update_url_query(file_api, {'vid': file_id}), + 'quality': preference(quality_id), + 'ext': 'mp4', + }) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': video_data.get('image'), + 'duration': int_or_none(video_data.get('length')), + 'timestamp': int_or_none(video_data.get('create_time')), + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sixplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sixplay.py new file mode 100644 index 0000000..ef93b92 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sixplay.py @@ -0,0 +1,122 @@ +from .common import InfoExtractor +from ..compat import ( + compat_str, +) +from ..utils import ( + determine_ext, + int_or_none, + parse_qs, + try_get, + qualities, +) + + +class SixPlayIE(InfoExtractor): + IE_NAME = '6play' + _VALID_URL = r'(?:6play:|https?://(?:www\.)?(?P<domain>6play\.fr|rtlplay\.be|play\.rtl\.hr|rtlmost\.hu)/.+?-c_)(?P<id>[0-9]+)' + _TESTS = [{ + 'url': 'https://www.6play.fr/minute-par-minute-p_9533/le-but-qui-a-marque-lhistoire-du-football-francais-c_12041051', + 'md5': '31fcd112637baa0c2ab92c4fcd8baf27', + 'info_dict': { + 'id': '12041051', + 'ext': 'mp4', + 'title': 'Le but qui a marqué l\'histoire du football français !', + 'description': 'md5:b59e7e841d646ef1eb42a7868eb6a851', + }, + }, { + 'url': 'https://www.rtlplay.be/rtl-info-13h-p_8551/les-titres-du-rtlinfo-13h-c_12045869', + 'only_matching': True, + }, { + 'url': 'https://play.rtl.hr/pj-masks-p_9455/epizoda-34-sezona-1-catboyevo-cudo-na-dva-kotaca-c_11984989', + 'only_matching': True, + }, { + 'url': 'https://www.rtlmost.hu/megtorve-p_14167/megtorve-6-resz-c_12397787', + 'only_matching': True, + }] + + def _real_extract(self, url): + domain, video_id = self._match_valid_url(url).groups() + service, consumer_name = { + '6play.fr': ('6play', 'm6web'), + 'rtlplay.be': ('rtlbe_rtl_play', 'rtlbe'), + 'play.rtl.hr': ('rtlhr_rtl_play', 'rtlhr'), + 'rtlmost.hu': ('rtlhu_rtl_most', 'rtlhu'), + }.get(domain, ('6play', 'm6web')) + + data = self._download_json( + 'https://pc.middleware.6play.fr/6play/v2/platforms/m6group_web/services/%s/videos/clip_%s' % (service, video_id), + video_id, headers={ + 'x-customer-name': consumer_name + }, query={ + 'csa': 5, + 'with': 'clips', + }) + + clip_data = data['clips'][0] + title = clip_data['title'] + + urls = [] + quality_key = qualities(['lq', 'sd', 'hq', 'hd']) + formats = [] + subtitles = {} + assets = clip_data.get('assets') or [] + for asset in assets: + asset_url = asset.get('full_physical_path') + protocol = asset.get('protocol') + if not asset_url or ((protocol == 'primetime' or asset.get('type') == 'usp_hlsfp_h264') and not ('_drmnp.ism/' in asset_url or '_unpnp.ism/' in asset_url)) or asset_url in urls: + continue + urls.append(asset_url) + container = asset.get('video_container') + ext = determine_ext(asset_url) + if protocol == 'http_subtitle' or ext == 'vtt': + subtitles.setdefault('fr', []).append({'url': asset_url}) + continue + if container == 'm3u8' or ext == 'm3u8': + if protocol == 'usp': + if parse_qs(asset_url).get('token', [None])[0]: + urlh = self._request_webpage( + asset_url, video_id, fatal=False, + headers=self.geo_verification_headers()) + if not urlh: + continue + asset_url = urlh.url + asset_url = asset_url.replace('_drmnp.ism/', '_unpnp.ism/') + for i in range(3, 0, -1): + asset_url = asset_url = asset_url.replace('_sd1/', '_sd%d/' % i) + m3u8_formats = self._extract_m3u8_formats( + asset_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False) + formats.extend(m3u8_formats) + formats.extend(self._extract_mpd_formats( + asset_url.replace('.m3u8', '.mpd'), + video_id, mpd_id='dash', fatal=False)) + if m3u8_formats: + break + else: + formats.extend(self._extract_m3u8_formats( + asset_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + elif container == 'mp4' or ext == 'mp4': + quality = asset.get('video_quality') + formats.append({ + 'url': asset_url, + 'format_id': quality, + 'quality': quality_key(quality), + 'ext': ext, + }) + + def get(getter): + for src in (data, clip_data): + v = try_get(src, getter, compat_str) + if v: + return v + + return { + 'id': video_id, + 'title': title, + 'description': get(lambda x: x['description']), + 'duration': int_or_none(clip_data.get('duration')), + 'series': get(lambda x: x['program']['title']), + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/skeb.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/skeb.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/skeb.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/skeb.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sky.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sky.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sky.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sky.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/skyit.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/skyit.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/skyit.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/skyit.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/skylinewebcams.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/skylinewebcams.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/skylinewebcams.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/skylinewebcams.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/skynewsarabia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/skynewsarabia.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/skynewsarabia.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/skynewsarabia.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/skynewsau.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/skynewsau.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/skynewsau.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/skynewsau.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/slideshare.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/slideshare.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/slideshare.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/slideshare.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/slideslive.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/slideslive.py new file mode 100644 index 0000000..25f867a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/slideslive.py @@ -0,0 +1,567 @@ +import re +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + parse_qs, + smuggle_url, + traverse_obj, + unified_timestamp, + update_url_query, + url_or_none, + xpath_text, +) + + +class SlidesLiveIE(InfoExtractor): + _VALID_URL = r'https?://slideslive\.com/(?:embed/(?:presentation/)?)?(?P<id>[0-9]+)' + _TESTS = [{ + # service_name = yoda, only XML slides info + 'url': 'https://slideslive.com/38902413/gcc-ia16-backend', + 'info_dict': { + 'id': '38902413', + 'ext': 'mp4', + 'title': 'GCC IA16 backend', + 'timestamp': 1648189972, + 'upload_date': '20220325', + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': 'count:42', + 'chapters': 'count:41', + 'duration': 1638, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # service_name = yoda, /v7/ slides + 'url': 'https://slideslive.com/38935785', + 'info_dict': { + 'id': '38935785', + 'ext': 'mp4', + 'title': 'Offline Reinforcement Learning: From Algorithms to Practical Challenges', + 'upload_date': '20211115', + 'timestamp': 1636996003, + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:640', + 'chapters': 'count:639', + 'duration': 9832, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # service_name = yoda, /v1/ slides + 'url': 'https://slideslive.com/38973182/how-should-a-machine-learning-researcher-think-about-ai-ethics', + 'info_dict': { + 'id': '38973182', + 'ext': 'mp4', + 'title': 'How Should a Machine Learning Researcher Think About AI Ethics?', + 'upload_date': '20220201', + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1643728135, + 'thumbnails': 'count:3', + 'chapters': 'count:2', + 'duration': 5889, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # service_name = youtube, only XML slides info + 'url': 'https://slideslive.com/38897546/special-metaprednaska-petra-ludwiga-hodnoty-pro-lepsi-spolecnost', + 'md5': '8a79b5e3d700837f40bd2afca3c8fa01', + 'info_dict': { + 'id': 'jmg02wCJD5M', + 'display_id': '38897546', + 'ext': 'mp4', + 'title': 'SPECIÃL: Meta-pÅ™ednáška Petra Ludwiga - Hodnoty pro lepší spoleÄnost', + 'description': 'Watch full version of this video at https://slideslive.com/38897546.', + 'channel_url': 'https://www.youtube.com/channel/UCZWdAkNYFncuX0khyvhqnxw', + 'channel': 'SlidesLive Videos - G1', + 'channel_id': 'UCZWdAkNYFncuX0khyvhqnxw', + 'uploader_id': 'UCZWdAkNYFncuX0khyvhqnxw', + 'uploader': 'SlidesLive Videos - G1', + 'uploader_url': 'http://www.youtube.com/channel/UCZWdAkNYFncuX0khyvhqnxw', + 'live_status': 'not_live', + 'upload_date': '20160710', + 'timestamp': 1618786715, + 'duration': 6827, + 'like_count': int, + 'view_count': int, + 'comment_count': int, + 'channel_follower_count': int, + 'age_limit': 0, + 'thumbnail': r're:^https?://.*\.(?:jpg|webp)', + 'thumbnails': 'count:169', + 'playable_in_embed': True, + 'availability': 'unlisted', + 'tags': [], + 'categories': ['People & Blogs'], + 'chapters': 'count:168', + }, + }, { + # embed-only presentation, only XML slides info + 'url': 'https://slideslive.com/embed/presentation/38925850', + 'info_dict': { + 'id': '38925850', + 'ext': 'mp4', + 'title': 'Towards a Deep Network Architecture for Structured Smoothness', + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': 'count:8', + 'timestamp': 1629671508, + 'upload_date': '20210822', + 'chapters': 'count:7', + 'duration': 326, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # embed-only presentation, only JSON slides info, /v5/ slides (.png) + 'url': 'https://slideslive.com/38979920/', + 'info_dict': { + 'id': '38979920', + 'ext': 'mp4', + 'title': 'MoReL: Multi-omics Relational Learning', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:7', + 'timestamp': 1654714970, + 'upload_date': '20220608', + 'chapters': 'count:6', + 'duration': 171, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v2/ slides (.jpg) + 'url': 'https://slideslive.com/38954074', + 'info_dict': { + 'id': '38954074', + 'ext': 'mp4', + 'title': 'Decentralized Attribution of Generative Models', + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': 'count:16', + 'timestamp': 1622806321, + 'upload_date': '20210604', + 'chapters': 'count:15', + 'duration': 306, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v4/ slides (.png) + 'url': 'https://slideslive.com/38979570/', + 'info_dict': { + 'id': '38979570', + 'ext': 'mp4', + 'title': 'Efficient Active Search for Combinatorial Optimization Problems', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:9', + 'timestamp': 1654714896, + 'upload_date': '20220608', + 'chapters': 'count:8', + 'duration': 295, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v10/ slides + 'url': 'https://slideslive.com/embed/presentation/38979880?embed_parent_url=https%3A%2F%2Fedit.videoken.com%2F', + 'info_dict': { + 'id': '38979880', + 'ext': 'mp4', + 'title': 'The Representation Power of Neural Networks', + 'timestamp': 1654714962, + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:22', + 'upload_date': '20220608', + 'chapters': 'count:21', + 'duration': 294, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v7/ slides, 2 video slides + 'url': 'https://slideslive.com/embed/presentation/38979682?embed_container_origin=https%3A%2F%2Fedit.videoken.com', + 'playlist_count': 3, + 'info_dict': { + 'id': '38979682-playlist', + 'title': 'LoRA: Low-Rank Adaptation of Large Language Models', + }, + 'playlist': [{ + 'info_dict': { + 'id': '38979682', + 'ext': 'mp4', + 'title': 'LoRA: Low-Rank Adaptation of Large Language Models', + 'timestamp': 1654714920, + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:30', + 'upload_date': '20220608', + 'chapters': 'count:31', + 'duration': 272, + }, + }, { + 'info_dict': { + 'id': '38979682-021', + 'ext': 'mp4', + 'title': 'LoRA: Low-Rank Adaptation of Large Language Models - Slide 021', + 'duration': 3, + 'timestamp': 1654714920, + 'upload_date': '20220608', + }, + }, { + 'info_dict': { + 'id': '38979682-024', + 'ext': 'mp4', + 'title': 'LoRA: Low-Rank Adaptation of Large Language Models - Slide 024', + 'duration': 4, + 'timestamp': 1654714920, + 'upload_date': '20220608', + }, + }], + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v6/ slides, 1 video slide, edit.videoken.com embed + 'url': 'https://slideslive.com/38979481/', + 'playlist_count': 2, + 'info_dict': { + 'id': '38979481-playlist', + 'title': 'How to Train Your MAML to Excel in Few-Shot Classification', + }, + 'playlist': [{ + 'info_dict': { + 'id': '38979481', + 'ext': 'mp4', + 'title': 'How to Train Your MAML to Excel in Few-Shot Classification', + 'timestamp': 1654714877, + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:43', + 'upload_date': '20220608', + 'chapters': 'count:43', + 'duration': 315, + }, + }, { + 'info_dict': { + 'id': '38979481-013', + 'ext': 'mp4', + 'title': 'How to Train Your MAML to Excel in Few-Shot Classification - Slide 013', + 'duration': 3, + 'timestamp': 1654714877, + 'upload_date': '20220608', + }, + }], + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v3/ slides, .jpg and .png, service_name = youtube + 'url': 'https://slideslive.com/embed/38932460/', + 'info_dict': { + 'id': 'RTPdrgkyTiE', + 'display_id': '38932460', + 'ext': 'mp4', + 'title': 'Active Learning for Hierarchical Multi-Label Classification', + 'description': 'Watch full version of this video at https://slideslive.com/38932460.', + 'channel': 'SlidesLive Videos - A', + 'channel_id': 'UC62SdArr41t_-_fX40QCLRw', + 'channel_url': 'https://www.youtube.com/channel/UC62SdArr41t_-_fX40QCLRw', + 'uploader': 'SlidesLive Videos - A', + 'uploader_id': 'UC62SdArr41t_-_fX40QCLRw', + 'uploader_url': 'http://www.youtube.com/channel/UC62SdArr41t_-_fX40QCLRw', + 'upload_date': '20200903', + 'timestamp': 1602599092, + 'duration': 942, + 'age_limit': 0, + 'live_status': 'not_live', + 'playable_in_embed': True, + 'availability': 'unlisted', + 'categories': ['People & Blogs'], + 'tags': [], + 'channel_follower_count': int, + 'like_count': int, + 'view_count': int, + 'thumbnail': r're:^https?://.*\.(?:jpg|png|webp)', + 'thumbnails': 'count:21', + 'chapters': 'count:20', + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # /v3/ slides, .png only, service_name = yoda + 'url': 'https://slideslive.com/38983994', + 'info_dict': { + 'id': '38983994', + 'ext': 'mp4', + 'title': 'Zero-Shot AutoML with Pretrained Models', + 'timestamp': 1662384834, + 'upload_date': '20220905', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'thumbnails': 'count:23', + 'chapters': 'count:22', + 'duration': 295, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # service_name = yoda + 'url': 'https://slideslive.com/38903721/magic-a-scientific-resurrection-of-an-esoteric-legend', + 'only_matching': True, + }, { + # dead link, service_name = url + 'url': 'https://slideslive.com/38922070/learning-transferable-skills-1', + 'only_matching': True, + }, { + # dead link, service_name = vimeo + 'url': 'https://slideslive.com/38921896/retrospectives-a-venue-for-selfreflection-in-ml-research-3', + 'only_matching': True, + }] + + _WEBPAGE_TESTS = [{ + # only XML slides info + 'url': 'https://iclr.cc/virtual_2020/poster_Hklr204Fvr.html', + 'info_dict': { + 'id': '38925850', + 'ext': 'mp4', + 'title': 'Towards a Deep Network Architecture for Structured Smoothness', + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': 'count:8', + 'timestamp': 1629671508, + 'upload_date': '20210822', + 'chapters': 'count:7', + 'duration': 326, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + # Reference: https://slideslive.com/embed_presentation.js + for embed_id in re.findall(r'(?s)new\s+SlidesLiveEmbed\s*\([^)]+\bpresentationId:\s*["\'](\d+)["\']', webpage): + url_parsed = urllib.parse.urlparse(url) + origin = f'{url_parsed.scheme}://{url_parsed.netloc}' + yield update_url_query( + f'https://slideslive.com/embed/presentation/{embed_id}', { + 'embed_parent_url': url, + 'embed_container_origin': origin, + }) + + def _download_embed_webpage_handle(self, video_id, headers): + return self._download_webpage_handle( + f'https://slideslive.com/embed/presentation/{video_id}', video_id, + headers=headers, query=traverse_obj(headers, { + 'embed_parent_url': 'Referer', + 'embed_container_origin': 'Origin', + })) + + def _extract_custom_m3u8_info(self, m3u8_data): + m3u8_dict = {} + + lookup = { + 'PRESENTATION-TITLE': 'title', + 'PRESENTATION-UPDATED-AT': 'timestamp', + 'PRESENTATION-THUMBNAIL': 'thumbnail', + 'PLAYLIST-TYPE': 'playlist_type', + 'VOD-VIDEO-SERVICE-NAME': 'service_name', + 'VOD-VIDEO-ID': 'service_id', + 'VOD-VIDEO-SERVERS': 'video_servers', + 'VOD-SUBTITLES': 'subtitles', + 'VOD-SLIDES-JSON-URL': 'slides_json_url', + 'VOD-SLIDES-XML-URL': 'slides_xml_url', + } + + for line in m3u8_data.splitlines(): + if not line.startswith('#EXT-SL-'): + continue + tag, _, value = line.partition(':') + key = lookup.get(tag.lstrip('#EXT-SL-')) + if not key: + continue + m3u8_dict[key] = value + + # Some values are stringified JSON arrays + for key in ('video_servers', 'subtitles'): + if key in m3u8_dict: + m3u8_dict[key] = self._parse_json(m3u8_dict[key], None, fatal=False) or [] + + return m3u8_dict + + def _extract_formats_and_duration(self, cdn_hostname, path, video_id, skip_duration=False): + formats, duration = [], None + + hls_formats = self._extract_m3u8_formats( + f'https://{cdn_hostname}/{path}/master.m3u8', + video_id, 'mp4', m3u8_id='hls', fatal=False, live=True) + if hls_formats: + if not skip_duration: + duration = self._extract_m3u8_vod_duration( + hls_formats[0]['url'], video_id, note='Extracting duration from HLS manifest') + formats.extend(hls_formats) + + dash_formats = self._extract_mpd_formats( + f'https://{cdn_hostname}/{path}/master.mpd', video_id, mpd_id='dash', fatal=False) + if dash_formats: + if not duration and not skip_duration: + duration = self._extract_mpd_vod_duration( + f'https://{cdn_hostname}/{path}/master.mpd', video_id, + note='Extracting duration from DASH manifest') + formats.extend(dash_formats) + + return formats, duration + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage, urlh = self._download_embed_webpage_handle( + video_id, headers=traverse_obj(parse_qs(url), { + 'Referer': ('embed_parent_url', -1), + 'Origin': ('embed_container_origin', -1)})) + redirect_url = urlh.url + if 'domain_not_allowed' in redirect_url: + domain = traverse_obj(parse_qs(redirect_url), ('allowed_domains[]', ...), get_all=False) + if not domain: + raise ExtractorError( + 'This is an embed-only presentation. Try passing --referer', expected=True) + webpage, _ = self._download_embed_webpage_handle(video_id, headers={ + 'Referer': f'https://{domain}/', + 'Origin': f'https://{domain}', + }) + + player_token = self._search_regex(r'data-player-token="([^"]+)"', webpage, 'player token') + player_data = self._download_webpage( + f'https://ben.slideslive.com/player/{video_id}', video_id, + note='Downloading player info', query={'player_token': player_token}) + player_info = self._extract_custom_m3u8_info(player_data) + + service_name = player_info['service_name'].lower() + assert service_name in ('url', 'yoda', 'vimeo', 'youtube') + service_id = player_info['service_id'] + + slide_url_template = 'https://slides.slideslive.com/%s/slides/original/%s%s' + slides, slides_info = {}, [] + + if player_info.get('slides_json_url'): + slides = self._download_json( + player_info['slides_json_url'], video_id, fatal=False, + note='Downloading slides JSON', errnote=False) or {} + slide_ext_default = '.png' + slide_quality = traverse_obj(slides, ('slide_qualities', 0)) + if slide_quality: + slide_ext_default = '.jpg' + slide_url_template = f'https://cdn.slideslive.com/data/presentations/%s/slides/{slide_quality}/%s%s' + for slide_id, slide in enumerate(traverse_obj(slides, ('slides', ...), expected_type=dict), 1): + slides_info.append(( + slide_id, traverse_obj(slide, ('image', 'name')), + traverse_obj(slide, ('image', 'extname'), default=slide_ext_default), + int_or_none(slide.get('time'), scale=1000))) + + if not slides and player_info.get('slides_xml_url'): + slides = self._download_xml( + player_info['slides_xml_url'], video_id, fatal=False, + note='Downloading slides XML', errnote='Failed to download slides info') + slide_url_template = 'https://cdn.slideslive.com/data/presentations/%s/slides/big/%s%s' + for slide_id, slide in enumerate(slides.findall('./slide') if slides else [], 1): + slides_info.append(( + slide_id, xpath_text(slide, './slideName', 'name'), '.jpg', + int_or_none(xpath_text(slide, './timeSec', 'time')))) + + chapters, thumbnails = [], [] + if url_or_none(player_info.get('thumbnail')): + thumbnails.append({'id': 'cover', 'url': player_info['thumbnail']}) + for slide_id, slide_path, slide_ext, start_time in slides_info: + if slide_path: + thumbnails.append({ + 'id': f'{slide_id:03d}', + 'url': slide_url_template % (video_id, slide_path, slide_ext), + }) + chapters.append({ + 'title': f'Slide {slide_id:03d}', + 'start_time': start_time, + }) + + subtitles = {} + for sub in traverse_obj(player_info, ('subtitles', ...), expected_type=dict): + webvtt_url = url_or_none(sub.get('webvtt_url')) + if not webvtt_url: + continue + subtitles.setdefault(sub.get('language') or 'en', []).append({ + 'url': webvtt_url, + 'ext': 'vtt', + }) + + info = { + 'id': video_id, + 'title': player_info.get('title') or self._html_search_meta('title', webpage, default=''), + 'timestamp': unified_timestamp(player_info.get('timestamp')), + 'is_live': player_info.get('playlist_type') != 'vod', + 'thumbnails': thumbnails, + 'chapters': chapters, + 'subtitles': subtitles, + } + + if service_name == 'url': + info['url'] = service_id + elif service_name == 'yoda': + formats, duration = self._extract_formats_and_duration( + player_info['video_servers'][0], service_id, video_id) + info.update({ + 'duration': duration, + 'formats': formats, + }) + else: + info.update({ + '_type': 'url_transparent', + 'url': service_id, + 'ie_key': service_name.capitalize(), + 'display_id': video_id, + }) + if service_name == 'vimeo': + info['url'] = smuggle_url( + f'https://player.vimeo.com/video/{service_id}', + {'http_headers': {'Referer': url}}) + + video_slides = traverse_obj(slides, ('slides', ..., 'video', 'id')) + if not video_slides: + return info + + def entries(): + yield info + + service_data = self._download_json( + f'https://ben.slideslive.com/player/{video_id}/slides_video_service_data', + video_id, fatal=False, query={ + 'player_token': player_token, + 'videos': ','.join(video_slides), + }, note='Downloading video slides info', errnote='Failed to download video slides info') or {} + + for slide_id, slide in enumerate(traverse_obj(slides, ('slides', ...)), 1): + if not traverse_obj(slide, ('video', 'service')) == 'yoda': + continue + video_path = traverse_obj(slide, ('video', 'id')) + cdn_hostname = traverse_obj(service_data, ( + video_path, 'video_servers', ...), get_all=False) + if not cdn_hostname or not video_path: + continue + formats, _ = self._extract_formats_and_duration( + cdn_hostname, video_path, video_id, skip_duration=True) + if not formats: + continue + yield { + 'id': f'{video_id}-{slide_id:03d}', + 'title': f'{info["title"]} - Slide {slide_id:03d}', + 'timestamp': info['timestamp'], + 'duration': int_or_none(traverse_obj(slide, ('video', 'duration_ms')), scale=1000), + 'formats': formats, + } + + return self.playlist_result(entries(), f'{video_id}-playlist', info['title']) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/slutload.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/slutload.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/slutload.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/slutload.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/smotrim.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/smotrim.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/smotrim.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/smotrim.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/snotr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/snotr.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/snotr.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/snotr.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sohu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sohu.py new file mode 100644 index 0000000..c0ff4f9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sohu.py @@ -0,0 +1,293 @@ +import base64 +import re + +from .common import InfoExtractor +from ..compat import ( + compat_str, + compat_urllib_parse_urlencode, +) +from ..utils import ( + ExtractorError, + int_or_none, + float_or_none, + url_or_none, + unified_timestamp, + try_get, + urljoin, + traverse_obj, +) + + +class SohuIE(InfoExtractor): + _VALID_URL = r'https?://(?P<mytv>my\.)?tv\.sohu\.com/.+?/(?(mytv)|n)(?P<id>\d+)\.shtml.*?' + + # Sohu videos give different MD5 sums on Travis CI and my machine + _TESTS = [{ + 'note': 'This video is available only in Mainland China', + 'url': 'http://tv.sohu.com/20130724/n382479172.shtml#super', + 'info_dict': { + 'id': '382479172', + 'ext': 'mp4', + 'title': 'MV:Far East Movement《The Illest》', + }, + 'skip': 'On available in China', + }, { + 'url': 'http://tv.sohu.com/20150305/n409385080.shtml', + 'info_dict': { + 'id': '409385080', + 'ext': 'mp4', + 'title': '《2015æ¹–å—å«è§†ç¾Šå¹´å…ƒå®µæ™šä¼šã€‹å”嫣《花好月圆》', + }, + 'skip': 'no longer available', + }, { + 'url': 'http://my.tv.sohu.com/us/232799889/78693464.shtml', + 'info_dict': { + 'id': '78693464', + 'ext': 'mp4', + 'title': 'ã€çˆ±èŒƒå“】第31期:MWCè§ä¸åˆ°çš„奇葩手机', + 'uploader': '爱范儿视频', + 'duration': 213, + 'timestamp': 1425519600, + 'upload_date': '20150305', + 'thumbnail': 'http://e3f49eaa46b57.cdn.sohucs.com//group1/M10/83/FA/MTAuMTAuODguODA=/6_14cbccdde5eg104SysCutcloud_78693464_7_0b.jpg', + 'tags': ['爱范儿', '爱范å“', 'MWC', '手机'], + } + }, { + 'note': 'Multipart video', + 'url': 'http://my.tv.sohu.com/pl/8384802/78910339.shtml', + 'info_dict': { + 'id': '78910339', + 'title': 'ã€ç¥žæŽ¢è‹å®žæˆ˜ç§˜ç±ã€‘第13期 战争之影 赫å¡é‡Œå§†', + 'uploader': 'å°è‹cany', + 'duration': 744.0, + 'timestamp': 1426269360, + 'upload_date': '20150313', + 'thumbnail': 'http://e3f49eaa46b57.cdn.sohucs.com//group1/M11/89/57/MTAuMTAuODguODA=/6_14cea022a1dg102SysCutcloud_78910339_8_0b.jpg', + 'tags': ['å°è‹MM', '英雄è”盟', '实战秘ç±'], + }, + 'playlist': [{ + 'info_dict': { + 'id': '78910339_part1', + 'ext': 'mp4', + 'duration': 294, + 'title': 'ã€ç¥žæŽ¢è‹å®žæˆ˜ç§˜ç±ã€‘第13期 战争之影 赫å¡é‡Œå§†', + } + }, { + 'info_dict': { + 'id': '78910339_part2', + 'ext': 'mp4', + 'duration': 300, + 'title': 'ã€ç¥žæŽ¢è‹å®žæˆ˜ç§˜ç±ã€‘第13期 战争之影 赫å¡é‡Œå§†', + } + }, { + 'info_dict': { + 'id': '78910339_part3', + 'ext': 'mp4', + 'duration': 150, + 'title': 'ã€ç¥žæŽ¢è‹å®žæˆ˜ç§˜ç±ã€‘第13期 战争之影 赫å¡é‡Œå§†', + } + }] + }, { + 'note': 'Video with title containing dash', + 'url': 'http://my.tv.sohu.com/us/249884221/78932792.shtml', + 'info_dict': { + 'id': '78932792', + 'ext': 'mp4', + 'title': 'youtube-dl testing video', + 'duration': 360, + 'timestamp': 1426348620, + 'upload_date': '20150314', + 'thumbnail': 'http://e3f49eaa46b57.cdn.sohucs.com//group1/M02/8A/00/MTAuMTAuODguNzk=/6_14cee1be192g102SysCutcloud_78932792_7_7b.jpg', + 'tags': [], + }, + 'params': { + 'skip_download': True + } + }] + + def _real_extract(self, url): + + def _fetch_data(vid_id, mytv=False): + if mytv: + base_data_url = 'http://my.tv.sohu.com/play/videonew.do?vid=' + else: + base_data_url = 'http://hot.vrs.sohu.com/vrs_flash.action?vid=' + + return self._download_json( + base_data_url + vid_id, video_id, + 'Downloading JSON data for %s' % vid_id, + headers=self.geo_verification_headers()) + + mobj = self._match_valid_url(url) + video_id = mobj.group('id') + mytv = mobj.group('mytv') is not None + + webpage = self._download_webpage(url, video_id) + + title = re.sub(r'( - 高清正版在线观看)? - æœç‹è§†é¢‘$', '', self._og_search_title(webpage)) + + vid = self._html_search_regex( + r'var vid ?= ?["\'](\d+)["\']', + webpage, 'video path') + vid_data = _fetch_data(vid, mytv) + if vid_data['play'] != 1: + if vid_data.get('status') == 12: + raise ExtractorError( + '%s said: There\'s something wrong in the video.' % self.IE_NAME, + expected=True) + else: + self.raise_geo_restricted( + '%s said: The video is only licensed to users in Mainland China.' % self.IE_NAME) + + formats_json = {} + for format_id in ('nor', 'high', 'super', 'ori', 'h2644k', 'h2654k'): + vid_id = vid_data['data'].get('%sVid' % format_id) + if not vid_id: + continue + vid_id = compat_str(vid_id) + formats_json[format_id] = vid_data if vid == vid_id else _fetch_data(vid_id, mytv) + + part_count = vid_data['data']['totalBlocks'] + + playlist = [] + for i in range(part_count): + formats = [] + for format_id, format_data in formats_json.items(): + allot = format_data['allot'] + + data = format_data['data'] + clip_url = traverse_obj(data, (('clipsURL', 'mp4PlayUrl'), i, {url_or_none}), get_all=False) + if not clip_url: + raise ExtractorError(f'Unable to extract url for clip {i}') + su = data['su'] + + video_url = 'newflv.sohu.ccgslb.net' + cdnId = None + retries = 0 + + while 'newflv.sohu.ccgslb.net' in video_url: + params = { + 'prot': 9, + 'file': clip_url, + 'new': su[i], + 'prod': 'h5n', + 'rb': 1, + } + + if cdnId is not None: + params['idc'] = cdnId + + download_note = 'Downloading %s video URL part %d of %d' % ( + format_id, i + 1, part_count) + + if retries > 0: + download_note += ' (retry #%d)' % retries + part_info = self._parse_json(self._download_webpage( + 'http://%s/?%s' % (allot, compat_urllib_parse_urlencode(params)), + video_id, download_note), video_id) + + video_url = part_info['url'] + cdnId = part_info.get('nid') + + retries += 1 + if retries > 5: + raise ExtractorError('Failed to get video URL') + + formats.append({ + 'url': video_url, + 'format_id': format_id, + 'filesize': int_or_none( + try_get(data, lambda x: x['clipsBytes'][i])), + 'width': int_or_none(data.get('width')), + 'height': int_or_none(data.get('height')), + 'fps': int_or_none(data.get('fps')), + }) + + playlist.append({ + 'id': '%s_part%d' % (video_id, i + 1), + 'title': title, + 'duration': vid_data['data']['clipsDuration'][i], + 'formats': formats, + }) + + if len(playlist) == 1: + info = playlist[0] + info['id'] = video_id + else: + info = { + '_type': 'multi_video', + 'entries': playlist, + 'id': video_id, + 'title': title, + 'duration': traverse_obj(vid_data, ('data', 'totalDuration', {float_or_none})), + } + + if mytv: + publish_time = unified_timestamp(self._search_regex( + r'publishTime:\s*["\'](\d+-\d+-\d+ \d+:\d+)["\']', webpage, 'publish time', fatal=False)) + else: + publish_time = traverse_obj(vid_data, ('tv_application_time', {unified_timestamp})) + + return { + 'timestamp': publish_time - 8 * 3600 if publish_time else None, + **traverse_obj(vid_data, { + 'alt_title': ('data', 'subName', {str}), + 'uploader': ('wm_data', 'wm_username', {str}), + 'thumbnail': ('data', 'coverImg', {url_or_none}), + 'tags': ('data', 'tag', {str.split}), + }), + **info, + } + + +class SohuVIE(InfoExtractor): + _VALID_URL = r'https?://tv\.sohu\.com/v/(?P<id>[\w=-]+)\.html(?:$|[#?])' + + _TESTS = [{ + 'note': 'Multipart video', + 'url': 'https://tv.sohu.com/v/MjAyMzA2MTQvbjYwMTMxNTE5Mi5zaHRtbA==.html', + 'info_dict': { + 'id': '601315192', + 'title': '《淬ç«ä¸¹å¿ƒã€‹ç¬¬1集', + 'alt_title': '“点天ç¯â€å‘生事故', + 'duration': 2701.692, + 'timestamp': 1686758040, + 'upload_date': '20230614', + 'thumbnail': 'http://photocdn.tv.sohu.com/img/20230614/vrsa_hor_1686738763256_454010551.jpg', + }, + 'playlist_mincount': 9, + 'skip': 'Only available in China', + }, { + 'url': 'https://tv.sohu.com/v/dXMvMjMyNzk5ODg5Lzc4NjkzNDY0LnNodG1s.html', + 'info_dict': { + 'id': '78693464', + 'ext': 'mp4', + 'title': 'ã€çˆ±èŒƒå“】第31期:MWCè§ä¸åˆ°çš„奇葩手机', + 'uploader': '爱范儿视频', + 'duration': 213, + 'timestamp': 1425519600, + 'upload_date': '20150305', + 'thumbnail': 'http://e3f49eaa46b57.cdn.sohucs.com//group1/M10/83/FA/MTAuMTAuODguODA=/6_14cbccdde5eg104SysCutcloud_78693464_7_0b.jpg', + 'tags': ['爱范儿', '爱范å“', 'MWC', '手机'], + } + }, { + 'note': 'Multipart video', + 'url': 'https://tv.sohu.com/v/dXMvMjQyNTYyMTYzLzc4OTEwMzM5LnNodG1s.html?src=pl', + 'info_dict': { + 'id': '78910339', + 'title': 'ã€ç¥žæŽ¢è‹å®žæˆ˜ç§˜ç±ã€‘第13期 战争之影 赫å¡é‡Œå§†', + 'uploader': 'å°è‹cany', + 'duration': 744.0, + 'timestamp': 1426269360, + 'upload_date': '20150313', + 'thumbnail': 'http://e3f49eaa46b57.cdn.sohucs.com//group1/M11/89/57/MTAuMTAuODguODA=/6_14cea022a1dg102SysCutcloud_78910339_8_0b.jpg', + 'tags': ['å°è‹MM', '英雄è”盟', '实战秘ç±'], + }, + 'playlist_mincount': 3, + }] + + def _real_extract(self, url): + encoded_id = self._match_id(url) + path = base64.urlsafe_b64decode(encoded_id).decode() + subdomain = 'tv' if re.match(r'\d+/n\d+\.shtml', path) else 'my.tv' + return self.url_result(urljoin(f'http://{subdomain}.sohu.com/', path), SohuIE) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sonyliv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sonyliv.py new file mode 100644 index 0000000..4379572 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sonyliv.py @@ -0,0 +1,220 @@ +import datetime +import json +import math +import random +import time +import uuid + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + jwt_decode_hs256, + try_call, + try_get, +) + + +class SonyLIVIE(InfoExtractor): + _VALID_URL = r'''(?x) + (?: + sonyliv:| + https?://(?:www\.)?sonyliv\.com/(?:s(?:how|port)s/[^/]+|movies|clip|trailer|music-videos)/[^/?#&]+- + ) + (?P<id>\d+) + ''' + _TESTS = [{ + 'url': 'https://www.sonyliv.com/shows/bachelors-delight-1700000113/achaari-cheese-toast-1000022678?watch=true', + 'info_dict': { + 'title': 'Achaari Cheese Toast', + 'id': '1000022678', + 'ext': 'mp4', + 'upload_date': '20200411', + 'description': 'md5:3957fa31d9309bf336ceb3f37ad5b7cb', + 'timestamp': 1586632091, + 'duration': 185, + 'season_number': 1, + 'series': 'Bachelors Delight', + 'episode_number': 1, + 'release_year': 2016, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://www.sonyliv.com/movies/tahalka-1000050121?watch=true', + 'only_matching': True, + }, { + 'url': 'https://www.sonyliv.com/clip/jigarbaaz-1000098925', + 'only_matching': True, + }, { + 'url': 'https://www.sonyliv.com/trailer/sandwiched-forever-1000100286?watch=true', + 'only_matching': True, + }, { + 'url': 'https://www.sonyliv.com/sports/india-tour-of-australia-2020-21-1700000286/cricket-hls-day-3-1st-test-aus-vs-ind-19-dec-2020-1000100959?watch=true', + 'only_matching': True, + }, { + 'url': 'https://www.sonyliv.com/music-videos/yeh-un-dinon-ki-baat-hai-1000018779', + 'only_matching': True, + }] + _GEO_COUNTRIES = ['IN'] + _HEADERS = {} + _LOGIN_HINT = 'Use "--username <mobile_number>" to login using OTP or "--username token --password <auth_token>" to login using auth token.' + _NETRC_MACHINE = 'sonyliv' + + def _get_device_id(self): + e = int(time.time() * 1000) + t = list('xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx') + for i, c in enumerate(t): + n = int((e + 16 * random.random()) % 16) | 0 + e = math.floor(e / 16) + if c == 'x': + t[i] = str(n) + elif c == 'y': + t[i] = '{:x}'.format(3 & n | 8) + return ''.join(t) + '-' + str(int(time.time() * 1000)) + + def _perform_login(self, username, password): + self._HEADERS['device_id'] = self._get_device_id() + self._HEADERS['content-type'] = 'application/json' + + if username.lower() == 'token' and try_call(lambda: jwt_decode_hs256(password)): + self._HEADERS['authorization'] = password + self.report_login() + return + elif len(username) != 10 or not username.isdigit(): + raise ExtractorError(f'Invalid username/password; {self._LOGIN_HINT}') + + self.report_login() + otp_request_json = self._download_json( + 'https://apiv2.sonyliv.com/AGL/1.6/A/ENG/WEB/IN/HR/CREATEOTP-V2', + None, note='Sending OTP', headers=self._HEADERS, data=json.dumps({ + 'mobileNumber': username, + 'channelPartnerID': 'MSMIND', + 'country': 'IN', + 'timestamp': datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%MZ'), + 'otpSize': 6, + 'loginType': 'REGISTERORSIGNIN', + 'isMobileMandatory': True, + }).encode()) + if otp_request_json['resultCode'] == 'KO': + raise ExtractorError(otp_request_json['message'], expected=True) + + otp_verify_json = self._download_json( + 'https://apiv2.sonyliv.com/AGL/2.0/A/ENG/WEB/IN/HR/CONFIRMOTP-V2', + None, note='Verifying OTP', headers=self._HEADERS, data=json.dumps({ + 'channelPartnerID': 'MSMIND', + 'mobileNumber': username, + 'country': 'IN', + 'otp': self._get_tfa_info('OTP'), + 'dmaId': 'IN', + 'ageConfirmation': True, + 'timestamp': datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S.%MZ'), + 'isMobileMandatory': True, + }).encode()) + if otp_verify_json['resultCode'] == 'KO': + raise ExtractorError(otp_request_json['message'], expected=True) + self._HEADERS['authorization'] = otp_verify_json['resultObj']['accessToken'] + + def _call_api(self, version, path, video_id): + try: + return self._download_json( + 'https://apiv2.sonyliv.com/AGL/%s/A/ENG/WEB/%s' % (version, path), + video_id, headers=self._HEADERS)['resultObj'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 406 and self._parse_json( + e.cause.response.read().decode(), video_id)['message'] == 'Please subscribe to watch this content': + self.raise_login_required(self._LOGIN_HINT, method=None) + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + message = self._parse_json( + e.cause.response.read().decode(), video_id)['message'] + if message == 'Geoblocked Country': + self.raise_geo_restricted(countries=self._GEO_COUNTRIES) + raise ExtractorError(message) + raise + + def _initialize_pre_login(self): + self._HEADERS['security_token'] = self._call_api('1.4', 'ALL/GETTOKEN', None) + + def _real_extract(self, url): + video_id = self._match_id(url) + content = self._call_api( + '1.5', 'IN/CONTENT/VIDEOURL/VOD/' + video_id, video_id) + if not self.get_param('allow_unplayable_formats') and content.get('isEncrypted'): + self.report_drm(video_id) + dash_url = content['videoURL'] + headers = { + 'x-playback-session-id': '%s-%d' % (uuid.uuid4().hex, time.time() * 1000) + } + formats = self._extract_mpd_formats( + dash_url, video_id, mpd_id='dash', headers=headers, fatal=False) + formats.extend(self._extract_m3u8_formats( + dash_url.replace('.mpd', '.m3u8').replace('/DASH/', '/HLS/'), + video_id, 'mp4', m3u8_id='hls', headers=headers, fatal=False)) + for f in formats: + f.setdefault('http_headers', {}).update(headers) + + metadata = self._call_api( + '1.6', 'IN/DETAIL/' + video_id, video_id)['containers'][0]['metadata'] + title = metadata['episodeTitle'] + subtitles = {} + for sub in content.get('subtitle', []): + sub_url = sub.get('subtitleUrl') + if not sub_url: + continue + subtitles.setdefault(sub.get('subtitleLanguageName', 'ENG'), []).append({ + 'url': sub_url, + }) + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'thumbnail': content.get('posterURL'), + 'description': metadata.get('longDescription') or metadata.get('shortDescription'), + 'timestamp': int_or_none(metadata.get('creationDate'), 1000), + 'duration': int_or_none(metadata.get('duration')), + 'season_number': int_or_none(metadata.get('season')), + 'series': metadata.get('title'), + 'episode_number': int_or_none(metadata.get('episodeNumber')), + 'release_year': int_or_none(metadata.get('year')), + 'subtitles': subtitles, + } + + +class SonyLIVSeriesIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?sonyliv\.com/shows/[^/?#&]+-(?P<id>\d{10})$' + _TESTS = [{ + 'url': 'https://www.sonyliv.com/shows/adaalat-1700000091', + 'playlist_mincount': 456, + 'info_dict': { + 'id': '1700000091', + }, + }] + _API_SHOW_URL = "https://apiv2.sonyliv.com/AGL/1.9/R/ENG/WEB/IN/DL/DETAIL/{}?kids_safe=false&from=0&to=49" + _API_EPISODES_URL = "https://apiv2.sonyliv.com/AGL/1.4/R/ENG/WEB/IN/CONTENT/DETAIL/BUNDLE/{}?from=0&to=1000&orderBy=episodeNumber&sortOrder=asc" + _API_SECURITY_URL = 'https://apiv2.sonyliv.com/AGL/1.4/A/ENG/WEB/ALL/GETTOKEN' + + def _entries(self, show_id): + headers = { + 'Accept': 'application/json, text/plain, */*', + 'Referer': 'https://www.sonyliv.com', + } + headers['security_token'] = self._download_json( + self._API_SECURITY_URL, video_id=show_id, headers=headers, + note='Downloading security token')['resultObj'] + seasons = try_get( + self._download_json(self._API_SHOW_URL.format(show_id), video_id=show_id, headers=headers), + lambda x: x['resultObj']['containers'][0]['containers'], list) + for season in seasons or []: + season_id = season['id'] + episodes = try_get( + self._download_json(self._API_EPISODES_URL.format(season_id), video_id=season_id, headers=headers), + lambda x: x['resultObj']['containers'][0]['containers'], list) + for episode in episodes or []: + video_id = episode.get('id') + yield self.url_result('sonyliv:%s' % video_id, ie=SonyLIVIE.ie_key(), video_id=video_id) + + def _real_extract(self, url): + show_id = self._match_id(url) + return self.playlist_result(self._entries(show_id), playlist_id=show_id) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/soundcloud.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/soundcloud.py new file mode 100644 index 0000000..a7c2afd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/soundcloud.py @@ -0,0 +1,948 @@ +import itertools +import re +import json +# import random + +from .common import ( + InfoExtractor, + SearchInfoExtractor +) +from ..compat import compat_str +from ..networking import HEADRequest, Request +from ..networking.exceptions import HTTPError +from ..utils import ( + error_to_compat_str, + ExtractorError, + float_or_none, + int_or_none, + KNOWN_EXTENSIONS, + mimetype2ext, + parse_qs, + str_or_none, + try_get, + unified_timestamp, + update_url_query, + url_or_none, + urlhandle_detect_ext, +) + + +class SoundcloudEmbedIE(InfoExtractor): + _VALID_URL = r'https?://(?:w|player|p)\.soundcloud\.com/player/?.*?\burl=(?P<id>.+)' + _EMBED_REGEX = [r'<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?(?:w\.)?soundcloud\.com/player.+?)\1'] + _TEST = { + # from https://www.soundi.fi/uutiset/ennakkokuuntelussa-timo-kaukolammen-station-to-station-to-station-julkaisua-juhlitaan-tanaan-g-livelabissa/ + 'url': 'https://w.soundcloud.com/player/?visual=true&url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F922213810&show_artwork=true&maxwidth=640&maxheight=960&dnt=1&secret_token=s-ziYey', + 'only_matching': True, + } + + def _real_extract(self, url): + query = parse_qs(url) + api_url = query['url'][0] + secret_token = query.get('secret_token') + if secret_token: + api_url = update_url_query(api_url, {'secret_token': secret_token[0]}) + return self.url_result(api_url) + + +class SoundcloudBaseIE(InfoExtractor): + _NETRC_MACHINE = 'soundcloud' + + _API_V2_BASE = 'https://api-v2.soundcloud.com/' + _BASE_URL = 'https://soundcloud.com/' + _USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' + _API_AUTH_QUERY_TEMPLATE = '?client_id=%s' + _API_AUTH_URL_PW = 'https://api-auth.soundcloud.com/web-auth/sign-in/password%s' + _API_VERIFY_AUTH_TOKEN = 'https://api-auth.soundcloud.com/connect/session%s' + _access_token = None + _HEADERS = {} + + _IMAGE_REPL_RE = r'-([0-9a-z]+)\.jpg' + + _ARTWORK_MAP = { + 'mini': 16, + 'tiny': 20, + 'small': 32, + 'badge': 47, + 't67x67': 67, + 'large': 100, + 't300x300': 300, + 'crop': 400, + 't500x500': 500, + 'original': 0, + } + + def _store_client_id(self, client_id): + self.cache.store('soundcloud', 'client_id', client_id) + + def _update_client_id(self): + webpage = self._download_webpage('https://soundcloud.com/', None) + for src in reversed(re.findall(r'<script[^>]+src="([^"]+)"', webpage)): + script = self._download_webpage(src, None, fatal=False) + if script: + client_id = self._search_regex( + r'client_id\s*:\s*"([0-9a-zA-Z]{32})"', + script, 'client id', default=None) + if client_id: + self._CLIENT_ID = client_id + self._store_client_id(client_id) + return + raise ExtractorError('Unable to extract client id') + + def _download_json(self, *args, **kwargs): + non_fatal = kwargs.get('fatal') is False + if non_fatal: + del kwargs['fatal'] + query = kwargs.get('query', {}).copy() + for _ in range(2): + query['client_id'] = self._CLIENT_ID + kwargs['query'] = query + try: + return super()._download_json(*args, **kwargs) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status in (401, 403): + self._store_client_id(None) + self._update_client_id() + continue + elif non_fatal: + self.report_warning(error_to_compat_str(e)) + return False + raise + + def _initialize_pre_login(self): + self._CLIENT_ID = self.cache.load('soundcloud', 'client_id') or 'a3e059563d7fd3372b49b37f00a00bcf' + + def _perform_login(self, username, password): + if username != 'oauth': + self.report_warning( + 'Login using username and password is not currently supported. ' + 'Use "--username oauth --password <oauth_token>" to login using an oauth token') + self._access_token = password + query = self._API_AUTH_QUERY_TEMPLATE % self._CLIENT_ID + payload = {'session': {'access_token': self._access_token}} + token_verification = Request(self._API_VERIFY_AUTH_TOKEN % query, json.dumps(payload).encode('utf-8')) + response = self._download_json(token_verification, None, note='Verifying login token...', fatal=False) + if response is not False: + self._HEADERS = {'Authorization': 'OAuth ' + self._access_token} + self.report_login() + else: + self.report_warning('Provided authorization token seems to be invalid. Continue as guest') + + r''' + def genDevId(): + def genNumBlock(): + return ''.join([str(random.randrange(10)) for i in range(6)]) + return '-'.join([genNumBlock() for i in range(4)]) + + payload = { + 'client_id': self._CLIENT_ID, + 'recaptcha_pubkey': 'null', + 'recaptcha_response': 'null', + 'credentials': { + 'identifier': username, + 'password': password + }, + 'signature': self.sign(username, password, self._CLIENT_ID), + 'device_id': genDevId(), + 'user_agent': self._USER_AGENT + } + + query = self._API_AUTH_QUERY_TEMPLATE % self._CLIENT_ID + login = sanitized_Request(self._API_AUTH_URL_PW % query, json.dumps(payload).encode('utf-8')) + response = self._download_json(login, None) + self._access_token = response.get('session').get('access_token') + if not self._access_token: + self.report_warning('Unable to get access token, login may has failed') + else: + self._HEADERS = {'Authorization': 'OAuth ' + self._access_token} + ''' + + # signature generation + def sign(self, user, pw, clid): + a = 33 + i = 1 + s = 440123 + w = 117 + u = 1800000 + l = 1042 + b = 37 + k = 37 + c = 5 + n = '0763ed7314c69015fd4a0dc16bbf4b90' # _KEY + y = '8' # _REV + r = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' # _USER_AGENT + e = user # _USERNAME + t = clid # _CLIENT_ID + + d = '-'.join([str(mInt) for mInt in [a, i, s, w, u, l, b, k]]) + p = n + y + d + r + e + t + d + n + h = p + + m = 8011470 + f = 0 + + for f in range(f, len(h)): + m = (m >> 1) + ((1 & m) << 23) + m += ord(h[f]) + m &= 16777215 + + # c is not even needed + out = str(y) + ':' + str(d) + ':' + format(m, 'x') + ':' + str(c) + + return out + + def _extract_info_dict(self, info, full_title=None, secret_token=None, extract_flat=False): + track_id = compat_str(info['id']) + title = info['title'] + + format_urls = set() + formats = [] + query = {'client_id': self._CLIENT_ID} + if secret_token: + query['secret_token'] = secret_token + + if not extract_flat and info.get('downloadable') and info.get('has_downloads_left'): + download_url = update_url_query( + self._API_V2_BASE + 'tracks/' + track_id + '/download', query) + redirect_url = (self._download_json(download_url, track_id, fatal=False) or {}).get('redirectUri') + if redirect_url: + urlh = self._request_webpage( + HEADRequest(redirect_url), track_id, fatal=False) + if urlh: + format_url = urlh.url + format_urls.add(format_url) + formats.append({ + 'format_id': 'download', + 'ext': urlhandle_detect_ext(urlh) or 'mp3', + 'filesize': int_or_none(urlh.headers.get('Content-Length')), + 'url': format_url, + 'quality': 10, + }) + + def invalid_url(url): + return not url or url in format_urls + + def add_format(f, protocol, is_preview=False): + mobj = re.search(r'\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?])', stream_url) + if mobj: + for k, v in mobj.groupdict().items(): + if not f.get(k): + f[k] = v + format_id_list = [] + if protocol: + format_id_list.append(protocol) + ext = f.get('ext') + if ext == 'aac': + f['abr'] = '256' + for k in ('ext', 'abr'): + v = f.get(k) + if v: + format_id_list.append(v) + preview = is_preview or re.search(r'/(?:preview|playlist)/0/30/', f['url']) + if preview: + format_id_list.append('preview') + abr = f.get('abr') + if abr: + f['abr'] = int(abr) + if protocol == 'hls': + protocol = 'm3u8' if ext == 'aac' else 'm3u8_native' + else: + protocol = 'http' + f.update({ + 'format_id': '_'.join(format_id_list), + 'protocol': protocol, + 'preference': -10 if preview else None, + }) + formats.append(f) + + # New API + transcodings = try_get( + info, lambda x: x['media']['transcodings'], list) or [] + for t in transcodings: + if not isinstance(t, dict): + continue + format_url = url_or_none(t.get('url')) + if not format_url: + continue + stream = None if extract_flat else self._download_json( + format_url, track_id, query=query, fatal=False, headers=self._HEADERS) + if not isinstance(stream, dict): + continue + stream_url = url_or_none(stream.get('url')) + if invalid_url(stream_url): + continue + format_urls.add(stream_url) + stream_format = t.get('format') or {} + protocol = stream_format.get('protocol') + if protocol != 'hls' and '/hls' in format_url: + protocol = 'hls' + ext = None + preset = str_or_none(t.get('preset')) + if preset: + ext = preset.split('_')[0] + if ext not in KNOWN_EXTENSIONS: + ext = mimetype2ext(stream_format.get('mime_type')) + add_format({ + 'url': stream_url, + 'ext': ext, + }, 'http' if protocol == 'progressive' else protocol, + t.get('snipped') or '/preview/' in format_url) + + for f in formats: + f['vcodec'] = 'none' + + if not formats and info.get('policy') == 'BLOCK': + self.raise_geo_restricted(metadata_available=True) + + user = info.get('user') or {} + + thumbnails = [] + artwork_url = info.get('artwork_url') + thumbnail = artwork_url or user.get('avatar_url') + if isinstance(thumbnail, compat_str): + if re.search(self._IMAGE_REPL_RE, thumbnail): + for image_id, size in self._ARTWORK_MAP.items(): + i = { + 'id': image_id, + 'url': re.sub(self._IMAGE_REPL_RE, '-%s.jpg' % image_id, thumbnail), + } + if image_id == 'tiny' and not artwork_url: + size = 18 + elif image_id == 'original': + i['preference'] = 10 + if size: + i.update({ + 'width': size, + 'height': size, + }) + thumbnails.append(i) + else: + thumbnails = [{'url': thumbnail}] + + def extract_count(key): + return int_or_none(info.get('%s_count' % key)) + + return { + 'id': track_id, + 'uploader': user.get('username'), + 'uploader_id': str_or_none(user.get('id')) or user.get('permalink'), + 'uploader_url': user.get('permalink_url'), + 'timestamp': unified_timestamp(info.get('created_at')), + 'title': title, + 'description': info.get('description'), + 'thumbnails': thumbnails, + 'duration': float_or_none(info.get('duration'), 1000), + 'webpage_url': info.get('permalink_url'), + 'license': info.get('license'), + 'view_count': extract_count('playback'), + 'like_count': extract_count('favoritings') or extract_count('likes'), + 'comment_count': extract_count('comment'), + 'repost_count': extract_count('reposts'), + 'genre': info.get('genre'), + 'formats': formats if not extract_flat else None + } + + @classmethod + def _resolv_url(cls, url): + return cls._API_V2_BASE + 'resolve?url=' + url + + +class SoundcloudIE(SoundcloudBaseIE): + """Information extractor for soundcloud.com + To access the media, the uid of the song and a stream token + must be extracted from the page source and the script must make + a request to media.soundcloud.com/crossdomain.xml. Then + the media can be grabbed by requesting from an url composed + of the stream token and uid + """ + + _VALID_URL = r'''(?x)^(?:https?://)? + (?:(?:(?:www\.|m\.)?soundcloud\.com/ + (?!stations/track) + (?P<uploader>[\w\d-]+)/ + (?!(?:tracks|albums|sets(?:/.+?)?|reposts|likes|spotlight)/?(?:$|[?#])) + (?P<title>[\w\d-]+) + (?:/(?P<token>(?!(?:albums|sets|recommended))[^?]+?))? + (?:[?].*)?$) + |(?:api(?:-v2)?\.soundcloud\.com/tracks/(?P<track_id>\d+) + (?:/?\?secret_token=(?P<secret_token>[^&]+))?) + ) + ''' + IE_NAME = 'soundcloud' + _TESTS = [ + { + 'url': 'http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy', + 'md5': 'ebef0a451b909710ed1d7787dddbf0d7', + 'info_dict': { + 'id': '62986583', + 'ext': 'mp3', + 'title': 'Lostin Powers - She so Heavy (SneakPreview) Adrian Ackers Blueprint 1', + 'description': 'No Downloads untill we record the finished version this weekend, i was too pumped n i had to post it , earl is prolly gonna b hella p.o\'d', + 'uploader': 'E.T. ExTerrestrial Music', + 'uploader_id': '1571244', + 'timestamp': 1349920598, + 'upload_date': '20121011', + 'duration': 143.216, + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + } + }, + # geo-restricted + { + 'url': 'https://soundcloud.com/the-concept-band/goldrushed-mastered?in=the-concept-band/sets/the-royal-concept-ep', + 'info_dict': { + 'id': '47127627', + 'ext': 'mp3', + 'title': 'Goldrushed', + 'description': 'From Stockholm Sweden\r\nPovel / Magnus / Filip / David\r\nwww.theroyalconcept.com', + 'uploader': 'The Royal Concept', + 'uploader_id': '9615865', + 'timestamp': 1337635207, + 'upload_date': '20120521', + 'duration': 227.155, + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + # private link + { + 'url': 'https://soundcloud.com/jaimemf/youtube-dl-test-video-a-y-baw/s-8Pjrp', + 'md5': 'aa0dd32bfea9b0c5ef4f02aacd080604', + 'info_dict': { + 'id': '123998367', + 'ext': 'mp3', + 'title': 'Youtube - Dl Test Video \'\' Ä↭', + 'description': 'test chars: \"\'/\\ä↭', + 'uploader': 'jaimeMF', + 'uploader_id': '69767071', + 'timestamp': 1386604920, + 'upload_date': '20131209', + 'duration': 9.927, + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + # private link (alt format) + { + 'url': 'https://api.soundcloud.com/tracks/123998367?secret_token=s-8Pjrp', + 'md5': 'aa0dd32bfea9b0c5ef4f02aacd080604', + 'info_dict': { + 'id': '123998367', + 'ext': 'mp3', + 'title': 'Youtube - Dl Test Video \'\' Ä↭', + 'description': 'test chars: \"\'/\\ä↭', + 'uploader': 'jaimeMF', + 'uploader_id': '69767071', + 'timestamp': 1386604920, + 'upload_date': '20131209', + 'duration': 9.927, + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + # downloadable song + { + 'url': 'https://soundcloud.com/the80m/the-following', + 'md5': '9ffcddb08c87d74fb5808a3c183a1d04', + 'info_dict': { + 'id': '343609555', + 'ext': 'wav', + }, + }, + # private link, downloadable format + { + 'url': 'https://soundcloud.com/oriuplift/uponly-238-no-talking-wav/s-AyZUd', + 'md5': '64a60b16e617d41d0bef032b7f55441e', + 'info_dict': { + 'id': '340344461', + 'ext': 'wav', + 'title': 'Uplifting Only 238 [No Talking] (incl. Alex Feed Guestmix) (Aug 31, 2017) [wav]', + 'description': 'md5:fa20ee0fca76a3d6df8c7e57f3715366', + 'uploader': 'Ori Uplift Music', + 'uploader_id': '12563093', + 'timestamp': 1504206263, + 'upload_date': '20170831', + 'duration': 7449.096, + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + # no album art, use avatar pic for thumbnail + { + 'url': 'https://soundcloud.com/garyvee/sideways-prod-mad-real', + 'md5': '59c7872bc44e5d99b7211891664760c2', + 'info_dict': { + 'id': '309699954', + 'ext': 'mp3', + 'title': 'Sideways (Prod. Mad Real)', + 'description': 'md5:d41d8cd98f00b204e9800998ecf8427e', + 'uploader': 'garyvee', + 'uploader_id': '2366352', + 'timestamp': 1488152409, + 'upload_date': '20170226', + 'duration': 207.012, + 'thumbnail': r're:https?://.*\.jpg', + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'https://soundcloud.com/giovannisarani/mezzo-valzer', + 'md5': 'e22aecd2bc88e0e4e432d7dcc0a1abf7', + 'info_dict': { + 'id': '583011102', + 'ext': 'mp3', + 'title': 'Mezzo Valzer', + 'description': 'md5:4138d582f81866a530317bae316e8b61', + 'uploader': 'Micronie', + 'uploader_id': '3352531', + 'timestamp': 1551394171, + 'upload_date': '20190228', + 'duration': 180.157, + 'thumbnail': r're:https?://.*\.jpg', + 'license': 'all-rights-reserved', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + }, + }, + { + # AAC HQ format available (account with active subscription needed) + 'url': 'https://soundcloud.com/wandw/the-chainsmokers-ft-daya-dont-let-me-down-ww-remix-1', + 'only_matching': True, + }, + { + # Go+ (account with active subscription needed) + 'url': 'https://soundcloud.com/taylorswiftofficial/look-what-you-made-me-do', + 'only_matching': True, + }, + ] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + + track_id = mobj.group('track_id') + + query = {} + if track_id: + info_json_url = self._API_V2_BASE + 'tracks/' + track_id + full_title = track_id + token = mobj.group('secret_token') + if token: + query['secret_token'] = token + else: + full_title = resolve_title = '%s/%s' % mobj.group('uploader', 'title') + token = mobj.group('token') + if token: + resolve_title += '/%s' % token + info_json_url = self._resolv_url(self._BASE_URL + resolve_title) + + info = self._download_json( + info_json_url, full_title, 'Downloading info JSON', query=query, headers=self._HEADERS) + + return self._extract_info_dict(info, full_title, token) + + +class SoundcloudPlaylistBaseIE(SoundcloudBaseIE): + def _extract_set(self, playlist, token=None): + playlist_id = compat_str(playlist['id']) + tracks = playlist.get('tracks') or [] + if not all([t.get('permalink_url') for t in tracks]) and token: + tracks = self._download_json( + self._API_V2_BASE + 'tracks', playlist_id, + 'Downloading tracks', query={ + 'ids': ','.join([compat_str(t['id']) for t in tracks]), + 'playlistId': playlist_id, + 'playlistSecretToken': token, + }, headers=self._HEADERS) + entries = [] + for track in tracks: + track_id = str_or_none(track.get('id')) + url = track.get('permalink_url') + if not url: + if not track_id: + continue + url = self._API_V2_BASE + 'tracks/' + track_id + if token: + url += '?secret_token=' + token + entries.append(self.url_result( + url, SoundcloudIE.ie_key(), track_id)) + return self.playlist_result( + entries, playlist_id, + playlist.get('title'), + playlist.get('description')) + + +class SoundcloudSetIE(SoundcloudPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|m)\.)?soundcloud\.com/(?P<uploader>[\w\d-]+)/sets/(?P<slug_title>[:\w\d-]+)(?:/(?P<token>[^?/]+))?' + IE_NAME = 'soundcloud:set' + _TESTS = [{ + 'url': 'https://soundcloud.com/the-concept-band/sets/the-royal-concept-ep', + 'info_dict': { + 'id': '2284613', + 'title': 'The Royal Concept EP', + 'description': 'md5:71d07087c7a449e8941a70a29e34671e', + }, + 'playlist_mincount': 5, + }, { + 'url': 'https://soundcloud.com/the-concept-band/sets/the-royal-concept-ep/token', + 'only_matching': True, + }, { + 'url': 'https://soundcloud.com/discover/sets/weekly::flacmatic', + 'only_matching': True, + }, { + 'url': 'https://soundcloud.com/discover/sets/charts-top:all-music:de', + 'only_matching': True, + }, { + 'url': 'https://soundcloud.com/discover/sets/charts-top:hiphoprap:kr', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + + full_title = '%s/sets/%s' % mobj.group('uploader', 'slug_title') + token = mobj.group('token') + if token: + full_title += '/' + token + + info = self._download_json(self._resolv_url( + self._BASE_URL + full_title), full_title, headers=self._HEADERS) + + if 'errors' in info: + msgs = (compat_str(err['error_message']) for err in info['errors']) + raise ExtractorError('unable to download video webpage: %s' % ','.join(msgs)) + + return self._extract_set(info, token) + + +class SoundcloudPagedPlaylistBaseIE(SoundcloudBaseIE): + def _extract_playlist(self, base_url, playlist_id, playlist_title): + return { + '_type': 'playlist', + 'id': playlist_id, + 'title': playlist_title, + 'entries': self._entries(base_url, playlist_id), + } + + def _entries(self, url, playlist_id): + # Per the SoundCloud documentation, the maximum limit for a linked partitioning query is 200. + # https://developers.soundcloud.com/blog/offset-pagination-deprecated + query = { + 'limit': 200, + 'linked_partitioning': '1', + 'offset': 0, + } + + for i in itertools.count(): + for retry in self.RetryManager(): + try: + response = self._download_json( + url, playlist_id, query=query, headers=self._HEADERS, + note=f'Downloading track page {i + 1}') + break + except ExtractorError as e: + # Downloading page may result in intermittent 502 HTTP error + # See https://github.com/yt-dlp/yt-dlp/issues/872 + if not isinstance(e.cause, HTTPError) or e.cause.status != 502: + raise + retry.error = e + continue + + def resolve_entry(*candidates): + for cand in candidates: + if not isinstance(cand, dict): + continue + permalink_url = url_or_none(cand.get('permalink_url')) + if permalink_url: + return self.url_result( + permalink_url, + SoundcloudIE.ie_key() if SoundcloudIE.suitable(permalink_url) else None, + str_or_none(cand.get('id')), cand.get('title')) + + for e in response['collection'] or []: + yield resolve_entry(e, e.get('track'), e.get('playlist')) + + url = response.get('next_href') + if not url: + break + query.pop('offset', None) + + +class SoundcloudUserIE(SoundcloudPagedPlaylistBaseIE): + _VALID_URL = r'''(?x) + https?:// + (?:(?:www|m)\.)?soundcloud\.com/ + (?P<user>[^/]+) + (?:/ + (?P<rsrc>tracks|albums|sets|reposts|likes|spotlight) + )? + /?(?:[?#].*)?$ + ''' + IE_NAME = 'soundcloud:user' + _TESTS = [{ + 'url': 'https://soundcloud.com/soft-cell-official', + 'info_dict': { + 'id': '207965082', + 'title': 'Soft Cell (All)', + }, + 'playlist_mincount': 28, + }, { + 'url': 'https://soundcloud.com/soft-cell-official/tracks', + 'info_dict': { + 'id': '207965082', + 'title': 'Soft Cell (Tracks)', + }, + 'playlist_mincount': 27, + }, { + 'url': 'https://soundcloud.com/soft-cell-official/albums', + 'info_dict': { + 'id': '207965082', + 'title': 'Soft Cell (Albums)', + }, + 'playlist_mincount': 1, + }, { + 'url': 'https://soundcloud.com/jcv246/sets', + 'info_dict': { + 'id': '12982173', + 'title': 'Jordi / cv (Sets)', + }, + 'playlist_mincount': 2, + }, { + 'url': 'https://soundcloud.com/jcv246/reposts', + 'info_dict': { + 'id': '12982173', + 'title': 'Jordi / cv (Reposts)', + }, + 'playlist_mincount': 6, + }, { + 'url': 'https://soundcloud.com/clalberg/likes', + 'info_dict': { + 'id': '11817582', + 'title': 'clalberg (Likes)', + }, + 'playlist_mincount': 5, + }, { + 'url': 'https://soundcloud.com/grynpyret/spotlight', + 'info_dict': { + 'id': '7098329', + 'title': 'Grynpyret (Spotlight)', + }, + 'playlist_mincount': 1, + }] + + _BASE_URL_MAP = { + 'all': 'stream/users/%s', + 'tracks': 'users/%s/tracks', + 'albums': 'users/%s/albums', + 'sets': 'users/%s/playlists', + 'reposts': 'stream/users/%s/reposts', + 'likes': 'users/%s/likes', + 'spotlight': 'users/%s/spotlight', + } + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + uploader = mobj.group('user') + + user = self._download_json( + self._resolv_url(self._BASE_URL + uploader), + uploader, 'Downloading user info', headers=self._HEADERS) + + resource = mobj.group('rsrc') or 'all' + + return self._extract_playlist( + self._API_V2_BASE + self._BASE_URL_MAP[resource] % user['id'], + str_or_none(user.get('id')), + '%s (%s)' % (user['username'], resource.capitalize())) + + +class SoundcloudUserPermalinkIE(SoundcloudPagedPlaylistBaseIE): + _VALID_URL = r'https?://api\.soundcloud\.com/users/(?P<id>\d+)' + IE_NAME = 'soundcloud:user:permalink' + _TESTS = [{ + 'url': 'https://api.soundcloud.com/users/30909869', + 'info_dict': { + 'id': '30909869', + 'title': 'neilcic', + }, + 'playlist_mincount': 23, + }] + + def _real_extract(self, url): + user_id = self._match_id(url) + user = self._download_json( + self._resolv_url(url), user_id, 'Downloading user info', headers=self._HEADERS) + + return self._extract_playlist( + f'{self._API_V2_BASE}stream/users/{user["id"]}', str(user['id']), user.get('username')) + + +class SoundcloudTrackStationIE(SoundcloudPagedPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|m)\.)?soundcloud\.com/stations/track/[^/]+/(?P<id>[^/?#&]+)' + IE_NAME = 'soundcloud:trackstation' + _TESTS = [{ + 'url': 'https://soundcloud.com/stations/track/officialsundial/your-text', + 'info_dict': { + 'id': '286017854', + 'title': 'Track station: your text', + }, + 'playlist_mincount': 47, + }] + + def _real_extract(self, url): + track_name = self._match_id(url) + + track = self._download_json(self._resolv_url(url), track_name, headers=self._HEADERS) + track_id = self._search_regex( + r'soundcloud:track-stations:(\d+)', track['id'], 'track id') + + return self._extract_playlist( + self._API_V2_BASE + 'stations/%s/tracks' % track['id'], + track_id, 'Track station: %s' % track['title']) + + +class SoundcloudRelatedIE(SoundcloudPagedPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|m)\.)?soundcloud\.com/(?P<slug>[\w\d-]+/[\w\d-]+)/(?P<relation>albums|sets|recommended)' + IE_NAME = 'soundcloud:related' + _TESTS = [{ + 'url': 'https://soundcloud.com/wajang/sexapil-pingers-5/recommended', + 'info_dict': { + 'id': '1084577272', + 'title': 'Sexapil - Pingers 5 (Recommended)', + }, + 'playlist_mincount': 50, + }, { + 'url': 'https://soundcloud.com/wajang/sexapil-pingers-5/albums', + 'info_dict': { + 'id': '1084577272', + 'title': 'Sexapil - Pingers 5 (Albums)', + }, + 'playlist_mincount': 1, + }, { + 'url': 'https://soundcloud.com/wajang/sexapil-pingers-5/sets', + 'info_dict': { + 'id': '1084577272', + 'title': 'Sexapil - Pingers 5 (Sets)', + }, + 'playlist_mincount': 4, + }] + + _BASE_URL_MAP = { + 'albums': 'tracks/%s/albums', + 'sets': 'tracks/%s/playlists_without_albums', + 'recommended': 'tracks/%s/related', + } + + def _real_extract(self, url): + slug, relation = self._match_valid_url(url).group('slug', 'relation') + + track = self._download_json( + self._resolv_url(self._BASE_URL + slug), + slug, 'Downloading track info', headers=self._HEADERS) + + if track.get('errors'): + raise ExtractorError(f'{self.IE_NAME} said: %s' % ','.join( + str(err['error_message']) for err in track['errors']), expected=True) + + return self._extract_playlist( + self._API_V2_BASE + self._BASE_URL_MAP[relation] % track['id'], str(track['id']), + '%s (%s)' % (track.get('title') or slug, relation.capitalize())) + + +class SoundcloudPlaylistIE(SoundcloudPlaylistBaseIE): + _VALID_URL = r'https?://api(?:-v2)?\.soundcloud\.com/playlists/(?P<id>[0-9]+)(?:/?\?secret_token=(?P<token>[^&]+?))?$' + IE_NAME = 'soundcloud:playlist' + _TESTS = [{ + 'url': 'https://api.soundcloud.com/playlists/4110309', + 'info_dict': { + 'id': '4110309', + 'title': 'TILT Brass - Bowery Poetry Club, August \'03 [Non-Site SCR 02]', + 'description': 're:.*?TILT Brass - Bowery Poetry Club', + }, + 'playlist_count': 6, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + playlist_id = mobj.group('id') + + query = {} + token = mobj.group('token') + if token: + query['secret_token'] = token + + data = self._download_json( + self._API_V2_BASE + 'playlists/' + playlist_id, + playlist_id, 'Downloading playlist', query=query, headers=self._HEADERS) + + return self._extract_set(data, token) + + +class SoundcloudSearchIE(SoundcloudBaseIE, SearchInfoExtractor): + IE_NAME = 'soundcloud:search' + IE_DESC = 'Soundcloud search' + _SEARCH_KEY = 'scsearch' + _TESTS = [{ + 'url': 'scsearch15:post-avant jazzcore', + 'info_dict': { + 'id': 'post-avant jazzcore', + 'title': 'post-avant jazzcore', + }, + 'playlist_count': 15, + }] + + _MAX_RESULTS_PER_PAGE = 200 + _DEFAULT_RESULTS_PER_PAGE = 50 + + def _get_collection(self, endpoint, collection_id, **query): + limit = min( + query.get('limit', self._DEFAULT_RESULTS_PER_PAGE), + self._MAX_RESULTS_PER_PAGE) + query.update({ + 'limit': limit, + 'linked_partitioning': 1, + 'offset': 0, + }) + next_url = update_url_query(self._API_V2_BASE + endpoint, query) + + for i in itertools.count(1): + response = self._download_json( + next_url, collection_id, f'Downloading page {i}', + 'Unable to download API page', headers=self._HEADERS) + + for item in response.get('collection') or []: + if item: + yield self.url_result( + item['uri'], SoundcloudIE.ie_key(), **self._extract_info_dict(item, extract_flat=True)) + + next_url = response.get('next_href') + if not next_url: + break + + def _get_n_results(self, query, n): + return self.playlist_result(itertools.islice( + self._get_collection('search/tracks', query, limit=n, q=query), + 0, None if n == float('inf') else n), query, query) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/soundgasm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/soundgasm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/soundgasm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/soundgasm.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/southpark.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/southpark.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/southpark.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/southpark.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sovietscloset.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sovietscloset.py new file mode 100644 index 0000000..493eea2 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sovietscloset.py @@ -0,0 +1,207 @@ +from .common import InfoExtractor +from ..utils import ( + try_get, + unified_timestamp +) + + +class SovietsClosetBaseIE(InfoExtractor): + MEDIADELIVERY_REFERER = {'Referer': 'https://iframe.mediadelivery.net/'} + + def parse_nuxt_jsonp(self, nuxt_jsonp_url, video_id, name): + nuxt_jsonp = self._download_webpage(nuxt_jsonp_url, video_id, note=f'Downloading {name} __NUXT_JSONP__') + return self._search_nuxt_data(nuxt_jsonp, video_id, '__NUXT_JSONP__') + + def video_meta(self, video_id, game_name, category_name, episode_number, stream_date): + title = game_name + if category_name and category_name != 'Misc': + title += f' - {category_name}' + if episode_number: + title += f' #{episode_number}' + + timestamp = unified_timestamp(stream_date) + + return { + 'id': video_id, + 'title': title, + 'http_headers': self.MEDIADELIVERY_REFERER, + 'uploader': 'SovietWomble', + 'creator': 'SovietWomble', + 'release_timestamp': timestamp, + 'timestamp': timestamp, + 'uploader_id': 'SovietWomble', + 'uploader_url': 'https://www.twitch.tv/SovietWomble', + 'was_live': True, + 'availability': 'public', + 'series': game_name, + 'season': category_name, + 'episode_number': episode_number, + } + + +class SovietsClosetIE(SovietsClosetBaseIE): + _VALID_URL = r'https?://(?:www\.)?sovietscloset\.com/video/(?P<id>[0-9]+)/?' + _TESTS = [ + { + 'url': 'https://sovietscloset.com/video/1337', + 'md5': 'bd012b04b261725510ca5383074cdd55', + 'info_dict': { + 'id': '1337', + 'ext': 'mp4', + 'title': 'The Witcher #13', + 'thumbnail': r're:^https?://.*\.b-cdn\.net/2f0cfbf4-3588-43a9-a7d6-7c9ea3755e67/thumbnail\.jpg$', + 'uploader': 'SovietWomble', + 'creator': 'SovietWomble', + 'release_timestamp': 1492091580, + 'release_date': '20170413', + 'timestamp': 1492091580, + 'upload_date': '20170413', + 'uploader_id': 'SovietWomble', + 'uploader_url': 'https://www.twitch.tv/SovietWomble', + 'duration': 7007, + 'was_live': True, + 'availability': 'public', + 'series': 'The Witcher', + 'season': 'Misc', + 'episode_number': 13, + 'episode': 'Episode 13', + }, + }, + { + 'url': 'https://sovietscloset.com/video/1105', + 'md5': '89fa928f183893cb65a0b7be846d8a90', + 'info_dict': { + 'id': '1105', + 'ext': 'mp4', + 'title': 'Arma 3 - Zeus Games #5', + 'uploader': 'SovietWomble', + 'thumbnail': r're:^https?://.*\.b-cdn\.net/c0e5e76f-3a93-40b4-bf01-12343c2eec5d/thumbnail\.jpg$', + 'creator': 'SovietWomble', + 'release_timestamp': 1461157200, + 'release_date': '20160420', + 'timestamp': 1461157200, + 'upload_date': '20160420', + 'uploader_id': 'SovietWomble', + 'uploader_url': 'https://www.twitch.tv/SovietWomble', + 'duration': 8804, + 'was_live': True, + 'availability': 'public', + 'series': 'Arma 3', + 'season': 'Zeus Games', + 'episode_number': 5, + 'episode': 'Episode 5', + }, + }, + ] + + def _extract_bunnycdn_iframe(self, video_id, bunnycdn_id): + iframe = self._download_webpage( + f'https://iframe.mediadelivery.net/embed/5105/{bunnycdn_id}', + video_id, note='Downloading BunnyCDN iframe', headers=self.MEDIADELIVERY_REFERER) + + m3u8_url = self._search_regex(r'(https?://.*?\.m3u8)', iframe, 'm3u8 url') + thumbnail_url = self._search_regex(r'(https?://.*?thumbnail\.jpg)', iframe, 'thumbnail url') + + m3u8_formats = self._extract_m3u8_formats(m3u8_url, video_id, headers=self.MEDIADELIVERY_REFERER) + + if not m3u8_formats: + duration = None + else: + duration = self._extract_m3u8_vod_duration( + m3u8_formats[0]['url'], video_id, headers=self.MEDIADELIVERY_REFERER) + + return { + 'formats': m3u8_formats, + 'thumbnail': thumbnail_url, + 'duration': duration, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + static_assets_base = self._search_regex(r'(/_nuxt/static/\d+)', webpage, 'staticAssetsBase') + static_assets_base = f'https://sovietscloset.com{static_assets_base}' + + stream = self.parse_nuxt_jsonp(f'{static_assets_base}/video/{video_id}/payload.js', video_id, 'video')['stream'] + + return { + **self.video_meta( + video_id=video_id, game_name=stream['game']['name'], + category_name=try_get(stream, lambda x: x['subcategory']['name'], str), + episode_number=stream.get('number'), stream_date=stream.get('date')), + **self._extract_bunnycdn_iframe(video_id, stream['bunnyId']), + } + + +class SovietsClosetPlaylistIE(SovietsClosetBaseIE): + _VALID_URL = r'https?://(?:www\.)?sovietscloset\.com/(?!video)(?P<id>[^#?]+)' + _TESTS = [ + + { + 'url': 'https://sovietscloset.com/The-Witcher', + 'info_dict': { + 'id': 'The-Witcher', + 'title': 'The Witcher', + }, + 'playlist_mincount': 31, + }, + { + 'url': 'https://sovietscloset.com/Arma-3/Zeus-Games', + 'info_dict': { + 'id': 'Arma-3/Zeus-Games', + 'title': 'Arma 3 - Zeus Games', + }, + 'playlist_mincount': 3, + }, + { + 'url': 'https://sovietscloset.com/arma-3/zeus-games/', + 'info_dict': { + 'id': 'arma-3/zeus-games', + 'title': 'Arma 3 - Zeus Games', + }, + 'playlist_mincount': 3, + }, + { + 'url': 'https://sovietscloset.com/Total-War-Warhammer', + 'info_dict': { + 'id': 'Total-War-Warhammer', + 'title': 'Total War: Warhammer - Greenskins', + }, + 'playlist_mincount': 33, + }, + ] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + if playlist_id.endswith('/'): + playlist_id = playlist_id[:-1] + + webpage = self._download_webpage(url, playlist_id) + + static_assets_base = self._search_regex(r'(/_nuxt/static/\d+)', webpage, 'staticAssetsBase') + static_assets_base = f'https://sovietscloset.com{static_assets_base}' + + sovietscloset = self.parse_nuxt_jsonp(f'{static_assets_base}/payload.js', playlist_id, 'global')['games'] + + if '/' in playlist_id: + game_slug, category_slug = playlist_id.lower().split('/') + else: + game_slug = playlist_id.lower() + category_slug = 'misc' + + game = next(game for game in sovietscloset if game['slug'].lower() == game_slug) + category = next((cat for cat in game['subcategories'] if cat.get('slug', '').lower() == category_slug), + game['subcategories'][0]) + category_slug = category.get('slug', '').lower() or category_slug + playlist_title = game.get('name') or game_slug + if category_slug != 'misc': + playlist_title += f' - {category.get("name") or category_slug}' + entries = [{ + **self.url_result(f'https://sovietscloset.com/video/{stream["id"]}', ie=SovietsClosetIE.ie_key()), + **self.video_meta( + video_id=stream['id'], game_name=game['name'], category_name=category.get('name'), + episode_number=i + 1, stream_date=stream.get('date')), + } for i, stream in enumerate(category['streams'])] + + return self.playlist_result(entries, playlist_id, playlist_title) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spankbang.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spankbang.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spankbang.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spankbang.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spankwire.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spankwire.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spankwire.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spankwire.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spiegel.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spiegel.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spiegel.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spiegel.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spike.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spike.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spike.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spike.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sport5.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sport5.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sport5.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sport5.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sportbox.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sportbox.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sportbox.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sportbox.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sportdeutschland.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sportdeutschland.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sportdeutschland.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sportdeutschland.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spotify.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spotify.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spotify.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spotify.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/spreaker.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/spreaker.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/spreaker.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/spreaker.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/springboardplatform.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/springboardplatform.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/springboardplatform.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/springboardplatform.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sprout.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sprout.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sprout.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sprout.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/srgssr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/srgssr.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/srgssr.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/srgssr.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/srmediathek.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/srmediathek.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/srmediathek.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/srmediathek.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/stacommu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stacommu.py new file mode 100644 index 0000000..6f58f06 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/stacommu.py @@ -0,0 +1,148 @@ +import time + +from .wrestleuniverse import WrestleUniverseBaseIE +from ..utils import ( + int_or_none, + traverse_obj, + url_or_none, +) + + +class StacommuBaseIE(WrestleUniverseBaseIE): + _NETRC_MACHINE = 'stacommu' + _API_HOST = 'api.stacommu.jp' + _LOGIN_QUERY = {'key': 'AIzaSyCR9czxhH2eWuijEhTNWBZ5MCcOYEUTAhg'} + _LOGIN_HEADERS = { + 'Accept': '*/*', + 'Content-Type': 'application/json', + 'X-Client-Version': 'Chrome/JsCore/9.9.4/FirebaseCore-web', + 'Referer': 'https://www.stacommu.jp/', + 'Origin': 'https://www.stacommu.jp', + } + + @WrestleUniverseBaseIE._TOKEN.getter + def _TOKEN(self): + if self._REAL_TOKEN and self._TOKEN_EXPIRY <= int(time.time()): + self._refresh_token() + + return self._REAL_TOKEN + + def _get_formats(self, data, path, video_id=None): + if not traverse_obj(data, path) and not data.get('canWatch') and not self._TOKEN: + self.raise_login_required(method='password') + return super()._get_formats(data, path, video_id) + + def _extract_hls_key(self, data, path, decrypt): + encryption_data = traverse_obj(data, path) + if traverse_obj(encryption_data, ('encryptType', {int})) == 0: + return None + return traverse_obj(encryption_data, {'key': ('key', {decrypt}), 'iv': ('iv', {decrypt})}) + + +class StacommuVODIE(StacommuBaseIE): + _VALID_URL = r'https?://www\.stacommu\.jp/videos/episodes/(?P<id>[\da-zA-Z]+)' + _TESTS = [{ + # not encrypted + 'url': 'https://www.stacommu.jp/videos/episodes/aXcVKjHyAENEjard61soZZ', + 'info_dict': { + 'id': 'aXcVKjHyAENEjard61soZZ', + 'ext': 'mp4', + 'title': 'スタコミュAWARDã®è£å´ã€ã»ã¼å…¨éƒ¨è¦‹ã›ã¾ã™ï¼ã€œæ™´ã‚Œèˆžå°ã®ç›´å‰ãƒ‰ã‚­ãƒ‰ã‚­ç·¨ã€œ', + 'description': 'md5:6400275c57ae75c06da36b06f96beb1c', + 'timestamp': 1679652000, + 'upload_date': '20230324', + 'thumbnail': 'https://image.stacommu.jp/6eLobQan8PFtBoU4RL4uGg/6eLobQan8PFtBoU4RL4uGg', + 'cast': 'count:11', + 'duration': 250, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + # encrypted; requires a premium account + 'url': 'https://www.stacommu.jp/videos/episodes/3hybMByUvzMEqndSeu5LpD', + 'info_dict': { + 'id': '3hybMByUvzMEqndSeu5LpD', + 'ext': 'mp4', + 'title': 'スタプラフェス2023〜è£å´ã»ã¼å…¨éƒ¨è¦‹ã›ã¾ã™ã€œï¼ƒ10', + 'description': 'md5:85494488ccf1dfa1934accdeadd7b340', + 'timestamp': 1682506800, + 'upload_date': '20230426', + 'thumbnail': 'https://image.stacommu.jp/eMdXtEefR4kEyJJMpAFi7x/eMdXtEefR4kEyJJMpAFi7x', + 'cast': 'count:55', + 'duration': 312, + 'hls_aes': { + 'key': '6bbaf241b8e1fd9f59ecf546a70e4ae7', + 'iv': '1fc9002a23166c3bb1d240b953d09de9', + }, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }] + + _API_PATH = 'videoEpisodes' + + def _real_extract(self, url): + video_id = self._match_id(url) + video_info = self._download_metadata( + url, video_id, 'ja', ('dehydratedState', 'queries', 0, 'state', 'data')) + hls_info, decrypt = self._call_encrypted_api( + video_id, ':watch', 'stream information', data={'method': 1}) + + return { + 'id': video_id, + 'formats': self._get_formats(hls_info, ('protocolHls', 'url', {url_or_none}), video_id), + 'hls_aes': self._extract_hls_key(hls_info, 'protocolHls', decrypt), + **traverse_obj(video_info, { + 'title': ('displayName', {str}), + 'description': ('description', {str}), + 'timestamp': ('watchStartTime', {int_or_none}), + 'thumbnail': ('keyVisualUrl', {url_or_none}), + 'cast': ('casts', ..., 'displayName', {str}), + 'duration': ('duration', {int}), + }), + } + + +class StacommuLiveIE(StacommuBaseIE): + _VALID_URL = r'https?://www\.stacommu\.jp/live/(?P<id>[\da-zA-Z]+)' + _TESTS = [{ + 'url': 'https://www.stacommu.jp/live/d2FJ3zLnndegZJCAEzGM3m', + 'info_dict': { + 'id': 'd2FJ3zLnndegZJCAEzGM3m', + 'ext': 'mp4', + 'title': 'ä»²æ‘æ‚ èœ 2023/05/04', + 'timestamp': 1683195647, + 'upload_date': '20230504', + 'thumbnail': 'https://image.stacommu.jp/pHGF57SPEHE2ke83FS92FN/pHGF57SPEHE2ke83FS92FN', + 'duration': 5322, + 'hls_aes': { + 'key': 'efbb3ec0b8246f61adf1764c5a51213a', + 'iv': '80621d19a1f19167b64cedb415b05d1c', + }, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }] + + _API_PATH = 'events' + + def _real_extract(self, url): + video_id = self._match_id(url) + video_info = self._call_api(video_id, msg='video information', query={'al': 'ja'}, auth=False) + hls_info, decrypt = self._call_encrypted_api( + video_id, ':watchArchive', 'stream information', data={'method': 1}) + + return { + 'id': video_id, + 'formats': self._get_formats(hls_info, ('hls', 'urls', ..., {url_or_none}), video_id), + 'hls_aes': self._extract_hls_key(hls_info, 'hls', decrypt), + **traverse_obj(video_info, { + 'title': ('displayName', {str}), + 'timestamp': ('startTime', {int_or_none}), + 'thumbnail': ('keyVisualUrl', {url_or_none}), + 'duration': ('duration', {int_or_none}), + }), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/stageplus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stageplus.py new file mode 100644 index 0000000..4bed4d6 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/stageplus.py @@ -0,0 +1,515 @@ +import json +import uuid + +from .common import InfoExtractor +from ..utils import ( + float_or_none, + traverse_obj, + try_call, + unified_timestamp, + url_or_none, +) + + +class StagePlusVODConcertIE(InfoExtractor): + _NETRC_MACHINE = 'stageplus' + _VALID_URL = r'https?://(?:www\.)?stage-plus\.com/video/(?P<id>vod_concert_\w+)' + _TESTS = [{ + 'url': 'https://www.stage-plus.com/video/vod_concert_APNM8GRFDPHMASJKBSPJACG', + 'playlist_count': 6, + 'info_dict': { + 'id': 'vod_concert_APNM8GRFDPHMASJKBSPJACG', + 'title': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 – from Odeonsplatz', + 'description': 'md5:50f78ec180518c9bdb876bac550996fc', + 'artist': ['Yuja Wang', 'Lorenzo Viotti'], + 'upload_date': '20230331', + 'timestamp': 1680249600, + 'release_date': '20210709', + 'release_timestamp': 1625788800, + 'thumbnails': 'count:3', + }, + 'playlist': [{ + 'info_dict': { + 'id': 'performance_work_A1IN4PJFE9MM2RJ3CLBMUSJBBSOJAD9O', + 'ext': 'mp4', + 'title': 'Piano Concerto No. 2 in C Minor, Op. 18', + 'description': 'md5:50f78ec180518c9bdb876bac550996fc', + 'upload_date': '20230331', + 'timestamp': 1680249600, + 'release_date': '20210709', + 'release_timestamp': 1625788800, + 'duration': 2207, + 'chapters': 'count:5', + 'artist': ['Yuja Wang'], + 'composer': ['Sergei Rachmaninoff'], + 'album': 'Yuja Wang plays Rachmaninoff\'s Piano Concerto No. 2 – from Odeonsplatz', + 'album_artist': ['Yuja Wang', 'Lorenzo Viotti'], + 'track': 'Piano Concerto No. 2 in C Minor, Op. 18', + 'track_number': 1, + 'genre': 'Instrumental Concerto', + }, + }], + 'params': {'skip_download': 'm3u8'}, + }] + + # TODO: Prune this after livestream and/or album extractors are added + _GRAPHQL_QUERY = '''query videoDetailPage($videoId: ID!, $sliderItemsFirst: Int = 24) { + node(id: $videoId) { + __typename + ...LiveConcertFields + ... on LiveConcert { + artists { + edges { + role { + ...RoleFields + } + node { + id + name + sortName + } + } + } + isAtmos + maxResolution + groups { + id + name + typeDisplayName + } + shortDescription + performanceWorks { + ...livePerformanceWorkFields + } + totalDuration + sliders { + ...contentContainerFields + } + vodConcert { + __typename + id + } + } + ...VideoFields + ... on Video { + artists { + edges { + role { + ...RoleFields + } + node { + id + name + sortName + } + } + } + isAtmos + maxResolution + isLossless + description + productionDate + takedownDate + sliders { + ...contentContainerFields + } + } + ...VodConcertFields + ... on VodConcert { + artists { + edges { + role { + ...RoleFields + } + node { + id + name + sortName + } + } + } + isAtmos + maxResolution + groups { + id + name + typeDisplayName + } + performanceWorks { + ...PerformanceWorkFields + } + shortDescription + productionDate + takedownDate + sliders { + ...contentContainerFields + } + } + } +} + +fragment LiveConcertFields on LiveConcert { + endTime + id + pictures { + ...PictureFields + } + reruns { + ...liveConcertRerunFields + } + publicationLevel + startTime + streamStartTime + subtitle + title + typeDisplayName + stream { + ...liveStreamFields + } + trailerStream { + ...streamFields + } + geoAccessCountries + geoAccessMode +} + +fragment PictureFields on Picture { + id + url + type +} + +fragment liveConcertRerunFields on LiveConcertRerun { + streamStartTime + endTime + startTime + stream { + ...rerunStreamFields + } +} + +fragment rerunStreamFields on RerunStream { + publicationLevel + streamType + url +} + +fragment liveStreamFields on LiveStream { + publicationLevel + streamType + url +} + +fragment streamFields on Stream { + publicationLevel + streamType + url +} + +fragment RoleFields on Role { + __typename + id + type + displayName +} + +fragment livePerformanceWorkFields on LivePerformanceWork { + __typename + id + artists { + ...artistWithRoleFields + } + groups { + edges { + node { + id + name + typeDisplayName + } + } + } + work { + ...workFields + } +} + +fragment artistWithRoleFields on ArtistWithRoleConnection { + edges { + role { + ...RoleFields + } + node { + id + name + sortName + } + } +} + +fragment workFields on Work { + id + title + movements { + id + title + } + composers { + id + name + } + genre { + id + title + } +} + +fragment contentContainerFields on CuratedContentContainer { + __typename + ...SliderFields + ...BannerFields +} + +fragment SliderFields on Slider { + id + headline + items(first: $sliderItemsFirst) { + edges { + node { + id + __typename + ...AlbumFields + ...ArtistFields + ...EpochFields + ...GenreFields + ...GroupFields + ...LiveConcertFields + ...PartnerFields + ...PerformanceWorkFields + ...VideoFields + ...VodConcertFields + } + } + } +} + +fragment AlbumFields on Album { + artistAndGroupDisplayInfo + id + pictures { + ...PictureFields + } + title +} + +fragment ArtistFields on Artist { + id + name + roles { + ...RoleFields + } + pictures { + ...PictureFields + } +} + +fragment EpochFields on Epoch { + id + endYear + pictures { + ...PictureFields + } + startYear + title +} + +fragment GenreFields on Genre { + id + pictures { + ...PictureFields + } + title +} + +fragment GroupFields on Group { + id + name + typeDisplayName + pictures { + ...PictureFields + } +} + +fragment PartnerFields on Partner { + id + name + typeDisplayName + subtypeDisplayName + pictures { + ...PictureFields + } +} + +fragment PerformanceWorkFields on PerformanceWork { + __typename + id + artists { + ...artistWithRoleFields + } + groups { + edges { + node { + id + name + typeDisplayName + } + } + } + work { + ...workFields + } + stream { + ...streamFields + } + vodConcert { + __typename + id + } + duration + cuePoints { + mark + title + } +} + +fragment VideoFields on Video { + id + archiveReleaseDate + title + subtitle + pictures { + ...PictureFields + } + stream { + ...streamFields + } + trailerStream { + ...streamFields + } + duration + typeDisplayName + duration + geoAccessCountries + geoAccessMode + publicationLevel + takedownDate +} + +fragment VodConcertFields on VodConcert { + id + archiveReleaseDate + pictures { + ...PictureFields + } + subtitle + title + typeDisplayName + totalDuration + geoAccessCountries + geoAccessMode + trailerStream { + ...streamFields + } + publicationLevel + takedownDate +} + +fragment BannerFields on Banner { + description + link + pictures { + ...PictureFields + } + title +}''' + + _TOKEN = None + + def _perform_login(self, username, password): + auth = self._download_json('https://audience.api.stageplus.io/oauth/token', None, headers={ + 'Content-Type': 'application/json', + 'Origin': 'https://www.stage-plus.com', + }, data=json.dumps({ + 'grant_type': 'password', + 'username': username, + 'password': password, + 'device_info': 'Chrome (Windows)', + 'client_device_id': str(uuid.uuid4()), + }, separators=(',', ':')).encode(), note='Logging in') + + if auth.get('access_token'): + self._TOKEN = auth['access_token'] + + def _real_initialize(self): + if self._TOKEN: + return + + self._TOKEN = try_call( + lambda: self._get_cookies('https://www.stage-plus.com/')['dgplus_access_token'].value) + if not self._TOKEN: + self.raise_login_required() + + def _real_extract(self, url): + concert_id = self._match_id(url) + + data = self._download_json('https://audience.api.stageplus.io/graphql', concert_id, headers={ + 'authorization': f'Bearer {self._TOKEN}', + 'content-type': 'application/json', + 'Origin': 'https://www.stage-plus.com', + }, data=json.dumps({ + 'query': self._GRAPHQL_QUERY, + 'variables': {'videoId': concert_id}, + 'operationName': 'videoDetailPage' + }, separators=(',', ':')).encode())['data']['node'] + + metadata = traverse_obj(data, { + 'title': 'title', + 'description': ('shortDescription', {str}), + 'artist': ('artists', 'edges', ..., 'node', 'name'), + 'timestamp': ('archiveReleaseDate', {unified_timestamp}), + 'release_timestamp': ('productionDate', {unified_timestamp}), + }) + + thumbnails = traverse_obj(data, ('pictures', lambda _, v: url_or_none(v['url']), { + 'id': 'name', + 'url': 'url', + })) or None + + entries = [] + for idx, video in enumerate(traverse_obj(data, ( + 'performanceWorks', lambda _, v: v['id'] and url_or_none(v['stream']['url']))), 1): + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + video['stream']['url'], video['id'], 'mp4', m3u8_id='hls', query={'token': self._TOKEN}) + entries.append({ + 'id': video['id'], + 'formats': formats, + 'subtitles': subtitles, + 'album': metadata.get('title'), + 'album_artist': metadata.get('artist'), + 'track_number': idx, + **metadata, + **traverse_obj(video, { + 'title': ('work', 'title'), + 'track': ('work', 'title'), + 'duration': ('duration', {float_or_none}), + 'chapters': ( + 'cuePoints', lambda _, v: float_or_none(v['mark']) is not None, { + 'title': 'title', + 'start_time': ('mark', {float_or_none}), + }), + 'artist': ('artists', 'edges', ..., 'node', 'name'), + 'composer': ('work', 'composers', ..., 'name'), + 'genre': ('work', 'genre', 'title'), + }), + }) + + return self.playlist_result(entries, concert_id, thumbnails=thumbnails, **metadata) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/stanfordoc.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stanfordoc.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/stanfordoc.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/stanfordoc.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/startrek.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/startrek.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/startrek.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/startrek.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/startv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/startv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/startv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/startv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/steam.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/steam.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/steam.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/steam.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/stitcher.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stitcher.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/stitcher.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/stitcher.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/storyfire.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/storyfire.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/storyfire.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/storyfire.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/streamable.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/streamable.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/streamable.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/streamable.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/streamcloud.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/streamcloud.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/streamcloud.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/streamcloud.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/streamcz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/streamcz.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/streamcz.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/streamcz.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/streamff.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/streamff.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/streamff.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/streamff.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/streetvoice.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/streetvoice.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/streetvoice.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/streetvoice.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/stretchinternet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stretchinternet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/stretchinternet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/stretchinternet.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/stripchat.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stripchat.py new file mode 100644 index 0000000..b9523c8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/stripchat.py @@ -0,0 +1,66 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + UserNotLive, + lowercase_escape, + traverse_obj +) + + +class StripchatIE(InfoExtractor): + _VALID_URL = r'https?://stripchat\.com/(?P<id>[^/?#]+)' + _TESTS = [{ + 'url': 'https://stripchat.com/Joselin_Flower', + 'info_dict': { + 'id': 'Joselin_Flower', + 'ext': 'mp4', + 'title': 're:^Joselin_Flower [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'description': str, + 'is_live': True, + 'age_limit': 18, + }, + 'skip': 'Room is offline', + }, { + 'url': 'https://stripchat.com/Rakhijaan@xh', + 'only_matching': True + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id, headers=self.geo_verification_headers()) + + data = self._parse_json( + self._search_regex( + r'<script\b[^>]*>\s*window\.__PRELOADED_STATE__\s*=(?P<value>.*?)<\/script>', + webpage, 'data', default='{}', group='value'), + video_id, transform_source=lowercase_escape, fatal=False) + if not data: + raise ExtractorError('Unable to find configuration for stream.') + + if traverse_obj(data, ('viewCam', 'show'), expected_type=dict): + raise ExtractorError('Model is in private show', expected=True) + elif not traverse_obj(data, ('viewCam', 'model', 'isLive'), expected_type=bool): + raise UserNotLive(video_id=video_id) + + model_id = traverse_obj(data, ('viewCam', 'model', 'id'), expected_type=int) + + formats = [] + for host in traverse_obj(data, ('config', 'data', ( + (('features', 'featuresV2'), 'hlsFallback', 'fallbackDomains', ...), 'hlsStreamHost'))): + formats = self._extract_m3u8_formats( + f'https://edge-hls.{host}/hls/{model_id}/master/{model_id}_auto.m3u8', + video_id, ext='mp4', m3u8_id='hls', fatal=False, live=True) + if formats: + break + if not formats: + self.raise_no_formats('No active streams found', expected=True) + + return { + 'id': video_id, + 'title': video_id, + 'description': self._og_search_description(webpage), + 'is_live': True, + 'formats': formats, + # Stripchat declares the RTA meta-tag, but in an non-standard format so _rta_search() can't be used + 'age_limit': 18, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/stv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/stv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/stv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/stv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/substack.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/substack.py new file mode 100644 index 0000000..6ee3f75 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/substack.py @@ -0,0 +1,108 @@ +import re +import urllib.parse + +from .common import InfoExtractor +from ..utils import js_to_json, str_or_none, traverse_obj + + +class SubstackIE(InfoExtractor): + _VALID_URL = r'https?://(?P<username>[\w-]+)\.substack\.com/p/(?P<id>[\w-]+)' + _TESTS = [{ + 'url': 'https://haleynahman.substack.com/p/i-made-a-vlog?s=r', + 'md5': 'f27e4fc6252001d48d479f45e65cdfd5', + 'info_dict': { + 'id': '47660949', + 'ext': 'mp4', + 'title': 'I MADE A VLOG', + 'description': 'md5:9248af9a759321e1027226f988f54d96', + 'thumbnail': 'md5:bec758a34d8ee9142d43bcebdf33af18', + 'uploader': 'Maybe Baby', + 'uploader_id': '33628', + } + }, { + 'url': 'https://haleynahman.substack.com/p/-dear-danny-i-found-my-boyfriends?s=r', + 'md5': '0a63eacec877a1171a62cfa69710fcea', + 'info_dict': { + 'id': '51045592', + 'ext': 'mpga', + 'title': "🎧 Dear Danny: I found my boyfriend's secret Twitter account", + 'description': 'md5:a57f2439319e56e0af92dd0c95d75797', + 'thumbnail': 'md5:daa40b6b79249417c14ff8103db29639', + 'uploader': 'Maybe Baby', + 'uploader_id': '33628', + } + }, { + 'url': 'https://andrewzimmern.substack.com/p/mussels-with-black-bean-sauce-recipe', + 'md5': 'fd3c07077b02444ff0130715b5f632bb', + 'info_dict': { + 'id': '47368578', + 'ext': 'mp4', + 'title': 'Mussels with Black Bean Sauce: Recipe of the Week #7', + 'description': 'md5:b96234a2906c7d854d5229818d889515', + 'thumbnail': 'md5:e30bfaa9da40e82aa62354263a9dd232', + 'uploader': "Andrew Zimmern's Spilled Milk ", + 'uploader_id': '577659', + } + }] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + if not re.search(r'<script[^>]+src=["\']https://substackcdn.com/[^"\']+\.js', webpage): + return + + mobj = re.search(r'{[^}]*\\?["\']subdomain\\?["\']\s*:\s*\\?["\'](?P<subdomain>[^\\"\']+)', webpage) + if mobj: + parsed = urllib.parse.urlparse(url) + yield parsed._replace(netloc=f'{mobj.group("subdomain")}.substack.com').geturl() + raise cls.StopExtraction() + + def _extract_video_formats(self, video_id, url): + formats, subtitles = [], {} + for video_format in ('hls', 'mp4'): + video_url = urllib.parse.urljoin(url, f'/api/v1/video/upload/{video_id}/src?type={video_format}') + + if video_format == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles(video_url, video_id, 'mp4', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'url': video_url, + 'ext': video_format, + }) + + return formats, subtitles + + def _real_extract(self, url): + display_id, username = self._match_valid_url(url).group('id', 'username') + webpage = self._download_webpage(url, display_id) + + webpage_info = self._parse_json(self._search_json( + r'window\._preloads\s*=\s*JSON\.parse\(', webpage, 'json string', + display_id, transform_source=js_to_json, contains_pattern=r'"{(?s:.+)}"'), display_id) + + canonical_url = url + domain = traverse_obj(webpage_info, ('domainInfo', 'customDomain', {str})) + if domain: + canonical_url = urllib.parse.urlparse(url)._replace(netloc=domain).geturl() + + post_type = webpage_info['post']['type'] + formats, subtitles = [], {} + if post_type == 'podcast': + formats, subtitles = [{'url': webpage_info['post']['podcast_url']}], {} + elif post_type == 'video': + formats, subtitles = self._extract_video_formats(webpage_info['post']['videoUpload']['id'], canonical_url) + else: + self.raise_no_formats(f'Page type "{post_type}" is not supported') + + return { + 'id': str(webpage_info['post']['id']), + 'formats': formats, + 'subtitles': subtitles, + 'title': traverse_obj(webpage_info, ('post', 'title')), + 'description': traverse_obj(webpage_info, ('post', 'description')), + 'thumbnail': traverse_obj(webpage_info, ('post', 'cover_image')), + 'uploader': traverse_obj(webpage_info, ('pub', 'name')), + 'uploader_id': str_or_none(traverse_obj(webpage_info, ('post', 'publication_id'))), + 'webpage_url': canonical_url, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sunporno.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sunporno.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sunporno.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sunporno.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/sverigesradio.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sverigesradio.py new file mode 100644 index 0000000..01a07b3 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/sverigesradio.py @@ -0,0 +1,149 @@ +from .common import InfoExtractor +from ..utils import ( + determine_ext, + extract_attributes, + get_element_by_id, + get_element_html_by_class, + int_or_none, + str_or_none, + traverse_obj, + url_or_none, +) + + +class SverigesRadioBaseIE(InfoExtractor): + _BASE_URL = 'https://sverigesradio.se/sida/playerajax/' + _QUALITIES = ['low', 'medium', 'high'] + _EXT_TO_CODEC_MAP = { + 'mp3': 'mp3', + 'm4a': 'aac', + } + _CODING_FORMAT_TO_ABR_MAP = { + 5: 128, + 11: 192, + 12: 32, + 13: 96, + } + + def _real_extract(self, url): + audio_id, display_id = self._match_valid_url(url).group('id', 'slug') + if not audio_id: + webpage = self._download_webpage(url, display_id) + audio_id = ( + traverse_obj( + get_element_html_by_class('audio-button', webpage), + ({extract_attributes}, ('data-audio-id', 'data-publication-id')), get_all=False) + or self._parse_json(get_element_by_id('gtm-metadata', webpage), display_id)['pageId']) + + query = { + 'id': audio_id, + 'type': self._AUDIO_TYPE, + } + + item = self._download_json( + self._BASE_URL + 'audiometadata', audio_id, + 'Downloading audio JSON metadata', query=query)['items'][0] + + query['format'] = 'iis' + urls = [] + formats = [] + for quality in self._QUALITIES: + query['quality'] = quality + audio_url_data = self._download_json( + self._BASE_URL + 'getaudiourl', audio_id, + 'Downloading %s format JSON metadata' % quality, + fatal=False, query=query) or {} + audio_url = audio_url_data.get('audioUrl') + if not audio_url or audio_url in urls: + continue + urls.append(audio_url) + ext = determine_ext(audio_url) + coding_format = audio_url_data.get('codingFormat') + abr = int_or_none(self._search_regex( + r'_a(\d+)\.m4a', audio_url, 'audio bitrate', + default=None)) or self._CODING_FORMAT_TO_ABR_MAP.get(coding_format) + formats.append({ + 'abr': abr, + 'acodec': self._EXT_TO_CODEC_MAP.get(ext), + 'ext': ext, + 'format_id': str_or_none(coding_format), + 'vcodec': 'none', + 'url': audio_url, + }) + + return { + 'id': audio_id, + 'formats': formats, + **traverse_obj(item, { + 'title': 'subtitle', + 'series': 'title', + 'duration': ('duration', {int_or_none}), + 'thumbnail': ('displayimageurl', {url_or_none}), + 'description': 'description', + }), + } + + +class SverigesRadioPublicationIE(SverigesRadioBaseIE): + IE_NAME = 'sverigesradio:publication' + _VALID_URL = r'https?://(?:www\.)?sverigesradio\.se/(?:sida/)?(?:artikel|gruppsida)(?:\.aspx\?.*?\bartikel=(?P<id>[0-9]+)|/(?P<slug>[\w-]+))' + _TESTS = [{ + 'url': 'https://sverigesradio.se/sida/artikel.aspx?programid=83&artikel=7038546', + 'md5': '6a4917e1923fccb080e5a206a5afa542', + 'info_dict': { + 'id': '7038546', + 'ext': 'm4a', + 'duration': 132, + 'series': 'Nyheter (Ekot)', + 'title': 'Esa Teittinen: Sanningen har inte kommit fram', + 'description': 'md5:daf7ce66a8f0a53d5465a5984d3839df', + 'thumbnail': r're:^https?://.*\.jpg', + }, + }, { + 'url': 'https://sverigesradio.se/artikel/tysk-fotbollsfeber-bayern-munchens-10-ariga-segersvit-kan-brytas', + 'md5': 'f8a914ad50f491bb74eed403ab4bfef6', + 'info_dict': { + 'id': '8360345', + 'ext': 'm4a', + 'title': 'Tysk fotbollsfeber när Bayern Münchens 10-Ã¥riga segersvit kan brytas', + 'series': 'Radiosporten', + 'description': 'md5:5254610e20ce527ecb3a6102a06dcc5f', + 'duration': 72, + 'thumbnail': r're:^https?://.*\.jpg', + }, + }, { + 'url': 'https://sverigesradio.se/sida/gruppsida.aspx?programid=3304&grupp=6247&artikel=7146887', + 'only_matching': True, + }] + _AUDIO_TYPE = 'publication' + + +class SverigesRadioEpisodeIE(SverigesRadioBaseIE): + IE_NAME = 'sverigesradio:episode' + _VALID_URL = r'https?://(?:www\.)?sverigesradio\.se/(?:sida/)?avsnitt/(?:(?P<id>\d+)|(?P<slug>[\w-]+))(?:$|[#?])' + _TESTS = [{ + 'url': 'https://sverigesradio.se/avsnitt/1140922?programid=1300', + 'md5': '20dc4d8db24228f846be390b0c59a07c', + 'info_dict': { + 'id': '1140922', + 'ext': 'mp3', + 'duration': 3307, + 'series': 'Konflikt', + 'title': 'Metoo och valen', + 'description': 'md5:fcb5c1f667f00badcc702b196f10a27e', + 'thumbnail': r're:^https?://.*\.jpg', + }, + }, { + 'url': 'https://sverigesradio.se/avsnitt/p4-live-med-first-aid-kit-scandinavium-mars-2023', + 'md5': 'ce17fb82520a8033dbb846993d5589fe', + 'info_dict': { + 'id': '2160416', + 'ext': 'm4a', + 'title': 'P4 Live med First Aid Kit', + 'description': 'md5:6d5b78eed3d2b65f6de04daa45e9285d', + 'thumbnail': r're:^https?://.*\.jpg', + 'series': 'P4 Live', + 'duration': 5640, + }, + }] + _AUDIO_TYPE = 'episode' diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/svt.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/svt.py new file mode 100644 index 0000000..18da875 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/svt.py @@ -0,0 +1,452 @@ +import json +import re + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + determine_ext, + dict_get, + int_or_none, + str_or_none, + strip_or_none, + traverse_obj, + try_get, + unified_timestamp, +) + + +class SVTBaseIE(InfoExtractor): + _GEO_COUNTRIES = ['SE'] + + def _extract_video(self, video_info, video_id): + is_live = dict_get(video_info, ('live', 'simulcast'), default=False) + m3u8_protocol = 'm3u8' if is_live else 'm3u8_native' + formats = [] + subtitles = {} + for vr in video_info['videoReferences']: + player_type = vr.get('playerType') or vr.get('format') + vurl = vr['url'] + ext = determine_ext(vurl) + if ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + vurl, video_id, + ext='mp4', entry_protocol=m3u8_protocol, + m3u8_id=player_type, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif ext == 'f4m': + formats.extend(self._extract_f4m_formats( + vurl + '?hdcore=3.3.0', video_id, + f4m_id=player_type, fatal=False)) + elif ext == 'mpd': + fmts, subs = self._extract_mpd_formats_and_subtitles( + vurl, video_id, mpd_id=player_type, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'format_id': player_type, + 'url': vurl, + }) + rights = try_get(video_info, lambda x: x['rights'], dict) or {} + if not formats and rights.get('geoBlockedSweden'): + self.raise_geo_restricted( + 'This video is only available in Sweden', + countries=self._GEO_COUNTRIES, metadata_available=True) + + subtitle_references = dict_get(video_info, ('subtitles', 'subtitleReferences')) + if isinstance(subtitle_references, list): + for sr in subtitle_references: + subtitle_url = sr.get('url') + subtitle_lang = sr.get('language', 'sv') + if subtitle_url: + sub = { + 'url': subtitle_url, + } + if determine_ext(subtitle_url) == 'm3u8': + # XXX: no way of testing, is it ever hit? + sub['ext'] = 'vtt' + subtitles.setdefault(subtitle_lang, []).append(sub) + + title = video_info.get('title') + + series = video_info.get('programTitle') + season_number = int_or_none(video_info.get('season')) + episode = video_info.get('episodeTitle') + episode_number = int_or_none(video_info.get('episodeNumber')) + + timestamp = unified_timestamp(rights.get('validFrom')) + duration = int_or_none(dict_get(video_info, ('materialLength', 'contentDuration'))) + age_limit = None + adult = dict_get( + video_info, ('inappropriateForChildren', 'blockedForChildren'), + skip_false_values=False) + if adult is not None: + age_limit = 18 if adult else 0 + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'subtitles': subtitles, + 'duration': duration, + 'timestamp': timestamp, + 'age_limit': age_limit, + 'series': series, + 'season_number': season_number, + 'episode': episode, + 'episode_number': episode_number, + 'is_live': is_live, + } + + +class SVTIE(SVTBaseIE): + _VALID_URL = r'https?://(?:www\.)?svt\.se/wd\?(?:.*?&)?widgetId=(?P<widget_id>\d+)&.*?\barticleId=(?P<id>\d+)' + _EMBED_REGEX = [r'(?:<iframe src|href)="(?P<url>%s[^"]*)"' % _VALID_URL] + _TEST = { + 'url': 'http://www.svt.se/wd?widgetId=23991§ionId=541&articleId=2900353&type=embed&contextSectionId=123&autostart=false', + 'md5': '33e9a5d8f646523ce0868ecfb0eed77d', + 'info_dict': { + 'id': '2900353', + 'ext': 'mp4', + 'title': 'Stjärnorna skojar till det - under SVT-intervjun', + 'duration': 27, + 'age_limit': 0, + }, + } + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + widget_id = mobj.group('widget_id') + article_id = mobj.group('id') + + info = self._download_json( + 'http://www.svt.se/wd?widgetId=%s&articleId=%s&format=json&type=embed&output=json' % (widget_id, article_id), + article_id) + + info_dict = self._extract_video(info['video'], article_id) + info_dict['title'] = info['context']['title'] + return info_dict + + +class SVTPlayBaseIE(SVTBaseIE): + _SVTPLAY_RE = r'root\s*\[\s*(["\'])_*svtplay\1\s*\]\s*=\s*(?P<json>{.+?})\s*;\s*\n' + + +class SVTPlayIE(SVTPlayBaseIE): + IE_DESC = 'SVT Play and Öppet arkiv' + _VALID_URL = r'''(?x) + (?: + (?: + svt:| + https?://(?:www\.)?svt\.se/barnkanalen/barnplay/[^/]+/ + ) + (?P<svt_id>[^/?#&]+)| + https?://(?:www\.)?(?:svtplay|oppetarkiv)\.se/(?:video|klipp|kanaler)/(?P<id>[^/?#&]+) + (?:.*?(?:modalId|id)=(?P<modal_id>[\da-zA-Z-]+))? + ) + ''' + _TESTS = [{ + 'url': 'https://www.svtplay.se/video/30479064', + 'md5': '2382036fd6f8c994856c323fe51c426e', + 'info_dict': { + 'id': '8zVbDPA', + 'ext': 'mp4', + 'title': 'Designdrömmar i Stenungsund', + 'timestamp': 1615770000, + 'upload_date': '20210315', + 'duration': 3519, + 'thumbnail': r're:^https?://(?:.*[\.-]jpg|www.svtstatic.se/image/.*)$', + 'age_limit': 0, + 'subtitles': { + 'sv': [{ + 'ext': 'vtt', + }] + }, + }, + 'params': { + 'skip_download': 'm3u8', + }, + 'skip': 'Episode is no longer available', + }, { + 'url': 'https://www.svtplay.se/video/emBxBQj', + 'md5': '2382036fd6f8c994856c323fe51c426e', + 'info_dict': { + 'id': 'eyBd9aj', + 'ext': 'mp4', + 'title': '1. Farlig kryssning', + 'timestamp': 1491019200, + 'upload_date': '20170401', + 'duration': 2566, + 'thumbnail': r're:^https?://(?:.*[\.-]jpg|www.svtstatic.se/image/.*)$', + 'age_limit': 0, + 'episode': '1. Farlig kryssning', + 'series': 'Rederiet', + 'subtitles': { + 'sv': 'count:3' + }, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + 'url': 'https://www.svtplay.se/video/jz2rYz7/anders-hansen-moter/james-fallon?info=visa', + 'info_dict': { + 'id': 'jvXAGVb', + 'ext': 'mp4', + 'title': 'James Fallon', + 'timestamp': 1673917200, + 'upload_date': '20230117', + 'duration': 1081, + 'thumbnail': r're:^https?://(?:.*[\.-]jpg|www.svtstatic.se/image/.*)$', + 'age_limit': 0, + 'episode': 'James Fallon', + 'series': 'Anders Hansen möter...', + }, + 'params': { + 'skip_download': 'dash', + }, + }, { + 'url': 'https://www.svtplay.se/video/30479064/husdrommar/husdrommar-sasong-8-designdrommar-i-stenungsund?modalId=8zVbDPA', + 'only_matching': True, + }, { + 'url': 'https://www.svtplay.se/video/30684086/rapport/rapport-24-apr-18-00-7?id=e72gVpa', + 'only_matching': True, + }, { + # geo restricted to Sweden + 'url': 'http://www.oppetarkiv.se/video/5219710/trollflojten', + 'only_matching': True, + }, { + 'url': 'http://www.svtplay.se/klipp/9023742/stopptid-om-bjorn-borg', + 'only_matching': True, + }, { + 'url': 'https://www.svtplay.se/kanaler/svt1', + 'only_matching': True, + }, { + 'url': 'svt:1376446-003A', + 'only_matching': True, + }, { + 'url': 'svt:14278044', + 'only_matching': True, + }, { + 'url': 'https://www.svt.se/barnkanalen/barnplay/kar/eWv5MLX/', + 'only_matching': True, + }, { + 'url': 'svt:eWv5MLX', + 'only_matching': True, + }] + + def _extract_by_video_id(self, video_id, webpage=None): + data = self._download_json( + 'https://api.svt.se/videoplayer-api/video/%s' % video_id, + video_id, headers=self.geo_verification_headers()) + info_dict = self._extract_video(data, video_id) + if not info_dict.get('title'): + title = dict_get(info_dict, ('episode', 'series')) + if not title and webpage: + title = re.sub( + r'\s*\|\s*.+?$', '', self._og_search_title(webpage)) + if not title: + title = video_id + info_dict['title'] = title + return info_dict + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('id') + svt_id = mobj.group('svt_id') or mobj.group('modal_id') + + if svt_id: + return self._extract_by_video_id(svt_id) + + webpage = self._download_webpage(url, video_id) + + data = self._parse_json( + self._search_regex( + self._SVTPLAY_RE, webpage, 'embedded data', default='{}', + group='json'), + video_id, fatal=False) + + thumbnail = self._og_search_thumbnail(webpage) + + if data: + video_info = try_get( + data, lambda x: x['context']['dispatcher']['stores']['VideoTitlePageStore']['data']['video'], + dict) + if video_info: + info_dict = self._extract_video(video_info, video_id) + info_dict.update({ + 'title': data['context']['dispatcher']['stores']['MetaStore']['title'], + 'thumbnail': thumbnail, + }) + return info_dict + + svt_id = try_get( + data, lambda x: x['statistics']['dataLake']['content']['id'], + compat_str) + + if not svt_id: + nextjs_data = self._search_nextjs_data(webpage, video_id, fatal=False) + svt_id = traverse_obj(nextjs_data, ( + 'props', 'urqlState', ..., 'data', {json.loads}, 'detailsPageByPath', + 'video', 'svtId', {str}), get_all=False) + + if not svt_id: + svt_id = self._search_regex( + (r'<video[^>]+data-video-id=["\']([\da-zA-Z-]+)', + r'<[^>]+\bdata-rt=["\']top-area-play-button["\'][^>]+\bhref=["\'][^"\']*video/[\w-]+/[^"\']*\b(?:modalId|id)=([\w-]+)'), + webpage, 'video id') + + info_dict = self._extract_by_video_id(svt_id, webpage) + info_dict['thumbnail'] = thumbnail + + return info_dict + + +class SVTSeriesIE(SVTPlayBaseIE): + _VALID_URL = r'https?://(?:www\.)?svtplay\.se/(?P<id>[^/?&#]+)(?:.+?\btab=(?P<season_slug>[^&#]+))?' + _TESTS = [{ + 'url': 'https://www.svtplay.se/rederiet', + 'info_dict': { + 'id': '14445680', + 'title': 'Rederiet', + 'description': 'md5:d9fdfff17f5d8f73468176ecd2836039', + }, + 'playlist_mincount': 318, + }, { + 'url': 'https://www.svtplay.se/rederiet?tab=season-2-14445680', + 'info_dict': { + 'id': 'season-2-14445680', + 'title': 'Rederiet - Säsong 2', + 'description': 'md5:d9fdfff17f5d8f73468176ecd2836039', + }, + 'playlist_mincount': 12, + }] + + @classmethod + def suitable(cls, url): + return False if SVTIE.suitable(url) or SVTPlayIE.suitable(url) else super(SVTSeriesIE, cls).suitable(url) + + def _real_extract(self, url): + series_slug, season_id = self._match_valid_url(url).groups() + + series = self._download_json( + 'https://api.svt.se/contento/graphql', series_slug, + 'Downloading series page', query={ + 'query': '''{ + listablesBySlug(slugs: ["%s"]) { + associatedContent(include: [productionPeriod, season]) { + items { + item { + ... on Episode { + videoSvtId + } + } + } + id + name + } + id + longDescription + name + shortDescription + } +}''' % series_slug, + })['data']['listablesBySlug'][0] + + season_name = None + + entries = [] + for season in series['associatedContent']: + if not isinstance(season, dict): + continue + if season_id: + if season.get('id') != season_id: + continue + season_name = season.get('name') + items = season.get('items') + if not isinstance(items, list): + continue + for item in items: + video = item.get('item') or {} + content_id = video.get('videoSvtId') + if not content_id or not isinstance(content_id, compat_str): + continue + entries.append(self.url_result( + 'svt:' + content_id, SVTPlayIE.ie_key(), content_id)) + + title = series.get('name') + season_name = season_name or season_id + + if title and season_name: + title = '%s - %s' % (title, season_name) + elif season_id: + title = season_id + + return self.playlist_result( + entries, season_id or series.get('id'), title, + dict_get(series, ('longDescription', 'shortDescription'))) + + +class SVTPageIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?svt\.se/(?P<path>(?:[^/]+/)*(?P<id>[^/?&#]+))' + _TESTS = [{ + 'url': 'https://www.svt.se/sport/ishockey/bakom-masken-lehners-kamp-mot-mental-ohalsa', + 'info_dict': { + 'id': '25298267', + 'title': 'Bakom masken – Lehners kamp mot mental ohälsa', + }, + 'playlist_count': 4, + }, { + 'url': 'https://www.svt.se/nyheter/utrikes/svenska-andrea-ar-en-mil-fran-branderna-i-kalifornien', + 'info_dict': { + 'id': '24243746', + 'title': 'Svenska Andrea redo att fly sitt hem i Kalifornien', + }, + 'playlist_count': 2, + }, { + # only programTitle + 'url': 'http://www.svt.se/sport/ishockey/jagr-tacklar-giroux-under-intervjun', + 'info_dict': { + 'id': '8439V2K', + 'ext': 'mp4', + 'title': 'Stjärnorna skojar till det - under SVT-intervjun', + 'duration': 27, + 'age_limit': 0, + }, + }, { + 'url': 'https://www.svt.se/nyheter/lokalt/vast/svt-testar-tar-nagon-upp-skrapet-1', + 'only_matching': True, + }, { + 'url': 'https://www.svt.se/vader/manadskronikor/maj2018', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if SVTIE.suitable(url) or SVTPlayIE.suitable(url) else super(SVTPageIE, cls).suitable(url) + + def _real_extract(self, url): + path, display_id = self._match_valid_url(url).groups() + + article = self._download_json( + 'https://api.svt.se/nss-api/page/' + path, display_id, + query={'q': 'articles'})['articles']['content'][0] + + entries = [] + + def _process_content(content): + if content.get('_type') in ('VIDEOCLIP', 'VIDEOEPISODE'): + video_id = compat_str(content['image']['svtId']) + entries.append(self.url_result( + 'svt:' + video_id, SVTPlayIE.ie_key(), video_id)) + + for media in article.get('media', []): + _process_content(media) + + for obj in article.get('structuredBody', []): + _process_content(obj.get('content') or {}) + + return self.playlist_result( + entries, str_or_none(article.get('id')), + strip_or_none(article.get('title'))) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/swearnet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/swearnet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/swearnet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/swearnet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/swrmediathek.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/swrmediathek.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/swrmediathek.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/swrmediathek.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/syfy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/syfy.py new file mode 100644 index 0000000..afcdbf7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/syfy.py @@ -0,0 +1,57 @@ +from .adobepass import AdobePassIE +from ..utils import ( + update_url_query, + smuggle_url, +) + + +class SyfyIE(AdobePassIE): + _VALID_URL = r'https?://(?:www\.)?syfy\.com/(?:[^/]+/)?videos/(?P<id>[^/?#]+)' + _TESTS = [{ + 'url': 'http://www.syfy.com/theinternetruinedmylife/videos/the-internet-ruined-my-life-season-1-trailer', + 'info_dict': { + 'id': '2968097', + 'ext': 'mp4', + 'title': 'The Internet Ruined My Life: Season 1 Trailer', + 'description': 'One tweet, one post, one click, can destroy everything.', + 'uploader': 'NBCU-MPAT', + 'upload_date': '20170113', + 'timestamp': 1484345640, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'add_ie': ['ThePlatform'], + 'skip': 'Redirects to main page', + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + syfy_mpx = list(self._parse_json(self._search_regex( + r'jQuery\.extend\(Drupal\.settings\s*,\s*({.+?})\);', webpage, 'drupal settings'), + display_id)['syfy']['syfy_mpx'].values())[0] + video_id = syfy_mpx['mpxGUID'] + title = syfy_mpx['episodeTitle'] + query = { + 'mbr': 'true', + 'manifest': 'm3u', + } + if syfy_mpx.get('entitlement') == 'auth': + resource = self._get_mvpd_resource( + 'syfy', title, video_id, + syfy_mpx.get('mpxRating', 'TV-14')) + query['auth'] = self._extract_mvpd_auth( + url, video_id, 'syfy', resource) + + return { + '_type': 'url_transparent', + 'ie_key': 'ThePlatform', + 'url': smuggle_url(update_url_query( + self._proto_relative_url(syfy_mpx['releaseURL']), query), + {'force_smil_url': True}), + 'title': title, + 'id': video_id, + 'display_id': display_id, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/syvdk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/syvdk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/syvdk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/syvdk.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/sztvhu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/sztvhu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/sztvhu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/sztvhu.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tagesschau.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tagesschau.py new file mode 100644 index 0000000..e23b490 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tagesschau.py @@ -0,0 +1,163 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + UnsupportedError, + extract_attributes, + int_or_none, + js_to_json, + parse_iso8601, + try_get, +) + + +class TagesschauIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tagesschau\.de/(?P<path>[^/]+/(?:[^/]+/)*?(?P<id>[^/#?]+?(?:-?[0-9]+)?))(?:~_?[^/#?]+?)?\.html' + + _TESTS = [{ + 'url': 'http://www.tagesschau.de/multimedia/video/video-102143.html', + 'md5': 'ccb9359bf8c4795836e43759f3408a93', + 'info_dict': { + 'id': 'video-102143-1', + 'ext': 'mp4', + 'title': 'Regierungsumbildung in Athen: Neue Minister in Griechenland vereidigt', + 'duration': 138, + }, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/ts-5727.html', + 'md5': '5c15e8f3da049e48829ec9786d835536', + 'info_dict': { + 'id': 'ts-5727-1', + 'ext': 'mp4', + 'title': 'Ganze Sendung', + 'duration': 932, + }, + }, { + # exclusive audio + 'url': 'http://www.tagesschau.de/multimedia/audio/audio-29417.html', + 'md5': '4bff8f23504df56a0d86ed312d654182', + 'info_dict': { + 'id': 'audio-29417-1', + 'ext': 'mp3', + 'title': 'EU-Gipfel: Im Verbrennerstreit hat Deutschland maximalen Schaden angerichtet', + }, + }, { + 'url': 'http://www.tagesschau.de/inland/bnd-303.html', + 'md5': 'f049fa1698d7564e9ca4c3325108f034', + 'info_dict': { + 'id': 'bnd-303-1', + 'ext': 'mp3', + 'title': 'Das Siegel des Bundesnachrichtendienstes | dpa', + }, + }, { + 'url': 'http://www.tagesschau.de/inland/afd-parteitag-135.html', + 'info_dict': { + 'id': 'afd-parteitag-135', + 'title': 'AfD', + }, + 'playlist_mincount': 15, + }, { + 'url': 'https://www.tagesschau.de/multimedia/audio/audio-29417~player.html', + 'info_dict': { + 'id': 'audio-29417-1', + 'ext': 'mp3', + 'title': 'EU-Gipfel: Im Verbrennerstreit hat Deutschland maximalen Schaden angerichtet', + }, + }, { + 'url': 'https://www.tagesschau.de/multimedia/audio/podcast-11km-327.html', + 'info_dict': { + 'id': 'podcast-11km-327', + 'ext': 'mp3', + 'title': 'Gewalt in der Kita – Wenn Erzieher:innen schweigen', + 'upload_date': '20230322', + 'timestamp': 1679482808, + 'thumbnail': 'https://www.tagesschau.de/multimedia/audio/podcast-11km-329~_v-original.jpg', + 'description': 'md5:dad059931fe4b3693e3656e93a249848', + }, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/tsg-3771.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/tt-3827.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/nm-3475.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/weltspiegel-3167.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/tsvorzwanzig-959.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/sendung/bab/bab-3299~_bab-sendung-209.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/multimedia/video/video-102303~_bab-sendung-211.html', + 'only_matching': True, + }, { + 'url': 'http://www.tagesschau.de/100sekunden/index.html', + 'only_matching': True, + }, { + # playlist article with collapsing sections + 'url': 'http://www.tagesschau.de/wirtschaft/faq-freihandelszone-eu-usa-101.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('id') or mobj.group('path') + display_id = video_id.lstrip('-') + + webpage = self._download_webpage(url, display_id) + + title = self._html_search_regex( + r'<span[^>]*class="headline"[^>]*>(.+?)</span>', + webpage, 'title', default=None) or self._og_search_title(webpage, fatal=False) + + entries = [] + videos = re.findall(r'<div[^>]+>', webpage) + num = 0 + for video in videos: + video = extract_attributes(video).get('data-config') + if not video: + continue + video = self._parse_json(video, video_id, transform_source=js_to_json, fatal=False) + video_formats = try_get(video, lambda x: x['mc']['_mediaArray'][0]['_mediaStreamArray']) + if not video_formats: + continue + num += 1 + for video_format in video_formats: + media_url = video_format.get('_stream') or '' + formats = [] + if media_url.endswith('master.m3u8'): + formats = self._extract_m3u8_formats(media_url, video_id, 'mp4', m3u8_id='hls') + elif media_url.endswith('.mp3'): + formats = [{ + 'url': media_url, + 'vcodec': 'none', + }] + if not formats: + continue + entries.append({ + 'id': '%s-%d' % (display_id, num), + 'title': try_get(video, lambda x: x['mc']['_title']), + 'duration': int_or_none(try_get(video, lambda x: x['mc']['_duration'])), + 'formats': formats + }) + + if not entries: + raise UnsupportedError(url) + + if len(entries) > 1: + return self.playlist_result(entries, display_id, title) + + return { + 'id': display_id, + 'title': title, + 'thumbnail': self._og_search_thumbnail(webpage), + 'formats': entries[0]['formats'], + 'timestamp': parse_iso8601(self._html_search_meta('date', webpage)), + 'description': self._og_search_description(webpage), + 'duration': entries[0]['duration'], + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tass.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tass.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tass.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tass.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tbs.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tbs.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tbs.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tbs.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tbsjp.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tbsjp.py new file mode 100644 index 0000000..77ddeca --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tbsjp.py @@ -0,0 +1,152 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + clean_html, + get_element_text_and_html_by_tag, + int_or_none, + str_or_none, + traverse_obj, + try_call, + unified_timestamp, + urljoin, +) + + +class TBSJPEpisodeIE(InfoExtractor): + _VALID_URL = r'https?://cu\.tbs\.co\.jp/episode/(?P<id>[\d_]+)' + _GEO_BYPASS = False + _TESTS = [{ + 'url': 'https://cu.tbs.co.jp/episode/23613_2044134_1000049010', + 'skip': 'streams geo-restricted, Japan only. Also, will likely expire eventually', + 'info_dict': { + 'title': 'VIVANT 第三話 誤é€é‡‘完çµã¸!絶体絶命ã®å撃開始', + 'id': '23613_2044134_1000049010', + 'ext': 'mp4', + 'upload_date': '20230728', + 'duration': 3517, + 'release_timestamp': 1691118230, + 'episode': '第三話 誤é€é‡‘完çµã¸!絶体絶命ã®å撃開始', + 'release_date': '20230804', + 'categories': 'count:11', + 'episode_number': 3, + 'timestamp': 1690522538, + 'description': 'md5:2b796341af1ef772034133174ba4a895', + 'series': 'VIVANT', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + meta = self._search_json(r'window\.app\s*=', webpage, 'episode info', video_id, fatal=False) + episode = traverse_obj(meta, ('falcorCache', 'catalog', 'episode', video_id, 'value')) + + tf_path = self._search_regex( + r'<script[^>]+src=["\'](/assets/tf\.[^"\']+\.js)["\']', webpage, 'stream API config') + tf_js = self._download_webpage(urljoin(url, tf_path), video_id, note='Downloading stream API config') + video_url = self._search_regex(r'videoPlaybackUrl:\s*[\'"]([^\'"]+)[\'"]', tf_js, 'stream API url') + api_key = self._search_regex(r'api_key:\s*[\'"]([^\'"]+)[\'"]', tf_js, 'stream API key') + + try: + source_meta = self._download_json(f'{video_url}ref:{video_id}', video_id, + headers={'X-Streaks-Api-Key': api_key}, + note='Downloading stream metadata') + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + self.raise_geo_restricted(countries=['JP']) + raise + + formats, subtitles = [], {} + for src in traverse_obj(source_meta, ('sources', ..., 'src')): + fmts, subs = self._extract_m3u8_formats_and_subtitles(src, video_id, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + return { + 'title': try_call(lambda: clean_html(get_element_text_and_html_by_tag('h3', webpage)[0])), + 'id': video_id, + **traverse_obj(episode, { + 'categories': ('keywords', {list}), + 'id': ('content_id', {str}), + 'description': ('description', 0, 'value'), + 'timestamp': ('created_at', {unified_timestamp}), + 'release_timestamp': ('pub_date', {unified_timestamp}), + 'duration': ('tv_episode_info', 'duration', {int_or_none}), + 'episode_number': ('tv_episode_info', 'episode_number', {int_or_none}), + 'episode': ('title', lambda _, v: not v.get('is_phonetic'), 'value'), + 'series': ('custom_data', 'program_name'), + }, get_all=False), + 'formats': formats, + 'subtitles': subtitles, + } + + +class TBSJPProgramIE(InfoExtractor): + _VALID_URL = r'https?://cu\.tbs\.co\.jp/program/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://cu.tbs.co.jp/program/23601', + 'playlist_mincount': 4, + 'info_dict': { + 'id': '23601', + 'categories': ['エンタメ', 'ミライカプセル', '会社', 'åƒã', 'ãƒãƒ©ã‚¨ãƒ†ã‚£', 'å‹•ç”»'], + 'description': '幼少期ã®å¤¢ã¯å¤§äººã«ãªã£ã¦ã€ã©ã†æˆé•·ã—ãŸã®ã ã‚ã†ã‹ï¼Ÿ\nãã—ã¦ãã®å¤¢ã¯ä»Šå¾Œã€ã©ã®ã‚ˆã†ã«åºƒãŒã£ã¦ã„ãã®ã‹ï¼Ÿ\nã„ã¾è©±é¡Œã®ä¼šç¤¾ã§åƒã人ã®ã€Œå¤¢ã®æˆé•·ã€ã‚’æã', + 'series': 'ミライカプセル -I have a dream-', + 'title': 'ミライカプセル -I have a dream-' + } + }] + + def _real_extract(self, url): + programme_id = self._match_id(url) + webpage = self._download_webpage(url, programme_id) + meta = self._search_json(r'window\.app\s*=', webpage, 'programme info', programme_id) + + programme = traverse_obj(meta, ('falcorCache', 'catalog', 'program', programme_id, 'false', 'value')) + + return { + '_type': 'playlist', + 'entries': [self.url_result(f'https://cu.tbs.co.jp/episode/{video_id}', TBSJPEpisodeIE, video_id) + for video_id in traverse_obj(programme, ('custom_data', 'seriesList', 'episodeCode', ...))], + 'id': programme_id, + **traverse_obj(programme, { + 'categories': ('keywords', ...), + 'id': ('tv_episode_info', 'show_content_id', {str_or_none}), + 'description': ('custom_data', 'program_description'), + 'series': ('custom_data', 'program_name'), + 'title': ('custom_data', 'program_name'), + }), + } + + +class TBSJPPlaylistIE(InfoExtractor): + _VALID_URL = r'https?://cu\.tbs\.co\.jp/playlist/(?P<id>[\da-f]+)' + _TESTS = [{ + 'url': 'https://cu.tbs.co.jp/playlist/184f9970e7ba48e4915f1b252c55015e', + 'playlist_mincount': 4, + 'info_dict': { + 'title': 'ã¾ã‚‚ãªãé…信終了', + 'id': '184f9970e7ba48e4915f1b252c55015e', + } + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + page = self._download_webpage(url, playlist_id) + meta = self._search_json(r'window\.app\s*=', page, 'playlist info', playlist_id) + playlist = traverse_obj(meta, ('falcorCache', 'playList', playlist_id)) + + def entries(): + for entry in traverse_obj(playlist, ('catalogs', 'value', lambda _, v: v['content_id'])): + # TODO: it's likely possible to get all metadata from the playlist page json instead + content_id = entry['content_id'] + content_type = entry.get('content_type') + if content_type == 'tv_show': + yield self.url_result( + f'https://cu.tbs.co.jp/program/{content_id}', TBSJPProgramIE, content_id) + elif content_type == 'tv_episode': + yield self.url_result( + f'https://cu.tbs.co.jp/episode/{content_id}', TBSJPEpisodeIE, content_id) + else: + self.report_warning(f'Skipping "{content_id}" with unsupported content_type "{content_type}"') + + return self.playlist_result(entries(), playlist_id, traverse_obj(playlist, ('display_name', 'value'))) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tdslifeway.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tdslifeway.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tdslifeway.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tdslifeway.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/teachable.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teachable.py new file mode 100644 index 0000000..01906bd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/teachable.py @@ -0,0 +1,295 @@ +import re + +from .common import InfoExtractor +from .wistia import WistiaIE +from ..utils import ( + clean_html, + ExtractorError, + int_or_none, + get_element_by_class, + strip_or_none, + urlencode_postdata, + urljoin, +) + + +class TeachableBaseIE(InfoExtractor): + _NETRC_MACHINE = 'teachable' + _URL_PREFIX = 'teachable:' + + _SITES = { + # Only notable ones here + 'v1.upskillcourses.com': 'upskill', + 'gns3.teachable.com': 'gns3', + 'academyhacker.com': 'academyhacker', + 'stackskills.com': 'stackskills', + 'market.saleshacker.com': 'saleshacker', + 'learnability.org': 'learnability', + 'edurila.com': 'edurila', + 'courses.workitdaily.com': 'workitdaily', + } + + _VALID_URL_SUB_TUPLE = (_URL_PREFIX, '|'.join(re.escape(site) for site in _SITES.keys())) + + def _real_initialize(self): + self._logged_in = False + + def _login(self, site): + if self._logged_in: + return + + username, password = self._get_login_info(netrc_machine=self._SITES.get(site, site)) + if username is None: + return + + login_page, urlh = self._download_webpage_handle( + 'https://%s/sign_in' % site, None, + 'Downloading %s login page' % site) + + def is_logged(webpage): + return any(re.search(p, webpage) for p in ( + r'class=["\']user-signout', + r'<a[^>]+\bhref=["\']/sign_out', + r'Log\s+[Oo]ut\s*<')) + + if is_logged(login_page): + self._logged_in = True + return + + login_url = urlh.url + + login_form = self._hidden_inputs(login_page) + + login_form.update({ + 'user[email]': username, + 'user[password]': password, + }) + + post_url = self._search_regex( + r'<form[^>]+action=(["\'])(?P<url>(?:(?!\1).)+)\1', login_page, + 'post url', default=login_url, group='url') + + if not post_url.startswith('http'): + post_url = urljoin(login_url, post_url) + + response = self._download_webpage( + post_url, None, 'Logging in to %s' % site, + data=urlencode_postdata(login_form), + headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Referer': login_url, + }) + + if '>I accept the new Privacy Policy<' in response: + raise ExtractorError( + 'Unable to login: %s asks you to accept new Privacy Policy. ' + 'Go to https://%s/ and accept.' % (site, site), expected=True) + + # Successful login + if is_logged(response): + self._logged_in = True + return + + message = get_element_by_class('alert', response) + if message is not None: + raise ExtractorError( + 'Unable to login: %s' % clean_html(message), expected=True) + + raise ExtractorError('Unable to log in') + + +class TeachableIE(TeachableBaseIE): + _VALID_URL = r'''(?x) + (?: + %shttps?://(?P<site_t>[^/]+)| + https?://(?:www\.)?(?P<site>%s) + ) + /courses/[^/]+/lectures/(?P<id>\d+) + ''' % TeachableBaseIE._VALID_URL_SUB_TUPLE + + _TESTS = [{ + 'url': 'https://gns3.teachable.com/courses/gns3-certified-associate/lectures/6842364', + 'info_dict': { + 'id': 'untlgzk1v7', + 'ext': 'bin', + 'title': 'Overview', + 'description': 'md5:071463ff08b86c208811130ea1c2464c', + 'duration': 736.4, + 'timestamp': 1542315762, + 'upload_date': '20181115', + 'chapter': 'Welcome', + 'chapter_number': 1, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'http://v1.upskillcourses.com/courses/119763/lectures/1747100', + 'only_matching': True, + }, { + 'url': 'https://gns3.teachable.com/courses/423415/lectures/6885939', + 'only_matching': True, + }, { + 'url': 'teachable:https://v1.upskillcourses.com/courses/essential-web-developer-course/lectures/1747100', + 'only_matching': True, + }] + + @staticmethod + def _is_teachable(webpage): + return 'teachableTracker.linker:autoLink' in webpage and re.search( + r'<link[^>]+href=["\']https?://(?:process\.fs|assets)\.teachablecdn\.com', + webpage) + + @classmethod + def _extract_embed_urls(cls, url, webpage): + if cls._is_teachable(webpage): + if re.match(r'https?://[^/]+/(?:courses|p)', url): + yield f'{cls._URL_PREFIX}{url}' + raise cls.StopExtraction() + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + site = mobj.group('site') or mobj.group('site_t') + video_id = mobj.group('id') + + self._login(site) + + prefixed = url.startswith(self._URL_PREFIX) + if prefixed: + url = url[len(self._URL_PREFIX):] + + webpage = self._download_webpage(url, video_id) + + wistia_urls = WistiaIE._extract_embed_urls(url, webpage) + if not wistia_urls: + if any(re.search(p, webpage) for p in ( + r'class=["\']lecture-contents-locked', + r'>\s*Lecture contents locked', + r'id=["\']lecture-locked', + # https://academy.tailoredtutors.co.uk/courses/108779/lectures/1955313 + r'class=["\'](?:inner-)?lesson-locked', + r'>LESSON LOCKED<')): + self.raise_login_required('Lecture contents locked') + raise ExtractorError('Unable to find video URL') + + title = self._og_search_title(webpage, default=None) + + chapter = None + chapter_number = None + section_item = self._search_regex( + r'(?s)(?P<li><li[^>]+\bdata-lecture-id=["\']%s[^>]+>.+?</li>)' % video_id, + webpage, 'section item', default=None, group='li') + if section_item: + chapter_number = int_or_none(self._search_regex( + r'data-ss-position=["\'](\d+)', section_item, 'section id', + default=None)) + if chapter_number is not None: + sections = [] + for s in re.findall( + r'(?s)<div[^>]+\bclass=["\']section-title[^>]+>(.+?)</div>', webpage): + section = strip_or_none(clean_html(s)) + if not section: + sections = [] + break + sections.append(section) + if chapter_number <= len(sections): + chapter = sections[chapter_number - 1] + + entries = [{ + '_type': 'url_transparent', + 'url': wistia_url, + 'ie_key': WistiaIE.ie_key(), + 'title': title, + 'chapter': chapter, + 'chapter_number': chapter_number, + } for wistia_url in wistia_urls] + + return self.playlist_result(entries, video_id, title) + + +class TeachableCourseIE(TeachableBaseIE): + _VALID_URL = r'''(?x) + (?: + %shttps?://(?P<site_t>[^/]+)| + https?://(?:www\.)?(?P<site>%s) + ) + /(?:courses|p)/(?:enrolled/)?(?P<id>[^/?#&]+) + ''' % TeachableBaseIE._VALID_URL_SUB_TUPLE + _TESTS = [{ + 'url': 'http://v1.upskillcourses.com/courses/essential-web-developer-course/', + 'info_dict': { + 'id': 'essential-web-developer-course', + 'title': 'The Essential Web Developer Course (Free)', + }, + 'playlist_count': 192, + }, { + 'url': 'http://v1.upskillcourses.com/courses/119763/', + 'only_matching': True, + }, { + 'url': 'http://v1.upskillcourses.com/courses/enrolled/119763', + 'only_matching': True, + }, { + 'url': 'https://gns3.teachable.com/courses/enrolled/423415', + 'only_matching': True, + }, { + 'url': 'teachable:https://learn.vrdev.school/p/gear-vr-developer-mini', + 'only_matching': True, + }, { + 'url': 'teachable:https://filmsimplified.com/p/davinci-resolve-15-crash-course', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if TeachableIE.suitable(url) else super( + TeachableCourseIE, cls).suitable(url) + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + site = mobj.group('site') or mobj.group('site_t') + course_id = mobj.group('id') + + self._login(site) + + prefixed = url.startswith(self._URL_PREFIX) + if prefixed: + prefix = self._URL_PREFIX + url = url[len(prefix):] + + webpage = self._download_webpage(url, course_id) + + url_base = 'https://%s/' % site + + entries = [] + + for mobj in re.finditer( + r'(?s)(?P<li><li[^>]+class=(["\'])(?:(?!\2).)*?section-item[^>]+>.+?</li>)', + webpage): + li = mobj.group('li') + if 'fa-youtube-play' not in li and not re.search(r'\d{1,2}:\d{2}', li): + continue + lecture_url = self._search_regex( + r'<a[^>]+href=(["\'])(?P<url>(?:(?!\1).)+)\1', li, + 'lecture url', default=None, group='url') + if not lecture_url: + continue + lecture_id = self._search_regex( + r'/lectures/(\d+)', lecture_url, 'lecture id', default=None) + title = self._html_search_regex( + r'<span[^>]+class=["\']lecture-name[^>]+>([^<]+)', li, + 'title', default=None) + entry_url = urljoin(url_base, lecture_url) + if prefixed: + entry_url = self._URL_PREFIX + entry_url + entries.append( + self.url_result( + entry_url, + ie=TeachableIE.ie_key(), video_id=lecture_id, + video_title=clean_html(title))) + + course_title = self._html_search_regex( + (r'(?s)<img[^>]+class=["\']course-image[^>]+>\s*<h\d>(.+?)</h', + r'(?s)<h\d[^>]+class=["\']course-title[^>]+>(.+?)</h'), + webpage, 'course title', fatal=False) + + return self.playlist_result(entries, course_id, course_title) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/teachertube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teachertube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/teachertube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/teachertube.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/teachingchannel.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teachingchannel.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/teachingchannel.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/teachingchannel.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/teamcoco.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teamcoco.py new file mode 100644 index 0000000..d32f812 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/teamcoco.py @@ -0,0 +1,280 @@ +import json +import re + +from .turner import TurnerBaseIE +from ..utils import ( + ExtractorError, + clean_html, + determine_ext, + make_archive_id, + merge_dicts, + mimetype2ext, + parse_duration, + parse_qs, + traverse_obj, + unified_timestamp, + urljoin, + url_or_none, +) + + +class TeamcocoBaseIE(TurnerBaseIE): + _QUALITIES = { + 'low': (480, 272), + 'sd': (640, 360), + 'hd': (1280, 720), + 'uhd': (1920, 1080), + } + + def _get_formats_and_subtitles(self, info, video_id): + formats, subtitles = [], {} + + for src in traverse_obj(info, ('src', ..., {dict})): + format_id = src.get('label') + src_url = src.get('src') + if re.match(r'https?:/[^/]', src_url): + src_url = src_url.replace(':/', '://', 1) + ext = determine_ext(src_url, mimetype2ext(src.get('type'))) + + if not format_id or not src_url: + continue + elif format_id == 'hls' or ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + src_url, video_id, 'mp4', m3u8_id=format_id, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + elif format_id in self._QUALITIES: + if src_url.startswith('/mp4:protected/'): + # TODO: Correct extraction for these files + continue + formats.append({ + 'url': src_url, + 'ext': ext, + 'format_id': format_id, + 'width': self._QUALITIES[format_id][0], + 'height': self._QUALITIES[format_id][1], + }) + + return formats, subtitles + + +class TeamcocoIE(TeamcocoBaseIE): + _VALID_URL = r'https?://(?:www\.)?teamcoco\.com/(?P<id>([^/]+/)*[^/?#]+)' + _TESTS = [ + { + 'url': 'http://teamcoco.com/video/mary-kay-remote', + 'info_dict': { + 'id': '80187', + 'display_id': 'video_mary-kay-remote', + 'ext': 'mp4', + 'title': 'Conan Becomes A Mary Kay Beauty Consultant', + 'description': 'md5:9fb64e45b5aef6b2af1b67612b36c162', + 'thumbnail': 'https://teamcoco.com/image/thumb?id=80187', + 'upload_date': '20140402', + 'timestamp': 1396440000, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + 'url': 'http://teamcoco.com/video/louis-ck-interview-george-w-bush', + 'info_dict': { + 'id': '19705', + 'display_id': 'video_louis-ck-interview-george-w-bush', + 'ext': 'mp4', + 'title': 'Louis C.K. Interview Pt. 1 11/3/11', + 'description': 'Louis C.K. got starstruck by George W. Bush, so what? Part one.', + 'thumbnail': 'https://teamcoco.com/image/thumb?id=19705', + 'upload_date': '20111104', + 'timestamp': 1320408000, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + 'url': 'http://teamcoco.com/video/timothy-olyphant-drinking-whiskey', + 'info_dict': { + 'id': '88748', + 'display_id': 'video_timothy-olyphant-drinking-whiskey', + 'ext': 'mp4', + 'title': 'Timothy Olyphant Raises A Toast To “Justifiedâ€', + 'description': 'md5:15501f23f020e793aeca761205e42c24', + 'upload_date': '20150415', + 'timestamp': 1429099200, + 'thumbnail': 'https://teamcoco.com/image/thumb?id=88748', + }, + }, { + 'url': 'http://teamcoco.com/video/full-episode-mon-6-1-joel-mchale-jake-tapper-and-musical-guest-courtney-barnett?playlist=x;eyJ0eXBlIjoidGFnIiwiaWQiOjl9', + 'info_dict': { + 'id': '89341', + 'ext': 'mp4', + 'title': 'Full Episode - Mon. 6/1 - Joel McHale, Jake Tapper, And Musical Guest Courtney Barnett', + 'description': 'Guests: Joel McHale, Jake Tapper, And Musical Guest Courtney Barnett', + }, + 'skip': 'This video is no longer available.', + }, { + 'url': 'http://teamcoco.com/video/the-conan-audiencey-awards-for-04/25/18', + 'only_matching': True, + }, { + 'url': 'http://teamcoco.com/italy/conan-jordan-schlansky-hit-the-streets-of-florence', + 'only_matching': True, + }, { + 'url': 'http://teamcoco.com/haiti/conan-s-haitian-history-lesson', + 'only_matching': True, + }, { + 'url': 'http://teamcoco.com/israel/conan-hits-the-streets-beaches-of-tel-aviv', + 'only_matching': True, + }, + ] + + def _real_extract(self, url): + display_id = self._match_id(url).replace('/', '_') + webpage = self._download_webpage(url, display_id) + data = self._search_nextjs_data(webpage, display_id)['props']['pageProps']['pageData'] + info = merge_dicts(*traverse_obj(data, ( + 'blocks', lambda _, v: v['name'] in ('meta-tags', 'video-player', 'video-info'), 'props', {dict}))) + + thumbnail = traverse_obj( + info, (('image', 'poster'), {lambda x: urljoin('https://teamcoco.com/', x)}), get_all=False) + video_id = traverse_obj(parse_qs(thumbnail), ('id', 0)) or display_id + + formats, subtitles = self._get_formats_and_subtitles(info, video_id) + + return { + 'id': video_id, + 'display_id': display_id, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnail': thumbnail, + **traverse_obj(info, { + 'title': 'title', + 'description': (('descriptionHtml', 'description'), {clean_html}), + 'timestamp': ('publishedOn', {lambda x: f'{x} 12:00AM'}, {unified_timestamp}), + }, get_all=False), + } + + +class ConanClassicIE(TeamcocoBaseIE): + _VALID_URL = r'https?://(?:(?:www\.)?conanclassic|conan25\.teamcoco)\.com/(?P<id>([^/]+/)*[^/?#]+)' + _TESTS = [{ + 'url': 'https://conanclassic.com/video/ice-cube-kevin-hart-conan-share-lyft', + 'info_dict': { + 'id': '74709', + 'ext': 'mp4', + 'title': 'Ice Cube, Kevin Hart, & Conan Share A Lyft Car', + 'display_id': 'video/ice-cube-kevin-hart-conan-share-lyft', + 'description': 'The stars of "Ride Along" teach Conan how to roll around Hollywood.', + 'thumbnail': 'http://cdn.teamcococdn.com/image/640x360/lyft-5bd75f82b616c.png', + 'duration': 570.0, + 'upload_date': '20131211', + 'timestamp': 1386721620, + '_old_archive_ids': ['teamcoco 74709'], + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://conan25.teamcoco.com/video/ice-cube-kevin-hart-conan-share-lyft', + 'only_matching': True, + }] + + _GRAPHQL_QUERY = '''query find($id: ID!) { + findRecord(id: $id) { + +... on MetaInterface { + id + title + teaser + publishOn + slug + thumb { + +... on FileInterface { + id + path + preview + mime +} + + } +} + +... on Video { + videoType + duration + isLive + youtubeId + turnerMediaId + turnerMediaAuthToken + airDate +} + +... on Episode { + airDate + seasonNumber + episodeNumber + guestNames +} + + } + findRecordVideoMetadata(id: $id) { + turnerMediaId + turnerMediaAuthToken + duration + src + } +}''' + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + data = self._search_nextjs_data(webpage, display_id)['props']['pageProps']['pageData'] + video_id = traverse_obj( + data, ('blocks', ..., 'props', 'fieldDefs', lambda _, v: v['name'] == 'incomingVideoId', 'value'), + ('blocks', ..., 'props', 'fields', 'incomingVideoRecord', 'id'), get_all=False) + if not video_id: + self.raise_no_formats('Unable to extract video ID from webpage', expected=True) + + response = self._download_json( + 'https://conanclassic.com/api/legacy/graphql', video_id, data=json.dumps({ + 'query': self._GRAPHQL_QUERY, + 'variables': {'id': video_id}, + }, separators=(',', ':')).encode(), headers={ + 'Content-Type': 'application/json', + }) + + info = traverse_obj(response, ('data', 'findRecord', { + 'title': 'title', + 'description': 'teaser', + 'thumbnail': ('thumb', 'preview', {url_or_none}), + 'duration': ('duration', {parse_duration}), + 'timestamp': ('publishOn', {unified_timestamp}), + })) + + media_id = traverse_obj( + response, ('data', ('findRecord', 'findRecordVideoMetadata'), 'turnerMediaId'), get_all=False) + if media_id: + token = traverse_obj( + response, ('data', ('findRecord', 'findRecordVideoMetadata'), 'turnerMediaAuthToken'), get_all=False) + if not token: + raise ExtractorError('No Turner Media auth token found in API response') + self._initialize_geo_bypass({ + 'countries': ['US'], + }) + info.update(self._extract_ngtv_info(media_id, { + 'accessToken': token, + 'accessTokenType': 'jws', + })) + else: + formats, subtitles = self._get_formats_and_subtitles( + traverse_obj(response, ('data', 'findRecordVideoMetadata')), video_id) + info.update({ + 'formats': formats, + 'subtitles': subtitles, + }) + + return { + 'id': video_id, + 'display_id': display_id, + '_old_archive_ids': [make_archive_id('Teamcoco', video_id)], + **info, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/teamtreehouse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teamtreehouse.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/teamtreehouse.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/teamtreehouse.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/techtalks.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/techtalks.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/techtalks.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/techtalks.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ted.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ted.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ted.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ted.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tele13.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tele13.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tele13.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tele13.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tele5.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tele5.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tele5.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tele5.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telebruxelles.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telebruxelles.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telebruxelles.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telebruxelles.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/telecaribe.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telecaribe.py new file mode 100644 index 0000000..91118a1 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/telecaribe.py @@ -0,0 +1,91 @@ +import re + +from .common import InfoExtractor +from ..utils import traverse_obj + + +class TelecaribePlayIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?play\.telecaribe\.co/(?P<id>[\w-]+)' + _TESTS = [{ + 'url': 'https://www.play.telecaribe.co/breicok', + 'info_dict': { + 'id': 'breicok', + 'title': 'Breicok', + }, + 'playlist_count': 7, + }, { + 'url': 'https://www.play.telecaribe.co/si-fue-gol-de-yepes', + 'info_dict': { + 'id': 'si-fue-gol-de-yepes', + 'title': 'Sí Fue Gol de Yepes', + }, + 'playlist_count': 6, + }, { + 'url': 'https://www.play.telecaribe.co/ciudad-futura', + 'info_dict': { + 'id': 'ciudad-futura', + 'title': 'Ciudad Futura', + }, + 'playlist_count': 10, + }, { + 'url': 'https://www.play.telecaribe.co/live', + 'info_dict': { + 'id': 'live', + 'title': r're:^Señal en vivo', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + } + }, { + 'url': 'https://www.play.telecaribe.co/liveplus', + 'info_dict': { + 'id': 'liveplus', + 'title': r're:^Señal en vivo Plus', + 'live_status': 'is_live', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + 'skip': 'Geo-restricted to Colombia', + }] + + def _download_player_webpage(self, webpage, display_id): + page_id = self._search_regex( + (r'window\.firstPageId\s*=\s*["\']([^"\']+)', r'<div[^>]+id\s*=\s*"pageBackground_([^"]+)'), + webpage, 'page_id') + + props = self._download_json(self._search_regex( + rf'<link[^>]+href\s*=\s*"([^"]+)"[^>]+id\s*=\s*"features_{page_id}"', + webpage, 'json_props_url'), display_id)['props']['render']['compProps'] + + return self._download_webpage(traverse_obj(props, (..., 'url'))[-1], display_id) + + def _get_clean_title(self, title): + return re.sub(r'\s*\|\s*Telecaribe\s*VOD', '', title or '').strip() or None + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + player = self._download_player_webpage(webpage, display_id) + + livestream_url = self._search_regex( + r'(?:let|const|var)\s+source\s*=\s*["\']([^"\']+)', player, 'm3u8 url', default=None) + + if not livestream_url: + return self.playlist_from_matches( + re.findall(r'<a[^>]+href\s*=\s*"([^"]+\.mp4)', player), display_id, + self._get_clean_title(self._og_search_title(webpage))) + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + livestream_url, display_id, 'mp4', live=True) + + return { + 'id': display_id, + 'title': self._get_clean_title(self._og_search_title(webpage)), + 'formats': formats, + 'subtitles': subtitles, + 'is_live': True, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telecinco.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telecinco.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telecinco.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telecinco.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telegraaf.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telegraaf.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telegraaf.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telegraaf.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telegram.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telegram.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telegram.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telegram.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telemb.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telemb.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telemb.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telemb.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/telemundo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telemundo.py new file mode 100644 index 0000000..54e74a6 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/telemundo.py @@ -0,0 +1,50 @@ +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import try_get, unified_timestamp + + +class TelemundoIE(InfoExtractor): + + _VALID_URL = r'https?:\/\/(?:www\.)?telemundo\.com\/.+?video\/[^\/]+(?P<id>tmvo\d{7})' + _TESTS = [{ + 'url': 'https://www.telemundo.com/noticias/noticias-telemundo-en-la-noche/empleo/video/esta-aplicacion-gratuita-esta-ayudando-los-latinos-encontrar-trabajo-en-estados-unidos-tmvo9829325', + 'info_dict': { + 'id': 'tmvo9829325', + 'timestamp': 1621396800, + 'title': 'Esta aplicación gratuita está ayudando a los latinos a encontrar trabajo en Estados Unidos', + 'uploader': 'Telemundo', + 'uploader_id': 'NBCU_Telemundo', + 'ext': 'mp4', + 'upload_date': '20210519', + }, + 'params': { + 'skip_download': True, + } + }, { + 'url': 'https://www.telemundo.com/shows/al-rojo-vivo/empleo/video/personajes-de-times-square-piden-que-la-ciudad-de-nueva-york-los-deje-volver-trabajar-tmvo9816272', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + metadata = self._search_nextjs_data(webpage, video_id) + redirect_url = try_get( + metadata, + lambda x: x['props']['initialState']['video']['associatedPlaylists'][0]['videos'][0]['videoAssets'][0]['publicUrl']) + + m3u8_url = self._request_webpage(HEADRequest( + redirect_url + '?format=redirect&manifest=m3u&format=redirect&Tracking=true&Embedded=true&formats=MPEG4'), + video_id, 'Processing m3u8').url + formats = self._extract_m3u8_formats(m3u8_url, video_id, 'mp4') + date = unified_timestamp(try_get( + metadata, lambda x: x['props']['initialState']['video']['associatedPlaylists'][0]['videos'][0]['datePublished'].split(' ', 1)[1])) + return { + 'url': url, + 'id': video_id, + 'title': self._search_regex(r'<h1[^>]+>([^<]+)', webpage, 'title', fatal=False), + 'formats': formats, + 'timestamp': date, + 'uploader': 'Telemundo', + 'uploader_id': self._search_regex(r'https?:\/\/(?:[^/]+\/){3}video\/(?P<id>[^\/]+)', m3u8_url, 'Akamai account', fatal=False) + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telequebec.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telequebec.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telequebec.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telequebec.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/teletask.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/teletask.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/teletask.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/teletask.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/telewebion.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/telewebion.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/telewebion.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/telewebion.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tempo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tempo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tempo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tempo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tencent.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tencent.py new file mode 100644 index 0000000..6618ea4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tencent.py @@ -0,0 +1,490 @@ +import functools +import random +import re +import string +import time + +from .common import InfoExtractor +from ..aes import aes_cbc_encrypt_bytes +from ..utils import ( + ExtractorError, + float_or_none, + determine_ext, + int_or_none, + js_to_json, + traverse_obj, + urljoin, +) + + +class TencentBaseIE(InfoExtractor): + """Subclasses must set _API_URL, _APP_VERSION, _PLATFORM, _HOST, _REFERER""" + + def _check_api_response(self, api_response): + msg = api_response.get('msg') + if api_response.get('code') != '0.0' and msg is not None: + if msg in ( + '您所在区域暂无此内容版æƒï¼ˆå¦‚设置VPN请关闭åŽé‡è¯•)', + 'This content is not available in your area due to copyright restrictions. Please choose other videos.' + ): + self.raise_geo_restricted() + raise ExtractorError(f'Tencent said: {msg}') + + def _get_ckey(self, video_id, url, guid): + ua = self.get_param('http_headers')['User-Agent'] + + payload = (f'{video_id}|{int(time.time())}|mg3c3b04ba|{self._APP_VERSION}|{guid}|' + f'{self._PLATFORM}|{url[:48]}|{ua.lower()[:48]}||Mozilla|Netscape|Windows x86_64|00|') + + return aes_cbc_encrypt_bytes( + bytes(f'|{sum(map(ord, payload))}|{payload}', 'utf-8'), + b'Ok\xda\xa3\x9e/\x8c\xb0\x7f^r-\x9e\xde\xf3\x14', + b'\x01PJ\xf3V\xe6\x19\xcf.B\xbb\xa6\x8c?p\xf9', + padding_mode='whitespace').hex().upper() + + def _get_video_api_response(self, video_url, video_id, series_id, subtitle_format, video_format, video_quality): + guid = ''.join(random.choices(string.digits + string.ascii_lowercase, k=16)) + ckey = self._get_ckey(video_id, video_url, guid) + query = { + 'vid': video_id, + 'cid': series_id, + 'cKey': ckey, + 'encryptVer': '8.1', + 'spcaptiontype': '1' if subtitle_format == 'vtt' else '0', + 'sphls': '2' if video_format == 'hls' else '0', + 'dtype': '3' if video_format == 'hls' else '0', + 'defn': video_quality, + 'spsrt': '2', # Enable subtitles + 'sphttps': '1', # Enable HTTPS + 'otype': 'json', + 'spwm': '1', + 'hevclv': '28', # Enable HEVC + 'drm': '40', # Enable DRM + # For HDR + 'spvideo': '4', + 'spsfrhdr': '100', + # For SHD + 'host': self._HOST, + 'referer': self._REFERER, + 'ehost': video_url, + 'appVer': self._APP_VERSION, + 'platform': self._PLATFORM, + # For VQQ + 'guid': guid, + 'flowid': ''.join(random.choices(string.digits + string.ascii_lowercase, k=32)), + } + + return self._search_json(r'QZOutputJson=', self._download_webpage( + self._API_URL, video_id, query=query), 'api_response', video_id) + + def _extract_video_formats_and_subtitles(self, api_response, video_id): + video_response = api_response['vl']['vi'][0] + + formats, subtitles = [], {} + for video_format in video_response['ul']['ui']: + if video_format.get('hls') or determine_ext(video_format['url']) == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + video_format['url'] + traverse_obj(video_format, ('hls', 'pt'), default=''), + video_id, 'mp4', fatal=False) + + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'url': f'{video_format["url"]}{video_response["fn"]}?vkey={video_response["fvkey"]}', + 'ext': 'mp4', + }) + + identifier = video_response.get('br') + format_response = traverse_obj( + api_response, ('fl', 'fi', lambda _, v: v['br'] == identifier), + expected_type=dict, get_all=False) or {} + common_info = { + 'width': video_response.get('vw'), + 'height': video_response.get('vh'), + 'abr': float_or_none(format_response.get('audiobandwidth'), scale=1000), + 'vbr': float_or_none(format_response.get('bandwidth'), scale=1000), + 'fps': format_response.get('vfps'), + 'format': format_response.get('sname'), + 'format_id': format_response.get('name'), + 'format_note': format_response.get('resolution'), + 'dynamic_range': {'hdr10': 'hdr10'}.get(format_response.get('name'), 'sdr'), + 'has_drm': format_response.get('drm', 0) != 0, + } + for f in formats: + f.update(common_info) + + return formats, subtitles + + def _extract_video_native_subtitles(self, api_response): + subtitles = {} + for subtitle in traverse_obj(api_response, ('sfl', 'fi')) or (): + subtitles.setdefault(subtitle['lang'].lower(), []).append({ + 'url': subtitle['url'], + 'ext': 'srt' if subtitle.get('captionType') == 1 else 'vtt', + 'protocol': 'm3u8_native' if determine_ext(subtitle['url']) == 'm3u8' else 'http', + }) + + return subtitles + + def _extract_all_video_formats_and_subtitles(self, url, video_id, series_id): + api_responses = [self._get_video_api_response(url, video_id, series_id, 'srt', 'hls', 'hd')] + self._check_api_response(api_responses[0]) + qualities = traverse_obj(api_responses, (0, 'fl', 'fi', ..., 'name')) or ('shd', 'fhd') + for q in qualities: + if q not in ('ld', 'sd', 'hd'): + api_responses.append(self._get_video_api_response( + url, video_id, series_id, 'vtt', 'hls', q)) + self._check_api_response(api_responses[-1]) + + formats, subtitles = [], {} + for api_response in api_responses: + fmts, subs = self._extract_video_formats_and_subtitles(api_response, video_id) + native_subtitles = self._extract_video_native_subtitles(api_response) + + formats.extend(fmts) + self._merge_subtitles(subs, native_subtitles, target=subtitles) + + return formats, subtitles + + def _get_clean_title(self, title): + return re.sub( + r'\s*[_\-]\s*(?:Watch online|Watch HD Video Online|WeTV|腾讯视频|(?:高清)?1080P在线观看平å°).*?$', + '', title or '').strip() or None + + +class VQQBaseIE(TencentBaseIE): + _VALID_URL_BASE = r'https?://v\.qq\.com' + + _API_URL = 'https://h5vv6.video.qq.com/getvinfo' + _APP_VERSION = '3.5.57' + _PLATFORM = '10901' + _HOST = 'v.qq.com' + _REFERER = 'v.qq.com' + + def _get_webpage_metadata(self, webpage, video_id): + return self._search_json( + r'<script[^>]*>[^<]*window\.__(?:pinia|PINIA__)\s*=', + webpage, 'pinia data', video_id, transform_source=js_to_json, fatal=False) + + +class VQQVideoIE(VQQBaseIE): + IE_NAME = 'vqq:video' + _VALID_URL = VQQBaseIE._VALID_URL_BASE + r'/x/(?:page|cover/(?P<series_id>\w+))/(?P<id>\w+)' + + _TESTS = [{ + 'url': 'https://v.qq.com/x/page/q326831cny0.html', + 'md5': 'b11c9cb781df710d686b950376676e2a', + 'info_dict': { + 'id': 'q326831cny0', + 'ext': 'mp4', + 'title': 'æˆ‘æ˜¯é€‰æ‰‹ï¼šé›·éœ†è£‚é˜µï¼Œç»ˆæžæ—¶åˆ»', + 'description': 'md5:e7ed70be89244017dac2a835a10aeb1e', + 'thumbnail': r're:^https?://[^?#]+q326831cny0', + 'format_id': r're:^shd', + }, + }, { + 'url': 'https://v.qq.com/x/page/o3013za7cse.html', + 'md5': 'a1bcf42c6d28c189bd2fe2d468abb287', + 'info_dict': { + 'id': 'o3013za7cse', + 'ext': 'mp4', + 'title': '欧阳娜娜VLOG', + 'description': 'md5:29fe847497a98e04a8c3826e499edd2e', + 'thumbnail': r're:^https?://[^?#]+o3013za7cse', + 'format_id': r're:^shd', + }, + }, { + 'url': 'https://v.qq.com/x/cover/7ce5noezvafma27/a00269ix3l8.html', + 'md5': '87968df6238a65d2478f19c25adf850b', + 'info_dict': { + 'id': 'a00269ix3l8', + 'ext': 'mp4', + 'title': '鸡毛飞上天 第01集', + 'description': 'md5:8cae3534327315b3872fbef5e51b5c5b', + 'thumbnail': r're:^https?://[^?#]+7ce5noezvafma27', + 'series': '鸡毛飞上天', + 'format_id': r're:^shd', + }, + 'skip': '404', + }, { + 'url': 'https://v.qq.com/x/cover/mzc00200p29k31e/s0043cwsgj0.html', + 'md5': 'fadd10bf88aec3420f06f19ee1d24c5b', + 'info_dict': { + 'id': 's0043cwsgj0', + 'ext': 'mp4', + 'title': '第1集:如何快ä¹åƒç³–?', + 'description': 'md5:1d8c3a0b8729ae3827fa5b2d3ebd5213', + 'thumbnail': r're:^https?://[^?#]+s0043cwsgj0', + 'series': 'é’å¹´ç†å·¥å·¥ä½œè€…生活研究所', + 'format_id': r're:^shd', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # Geo-restricted to China + 'url': 'https://v.qq.com/x/cover/mcv8hkc8zk8lnov/x0036x5qqsr.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id, series_id = self._match_valid_url(url).group('id', 'series_id') + webpage = self._download_webpage(url, video_id) + webpage_metadata = self._get_webpage_metadata(webpage, video_id) + + formats, subtitles = self._extract_all_video_formats_and_subtitles(url, video_id, series_id) + return { + 'id': video_id, + 'title': self._get_clean_title(self._og_search_title(webpage) + or traverse_obj(webpage_metadata, ('global', 'videoInfo', 'title'))), + 'description': (self._og_search_description(webpage) + or traverse_obj(webpage_metadata, ('global', 'videoInfo', 'desc'))), + 'formats': formats, + 'subtitles': subtitles, + 'thumbnail': (self._og_search_thumbnail(webpage) + or traverse_obj(webpage_metadata, ('global', 'videoInfo', 'pic160x90'))), + 'series': traverse_obj(webpage_metadata, ('global', 'coverInfo', 'title')), + } + + +class VQQSeriesIE(VQQBaseIE): + IE_NAME = 'vqq:series' + _VALID_URL = VQQBaseIE._VALID_URL_BASE + r'/x/cover/(?P<id>\w+)\.html/?(?:[?#]|$)' + + _TESTS = [{ + 'url': 'https://v.qq.com/x/cover/7ce5noezvafma27.html', + 'info_dict': { + 'id': '7ce5noezvafma27', + 'title': '鸡毛飞上天', + 'description': 'md5:8cae3534327315b3872fbef5e51b5c5b', + }, + 'playlist_count': 55, + }, { + 'url': 'https://v.qq.com/x/cover/oshd7r0vy9sfq8e.html', + 'info_dict': { + 'id': 'oshd7r0vy9sfq8e', + 'title': 'æ‹çˆ±ç»†èƒž2', + 'description': 'md5:9d8a2245679f71ca828534b0f95d2a03', + }, + 'playlist_count': 12, + }] + + def _real_extract(self, url): + series_id = self._match_id(url) + webpage = self._download_webpage(url, series_id) + webpage_metadata = self._get_webpage_metadata(webpage, series_id) + + episode_paths = [f'/x/cover/{series_id}/{video_id}.html' for video_id in re.findall( + r'<div[^>]+data-vid="(?P<video_id>[^"]+)"[^>]+class="[^"]+episode-item-rect--number', + webpage)] + + return self.playlist_from_matches( + episode_paths, series_id, ie=VQQVideoIE, getter=functools.partial(urljoin, url), + title=self._get_clean_title(traverse_obj(webpage_metadata, ('coverInfo', 'title')) + or self._og_search_title(webpage)), + description=(traverse_obj(webpage_metadata, ('coverInfo', 'description')) + or self._og_search_description(webpage))) + + +class WeTvBaseIE(TencentBaseIE): + _VALID_URL_BASE = r'https?://(?:www\.)?wetv\.vip/(?:[^?#]+/)?play' + + _API_URL = 'https://play.wetv.vip/getvinfo' + _APP_VERSION = '3.5.57' + _PLATFORM = '4830201' + _HOST = 'wetv.vip' + _REFERER = 'wetv.vip' + + def _get_webpage_metadata(self, webpage, video_id): + return self._parse_json( + traverse_obj(self._search_nextjs_data(webpage, video_id), ('props', 'pageProps', 'data')), + video_id, fatal=False) + + def _extract_episode(self, url): + video_id, series_id = self._match_valid_url(url).group('id', 'series_id') + webpage = self._download_webpage(url, video_id) + webpage_metadata = self._get_webpage_metadata(webpage, video_id) + + formats, subtitles = self._extract_all_video_formats_and_subtitles(url, video_id, series_id) + return { + 'id': video_id, + 'title': self._get_clean_title(self._og_search_title(webpage) + or traverse_obj(webpage_metadata, ('coverInfo', 'title'))), + 'description': (traverse_obj(webpage_metadata, ('coverInfo', 'description')) + or self._og_search_description(webpage)), + 'formats': formats, + 'subtitles': subtitles, + 'thumbnail': self._og_search_thumbnail(webpage), + 'duration': int_or_none(traverse_obj(webpage_metadata, ('videoInfo', 'duration'))), + 'series': traverse_obj(webpage_metadata, ('coverInfo', 'title')), + 'episode_number': int_or_none(traverse_obj(webpage_metadata, ('videoInfo', 'episode'))), + } + + def _extract_series(self, url, ie): + series_id = self._match_id(url) + webpage = self._download_webpage(url, series_id) + webpage_metadata = self._get_webpage_metadata(webpage, series_id) + + episode_paths = ([f'/play/{series_id}/{episode["vid"]}' for episode in webpage_metadata.get('videoList')] + or re.findall(r'<a[^>]+class="play-video__link"[^>]+href="(?P<path>[^"]+)', webpage)) + + return self.playlist_from_matches( + episode_paths, series_id, ie=ie, getter=functools.partial(urljoin, url), + title=self._get_clean_title(traverse_obj(webpage_metadata, ('coverInfo', 'title')) + or self._og_search_title(webpage)), + description=(traverse_obj(webpage_metadata, ('coverInfo', 'description')) + or self._og_search_description(webpage))) + + +class WeTvEpisodeIE(WeTvBaseIE): + IE_NAME = 'wetv:episode' + _VALID_URL = WeTvBaseIE._VALID_URL_BASE + r'/(?P<series_id>\w+)(?:-[^?#]+)?/(?P<id>\w+)(?:-[^?#]+)?' + + _TESTS = [{ + 'url': 'https://wetv.vip/en/play/air11ooo2rdsdi3-Cute-Programmer/v0040pr89t9-EP1-Cute-Programmer', + 'md5': '0c70fdfaa5011ab022eebc598e64bbbe', + 'info_dict': { + 'id': 'v0040pr89t9', + 'ext': 'mp4', + 'title': 'EP1: Cute Programmer', + 'description': 'md5:e87beab3bf9f392d6b9e541a63286343', + 'thumbnail': r're:^https?://[^?#]+air11ooo2rdsdi3', + 'series': 'Cute Programmer', + 'episode': 'Episode 1', + 'episode_number': 1, + 'duration': 2835, + 'format_id': r're:^shd', + }, + }, { + 'url': 'https://wetv.vip/en/play/u37kgfnfzs73kiu/p0039b9nvik', + 'md5': '3b3c15ca4b9a158d8d28d5aa9d7c0a49', + 'info_dict': { + 'id': 'p0039b9nvik', + 'ext': 'mp4', + 'title': 'EP1: You Are My Glory', + 'description': 'md5:831363a4c3b4d7615e1f3854be3a123b', + 'thumbnail': r're:^https?://[^?#]+u37kgfnfzs73kiu', + 'series': 'You Are My Glory', + 'episode': 'Episode 1', + 'episode_number': 1, + 'duration': 2454, + 'format_id': r're:^shd', + }, + }, { + 'url': 'https://wetv.vip/en/play/lcxgwod5hapghvw-WeTV-PICK-A-BOO/i0042y00lxp-Zhao-Lusi-Describes-The-First-Experiences-She-Had-In-Who-Rules-The-World-%7C-WeTV-PICK-A-BOO', + 'md5': '71133f5c2d5d6cad3427e1b010488280', + 'info_dict': { + 'id': 'i0042y00lxp', + 'ext': 'mp4', + 'title': 'md5:f7a0857dbe5fbbe2e7ad630b92b54e6a', + 'description': 'md5:76260cb9cdc0ef76826d7ca9d92fadfa', + 'thumbnail': r're:^https?://[^?#]+i0042y00lxp', + 'series': 'WeTV PICK-A-BOO', + 'episode': 'Episode 0', + 'episode_number': 0, + 'duration': 442, + 'format_id': r're:^shd', + }, + }] + + def _real_extract(self, url): + return self._extract_episode(url) + + +class WeTvSeriesIE(WeTvBaseIE): + _VALID_URL = WeTvBaseIE._VALID_URL_BASE + r'/(?P<id>\w+)(?:-[^/?#]+)?/?(?:[?#]|$)' + + _TESTS = [{ + 'url': 'https://wetv.vip/play/air11ooo2rdsdi3-Cute-Programmer', + 'info_dict': { + 'id': 'air11ooo2rdsdi3', + 'title': 'Cute Programmer', + 'description': 'md5:e87beab3bf9f392d6b9e541a63286343', + }, + 'playlist_count': 30, + }, { + 'url': 'https://wetv.vip/en/play/u37kgfnfzs73kiu-You-Are-My-Glory', + 'info_dict': { + 'id': 'u37kgfnfzs73kiu', + 'title': 'You Are My Glory', + 'description': 'md5:831363a4c3b4d7615e1f3854be3a123b', + }, + 'playlist_count': 32, + }] + + def _real_extract(self, url): + return self._extract_series(url, WeTvEpisodeIE) + + +class IflixBaseIE(WeTvBaseIE): + _VALID_URL_BASE = r'https?://(?:www\.)?iflix\.com/(?:[^?#]+/)?play' + + _API_URL = 'https://vplay.iflix.com/getvinfo' + _APP_VERSION = '3.5.57' + _PLATFORM = '330201' + _HOST = 'www.iflix.com' + _REFERER = 'www.iflix.com' + + +class IflixEpisodeIE(IflixBaseIE): + IE_NAME = 'iflix:episode' + _VALID_URL = IflixBaseIE._VALID_URL_BASE + r'/(?P<series_id>\w+)(?:-[^?#]+)?/(?P<id>\w+)(?:-[^?#]+)?' + + _TESTS = [{ + 'url': 'https://www.iflix.com/en/play/daijrxu03yypu0s/a0040kvgaza', + 'md5': '9740f9338c3a2105290d16b68fb3262f', + 'info_dict': { + 'id': 'a0040kvgaza', + 'ext': 'mp4', + 'title': 'EP1: Put Your Head On My Shoulder 2021', + 'description': 'md5:c095a742d3b7da6dfedd0c8170727a42', + 'thumbnail': r're:^https?://[^?#]+daijrxu03yypu0s', + 'series': 'Put Your Head On My Shoulder 2021', + 'episode': 'Episode 1', + 'episode_number': 1, + 'duration': 2639, + 'format_id': r're:^shd', + }, + }, { + 'url': 'https://www.iflix.com/en/play/fvvrcc3ra9lbtt1-Take-My-Brother-Away/i0029sd3gm1-EP1%EF%BC%9ATake-My-Brother-Away', + 'md5': '375c9b8478fdedca062274b2c2f53681', + 'info_dict': { + 'id': 'i0029sd3gm1', + 'ext': 'mp4', + 'title': 'EP1:Take My Brother Away', + 'description': 'md5:f0f7be1606af51cd94d5627de96b0c76', + 'thumbnail': r're:^https?://[^?#]+fvvrcc3ra9lbtt1', + 'series': 'Take My Brother Away', + 'episode': 'Episode 1', + 'episode_number': 1, + 'duration': 228, + 'format_id': r're:^shd', + }, + }] + + def _real_extract(self, url): + return self._extract_episode(url) + + +class IflixSeriesIE(IflixBaseIE): + _VALID_URL = IflixBaseIE._VALID_URL_BASE + r'/(?P<id>\w+)(?:-[^/?#]+)?/?(?:[?#]|$)' + + _TESTS = [{ + 'url': 'https://www.iflix.com/en/play/g21a6qk4u1s9x22-You-Are-My-Hero', + 'info_dict': { + 'id': 'g21a6qk4u1s9x22', + 'title': 'You Are My Hero', + 'description': 'md5:9c4d844bc0799cd3d2b5aed758a2050a', + }, + 'playlist_count': 40, + }, { + 'url': 'https://www.iflix.com/play/0s682hc45t0ohll', + 'info_dict': { + 'id': '0s682hc45t0ohll', + 'title': 'Miss Gu Who Is Silent', + 'description': 'md5:a9651d0236f25af06435e845fa2f8c78', + }, + 'playlist_count': 20, + }] + + def _real_extract(self, url): + return self._extract_series(url, IflixEpisodeIE) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tennistv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tennistv.py new file mode 100644 index 0000000..c1b4a33 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tennistv.py @@ -0,0 +1,155 @@ +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + random_uuidv4, + unified_timestamp, + urlencode_postdata, +) + + +class TennisTVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tennistv\.com/videos/(?P<id>[-a-z0-9]+)' + _TESTS = [{ + 'url': 'https://www.tennistv.com/videos/indian-wells-2018-verdasco-fritz', + 'info_dict': { + 'id': 'indian-wells-2018-verdasco-fritz', + 'ext': 'mp4', + 'title': 'Fernando Verdasco v Taylor Fritz', + 'description': 're:^After his stunning victory.{174}$', + 'thumbnail': 'https://atp-prod.akamaized.net/api/images/v1/images/112831/landscape/1242/0', + 'timestamp': 1521017381, + 'upload_date': '20180314', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'Requires email and password of a subscribed account', + }, { + 'url': 'https://www.tennistv.com/videos/2650480/best-matches-of-2022-part-5', + 'info_dict': { + 'id': '2650480', + 'ext': 'mp4', + 'title': 'Best Matches of 2022 - Part 5', + 'description': 'md5:36dec3bfae7ed74bd79e48045b17264c', + 'thumbnail': 'https://open.http.mp.streamamg.com/p/3001482/sp/300148200/thumbnail/entry_id/0_myef18pd/version/100001/height/1920', + }, + 'params': {'skip_download': 'm3u8'}, + 'skip': 'Requires email and password of a subscribed account', + }] + _NETRC_MACHINE = 'tennistv' + + access_token, refresh_token = None, None + _PARTNER_ID = 3001482 + _FORMAT_URL = 'https://open.http.mp.streamamg.com/p/{partner}/sp/{partner}00/playManifest/entryId/{entry}/format/applehttp/protocol/https/a.m3u8?ks={session}' + _AUTH_BASE_URL = 'https://sso.tennistv.com/auth/realms/TennisTV/protocol/openid-connect' + _HEADERS = { + 'origin': 'https://www.tennistv.com', + 'referer': 'https://www.tennistv.com/', + 'content-Type': 'application/x-www-form-urlencoded' + } + + def _perform_login(self, username, password): + login_page = self._download_webpage( + f'{self._AUTH_BASE_URL}/auth', None, 'Downloading login page', + query={ + 'client_id': 'tennis-tv-web', + 'redirect_uri': 'https://tennistv.com', + 'response_mode': 'fragment', + 'response_type': 'code', + 'scope': 'openid' + }) + + post_url = self._html_search_regex(r'action=["\']([^"\']+?)["\']\s+method=["\']post["\']', login_page, 'login POST url') + temp_page = self._download_webpage( + post_url, None, 'Sending login data', 'Unable to send login data', + headers=self._HEADERS, data=urlencode_postdata({ + 'username': username, + 'password': password, + 'submitAction': 'Log In' + })) + if 'Your username or password was incorrect' in temp_page: + raise ExtractorError('Your username or password was incorrect', expected=True) + + handle = self._request_webpage( + f'{self._AUTH_BASE_URL}/auth', None, 'Logging in', headers=self._HEADERS, + query={ + 'client_id': 'tennis-tv-web', + 'redirect_uri': 'https://www.tennistv.com/resources/v1.1.10/html/silent-check-sso.html', + 'state': random_uuidv4(), + 'response_mode': 'fragment', + 'response_type': 'code', + 'scope': 'openid', + 'nonce': random_uuidv4(), + 'prompt': 'none' + }) + + self.get_token(None, { + 'code': urllib.parse.parse_qs(handle.url)['code'][-1], + 'grant_type': 'authorization_code', + 'client_id': 'tennis-tv-web', + 'redirect_uri': 'https://www.tennistv.com/resources/v1.1.10/html/silent-check-sso.html' + }) + + def get_token(self, video_id, payload): + res = self._download_json( + f'{self._AUTH_BASE_URL}/token', video_id, 'Fetching tokens', + 'Unable to fetch tokens', headers=self._HEADERS, data=urlencode_postdata(payload)) + + self.access_token = res.get('access_token') or self.access_token + self.refresh_token = res.get('refresh_token') or self.refresh_token + + def _real_initialize(self): + if self.access_token and self.refresh_token: + return + + cookies = self._get_cookies('https://www.tennistv.com/') + if not cookies.get('access_token') or not cookies.get('refresh_token'): + self.raise_login_required() + self.access_token, self.refresh_token = cookies['access_token'].value, cookies['refresh_token'].value + + def _download_session_json(self, video_id, entryid,): + return self._download_json( + f'https://atppayments.streamamg.com/api/v1/session/ksession/?lang=en&apijwttoken={self.access_token}&entryId={entryid}', + video_id, 'Downloading ksession token', 'Failed to download ksession token', headers=self._HEADERS) + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + entryid = self._search_regex(r'data-entry-id=["\']([^"\']+)', webpage, 'entryID') + session_json = self._download_session_json(video_id, entryid) + + k_session = session_json.get('KSession') + if k_session is None: + self.get_token(video_id, { + 'grant_type': 'refresh_token', + 'refresh_token': self.refresh_token, + 'client_id': 'tennis-tv-web' + }) + k_session = self._download_session_json(video_id, entryid).get('KSession') + if k_session is None: + raise ExtractorError('Failed to get KSession, possibly a premium video', expected=True) + + if session_json.get('ErrorMessage'): + self.report_warning(session_json['ErrorMessage']) + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + self._FORMAT_URL.format(partner=self._PARTNER_ID, entry=entryid, session=k_session), video_id) + + return { + 'id': video_id, + 'title': self._generic_title('', webpage), + 'description': self._html_search_regex( + (r'<span itemprop="description" content=["\']([^"\']+)["\']>', *self._og_regexes('description')), + webpage, 'description', fatal=False), + 'thumbnail': f'https://open.http.mp.streamamg.com/p/{self._PARTNER_ID}/sp/{self._PARTNER_ID}00/thumbnail/entry_id/{entryid}/version/100001/height/1920', + 'timestamp': unified_timestamp(self._html_search_regex( + r'<span itemprop="uploadDate" content=["\']([^"\']+)["\']>', webpage, 'upload time', fatal=False)), + 'series': self._html_search_regex(r'data-series\s*?=\s*?"(.*?)"', webpage, 'series', fatal=False) or None, + 'season': self._html_search_regex(r'data-tournament-city\s*?=\s*?"(.*?)"', webpage, 'season', fatal=False) or None, + 'episode': self._html_search_regex(r'data-round\s*?=\s*?"(.*?)"', webpage, 'round', fatal=False) or None, + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tenplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tenplay.py new file mode 100644 index 0000000..7ce7cbf --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tenplay.py @@ -0,0 +1,169 @@ +import base64 +import functools +import itertools +from datetime import datetime + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import int_or_none, traverse_obj, urlencode_postdata, urljoin + + +class TenPlayIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?10play\.com\.au/(?:[^/]+/)+(?P<id>tpv\d{6}[a-z]{5})' + _NETRC_MACHINE = '10play' + _TESTS = [{ + 'url': 'https://10play.com.au/neighbours/web-extras/season-39/nathan-borg-is-the-first-aussie-actor-with-a-cochlear-implant-to-join-neighbours/tpv210128qupwd', + 'info_dict': { + 'id': '6226844312001', + 'ext': 'mp4', + 'title': 'Nathan Borg Is The First Aussie Actor With A Cochlear Implant To Join Neighbours', + 'alt_title': 'Nathan Borg Is The First Aussie Actor With A Cochlear Implant To Join Neighbours', + 'description': 'md5:a02d0199c901c2dd4c796f1e7dd0de43', + 'duration': 186, + 'season': 39, + 'series': 'Neighbours', + 'thumbnail': r're:https://.*\.jpg', + 'uploader': 'Channel 10', + 'age_limit': 15, + 'timestamp': 1611810000, + 'upload_date': '20210128', + 'uploader_id': '2199827728001', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'Only available in Australia', + }, { + 'url': 'https://10play.com.au/todd-sampsons-body-hack/episodes/season-4/episode-7/tpv200921kvngh', + 'info_dict': { + 'id': '6192880312001', + 'ext': 'mp4', + 'title': "Todd Sampson's Body Hack - S4 Ep. 2", + 'description': 'md5:fa278820ad90f08ea187f9458316ac74', + 'age_limit': 15, + 'timestamp': 1600770600, + 'upload_date': '20200922', + 'uploader': 'Channel 10', + 'uploader_id': '2199827728001' + }, + 'params': { + 'skip_download': True, + } + }, { + 'url': 'https://10play.com.au/how-to-stay-married/web-extras/season-1/terrys-talks-ep-1-embracing-change/tpv190915ylupc', + 'only_matching': True, + }] + _GEO_BYPASS = False + + _AUS_AGES = { + 'G': 0, + 'PG': 15, + 'M': 15, + 'MA': 15, + 'MA15+': 15, + 'R': 18, + 'X': 18 + } + + def _get_bearer_token(self, video_id): + username, password = self._get_login_info() + if username is None or password is None: + self.raise_login_required('Your 10play account\'s details must be provided with --username and --password.') + _timestamp = datetime.now().strftime('%Y%m%d000000') + _auth_header = base64.b64encode(_timestamp.encode('ascii')).decode('ascii') + data = self._download_json('https://10play.com.au/api/user/auth', video_id, 'Getting bearer token', headers={ + 'X-Network-Ten-Auth': _auth_header, + }, data=urlencode_postdata({ + 'email': username, + 'password': password, + })) + return 'Bearer ' + data['jwt']['accessToken'] + + def _real_extract(self, url): + content_id = self._match_id(url) + data = self._download_json( + 'https://10play.com.au/api/v1/videos/' + content_id, content_id) + headers = {} + + if data.get('memberGated') is True: + _token = self._get_bearer_token(content_id) + headers = {'Authorization': _token} + + _video_url = self._download_json( + data.get('playbackApiEndpoint'), content_id, 'Downloading video JSON', + headers=headers).get('source') + m3u8_url = self._request_webpage(HEADRequest( + _video_url), content_id).url + if '10play-not-in-oz' in m3u8_url: + self.raise_geo_restricted(countries=['AU']) + formats = self._extract_m3u8_formats(m3u8_url, content_id, 'mp4') + + return { + 'formats': formats, + 'subtitles': {'en': [{'url': data.get('captionUrl')}]} if data.get('captionUrl') else None, + 'id': data.get('altId') or content_id, + 'duration': data.get('duration'), + 'title': data.get('subtitle'), + 'alt_title': data.get('title'), + 'description': data.get('description'), + 'age_limit': self._AUS_AGES.get(data.get('classification')), + 'series': data.get('tvShow'), + 'season': int_or_none(data.get('season')), + 'episode_number': int_or_none(data.get('episode')), + 'timestamp': data.get('published'), + 'thumbnail': data.get('imageUrl'), + 'uploader': 'Channel 10', + 'uploader_id': '2199827728001', + } + + +class TenPlaySeasonIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?10play\.com\.au/(?P<show>[^/?#]+)/episodes/(?P<season>[^/?#]+)/?(?:$|[?#])' + _TESTS = [{ + 'url': 'https://10play.com.au/masterchef/episodes/season-14', + 'info_dict': { + 'title': 'Season 14', + 'id': 'MjMyOTIy', + }, + 'playlist_mincount': 64, + }, { + 'url': 'https://10play.com.au/the-bold-and-the-beautiful-fast-tracked/episodes/season-2022', + 'info_dict': { + 'title': 'Season 2022', + 'id': 'Mjc0OTIw', + }, + 'playlist_mincount': 256, + }] + + def _entries(self, load_more_url, display_id=None): + skip_ids = [] + for page in itertools.count(1): + episodes_carousel = self._download_json( + load_more_url, display_id, query={'skipIds[]': skip_ids}, + note=f'Fetching episodes page {page}') + + episodes_chunk = episodes_carousel['items'] + skip_ids.extend(ep['id'] for ep in episodes_chunk) + + for ep in episodes_chunk: + yield ep['cardLink'] + if not episodes_carousel['hasMore']: + break + + def _real_extract(self, url): + show, season = self._match_valid_url(url).group('show', 'season') + season_info = self._download_json( + f'https://10play.com.au/api/shows/{show}/episodes/{season}', f'{show}/{season}') + + episodes_carousel = traverse_obj(season_info, ( + 'content', 0, 'components', ( + lambda _, v: v['title'].lower() == 'episodes', + (..., {dict}), + )), get_all=False) or {} + + playlist_id = episodes_carousel['tpId'] + + return self.playlist_from_matches( + self._entries(urljoin(url, episodes_carousel['loadMoreUrl']), playlist_id), + playlist_id, traverse_obj(season_info, ('content', 0, 'title', {str})), + getter=functools.partial(urljoin, url)) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/testurl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/testurl.py new file mode 100644 index 0000000..3cf0017 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/testurl.py @@ -0,0 +1,50 @@ +import re + +from .common import InfoExtractor +from ..utils import ExtractorError + + +class TestURLIE(InfoExtractor): + """ Allows addressing of the test cases as test:yout.*be_1 """ + + IE_DESC = False # Do not list + _VALID_URL = r'test(?:url)?:(?P<extractor>.*?)(?:_(?P<num>\d+|all))?$' + + def _real_extract(self, url): + from . import gen_extractor_classes + + extractor_id, num = self._match_valid_url(url).group('extractor', 'num') + if not extractor_id: + return {'id': ':test', 'title': '', 'url': url} + + rex = re.compile(extractor_id, flags=re.IGNORECASE) + matching_extractors = [e for e in gen_extractor_classes() if rex.search(e.IE_NAME)] + + if len(matching_extractors) == 0: + raise ExtractorError(f'No extractors matching {extractor_id!r} found', expected=True) + elif len(matching_extractors) > 1: + extractor = next(( # Check for exact match + ie for ie in matching_extractors if ie.IE_NAME.lower() == extractor_id.lower() + ), None) or next(( # Check for exact match without plugin suffix + ie for ie in matching_extractors if ie.IE_NAME.split('+')[0].lower() == extractor_id.lower() + ), None) + if not extractor: + raise ExtractorError( + 'Found multiple matching extractors: %s' % ' '.join(ie.IE_NAME for ie in matching_extractors), + expected=True) + else: + extractor = matching_extractors[0] + + testcases = tuple(extractor.get_testcases(True)) + if num == 'all': + return self.playlist_result( + [self.url_result(tc['url'], extractor) for tc in testcases], + url, f'{extractor.IE_NAME} tests') + try: + tc = testcases[int(num or 0)] + except IndexError: + raise ExtractorError( + f'Test case {num or 0} not found, got only {len(testcases)} tests', expected=True) + + self.to_screen(f'Test URL: {tc["url"]}') + return self.url_result(tc['url'], extractor) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tf1.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tf1.py new file mode 100644 index 0000000..aba4927 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tf1.py @@ -0,0 +1,101 @@ +import json + +from .common import InfoExtractor +from ..utils import ( + int_or_none, + parse_iso8601, + try_get, +) + + +class TF1IE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tf1\.fr/[^/]+/(?P<program_slug>[^/]+)/videos/(?P<id>[^/?&#]+)\.html' + _TESTS = [{ + 'url': 'https://www.tf1.fr/tmc/quotidien-avec-yann-barthes/videos/quotidien-premiere-partie-11-juin-2019.html', + 'info_dict': { + 'id': '13641379', + 'ext': 'mp4', + 'title': 'md5:f392bc52245dc5ad43771650c96fb620', + 'description': 'md5:a02cdb217141fb2d469d6216339b052f', + 'upload_date': '20190611', + 'timestamp': 1560273989, + 'duration': 1738, + 'series': 'Quotidien avec Yann Barthès', + 'tags': ['intégrale', 'quotidien', 'Replay'], + }, + 'params': { + # Sometimes wat serves the whole file with the --test option + 'skip_download': True, + }, + }, { + 'url': 'https://www.tf1.fr/tmc/burger-quiz/videos/burger-quiz-du-19-aout-2023-s03-episode-21-85585666.html', + 'info_dict': { + 'id': '14010600', + 'ext': 'mp4', + 'title': 'Burger Quiz - S03 EP21 avec Eye Haidara, Anne Depétrini, Jonathan Zaccaï et Pio Marmaï', + 'thumbnail': 'https://photos.tf1.fr/1280/720/burger-quiz-11-9adb79-0@1x.jpg', + 'description': 'Manu Payet recevra Eye Haidara, Anne Depétrini, Jonathan Zaccaï et Pio Marmaï.', + 'upload_date': '20230819', + 'timestamp': 1692469471, + 'season_number': 3, + 'series': 'Burger Quiz', + 'episode_number': 21, + 'season': 'Season 3', + 'tags': 'count:13', + 'episode': 'Episode 21', + 'duration': 2312 + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'http://www.tf1.fr/tf1/koh-lanta/videos/replay-koh-lanta-22-mai-2015.html', + 'only_matching': True, + }, { + 'url': 'http://www.tf1.fr/hd1/documentaire/videos/mylene-farmer-d-une-icone.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + program_slug, slug = self._match_valid_url(url).groups() + video = self._download_json( + 'https://www.tf1.fr/graphql/web', slug, query={ + 'id': '9b80783950b85247541dd1d851f9cc7fa36574af015621f853ab111a679ce26f', + 'variables': json.dumps({ + 'programSlug': program_slug, + 'slug': slug, + }) + })['data']['videoBySlug'] + wat_id = video['streamId'] + + tags = [] + for tag in (video.get('tags') or []): + label = tag.get('label') + if not label: + continue + tags.append(label) + + decoration = video.get('decoration') or {} + + thumbnails = [] + for source in (try_get(decoration, lambda x: x['image']['sources'], list) or []): + source_url = source.get('url') + if not source_url: + continue + thumbnails.append({ + 'url': source_url, + 'width': int_or_none(source.get('width')), + }) + + return { + '_type': 'url_transparent', + 'id': wat_id, + 'url': 'wat:' + wat_id, + 'title': video.get('title'), + 'thumbnails': thumbnails, + 'description': decoration.get('description'), + 'timestamp': parse_iso8601(video.get('date')), + 'duration': int_or_none(try_get(video, lambda x: x['publicPlayingInfos']['duration'])), + 'tags': tags, + 'series': decoration.get('programLabel'), + 'season_number': int_or_none(video.get('season')), + 'episode_number': int_or_none(video.get('episode')), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tfo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tfo.py new file mode 100644 index 0000000..d417f50 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tfo.py @@ -0,0 +1,48 @@ +import json + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ExtractorError, clean_html, int_or_none + + +class TFOIE(InfoExtractor): + _GEO_COUNTRIES = ['CA'] + _VALID_URL = r'https?://(?:www\.)?tfo\.org/(?:en|fr)/(?:[^/]+/){2}(?P<id>\d+)' + _TEST = { + 'url': 'http://www.tfo.org/en/universe/tfo-247/100463871/video-game-hackathon', + 'md5': 'cafbe4f47a8dae0ca0159937878100d6', + 'info_dict': { + 'id': '7da3d50e495c406b8fc0b997659cc075', + 'ext': 'mp4', + 'title': 'Video Game Hackathon', + 'description': 'md5:558afeba217c6c8d96c60e5421795c07', + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + self._request_webpage(HEADRequest('http://www.tfo.org/'), video_id) + infos = self._download_json( + 'http://www.tfo.org/api/web/video/get_infos', video_id, data=json.dumps({ + 'product_id': video_id, + }).encode(), headers={ + 'X-tfo-session': self._get_cookies('http://www.tfo.org/')['tfo-session'].value, + }) + if infos.get('success') == 0: + if infos.get('code') == 'ErrGeoBlocked': + self.raise_geo_restricted(countries=self._GEO_COUNTRIES) + raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(infos['msg'])), expected=True) + video_data = infos['data'] + + return { + '_type': 'url_transparent', + 'id': video_id, + 'url': 'limelight:media:' + video_data['llid'], + 'title': video_data['title'], + 'description': video_data.get('description'), + 'series': video_data.get('collection'), + 'season_number': int_or_none(video_data.get('season')), + 'episode_number': int_or_none(video_data.get('episode')), + 'duration': int_or_none(video_data.get('duration')), + 'ie_key': 'LimelightMedia', + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/theholetv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/theholetv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/theholetv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/theholetv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/theintercept.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/theintercept.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/theintercept.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/theintercept.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/theplatform.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/theplatform.py new file mode 100644 index 0000000..433ce84 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/theplatform.py @@ -0,0 +1,417 @@ +import re +import time +import hmac +import binascii +import hashlib + + +from .once import OnceIE +from .adobepass import AdobePassIE +from ..networking import Request +from ..utils import ( + determine_ext, + ExtractorError, + float_or_none, + int_or_none, + parse_qs, + unsmuggle_url, + update_url_query, + xpath_with_ns, + mimetype2ext, + find_xpath_attr, + traverse_obj, + update_url, + urlhandle_detect_ext, +) +from ..networking import HEADRequest + +default_ns = 'http://www.w3.org/2005/SMIL21/Language' +_x = lambda p: xpath_with_ns(p, {'smil': default_ns}) + + +class ThePlatformBaseIE(OnceIE): + _TP_TLD = 'com' + + def _extract_theplatform_smil(self, smil_url, video_id, note='Downloading SMIL data'): + meta = self._download_xml( + smil_url, video_id, note=note, query={'format': 'SMIL'}, + headers=self.geo_verification_headers()) + error_element = find_xpath_attr(meta, _x('.//smil:ref'), 'src') + if error_element is not None: + exception = find_xpath_attr( + error_element, _x('.//smil:param'), 'name', 'exception') + if exception is not None: + if exception.get('value') == 'GeoLocationBlocked': + self.raise_geo_restricted(error_element.attrib['abstract']) + elif error_element.attrib['src'].startswith( + 'http://link.theplatform.%s/s/errorFiles/Unavailable.' + % self._TP_TLD): + raise ExtractorError( + error_element.attrib['abstract'], expected=True) + + smil_formats, subtitles = self._parse_smil_formats_and_subtitles( + meta, smil_url, video_id, namespace=default_ns, + # the parameters are from syfy.com, other sites may use others, + # they also work for nbc.com + f4m_params={'g': 'UXWGVKRWHFSP', 'hdcore': '3.0.3'}, + transform_rtmp_url=lambda streamer, src: (streamer, 'mp4:' + src)) + + formats = [] + for _format in smil_formats: + if OnceIE.suitable(_format['url']): + formats.extend(self._extract_once_formats(_format['url'])) + else: + media_url = _format['url'] + if determine_ext(media_url) == 'm3u8': + hdnea2 = self._get_cookies(media_url).get('hdnea2') + if hdnea2: + _format['url'] = update_url_query(media_url, {'hdnea3': hdnea2.value}) + + formats.append(_format) + + return formats, subtitles + + def _download_theplatform_metadata(self, path, video_id): + info_url = 'http://link.theplatform.%s/s/%s?format=preview' % (self._TP_TLD, path) + return self._download_json(info_url, video_id) + + def _parse_theplatform_metadata(self, info): + subtitles = {} + captions = info.get('captions') + if isinstance(captions, list): + for caption in captions: + lang, src, mime = caption.get('lang', 'en'), caption.get('src'), caption.get('type') + subtitles.setdefault(lang, []).append({ + 'ext': mimetype2ext(mime), + 'url': src, + }) + + duration = info.get('duration') + tp_chapters = info.get('chapters', []) + chapters = [] + if tp_chapters: + def _add_chapter(start_time, end_time): + start_time = float_or_none(start_time, 1000) + end_time = float_or_none(end_time, 1000) + if start_time is None or end_time is None: + return + chapters.append({ + 'start_time': start_time, + 'end_time': end_time, + }) + + for chapter in tp_chapters[:-1]: + _add_chapter(chapter.get('startTime'), chapter.get('endTime')) + _add_chapter(tp_chapters[-1].get('startTime'), tp_chapters[-1].get('endTime') or duration) + + return { + 'title': info['title'], + 'subtitles': subtitles, + 'description': info['description'], + 'thumbnail': info['defaultThumbnailUrl'], + 'duration': float_or_none(duration, 1000), + 'timestamp': int_or_none(info.get('pubDate'), 1000) or None, + 'uploader': info.get('billingCode'), + 'chapters': chapters, + } + + def _extract_theplatform_metadata(self, path, video_id): + info = self._download_theplatform_metadata(path, video_id) + return self._parse_theplatform_metadata(info) + + +class ThePlatformIE(ThePlatformBaseIE, AdobePassIE): + _VALID_URL = r'''(?x) + (?:https?://(?:link|player)\.theplatform\.com/[sp]/(?P<provider_id>[^/]+)/ + (?:(?:(?:[^/]+/)+select/)?(?P<media>media/(?:guid/\d+/)?)?|(?P<config>(?:[^/\?]+/(?:swf|config)|onsite)/select/))? + |theplatform:)(?P<id>[^/\?&]+)''' + _EMBED_REGEX = [ + r'''(?x) + <meta\s+ + property=(["'])(?:og:video(?::(?:secure_)?url)?|twitter:player)\1\s+ + content=(["'])(?P<url>https?://player\.theplatform\.com/p/.+?)\2''', + r'(?s)<(?:iframe|script)[^>]+src=(["\'])(?P<url>(?:https?:)?//player\.theplatform\.com/p/.+?)\1' + ] + + _TESTS = [{ + # from http://www.metacafe.com/watch/cb-e9I_cZgTgIPd/blackberrys_big_bold_z30/ + 'url': 'http://link.theplatform.com/s/dJ5BDC/e9I_cZgTgIPd/meta.smil?format=smil&Tracking=true&mbr=true', + 'info_dict': { + 'id': 'e9I_cZgTgIPd', + 'ext': 'flv', + 'title': 'Blackberry\'s big, bold Z30', + 'description': 'The Z30 is Blackberry\'s biggest, baddest mobile messaging device yet.', + 'duration': 247, + 'timestamp': 1383239700, + 'upload_date': '20131031', + 'uploader': 'CBSI-NEW', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + 'skip': '404 Not Found', + }, { + # from http://www.cnet.com/videos/tesla-model-s-a-second-step-towards-a-cleaner-motoring-future/ + 'url': 'http://link.theplatform.com/s/kYEXFC/22d_qsQ6MIRT', + 'info_dict': { + 'id': '22d_qsQ6MIRT', + 'ext': 'flv', + 'description': 'md5:ac330c9258c04f9d7512cf26b9595409', + 'title': 'Tesla Model S: A second step towards a cleaner motoring future', + 'timestamp': 1426176191, + 'upload_date': '20150312', + 'uploader': 'CBSI-NEW', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + 'skip': 'CNet no longer uses ThePlatform', + }, { + 'url': 'https://player.theplatform.com/p/D6x-PC/pulse_preview/embed/select/media/yMBg9E8KFxZD', + 'info_dict': { + 'id': 'yMBg9E8KFxZD', + 'ext': 'mp4', + 'description': 'md5:644ad9188d655b742f942bf2e06b002d', + 'title': 'HIGHLIGHTS: USA bag first ever series Cup win', + 'uploader': 'EGSM', + }, + 'skip': 'Dead link', + }, { + 'url': 'http://player.theplatform.com/p/NnzsPC/widget/select/media/4Y0TlYUr_ZT7', + 'only_matching': True, + }, { + 'url': 'http://player.theplatform.com/p/2E2eJC/nbcNewsOffsite?guid=tdy_or_siri_150701', + 'md5': 'fb96bb3d85118930a5b055783a3bd992', + 'info_dict': { + 'id': 'tdy_or_siri_150701', + 'ext': 'mp4', + 'title': 'iPhone Siri’s sassy response to a math question has people talking', + 'description': 'md5:a565d1deadd5086f3331d57298ec6333', + 'duration': 83.0, + 'thumbnail': r're:^https?://.*\.jpg$', + 'timestamp': 1435752600, + 'upload_date': '20150701', + 'uploader': 'NBCU-NEWS', + }, + 'skip': 'Error: Player PID "nbcNewsOffsite" is disabled', + }, { + # From http://www.nbc.com/the-blacklist/video/sir-crispin-crandall/2928790?onid=137781#vc137781=1 + # geo-restricted (US), HLS encrypted with AES-128 + 'url': 'http://player.theplatform.com/p/NnzsPC/onsite_universal/select/media/guid/2410887629/2928790?fwsitesection=nbc_the_blacklist_video_library&autoPlay=true&carouselID=137781', + 'only_matching': True, + }] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + # Are whitespaces ignored in URLs? + # https://github.com/ytdl-org/youtube-dl/issues/12044 + for embed_url in super()._extract_embed_urls(url, webpage): + yield re.sub(r'\s', '', embed_url) + + @staticmethod + def _sign_url(url, sig_key, sig_secret, life=600, include_qs=False): + flags = '10' if include_qs else '00' + expiration_date = '%x' % (int(time.time()) + life) + + def str_to_hex(str): + return binascii.b2a_hex(str.encode('ascii')).decode('ascii') + + def hex_to_bytes(hex): + return binascii.a2b_hex(hex.encode('ascii')) + + relative_path = re.match(r'https?://link\.theplatform\.com/s/([^?]+)', url).group(1) + clear_text = hex_to_bytes(flags + expiration_date + str_to_hex(relative_path)) + checksum = hmac.new(sig_key.encode('ascii'), clear_text, hashlib.sha1).hexdigest() + sig = flags + expiration_date + checksum + str_to_hex(sig_secret) + return '%s&sig=%s' % (url, sig) + + def _real_extract(self, url): + url, smuggled_data = unsmuggle_url(url, {}) + self._initialize_geo_bypass({ + 'countries': smuggled_data.get('geo_countries'), + }) + + mobj = self._match_valid_url(url) + provider_id = mobj.group('provider_id') + video_id = mobj.group('id') + + if not provider_id: + provider_id = 'dJ5BDC' + + path = provider_id + '/' + if mobj.group('media'): + path += mobj.group('media') + path += video_id + + qs_dict = parse_qs(url) + if 'guid' in qs_dict: + webpage = self._download_webpage(url, video_id) + scripts = re.findall(r'<script[^>]+src="([^"]+)"', webpage) + feed_id = None + # feed id usually locates in the last script. + # Seems there's no pattern for the interested script filename, so + # I try one by one + for script in reversed(scripts): + feed_script = self._download_webpage( + self._proto_relative_url(script, 'http:'), + video_id, 'Downloading feed script') + feed_id = self._search_regex( + r'defaultFeedId\s*:\s*"([^"]+)"', feed_script, + 'default feed id', default=None) + if feed_id is not None: + break + if feed_id is None: + raise ExtractorError('Unable to find feed id') + return self.url_result('http://feed.theplatform.com/f/%s/%s?byGuid=%s' % ( + provider_id, feed_id, qs_dict['guid'][0])) + + if smuggled_data.get('force_smil_url', False): + smil_url = url + # Explicitly specified SMIL (see https://github.com/ytdl-org/youtube-dl/issues/7385) + elif '/guid/' in url: + headers = {} + source_url = smuggled_data.get('source_url') + if source_url: + headers['Referer'] = source_url + request = Request(url, headers=headers) + webpage = self._download_webpage(request, video_id) + smil_url = self._search_regex( + r'<link[^>]+href=(["\'])(?P<url>.+?)\1[^>]+type=["\']application/smil\+xml', + webpage, 'smil url', group='url') + path = self._search_regex( + r'link\.theplatform\.com/s/((?:[^/?#&]+/)+[^/?#&]+)', smil_url, 'path') + smil_url += '?' if '?' not in smil_url else '&' + 'formats=m3u,mpeg4' + elif mobj.group('config'): + config_url = url + '&form=json' + config_url = config_url.replace('swf/', 'config/') + config_url = config_url.replace('onsite/', 'onsite/config/') + config = self._download_json(config_url, video_id, 'Downloading config') + if 'releaseUrl' in config: + release_url = config['releaseUrl'] + else: + release_url = 'http://link.theplatform.com/s/%s?mbr=true' % path + smil_url = release_url + '&formats=MPEG4&manifest=f4m' + else: + smil_url = 'http://link.theplatform.com/s/%s?mbr=true' % path + + sig = smuggled_data.get('sig') + if sig: + smil_url = self._sign_url(smil_url, sig['key'], sig['secret']) + + formats, subtitles = self._extract_theplatform_smil(smil_url, video_id) + + # With some sites, manifest URL must be forced to extract HLS formats + if not traverse_obj(formats, lambda _, v: v['format_id'].startswith('hls')): + m3u8_url = update_url(url, query='mbr=true&manifest=m3u', fragment=None) + urlh = self._request_webpage( + HEADRequest(m3u8_url), video_id, 'Checking for HLS formats', 'No HLS formats found', fatal=False) + if urlh and urlhandle_detect_ext(urlh) == 'm3u8': + m3u8_fmts, m3u8_subs = self._extract_m3u8_formats_and_subtitles( + m3u8_url, video_id, m3u8_id='hls', fatal=False) + formats.extend(m3u8_fmts) + self._merge_subtitles(m3u8_subs, target=subtitles) + + ret = self._extract_theplatform_metadata(path, video_id) + combined_subtitles = self._merge_subtitles(ret.get('subtitles', {}), subtitles) + ret.update({ + 'id': video_id, + 'formats': formats, + 'subtitles': combined_subtitles, + }) + + return ret + + +class ThePlatformFeedIE(ThePlatformBaseIE): + _URL_TEMPLATE = '%s//feed.theplatform.com/f/%s/%s?form=json&%s' + _VALID_URL = r'https?://feed\.theplatform\.com/f/(?P<provider_id>[^/]+)/(?P<feed_id>[^?/]+)\?(?:[^&]+&)*(?P<filter>by(?:Gui|I)d=(?P<id>[^&]+))' + _TESTS = [{ + # From http://player.theplatform.com/p/7wvmTC/MSNBCEmbeddedOffSite?guid=n_hardball_5biden_140207 + 'url': 'http://feed.theplatform.com/f/7wvmTC/msnbc_video-p-test?form=json&pretty=true&range=-40&byGuid=n_hardball_5biden_140207', + 'md5': '6e32495b5073ab414471b615c5ded394', + 'info_dict': { + 'id': 'n_hardball_5biden_140207', + 'ext': 'mp4', + 'title': 'The Biden factor: will Joe run in 2016?', + 'description': 'Could Vice President Joe Biden be preparing a 2016 campaign? Mark Halperin and Sam Stein weigh in.', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20140208', + 'timestamp': 1391824260, + 'duration': 467.0, + 'categories': ['MSNBC/Issues/Democrats', 'MSNBC/Issues/Elections/Election 2016'], + 'uploader': 'NBCU-NEWS', + }, + }, { + 'url': 'http://feed.theplatform.com/f/2E2eJC/nnd_NBCNews?byGuid=nn_netcast_180306.Copy.01', + 'only_matching': True, + }] + + def _extract_feed_info(self, provider_id, feed_id, filter_query, video_id, custom_fields=None, asset_types_query={}, account_id=None): + real_url = self._URL_TEMPLATE % (self.http_scheme(), provider_id, feed_id, filter_query) + entry = self._download_json(real_url, video_id)['entries'][0] + main_smil_url = 'http://link.theplatform.com/s/%s/media/guid/%d/%s' % (provider_id, account_id, entry['guid']) if account_id else entry.get('plmedia$publicUrl') + + formats = [] + subtitles = {} + first_video_id = None + duration = None + asset_types = [] + for item in entry['media$content']: + smil_url = item['plfile$url'] + cur_video_id = ThePlatformIE._match_id(smil_url) + if first_video_id is None: + first_video_id = cur_video_id + duration = float_or_none(item.get('plfile$duration')) + file_asset_types = item.get('plfile$assetTypes') or parse_qs(smil_url)['assetTypes'] + for asset_type in file_asset_types: + if asset_type in asset_types: + continue + asset_types.append(asset_type) + query = { + 'mbr': 'true', + 'formats': item['plfile$format'], + 'assetTypes': asset_type, + } + if asset_type in asset_types_query: + query.update(asset_types_query[asset_type]) + cur_formats, cur_subtitles = self._extract_theplatform_smil(update_url_query( + main_smil_url or smil_url, query), video_id, 'Downloading SMIL data for %s' % asset_type) + formats.extend(cur_formats) + subtitles = self._merge_subtitles(subtitles, cur_subtitles) + + thumbnails = [{ + 'url': thumbnail['plfile$url'], + 'width': int_or_none(thumbnail.get('plfile$width')), + 'height': int_or_none(thumbnail.get('plfile$height')), + } for thumbnail in entry.get('media$thumbnails', [])] + + timestamp = int_or_none(entry.get('media$availableDate'), scale=1000) + categories = [item['media$name'] for item in entry.get('media$categories', [])] + + ret = self._extract_theplatform_metadata('%s/%s' % (provider_id, first_video_id), video_id) + subtitles = self._merge_subtitles(subtitles, ret['subtitles']) + ret.update({ + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'duration': duration, + 'timestamp': timestamp, + 'categories': categories, + }) + if custom_fields: + ret.update(custom_fields(entry)) + + return ret + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + + video_id = mobj.group('id') + provider_id = mobj.group('provider_id') + feed_id = mobj.group('feed_id') + filter_query = mobj.group('filter') + + return self._extract_feed_info(provider_id, feed_id, filter_query, video_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/thestar.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thestar.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/thestar.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/thestar.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/thesun.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thesun.py new file mode 100644 index 0000000..5edcf1c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/thesun.py @@ -0,0 +1,43 @@ +import re + +from .common import InfoExtractor +from ..utils import extract_attributes + + +class TheSunIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?the-?sun(\.co\.uk|\.com)/[^/]+/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.thesun.co.uk/tvandshowbiz/2261604/orlando-bloom-and-katy-perry-post-adorable-instagram-video-together-celebrating-thanksgiving-after-split-rumours/', + 'info_dict': { + 'id': '2261604', + 'title': 'md5:cba22f48bad9218b64d5bbe0e16afddf', + }, + 'playlist_count': 2, + }, { + 'url': 'https://www.the-sun.com/entertainment/7611415/1000lb-sisters-fans-rip-amy-dangerous-health-decision/', + 'info_dict': { + 'id': '7611415', + 'title': 'md5:e0b9b976f79dc770e5c80f22f40bb844', + }, + 'playlist_count': 1, + }] + BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/%s/default_default/index.html?videoId=%s' + + def _real_extract(self, url): + article_id = self._match_id(url) + + webpage = self._download_webpage(url, article_id) + + entries = [] + for video in re.findall( + r'<video[^>]+data-video-id-pending=[^>]+>', + webpage): + attrs = extract_attributes(video) + video_id = attrs['data-video-id-pending'] + account_id = attrs.get('data-account', '5067014667001') + entries.append(self.url_result( + self.BRIGHTCOVE_URL_TEMPLATE % (account_id, video_id), + 'BrightcoveNew', video_id)) + + return self.playlist_result( + entries, article_id, self._og_search_title(webpage, fatal=False)) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/theweatherchannel.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/theweatherchannel.py new file mode 100644 index 0000000..d1921e4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/theweatherchannel.py @@ -0,0 +1,99 @@ +import json + +from .theplatform import ThePlatformIE +from ..utils import ( + determine_ext, + parse_duration, + parse_iso8601, +) + + +class TheWeatherChannelIE(ThePlatformIE): # XXX: Do not subclass from concrete IE + _VALID_URL = r'https?://(?:www\.)?weather\.com(?P<asset_name>(?:/(?P<locale>[a-z]{2}-[A-Z]{2}))?/(?:[^/]+/)*video/(?P<id>[^/?#]+))' + _TESTS = [{ + 'url': 'https://weather.com/storms/hurricane/video/invest-95l-in-atlantic-has-a-medium-chance-of-development', + 'md5': '68f0cf616435683f27ce36bd9c927394', + 'info_dict': { + 'id': '81acef2d-ee8c-4545-ba83-bff3cc80db97', + 'ext': 'mp4', + 'title': 'Invest 95L In Atlantic Has A Medium Chance Of Development', + 'description': 'md5:0de720fd5f0d0e32207bd4c270fff824', + 'uploader': 'TWC - Digital', + 'uploader_id': 'b5a999e0-9e04-11e1-9ee2-001d092f5a10', + 'upload_date': '20230721', + 'timestamp': 1689967343, + 'display_id': 'invest-95l-in-atlantic-has-a-medium-chance-of-development', + 'duration': 34.0, + } + }, { + 'url': 'https://weather.com/en-CA/international/videos/video/unidentified-object-falls-from-sky-in-india', + 'only_matching': True, + }] + + def _real_extract(self, url): + asset_name, locale, display_id = self._match_valid_url(url).groups() + if not locale: + locale = 'en-US' + video_data = list(self._download_json( + 'https://weather.com/api/v1/p/redux-dal', display_id, data=json.dumps([{ + 'name': 'getCMSAssetsUrlConfig', + 'params': { + 'language': locale.replace('-', '_'), + 'query': { + 'assetName': { + '$in': asset_name, + }, + }, + } + }]).encode(), headers={ + 'Content-Type': 'application/json', + })['dal']['getCMSAssetsUrlConfig'].values())[0]['data'][0] + video_id = video_data['id'] + seo_meta = video_data.get('seometa', {}) + title = video_data.get('title') or seo_meta['title'] + + urls = [] + thumbnails = [] + formats = [] + for variant_id, variant_url in video_data.get('variants', []).items(): + variant_url = variant_url.strip() + if not variant_url or variant_url in urls: + continue + urls.append(variant_url) + ext = determine_ext(variant_url) + if ext == 'jpg': + thumbnails.append({ + 'url': variant_url, + 'id': variant_id, + }) + elif ThePlatformIE.suitable(variant_url): + tp_formats, _ = self._extract_theplatform_smil(variant_url, video_id) + formats.extend(tp_formats) + elif ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + variant_url, video_id, 'mp4', 'm3u8_native', + m3u8_id=variant_id, fatal=False)) + elif ext == 'f4m': + formats.extend(self._extract_f4m_formats( + variant_url, video_id, f4m_id=variant_id, fatal=False)) + else: + formats.append({ + 'url': variant_url, + 'format_id': variant_id, + }) + + cc_url = video_data.get('cc_url') + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': video_data.get('description') or seo_meta.get('description') or seo_meta.get('og:description'), + 'duration': parse_duration(video_data.get('duration')), + 'uploader': video_data.get('providername'), + 'uploader_id': video_data.get('providerid'), + 'timestamp': parse_iso8601(video_data.get('publishdate')), + 'subtitles': {locale[:2]: [{'url': cc_url}]} if cc_url else None, + 'thumbnails': thumbnails, + 'formats': formats, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/thisamericanlife.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thisamericanlife.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/thisamericanlife.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/thisamericanlife.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/thisav.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thisav.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/thisav.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/thisav.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/thisoldhouse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thisoldhouse.py new file mode 100644 index 0000000..cc7beee --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/thisoldhouse.py @@ -0,0 +1,55 @@ +from .common import InfoExtractor +from ..networking import HEADRequest + + +class ThisOldHouseIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?thisoldhouse\.com/(?:watch|how-to|tv-episode|(?:[^/]+/)?\d+)/(?P<id>[^/?#]+)' + _TESTS = [{ + 'url': 'https://www.thisoldhouse.com/how-to/how-to-build-storage-bench', + 'info_dict': { + 'id': '5dcdddf673c3f956ef5db202', + 'ext': 'mp4', + 'title': 'How to Build a Storage Bench', + 'description': 'In the workshop, Tom Silva and Kevin O\'Connor build a storage bench for an entryway.', + 'timestamp': 1442548800, + 'upload_date': '20150918', + 'duration': 674, + 'view_count': int, + 'average_rating': 0, + 'thumbnail': r're:^https?://.*\.jpg\?\d+$', + 'display_id': 'how-to-build-a-storage-bench', + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://www.thisoldhouse.com/watch/arlington-arts-crafts-arts-and-crafts-class-begins', + 'only_matching': True, + }, { + 'url': 'https://www.thisoldhouse.com/tv-episode/ask-toh-shelf-rough-electric', + 'only_matching': True, + }, { + 'url': 'https://www.thisoldhouse.com/furniture/21017078/how-to-build-a-storage-bench', + 'only_matching': True, + }, { + 'url': 'https://www.thisoldhouse.com/21113884/s41-e13-paradise-lost', + 'only_matching': True, + }, { + # iframe www.thisoldhouse.com + 'url': 'https://www.thisoldhouse.com/21083431/seaside-transformation-the-westerly-project', + 'only_matching': True, + }] + _ZYPE_TMPL = 'https://player.zype.com/embed/%s.html?api_key=hsOk_yMSPYNrT22e9pu8hihLXjaZf0JW5jsOWv4ZqyHJFvkJn6rtToHl09tbbsbe' + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + if 'To Unlock This content' in webpage: + self.raise_login_required(method='cookies') + video_url = self._search_regex( + r'<iframe[^>]+src=[\'"]((?:https?:)?//(?:www\.)?thisoldhouse\.(?:chorus\.build|com)/videos/zype/([0-9a-f]{24})[^\'"]*)[\'"]', + webpage, 'video url') + if 'subscription_required=true' in video_url or 'c-entry-group-labels__image' in webpage: + return self.url_result(self._request_webpage(HEADRequest(video_url), display_id).url, 'Zype', display_id) + video_id = self._search_regex(r'(?:https?:)?//(?:www\.)?thisoldhouse\.(?:chorus\.build|com)/videos/zype/([0-9a-f]{24})', video_url, 'video id') + return self.url_result(self._ZYPE_TMPL % video_id, 'Zype', video_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/thisvid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/thisvid.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/thisvid.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/thisvid.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/threeqsdn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/threeqsdn.py new file mode 100644 index 0000000..7841f8d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/threeqsdn.py @@ -0,0 +1,156 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + determine_ext, + ExtractorError, + float_or_none, + int_or_none, + join_nonempty, + parse_iso8601, +) + + +class ThreeQSDNIE(InfoExtractor): + IE_NAME = '3qsdn' + IE_DESC = '3Q SDN' + _VALID_URL = r'https?://playout\.3qsdn\.com/(?P<id>[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})' + _EMBED_REGEX = [r'<iframe[^>]+\b(?:data-)?src=(["\'])(?P<url>%s.*?)\1' % _VALID_URL] + _TESTS = [{ + # https://player.3qsdn.com/demo.html + 'url': 'https://playout.3qsdn.com/7201c779-6b3c-11e7-a40e-002590c750be', + 'md5': '64a57396b16fa011b15e0ea60edce918', + 'info_dict': { + 'id': '7201c779-6b3c-11e7-a40e-002590c750be', + 'ext': 'mp4', + 'title': 'Video Ads', + 'is_live': False, + 'description': 'Video Ads Demo', + 'timestamp': 1500334803, + 'upload_date': '20170717', + 'duration': 888.032, + 'subtitles': { + 'eng': 'count:1', + }, + }, + 'expected_warnings': ['Unknown MIME type application/mp4 in DASH manifest'], + }, { + # live video stream + 'url': 'https://playout.3qsdn.com/66e68995-11ca-11e8-9273-002590c750be', + 'info_dict': { + 'id': '66e68995-11ca-11e8-9273-002590c750be', + 'ext': 'mp4', + 'title': 're:^66e68995-11ca-11e8-9273-002590c750be [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'is_live': True, + }, + 'params': { + 'skip_download': True, # m3u8 downloads + }, + }, { + # live audio stream + 'url': 'http://playout.3qsdn.com/9edf36e0-6bf2-11e2-a16a-9acf09e2db48', + 'only_matching': True, + }, { + # live audio stream with some 404 URLs + 'url': 'http://playout.3qsdn.com/ac5c3186-777a-11e2-9c30-9acf09e2db48', + 'only_matching': True, + }, { + # geo restricted with 'This content is not available in your country' + 'url': 'http://playout.3qsdn.com/d63a3ffe-75e8-11e2-9c30-9acf09e2db48', + 'only_matching': True, + }, { + # geo restricted with 'playout.3qsdn.com/forbidden' + 'url': 'http://playout.3qsdn.com/8e330f26-6ae2-11e2-a16a-9acf09e2db48', + 'only_matching': True, + }, { + # live video with rtmp link + 'url': 'https://playout.3qsdn.com/6092bb9e-8f72-11e4-a173-002590c750be', + 'only_matching': True, + }, { + # ondemand from http://www.philharmonie.tv/veranstaltung/26/ + 'url': 'http://playout.3qsdn.com/0280d6b9-1215-11e6-b427-0cc47a188158?protocol=http', + 'only_matching': True, + }, { + # live video stream + 'url': 'https://playout.3qsdn.com/d755d94b-4ab9-11e3-9162-0025907ad44f?js=true', + 'only_matching': True, + }] + + def _extract_from_webpage(self, url, webpage): + for res in super()._extract_from_webpage(url, webpage): + yield { + **res, + '_type': 'url_transparent', + 'uploader': self._search_regex(r'^(?:https?://)?([^/]*)/.*', url, 'video uploader'), + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + try: + config = self._download_json( + url.replace('://playout.3qsdn.com/', '://playout.3qsdn.com/config/'), video_id) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + self.raise_geo_restricted() + raise + + live = config.get('streamContent') == 'live' + aspect = float_or_none(config.get('aspect')) + + formats = [] + subtitles = {} + for source_type, source in (config.get('sources') or {}).items(): + if not source: + continue + if source_type == 'dash': + fmts, subs = self._extract_mpd_formats_and_subtitles( + source, video_id, mpd_id='mpd', fatal=False) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + elif source_type == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + source, video_id, 'mp4', live=live, m3u8_id='hls', fatal=False) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + elif source_type == 'progressive': + for s in source: + src = s.get('src') + if not (src and self._is_valid_url(src, video_id)): + continue + ext = determine_ext(src) + height = int_or_none(s.get('height')) + formats.append({ + 'ext': ext, + 'format_id': join_nonempty('http', ext, height and '%dp' % height), + 'height': height, + 'source_preference': 0, + 'url': src, + 'vcodec': 'none' if height == 0 else None, + 'width': int(height * aspect) if height and aspect else None, + }) + + for subtitle in (config.get('subtitles') or []): + src = subtitle.get('src') + if not src: + continue + subtitles.setdefault(subtitle.get('label') or 'eng', []).append({ + 'url': src, + }) + + title = config.get('title') or video_id + + return { + 'id': video_id, + 'title': title, + 'thumbnail': config.get('poster') or None, + 'description': config.get('description') or None, + 'timestamp': parse_iso8601(config.get('upload_date')), + 'duration': float_or_none(config.get('vlength')) or None, + 'is_live': live, + 'formats': formats, + 'subtitles': subtitles, + # It seems like this would be correctly handled by default + # However, unless someone can confirm this, the old + # behaviour is being kept as-is + '_format_sort_fields': ('res', 'source_preference') + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/threespeak.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/threespeak.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/threespeak.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/threespeak.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tiktok.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tiktok.py new file mode 100644 index 0000000..f26972c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tiktok.py @@ -0,0 +1,1289 @@ +import itertools +import json +import random +import re +import string +import time + +from .common import InfoExtractor +from ..compat import compat_urllib_parse_unquote, compat_urllib_parse_urlparse +from ..networking import HEADRequest +from ..utils import ( + ExtractorError, + LazyList, + UnsupportedError, + UserNotLive, + determine_ext, + format_field, + get_first, + int_or_none, + join_nonempty, + merge_dicts, + qualities, + remove_start, + srt_subtitles_timecode, + str_or_none, + traverse_obj, + try_call, + try_get, + url_or_none, +) + + +class TikTokBaseIE(InfoExtractor): + _APP_VERSIONS = [('26.1.3', '260103'), ('26.1.2', '260102'), ('26.1.1', '260101'), ('25.6.2', '250602')] + _WORKING_APP_VERSION = None + _APP_NAME = 'trill' + _AID = 1180 + _UPLOADER_URL_FORMAT = 'https://www.tiktok.com/@%s' + _WEBPAGE_HOST = 'https://www.tiktok.com/' + QUALITIES = ('360p', '540p', '720p', '1080p') + + @property + def _API_HOSTNAME(self): + return self._configuration_arg( + 'api_hostname', ['api16-normal-c-useast1a.tiktokv.com'], ie_key=TikTokIE)[0] + + @staticmethod + def _create_url(user_id, video_id): + return f'https://www.tiktok.com/@{user_id or "_"}/video/{video_id}' + + def _get_sigi_state(self, webpage, display_id): + return self._search_json( + r'<script[^>]+\bid="(?:SIGI_STATE|sigi-persisted-data)"[^>]*>', webpage, + 'sigi state', display_id, end_pattern=r'</script>') + + def _call_api_impl(self, ep, query, manifest_app_version, video_id, fatal=True, + note='Downloading API JSON', errnote='Unable to download API page'): + self._set_cookie(self._API_HOSTNAME, 'odin_tt', ''.join(random.choices('0123456789abcdef', k=160))) + webpage_cookies = self._get_cookies(self._WEBPAGE_HOST) + if webpage_cookies.get('sid_tt'): + self._set_cookie(self._API_HOSTNAME, 'sid_tt', webpage_cookies['sid_tt'].value) + return self._download_json( + 'https://%s/aweme/v1/%s/' % (self._API_HOSTNAME, ep), video_id=video_id, + fatal=fatal, note=note, errnote=errnote, headers={ + 'User-Agent': f'com.ss.android.ugc.{self._APP_NAME}/{manifest_app_version} (Linux; U; Android 13; en_US; Pixel 7; Build/TD1A.220804.031; Cronet/58.0.2991.0)', + 'Accept': 'application/json', + }, query=query) + + def _build_api_query(self, query, app_version, manifest_app_version): + return { + **query, + 'version_name': app_version, + 'version_code': manifest_app_version, + 'build_number': app_version, + 'manifest_version_code': manifest_app_version, + 'update_version_code': manifest_app_version, + 'openudid': ''.join(random.choices('0123456789abcdef', k=16)), + 'uuid': ''.join(random.choices(string.digits, k=16)), + '_rticket': int(time.time() * 1000), + 'ts': int(time.time()), + 'device_brand': 'Google', + 'device_type': 'Pixel 7', + 'device_platform': 'android', + 'resolution': '1080*2400', + 'dpi': 420, + 'os_version': '13', + 'os_api': '29', + 'carrier_region': 'US', + 'sys_region': 'US', + 'region': 'US', + 'app_name': self._APP_NAME, + 'app_language': 'en', + 'language': 'en', + 'timezone_name': 'America/New_York', + 'timezone_offset': '-14400', + 'channel': 'googleplay', + 'ac': 'wifi', + 'mcc_mnc': '310260', + 'is_my_cn': 0, + 'aid': self._AID, + 'ssmix': 'a', + 'as': 'a1qwert123', + 'cp': 'cbfhckdckkde1', + } + + def _call_api(self, ep, query, video_id, fatal=True, + note='Downloading API JSON', errnote='Unable to download API page'): + if not self._WORKING_APP_VERSION: + app_version = self._configuration_arg('app_version', [''], ie_key=TikTokIE.ie_key())[0] + manifest_app_version = self._configuration_arg('manifest_app_version', [''], ie_key=TikTokIE.ie_key())[0] + if app_version and manifest_app_version: + self._WORKING_APP_VERSION = (app_version, manifest_app_version) + self.write_debug('Imported app version combo from extractor arguments') + elif app_version or manifest_app_version: + self.report_warning('Only one of the two required version params are passed as extractor arguments', only_once=True) + + if self._WORKING_APP_VERSION: + app_version, manifest_app_version = self._WORKING_APP_VERSION + real_query = self._build_api_query(query, app_version, manifest_app_version) + return self._call_api_impl(ep, real_query, manifest_app_version, video_id, fatal, note, errnote) + + for count, (app_version, manifest_app_version) in enumerate(self._APP_VERSIONS, start=1): + real_query = self._build_api_query(query, app_version, manifest_app_version) + try: + res = self._call_api_impl(ep, real_query, manifest_app_version, video_id, fatal, note, errnote) + self._WORKING_APP_VERSION = (app_version, manifest_app_version) + return res + except ExtractorError as e: + if isinstance(e.cause, json.JSONDecodeError) and e.cause.pos == 0: + if count == len(self._APP_VERSIONS): + if fatal: + raise e + else: + self.report_warning(str(e.cause or e.msg)) + return + self.report_warning('%s. Retrying... (attempt %s of %s)' % (str(e.cause or e.msg), count, len(self._APP_VERSIONS))) + continue + raise e + + def _extract_aweme_app(self, aweme_id): + feed_list = self._call_api( + 'feed', {'aweme_id': aweme_id}, aweme_id, note='Downloading video feed', + errnote='Unable to download video feed').get('aweme_list') or [] + aweme_detail = next((aweme for aweme in feed_list if str(aweme.get('aweme_id')) == aweme_id), None) + if not aweme_detail: + raise ExtractorError('Unable to find video in feed', video_id=aweme_id) + return self._parse_aweme_video_app(aweme_detail) + + def _get_subtitles(self, aweme_detail, aweme_id): + # TODO: Extract text positioning info + subtitles = {} + # aweme/detail endpoint subs + captions_info = traverse_obj( + aweme_detail, ('interaction_stickers', ..., 'auto_video_caption_info', 'auto_captions', ...), expected_type=dict) + for caption in captions_info: + caption_url = traverse_obj(caption, ('url', 'url_list', ...), expected_type=url_or_none, get_all=False) + if not caption_url: + continue + caption_json = self._download_json( + caption_url, aweme_id, note='Downloading captions', errnote='Unable to download captions', fatal=False) + if not caption_json: + continue + subtitles.setdefault(caption.get('language', 'en'), []).append({ + 'ext': 'srt', + 'data': '\n\n'.join( + f'{i + 1}\n{srt_subtitles_timecode(line["start_time"] / 1000)} --> {srt_subtitles_timecode(line["end_time"] / 1000)}\n{line["text"]}' + for i, line in enumerate(caption_json['utterances']) if line.get('text')) + }) + # feed endpoint subs + if not subtitles: + for caption in traverse_obj(aweme_detail, ('video', 'cla_info', 'caption_infos', ...), expected_type=dict): + if not caption.get('url'): + continue + subtitles.setdefault(caption.get('lang') or 'en', []).append({ + 'ext': remove_start(caption.get('caption_format'), 'web'), + 'url': caption['url'], + }) + # webpage subs + if not subtitles: + for caption in traverse_obj(aweme_detail, ('video', 'subtitleInfos', ...), expected_type=dict): + if not caption.get('Url'): + continue + subtitles.setdefault(caption.get('LanguageCodeName') or 'en', []).append({ + 'ext': remove_start(caption.get('Format'), 'web'), + 'url': caption['Url'], + }) + return subtitles + + def _parse_aweme_video_app(self, aweme_detail): + aweme_id = aweme_detail['aweme_id'] + video_info = aweme_detail['video'] + + def parse_url_key(url_key): + format_id, codec, res, bitrate = self._search_regex( + r'v[^_]+_(?P<id>(?P<codec>[^_]+)_(?P<res>\d+p)_(?P<bitrate>\d+))', url_key, + 'url key', default=(None, None, None, None), group=('id', 'codec', 'res', 'bitrate')) + if not format_id: + return {}, None + return { + 'format_id': format_id, + 'vcodec': 'h265' if codec == 'bytevc1' else codec, + 'tbr': int_or_none(bitrate, scale=1000) or None, + 'quality': qualities(self.QUALITIES)(res), + }, res + + known_resolutions = {} + + def audio_meta(url): + ext = determine_ext(url, default_ext='m4a') + return { + 'format_note': 'Music track', + 'ext': ext, + 'acodec': 'aac' if ext == 'm4a' else ext, + 'vcodec': 'none', + 'width': None, + 'height': None, + } if ext == 'mp3' or '-music-' in url else {} + + def extract_addr(addr, add_meta={}): + parsed_meta, res = parse_url_key(addr.get('url_key', '')) + if res: + known_resolutions.setdefault(res, {}).setdefault('height', add_meta.get('height') or addr.get('height')) + known_resolutions[res].setdefault('width', add_meta.get('width') or addr.get('width')) + parsed_meta.update(known_resolutions.get(res, {})) + add_meta.setdefault('height', int_or_none(res[:-1])) + return [{ + 'url': url, + 'filesize': int_or_none(addr.get('data_size')), + 'ext': 'mp4', + 'acodec': 'aac', + 'source_preference': -2 if 'aweme/v1' in url else -1, # Downloads from API might get blocked + **add_meta, **parsed_meta, + 'format_note': join_nonempty( + add_meta.get('format_note'), '(API)' if 'aweme/v1' in url else None, delim=' '), + **audio_meta(url), + } for url in addr.get('url_list') or []] + + # Hack: Add direct video links first to prioritize them when removing duplicate formats + formats = [] + if video_info.get('play_addr'): + formats.extend(extract_addr(video_info['play_addr'], { + 'format_id': 'play_addr', + 'format_note': 'Direct video', + 'vcodec': 'h265' if traverse_obj( + video_info, 'is_bytevc1', 'is_h265') else 'h264', # TODO: Check for "direct iOS" videos, like https://www.tiktok.com/@cookierun_dev/video/7039716639834656002 + 'width': video_info.get('width'), + 'height': video_info.get('height'), + })) + if video_info.get('download_addr'): + formats.extend(extract_addr(video_info['download_addr'], { + 'format_id': 'download_addr', + 'format_note': 'Download video%s' % (', watermarked' if video_info.get('has_watermark') else ''), + 'vcodec': 'h264', + 'width': video_info.get('width'), + 'height': video_info.get('height'), + 'preference': -2 if video_info.get('has_watermark') else -1, + })) + if video_info.get('play_addr_h264'): + formats.extend(extract_addr(video_info['play_addr_h264'], { + 'format_id': 'play_addr_h264', + 'format_note': 'Direct video', + 'vcodec': 'h264', + })) + if video_info.get('play_addr_bytevc1'): + formats.extend(extract_addr(video_info['play_addr_bytevc1'], { + 'format_id': 'play_addr_bytevc1', + 'format_note': 'Direct video', + 'vcodec': 'h265', + })) + + for bitrate in video_info.get('bit_rate', []): + if bitrate.get('play_addr'): + formats.extend(extract_addr(bitrate['play_addr'], { + 'format_id': bitrate.get('gear_name'), + 'format_note': 'Playback video', + 'tbr': try_get(bitrate, lambda x: x['bit_rate'] / 1000), + 'vcodec': 'h265' if traverse_obj( + bitrate, 'is_bytevc1', 'is_h265') else 'h264', + 'fps': bitrate.get('FPS'), + })) + + self._remove_duplicate_formats(formats) + auth_cookie = self._get_cookies(self._WEBPAGE_HOST).get('sid_tt') + if auth_cookie: + for f in formats: + self._set_cookie(compat_urllib_parse_urlparse(f['url']).hostname, 'sid_tt', auth_cookie.value) + + thumbnails = [] + for cover_id in ('cover', 'ai_dynamic_cover', 'animated_cover', 'ai_dynamic_cover_bak', + 'origin_cover', 'dynamic_cover'): + for cover_url in traverse_obj(video_info, (cover_id, 'url_list', ...)): + thumbnails.append({ + 'id': cover_id, + 'url': cover_url, + }) + + stats_info = aweme_detail.get('statistics') or {} + author_info = aweme_detail.get('author') or {} + music_info = aweme_detail.get('music') or {} + user_url = self._UPLOADER_URL_FORMAT % (traverse_obj(author_info, + 'sec_uid', 'id', 'uid', 'unique_id', + expected_type=str_or_none, get_all=False)) + labels = traverse_obj(aweme_detail, ('hybrid_label', ..., 'text'), expected_type=str) + + contained_music_track = traverse_obj( + music_info, ('matched_song', 'title'), ('matched_pgc_sound', 'title'), expected_type=str) + contained_music_author = traverse_obj( + music_info, ('matched_song', 'author'), ('matched_pgc_sound', 'author'), 'author', expected_type=str) + + is_generic_og_trackname = music_info.get('is_original_sound') and music_info.get('title') == 'original sound - %s' % music_info.get('owner_handle') + if is_generic_og_trackname: + music_track, music_author = contained_music_track or 'original sound', contained_music_author + else: + music_track, music_author = music_info.get('title'), music_info.get('author') + + return { + 'id': aweme_id, + 'extractor_key': TikTokIE.ie_key(), + 'extractor': TikTokIE.IE_NAME, + 'webpage_url': self._create_url(author_info.get('uid'), aweme_id), + **traverse_obj(aweme_detail, { + 'title': ('desc', {str}), + 'description': ('desc', {str}), + 'timestamp': ('create_time', {int_or_none}), + }), + **traverse_obj(stats_info, { + 'view_count': 'play_count', + 'like_count': 'digg_count', + 'repost_count': 'share_count', + 'comment_count': 'comment_count', + }, expected_type=int_or_none), + **traverse_obj(author_info, { + 'uploader': 'unique_id', + 'uploader_id': 'uid', + 'creator': 'nickname', + 'channel_id': 'sec_uid', + }, expected_type=str_or_none), + 'uploader_url': user_url, + 'track': music_track, + 'album': str_or_none(music_info.get('album')) or None, + 'artist': music_author or None, + 'formats': formats, + 'subtitles': self.extract_subtitles(aweme_detail, aweme_id), + 'thumbnails': thumbnails, + 'duration': int_or_none(traverse_obj(video_info, 'duration', ('download_addr', 'duration')), scale=1000), + 'availability': self._availability( + is_private='Private' in labels, + needs_subscription='Friends only' in labels, + is_unlisted='Followers only' in labels), + '_format_sort_fields': ('quality', 'codec', 'size', 'br'), + } + + def _parse_aweme_video_web(self, aweme_detail, webpage_url, video_id): + video_info = aweme_detail['video'] + author_info = traverse_obj(aweme_detail, 'authorInfo', 'author', expected_type=dict, default={}) + music_info = aweme_detail.get('music') or {} + stats_info = aweme_detail.get('stats') or {} + channel_id = traverse_obj(author_info or aweme_detail, (('authorSecId', 'secUid'), {str}), get_all=False) + user_url = self._UPLOADER_URL_FORMAT % channel_id if channel_id else None + + formats = [] + width = int_or_none(video_info.get('width')) + height = int_or_none(video_info.get('height')) + + for play_url in traverse_obj(video_info, ('playAddr', ((..., 'src'), None), {url_or_none})): + formats.append({ + 'url': self._proto_relative_url(play_url), + 'ext': 'mp4', + 'width': width, + 'height': height, + }) + + for download_url in traverse_obj(video_info, (('downloadAddr', ('download', 'url')), {url_or_none})): + formats.append({ + 'format_id': 'download', + 'url': self._proto_relative_url(download_url), + 'ext': 'mp4', + 'width': width, + 'height': height, + }) + + self._remove_duplicate_formats(formats) + + thumbnails = [] + for thumb_url in traverse_obj(aweme_detail, ( + (None, 'video'), ('thumbnail', 'cover', 'dynamicCover', 'originCover'), {url_or_none})): + thumbnails.append({ + 'url': self._proto_relative_url(thumb_url), + 'width': width, + 'height': height, + }) + + return { + 'id': video_id, + **traverse_obj(aweme_detail, { + 'title': ('desc', {str}), + 'description': ('desc', {str}), + 'duration': ('video', 'duration', {int_or_none}), + 'timestamp': ('createTime', {int_or_none}), + }), + **traverse_obj(author_info or aweme_detail, { + 'creator': ('nickname', {str}), + 'uploader': (('uniqueId', 'author'), {str}), + 'uploader_id': (('authorId', 'uid', 'id'), {str_or_none}), + }, get_all=False), + **traverse_obj(stats_info, { + 'view_count': 'playCount', + 'like_count': 'diggCount', + 'repost_count': 'shareCount', + 'comment_count': 'commentCount', + }, expected_type=int_or_none), + **traverse_obj(music_info, { + 'track': 'title', + 'album': ('album', {lambda x: x or None}), + 'artist': 'authorName', + }, expected_type=str), + 'channel_id': channel_id, + 'uploader_url': user_url, + 'formats': formats, + 'thumbnails': thumbnails, + 'http_headers': { + 'Referer': webpage_url, + } + } + + +class TikTokIE(TikTokBaseIE): + _VALID_URL = r'https?://www\.tiktok\.com/(?:embed|@(?P<user_id>[\w\.-]+)?/video)/(?P<id>\d+)' + _EMBED_REGEX = [rf'<(?:script|iframe)[^>]+\bsrc=(["\'])(?P<url>{_VALID_URL})'] + + _TESTS = [{ + 'url': 'https://www.tiktok.com/@leenabhushan/video/6748451240264420610', + 'md5': '736bb7a466c6f0a6afeb597da1e6f5b7', + 'info_dict': { + 'id': '6748451240264420610', + 'ext': 'mp4', + 'title': '#jassmanak #lehanga #leenabhushan', + 'description': '#jassmanak #lehanga #leenabhushan', + 'duration': 13, + 'height': 1024, + 'width': 576, + 'uploader': 'leenabhushan', + 'uploader_id': '6691488002098119685', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA_Eb4t1vodM1IuTy_cvp9CY22RAb59xqrO0Xtz9CYQJvgXaDvZxYnZYRzDWhhgJmy', + 'creator': 'facestoriesbyleenabh', + 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', + 'upload_date': '20191016', + 'timestamp': 1571246252, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'artist': 'Ysrbeats', + 'album': 'Lehanga', + 'track': 'Lehanga', + }, + 'skip': '404 Not Found', + }, { + 'url': 'https://www.tiktok.com/@patroxofficial/video/6742501081818877190?langCountry=en', + 'md5': '6f3cf8cdd9b28cb8363fe0a9a160695b', + 'info_dict': { + 'id': '6742501081818877190', + 'ext': 'mp4', + 'title': 'md5:5e2a23877420bb85ce6521dbee39ba94', + 'description': 'md5:5e2a23877420bb85ce6521dbee39ba94', + 'duration': 27, + 'height': 960, + 'width': 540, + 'uploader': 'patrox', + 'uploader_id': '18702747', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws', + 'channel_id': 'MS4wLjABAAAAiFnldaILebi5heDoVU6bn4jBWWycX6-9U3xuNPqZ8Ws', + 'creator': 'patroX', + 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', + 'upload_date': '20190930', + 'timestamp': 1569860870, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'artist': 'Evan Todd, Jessica Keenan Wynn, Alice Lee, Barrett Wilbert Weed & Jon Eidson', + 'track': 'Big Fun', + }, + }, { + # Banned audio, only available on the app + 'url': 'https://www.tiktok.com/@barudakhb_/video/6984138651336838402', + 'info_dict': { + 'id': '6984138651336838402', + 'ext': 'mp4', + 'title': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥', + 'description': 'Balas @yolaaftwsr hayu yu ? #SquadRandom_ 🔥', + 'uploader': 'barudakhb_', + 'creator': 'md5:29f238c49bc0c176cb3cef1a9cea9fa6', + 'uploader_id': '6974687867511718913', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d', + 'channel_id': 'MS4wLjABAAAAbhBwQC-R1iKoix6jDFsF-vBdfx2ABoDjaZrM9fX6arU3w71q3cOWgWuTXn1soZ7d', + 'track': 'Boka Dance', + 'artist': 'md5:29f238c49bc0c176cb3cef1a9cea9fa6', + 'timestamp': 1626121503, + 'duration': 18, + 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', + 'upload_date': '20210712', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + }, { + # Sponsored video, only available with feed workaround + 'url': 'https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_/video/7042692929109986561', + 'info_dict': { + 'id': '7042692929109986561', + 'ext': 'mp4', + 'title': 'Slap and Run!', + 'description': 'Slap and Run!', + 'uploader': 'user440922249', + 'creator': 'Slap And Run', + 'uploader_id': '7036055384943690754', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_', + 'channel_id': 'MS4wLjABAAAATh8Vewkn0LYM7Fo03iec3qKdeCUOcBIouRk1mkiag6h3o_pQu_dUXvZ2EZlGST7_', + 'track': 'Promoted Music', + 'timestamp': 1639754738, + 'duration': 30, + 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', + 'upload_date': '20211217', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + 'params': {'skip_download': True}, # XXX: unable to download video data: HTTP Error 403: Forbidden + }, { + # Video without title and description + 'url': 'https://www.tiktok.com/@pokemonlife22/video/7059698374567611694', + 'info_dict': { + 'id': '7059698374567611694', + 'ext': 'mp4', + 'title': 'TikTok video #7059698374567611694', + 'description': '', + 'uploader': 'pokemonlife22', + 'creator': 'Pokemon', + 'uploader_id': '6820838815978423302', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W', + 'channel_id': 'MS4wLjABAAAA0tF1nBwQVVMyrGu3CqttkNgM68Do1OXUFuCY0CRQk8fEtSVDj89HqoqvbSTmUP2W', + 'track': 'original sound', + 'timestamp': 1643714123, + 'duration': 6, + 'thumbnail': r're:^https?://[\w\/\.\-]+(~[\w\-]+\.image)?', + 'upload_date': '20220201', + 'artist': 'Pokemon', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + }, { + # hydration JSON is sent in a <script> element + 'url': 'https://www.tiktok.com/@denidil6/video/7065799023130643713', + 'info_dict': { + 'id': '7065799023130643713', + 'ext': 'mp4', + 'title': '#denidil#денидил', + 'description': '#denidil#денидил', + 'uploader': 'denidil6', + 'uploader_id': '7046664115636405250', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAsvMSzFdQ4ikl3uR2TEJwMBbB2yZh2Zxwhx-WCo3rbDpAharE3GQCrFuJArI3C8QJ', + 'artist': 'Holocron Music', + 'album': 'Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Night', + 'track': 'Wolf Sounds (1 Hour) Enjoy the Company of the Animal That Is the Majestic King of the Night', + 'timestamp': 1645134536, + 'duration': 26, + 'upload_date': '20220217', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + 'skip': 'This video is unavailable', + }, { + # slideshow audio-only mp3 format + 'url': 'https://www.tiktok.com/@_le_cannibale_/video/7139980461132074283', + 'info_dict': { + 'id': '7139980461132074283', + 'ext': 'mp3', + 'title': 'TikTok video #7139980461132074283', + 'description': '', + 'creator': 'Antaura', + 'uploader': '_le_cannibale_', + 'uploader_id': '6604511138619654149', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP', + 'channel_id': 'MS4wLjABAAAAoShJqaw_5gvy48y3azFeFcT4jeyKWbB0VVYasOCt2tTLwjNFIaDcHAM4D-QGXFOP', + 'artist': 'nathan !', + 'track': 'grahamscott canon', + 'upload_date': '20220905', + 'timestamp': 1662406249, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:^https://.+\.webp', + }, + }, { + # only available via web + 'url': 'https://www.tiktok.com/@moxypatch/video/7206382937372134662', + 'md5': '6aba7fad816e8709ff2c149679ace165', + 'info_dict': { + 'id': '7206382937372134662', + 'ext': 'mp4', + 'title': 'md5:1d95c0b96560ca0e8a231af4172b2c0a', + 'description': 'md5:1d95c0b96560ca0e8a231af4172b2c0a', + 'creator': 'MoxyPatch', + 'uploader': 'moxypatch', + 'uploader_id': '7039142049363379205', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4V', + 'channel_id': 'MS4wLjABAAAAFhqKnngMHJSsifL0w1vFOP5kn3Ndo1ODp0XuIBkNMBCkALTvwILdpu12g3pTtL4V', + 'artist': 'your worst nightmare', + 'track': 'original sound', + 'upload_date': '20230303', + 'timestamp': 1677866781, + 'duration': 10, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:^https://.+', + 'thumbnails': 'count:3', + }, + 'expected_warnings': ['Unable to find video in feed'], + }, { + # 1080p format + 'url': 'https://www.tiktok.com/@tatemcrae/video/7107337212743830830', + 'md5': '982512017a8a917124d5a08c8ae79621', + 'info_dict': { + 'id': '7107337212743830830', + 'ext': 'mp4', + 'title': 'new music video 4 don’t come backkkk🧸🖤 i hope u enjoy !! @musicontiktok', + 'description': 'new music video 4 don’t come backkkk🧸🖤 i hope u enjoy !! @musicontiktok', + 'uploader': 'tatemcrae', + 'uploader_id': '86328792343818240', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd', + 'channel_id': 'MS4wLjABAAAA-0bQT0CqebTRr6I4IkYvMDMKSRSJHLNPBo5HrSklJwyA2psXLSZG5FP-LMNpHnJd', + 'creator': 'tate mcrae', + 'artist': 'tate mcrae', + 'track': 'original sound', + 'upload_date': '20220609', + 'timestamp': 1654805899, + 'duration': 150, + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:^https://.+\.webp', + }, + 'params': {'format': 'bytevc1_1080p_808907-0'}, + }, { + # Slideshow, audio-only m4a format + 'url': 'https://www.tiktok.com/@hara_yoimiya/video/7253412088251534594', + 'md5': '2ff8fe0174db2dbf49c597a7bef4e47d', + 'info_dict': { + 'id': '7253412088251534594', + 'ext': 'm4a', + 'title': 'Ñ Ñ€ÐµÐ´ флаг проÑтите #перепиÑка #щитпоÑÑ‚ #тревожныйтиппривÑзанноÑти #рекомендации ', + 'description': 'Ñ Ñ€ÐµÐ´ флаг проÑтите #перепиÑка #щитпоÑÑ‚ #тревожныйтиппривÑзанноÑти #рекомендации ', + 'uploader': 'hara_yoimiya', + 'uploader_id': '6582536342634676230', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB', + 'channel_id': 'MS4wLjABAAAAIAlDxriiPWLE-p8p1R_0Bx8qWKfi-7zwmGhzU8Mv25W8sNxjfIKrol31qTczzuLB', + 'creator': 'лампочка', + 'artist': 'Øneheart', + 'album': 'watching the stars', + 'track': 'watching the stars', + 'upload_date': '20230708', + 'timestamp': 1688816612, + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + 'thumbnail': r're:^https://.+\.webp', + }, + }, { + # Auto-captions available + 'url': 'https://www.tiktok.com/@hankgreen1/video/7047596209028074758', + 'only_matching': True + }] + + def _real_extract(self, url): + video_id, user_id = self._match_valid_url(url).group('id', 'user_id') + try: + return self._extract_aweme_app(video_id) + except ExtractorError as e: + self.report_warning(f'{e}; trying with webpage') + + url = self._create_url(user_id, video_id) + webpage = self._download_webpage(url, video_id, headers={'User-Agent': 'Mozilla/5.0'}) + next_data = self._search_nextjs_data(webpage, video_id, default='{}') + if next_data: + status = traverse_obj(next_data, ('props', 'pageProps', 'statusCode'), expected_type=int) or 0 + video_data = traverse_obj(next_data, ('props', 'pageProps', 'itemInfo', 'itemStruct'), expected_type=dict) + else: + sigi_data = self._get_sigi_state(webpage, video_id) + status = traverse_obj(sigi_data, ('VideoPage', 'statusCode'), expected_type=int) or 0 + video_data = traverse_obj(sigi_data, ('ItemModule', video_id), expected_type=dict) + + if status == 0: + return self._parse_aweme_video_web(video_data, url, video_id) + elif status == 10216: + raise ExtractorError('This video is private', expected=True) + raise ExtractorError('Video not available', video_id=video_id) + + +class TikTokUserIE(TikTokBaseIE): + IE_NAME = 'tiktok:user' + _VALID_URL = r'https?://(?:www\.)?tiktok\.com/@(?P<id>[\w\.-]+)/?(?:$|[#?])' + _WORKING = False + _TESTS = [{ + 'url': 'https://tiktok.com/@corgibobaa?lang=en', + 'playlist_mincount': 45, + 'info_dict': { + 'id': '6935371178089399301', + 'title': 'corgibobaa', + 'thumbnail': r're:https://.+_1080x1080\.webp' + }, + 'expected_warnings': ['Retrying'] + }, { + 'url': 'https://www.tiktok.com/@6820838815978423302', + 'playlist_mincount': 5, + 'info_dict': { + 'id': '6820838815978423302', + 'title': '6820838815978423302', + 'thumbnail': r're:https://.+_1080x1080\.webp' + }, + 'expected_warnings': ['Retrying'] + }, { + 'url': 'https://www.tiktok.com/@meme', + 'playlist_mincount': 593, + 'info_dict': { + 'id': '79005827461758976', + 'title': 'meme', + 'thumbnail': r're:https://.+_1080x1080\.webp' + }, + 'expected_warnings': ['Retrying'] + }] + + r''' # TODO: Fix by adding _signature to api_url + def _entries(self, webpage, user_id, username): + secuid = self._search_regex(r'\"secUid\":\"(?P<secUid>[^\"]+)', webpage, username) + verifyfp_cookie = self._get_cookies('https://www.tiktok.com').get('s_v_web_id') + if not verifyfp_cookie: + raise ExtractorError('Improper cookies (missing s_v_web_id).', expected=True) + api_url = f'https://m.tiktok.com/api/post/item_list/?aid=1988&cookie_enabled=true&count=30&verifyFp={verifyfp_cookie.value}&secUid={secuid}&cursor=' + cursor = '0' + for page in itertools.count(): + data_json = self._download_json(api_url + cursor, username, note='Downloading Page %d' % page) + for video in data_json.get('itemList', []): + video_id = video['id'] + video_url = f'https://www.tiktok.com/@{user_id}/video/{video_id}' + yield self._url_result(video_url, 'TikTok', video_id, str_or_none(video.get('desc'))) + if not data_json.get('hasMore'): + break + cursor = data_json['cursor'] + ''' + + def _video_entries_api(self, webpage, user_id, username): + query = { + 'user_id': user_id, + 'count': 21, + 'max_cursor': 0, + 'min_cursor': 0, + 'retry_type': 'no_retry', + 'device_id': ''.join(random.choices(string.digits, k=19)), # Some endpoints don't like randomized device_id, so it isn't directly set in _call_api. + } + + for page in itertools.count(1): + for retry in self.RetryManager(): + try: + post_list = self._call_api( + 'aweme/post', query, username, note=f'Downloading user video list page {page}', + errnote='Unable to download user video list') + except ExtractorError as e: + if isinstance(e.cause, json.JSONDecodeError) and e.cause.pos == 0: + retry.error = e + continue + raise + yield from post_list.get('aweme_list', []) + if not post_list.get('has_more'): + break + query['max_cursor'] = post_list['max_cursor'] + + def _entries_api(self, user_id, videos): + for video in videos: + yield { + **self._parse_aweme_video_app(video), + 'extractor_key': TikTokIE.ie_key(), + 'extractor': 'TikTok', + 'webpage_url': f'https://tiktok.com/@{user_id}/video/{video["aweme_id"]}', + } + + def _real_extract(self, url): + user_name = self._match_id(url) + webpage = self._download_webpage(url, user_name, headers={ + 'User-Agent': 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)' + }) + user_id = self._html_search_regex(r'snssdk\d*://user/profile/(\d+)', webpage, 'user ID', default=None) or user_name + + videos = LazyList(self._video_entries_api(webpage, user_id, user_name)) + thumbnail = traverse_obj(videos, (0, 'author', 'avatar_larger', 'url_list', 0)) + + return self.playlist_result(self._entries_api(user_id, videos), user_id, user_name, thumbnail=thumbnail) + + +class TikTokBaseListIE(TikTokBaseIE): # XXX: Conventionally, base classes should end with BaseIE/InfoExtractor + def _entries(self, list_id, display_id): + query = { + self._QUERY_NAME: list_id, + 'cursor': 0, + 'count': 20, + 'type': 5, + 'device_id': ''.join(random.choices(string.digits, k=19)) + } + + for page in itertools.count(1): + for retry in self.RetryManager(): + try: + post_list = self._call_api( + self._API_ENDPOINT, query, display_id, note=f'Downloading video list page {page}', + errnote='Unable to download video list') + except ExtractorError as e: + if isinstance(e.cause, json.JSONDecodeError) and e.cause.pos == 0: + retry.error = e + continue + raise + for video in post_list.get('aweme_list', []): + yield { + **self._parse_aweme_video_app(video), + 'extractor_key': TikTokIE.ie_key(), + 'extractor': 'TikTok', + 'webpage_url': f'https://tiktok.com/@_/video/{video["aweme_id"]}', + } + if not post_list.get('has_more'): + break + query['cursor'] = post_list['cursor'] + + def _real_extract(self, url): + list_id = self._match_id(url) + return self.playlist_result(self._entries(list_id, list_id), list_id) + + +class TikTokSoundIE(TikTokBaseListIE): + IE_NAME = 'tiktok:sound' + _VALID_URL = r'https?://(?:www\.)?tiktok\.com/music/[\w\.-]+-(?P<id>[\d]+)[/?#&]?' + _WORKING = False + _QUERY_NAME = 'music_id' + _API_ENDPOINT = 'music/aweme' + _TESTS = [{ + 'url': 'https://www.tiktok.com/music/Build-a-Btch-6956990112127585029?lang=en', + 'playlist_mincount': 100, + 'info_dict': { + 'id': '6956990112127585029' + }, + 'expected_warnings': ['Retrying'] + }, { + # Actual entries are less than listed video count + 'url': 'https://www.tiktok.com/music/jiefei-soap-remix-7036843036118469381', + 'playlist_mincount': 2182, + 'info_dict': { + 'id': '7036843036118469381' + }, + 'expected_warnings': ['Retrying'] + }] + + +class TikTokEffectIE(TikTokBaseListIE): + IE_NAME = 'tiktok:effect' + _VALID_URL = r'https?://(?:www\.)?tiktok\.com/sticker/[\w\.-]+-(?P<id>[\d]+)[/?#&]?' + _WORKING = False + _QUERY_NAME = 'sticker_id' + _API_ENDPOINT = 'sticker/aweme' + _TESTS = [{ + 'url': 'https://www.tiktok.com/sticker/MATERIAL-GWOOORL-1258156', + 'playlist_mincount': 100, + 'info_dict': { + 'id': '1258156', + }, + 'expected_warnings': ['Retrying'] + }, { + # Different entries between mobile and web, depending on region + 'url': 'https://www.tiktok.com/sticker/Elf-Friend-479565', + 'only_matching': True + }] + + +class TikTokTagIE(TikTokBaseListIE): + IE_NAME = 'tiktok:tag' + _VALID_URL = r'https?://(?:www\.)?tiktok\.com/tag/(?P<id>[^/?#&]+)' + _WORKING = False + _QUERY_NAME = 'ch_id' + _API_ENDPOINT = 'challenge/aweme' + _TESTS = [{ + 'url': 'https://tiktok.com/tag/hello2018', + 'playlist_mincount': 39, + 'info_dict': { + 'id': '46294678', + 'title': 'hello2018', + }, + 'expected_warnings': ['Retrying'] + }, { + 'url': 'https://tiktok.com/tag/fypã‚·?is_copy_url=0&is_from_webapp=v1', + 'only_matching': True + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id, headers={ + 'User-Agent': 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)' + }) + tag_id = self._html_search_regex(r'snssdk\d*://challenge/detail/(\d+)', webpage, 'tag ID') + return self.playlist_result(self._entries(tag_id, display_id), tag_id, display_id) + + +class DouyinIE(TikTokBaseIE): + _VALID_URL = r'https?://(?:www\.)?douyin\.com/video/(?P<id>[0-9]+)' + _TESTS = [{ + 'url': 'https://www.douyin.com/video/6961737553342991651', + 'md5': 'a97db7e3e67eb57bf40735c022ffa228', + 'info_dict': { + 'id': '6961737553342991651', + 'ext': 'mp4', + 'title': '#æ¨è¶…è¶Š å°å°æ°´æ‰‹å¸¦ä½ åŽ»è¿œèˆªâ¤ï¸', + 'description': '#æ¨è¶…è¶Š å°å°æ°´æ‰‹å¸¦ä½ åŽ»è¿œèˆªâ¤ï¸', + 'uploader_id': '110403406559', + 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'creator': 'æ¨è¶…è¶Š', + 'duration': 19782, + 'timestamp': 1620905839, + 'upload_date': '20210513', + 'track': '@æ¨è¶…越创作的原声', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:https?://.+\.jpe?g', + }, + }, { + 'url': 'https://www.douyin.com/video/6982497745948921092', + 'md5': '34a87ebff3833357733da3fe17e37c0e', + 'info_dict': { + 'id': '6982497745948921092', + 'ext': 'mp4', + 'title': 'è¿™ä¸ªå¤æ—¥å’Œå°ç¾Š@æ¨è¶…è¶Š 一起é‡è§ç™½è‰²å¹»æƒ³', + 'description': 'è¿™ä¸ªå¤æ—¥å’Œå°ç¾Š@æ¨è¶…è¶Š 一起é‡è§ç™½è‰²å¹»æƒ³', + 'uploader_id': '408654318141572', + 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA', + 'channel_id': 'MS4wLjABAAAAZJpnglcjW2f_CMVcnqA_6oVBXKWMpH0F8LIHuUu8-lA', + 'creator': 'æ¨è¶…越工作室', + 'duration': 42479, + 'timestamp': 1625739481, + 'upload_date': '20210708', + 'track': '@æ¨è¶…越工作室创作的原声', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:https?://.+\.jpe?g', + }, + }, { + 'url': 'https://www.douyin.com/video/6953975910773099811', + 'md5': 'dde3302460f19db59c47060ff013b902', + 'info_dict': { + 'id': '6953975910773099811', + 'ext': 'mp4', + 'title': '#一起看海 å‡ºçŽ°åœ¨ä½ çš„å¤æ—¥é‡Œ', + 'description': '#一起看海 å‡ºçŽ°åœ¨ä½ çš„å¤æ—¥é‡Œ', + 'uploader_id': '110403406559', + 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'creator': 'æ¨è¶…è¶Š', + 'duration': 17343, + 'timestamp': 1619098692, + 'upload_date': '20210422', + 'track': '@æ¨è¶…越创作的原声', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:https?://.+\.jpe?g', + }, + }, { + 'url': 'https://www.douyin.com/video/6950251282489675042', + 'md5': 'b4db86aec367ef810ddd38b1737d2fed', + 'info_dict': { + 'id': '6950251282489675042', + 'ext': 'mp4', + 'title': '哈哈哈,æˆåŠŸäº†å“ˆå“ˆå“ˆå“ˆå“ˆå“ˆ', + 'uploader': 'æ¨è¶…è¶Š', + 'upload_date': '20210412', + 'timestamp': 1618231483, + 'uploader_id': '110403406559', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + }, + 'skip': 'No longer available', + }, { + 'url': 'https://www.douyin.com/video/6963263655114722595', + 'md5': 'cf9f11f0ec45d131445ec2f06766e122', + 'info_dict': { + 'id': '6963263655114722595', + 'ext': 'mp4', + 'title': '#哪个爱豆的105度最甜 æ¢ä¸ªè§’度看看我哈哈', + 'description': '#哪个爱豆的105度最甜 æ¢ä¸ªè§’度看看我哈哈', + 'uploader_id': '110403406559', + 'uploader_url': 'https://www.douyin.com/user/MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'channel_id': 'MS4wLjABAAAAEKnfa654JAJ_N5lgZDQluwsxmY0lhfmEYNQBBkwGG98', + 'creator': 'æ¨è¶…è¶Š', + 'duration': 15115, + 'timestamp': 1621261163, + 'upload_date': '20210517', + 'track': '@æ¨è¶…越创作的原声', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'thumbnail': r're:https?://.+\.jpe?g', + }, + }] + _APP_VERSIONS = [('23.3.0', '230300')] + _APP_NAME = 'aweme' + _AID = 1128 + _API_HOSTNAME = 'aweme.snssdk.com' + _UPLOADER_URL_FORMAT = 'https://www.douyin.com/user/%s' + _WEBPAGE_HOST = 'https://www.douyin.com/' + + def _real_extract(self, url): + video_id = self._match_id(url) + + try: + return self._extract_aweme_app(video_id) + except ExtractorError as e: + e.expected = True + self.to_screen(f'{e}; trying with webpage') + + webpage = self._download_webpage(url, video_id) + render_data = self._search_json( + r'<script [^>]*\bid=[\'"]RENDER_DATA[\'"][^>]*>', webpage, 'render data', video_id, + contains_pattern=r'%7B(?s:.+)%7D', fatal=False, transform_source=compat_urllib_parse_unquote) + if not render_data: + # TODO: Run verification challenge code to generate signature cookies + cookies = self._get_cookies(self._WEBPAGE_HOST) + expected = not cookies.get('s_v_web_id') or not cookies.get('ttwid') + raise ExtractorError( + 'Fresh cookies (not necessarily logged in) are needed', expected=expected) + + return self._parse_aweme_video_web(get_first(render_data, ('aweme', 'detail')), url, video_id) + + +class TikTokVMIE(InfoExtractor): + _VALID_URL = r'https?://(?:(?:vm|vt)\.tiktok\.com|(?:www\.)tiktok\.com/t)/(?P<id>\w+)' + IE_NAME = 'vm.tiktok' + + _TESTS = [{ + 'url': 'https://www.tiktok.com/t/ZTRC5xgJp', + 'info_dict': { + 'id': '7170520270497680683', + 'ext': 'mp4', + 'title': 'md5:c64f6152330c2efe98093ccc8597871c', + 'uploader_id': '6687535061741700102', + 'upload_date': '20221127', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAObqu3WCTXxmw2xwZ3iLEHnEecEIw7ks6rxWqOqOhaPja9BI7gqUQnjw8_5FSoDXX', + 'album': 'Wave of Mutilation: Best of Pixies', + 'thumbnail': r're:https://.+\.webp.*', + 'duration': 5, + 'timestamp': 1669516858, + 'repost_count': int, + 'artist': 'Pixies', + 'track': 'Where Is My Mind?', + 'description': 'md5:c64f6152330c2efe98093ccc8597871c', + 'uploader': 'sigmachaddeus', + 'creator': 'SigmaChad', + }, + }, { + 'url': 'https://vm.tiktok.com/ZTR45GpSF/', + 'info_dict': { + 'id': '7106798200794926362', + 'ext': 'mp4', + 'title': 'md5:edc3e7ea587847f8537468f2fe51d074', + 'uploader_id': '6997695878846268418', + 'upload_date': '20220608', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'thumbnail': r're:https://.+\.webp.*', + 'uploader_url': 'https://www.tiktok.com/@MS4wLjABAAAAdZ_NcPPgMneaGrW0hN8O_J_bwLshwNNERRF5DxOw2HKIzk0kdlLrR8RkVl1ksrMO', + 'duration': 29, + 'timestamp': 1654680400, + 'repost_count': int, + 'artist': 'Akihitoko', + 'track': 'original sound', + 'description': 'md5:edc3e7ea587847f8537468f2fe51d074', + 'uploader': 'akihitoko1', + 'creator': 'Akihitoko', + }, + }, { + 'url': 'https://vt.tiktok.com/ZSe4FqkKd', + 'only_matching': True, + }] + + def _real_extract(self, url): + new_url = self._request_webpage( + HEADRequest(url), self._match_id(url), headers={'User-Agent': 'facebookexternalhit/1.1'}).url + if self.suitable(new_url): # Prevent infinite loop in case redirect fails + raise UnsupportedError(new_url) + return self.url_result(new_url) + + +class TikTokLiveIE(TikTokBaseIE): + _VALID_URL = r'''(?x)https?://(?: + (?:www\.)?tiktok\.com/@(?P<uploader>[\w.-]+)/live| + m\.tiktok\.com/share/live/(?P<id>\d+) + )''' + IE_NAME = 'tiktok:live' + + _TESTS = [{ + 'url': 'https://www.tiktok.com/@weathernewslive/live', + 'info_dict': { + 'id': '7210809319192726273', + 'ext': 'mp4', + 'title': r're:ウェザーニュースLiVE[\d\s:-]*', + 'creator': 'ウェザーニュースLiVE', + 'uploader': 'weathernewslive', + 'uploader_id': '6621496731283095554', + 'uploader_url': 'https://www.tiktok.com/@weathernewslive', + 'live_status': 'is_live', + 'concurrent_view_count': int, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://www.tiktok.com/@pilarmagenta/live', + 'info_dict': { + 'id': '7209423610325322522', + 'ext': 'mp4', + 'title': str, + 'creator': 'Pilarmagenta', + 'uploader': 'pilarmagenta', + 'uploader_id': '6624846890674683909', + 'uploader_url': 'https://www.tiktok.com/@pilarmagenta', + 'live_status': 'is_live', + 'concurrent_view_count': int, + }, + 'skip': 'Livestream', + }, { + 'url': 'https://m.tiktok.com/share/live/7209423610325322522/?language=en', + 'only_matching': True, + }, { + 'url': 'https://www.tiktok.com/@iris04201/live', + 'only_matching': True, + }] + + def _call_api(self, url, param, room_id, uploader, key=None): + response = traverse_obj(self._download_json( + url, room_id, fatal=False, query={ + 'aid': '1988', + param: room_id, + }), (key, {dict}), default={}) + + # status == 2 if live else 4 + if int_or_none(response.get('status')) == 2: + return response + # If room_id is obtained via mobile share URL and cannot be refreshed, do not wait for live + elif not uploader: + raise ExtractorError('This livestream has ended', expected=True) + raise UserNotLive(video_id=uploader) + + def _real_extract(self, url): + uploader, room_id = self._match_valid_url(url).group('uploader', 'id') + webpage = self._download_webpage( + url, uploader or room_id, headers={'User-Agent': 'Mozilla/5.0'}, fatal=not room_id) + + if webpage: + data = try_call(lambda: self._get_sigi_state(webpage, uploader or room_id)) + room_id = (traverse_obj(data, ('UserModule', 'users', ..., 'roomId', {str_or_none}), get_all=False) + or self._search_regex(r'snssdk\d*://live\?room_id=(\d+)', webpage, 'room ID', default=None) + or room_id) + uploader = uploader or traverse_obj( + data, ('LiveRoom', 'liveRoomUserInfo', 'user', 'uniqueId'), + ('UserModule', 'users', ..., 'uniqueId'), get_all=False, expected_type=str) + + if not room_id: + raise UserNotLive(video_id=uploader) + + formats = [] + live_info = self._call_api( + 'https://webcast.tiktok.com/webcast/room/info', 'room_id', room_id, uploader, key='data') + + get_quality = qualities(('SD1', 'ld', 'SD2', 'sd', 'HD1', 'hd', 'FULL_HD1', 'uhd', 'ORIGION', 'origin')) + parse_inner = lambda x: self._parse_json(x, None) + + for quality, stream in traverse_obj(live_info, ( + 'stream_url', 'live_core_sdk_data', 'pull_data', 'stream_data', + {parse_inner}, 'data', {dict}), default={}).items(): + + sdk_params = traverse_obj(stream, ('main', 'sdk_params', {parse_inner}, { + 'vcodec': ('VCodec', {str}), + 'tbr': ('vbitrate', {lambda x: int_or_none(x, 1000)}), + 'resolution': ('resolution', {lambda x: re.match(r'(?i)\d+x\d+|\d+p', x).group().lower()}), + })) + + flv_url = traverse_obj(stream, ('main', 'flv', {url_or_none})) + if flv_url: + formats.append({ + 'url': flv_url, + 'ext': 'flv', + 'format_id': f'flv-{quality}', + 'quality': get_quality(quality), + **sdk_params, + }) + + hls_url = traverse_obj(stream, ('main', 'hls', {url_or_none})) + if hls_url: + formats.append({ + 'url': hls_url, + 'ext': 'mp4', + 'protocol': 'm3u8_native', + 'format_id': f'hls-{quality}', + 'quality': get_quality(quality), + **sdk_params, + }) + + def get_vcodec(*keys): + return traverse_obj(live_info, ( + 'stream_url', *keys, {parse_inner}, 'VCodec', {str})) + + for stream in ('hls', 'rtmp'): + stream_url = traverse_obj(live_info, ('stream_url', f'{stream}_pull_url', {url_or_none})) + if stream_url: + formats.append({ + 'url': stream_url, + 'ext': 'mp4' if stream == 'hls' else 'flv', + 'protocol': 'm3u8_native' if stream == 'hls' else 'https', + 'format_id': f'{stream}-pull', + 'vcodec': get_vcodec(f'{stream}_pull_url_params'), + 'quality': get_quality('ORIGION'), + }) + + for f_id, f_url in traverse_obj(live_info, ('stream_url', 'flv_pull_url', {dict}), default={}).items(): + if not url_or_none(f_url): + continue + formats.append({ + 'url': f_url, + 'ext': 'flv', + 'format_id': f'flv-{f_id}'.lower(), + 'vcodec': get_vcodec('flv_pull_url_params', f_id), + 'quality': get_quality(f_id), + }) + + # If uploader is a guest on another's livestream, primary endpoint will not have m3u8 URLs + if not traverse_obj(formats, lambda _, v: v['ext'] == 'mp4'): + live_info = merge_dicts(live_info, self._call_api( + 'https://www.tiktok.com/api/live/detail/', 'roomID', room_id, uploader, key='LiveRoomInfo')) + if url_or_none(live_info.get('liveUrl')): + formats.append({ + 'url': live_info['liveUrl'], + 'ext': 'mp4', + 'protocol': 'm3u8_native', + 'format_id': 'hls-fallback', + 'vcodec': 'h264', + 'quality': get_quality('origin'), + }) + + uploader = uploader or traverse_obj(live_info, ('ownerInfo', 'uniqueId'), ('owner', 'display_id')) + + return { + 'id': room_id, + 'uploader': uploader, + 'uploader_url': format_field(uploader, None, self._UPLOADER_URL_FORMAT) or None, + 'is_live': True, + 'formats': formats, + '_format_sort_fields': ('quality', 'ext'), + **traverse_obj(live_info, { + 'title': 'title', + 'uploader_id': (('ownerInfo', 'owner'), 'id', {str_or_none}), + 'creator': (('ownerInfo', 'owner'), 'nickname'), + 'concurrent_view_count': (('user_count', ('liveRoomStats', 'userCount')), {int_or_none}), + }, get_all=False), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tinypic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tinypic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tinypic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tinypic.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tmz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tmz.py new file mode 100644 index 0000000..edd16bc --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tmz.py @@ -0,0 +1,193 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + get_element_by_attribute, +) + + +class TMZIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tmz\.com/.*' + _TESTS = [ + { + 'url': 'http://www.tmz.com/videos/0-cegprt2p/', + 'info_dict': { + 'id': 'http://www.tmz.com/videos/0-cegprt2p/', + 'ext': 'mp4', + 'title': 'No Charges Against Hillary Clinton? Harvey Says It Ain\'t Over Yet', + 'description': 'Harvey talks about Director Comey’s decision not to prosecute Hillary Clinton.', + 'timestamp': 1467831837, + 'uploader': 'TMZ Staff', + 'upload_date': '20160706', + 'thumbnail': 'https://imagez.tmz.com/image/5e/4by3/2016/07/06/5eea7dc01baa5c2e83eb06930c170e46_xl.jpg', + 'duration': 772.0, + }, + }, + { + 'url': 'https://www.tmz.com/videos/071119-chris-morgan-women-4590005-0-zcsejvcr/', + 'info_dict': { + 'id': 'https://www.tmz.com/videos/071119-chris-morgan-women-4590005-0-zcsejvcr/', + 'ext': 'mp4', + 'title': 'Angry Bagel Shop Guy Says He Doesn\'t Trust Women', + 'description': 'The enraged man who went viral for ranting about women on dating sites before getting ragdolled in a bagel shop is defending his misogyny ... he says it\'s women\'s fault in the first place.', + 'timestamp': 1562889485, + 'uploader': 'TMZ Staff', + 'upload_date': '20190711', + 'thumbnail': 'https://imagez.tmz.com/image/a8/4by3/2019/07/12/a85480d27b2f50a7bfea2322151d67a5_xl.jpg', + 'duration': 123.0, + }, + }, + { + 'url': 'http://www.tmz.com/2015/04/19/bobby-brown-bobbi-kristina-awake-video-concert', + 'md5': '5429c85db8bde39a473a56ca8c4c5602', + 'info_dict': { + 'id': 'http://www.tmz.com/2015/04/19/bobby-brown-bobbi-kristina-awake-video-concert', + 'ext': 'mp4', + 'title': 'Bobby Brown Tells Crowd ... Bobbi Kristina is Awake', + 'description': 'Bobby Brown stunned his audience during a concert Saturday night, when he told the crowd, "Bobbi is awake. She\'s watching me."', + 'timestamp': 1429467813, + 'uploader': 'TMZ Staff', + 'upload_date': '20150419', + 'duration': 29.0, + 'thumbnail': 'https://imagez.tmz.com/image/15/4by3/2015/04/20/1539c7ae136359fc979236fa6a9449dd_xl.jpg', + }, + }, + { + 'url': 'http://www.tmz.com/2015/09/19/patti-labelle-concert-fan-stripping-kicked-out-nicki-minaj/', + 'info_dict': { + 'id': 'http://www.tmz.com/2015/09/19/patti-labelle-concert-fan-stripping-kicked-out-nicki-minaj/', + 'ext': 'mp4', + 'title': 'Patti LaBelle -- Goes Nuclear On Stripping Fan', + 'description': 'Patti LaBelle made it known loud and clear last night ... NO ' + 'ONE gets on her stage and strips down.', + 'timestamp': 1442683746, + 'uploader': 'TMZ Staff', + 'upload_date': '20150919', + 'duration': 104.0, + 'thumbnail': 'https://imagez.tmz.com/image/5e/4by3/2015/09/20/5e57d7575062528082994e18ac3f0f48_xl.jpg', + }, + }, + { + 'url': 'http://www.tmz.com/2016/01/28/adam-silver-sting-drake-blake-griffin/', + 'info_dict': { + 'id': 'http://www.tmz.com/2016/01/28/adam-silver-sting-drake-blake-griffin/', + 'ext': 'mp4', + 'title': 'NBA\'s Adam Silver -- Blake Griffin\'s a Great Guy ... He\'ll Learn from This', + 'description': 'Two pretty parts of this video with NBA Commish Adam Silver.', + 'timestamp': 1454010989, + 'uploader': 'TMZ Staff', + 'upload_date': '20160128', + 'duration': 59.0, + 'thumbnail': 'https://imagez.tmz.com/image/38/4by3/2016/01/29/3856e83e0beb57059ec412122b842fb1_xl.jpg', + }, + }, + { + 'url': 'http://www.tmz.com/2016/10/27/donald-trump-star-vandal-arrested-james-otis/', + 'info_dict': { + 'id': 'http://www.tmz.com/2016/10/27/donald-trump-star-vandal-arrested-james-otis/', + 'ext': 'mp4', + 'title': 'Trump Star Vandal -- I\'m Not Afraid of Donald or the Cops!', + 'description': 'James Otis is the the guy who took a pickaxe to Donald Trump\'s star on the Walk of Fame, and he tells TMZ .. he\'s ready and willing to go to jail for the crime.', + 'timestamp': 1477500095, + 'uploader': 'TMZ Staff', + 'upload_date': '20161026', + 'thumbnail': 'https://imagez.tmz.com/image/0d/4by3/2016/10/27/0d904814d4a75dcf9cc3b8cfd1edc1a3_xl.jpg', + 'duration': 128.0, + }, + }, + { + 'url': 'https://www.tmz.com/videos/2020-10-31-103120-beverly-hills-protest-4878209/', + 'info_dict': { + 'id': 'https://www.tmz.com/videos/2020-10-31-103120-beverly-hills-protest-4878209/', + 'ext': 'mp4', + 'title': 'Cops Use Billy Clubs Against Pro-Trump and Anti-Fascist ' + 'Demonstrators', + 'description': 'Beverly Hills may be an omen of what\'s coming next week, ' + 'because things got crazy on the streets and cops started ' + 'swinging their billy clubs at both Anti-Fascist and Pro-Trump ' + 'demonstrators.', + 'timestamp': 1604182772, + 'uploader': 'TMZ Staff', + 'upload_date': '20201031', + 'duration': 96.0, + 'thumbnail': 'https://imagez.tmz.com/image/f3/4by3/2020/10/31/f37bd5a8aef84497866f425130c58be3_xl.jpg', + }, + }, + { + 'url': 'https://www.tmz.com/2020/11/05/gervonta-davis-car-crash-hit-and-run-police/', + 'info_dict': { + 'id': 'Dddb6IGe-ws', + 'ext': 'mp4', + 'title': 'SICK LAMBO GERVONTA DAVIS IN HIS NEW RIDE RIGHT AFTER KO AFTER LEO EsNews Boxing', + 'uploader': 'ESNEWS', + 'description': 'md5:49675bc58883ccf80474b8aa701e1064', + 'upload_date': '20201102', + 'uploader_id': '@ESNEWS', + 'uploader_url': 'https://www.youtube.com/@ESNEWS', + 'like_count': int, + 'channel_id': 'UCI-Oq7oFGakzSzHFlTtsUsQ', + 'channel': 'ESNEWS', + 'view_count': int, + 'duration': 225, + 'live_status': 'not_live', + 'thumbnail': 'https://i.ytimg.com/vi_webp/Dddb6IGe-ws/maxresdefault.webp', + 'channel_url': 'https://www.youtube.com/channel/UCI-Oq7oFGakzSzHFlTtsUsQ', + 'channel_follower_count': int, + 'playable_in_embed': True, + 'categories': ['Sports'], + 'age_limit': 0, + 'tags': 'count:10', + 'availability': 'public', + 'comment_count': int, + }, + }, + { + 'url': 'https://www.tmz.com/2020/11/19/conor-mcgregor-dustin-poirier-contract-fight-ufc-257-fight-island/', + 'info_dict': { + 'id': '1329448013937471491', + 'ext': 'mp4', + 'title': 'The Mac Life - BREAKING: Conor McGregor (@thenotoriousmma) has signed his bout agreement for his rematch with Dustin Poirier for January 23.', + 'uploader': 'The Mac Life', + 'description': 'md5:56e6009bbc3d12498e10d08a8e1f1c69', + 'upload_date': '20201119', + 'display_id': '1329450007125225473', + 'uploader_id': 'TheMacLife', + 'timestamp': 1605800556, + 'thumbnail': 'https://pbs.twimg.com/media/EnMmfT8XYAExgxJ.jpg?name=small', + 'like_count': int, + 'duration': 11.812, + 'uploader_url': 'https://twitter.com/TheMacLife', + 'age_limit': 0, + 'repost_count': int, + 'tags': [], + 'comment_count': int, + }, + }, + ] + + def _real_extract(self, url): + webpage = self._download_webpage(url, url) + jsonld = self._search_json_ld(webpage, url) + if not jsonld or 'url' not in jsonld: + # try to extract from YouTube Player API + # see https://developers.google.com/youtube/iframe_api_reference#Video_Queueing_Functions + match_obj = re.search(r'\.cueVideoById\(\s*(?P<quote>[\'"])(?P<id>.*?)(?P=quote)', webpage) + if match_obj: + res = self.url_result(match_obj.group('id')) + return res + # try to extract from twitter + blockquote_el = get_element_by_attribute('class', 'twitter-tweet', webpage) + if blockquote_el: + matches = re.findall( + r'<a[^>]+href=\s*(?P<quote>[\'"])(?P<link>.*?)(?P=quote)', + blockquote_el) + if matches: + for _, match in matches: + if '/status/' in match: + res = self.url_result(match) + return res + raise ExtractorError('No video found!') + if id not in jsonld: + jsonld['id'] = url + return jsonld diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tnaflix.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tnaflix.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tnaflix.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tnaflix.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/toggle.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/toggle.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/toggle.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/toggle.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/toggo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/toggo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/toggo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/toggo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tokentube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tokentube.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tokentube.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tokentube.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tonline.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tonline.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tonline.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tonline.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/toongoggles.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/toongoggles.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/toongoggles.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/toongoggles.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/toutv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/toutv.py new file mode 100644 index 0000000..ced1224 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/toutv.py @@ -0,0 +1,87 @@ +import json + +from .radiocanada import RadioCanadaIE +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + merge_dicts, +) + + +class TouTvIE(RadioCanadaIE): # XXX: Do not subclass from concrete IE + _NETRC_MACHINE = 'toutv' + IE_NAME = 'tou.tv' + _VALID_URL = r'https?://ici\.tou\.tv/(?P<id>[a-zA-Z0-9_-]+(?:/S[0-9]+[EC][0-9]+)?)' + + _TESTS = [{ + 'url': 'http://ici.tou.tv/garfield-tout-court/S2015E17', + 'info_dict': { + 'id': '122017', + 'ext': 'mp4', + 'title': 'Saison 2015 Épisode 17', + 'description': 'La photo de famille 2', + 'upload_date': '20100717', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'skip': '404 Not Found', + }, { + 'url': 'http://ici.tou.tv/hackers', + 'only_matching': True, + }, { + 'url': 'https://ici.tou.tv/l-age-adulte/S01C501', + 'only_matching': True, + }] + _CLIENT_KEY = '90505c8d-9c34-4f34-8da1-3a85bdc6d4f4' + + def _perform_login(self, username, password): + try: + self._access_token = self._download_json( + 'https://services.radio-canada.ca/toutv/profiling/accounts/login', + None, 'Logging in', data=json.dumps({ + 'ClientId': self._CLIENT_KEY, + 'ClientSecret': '34026772-244b-49b6-8b06-317b30ac9a20', + 'Email': username, + 'Password': password, + 'Scope': 'id.write media-validation.read', + }).encode(), headers={ + 'Authorization': 'client-key ' + self._CLIENT_KEY, + 'Content-Type': 'application/json;charset=utf-8', + })['access_token'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + error = self._parse_json(e.cause.response.read().decode(), None)['Message'] + raise ExtractorError(error, expected=True) + raise + self._claims = self._call_api('validation/v2/getClaims')['claims'] + + def _real_extract(self, url): + path = self._match_id(url) + metadata = self._download_json( + 'https://services.radio-canada.ca/toutv/presentation/%s' % path, path, query={ + 'client_key': self._CLIENT_KEY, + 'device': 'web', + 'version': 4, + }) + # IsDrm does not necessarily mean the video is DRM protected (see + # https://github.com/ytdl-org/youtube-dl/issues/13994). + if not self.get_param('allow_unplayable_formats') and metadata.get('IsDrm'): + self.report_warning('This video is probably DRM protected.', path) + video_id = metadata['IdMedia'] + details = metadata['Details'] + + return merge_dicts({ + 'id': video_id, + 'title': details.get('OriginalTitle'), + 'description': details.get('Description'), + 'thumbnail': details.get('ImageUrl'), + 'duration': int_or_none(details.get('LengthInSeconds')), + 'series': metadata.get('ProgramTitle'), + 'season_number': int_or_none(metadata.get('SeasonNumber')), + 'season': metadata.get('SeasonTitle'), + 'episode_number': int_or_none(metadata.get('EpisodeNumber')), + 'episode': metadata.get('EpisodeTitle'), + }, self._extract_info(metadata.get('AppCode', 'toutv'), video_id)) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/toypics.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/toypics.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/toypics.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/toypics.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/traileraddict.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/traileraddict.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/traileraddict.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/traileraddict.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/triller.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/triller.py new file mode 100644 index 0000000..56e51fe --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/triller.py @@ -0,0 +1,329 @@ +import itertools +import json +import re + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + ExtractorError, + UnsupportedError, + determine_ext, + int_or_none, + parse_resolution, + str_or_none, + traverse_obj, + unified_timestamp, + url_basename, + urljoin, + url_or_none, +) + + +class TrillerBaseIE(InfoExtractor): + _NETRC_MACHINE = 'triller' + _API_BASE_URL = 'https://social.triller.co/v1.5' + _API_HEADERS = {'Origin': 'https://triller.co'} + + def _perform_login(self, username, password): + if self._API_HEADERS.get('Authorization'): + return + + headers = {**self._API_HEADERS, 'Content-Type': 'application/json'} + user_check = traverse_obj(self._download_json( + f'{self._API_BASE_URL}/api/user/is-valid-username', None, note='Checking username', + fatal=False, expected_status=400, headers=headers, + data=json.dumps({'username': username}, separators=(',', ':')).encode()), 'status') + + if user_check: # endpoint returns `"status":false` if username exists + raise ExtractorError('Unable to login: Invalid username', expected=True) + + login = self._download_json( + f'{self._API_BASE_URL}/user/auth', None, note='Logging in', fatal=False, + expected_status=400, headers=headers, data=json.dumps({ + 'username': username, + 'password': password, + }, separators=(',', ':')).encode()) or {} + + if not login.get('auth_token'): + if login.get('error') == 1008: + raise ExtractorError('Unable to login: Incorrect password', expected=True) + raise ExtractorError('Unable to login') + + self._API_HEADERS['Authorization'] = f'Bearer {login["auth_token"]}' + + def _get_comments(self, video_id, limit=15): + comment_info = self._download_json( + f'{self._API_BASE_URL}/api/videos/{video_id}/comments_v2', + video_id, fatal=False, note='Downloading comments API JSON', + headers=self._API_HEADERS, query={'limit': limit}) or {} + if not comment_info.get('comments'): + return + yield from traverse_obj(comment_info, ('comments', ..., { + 'id': ('id', {str_or_none}), + 'text': 'body', + 'author': ('author', 'username'), + 'author_id': ('author', 'user_id'), + 'timestamp': ('timestamp', {unified_timestamp}), + })) + + def _parse_video_info(self, video_info, username, user_id, display_id=None): + video_id = str(video_info['id']) + display_id = display_id or video_info.get('video_uuid') + + if traverse_obj(video_info, ( + None, ('transcoded_url', 'video_url', 'stream_url', 'audio_url'), + {lambda x: re.search(r'/copyright/', x)}), get_all=False): + self.raise_no_formats('This video has been removed due to licensing restrictions', expected=True) + + def format_info(url): + return { + 'url': url, + 'ext': determine_ext(url), + 'format_id': url_basename(url).split('.')[0], + } + + formats = [] + + if determine_ext(video_info.get('transcoded_url')) == 'm3u8': + formats.extend(self._extract_m3u8_formats( + video_info['transcoded_url'], video_id, 'mp4', m3u8_id='hls', fatal=False)) + + for video in traverse_obj(video_info, ('video_set', lambda _, v: url_or_none(v['url']))): + formats.append({ + **format_info(video['url']), + **parse_resolution(video.get('resolution')), + 'vcodec': video.get('codec'), + 'vbr': int_or_none(video.get('bitrate'), 1000), + }) + + video_url = traverse_obj(video_info, 'video_url', 'stream_url', expected_type=url_or_none) + if video_url: + formats.append({ + **format_info(video_url), + 'vcodec': 'h264', + **traverse_obj(video_info, { + 'width': 'width', + 'height': 'height', + 'filesize': 'filesize', + }, expected_type=int_or_none), + }) + + audio_url = url_or_none(video_info.get('audio_url')) + if audio_url: + formats.append(format_info(audio_url)) + + comment_count = traverse_obj(video_info, ('comment_count', {int_or_none})) + + return { + 'id': video_id, + 'display_id': display_id, + 'uploader': username, + 'uploader_id': user_id or traverse_obj(video_info, ('user', 'user_id', {str_or_none})), + 'webpage_url': urljoin(f'https://triller.co/@{username}/video/', display_id), + 'uploader_url': f'https://triller.co/@{username}', + 'extractor_key': TrillerIE.ie_key(), + 'extractor': TrillerIE.IE_NAME, + 'formats': formats, + 'comment_count': comment_count, + '__post_extractor': self.extract_comments(video_id, comment_count), + **traverse_obj(video_info, { + 'title': ('description', {lambda x: x.replace('\r\n', ' ')}), + 'description': 'description', + 'creator': ((('user'), ('users', lambda _, v: str(v['user_id']) == user_id)), 'name'), + 'thumbnail': ('thumbnail_url', {url_or_none}), + 'timestamp': ('timestamp', {unified_timestamp}), + 'duration': ('duration', {int_or_none}), + 'view_count': ('play_count', {int_or_none}), + 'like_count': ('likes_count', {int_or_none}), + 'artist': 'song_artist', + 'track': 'song_title', + }, get_all=False), + } + + +class TrillerIE(TrillerBaseIE): + _VALID_URL = r'''(?x) + https?://(?:www\.)?triller\.co/ + @(?P<username>[\w.]+)/video/(?P<id>[\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12}) + ''' + _TESTS = [{ + 'url': 'https://triller.co/@theestallion/video/2358fcd7-3df2-4c77-84c8-1d091610a6cf', + 'md5': '228662d783923b60d78395fedddc0a20', + 'info_dict': { + 'id': '71595734', + 'ext': 'mp4', + 'title': 'md5:9a2bf9435c5c4292678996a464669416', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + 'description': 'md5:9a2bf9435c5c4292678996a464669416', + 'uploader': 'theestallion', + 'uploader_id': '18992236', + 'creator': 'Megan Thee Stallion', + 'timestamp': 1660598222, + 'upload_date': '20220815', + 'duration': 47, + 'view_count': int, + 'like_count': int, + 'artist': 'Megan Thee Stallion', + 'track': 'Her', + 'uploader_url': 'https://triller.co/@theestallion', + 'comment_count': int, + }, + 'skip': 'This video has been removed due to licensing restrictions', + }, { + 'url': 'https://triller.co/@charlidamelio/video/46c6fcfa-aa9e-4503-a50c-68444f44cddc', + 'md5': '874055f462af5b0699b9dbb527a505a0', + 'info_dict': { + 'id': '71621339', + 'ext': 'mp4', + 'title': 'md5:4c91ea82760fe0fffb71b8c3aa7295fc', + 'display_id': '46c6fcfa-aa9e-4503-a50c-68444f44cddc', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + 'description': 'md5:4c91ea82760fe0fffb71b8c3aa7295fc', + 'uploader': 'charlidamelio', + 'uploader_id': '1875551', + 'creator': 'charli damelio', + 'timestamp': 1660773354, + 'upload_date': '20220817', + 'duration': 16, + 'view_count': int, + 'like_count': int, + 'artist': 'Dixie', + 'track': 'Someone to Blame', + 'uploader_url': 'https://triller.co/@charlidamelio', + 'comment_count': int, + }, + }, { + 'url': 'https://triller.co/@theestallion/video/07f35f38-1f51-48e2-8c5f-f7a8e829988f', + 'md5': 'af7b3553e4b8bfca507636471ee2eb41', + 'info_dict': { + 'id': '71837829', + 'ext': 'mp4', + 'title': 'UNGRATEFUL VIDEO OUT NOW ðŸ‘ðŸ¾ðŸ‘ðŸ¾ðŸ‘🾠💙💙 link my bio #womeninhiphop', + 'display_id': '07f35f38-1f51-48e2-8c5f-f7a8e829988f', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + 'description': 'UNGRATEFUL VIDEO OUT NOW ðŸ‘ðŸ¾ðŸ‘ðŸ¾ðŸ‘🾠💙💙 link my bio\r\n #womeninhiphop', + 'uploader': 'theestallion', + 'uploader_id': '18992236', + 'creator': 'Megan Thee Stallion', + 'timestamp': 1662486178, + 'upload_date': '20220906', + 'duration': 30, + 'view_count': int, + 'like_count': int, + 'artist': 'Unknown', + 'track': 'Unknown', + 'uploader_url': 'https://triller.co/@theestallion', + 'comment_count': int, + }, + }] + + def _real_extract(self, url): + username, display_id = self._match_valid_url(url).group('username', 'id') + + video_info = self._download_json( + f'{self._API_BASE_URL}/api/videos/{display_id}', display_id, + headers=self._API_HEADERS)['videos'][0] + + return self._parse_video_info(video_info, username, None, display_id) + + +class TrillerUserIE(TrillerBaseIE): + _VALID_URL = r'https?://(?:www\.)?triller\.co/@(?P<id>[\w.]+)/?(?:$|[#?])' + _TESTS = [{ + 'url': 'https://triller.co/@theestallion', + 'playlist_mincount': 12, + 'info_dict': { + 'id': '18992236', + 'title': 'theestallion', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + }, + }, { + 'url': 'https://triller.co/@charlidamelio', + 'playlist_mincount': 150, + 'info_dict': { + 'id': '1875551', + 'title': 'charlidamelio', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + }, + }] + + def _real_initialize(self): + if not self._API_HEADERS.get('Authorization'): + guest = self._download_json( + f'{self._API_BASE_URL}/user/create_guest', None, + note='Creating guest session', data=b'', headers=self._API_HEADERS, query={ + 'platform': 'Web', + 'app_version': '', + }) + if not guest.get('auth_token'): + raise ExtractorError('Unable to fetch required auth token for user extraction') + + self._API_HEADERS['Authorization'] = f'Bearer {guest["auth_token"]}' + + def _entries(self, username, user_id, limit=6): + query = {'limit': limit} + for page in itertools.count(1): + videos = self._download_json( + f'{self._API_BASE_URL}/api/users/{user_id}/videos', + username, note=f'Downloading user video list page {page}', + headers=self._API_HEADERS, query=query) + + for video in traverse_obj(videos, ('videos', ...)): + yield self._parse_video_info(video, username, user_id) + + query['before_time'] = traverse_obj(videos, ('videos', -1, 'timestamp')) + if not query['before_time']: + break + + def _real_extract(self, url): + username = self._match_id(url) + + user_info = traverse_obj(self._download_json( + f'{self._API_BASE_URL}/api/users/by_username/{username}', + username, note='Downloading user info', headers=self._API_HEADERS), ('user', {dict})) or {} + + if user_info.get('private') and user_info.get('followed_by_me') not in (True, 'true'): + raise ExtractorError('This user profile is private', expected=True) + elif traverse_obj(user_info, (('blocked_by_user', 'blocking_user'), {bool}), get_all=False): + raise ExtractorError('The author of the video is blocked', expected=True) + + user_id = str_or_none(user_info.get('user_id')) + if not user_id: + raise ExtractorError('Unable to extract user ID') + + return self.playlist_result( + self._entries(username, user_id), user_id, username, thumbnail=user_info.get('avatar_url')) + + +class TrillerShortIE(InfoExtractor): + _VALID_URL = r'https?://v\.triller\.co/(?P<id>\w+)' + _TESTS = [{ + 'url': 'https://v.triller.co/WWZNWk', + 'md5': '5eb8dc2c971bd8cd794ec9e8d5e9d101', + 'info_dict': { + 'id': '66210052', + 'ext': 'mp4', + 'title': 'md5:2dfc89d154cd91a4a18cd9582ba03e16', + 'display_id': 'f4480e1f-fb4e-45b9-a44c-9e6c679ce7eb', + 'thumbnail': r're:^https://uploads\.cdn\.triller\.co/.+\.jpg$', + 'description': 'md5:2dfc89d154cd91a4a18cd9582ba03e16', + 'uploader': 'statefairent', + 'uploader_id': '487545193', + 'creator': 'Official Summer Fair of LA', + 'timestamp': 1629655457, + 'upload_date': '20210822', + 'duration': 19, + 'view_count': int, + 'like_count': int, + 'artist': 'Unknown', + 'track': 'Unknown', + 'uploader_url': 'https://triller.co/@statefairent', + 'comment_count': int, + }, + }] + + def _real_extract(self, url): + real_url = self._request_webpage(HEADRequest(url), self._match_id(url)).url + if self.suitable(real_url): # Prevent infinite loop in case redirect fails + raise UnsupportedError(real_url) + return self.url_result(real_url) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/trilulilu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trilulilu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/trilulilu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/trilulilu.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/trovo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trovo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/trovo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/trovo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/trtcocuk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trtcocuk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/trtcocuk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/trtcocuk.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/trueid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trueid.py new file mode 100644 index 0000000..86f0990 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/trueid.py @@ -0,0 +1,136 @@ +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + parse_age_limit, + traverse_obj, + unified_timestamp, + url_or_none +) + + +class TrueIDIE(InfoExtractor): + _VALID_URL = r'https?://(?P<domain>vn\.trueid\.net|trueid\.(?:id|ph))/(?:movie|series/[^/]+)/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://trueid.id/movie/XYNlDOZZJzL6/pengabdi-setan/', + 'md5': '2552c7535125885901f1a2a4bcf32ca3', + 'info_dict': { + 'id': 'XYNlDOZZJzL6', + 'ext': 'mp4', + 'title': 'Pengabdi Setan', + 'display_id': 'pengabdi-setan', + 'description': 'md5:b0b41df08601e85e5291496c9bbe52cd', + 'timestamp': 1600243511, + 'categories': ['Film Indonesia', 'Horror', 'Mystery'], + 'release_timestamp': 1593536400, + 'release_year': 1982, + 'cast': list, + 'thumbnail': 'https://cms.dmpcdn.com/movie/2020/09/18/8b6e35c0-f97f-11ea-81fe-c52fc9dd314f_original.png', + 'upload_date': '20200916', + 'release_date': '20200630', + }, + 'expected_warnings': ['Video is geo restricted.'] + }, { + 'url': 'https://trueid.id/series/zZOBVPb62EwR/qXY73rwyl7oj/one-piece-ep-1/', + 'md5': '1c6d976049bc3c89a8a25aed2c3fb081', + 'info_dict': { + 'id': 'qXY73rwyl7oj', + 'ext': 'mp4', + 'title': 'One Piece Ep. 1', + 'display_id': 'one-piece-ep-1', + 'description': 'md5:13226d603bd03c4150a1cf5758e842ea', + 'timestamp': 1610421085, + 'categories': ['Animation & Cartoon', 'Kids & Family', 'Adventure'], + 'release_timestamp': 1612112400, + 'release_year': 1999, + 'age_limit': 7, + 'cast': ['Kounosuke Uda', 'Junji Shimizu'], + 'thumbnail': 'https://cms.dmpcdn.com/movie/2021/01/13/f84e9e70-5562-11eb-9fe2-dd6c2099a468_original.png', + 'upload_date': '20210112', + 'release_date': '20210131', + }, + 'expected_warnings': ['Video is geo restricted.'] + }, { + 'url': 'https://vn.trueid.net/series/7DNPM7Bpa9wv/pwLgEQ4Xbda2/haikyu-vua-bong-chuyen-phan-1/', + 'info_dict': { + 'id': 'pwLgEQ4Xbda2', + 'ext': 'mp4', + 'title': 'Haikyu!!: Vua Bóng Chuyá»n Phần 1 - Tập 1', + 'display_id': 'haikyu-vua-bong-chuyen-phan-1-tap-1', + 'description': 'md5:0374dd44d247799169449ee30cca963a', + 'timestamp': 1629270901, + 'categories': ['Anime', 'Phim Hài', 'Phim Há»c ÄÆ°á»ng', 'Phim Thể Thao', 'Shounen'], + 'release_timestamp': 1629270720, + 'release_year': 2014, + 'age_limit': 13, + 'thumbnail': 'https://cms.dmpcdn.com/movie/2021/09/28/b6e7ec00-2039-11ec-8436-974544e5841f_webp_original.jpg', + 'upload_date': '20210818', + 'release_date': '20210818', + }, + 'expected_warnings': ['Video is geo restricted.'] + }, { + 'url': 'https://trueid.ph/series/l8rvvAw7Jwv8/l8rvvAw7Jwv8/naruto-trailer/', + 'only_matching': True, + }] + _CUSTOM_RATINGS = { + 'PG': 7, + } + + def _real_extract(self, url): + domain, video_id = self._match_valid_url(url).group('domain', 'id') + webpage = self._download_webpage(url, video_id) + initial_data = traverse_obj( + self._search_nextjs_data(webpage, video_id, fatal=False), ('props', 'pageProps', 'initialContentData'), default={}) + + try: + stream_data = self._download_json( + f'https://{domain}/cmsPostProxy/contents/video/{video_id}/streamer?os=android', video_id, data=b'')['data'] + except ExtractorError as e: + if not isinstance(e.cause, HTTPError): + raise e + errmsg = self._parse_json(e.cause.response.read().decode(), video_id)['meta']['message'] + if 'country' in errmsg: + self.raise_geo_restricted( + errmsg, [initial_data['display_country']] if initial_data.get('display_country') else None, True) + else: + self.raise_no_formats(errmsg, video_id=video_id) + + if stream_data: + stream_url = stream_data['stream']['stream_url'] + stream_ext = determine_ext(stream_url) + if stream_ext == 'm3u8': + formats, subs = self._extract_m3u8_formats_and_subtitles(stream_url, video_id, 'mp4') + elif stream_ext == 'mpd': + formats, subs = self._extract_mpd_formats_and_subtitles(stream_url, video_id) + else: + formats = [{'url': stream_url}] + + thumbnails = [ + {'id': thumb_key, 'url': thumb_url} + for thumb_key, thumb_url in (initial_data.get('thumb_list') or {}).items() + if url_or_none(thumb_url)] + + return { + 'id': video_id, + 'title': initial_data.get('title') or self._html_search_regex( + [r'Nonton (?P<name>.+) Gratis', + r'Xem (?P<name>.+) Miá»…n phí', + r'Watch (?P<name>.+) Free'], webpage, 'title', group='name'), + 'display_id': initial_data.get('slug_title'), + 'description': initial_data.get('synopsis'), + 'timestamp': unified_timestamp(initial_data.get('create_date')), + # 'duration': int_or_none(initial_data.get('duration'), invscale=60), # duration field must atleast be accurate to the second + 'categories': traverse_obj(initial_data, ('article_category_details', ..., 'name')), + 'release_timestamp': unified_timestamp(initial_data.get('publish_date')), + 'release_year': int_or_none(initial_data.get('release_year')), + 'formats': formats, + 'subtitles': subs, + 'thumbnails': thumbnails, + 'age_limit': self._CUSTOM_RATINGS.get(initial_data.get('rate')) or parse_age_limit(initial_data.get('rate')), + 'cast': traverse_obj(initial_data, (('actor', 'director'), ...)), + 'view_count': int_or_none(initial_data.get('count_views')), + 'like_count': int_or_none(initial_data.get('count_likes')), + 'average_rating': int_or_none(initial_data.get('count_ratings')), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/trunews.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trunews.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/trunews.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/trunews.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/truth.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/truth.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/truth.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/truth.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/trutv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/trutv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/trutv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/trutv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tube8.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tube8.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tube8.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tube8.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tubetugraz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tubetugraz.py new file mode 100644 index 0000000..a351e4e --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tubetugraz.py @@ -0,0 +1,252 @@ +from .common import InfoExtractor +from ..utils import ( + float_or_none, + parse_resolution, + traverse_obj, + urlencode_postdata, + variadic, +) + + +class TubeTuGrazBaseIE(InfoExtractor): + _NETRC_MACHINE = 'tubetugraz' + + _API_EPISODE = 'https://tube.tugraz.at/search/episode.json' + _FORMAT_TYPES = ('presentation', 'presenter') + + def _perform_login(self, username, password): + urlh = self._request_webpage( + 'https://tube.tugraz.at/Shibboleth.sso/Login?target=/paella/ui/index.html', + None, fatal=False, note='downloading login page', errnote='unable to fetch login page') + if not urlh: + return + + content, urlh = self._download_webpage_handle( + urlh.url, None, fatal=False, headers={'referer': urlh.url}, + note='logging in', errnote='unable to log in', + data=urlencode_postdata({ + 'lang': 'de', + '_eventId_proceed': '', + 'j_username': username, + 'j_password': password + })) + if not urlh or urlh.url == 'https://tube.tugraz.at/paella/ui/index.html': + return + + if not self._html_search_regex( + r'<p\b[^>]*>(Bitte geben Sie einen OTP-Wert ein:)</p>', + content, 'TFA prompt', default=None): + self.report_warning('unable to login: incorrect password') + return + + content, urlh = self._download_webpage_handle( + urlh.url, None, fatal=False, headers={'referer': urlh.url}, + note='logging in with TFA', errnote='unable to log in with TFA', + data=urlencode_postdata({ + 'lang': 'de', + '_eventId_proceed': '', + 'j_tokenNumber': self._get_tfa_info(), + })) + if not urlh or urlh.url == 'https://tube.tugraz.at/paella/ui/index.html': + return + + self.report_warning('unable to login: incorrect TFA code') + + def _extract_episode(self, episode_info): + id = episode_info.get('id') + formats = list(self._extract_formats( + traverse_obj(episode_info, ('mediapackage', 'media', 'track')), id)) + + title = traverse_obj(episode_info, ('mediapackage', 'title'), 'dcTitle') + series_title = traverse_obj(episode_info, ('mediapackage', 'seriestitle')) + creator = ', '.join(variadic(traverse_obj( + episode_info, ('mediapackage', 'creators', 'creator'), 'dcCreator', default=''))) + return { + 'id': id, + 'title': title, + 'creator': creator or None, + 'duration': traverse_obj(episode_info, ('mediapackage', 'duration'), 'dcExtent'), + 'series': series_title, + 'series_id': traverse_obj(episode_info, ('mediapackage', 'series'), 'dcIsPartOf'), + 'episode': series_title and title, + 'formats': formats + } + + def _set_format_type(self, formats, type): + for f in formats: + f['format_note'] = type + if not type.startswith(self._FORMAT_TYPES[0]): + f['preference'] = -2 + return formats + + def _extract_formats(self, format_list, id): + has_hls, has_dash = False, False + + for format_info in format_list or []: + url = traverse_obj(format_info, ('tags', 'url'), 'url') + if url is None: + continue + + type = format_info.get('type') or 'unknown' + transport = (format_info.get('transport') or 'https').lower() + + if transport == 'https': + formats = [{ + 'url': url, + 'abr': float_or_none(traverse_obj(format_info, ('audio', 'bitrate')), 1000), + 'vbr': float_or_none(traverse_obj(format_info, ('video', 'bitrate')), 1000), + 'fps': traverse_obj(format_info, ('video', 'framerate')), + **parse_resolution(traverse_obj(format_info, ('video', 'resolution'))), + }] + elif transport == 'hls': + has_hls, formats = True, self._extract_m3u8_formats( + url, id, 'mp4', fatal=False, note=f'downloading {type} HLS manifest') + elif transport == 'dash': + has_dash, formats = True, self._extract_mpd_formats( + url, id, fatal=False, note=f'downloading {type} DASH manifest') + else: + # RTMP, HDS, SMOOTH, and unknown formats + # - RTMP url fails on every tested entry until now + # - HDS url 404's on every tested entry until now + # - SMOOTH url 404's on every tested entry until now + continue + + yield from self._set_format_type(formats, type) + + # TODO: Add test for these + for type in self._FORMAT_TYPES: + if not has_hls: + hls_formats = self._extract_m3u8_formats( + f'https://wowza.tugraz.at/matterhorn_engage/smil:engage-player_{id}_{type}.smil/playlist.m3u8', + id, 'mp4', fatal=False, note=f'Downloading {type} HLS manifest', errnote=False) or [] + yield from self._set_format_type(hls_formats, type) + + if not has_dash: + dash_formats = self._extract_mpd_formats( + f'https://wowza.tugraz.at/matterhorn_engage/smil:engage-player_{id}_{type}.smil/manifest_mpm4sav_mvlist.mpd', + id, fatal=False, note=f'Downloading {type} DASH manifest', errnote=False) + yield from self._set_format_type(dash_formats, type) + + +class TubeTuGrazIE(TubeTuGrazBaseIE): + IE_DESC = 'tube.tugraz.at' + + _VALID_URL = r'''(?x) + https?://tube\.tugraz\.at/paella/ui/watch.html\?id= + (?P<id>[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}) + ''' + _TESTS = [ + { + 'url': 'https://tube.tugraz.at/paella/ui/watch.html?id=f2634392-e40e-4ac7-9ddc-47764aa23d40', + 'md5': 'a23a3d5c9aaca2b84932fdba66e17145', + 'info_dict': { + 'id': 'f2634392-e40e-4ac7-9ddc-47764aa23d40', + 'ext': 'mp4', + 'title': '#6 (23.11.2017)', + 'episode': '#6 (23.11.2017)', + 'series': '[INB03001UF] Einführung in die strukturierte Programmierung', + 'creator': 'Safran C', + 'duration': 3295818, + 'series_id': 'b1192fff-2aa7-4bf0-a5cf-7b15c3bd3b34', + } + }, { + 'url': 'https://tube.tugraz.at/paella/ui/watch.html?id=2df6d787-e56a-428d-8ef4-d57f07eef238', + 'md5': 'de0d854a56bf7318d2b693fe1adb89a5', + 'info_dict': { + 'id': '2df6d787-e56a-428d-8ef4-d57f07eef238', + 'title': 'TubeTuGraz video #2df6d787-e56a-428d-8ef4-d57f07eef238', + 'ext': 'mp4', + }, + 'expected_warnings': ['Extractor failed to obtain "title"'], + } + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + episode_data = self._download_json( + self._API_EPISODE, video_id, query={'id': video_id, 'limit': 1}, note='Downloading episode metadata') + + episode_info = traverse_obj(episode_data, ('search-results', 'result'), default={'id': video_id}) + return self._extract_episode(episode_info) + + +class TubeTuGrazSeriesIE(TubeTuGrazBaseIE): + _VALID_URL = r'''(?x) + https?://tube\.tugraz\.at/paella/ui/browse\.html\?series= + (?P<id>[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}) + ''' + _TESTS = [{ + 'url': 'https://tube.tugraz.at/paella/ui/browse.html?series=0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'info_dict': { + 'id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'title': '[209351] Strassenwesen', + }, + 'playlist': [ + { + 'info_dict': { + 'id': 'ee17ce5d-34e2-48b7-a76a-fed148614e11', + 'series_id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'ext': 'mp4', + 'title': '#4 Detailprojekt', + 'episode': '#4 Detailprojekt', + 'series': '[209351] Strassenwesen', + 'creator': 'Neuhold R', + 'duration': 6127024, + } + }, + { + 'info_dict': { + 'id': '87350498-799a-44d3-863f-d1518a98b114', + 'series_id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'ext': 'mp4', + 'title': '#3 Generelles Projekt', + 'episode': '#3 Generelles Projekt', + 'series': '[209351] Strassenwesen', + 'creator': 'Neuhold R', + 'duration': 5374422, + } + }, + { + 'info_dict': { + 'id': '778599ea-489e-4189-9e05-3b4888e19bcd', + 'series_id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'ext': 'mp4', + 'title': '#2 Vorprojekt', + 'episode': '#2 Vorprojekt', + 'series': '[209351] Strassenwesen', + 'creator': 'Neuhold R', + 'duration': 5566404, + } + }, + { + 'info_dict': { + 'id': '75e4c71c-d99d-4e56-b0e6-4f2bcdf11f29', + 'series_id': '0e6351b7-c372-491e-8a49-2c9b7e21c5a6', + 'ext': 'mp4', + 'title': '#1 Variantenstudium', + 'episode': '#1 Variantenstudium', + 'series': '[209351] Strassenwesen', + 'creator': 'Neuhold R', + 'duration': 5420200, + } + } + ], + 'min_playlist_count': 4 + }] + + def _real_extract(self, url): + id = self._match_id(url) + episodes_data = self._download_json(self._API_EPISODE, id, query={'sid': id}, note='Downloading episode list') + series_data = self._download_json( + 'https://tube.tugraz.at/series/series.json', id, fatal=False, + note='downloading series metadata', errnote='failed to download series metadata', + query={ + 'seriesId': id, + 'count': 1, + 'sort': 'TITLE' + }) + + return self.playlist_result( + map(self._extract_episode, episodes_data['search-results']['result']), id, + traverse_obj(series_data, ('catalogs', 0, 'http://purl.org/dc/terms/', 'title', 0, 'value'))) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tubitv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tubitv.py new file mode 100644 index 0000000..bd46bc3 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tubitv.py @@ -0,0 +1,168 @@ +import re + +from .common import InfoExtractor +from ..networking import Request +from ..utils import ( + ExtractorError, + int_or_none, + js_to_json, + traverse_obj, + urlencode_postdata, +) + + +class TubiTvIE(InfoExtractor): + _VALID_URL = r'''(?x) + (?: + tubitv:| + https?://(?:www\.)?tubitv\.com/(?:video|movies|tv-shows)/ + ) + (?P<id>[0-9]+)''' + _LOGIN_URL = 'http://tubitv.com/login' + _NETRC_MACHINE = 'tubitv' + _GEO_COUNTRIES = ['US'] + _TESTS = [{ + 'url': 'https://tubitv.com/movies/383676/tracker', + 'md5': '566fa0f76870302d11af0de89511d3f0', + 'info_dict': { + 'id': '383676', + 'ext': 'mp4', + 'title': 'Tracker', + 'description': 'md5:ff320baf43d0ad2655e538c1d5cd9706', + 'uploader_id': 'f866e2677ea2f0dff719788e4f7f9195', + 'release_year': 2010, + 'thumbnail': r're:^https?://.+\.(jpe?g|png)$', + 'duration': 6122, + }, + }, { + 'url': 'http://tubitv.com/video/283829/the_comedian_at_the_friday', + 'md5': '43ac06be9326f41912dc64ccf7a80320', + 'info_dict': { + 'id': '283829', + 'ext': 'mp4', + 'title': 'The Comedian at The Friday', + 'description': 'A stand up comedian is forced to look at the decisions in his life while on a one week trip to the west coast.', + 'uploader_id': 'bc168bee0d18dd1cb3b86c68706ab434', + }, + 'skip': 'Content Unavailable' + }, { + 'url': 'http://tubitv.com/tv-shows/321886/s01_e01_on_nom_stories', + 'only_matching': True, + }, { + 'url': 'https://tubitv.com/movies/560057/penitentiary?start=true', + 'info_dict': { + 'id': '560057', + 'ext': 'mp4', + 'title': 'Penitentiary', + 'description': 'md5:8d2fc793a93cc1575ff426fdcb8dd3f9', + 'uploader_id': 'd8fed30d4f24fcb22ec294421b9defc2', + 'release_year': 1979, + }, + 'skip': 'Content Unavailable' + }] + + # DRM formats are included only to raise appropriate error + _UNPLAYABLE_FORMATS = ('hlsv6_widevine', 'hlsv6_widevine_nonclearlead', 'hlsv6_playready_psshv0', + 'hlsv6_fairplay', 'dash_widevine', 'dash_widevine_nonclearlead') + + def _perform_login(self, username, password): + self.report_login() + form_data = { + 'username': username, + 'password': password, + } + payload = urlencode_postdata(form_data) + request = Request(self._LOGIN_URL, payload) + request.headers['Content-Type'] = 'application/x-www-form-urlencoded' + login_page = self._download_webpage( + request, None, False, 'Wrong login info') + if not re.search(r'id="tubi-logout"', login_page): + raise ExtractorError( + 'Login failed (invalid username/password)', expected=True) + + def _real_extract(self, url): + video_id = self._match_id(url) + video_data = self._download_json(f'https://tubitv.com/oz/videos/{video_id}/content', video_id, query={ + 'video_resources': ['dash', 'hlsv3', 'hlsv6', *self._UNPLAYABLE_FORMATS], + }) + title = video_data['title'] + + formats = [] + drm_formats = False + + for resource in video_data['video_resources']: + if resource['type'] in ('dash', ): + formats += self._extract_mpd_formats(resource['manifest']['url'], video_id, mpd_id=resource['type'], fatal=False) + elif resource['type'] in ('hlsv3', 'hlsv6'): + formats += self._extract_m3u8_formats(resource['manifest']['url'], video_id, 'mp4', m3u8_id=resource['type'], fatal=False) + elif resource['type'] in self._UNPLAYABLE_FORMATS: + drm_formats = True + + if not formats and drm_formats: + self.report_drm(video_id) + elif not formats and not video_data.get('policy_match'): # policy_match is False if content was removed + raise ExtractorError('This content is currently unavailable', expected=True) + + thumbnails = [] + for thumbnail_url in video_data.get('thumbnails', []): + if not thumbnail_url: + continue + thumbnails.append({ + 'url': self._proto_relative_url(thumbnail_url), + }) + + subtitles = {} + for sub in video_data.get('subtitles', []): + sub_url = sub.get('url') + if not sub_url: + continue + subtitles.setdefault(sub.get('lang', 'English'), []).append({ + 'url': self._proto_relative_url(sub_url), + }) + + season_number, episode_number, episode_title = self._search_regex( + r'^S(\d+):E(\d+) - (.+)', title, 'episode info', fatal=False, group=(1, 2, 3), default=(None, None, None)) + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'description': video_data.get('description'), + 'duration': int_or_none(video_data.get('duration')), + 'uploader_id': video_data.get('publisher_id'), + 'release_year': int_or_none(video_data.get('year')), + 'season_number': int_or_none(season_number), + 'episode_number': int_or_none(episode_number), + 'episode_title': episode_title + } + + +class TubiTvShowIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tubitv\.com/series/[0-9]+/(?P<show_name>[^/?#]+)' + _TESTS = [{ + 'url': 'https://tubitv.com/series/3936/the-joy-of-painting-with-bob-ross?start=true', + 'playlist_mincount': 390, + 'info_dict': { + 'id': 'the-joy-of-painting-with-bob-ross', + } + }] + + def _entries(self, show_url, show_name): + show_webpage = self._download_webpage(show_url, show_name) + + show_json = self._parse_json(self._search_regex( + r'window\.__data\s*=\s*({[^<]+});\s*</script>', + show_webpage, 'data'), show_name, transform_source=js_to_json)['video'] + + for episode_id in show_json['fullContentById'].keys(): + if traverse_obj(show_json, ('byId', episode_id, 'type')) == 's': + continue + yield self.url_result( + 'tubitv:%s' % episode_id, + ie=TubiTvIE.ie_key(), video_id=episode_id) + + def _real_extract(self, url): + show_name = self._match_valid_url(url).group('show_name') + return self.playlist_result(self._entries(url, show_name), playlist_id=show_name) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tumblr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tumblr.py new file mode 100644 index 0000000..a26bdca --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tumblr.py @@ -0,0 +1,387 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + traverse_obj, + urlencode_postdata +) + + +class TumblrIE(InfoExtractor): + _VALID_URL = r'https?://(?P<blog_name>[^/?#&]+)\.tumblr\.com/(?:post|video)/(?P<id>[0-9]+)(?:$|[/?#])' + _NETRC_MACHINE = 'tumblr' + _LOGIN_URL = 'https://www.tumblr.com/login' + _OAUTH_URL = 'https://www.tumblr.com/api/v2/oauth2/token' + _TESTS = [{ + 'url': 'http://tatianamaslanydaily.tumblr.com/post/54196191430/orphan-black-dvd-extra-behind-the-scenes', + 'md5': '479bb068e5b16462f5176a6828829767', + 'info_dict': { + 'id': '54196191430', + 'ext': 'mp4', + 'title': 'md5:dfac39636969fe6bf1caa2d50405f069', + 'description': 'md5:390ab77358960235b6937ab3b8528956', + 'uploader_id': 'tatianamaslanydaily', + 'uploader_url': 'https://tatianamaslanydaily.tumblr.com/', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 127, + 'like_count': int, + 'repost_count': int, + 'age_limit': 0, + 'tags': ['Orphan Black', 'Tatiana Maslany', 'Interview', 'Video', 'OB S1 DVD Extras'], + } + }, { + 'note': 'multiple formats', + 'url': 'https://maskofthedragon.tumblr.com/post/626907179849564160/mona-talking-in-english', + 'md5': 'f43ff8a8861712b6cf0e0c2bd84cfc68', + 'info_dict': { + 'id': '626907179849564160', + 'ext': 'mp4', + 'title': 'Mona\xa0“talking†in\xa0“englishâ€', + 'description': 'md5:082a3a621530cb786ad2b7592a6d9e2c', + 'uploader_id': 'maskofthedragon', + 'uploader_url': 'https://maskofthedragon.tumblr.com/', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 7, + 'like_count': int, + 'repost_count': int, + 'age_limit': 0, + 'tags': 'count:19', + }, + 'params': { + 'format': 'hd', + }, + }, { + 'note': 'non-iframe video (with related posts)', + 'url': 'https://shieldfoss.tumblr.com/post/675519763813908480', + 'md5': '12bdb75661ef443bffe5a4dac1dbf118', + 'info_dict': { + 'id': '675519763813908480', + 'ext': 'mp4', + 'title': 'Shieldfoss', + 'uploader_id': 'nerviovago', + 'uploader_url': 'https://nerviovago.tumblr.com/', + 'thumbnail': r're:^https?://.*\.jpg', + 'like_count': int, + 'repost_count': int, + 'age_limit': 0, + 'tags': [], + } + }, { + 'note': 'dashboard only (original post)', + 'url': 'https://jujanon.tumblr.com/post/159704441298/my-baby-eating', + 'md5': '029f7c91ab386701b211e3d494d2d95e', + 'info_dict': { + 'id': '159704441298', + 'ext': 'mp4', + 'title': 'md5:ba79365861101f4911452728d2950561', + 'description': 'md5:773738196cea76b6996ec71e285bdabc', + 'uploader_id': 'jujanon', + 'uploader_url': 'https://jujanon.tumblr.com/', + 'thumbnail': r're:^https?://.*\.jpg', + 'like_count': int, + 'repost_count': int, + 'age_limit': 0, + 'tags': ['crabs', 'my video', 'my pets'], + } + }, { + 'note': 'dashboard only (reblog)', + 'url': 'https://bartlebyshop.tumblr.com/post/180294460076/duality-of-bird', + 'md5': '04334e7cadb1af680d162912559f51a5', + 'info_dict': { + 'id': '180294460076', + 'ext': 'mp4', + 'title': 'duality of bird', + 'description': 'duality of bird', + 'uploader_id': 'todaysbird', + 'uploader_url': 'https://todaysbird.tumblr.com/', + 'thumbnail': r're:^https?://.*\.jpg', + 'like_count': int, + 'repost_count': int, + 'age_limit': 0, + 'tags': [], + } + }, { + 'note': 'dashboard only (external)', + 'url': 'https://afloweroutofstone.tumblr.com/post/675661759168823296/the-blues-remembers-everything-the-country-forgot', + 'info_dict': { + 'id': 'q67_fd7b8SU', + 'ext': 'mp4', + 'title': 'The Blues Remembers Everything the Country Forgot', + 'alt_title': 'The Blues Remembers Everything the Country Forgot', + 'description': 'md5:1a6b4097e451216835a24c1023707c79', + 'release_date': '20201224', + 'creator': 'md5:c2239ba15430e87c3b971ba450773272', + 'uploader': 'Moor Mother - Topic', + 'upload_date': '20201223', + 'uploader_id': 'UCxrMtFBRkFvQJ_vVM4il08w', + 'uploader_url': 'http://www.youtube.com/channel/UCxrMtFBRkFvQJ_vVM4il08w', + 'thumbnail': r're:^https?://i.ytimg.com/.*', + 'channel': 'Moor Mother - Topic', + 'channel_id': 'UCxrMtFBRkFvQJ_vVM4il08w', + 'channel_url': 'https://www.youtube.com/channel/UCxrMtFBRkFvQJ_vVM4il08w', + 'channel_follower_count': int, + 'duration': 181, + 'view_count': int, + 'like_count': int, + 'age_limit': 0, + 'categories': ['Music'], + 'tags': 'count:7', + 'live_status': 'not_live', + 'playable_in_embed': True, + 'availability': 'public', + 'track': 'The Blues Remembers Everything the Country Forgot', + 'artist': 'md5:c2239ba15430e87c3b971ba450773272', + 'album': 'Brass', + 'release_year': 2020, + }, + 'add_ie': ['Youtube'], + }, { + 'url': 'http://naked-yogi.tumblr.com/post/118312946248/naked-smoking-stretching', + 'md5': 'de07e5211d60d4f3a2c3df757ea9f6ab', + 'info_dict': { + 'id': 'Wmur', + 'ext': 'mp4', + 'title': 'naked smoking & stretching', + 'upload_date': '20150506', + 'timestamp': 1430931613, + 'age_limit': 18, + 'uploader_id': '1638622', + 'uploader': 'naked-yogi', + }, + # 'add_ie': ['Vidme'], + 'skip': 'dead embedded video host' + }, { + 'url': 'https://prozdvoices.tumblr.com/post/673201091169681408/what-recording-voice-acting-sounds-like', + 'md5': 'a0063fc8110e6c9afe44065b4ea68177', + 'info_dict': { + 'id': 'eomhW5MLGWA', + 'ext': 'mp4', + 'title': 'what recording voice acting sounds like', + 'description': 'md5:1da3faa22d0e0b1d8b50216c284ee798', + 'uploader': 'ProZD', + 'upload_date': '20220112', + 'uploader_id': 'ProZD', + 'uploader_url': 'http://www.youtube.com/user/ProZD', + 'thumbnail': r're:^https?://i.ytimg.com/.*', + 'channel': 'ProZD', + 'channel_id': 'UC6MFZAOHXlKK1FI7V0XQVeA', + 'channel_url': 'https://www.youtube.com/channel/UC6MFZAOHXlKK1FI7V0XQVeA', + 'channel_follower_count': int, + 'duration': 20, + 'view_count': int, + 'like_count': int, + 'age_limit': 0, + 'categories': ['Film & Animation'], + 'tags': [], + 'live_status': 'not_live', + 'playable_in_embed': True, + 'availability': 'public', + }, + 'add_ie': ['Youtube'], + }, { + 'url': 'https://dominustempori.tumblr.com/post/673572712813297664/youtubes-all-right-for-some-pretty-cool', + 'md5': '203e9eb8077e3f45bfaeb4c86c1467b8', + 'info_dict': { + 'id': '87816359', + 'ext': 'mov', + 'title': 'Harold Ramis', + 'description': 'md5:be8e68cbf56ce0785c77f0c6c6dfaf2c', + 'uploader': 'Resolution Productions Group', + 'uploader_id': 'resolutionproductions', + 'uploader_url': 'https://vimeo.com/resolutionproductions', + 'upload_date': '20140227', + 'thumbnail': r're:^https?://i.vimeocdn.com/video/.*', + 'timestamp': 1393523719, + 'duration': 291, + }, + 'add_ie': ['Vimeo'], + }, { + 'url': 'http://sutiblr.tumblr.com/post/139638707273', + 'md5': '2dd184b3669e049ba40563a7d423f95c', + 'info_dict': { + 'id': 'ir7qBEIKqvq', + 'ext': 'mp4', + 'title': 'Vine by sutiblr', + 'alt_title': 'Vine by sutiblr', + 'uploader': 'sutiblr', + 'uploader_id': '1198993975374495744', + 'upload_date': '20160220', + 'like_count': int, + 'comment_count': int, + 'repost_count': int, + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1455940159, + 'view_count': int, + }, + 'add_ie': ['Vine'], + }, { + 'url': 'https://silami.tumblr.com/post/84250043974/my-bad-river-flows-in-you-impression-on-maschine', + 'md5': '3c92d7c3d867f14ccbeefa2119022277', + 'info_dict': { + 'id': 'nYtvtTPuTl', + 'ext': 'mp4', + 'title': 'Video by silbulterman', + 'description': '#maschine', + 'uploader_id': '242859024', + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1398801174, + 'like_count': int, + 'uploader': 'Sil', + 'channel': 'silbulterman', + 'comment_count': int, + 'upload_date': '20140429', + }, + 'add_ie': ['Instagram'], + }] + + _providers = { + 'instagram': 'Instagram', + 'vimeo': 'Vimeo', + 'vine': 'Vine', + 'youtube': 'Youtube', + } + + _ACCESS_TOKEN = None + + def _initialize_pre_login(self): + login_page = self._download_webpage( + self._LOGIN_URL, None, 'Downloading login page', fatal=False) + if login_page: + self._ACCESS_TOKEN = self._search_regex( + r'"API_TOKEN":\s*"(\w+)"', login_page, 'API access token', fatal=False) + if not self._ACCESS_TOKEN: + self.report_warning('Failed to get access token; metadata will be missing and some videos may not work') + + def _perform_login(self, username, password): + if not self._ACCESS_TOKEN: + return + + self._download_json( + self._OAUTH_URL, None, 'Logging in', + data=urlencode_postdata({ + 'password': password, + 'grant_type': 'password', + 'username': username, + }), headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': f'Bearer {self._ACCESS_TOKEN}', + }, + errnote='Login failed', fatal=False) + + def _real_extract(self, url): + blog, video_id = self._match_valid_url(url).groups() + + url = f'http://{blog}.tumblr.com/post/{video_id}/' + webpage, urlh = self._download_webpage_handle(url, video_id) + + redirect_url = urlh.url + + api_only = bool(self._search_regex( + r'(tumblr.com|^)/(safe-mode|login_required|blog/view)', + redirect_url, 'redirect', default=None)) + + if api_only and not self._ACCESS_TOKEN: + raise ExtractorError('Cannot get data for dashboard-only post without access token') + + post_json = {} + if self._ACCESS_TOKEN: + post_json = traverse_obj( + self._download_json( + f'https://www.tumblr.com/api/v2/blog/{blog}/posts/{video_id}/permalink', + video_id, headers={'Authorization': f'Bearer {self._ACCESS_TOKEN}'}, fatal=False), + ('response', 'timeline', 'elements', 0)) or {} + content_json = traverse_obj(post_json, ('trail', 0, 'content'), ('content')) or [] + video_json = next( + (item for item in content_json if item.get('type') == 'video'), {}) + media_json = video_json.get('media') or {} + if api_only and not media_json.get('url') and not video_json.get('url'): + raise ExtractorError('Failed to find video data for dashboard-only post') + + if not media_json.get('url') and video_json.get('url'): + # external video host + return self.url_result( + video_json['url'], + self._providers.get(video_json.get('provider'), 'Generic')) + + video_url = self._og_search_video_url(webpage, default=None) + duration = None + formats = [] + + # iframes can supply duration and sometimes additional formats, so check for one + iframe_url = self._search_regex( + fr'src=\'(https?://www\.tumblr\.com/video/{blog}/{video_id}/[^\']+)\'', + webpage, 'iframe url', default=None) + if iframe_url: + iframe = self._download_webpage( + iframe_url, video_id, 'Downloading iframe page', + headers={'Referer': redirect_url}) + + options = self._parse_json( + self._search_regex( + r'data-crt-options=(["\'])(?P<options>.+?)\1', iframe, + 'hd video url', default='', group='options'), + video_id, fatal=False) + if options: + duration = int_or_none(options.get('duration')) + + hd_url = options.get('hdUrl') + if hd_url: + # there are multiple formats; extract them + # ignore other sources of width/height data as they may be wrong + sources = [] + sd_url = self._search_regex( + r'<source[^>]+src=(["\'])(?P<url>.+?)\1', iframe, + 'sd video url', default=None, group='url') + if sd_url: + sources.append((sd_url, 'sd')) + sources.append((hd_url, 'hd')) + + formats = [{ + 'url': video_url, + 'format_id': format_id, + 'height': int_or_none(self._search_regex( + r'_(\d+)\.\w+$', video_url, 'height', default=None)), + 'quality': quality, + } for quality, (video_url, format_id) in enumerate(sources)] + + if not media_json.get('url') and not video_url and not iframe_url: + # external video host (but we weren't able to figure it out from the api) + iframe_url = self._search_regex( + r'src=["\'](https?://safe\.txmblr\.com/svc/embed/inline/[^"\']+)["\']', + webpage, 'embed iframe url', default=None) + return self.url_result(iframe_url or redirect_url, 'Generic') + + formats = formats or [{ + 'url': media_json.get('url') or video_url, + 'width': int_or_none( + media_json.get('width') or self._og_search_property('video:width', webpage, default=None)), + 'height': int_or_none( + media_json.get('height') or self._og_search_property('video:height', webpage, default=None)), + }] + + # the url we're extracting from might be an original post or it might be a reblog. + # if it's a reblog, og:description will be the reblogger's comment, not the uploader's. + # content_json is always the op, so if it exists but has no text, there's no description + if content_json: + description = '\n\n'.join(( + item.get('text') for item in content_json if item.get('type') == 'text')) or None + else: + description = self._og_search_description(webpage, default=None) + uploader_id = traverse_obj(post_json, 'reblogged_root_name', 'blog_name') + + return { + 'id': video_id, + 'title': post_json.get('summary') or (blog if api_only else self._html_search_regex( + r'(?s)<title>(?P<title>.*?)(?: \| Tumblr)?', webpage, 'title')), + 'description': description, + 'thumbnail': (traverse_obj(video_json, ('poster', 0, 'url')) + or self._og_search_thumbnail(webpage, default=None)), + 'uploader_id': uploader_id, + 'uploader_url': f'https://{uploader_id}.tumblr.com/' if uploader_id else None, + 'duration': duration, + 'like_count': post_json.get('like_count'), + 'repost_count': post_json.get('reblog_count'), + 'age_limit': {True: 18, False: 0}.get(post_json.get('is_nsfw')), + 'tags': post_json.get('tags'), + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tunein.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tunein.py new file mode 100644 index 0000000..fd2fe13 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tunein.py @@ -0,0 +1,234 @@ +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + OnDemandPagedList, + determine_ext, + parse_iso8601, + traverse_obj, +) + + +class TuneInBaseIE(InfoExtractor): + _VALID_URL_BASE = r'https?://(?:www\.)?tunein\.com' + + def _extract_metadata(self, webpage, content_id): + return self._search_json(r'window.INITIAL_STATE=', webpage, 'hydration', content_id, fatal=False) + + def _extract_formats_and_subtitles(self, content_id): + streams = self._download_json( + f'https://opml.radiotime.com/Tune.ashx?render=json&formats=mp3,aac,ogg,flash,hls&id={content_id}', + content_id)['body'] + + formats, subtitles = [], {} + for stream in streams: + if stream.get('media_type') == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles(stream['url'], content_id, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif determine_ext(stream['url']) == 'pls': + playlist_content = self._download_webpage(stream['url'], content_id) + formats.append({ + 'url': self._search_regex(r'File1=(.*)', playlist_content, 'url', fatal=False), + 'abr': stream.get('bitrate'), + 'ext': stream.get('media_type'), + }) + else: + formats.append({ + 'url': stream['url'], + 'abr': stream.get('bitrate'), + 'ext': stream.get('media_type'), + }) + + return formats, subtitles + + +class TuneInStationIE(TuneInBaseIE): + _VALID_URL = TuneInBaseIE._VALID_URL_BASE + r'(?:/radio/[^?#]+-|/embed/player/)(?Ps\d+)' + _EMBED_REGEX = [r']+src=["\'](?P(?:https?://)?tunein\.com/embed/player/s\d+)'] + + _TESTS = [{ + 'url': 'https://tunein.com/radio/Jazz24-885-s34682/', + 'info_dict': { + 'id': 's34682', + 'title': 're:^Jazz24', + 'description': 'md5:d6d0b89063fd68d529fa7058ee98619b', + 'thumbnail': 're:^https?://[^?&]+/s34682', + 'location': 'Seattle-Tacoma, US', + 'ext': 'mp3', + 'live_status': 'is_live', + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://tunein.com/embed/player/s6404/', + 'only_matching': True, + }, { + 'url': 'https://tunein.com/radio/BBC-Radio-1-988-s24939/', + 'info_dict': { + 'id': 's24939', + 'title': 're:^BBC Radio 1', + 'description': 'md5:f3f75f7423398d87119043c26e7bfb84', + 'thumbnail': 're:^https?://[^?&]+/s24939', + 'location': 'London, UK', + 'ext': 'mp3', + 'live_status': 'is_live', + }, + 'params': { + 'skip_download': True, + }, + }] + + def _real_extract(self, url): + station_id = self._match_id(url) + + webpage = self._download_webpage(url, station_id) + metadata = self._extract_metadata(webpage, station_id) + + formats, subtitles = self._extract_formats_and_subtitles(station_id) + return { + 'id': station_id, + 'title': traverse_obj(metadata, ('profiles', station_id, 'title')), + 'description': traverse_obj(metadata, ('profiles', station_id, 'description')), + 'thumbnail': traverse_obj(metadata, ('profiles', station_id, 'image')), + 'timestamp': parse_iso8601( + traverse_obj(metadata, ('profiles', station_id, 'actions', 'play', 'publishTime'))), + 'location': traverse_obj( + metadata, ('profiles', station_id, 'metadata', 'properties', 'location', 'displayName'), + ('profiles', station_id, 'properties', 'location', 'displayName')), + 'formats': formats, + 'subtitles': subtitles, + 'is_live': traverse_obj(metadata, ('profiles', station_id, 'actions', 'play', 'isLive')), + } + + +class TuneInPodcastIE(TuneInBaseIE): + _VALID_URL = TuneInBaseIE._VALID_URL_BASE + r'/(?:podcasts/[^?#]+-|embed/player/)(?Pp\d+)/?(?:#|$)' + _EMBED_REGEX = [r']+src=["\'](?P(?:https?://)?tunein\.com/embed/player/p\d+)'] + + _TESTS = [{ + 'url': 'https://tunein.com/podcasts/Technology-Podcasts/Artificial-Intelligence-p1153019', + 'info_dict': { + 'id': 'p1153019', + 'title': 'Lex Fridman Podcast', + 'description': 'md5:bedc4e5f1c94f7dec6e4317b5654b00d', + }, + 'playlist_mincount': 200, + }, { + 'url': 'https://tunein.com/embed/player/p191660/', + 'only_matching': True + }, { + 'url': 'https://tunein.com/podcasts/World-News/BBC-News-p14/', + 'info_dict': { + 'id': 'p14', + 'title': 'BBC News', + 'description': 'md5:1218e575eeaff75f48ed978261fa2068', + }, + 'playlist_mincount': 200, + }] + + _PAGE_SIZE = 30 + + def _real_extract(self, url): + podcast_id = self._match_id(url) + + webpage = self._download_webpage(url, podcast_id, fatal=False) + metadata = self._extract_metadata(webpage, podcast_id) + + def page_func(page_num): + api_response = self._download_json( + f'https://api.tunein.com/profiles/{podcast_id}/contents', podcast_id, + note=f'Downloading page {page_num + 1}', query={ + 'filter': 't:free', + 'offset': page_num * self._PAGE_SIZE, + 'limit': self._PAGE_SIZE, + }) + + return [ + self.url_result( + f'https://tunein.com/podcasts/{podcast_id}?topicId={episode["GuideId"][1:]}', + TuneInPodcastEpisodeIE, title=episode.get('Title')) + for episode in api_response['Items']] + + entries = OnDemandPagedList(page_func, self._PAGE_SIZE) + return self.playlist_result( + entries, playlist_id=podcast_id, title=traverse_obj(metadata, ('profiles', podcast_id, 'title')), + description=traverse_obj(metadata, ('profiles', podcast_id, 'description'))) + + +class TuneInPodcastEpisodeIE(TuneInBaseIE): + _VALID_URL = TuneInBaseIE._VALID_URL_BASE + r'/podcasts/(?:[^?&]+-)?(?Pp\d+)/?\?topicId=(?P\w\d+)' + + _TESTS = [{ + 'url': 'https://tunein.com/podcasts/Technology-Podcasts/Artificial-Intelligence-p1153019/?topicId=236404354', + 'info_dict': { + 'id': 't236404354', + 'title': '#351 \u2013 MrBeast: Future of YouTube, Twitter, TikTok, and Instagram', + 'description': 'md5:e1734db6f525e472c0c290d124a2ad77', + 'thumbnail': 're:^https?://[^?&]+/p1153019', + 'timestamp': 1673458571, + 'upload_date': '20230111', + 'series_id': 'p1153019', + 'series': 'Lex Fridman Podcast', + 'ext': 'mp3', + }, + }] + + def _real_extract(self, url): + podcast_id, episode_id = self._match_valid_url(url).group('podcast_id', 'id') + episode_id = f't{episode_id}' + + webpage = self._download_webpage(url, episode_id) + metadata = self._extract_metadata(webpage, episode_id) + + formats, subtitles = self._extract_formats_and_subtitles(episode_id) + return { + 'id': episode_id, + 'title': traverse_obj(metadata, ('profiles', episode_id, 'title')), + 'description': traverse_obj(metadata, ('profiles', episode_id, 'description')), + 'thumbnail': traverse_obj(metadata, ('profiles', episode_id, 'image')), + 'timestamp': parse_iso8601( + traverse_obj(metadata, ('profiles', episode_id, 'actions', 'play', 'publishTime'))), + 'series_id': podcast_id, + 'series': traverse_obj(metadata, ('profiles', podcast_id, 'title')), + 'formats': formats, + 'subtitles': subtitles, + } + + +class TuneInShortenerIE(InfoExtractor): + IE_NAME = 'tunein:shortener' + IE_DESC = False # Do not list + _VALID_URL = r'https?://tun\.in/(?P[A-Za-z0-9]+)' + + _TEST = { + # test redirection + 'url': 'http://tun.in/ser7s', + 'info_dict': { + 'id': 's34682', + 'title': 're:^Jazz24', + 'description': 'md5:d6d0b89063fd68d529fa7058ee98619b', + 'thumbnail': 're:^https?://[^?&]+/s34682', + 'location': 'Seattle-Tacoma, US', + 'ext': 'mp3', + 'live_status': 'is_live', + }, + 'params': { + 'skip_download': True, # live stream + }, + } + + def _real_extract(self, url): + redirect_id = self._match_id(url) + # The server doesn't support HEAD requests + urlh = self._request_webpage( + url, redirect_id, note='Downloading redirect page') + + url = urlh.url + url_parsed = urllib.parse.urlparse(url) + if url_parsed.port == 443: + url = url_parsed._replace(netloc=url_parsed.hostname).url + + self.to_screen('Following redirect: %s' % url) + return self.url_result(url) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tunepk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tunepk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tunepk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tunepk.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/turbo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/turbo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/turbo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/turbo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/turner.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/turner.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/turner.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/turner.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tv2.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv2.py new file mode 100644 index 0000000..f6b452d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv2.py @@ -0,0 +1,322 @@ +import re + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + float_or_none, + js_to_json, + parse_iso8601, + remove_end, + strip_or_none, + try_get, +) + + +class TV2IE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tv2\.no/v(?:ideo)?\d*/(?:[^?#]+/)*(?P\d+)' + _TESTS = [{ + 'url': 'http://www.tv2.no/v/1791207/', + 'info_dict': { + 'id': '1791207', + 'ext': 'mp4', + 'title': 'Her kolliderer romsonden med asteroiden ', + 'description': 'En romsonde har krasjet inn i en asteroide i verdensrommet. Kollisjonen skjedde klokken 01:14 natt til tirsdag 27. september norsk tid. \n\nNasa kaller det sitt første forsøk på planetforsvar.', + 'timestamp': 1664238190, + 'upload_date': '20220927', + 'duration': 146, + 'thumbnail': r're:^https://.*$', + 'view_count': int, + 'categories': list, + }, + }, { + 'url': 'http://www.tv2.no/v2/916509', + 'only_matching': True, + }, { + 'url': 'https://www.tv2.no/video/nyhetene/her-kolliderer-romsonden-med-asteroiden/1791207/', + 'only_matching': True, + }] + _PROTOCOLS = ('HLS', 'DASH') + _GEO_COUNTRIES = ['NO'] + + def _real_extract(self, url): + video_id = self._match_id(url) + asset = self._download_json('https://sumo.tv2.no/rest/assets/' + video_id, video_id, + 'Downloading metadata JSON') + title = asset['title'] + is_live = asset.get('live') is True + + formats = [] + format_urls = [] + for protocol in self._PROTOCOLS: + try: + data = self._download_json('https://api.sumo.tv2.no/play/%s?stream=%s' % (video_id, protocol), + video_id, 'Downloading playabck JSON', + headers={'content-type': 'application/json'}, + data='{"device":{"id":"1-1-1","name":"Nettleser (HTML)"}}'.encode())['playback'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + error = self._parse_json(e.cause.response.read().decode(), video_id)['error'] + error_code = error.get('code') + if error_code == 'ASSET_PLAYBACK_INVALID_GEO_LOCATION': + self.raise_geo_restricted(countries=self._GEO_COUNTRIES) + elif error_code == 'SESSION_NOT_AUTHENTICATED': + self.raise_login_required() + raise ExtractorError(error['description']) + raise + items = data.get('streams', []) + for item in items: + video_url = item.get('url') + if not video_url or video_url in format_urls: + continue + format_id = '%s-%s' % (protocol.lower(), item.get('type')) + if not self._is_valid_url(video_url, video_id, format_id): + continue + format_urls.append(video_url) + ext = determine_ext(video_url) + if ext == 'f4m': + formats.extend(self._extract_f4m_formats( + video_url, video_id, f4m_id=format_id, fatal=False)) + elif ext == 'm3u8': + if not data.get('drmProtected'): + formats.extend(self._extract_m3u8_formats( + video_url, video_id, 'mp4', live=is_live, m3u8_id=format_id, fatal=False)) + elif ext == 'mpd': + formats.extend(self._extract_mpd_formats( + video_url, video_id, format_id, fatal=False)) + elif ext == 'ism' or video_url.endswith('.ism/Manifest'): + pass + else: + formats.append({ + 'url': video_url, + 'format_id': format_id, + }) + if not formats and data.get('drmProtected'): + self.report_drm(video_id) + + thumbnails = [{ + 'id': type, + 'url': thumb_url, + } for type, thumb_url in (asset.get('images') or {}).items()] + + return { + 'id': video_id, + 'url': video_url, + 'title': title, + 'description': strip_or_none(asset.get('description')), + 'thumbnails': thumbnails, + 'timestamp': parse_iso8601(asset.get('live_broadcast_time') or asset.get('update_time')), + 'duration': float_or_none(asset.get('accurateDuration') or asset.get('duration')), + 'view_count': int_or_none(asset.get('views')), + 'categories': asset.get('tags', '').split(','), + 'formats': formats, + 'is_live': is_live, + } + + +class TV2ArticleIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tv2\.no/(?!v(?:ideo)?\d*/)[^?#]+/(?P\d+)' + _TESTS = [{ + 'url': 'https://www.tv2.no/underholdning/forraeder/katarina-flatland-angrer-etter-forraeder-exit/15095188/', + 'info_dict': { + 'id': '15095188', + 'title': 'Katarina Flatland angrer etter Forræder-exit', + 'description': 'SANDEFJORD (TV 2): Katarina Flatland (33) måtte følge i sine fars fotspor, da hun ble forvist fra Forræder.', + }, + 'playlist_count': 2, + }, { + 'url': 'http://www.tv2.no/a/6930542', + 'only_matching': True, + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + webpage = self._download_webpage(url, playlist_id) + + # Old embed pattern (looks unused nowadays) + assets = re.findall(r'data-assetid=["\'](\d+)', webpage) + + if not assets: + # New embed pattern + for v in re.findall(r'(?s)(?:TV2ContentboxVideo|TV2\.TV2Video)\(({.+?})\)', webpage): + video = self._parse_json( + v, playlist_id, transform_source=js_to_json, fatal=False) + if not video: + continue + asset = video.get('assetId') + if asset: + assets.append(asset) + + entries = [ + self.url_result('http://www.tv2.no/v/%s' % asset_id, 'TV2') + for asset_id in assets] + + title = remove_end(self._og_search_title(webpage), ' - TV2.no') + description = remove_end(self._og_search_description(webpage), ' - TV2.no') + + return self.playlist_result(entries, playlist_id, title, description) + + +class KatsomoIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?(?:katsomo|mtv(uutiset)?)\.fi/(?:sarja/[0-9a-z-]+-\d+/[0-9a-z-]+-|(?:#!/)?jakso/(?:\d+/[^/]+/)?|video/prog)(?P\d+)' + _TESTS = [{ + 'url': 'https://www.mtv.fi/sarja/mtv-uutiset-live-33001002003/lahden-pelicans-teki-kovan-ratkaisun-ville-nieminen-pihalle-1181321', + 'info_dict': { + 'id': '1181321', + 'ext': 'mp4', + 'title': 'Lahden Pelicans teki kovan ratkaisun – Ville Nieminen pihalle', + 'description': 'Päätöksen teki Pelicansin hallitus.', + 'timestamp': 1575116484, + 'upload_date': '20191130', + 'duration': 37.12, + 'view_count': int, + 'categories': list, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + 'url': 'http://www.katsomo.fi/#!/jakso/33001005/studio55-fi/658521/jukka-kuoppamaki-tekee-yha-lauluja-vaikka-lentokoneessa', + 'only_matching': True, + }, { + 'url': 'https://www.mtvuutiset.fi/video/prog1311159', + 'only_matching': True, + }, { + 'url': 'https://www.katsomo.fi/#!/jakso/1311159', + 'only_matching': True, + }] + _API_DOMAIN = 'api.katsomo.fi' + _PROTOCOLS = ('HLS', 'MPD') + _GEO_COUNTRIES = ['FI'] + + def _real_extract(self, url): + video_id = self._match_id(url) + api_base = 'http://%s/api/web/asset/%s' % (self._API_DOMAIN, video_id) + + asset = self._download_json( + api_base + '.json', video_id, + 'Downloading metadata JSON')['asset'] + title = asset.get('subtitle') or asset['title'] + is_live = asset.get('live') is True + + formats = [] + format_urls = [] + for protocol in self._PROTOCOLS: + try: + data = self._download_json( + api_base + '/play.json?protocol=%s&videoFormat=SMIL+ISMUSP' % protocol, + video_id, 'Downloading play JSON')['playback'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + error = self._parse_json(e.cause.response.read().decode(), video_id)['error'] + error_code = error.get('code') + if error_code == 'ASSET_PLAYBACK_INVALID_GEO_LOCATION': + self.raise_geo_restricted(countries=self._GEO_COUNTRIES) + elif error_code == 'SESSION_NOT_AUTHENTICATED': + self.raise_login_required() + raise ExtractorError(error['description']) + raise + items = try_get(data, lambda x: x['items']['item']) + if not items: + continue + if not isinstance(items, list): + items = [items] + for item in items: + if not isinstance(item, dict): + continue + video_url = item.get('url') + if not video_url or video_url in format_urls: + continue + format_id = '%s-%s' % (protocol.lower(), item.get('mediaFormat')) + if not self._is_valid_url(video_url, video_id, format_id): + continue + format_urls.append(video_url) + ext = determine_ext(video_url) + if ext == 'f4m': + formats.extend(self._extract_f4m_formats( + video_url, video_id, f4m_id=format_id, fatal=False)) + elif ext == 'm3u8': + if not data.get('drmProtected'): + formats.extend(self._extract_m3u8_formats( + video_url, video_id, 'mp4', live=is_live, m3u8_id=format_id, fatal=False)) + elif ext == 'mpd': + formats.extend(self._extract_mpd_formats( + video_url, video_id, format_id, fatal=False)) + elif ext == 'ism' or video_url.endswith('.ism/Manifest'): + pass + else: + formats.append({ + 'url': video_url, + 'format_id': format_id, + 'tbr': int_or_none(item.get('bitrate')), + 'filesize': int_or_none(item.get('fileSize')), + }) + if not formats and data.get('drmProtected'): + self.report_drm(video_id) + + thumbnails = [{ + 'id': thumbnail.get('@type'), + 'url': thumbnail.get('url'), + } for _, thumbnail in (asset.get('imageVersions') or {}).items()] + + return { + 'id': video_id, + 'url': video_url, + 'title': title, + 'description': strip_or_none(asset.get('description')), + 'thumbnails': thumbnails, + 'timestamp': parse_iso8601(asset.get('createTime')), + 'duration': float_or_none(asset.get('accurateDuration') or asset.get('duration')), + 'view_count': int_or_none(asset.get('views')), + 'categories': asset.get('keywords', '').split(','), + 'formats': formats, + 'is_live': is_live, + } + + +class MTVUutisetArticleIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)mtvuutiset\.fi/artikkeli/[^/]+/(?P\d+)' + _TESTS = [{ + 'url': 'https://www.mtvuutiset.fi/artikkeli/tallaisia-vaurioita-viking-amorellassa-on-useamman-osaston-alla-vetta/7931384', + 'info_dict': { + 'id': '1311159', + 'ext': 'mp4', + 'title': 'Viking Amorellan matkustajien evakuointi on alkanut – tältä operaatio näyttää laivalla', + 'description': 'Viking Amorellan matkustajien evakuointi on alkanut – tältä operaatio näyttää laivalla', + 'timestamp': 1600608966, + 'upload_date': '20200920', + 'duration': 153.7886666, + 'view_count': int, + 'categories': list, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + # multiple Youtube embeds + 'url': 'https://www.mtvuutiset.fi/artikkeli/50-vuotta-subarun-vastaiskua/6070962', + 'only_matching': True, + }] + + def _real_extract(self, url): + article_id = self._match_id(url) + article = self._download_json( + 'http://api.mtvuutiset.fi/mtvuutiset/api/json/' + article_id, + article_id) + + def entries(): + for video in (article.get('videos') or []): + video_type = video.get('videotype') + video_url = video.get('url') + if not (video_url and video_type in ('katsomo', 'youtube')): + continue + yield self.url_result( + video_url, video_type.capitalize(), video.get('video_id')) + + return self.playlist_result( + entries(), article_id, article.get('title'), article.get('description')) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tv24ua.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv24ua.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tv24ua.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tv24ua.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tv2dk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv2dk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tv2dk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tv2dk.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tv2hu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv2hu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tv2hu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tv2hu.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tv4.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv4.py new file mode 100644 index 0000000..10a2fe6 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv4.py @@ -0,0 +1,149 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + bool_or_none, + int_or_none, + parse_iso8601, + traverse_obj, + url_or_none, +) + + +class TV4IE(InfoExtractor): + IE_DESC = 'tv4.se and tv4play.se' + _VALID_URL = r'''(?x)https?://(?:www\.)? + (?: + tv4\.se/(?:[^/]+)/klipp/(?:.*)-| + tv4play\.se/ + (?: + (?:program|barn)/(?:(?:[^/]+/){1,2}|(?:[^\?]+)\?video_id=)| + iframe/video/| + film/| + sport/| + ) + )(?P[0-9]+)''' + _GEO_BYPASS = False + _TESTS = [ + { + # not geo-restricted + 'url': 'http://www.tv4.se/kalla-fakta/klipp/kalla-fakta-5-english-subtitles-2491650', + 'md5': 'cb837212f342d77cec06e6dad190e96d', + 'info_dict': { + 'id': '2491650', + 'ext': 'mp4', + 'title': 'Kalla Fakta 5 (english subtitles)', + 'description': '2491650', + 'series': 'Kalla fakta', + 'duration': 1335, + 'thumbnail': r're:^https?://[^/?#]+/api/v2/img/', + 'timestamp': 1385373240, + 'upload_date': '20131125', + }, + 'params': {'skip_download': 'm3u8'}, + 'expected_warnings': ['Unable to download f4m manifest'], + }, + { + 'url': 'http://www.tv4play.se/iframe/video/3054113', + 'md5': 'cb837212f342d77cec06e6dad190e96d', + 'info_dict': { + 'id': '3054113', + 'ext': 'mp4', + 'title': 'Så här jobbar ficktjuvarna - se avslöjande bilder', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'Unika bilder avslöjar hur turisternas fickor vittjas mitt på Stockholms central. Två experter på ficktjuvarna avslöjar knepen du ska se upp för.', + 'timestamp': int, + 'upload_date': '20150130', + }, + 'skip': '404 Not Found', + }, + { + 'url': 'http://www.tv4play.se/sport/3060959', + 'only_matching': True, + }, + { + 'url': 'http://www.tv4play.se/film/2378136', + 'only_matching': True, + }, + { + 'url': 'http://www.tv4play.se/barn/looney-tunes?video_id=3062412', + 'only_matching': True, + }, + { + 'url': 'http://www.tv4play.se/program/farang/3922081', + 'only_matching': True, + }, + { + 'url': 'https://www.tv4play.se/program/nyheterna/avsnitt/13315940', + 'only_matching': True, + } + ] + + def _call_api(self, endpoint, video_id, headers=None, query={}): + return self._download_json( + f'https://playback2.a2d.tv/{endpoint}/{video_id}', video_id, + f'Downloading {endpoint} API JSON', headers=headers, query={ + 'service': 'tv4', + 'device': 'browser', + 'protocol': 'hls', + **query, + }) + + def _real_extract(self, url): + video_id = self._match_id(url) + + info = traverse_obj(self._call_api('asset', video_id, query={ + 'protocol': 'hls,dash', + 'drm': 'widevine', + }), ('metadata', {dict})) or {} + + manifest_url = self._call_api( + 'play', video_id, headers=self.geo_verification_headers())['playbackItem']['manifestUrl'] + + formats, subtitles = [], {} + + fmts, subs = self._extract_m3u8_formats_and_subtitles( + manifest_url, video_id, 'mp4', + 'm3u8_native', m3u8_id='hls', fatal=False) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + + fmts, subs = self._extract_mpd_formats_and_subtitles( + manifest_url.replace('.m3u8', '.mpd'), + video_id, mpd_id='dash', fatal=False) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + + fmts = self._extract_f4m_formats( + manifest_url.replace('.m3u8', '.f4m'), + video_id, f4m_id='hds', fatal=False) + formats.extend(fmts) + + fmts, subs = self._extract_ism_formats_and_subtitles( + re.sub(r'\.ism/.*?\.m3u8', r'.ism/Manifest', manifest_url), + video_id, ism_id='mss', fatal=False) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + + if not formats and info.get('is_geo_restricted'): + self.raise_geo_restricted( + 'This video is not available from your location due to geo-restriction, or not being authenticated', + countries=['SE']) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(info, { + 'title': ('title', {str}), + 'description': ('description', {str}), + 'timestamp': (('broadcast_date_time', 'broadcastDateTime'), {parse_iso8601}), + 'duration': ('duration', {int_or_none}), + 'thumbnail': ('image', {url_or_none}), + 'is_live': ('isLive', {bool_or_none}), + 'series': ('seriesTitle', {str}), + 'season_number': ('seasonNumber', {int_or_none}), + 'episode': ('episodeTitle', {str}), + 'episode_number': ('episodeNumber', {int_or_none}), + }, get_all=False), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tv5mondeplus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv5mondeplus.py new file mode 100644 index 0000000..4da1b26 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv5mondeplus.py @@ -0,0 +1,181 @@ +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + determine_ext, + extract_attributes, + int_or_none, + parse_duration, + traverse_obj, + try_get, + url_or_none, +) + + +class TV5MondePlusIE(InfoExtractor): + IE_DESC = 'TV5MONDE+' + _VALID_URL = r'https?://(?:www\.)?(?:tv5mondeplus|revoir\.tv5monde)\.com/toutes-les-videos/[^/]+/(?P[^/?#]+)' + _TESTS = [{ + # movie + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/cinema/les-novices', + 'md5': 'c86f60bf8b75436455b1b205f9745955', + 'info_dict': { + 'id': 'ZX0ipMyFQq_6D4BA7b', + 'display_id': 'les-novices', + 'ext': 'mp4', + 'title': 'Les novices', + 'description': 'md5:2e7c33ba3ad48dabfcc2a956b88bde2b', + 'upload_date': '20230821', + 'thumbnail': 'https://revoir.tv5monde.com/uploads/media/video_thumbnail/0738/60/01e952b7ccf36b7c6007ec9131588954ab651de9.jpeg', + 'duration': 5177, + 'episode': 'Les novices', + }, + }, { + # series episode + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/opj-les-dents-de-la-terre-2', + 'info_dict': { + 'id': 'wJ0eeEPozr_6D4BA7b', + 'display_id': 'opj-les-dents-de-la-terre-2', + 'ext': 'mp4', + 'title': "OPJ - Les dents de la Terre (2)", + 'description': 'md5:288f87fd68d993f814e66e60e5302d9d', + 'upload_date': '20230823', + 'series': 'OPJ', + 'episode': 'Les dents de la Terre (2)', + 'duration': 2877, + 'thumbnail': 'https://dl-revoir.tv5monde.com/images/1a/5753448.jpg' + }, + }, { + # movie + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/cinema/ceux-qui-travaillent', + 'md5': '32fa0cde16a4480d1251502a66856d5f', + 'info_dict': { + 'id': 'dc57a011-ec4b-4648-2a9a-4f03f8352ed3', + 'display_id': 'ceux-qui-travaillent', + 'ext': 'mp4', + 'title': 'Ceux qui travaillent', + 'description': 'md5:570e8bb688036ace873b2d50d24c026d', + 'upload_date': '20210819', + }, + 'skip': 'no longer available', + }, { + # series episode + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/vestiaires-caro-actrice', + 'info_dict': { + 'id': '9e9d599e-23af-6915-843e-ecbf62e97925', + 'display_id': 'vestiaires-caro-actrice', + 'ext': 'mp4', + 'title': "Vestiaires - Caro actrice", + 'description': 'md5:db15d2e1976641e08377f942778058ea', + 'upload_date': '20210819', + 'series': "Vestiaires", + 'episode': 'Caro actrice', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'no longer available', + }, { + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/neuf-jours-en-hiver-neuf-jours-en-hiver', + 'only_matching': True, + }, { + 'url': 'https://revoir.tv5monde.com/toutes-les-videos/info-societe/le-journal-de-la-rts-edition-du-30-01-20-19h30', + 'only_matching': True, + }] + _GEO_BYPASS = False + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + if ">Ce programme n'est malheureusement pas disponible pour votre zone géographique.<" in webpage: + self.raise_geo_restricted(countries=['FR']) + + title = episode = self._html_search_regex(r'

      ([^<]+)', webpage, 'title') + vpl_data = extract_attributes(self._search_regex( + r'(<[^>]+class="video_player_loader"[^>]+>)', + webpage, 'video player loader')) + + video_files = self._parse_json( + vpl_data['data-broadcast'], display_id) + formats = [] + video_id = None + + def process_video_files(v): + nonlocal video_id + for video_file in v: + v_url = video_file.get('url') + if not v_url: + continue + if video_file.get('type') == 'application/deferred': + d_param = urllib.parse.quote(v_url) + token = video_file.get('token') + if not token: + continue + deferred_json = self._download_json( + f'https://api.tv5monde.com/player/asset/{d_param}/resolve?condenseKS=true', display_id, + note='Downloading deferred info', headers={'Authorization': f'Bearer {token}'}, fatal=False) + v_url = traverse_obj(deferred_json, (0, 'url', {url_or_none})) + if not v_url: + continue + # data-guid from the webpage isn't stable, use the material id from the json urls + video_id = self._search_regex( + r'materials/([\da-zA-Z]{10}_[\da-fA-F]{7})/', v_url, 'video id', default=None) + process_video_files(deferred_json) + + video_format = video_file.get('format') or determine_ext(v_url) + if video_format == 'm3u8': + formats.extend(self._extract_m3u8_formats( + v_url, display_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + elif video_format == 'mpd': + formats.extend(self._extract_mpd_formats( + v_url, display_id, fatal=False)) + else: + formats.append({ + 'url': v_url, + 'format_id': video_format, + }) + + process_video_files(video_files) + + metadata = self._parse_json( + vpl_data['data-metadata'], display_id) + duration = (int_or_none(try_get(metadata, lambda x: x['content']['duration'])) + or parse_duration(self._html_search_meta('duration', webpage))) + + description = self._html_search_regex( + r'(?s)]+class=["\']episode-texte[^>]+>(.+?)', webpage, + 'description', fatal=False) + + series = self._html_search_regex( + r']+class=["\']episode-emission[^>]+>([^<]+)', webpage, + 'series', default=None) + + if series and series != title: + title = '%s - %s' % (series, title) + + upload_date = self._search_regex( + r'(?:date_publication|publish_date)["\']\s*:\s*["\'](\d{4}_\d{2}_\d{2})', + webpage, 'upload date', default=None) + if upload_date: + upload_date = upload_date.replace('_', '') + + if not video_id: + video_id = self._search_regex( + (r'data-guid=["\']([\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})', + r'id_contenu["\']\s:\s*(\d+)'), webpage, 'video id', + default=display_id) + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': description, + 'thumbnail': vpl_data.get('data-image'), + 'duration': duration, + 'upload_date': upload_date, + 'formats': formats, + 'series': series, + 'episode': episode, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tv5unis.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tv5unis.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tv5unis.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tv5unis.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tva.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tva.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tva.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tva.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvanouvelles.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvanouvelles.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvanouvelles.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvanouvelles.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvc.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvc.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvc.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvc.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tver.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tver.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tver.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tver.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvigle.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvigle.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvigle.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvigle.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tviplayer.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tviplayer.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tviplayer.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tviplayer.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvland.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvland.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvland.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvland.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvn24.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvn24.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvn24.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvn24.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvnet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvnet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvnet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvnet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvnoe.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvnoe.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvnoe.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvnoe.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvnow.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvnow.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvnow.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvnow.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tvopengr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvopengr.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tvopengr.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tvopengr.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tvp.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvp.py new file mode 100644 index 0000000..2aa0dd8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvp.py @@ -0,0 +1,629 @@ +import itertools +import random +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + determine_ext, + dict_get, + ExtractorError, + int_or_none, + js_to_json, + str_or_none, + strip_or_none, + traverse_obj, + try_get, + url_or_none, +) + + +class TVPIE(InfoExtractor): + IE_NAME = 'tvp' + IE_DESC = 'Telewizja Polska' + _VALID_URL = r'https?://(?:[^/]+\.)?(?:tvp(?:parlament)?\.(?:pl|info)|tvpworld\.com|swipeto\.pl)/(?:(?!\d+/)[^/]+/)*(?P\d+)' + + _TESTS = [{ + # TVPlayer 2 in js wrapper + 'url': 'https://swipeto.pl/64095316/uliczny-foxtrot-wypozyczalnia-kaset-kto-pamieta-dvdvideo', + 'info_dict': { + 'id': '64095316', + 'ext': 'mp4', + 'title': 'Uliczny Foxtrot — Wypożyczalnia kaset. Kto pamiÄ™ta DVD-Video?', + 'age_limit': 0, + 'duration': 374, + 'thumbnail': r're:https://.+', + }, + 'expected_warnings': [ + 'Failed to download ISM manifest: HTTP Error 404: Not Found', + 'Failed to download m3u8 information: HTTP Error 404: Not Found', + ], + }, { + # TVPlayer legacy + 'url': 'https://www.tvp.pl/polska-press-video-uploader/wideo/62042351', + 'info_dict': { + 'id': '62042351', + 'ext': 'mp4', + 'title': 'Wideo', + 'description': 'Wideo Kamera', + 'duration': 24, + 'age_limit': 0, + 'thumbnail': r're:https://.+', + }, + }, { + # TVPlayer 2 in iframe + 'url': 'https://wiadomosci.tvp.pl/50725617/dzieci-na-sprzedaz-dla-homoseksualistow', + 'info_dict': { + 'id': '50725617', + 'ext': 'mp4', + 'title': 'Dzieci na sprzedaż dla homoseksualistów', + 'description': 'md5:7d318eef04e55ddd9f87a8488ac7d590', + 'age_limit': 12, + 'duration': 259, + 'thumbnail': r're:https://.+', + }, + }, { + # TVPlayer 2 in client-side rendered website (regional; window.__newsData) + 'url': 'https://warszawa.tvp.pl/25804446/studio-yayo', + 'info_dict': { + 'id': '25804446', + 'ext': 'mp4', + 'title': 'Studio Yayo', + 'upload_date': '20160616', + 'timestamp': 1466075700, + 'age_limit': 0, + 'duration': 20, + 'thumbnail': r're:https://.+', + }, + 'skip': 'Geo-blocked outside PL', + }, { + # TVPlayer 2 in client-side rendered website (tvp.info; window.__videoData) + 'url': 'https://www.tvp.info/52880236/09042021-0800', + 'info_dict': { + 'id': '52880236', + 'ext': 'mp4', + 'title': '09.04.2021, 08:00', + 'age_limit': 0, + 'thumbnail': r're:https://.+', + }, + 'skip': 'Geo-blocked outside PL', + }, { + # client-side rendered (regional) program (playlist) page + 'url': 'https://opole.tvp.pl/9660819/rozmowa-dnia', + 'info_dict': { + 'id': '9660819', + 'description': 'Od poniedziaÅ‚ku do piÄ…tku o 18:55', + 'title': 'Rozmowa dnia', + }, + 'playlist_mincount': 1800, + 'params': { + 'skip_download': True, + } + }, { + # ABC-specific video embeding + # moved to https://bajkowakraina.tvp.pl/wideo/50981130,teleranek,51027049,zubr,51116450 + 'url': 'https://abc.tvp.pl/48636269/zubry-odc-124', + 'info_dict': { + 'id': '48320456', + 'ext': 'mp4', + 'title': 'Teleranek, Å»ubr', + }, + 'skip': 'unavailable', + }, { + # yet another vue page + 'url': 'https://jp2.tvp.pl/46925618/filmy', + 'info_dict': { + 'id': '46925618', + 'title': 'Filmy', + }, + 'playlist_mincount': 19, + }, { + 'url': 'http://vod.tvp.pl/seriale/obyczajowe/na-sygnale/sezon-2-27-/odc-39/17834272', + 'only_matching': True, + }, { + 'url': 'http://wiadomosci.tvp.pl/25169746/24052016-1200', + 'only_matching': True, + }, { + 'url': 'http://krakow.tvp.pl/25511623/25lecie-mck-wyjatkowe-miejsce-na-mapie-krakowa', + 'only_matching': True, + }, { + 'url': 'http://teleexpress.tvp.pl/25522307/wierni-wzieli-udzial-w-procesjach', + 'only_matching': True, + }, { + 'url': 'http://sport.tvp.pl/25522165/krychowiak-uspokaja-w-sprawie-kontuzji-dwa-tygodnie-to-maksimum', + 'only_matching': True, + }, { + 'url': 'http://www.tvp.info/25511919/trwa-rewolucja-wladza-zdecydowala-sie-na-pogwalcenie-konstytucji', + 'only_matching': True, + }, { + 'url': 'https://tvp.info/49193823/teczowe-flagi-na-pomnikach-prokuratura-wszczela-postepowanie-wieszwiecej', + 'only_matching': True, + }, { + 'url': 'https://www.tvpparlament.pl/retransmisje-vod/inne/wizyta-premiera-mateusza-morawieckiego-w-firmie-berotu-sp-z-oo/48857277', + 'only_matching': True, + }, { + 'url': 'https://tvpworld.com/48583640/tescos-polish-business-bought-by-danish-chain-netto', + 'only_matching': True, + }] + + def _parse_vue_website_data(self, webpage, page_id): + website_data = self._search_regex([ + # website - regiony, tvp.info + # directory - jp2.tvp.pl + r'window\.__(?:website|directory)Data\s*=\s*({(?:.|\s)+?});', + ], webpage, 'website data') + if not website_data: + return None + return self._parse_json(website_data, page_id, transform_source=js_to_json) + + def _extract_vue_video(self, video_data, page_id=None): + if isinstance(video_data, str): + video_data = self._parse_json(video_data, page_id, transform_source=js_to_json) + thumbnails = [] + image = video_data.get('image') + if image: + for thumb in (image if isinstance(image, list) else [image]): + thmb_url = str_or_none(thumb.get('url')) + if thmb_url: + thumbnails.append({ + 'url': thmb_url, + }) + is_website = video_data.get('type') == 'website' + if is_website: + url = video_data['url'] + else: + url = 'tvp:' + str_or_none(video_data.get('_id') or page_id) + return { + '_type': 'url_transparent', + 'id': str_or_none(video_data.get('_id') or page_id), + 'url': url, + 'ie_key': (TVPIE if is_website else TVPEmbedIE).ie_key(), + 'title': str_or_none(video_data.get('title')), + 'description': str_or_none(video_data.get('lead')), + 'timestamp': int_or_none(video_data.get('release_date_long')), + 'duration': int_or_none(video_data.get('duration')), + 'thumbnails': thumbnails, + } + + def _handle_vuejs_page(self, url, webpage, page_id): + # vue client-side rendered sites (all regional pages + tvp.info) + video_data = self._search_regex([ + r'window\.__(?:news|video)Data\s*=\s*({(?:.|\s)+?})\s*;', + ], webpage, 'video data', default=None) + if video_data: + return self._extract_vue_video(video_data, page_id=page_id) + # paged playlists + website_data = self._parse_vue_website_data(webpage, page_id) + if website_data: + entries = self._vuejs_entries(url, website_data, page_id) + + return { + '_type': 'playlist', + 'id': page_id, + 'title': str_or_none(website_data.get('title')), + 'description': str_or_none(website_data.get('lead')), + 'entries': entries, + } + raise ExtractorError('Could not extract video/website data') + + def _vuejs_entries(self, url, website_data, page_id): + + def extract_videos(wd): + if wd.get('latestVideo'): + yield self._extract_vue_video(wd['latestVideo']) + for video in wd.get('videos') or []: + yield self._extract_vue_video(video) + for video in wd.get('items') or []: + yield self._extract_vue_video(video) + + yield from extract_videos(website_data) + + if website_data.get('items_total_count') > website_data.get('items_per_page'): + for page in itertools.count(2): + page_website_data = self._parse_vue_website_data( + self._download_webpage(url, page_id, note='Downloading page #%d' % page, + query={'page': page}), + page_id) + if not page_website_data.get('videos') and not page_website_data.get('items'): + break + yield from extract_videos(page_website_data) + + def _real_extract(self, url): + page_id = self._match_id(url) + webpage, urlh = self._download_webpage_handle(url, page_id) + + # The URL may redirect to a VOD + # example: https://vod.tvp.pl/48463890/wadowickie-spotkania-z-janem-pawlem-ii + for ie_cls in (TVPVODSeriesIE, TVPVODVideoIE): + if ie_cls.suitable(urlh.url): + return self.url_result(urlh.url, ie=ie_cls.ie_key(), video_id=page_id) + + if re.search( + r'window\.__(?:video|news|website|directory)Data\s*=', + webpage): + return self._handle_vuejs_page(url, webpage, page_id) + + # classic server-side rendered sites + video_id = self._search_regex([ + r']+src="[^"]*?embed\.php\?(?:[^&]+&)*ID=(\d+)', + r']+src="[^"]*?object_id=(\d+)', + r"object_id\s*:\s*'(\d+)'", + r'data-video-id="(\d+)"', + + # abc.tvp.pl - somehow there are more than one video IDs that seem to be the same video? + # the first one is referenced to as "copyid", and seems to be unused by the website + r'', + ], webpage, 'video id', default=page_id) + return { + '_type': 'url_transparent', + 'url': 'tvp:' + video_id, + 'description': self._og_search_description( + webpage, default=None) or (self._html_search_meta( + 'description', webpage, default=None) + if '//s.tvp.pl/files/portal/v' in webpage else None), + 'thumbnail': self._og_search_thumbnail(webpage, default=None), + 'ie_key': 'TVPEmbed', + } + + +class TVPStreamIE(InfoExtractor): + IE_NAME = 'tvp:stream' + _VALID_URL = r'(?:tvpstream:|https?://(?:tvpstream\.vod|stream)\.tvp\.pl/(?:\?(?:[^&]+[&;])*channel_id=)?)(?P\d*)' + _TESTS = [{ + 'url': 'https://stream.tvp.pl/?channel_id=56969941', + 'only_matching': True, + }, { + # untestable as "video" id changes many times across a day + 'url': 'https://tvpstream.vod.tvp.pl/?channel_id=1455', + 'only_matching': True, + }, { + 'url': 'tvpstream:39821455', + 'only_matching': True, + }, { + # the default stream when you provide no channel_id, most probably TVP Info + 'url': 'tvpstream:', + 'only_matching': True, + }, { + 'url': 'https://tvpstream.vod.tvp.pl/', + 'only_matching': True, + }] + + def _real_extract(self, url): + channel_id = self._match_id(url) + channel_url = self._proto_relative_url('//stream.tvp.pl/?channel_id=%s' % channel_id or 'default') + webpage = self._download_webpage(channel_url, channel_id or 'default', 'Downloading channel webpage') + channels = self._search_json( + r'window\.__channels\s*=', webpage, 'channel list', channel_id, + contains_pattern=r'\[\s*{(?s:.+)}\s*]') + channel = traverse_obj(channels, (lambda _, v: channel_id == str(v['id'])), get_all=False) if channel_id else channels[0] + audition = traverse_obj(channel, ('items', lambda _, v: v['is_live'] is True), get_all=False) + return { + '_type': 'url_transparent', + 'id': channel_id or channel['id'], + 'url': 'tvp:%s' % audition['video_id'], + 'title': audition.get('title'), + 'alt_title': channel.get('title'), + 'is_live': True, + 'ie_key': 'TVPEmbed', + } + + +class TVPEmbedIE(InfoExtractor): + IE_NAME = 'tvp:embed' + IE_DESC = 'Telewizja Polska' + _GEO_BYPASS = False + _VALID_URL = r'''(?x) + (?: + tvp: + |https?:// + (?:[^/]+\.)? + (?:tvp(?:parlament)?\.pl|tvp\.info|tvpworld\.com|swipeto\.pl)/ + (?:sess/ + (?:tvplayer\.php\?.*?object_id + |TVPlayer2/(?:embed|api)\.php\?.*[Ii][Dd]) + |shared/details\.php\?.*?object_id) + =) + (?P\d+) + ''' + _EMBED_REGEX = [rf'(?x)]+?src=(["\'])(?P{_VALID_URL[4:]})'] + + _TESTS = [{ + 'url': 'tvp:194536', + 'info_dict': { + 'id': '194536', + 'ext': 'mp4', + 'title': 'Czas honoru, odc. 13 – WÅ‚adek', + 'description': 'md5:76649d2014f65c99477be17f23a4dead', + 'age_limit': 12, + 'duration': 2652, + 'series': 'Czas honoru', + 'episode': 'Episode 13', + 'episode_number': 13, + 'season': 'sezon 1', + 'thumbnail': r're:https://.+', + }, + }, { + 'url': 'https://www.tvp.pl/sess/tvplayer.php?object_id=51247504&autoplay=false', + 'info_dict': { + 'id': '51247504', + 'ext': 'mp4', + 'title': 'Razmova 091220', + 'duration': 876, + 'age_limit': 0, + 'thumbnail': r're:https://.+', + }, + }, { + # TVPlayer2 embed URL + 'url': 'https://tvp.info/sess/TVPlayer2/embed.php?ID=50595757', + 'only_matching': True, + }, { + 'url': 'https://wiadomosci.tvp.pl/sess/TVPlayer2/api.php?id=51233452', + 'only_matching': True, + }, { + # pulsembed on dziennik.pl + 'url': 'https://www.tvp.pl/shared/details.php?copy_id=52205981&object_id=52204505&autoplay=false&is_muted=false&allowfullscreen=true&template=external-embed/video/iframe-video.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + # it could be anything that is a valid JS function name + callback = random.choice(( + 'jebac_pis', + 'jebacpis', + 'ziobro', + 'sasin70', + 'sasin_przejebal_70_milionow_PLN', + 'tvp_is_a_state_propaganda_service', + )) + + webpage = self._download_webpage( + ('https://www.tvp.pl/sess/TVPlayer2/api.php?id=%s' + + '&@method=getTvpConfig&@callback=%s') % (video_id, callback), video_id) + + # stripping JSONP padding + datastr = webpage[15 + len(callback):-3] + if datastr.startswith('null,'): + error = self._parse_json(datastr[5:], video_id, fatal=False) + error_desc = traverse_obj(error, (0, 'desc')) + + if error_desc == 'Obiekt wymaga pÅ‚atnoÅ›ci': + raise ExtractorError('Video requires payment and log-in, but log-in is not implemented') + + raise ExtractorError(error_desc or 'unexpected JSON error') + + content = self._parse_json(datastr, video_id)['content'] + info = content['info'] + is_live = try_get(info, lambda x: x['isLive'], bool) + + if info.get('isGeoBlocked'): + # actual country list is not provided, we just assume it's always available in PL + self.raise_geo_restricted(countries=['PL']) + + formats = [] + for file in content['files']: + video_url = url_or_none(file.get('url')) + if not video_url: + continue + ext = determine_ext(video_url, None) + if ext == 'm3u8': + formats.extend(self._extract_m3u8_formats(video_url, video_id, m3u8_id='hls', fatal=False, live=is_live)) + elif ext == 'mpd': + if is_live: + # doesn't work with either ffmpeg or native downloader + continue + formats.extend(self._extract_mpd_formats(video_url, video_id, mpd_id='dash', fatal=False)) + elif ext == 'f4m': + formats.extend(self._extract_f4m_formats(video_url, video_id, f4m_id='hds', fatal=False)) + elif video_url.endswith('.ism/manifest'): + formats.extend(self._extract_ism_formats(video_url, video_id, ism_id='mss', fatal=False)) + else: + formats.append({ + 'format_id': 'direct', + 'url': video_url, + 'ext': ext or file.get('type'), + 'fps': int_or_none(traverse_obj(file, ('quality', 'fps'))), + 'tbr': int_or_none(traverse_obj(file, ('quality', 'bitrate')), scale=1000), + 'width': int_or_none(traverse_obj(file, ('quality', 'width'))), + 'height': int_or_none(traverse_obj(file, ('quality', 'height'))), + }) + + title = dict_get(info, ('subtitle', 'title', 'seoTitle')) + description = dict_get(info, ('description', 'seoDescription')) + thumbnails = [] + for thumb in content.get('posters') or (): + thumb_url = thumb.get('src') + if not thumb_url or '{width}' in thumb_url or '{height}' in thumb_url: + continue + thumbnails.append({ + 'url': thumb.get('src'), + 'width': thumb.get('width'), + 'height': thumb.get('height'), + }) + age_limit = try_get(info, lambda x: x['ageGroup']['minAge'], int) + if age_limit == 1: + age_limit = 0 + duration = try_get(info, lambda x: x['duration'], int) if not is_live else None + + subtitles = {} + for sub in content.get('subtitles') or []: + if not sub.get('url'): + continue + subtitles.setdefault(sub['lang'], []).append({ + 'url': sub['url'], + 'ext': sub.get('type'), + }) + + info_dict = { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnails': thumbnails, + 'age_limit': age_limit, + 'is_live': is_live, + 'duration': duration, + 'formats': formats, + 'subtitles': subtitles, + } + + # vod.tvp.pl + if info.get('vortalName') == 'vod': + info_dict.update({ + 'title': '%s, %s' % (info.get('title'), info.get('subtitle')), + 'series': info.get('title'), + 'season': info.get('season'), + 'episode_number': info.get('episode'), + }) + + return info_dict + + +class TVPVODBaseIE(InfoExtractor): + _API_BASE_URL = 'https://vod.tvp.pl/api/products' + + def _call_api(self, resource, video_id, query={}, **kwargs): + is_valid = lambda x: 200 <= x < 300 + document, urlh = self._download_json_handle( + f'{self._API_BASE_URL}/{resource}', video_id, + query={'lang': 'pl', 'platform': 'BROWSER', **query}, + expected_status=lambda x: is_valid(x) or 400 <= x < 500, **kwargs) + if is_valid(urlh.status): + return document + raise ExtractorError(f'Woronicza said: {document.get("code")} (HTTP {urlh.status})') + + def _parse_video(self, video, with_url=True): + info_dict = traverse_obj(video, { + 'id': ('id', {str_or_none}), + 'title': 'title', + 'age_limit': ('rating', {int_or_none}), + 'duration': ('duration', {int_or_none}), + 'episode_number': ('number', {int_or_none}), + 'series': ('season', 'serial', 'title', {str_or_none}), + 'thumbnails': ('images', ..., ..., {'url': ('url', {url_or_none})}), + }) + info_dict['description'] = clean_html(dict_get(video, ('lead', 'description'))) + if with_url: + info_dict.update({ + '_type': 'url', + 'url': video['webUrl'], + 'ie_key': TVPVODVideoIE.ie_key(), + }) + return info_dict + + +class TVPVODVideoIE(TVPVODBaseIE): + IE_NAME = 'tvp:vod' + _VALID_URL = r'https?://vod\.tvp\.pl/[a-z\d-]+,\d+/[a-z\d-]+(?\d+)(?:\?[^#]+)?(?:#.+)?$' + + _TESTS = [{ + 'url': 'https://vod.tvp.pl/dla-dzieci,24/laboratorium-alchemika-odcinki,309338/odcinek-24,S01E24,311357', + 'info_dict': { + 'id': '311357', + 'ext': 'mp4', + 'title': 'Tusze termiczne. Jak zobaczyć niewidoczne. Odcinek 24', + 'description': 'md5:1d4098d3e537092ccbac1abf49b7cd4c', + 'duration': 300, + 'episode_number': 24, + 'episode': 'Episode 24', + 'age_limit': 0, + 'series': 'Laboratorium alchemika', + 'thumbnail': 're:https?://.+', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://vod.tvp.pl/filmy-dokumentalne,163/ukrainski-sluga-narodu,339667', + 'info_dict': { + 'id': '339667', + 'ext': 'mp4', + 'title': 'UkraiÅ„ski sÅ‚uga narodu', + 'description': 'md5:b7940c0a8e439b0c81653a986f544ef3', + 'age_limit': 12, + 'duration': 3051, + 'thumbnail': 're:https?://.+', + 'subtitles': 'count:2', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'note': 'embed fails with "payment required"', + 'url': 'https://vod.tvp.pl/seriale,18/polowanie-na-cmy-odcinki,390116/odcinek-7,S01E07,398869', + 'info_dict': { + 'id': '398869', + 'ext': 'mp4', + 'title': 'odc. 7', + 'description': 'md5:dd2bb33f023dc5c2fbaddfbe4cb5dba0', + 'duration': 2750, + 'age_limit': 16, + 'series': 'Polowanie na ćmy', + 'episode_number': 7, + 'episode': 'Episode 7', + 'thumbnail': 're:https?://.+', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + info_dict = self._parse_video(self._call_api(f'vods/{video_id}', video_id), with_url=False) + + playlist = self._call_api(f'{video_id}/videos/playlist', video_id, query={'videoType': 'MOVIE'}) + + info_dict['formats'] = [] + for manifest_url in traverse_obj(playlist, ('sources', 'HLS', ..., 'src')): + info_dict['formats'].extend(self._extract_m3u8_formats(manifest_url, video_id, fatal=False)) + for manifest_url in traverse_obj(playlist, ('sources', 'DASH', ..., 'src')): + info_dict['formats'].extend(self._extract_mpd_formats(manifest_url, video_id, fatal=False)) + + info_dict['subtitles'] = {} + for sub in playlist.get('subtitles') or []: + info_dict['subtitles'].setdefault(sub.get('language') or 'und', []).append({ + 'url': sub['url'], + 'ext': 'ttml', + }) + + return info_dict + + +class TVPVODSeriesIE(TVPVODBaseIE): + IE_NAME = 'tvp:vod:series' + _VALID_URL = r'https?://vod\.tvp\.pl/[a-z\d-]+,\d+/[a-z\d-]+-odcinki,(?P\d+)(?:\?[^#]+)?(?:#.+)?$' + + _TESTS = [{ + 'url': 'https://vod.tvp.pl/seriale,18/ranczo-odcinki,316445', + 'info_dict': { + 'id': '316445', + 'title': 'Ranczo', + 'age_limit': 12, + 'categories': ['seriale'], + }, + 'playlist_count': 130, + }, { + 'url': 'https://vod.tvp.pl/programy,88/rolnik-szuka-zony-odcinki,284514', + 'only_matching': True, + }, { + 'url': 'https://vod.tvp.pl/dla-dzieci,24/laboratorium-alchemika-odcinki,309338', + 'only_matching': True, + }] + + def _entries(self, seasons, playlist_id): + for season in seasons: + episodes = self._call_api( + f'vods/serials/{playlist_id}/seasons/{season["id"]}/episodes', playlist_id, + note=f'Downloading episode list for {season["title"]}') + yield from map(self._parse_video, episodes) + + def _real_extract(self, url): + playlist_id = self._match_id(url) + metadata = self._call_api( + f'vods/serials/{playlist_id}', playlist_id, + note='Downloading serial metadata') + seasons = self._call_api( + f'vods/serials/{playlist_id}/seasons', playlist_id, + note='Downloading season list') + return self.playlist_result( + self._entries(seasons, playlist_id), playlist_id, strip_or_none(metadata.get('title')), + clean_html(traverse_obj(metadata, ('description', 'lead'), expected_type=strip_or_none)), + categories=[traverse_obj(metadata, ('mainCategory', 'name'))], + age_limit=int_or_none(metadata.get('rating')), + ) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplay.py new file mode 100644 index 0000000..48a6efe --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplay.py @@ -0,0 +1,306 @@ +import re + +from .common import InfoExtractor +from ..compat import compat_urlparse +from ..networking.exceptions import HTTPError +from ..utils import ( + determine_ext, + ExtractorError, + int_or_none, + parse_iso8601, + qualities, + traverse_obj, + try_get, + update_url_query, + url_or_none, + urljoin, +) + + +class TVPlayIE(InfoExtractor): + IE_NAME = 'mtg' + IE_DESC = 'MTG services' + _VALID_URL = r'''(?x) + (?: + mtg:| + https?:// + (?:www\.)? + (?: + tvplay(?:\.skaties)?\.lv(?:/parraides)?| + (?:tv3play|play\.tv3)\.lt(?:/programos)?| + tv3play(?:\.tv3)?\.ee/sisu + ) + /(?:[^/]+/)+ + ) + (?P\d+) + ''' + _TESTS = [ + { + 'url': 'http://www.tvplay.lv/parraides/vinas-melo-labak/418113?autostart=true', + 'md5': 'a1612fe0849455423ad8718fe049be21', + 'info_dict': { + 'id': '418113', + 'ext': 'mp4', + 'title': 'KÄdi ir Ä«ri? - Viņas melo labÄk', + 'description': 'Baiba apsmej Ä«rus, kÄdi tie ir un ko viņi dara.', + 'series': 'Viņas melo labÄk', + 'season': '2.sezona', + 'season_number': 2, + 'duration': 25, + 'timestamp': 1406097056, + 'upload_date': '20140723', + }, + }, + { + 'url': 'http://play.tv3.lt/programos/moterys-meluoja-geriau/409229?autostart=true', + 'info_dict': { + 'id': '409229', + 'ext': 'flv', + 'title': 'Moterys meluoja geriau', + 'description': 'md5:9aec0fc68e2cbc992d2a140bd41fa89e', + 'series': 'Moterys meluoja geriau', + 'episode_number': 47, + 'season': '1 sezonas', + 'season_number': 1, + 'duration': 1330, + 'timestamp': 1403769181, + 'upload_date': '20140626', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, + { + 'url': 'http://www.tv3play.ee/sisu/kodu-keset-linna/238551?autostart=true', + 'info_dict': { + 'id': '238551', + 'ext': 'flv', + 'title': 'Kodu keset linna 398537', + 'description': 'md5:7df175e3c94db9e47c0d81ffa5d68701', + 'duration': 1257, + 'timestamp': 1292449761, + 'upload_date': '20101215', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, + { + 'url': 'http://tvplay.skaties.lv/parraides/vinas-melo-labak/418113?autostart=true', + 'only_matching': True, + }, + { + 'url': 'https://tvplay.skaties.lv/vinas-melo-labak/418113/?autostart=true', + 'only_matching': True, + }, + { + # views is null + 'url': 'http://tvplay.skaties.lv/parraides/tv3-zinas/760183', + 'only_matching': True, + }, + { + 'url': 'http://tv3play.tv3.ee/sisu/kodu-keset-linna/238551?autostart=true', + 'only_matching': True, + }, + { + 'url': 'mtg:418113', + 'only_matching': True, + } + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + geo_country = self._search_regex( + r'https?://[^/]+\.([a-z]{2})', url, + 'geo country', default=None) + if geo_country: + self._initialize_geo_bypass({'countries': [geo_country.upper()]}) + video = self._download_json( + 'http://playapi.mtgx.tv/v3/videos/%s' % video_id, video_id, 'Downloading video JSON') + + title = video['title'] + + try: + streams = self._download_json( + 'http://playapi.mtgx.tv/v3/videos/stream/%s' % video_id, + video_id, 'Downloading streams JSON') + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + msg = self._parse_json(e.cause.response.read().decode('utf-8'), video_id) + raise ExtractorError(msg['msg'], expected=True) + raise + + quality = qualities(['hls', 'medium', 'high']) + formats = [] + for format_id, video_url in streams.get('streams', {}).items(): + video_url = url_or_none(video_url) + if not video_url: + continue + ext = determine_ext(video_url) + if ext == 'f4m': + formats.extend(self._extract_f4m_formats( + update_url_query(video_url, { + 'hdcore': '3.5.0', + 'plugin': 'aasp-3.5.0.151.81' + }), video_id, f4m_id='hds', fatal=False)) + elif ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + video_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + else: + fmt = { + 'format_id': format_id, + 'quality': quality(format_id), + 'ext': ext, + } + if video_url.startswith('rtmp'): + m = re.search( + r'^(?Prtmp://[^/]+/(?P[^/]+))/(?P.+)$', video_url) + if not m: + continue + fmt.update({ + 'ext': 'flv', + 'url': m.group('url'), + 'app': m.group('app'), + 'play_path': m.group('playpath'), + 'preference': -1, + }) + else: + fmt.update({ + 'url': video_url, + }) + formats.append(fmt) + + if not formats and video.get('is_geo_blocked'): + self.raise_geo_restricted( + 'This content might not be available in your country due to copyright reasons', + metadata_available=True) + + # TODO: webvtt in m3u8 + subtitles = {} + sami_path = video.get('sami_path') + if sami_path: + lang = self._search_regex( + r'_([a-z]{2})\.xml', sami_path, 'lang', + default=compat_urlparse.urlparse(url).netloc.rsplit('.', 1)[-1]) + subtitles[lang] = [{ + 'url': sami_path, + }] + + series = video.get('format_title') + episode_number = int_or_none(video.get('format_position', {}).get('episode')) + season = video.get('_embedded', {}).get('season', {}).get('title') + season_number = int_or_none(video.get('format_position', {}).get('season')) + + return { + 'id': video_id, + 'title': title, + 'description': video.get('description'), + 'series': series, + 'episode_number': episode_number, + 'season': season, + 'season_number': season_number, + 'duration': int_or_none(video.get('duration')), + 'timestamp': parse_iso8601(video.get('created_at')), + 'view_count': try_get(video, lambda x: x['views']['total'], int), + 'age_limit': int_or_none(video.get('age_limit', 0)), + 'formats': formats, + 'subtitles': subtitles, + } + + +class TVPlayHomeIE(InfoExtractor): + _VALID_URL = r'''(?x) + https?:// + (?:tv3?)? + play\.(?:tv3|skaties)\.(?Plv|lt|ee)/ + (?Plives/)? + [^?#&]+(?:episode|programme|clip)-(?P\d+) + ''' + _TESTS = [{ + 'url': 'https://play.tv3.lt/series/gauju-karai-karveliai,serial-2343791/serija-8,episode-2343828', + 'info_dict': { + 'id': '2343828', + 'ext': 'mp4', + 'title': 'Gaujų karai. Karveliai (2021) | S01E08: Serija 8', + 'description': 'md5:f6fcfbb236429f05531131640dfa7c81', + 'duration': 2710, + 'season': 'Gaujų karai. Karveliai', + 'season_number': 1, + 'release_year': 2021, + 'episode': 'Serija 8', + 'episode_number': 8, + }, + 'params': { + 'skip_download': 'm3u8', + }, + }, { + 'url': 'https://play.tv3.lt/series/moterys-meluoja-geriau-n-7,serial-2574652/serija-25,episode-3284937', + 'info_dict': { + 'id': '3284937', + 'ext': 'mp4', + 'season': 'Moterys meluoja geriau [N-7]', + 'season_number': 14, + 'release_year': 2021, + 'episode': 'Serija 25', + 'episode_number': 25, + 'title': 'Moterys meluoja geriau [N-7] (2021) | S14|E25: Serija 25', + 'description': 'md5:c6926e9710f1a126f028fbe121eddb79', + 'duration': 2440, + }, + 'skip': '404' + }, { + 'url': 'https://play.tv3.lt/lives/tv6-lt,live-2838694/optibet-a-lygos-rungtynes-marijampoles-suduva--vilniaus-riteriai,programme-3422014', + 'only_matching': True, + }, { + 'url': 'https://tv3play.skaties.lv/series/women-lie-better-lv,serial-1024464/women-lie-better-lv,episode-1038762', + 'only_matching': True, + }, { + 'url': 'https://play.tv3.ee/series/_,serial-2654462/_,episode-2654474', + 'only_matching': True, + }, { + 'url': 'https://tv3play.skaties.lv/clips/tv3-zinas-valsti-lidz-15novembrim-bus-majsede,clip-3464509', + 'only_matching': True, + }] + + def _real_extract(self, url): + country, is_live, video_id = self._match_valid_url(url).groups() + + api_path = 'lives/programmes' if is_live else 'vods' + data = self._download_json( + urljoin(url, f'/api/products/{api_path}/{video_id}?platform=BROWSER&lang={country.upper()}'), + video_id) + + video_type = 'CATCHUP' if is_live else 'MOVIE' + stream_id = data['programRecordingId'] if is_live else video_id + stream = self._download_json( + urljoin(url, f'/api/products/{stream_id}/videos/playlist?videoType={video_type}&platform=BROWSER'), video_id) + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + stream['sources']['HLS'][0]['src'], video_id, 'mp4', 'm3u8_native', m3u8_id='hls') + + thumbnails = set(traverse_obj( + data, (('galary', 'images', 'artworks'), ..., ..., ('miniUrl', 'mainUrl')), expected_type=url_or_none)) + + return { + 'id': video_id, + 'title': self._resolve_title(data), + 'description': traverse_obj(data, 'description', 'lead'), + 'duration': int_or_none(data.get('duration')), + 'season': traverse_obj(data, ('season', 'serial', 'title')), + 'season_number': int_or_none(traverse_obj(data, ('season', 'number'))), + 'episode': data.get('title'), + 'episode_number': int_or_none(data.get('episode')), + 'release_year': int_or_none(traverse_obj(data, ('season', 'serial', 'year'))), + 'thumbnails': [{'url': url, 'ext': 'jpg'} for url in thumbnails], + 'formats': formats, + 'subtitles': subtitles, + } + + @staticmethod + def _resolve_title(data): + return try_get(data, lambda x: ( + f'{data["season"]["serial"]["title"]} ({data["season"]["serial"]["year"]}) | ' + f'S{data["season"]["number"]:02d}E{data["episode"]:02d}: {data["title"]}' + )) or data.get('title') diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplayer.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplayer.py new file mode 100644 index 0000000..228c236 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/tvplayer.py @@ -0,0 +1,80 @@ +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + extract_attributes, + try_get, + urlencode_postdata, + ExtractorError, +) + + +class TVPlayerIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tvplayer\.com/watch/(?P[^/?#]+)' + _TEST = { + 'url': 'http://tvplayer.com/watch/bbcone', + 'info_dict': { + 'id': '89', + 'ext': 'mp4', + 'title': r're:^BBC One [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + }, + 'params': { + # m3u8 download + 'skip_download': True, + } + } + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + current_channel = extract_attributes(self._search_regex( + r'(]+class="[^"]*current-channel[^"]*"[^>]*>)', + webpage, 'channel element')) + title = current_channel['data-name'] + + resource_id = current_channel['data-id'] + + token = self._search_regex( + r'data-token=(["\'])(?P(?!\1).+)\1', webpage, + 'token', group='token') + + context = self._download_json( + 'https://tvplayer.com/watch/context', display_id, + 'Downloading JSON context', query={ + 'resource': resource_id, + 'gen': token, + }) + + validate = context['validate'] + platform = try_get( + context, lambda x: x['platform']['key'], compat_str) or 'firefox' + + try: + response = self._download_json( + 'http://api.tvplayer.com/api/v2/stream/live', + display_id, 'Downloading JSON stream', headers={ + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + }, data=urlencode_postdata({ + 'id': resource_id, + 'service': 1, + 'platform': platform, + 'validate': validate, + }))['tvplayer']['response'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError): + response = self._parse_json( + e.cause.response.read().decode(), resource_id)['tvplayer']['response'] + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, response['error']), expected=True) + raise + + formats = self._extract_m3u8_formats(response['stream'], display_id, 'mp4') + + return { + 'id': resource_id, + 'display_id': display_id, + 'title': title, + 'formats': formats, + 'is_live': True, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/tweakers.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/tweakers.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/tweakers.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/tweakers.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/twentyfourvideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/twentyfourvideo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/twentyfourvideo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/twentyfourvideo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/twentymin.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/twentymin.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/twentymin.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/twentymin.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/twentythreevideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/twentythreevideo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/twentythreevideo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/twentythreevideo.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/twitcasting.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/twitcasting.py new file mode 100644 index 0000000..540e217 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/twitcasting.py @@ -0,0 +1,306 @@ +import base64 +import itertools +import re + +from .common import InfoExtractor +from ..dependencies import websockets +from ..utils import ( + ExtractorError, + UserNotLive, + clean_html, + float_or_none, + get_element_by_class, + get_element_by_id, + parse_duration, + qualities, + str_to_int, + traverse_obj, + try_get, + unified_timestamp, + urlencode_postdata, + urljoin, +) + + +class TwitCastingIE(InfoExtractor): + _VALID_URL = r'https?://(?:[^/?#]+\.)?twitcasting\.tv/(?P[^/?#]+)/(?:movie|twplayer)/(?P\d+)' + _M3U8_HEADERS = { + 'Origin': 'https://twitcasting.tv', + 'Referer': 'https://twitcasting.tv/', + } + _TESTS = [{ + 'url': 'https://twitcasting.tv/ivetesangalo/movie/2357609', + 'md5': '745243cad58c4681dc752490f7540d7f', + 'info_dict': { + 'id': '2357609', + 'ext': 'mp4', + 'title': 'Live #2357609', + 'uploader_id': 'ivetesangalo', + 'description': 'Twitter Oficial da cantora brasileira Ivete Sangalo.', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20110822', + 'timestamp': 1313978424, + 'duration': 32, + 'view_count': int, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://twitcasting.tv/mttbernardini/movie/3689740', + 'info_dict': { + 'id': '3689740', + 'ext': 'mp4', + 'title': 'Live playing something #3689740', + 'uploader_id': 'mttbernardini', + 'description': 'md5:1dc7efa2f1ab932fcd119265cebeec69', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20120211', + 'timestamp': 1328995624, + 'duration': 681, + 'view_count': int, + }, + 'params': { + 'skip_download': True, + 'videopassword': 'abc', + }, + }, { + 'url': 'https://twitcasting.tv/loft_heaven/movie/685979292', + 'info_dict': { + 'id': '685979292', + 'ext': 'mp4', + 'title': 'ã€ç„¡æ–™é…ä¿¡ã€‘å—æ³¢ä¸€æµ·ã®hear/here “ナタリー望月哲ã•ã‚“ã«èžã編集ã¨ã€Œæ¸‹è°·ç³»ç‹‚騒曲ã€â€', + 'uploader_id': 'loft_heaven', + 'description': 'md5:3a0c7b53019df987ce545c935538bacf', + 'upload_date': '20210604', + 'timestamp': 1622802114, + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 6964, + 'view_count': int, + }, + 'params': { + 'skip_download': True, + }, + }] + + def _parse_data_movie_playlist(self, dmp, video_id): + # attempt 1: parse as JSON directly + try: + return self._parse_json(dmp, video_id) + except ExtractorError: + pass + # attempt 2: decode reversed base64 + decoded = base64.b64decode(dmp[::-1]) + return self._parse_json(decoded, video_id) + + def _real_extract(self, url): + uploader_id, video_id = self._match_valid_url(url).groups() + + webpage, urlh = self._download_webpage_handle(url, video_id) + video_password = self.get_param('videopassword') + request_data = None + if video_password: + request_data = urlencode_postdata({ + 'password': video_password, + **self._hidden_inputs(webpage), + }, encoding='utf-8') + webpage, urlh = self._download_webpage_handle( + url, video_id, data=request_data, + headers={'Origin': 'https://twitcasting.tv'}, + note='Trying video password') + if urlh.url != url and request_data: + webpage = self._download_webpage( + urlh.url, video_id, data=request_data, + headers={'Origin': 'https://twitcasting.tv'}, + note='Retrying authentication') + # has to check here as the first request can contain password input form even if the password is correct + if re.search(r'\s*]+?name="password"', webpage): + raise ExtractorError('This video is protected by a password, use the --video-password option', expected=True) + + title = (clean_html(get_element_by_id('movietitle', webpage)) + or self._html_search_meta(['og:title', 'twitter:title'], webpage, fatal=True)) + + video_js_data = try_get( + webpage, + lambda x: self._parse_data_movie_playlist(self._search_regex( + r'data-movie-playlist=\'([^\']+?)\'', + x, 'movie playlist', default=None), video_id)['2'], list) + + thumbnail = traverse_obj(video_js_data, (0, 'thumbnailUrl')) or self._og_search_thumbnail(webpage) + description = clean_html(get_element_by_id( + 'authorcomment', webpage)) or self._html_search_meta( + ['description', 'og:description', 'twitter:description'], webpage) + duration = (try_get(video_js_data, lambda x: sum(float_or_none(y.get('duration')) for y in x) / 1000) + or parse_duration(clean_html(get_element_by_class('tw-player-duration-time', webpage)))) + view_count = str_to_int(self._search_regex( + (r'Total\s*:\s*Views\s*([\d,]+)', r'ç·è¦–è´è€…\s*:\s*([\d,]+)\s*]+datetime="([^"]+)"', + webpage, 'datetime', None)) + + stream_server_data = self._download_json( + 'https://twitcasting.tv/streamserver.php?target=%s&mode=client' % uploader_id, video_id, + 'Downloading live info', fatal=False) + + is_live = 'data-status="online"' in webpage + if not traverse_obj(stream_server_data, 'llfmp4') and is_live: + self.raise_login_required(method='cookies') + + base_dict = { + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'timestamp': timestamp, + 'uploader_id': uploader_id, + 'duration': duration, + 'view_count': view_count, + 'is_live': is_live, + } + + def find_dmu(x): + data_movie_url = self._search_regex( + r'data-movie-url=(["\'])(?P(?:(?!\1).)+)\1', + x, 'm3u8 url', group='url', default=None) + if data_movie_url: + return [data_movie_url] + + m3u8_urls = (try_get(webpage, find_dmu, list) + or traverse_obj(video_js_data, (..., 'source', 'url')) + or ([f'https://twitcasting.tv/{uploader_id}/metastream.m3u8'] if is_live else None)) + if not m3u8_urls: + raise ExtractorError('Failed to get m3u8 playlist') + + if is_live: + m3u8_url = m3u8_urls[0] + formats = self._extract_m3u8_formats( + m3u8_url, video_id, ext='mp4', m3u8_id='hls', + live=True, headers=self._M3U8_HEADERS) + + if traverse_obj(stream_server_data, ('hls', 'source')): + formats.extend(self._extract_m3u8_formats( + m3u8_url, video_id, ext='mp4', m3u8_id='source', + live=True, query={'mode': 'source'}, + note='Downloading source quality m3u8', + headers=self._M3U8_HEADERS, fatal=False)) + + if websockets: + qq = qualities(['base', 'mobilesource', 'main']) + streams = traverse_obj(stream_server_data, ('llfmp4', 'streams')) or {} + for mode, ws_url in streams.items(): + formats.append({ + 'url': ws_url, + 'format_id': 'ws-%s' % mode, + 'ext': 'mp4', + 'quality': qq(mode), + 'source_preference': -10, + # TwitCasting simply sends moof atom directly over WS + 'protocol': 'websocket_frag', + }) + + infodict = { + 'formats': formats, + '_format_sort_fields': ('source', ), + } + elif len(m3u8_urls) == 1: + formats = self._extract_m3u8_formats( + m3u8_urls[0], video_id, 'mp4', headers=self._M3U8_HEADERS) + infodict = { + # No problem here since there's only one manifest + 'formats': formats, + 'http_headers': self._M3U8_HEADERS, + } + else: + infodict = { + '_type': 'multi_video', + 'entries': [{ + 'id': f'{video_id}-{num}', + 'url': m3u8_url, + 'ext': 'mp4', + # Requesting the manifests here will cause download to fail. + # So use ffmpeg instead. See: https://github.com/yt-dlp/yt-dlp/issues/382 + 'protocol': 'm3u8', + 'http_headers': self._M3U8_HEADERS, + **base_dict, + } for (num, m3u8_url) in enumerate(m3u8_urls)], + } + + return { + 'id': video_id, + **base_dict, + **infodict, + } + + +class TwitCastingLiveIE(InfoExtractor): + _VALID_URL = r'https?://(?:[^/?#]+\.)?twitcasting\.tv/(?P[^/?#]+)/?(?:[#?]|$)' + _TESTS = [{ + 'url': 'https://twitcasting.tv/ivetesangalo', + 'only_matching': True, + }, { + 'url': 'https://twitcasting.tv/c:unusedlive', + 'expected_exception': 'UserNotLive', + }] + + def _real_extract(self, url): + uploader_id = self._match_id(url) + self.to_screen( + 'Downloading live video of user {0}. ' + 'Pass "https://twitcasting.tv/{0}/show" to download the history'.format(uploader_id)) + + webpage = self._download_webpage(url, uploader_id) + current_live = self._search_regex( + (r'data-type="movie" data-id="(\d+)">', + r'tw-sound-flag-open-link" data-id="(\d+)" style=',), + webpage, 'current live ID', default=None) + if not current_live: + # fetch unfiltered /show to find running livestreams; we can't get ID of the password-protected livestream above + webpage = self._download_webpage( + f'https://twitcasting.tv/{uploader_id}/show/', uploader_id, + note='Downloading live history') + is_live = self._search_regex(r'(?s)(\s*LIVE)', webpage, 'is live?', default=None) + if is_live: + # get the first live; running live is always at the first + current_live = self._search_regex( + r'(?s)\d+)"\s*>.+?', + webpage, 'current live ID 2', default=None, group='video_id') + if not current_live: + raise UserNotLive(video_id=uploader_id) + return self.url_result('https://twitcasting.tv/%s/movie/%s' % (uploader_id, current_live)) + + +class TwitCastingUserIE(InfoExtractor): + _VALID_URL = r'https?://(?:[^/?#]+\.)?twitcasting\.tv/(?P[^/?#]+)/(:?show|archive)/?(?:[#?]|$)' + _TESTS = [{ + 'url': 'https://twitcasting.tv/natsuiromatsuri/archive/', + 'info_dict': { + 'id': 'natsuiromatsuri', + 'title': 'natsuiromatsuri - Live History', + }, + 'playlist_mincount': 235, + }, { + 'url': 'https://twitcasting.tv/noriyukicas/show', + 'only_matching': True, + }] + + def _entries(self, uploader_id): + base_url = next_url = 'https://twitcasting.tv/%s/show' % uploader_id + for page_num in itertools.count(1): + webpage = self._download_webpage( + next_url, uploader_id, query={'filter': 'watchable'}, note='Downloading page %d' % page_num) + matches = re.finditer( + r'''(?isx)/[^/]+/movie/\d+)"\s*>.+?''', + webpage) + for mobj in matches: + yield self.url_result(urljoin(base_url, mobj.group('url'))) + + next_url = self._search_regex( + r']+action=(["\'])(?P.+?)\1', page, + 'post url', default=self._LOGIN_POST_URL, group='url') + post_url = urljoin(page_url, post_url) + + headers = { + 'Referer': page_url, + 'Origin': 'https://www.twitch.tv', + 'Content-Type': 'text/plain;charset=UTF-8', + } + + response = self._download_json( + post_url, None, note, data=json.dumps(form).encode(), + headers=headers, expected_status=400) + error = dict_get(response, ('error', 'error_description', 'error_code')) + if error: + fail(error) + + if 'Authenticated successfully' in response.get('message', ''): + return None, None + + redirect_url = urljoin( + post_url, + response.get('redirect') or response['redirect_path']) + return self._download_webpage_handle( + redirect_url, None, 'Downloading login redirect page', + headers=headers) + + login_page, handle = self._download_webpage_handle( + self._LOGIN_FORM_URL, None, 'Downloading login page') + + # Some TOR nodes and public proxies are blocked completely + if 'blacklist_message' in login_page: + fail(clean_html(login_page)) + + redirect_page, handle = login_step( + login_page, handle, 'Logging in', { + 'username': username, + 'password': password, + 'client_id': self._CLIENT_ID, + }) + + # Successful login + if not redirect_page: + return + + if re.search(r'(?i)]+id="two-factor-submit"', redirect_page) is not None: + # TODO: Add mechanism to request an SMS or phone call + tfa_token = self._get_tfa_info('two-factor authentication token') + login_step(redirect_page, handle, 'Submitting TFA token', { + 'authy_token': tfa_token, + 'remember_2fa': 'true', + }) + + def _prefer_source(self, formats): + try: + source = next(f for f in formats if f['format_id'] == 'Source') + source['quality'] = 10 + except StopIteration: + for f in formats: + if '/chunked/' in f['url']: + f.update({ + 'quality': 10, + 'format_note': 'Source', + }) + + def _download_base_gql(self, video_id, ops, note, fatal=True): + headers = { + 'Content-Type': 'text/plain;charset=UTF-8', + 'Client-ID': self._CLIENT_ID, + } + gql_auth = self._get_cookies('https://gql.twitch.tv').get('auth-token') + if gql_auth: + headers['Authorization'] = 'OAuth ' + gql_auth.value + return self._download_json( + 'https://gql.twitch.tv/gql', video_id, note, + data=json.dumps(ops).encode(), + headers=headers, fatal=fatal) + + def _download_gql(self, video_id, ops, note, fatal=True): + for op in ops: + op['extensions'] = { + 'persistedQuery': { + 'version': 1, + 'sha256Hash': self._OPERATION_HASHES[op['operationName']], + } + } + return self._download_base_gql(video_id, ops, note) + + def _download_access_token(self, video_id, token_kind, param_name): + method = '%sPlaybackAccessToken' % token_kind + ops = { + 'query': '''{ + %s( + %s: "%s", + params: { + platform: "web", + playerBackend: "mediaplayer", + playerType: "site" + } + ) + { + value + signature + } + }''' % (method, param_name, video_id), + } + return self._download_base_gql( + video_id, ops, + 'Downloading %s access token GraphQL' % token_kind)['data'][method] + + def _get_thumbnails(self, thumbnail): + return [{ + 'url': re.sub(r'\d+x\d+(\.\w+)($|(?=[?#]))', r'0x0\g<1>', thumbnail), + 'preference': 1, + }, { + 'url': thumbnail, + }] if thumbnail else None + + +class TwitchVodIE(TwitchBaseIE): + IE_NAME = 'twitch:vod' + _VALID_URL = r'''(?x) + https?:// + (?: + (?:(?:www|go|m)\.)?twitch\.tv/(?:[^/]+/v(?:ideo)?|videos)/| + player\.twitch\.tv/\?.*?\bvideo=v?| + www\.twitch\.tv/[^/]+/schedule\?vodID= + ) + (?P\d+) + ''' + + _TESTS = [{ + 'url': 'http://www.twitch.tv/riotgames/v/6528877?t=5m10s', + 'info_dict': { + 'id': 'v6528877', + 'ext': 'mp4', + 'title': 'LCK Summer Split - Week 6 Day 1', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 17208, + 'timestamp': 1435131734, + 'upload_date': '20150624', + 'uploader': 'Riot Games', + 'uploader_id': 'riotgames', + 'view_count': int, + 'start_time': 310, + 'chapters': [ + { + 'start_time': 0, + 'end_time': 17208, + 'title': 'League of Legends' + } + ], + 'live_status': 'was_live', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + # Untitled broadcast (title is None) + 'url': 'http://www.twitch.tv/belkao_o/v/11230755', + 'info_dict': { + 'id': 'v11230755', + 'ext': 'mp4', + 'title': 'Untitled Broadcast', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 1638, + 'timestamp': 1439746708, + 'upload_date': '20150816', + 'uploader': 'BelkAO_o', + 'uploader_id': 'belkao_o', + 'view_count': int, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'skip': 'HTTP Error 404: Not Found', + }, { + 'url': 'http://player.twitch.tv/?t=5m10s&video=v6528877', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/videos/6528877', + 'only_matching': True, + }, { + 'url': 'https://m.twitch.tv/beagsandjam/v/247478721', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/northernlion/video/291940395', + 'only_matching': True, + }, { + 'url': 'https://player.twitch.tv/?video=480452374', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/videos/635475444', + 'info_dict': { + 'id': 'v635475444', + 'ext': 'mp4', + 'title': 'Riot Games', + 'duration': 11643, + 'uploader': 'Riot Games', + 'uploader_id': 'riotgames', + 'timestamp': 1590770569, + 'upload_date': '20200529', + 'chapters': [ + { + 'start_time': 0, + 'end_time': 573, + 'title': 'League of Legends' + }, + { + 'start_time': 573, + 'end_time': 3922, + 'title': 'Legends of Runeterra' + }, + { + 'start_time': 3922, + 'end_time': 11643, + 'title': 'Art' + } + ], + 'live_status': 'was_live', + 'thumbnail': r're:^https?://.*\.jpg$', + 'view_count': int, + }, + 'params': { + 'skip_download': True + }, + }, { + 'note': 'Storyboards', + 'url': 'https://www.twitch.tv/videos/635475444', + 'info_dict': { + 'id': 'v635475444', + 'format_id': 'sb0', + 'ext': 'mhtml', + 'title': 'Riot Games', + 'duration': 11643, + 'uploader': 'Riot Games', + 'uploader_id': 'riotgames', + 'timestamp': 1590770569, + 'upload_date': '20200529', + 'chapters': [ + { + 'start_time': 0, + 'end_time': 573, + 'title': 'League of Legends' + }, + { + 'start_time': 573, + 'end_time': 3922, + 'title': 'Legends of Runeterra' + }, + { + 'start_time': 3922, + 'end_time': 11643, + 'title': 'Art' + } + ], + 'live_status': 'was_live', + 'thumbnail': r're:^https?://.*\.jpg$', + 'view_count': int, + 'columns': int, + 'rows': int, + }, + 'params': { + 'format': 'mhtml', + 'skip_download': True + } + }, { + 'note': 'VOD with single chapter', + 'url': 'https://www.twitch.tv/videos/1536751224', + 'info_dict': { + 'id': 'v1536751224', + 'ext': 'mp4', + 'title': 'Porter Robinson Star Guardian Stream Tour with LilyPichu', + 'duration': 8353, + 'uploader': 'Riot Games', + 'uploader_id': 'riotgames', + 'timestamp': 1658267731, + 'upload_date': '20220719', + 'chapters': [ + { + 'start_time': 0, + 'end_time': 8353, + 'title': 'League of Legends' + } + ], + 'live_status': 'was_live', + 'thumbnail': r're:^https?://.*\.jpg$', + 'view_count': int, + }, + 'params': { + 'skip_download': True + }, + 'expected_warnings': ['Unable to download JSON metadata: HTTP Error 403: Forbidden'] + }, { + 'url': 'https://www.twitch.tv/tangotek/schedule?vodID=1822395420', + 'only_matching': True, + }] + + def _download_info(self, item_id): + data = self._download_gql( + item_id, [{ + 'operationName': 'VideoMetadata', + 'variables': { + 'channelLogin': '', + 'videoID': item_id, + }, + }, { + 'operationName': 'VideoPlayer_ChapterSelectButtonVideo', + 'variables': { + 'includePrivate': False, + 'videoID': item_id, + }, + }, { + 'operationName': 'VideoPlayer_VODSeekbarPreviewVideo', + 'variables': { + 'includePrivate': False, + 'videoID': item_id, + }, + }], + 'Downloading stream metadata GraphQL') + + video = traverse_obj(data, (..., 'data', 'video'), get_all=False) + if video is None: + raise ExtractorError(f'Video {item_id} does not exist', expected=True) + + video['moments'] = traverse_obj(data, (..., 'data', 'video', 'moments', 'edges', ..., 'node')) + video['storyboard'] = traverse_obj( + data, (..., 'data', 'video', 'seekPreviewsURL', {url_or_none}), get_all=False) + + return video + + def _extract_info(self, info): + status = info.get('status') + if status == 'recording': + is_live = True + elif status == 'recorded': + is_live = False + else: + is_live = None + _QUALITIES = ('small', 'medium', 'large') + quality_key = qualities(_QUALITIES) + thumbnails = [] + preview = info.get('preview') + if isinstance(preview, dict): + for thumbnail_id, thumbnail_url in preview.items(): + thumbnail_url = url_or_none(thumbnail_url) + if not thumbnail_url: + continue + if thumbnail_id not in _QUALITIES: + continue + thumbnails.append({ + 'url': thumbnail_url, + 'preference': quality_key(thumbnail_id), + }) + return { + 'id': info['_id'], + 'title': info.get('title') or 'Untitled Broadcast', + 'description': info.get('description'), + 'duration': int_or_none(info.get('length')), + 'thumbnails': thumbnails, + 'uploader': info.get('channel', {}).get('display_name'), + 'uploader_id': info.get('channel', {}).get('name'), + 'timestamp': parse_iso8601(info.get('recorded_at')), + 'view_count': int_or_none(info.get('views')), + 'is_live': is_live, + 'was_live': True, + } + + def _extract_chapters(self, info, item_id): + if not info.get('moments'): + game = traverse_obj(info, ('game', 'displayName')) + if game: + yield {'title': game} + return + + for moment in info['moments']: + start_time = int_or_none(moment.get('positionMilliseconds'), 1000) + duration = int_or_none(moment.get('durationMilliseconds'), 1000) + name = str_or_none(moment.get('description')) + + if start_time is None or duration is None: + self.report_warning(f'Important chapter information missing for chapter {name}', item_id) + continue + yield { + 'start_time': start_time, + 'end_time': start_time + duration, + 'title': name, + } + + def _extract_info_gql(self, info, item_id): + vod_id = info.get('id') or item_id + # id backward compatibility for download archives + if vod_id[0] != 'v': + vod_id = 'v%s' % vod_id + thumbnail = url_or_none(info.get('previewThumbnailURL')) + is_live = None + if thumbnail: + if re.findall(r'/404_processing_[^.?#]+\.png', thumbnail): + is_live, thumbnail = True, None + else: + is_live = False + + return { + 'id': vod_id, + 'title': info.get('title') or 'Untitled Broadcast', + 'description': info.get('description'), + 'duration': int_or_none(info.get('lengthSeconds')), + 'thumbnails': self._get_thumbnails(thumbnail), + 'uploader': try_get(info, lambda x: x['owner']['displayName'], compat_str), + 'uploader_id': try_get(info, lambda x: x['owner']['login'], compat_str), + 'timestamp': unified_timestamp(info.get('publishedAt')), + 'view_count': int_or_none(info.get('viewCount')), + 'chapters': list(self._extract_chapters(info, item_id)), + 'is_live': is_live, + 'was_live': True, + } + + def _extract_storyboard(self, item_id, storyboard_json_url, duration): + if not duration or not storyboard_json_url: + return + spec = self._download_json(storyboard_json_url, item_id, 'Downloading storyboard metadata JSON', fatal=False) or [] + # sort from highest quality to lowest + # This makes sb0 the highest-quality format, sb1 - lower, etc which is consistent with youtube sb ordering + spec.sort(key=lambda x: int_or_none(x.get('width')) or 0, reverse=True) + base = base_url(storyboard_json_url) + for i, s in enumerate(spec): + count = int_or_none(s.get('count')) + images = s.get('images') + if not (images and count): + continue + fragment_duration = duration / len(images) + yield { + 'format_id': f'sb{i}', + 'format_note': 'storyboard', + 'ext': 'mhtml', + 'protocol': 'mhtml', + 'acodec': 'none', + 'vcodec': 'none', + 'url': urljoin(base, images[0]), + 'width': int_or_none(s.get('width')), + 'height': int_or_none(s.get('height')), + 'fps': count / duration, + 'rows': int_or_none(s.get('rows')), + 'columns': int_or_none(s.get('cols')), + 'fragments': [{ + 'url': urljoin(base, path), + 'duration': fragment_duration, + } for path in images], + } + + def _real_extract(self, url): + vod_id = self._match_id(url) + + video = self._download_info(vod_id) + info = self._extract_info_gql(video, vod_id) + access_token = self._download_access_token(vod_id, 'video', 'id') + + formats = self._extract_m3u8_formats( + '%s/vod/%s.m3u8?%s' % ( + self._USHER_BASE, vod_id, + compat_urllib_parse_urlencode({ + 'allow_source': 'true', + 'allow_audio_only': 'true', + 'allow_spectre': 'true', + 'player': 'twitchweb', + 'playlist_include_framerate': 'true', + 'nauth': access_token['value'], + 'nauthsig': access_token['signature'], + })), + vod_id, 'mp4', entry_protocol='m3u8_native') + + formats.extend(self._extract_storyboard(vod_id, video.get('storyboard'), info.get('duration'))) + + self._prefer_source(formats) + info['formats'] = formats + + parsed_url = compat_urllib_parse_urlparse(url) + query = compat_parse_qs(parsed_url.query) + if 't' in query: + info['start_time'] = parse_duration(query['t'][0]) + + if info.get('timestamp') is not None: + info['subtitles'] = { + 'rechat': [{ + 'url': update_url_query( + 'https://api.twitch.tv/v5/videos/%s/comments' % vod_id, { + 'client_id': self._CLIENT_ID, + }), + 'ext': 'json', + }], + } + + return info + + +def _make_video_result(node): + assert isinstance(node, dict) + video_id = node.get('id') + if not video_id: + return + return { + '_type': 'url_transparent', + 'ie_key': TwitchVodIE.ie_key(), + 'id': 'v' + video_id, + 'url': 'https://www.twitch.tv/videos/%s' % video_id, + 'title': node.get('title'), + 'thumbnail': node.get('previewThumbnailURL'), + 'duration': float_or_none(node.get('lengthSeconds')), + 'view_count': int_or_none(node.get('viewCount')), + } + + +class TwitchCollectionIE(TwitchBaseIE): + _VALID_URL = r'https?://(?:(?:www|go|m)\.)?twitch\.tv/collections/(?P[^/]+)' + + _TESTS = [{ + 'url': 'https://www.twitch.tv/collections/wlDCoH0zEBZZbQ', + 'info_dict': { + 'id': 'wlDCoH0zEBZZbQ', + 'title': 'Overthrow Nook, capitalism for children', + }, + 'playlist_mincount': 13, + }] + + _OPERATION_NAME = 'CollectionSideBar' + + def _real_extract(self, url): + collection_id = self._match_id(url) + collection = self._download_gql( + collection_id, [{ + 'operationName': self._OPERATION_NAME, + 'variables': {'collectionID': collection_id}, + }], + 'Downloading collection GraphQL')[0]['data']['collection'] + title = collection.get('title') + entries = [] + for edge in collection['items']['edges']: + if not isinstance(edge, dict): + continue + node = edge.get('node') + if not isinstance(node, dict): + continue + video = _make_video_result(node) + if video: + entries.append(video) + return self.playlist_result( + entries, playlist_id=collection_id, playlist_title=title) + + +class TwitchPlaylistBaseIE(TwitchBaseIE): + _PAGE_LIMIT = 100 + + def _entries(self, channel_name, *args): + cursor = None + variables_common = self._make_variables(channel_name, *args) + entries_key = '%ss' % self._ENTRY_KIND + for page_num in itertools.count(1): + variables = variables_common.copy() + variables['limit'] = self._PAGE_LIMIT + if cursor: + variables['cursor'] = cursor + page = self._download_gql( + channel_name, [{ + 'operationName': self._OPERATION_NAME, + 'variables': variables, + }], + 'Downloading %ss GraphQL page %s' % (self._NODE_KIND, page_num), + fatal=False) + if not page: + break + edges = try_get( + page, lambda x: x[0]['data']['user'][entries_key]['edges'], list) + if not edges: + break + for edge in edges: + if not isinstance(edge, dict): + continue + if edge.get('__typename') != self._EDGE_KIND: + continue + node = edge.get('node') + if not isinstance(node, dict): + continue + if node.get('__typename') != self._NODE_KIND: + continue + entry = self._extract_entry(node) + if entry: + cursor = edge.get('cursor') + yield entry + if not cursor or not isinstance(cursor, compat_str): + break + + +class TwitchVideosIE(TwitchPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|go|m)\.)?twitch\.tv/(?P[^/]+)/(?:videos|profile)' + + _TESTS = [{ + # All Videos sorted by Date + 'url': 'https://www.twitch.tv/spamfish/videos?filter=all', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - All Videos sorted by Date', + }, + 'playlist_mincount': 924, + }, { + # All Videos sorted by Popular + 'url': 'https://www.twitch.tv/spamfish/videos?filter=all&sort=views', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - All Videos sorted by Popular', + }, + 'playlist_mincount': 931, + }, { + # Past Broadcasts sorted by Date + 'url': 'https://www.twitch.tv/spamfish/videos?filter=archives', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - Past Broadcasts sorted by Date', + }, + 'playlist_mincount': 27, + }, { + # Highlights sorted by Date + 'url': 'https://www.twitch.tv/spamfish/videos?filter=highlights', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - Highlights sorted by Date', + }, + 'playlist_mincount': 901, + }, { + # Uploads sorted by Date + 'url': 'https://www.twitch.tv/esl_csgo/videos?filter=uploads&sort=time', + 'info_dict': { + 'id': 'esl_csgo', + 'title': 'esl_csgo - Uploads sorted by Date', + }, + 'playlist_mincount': 5, + }, { + # Past Premieres sorted by Date + 'url': 'https://www.twitch.tv/spamfish/videos?filter=past_premieres', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - Past Premieres sorted by Date', + }, + 'playlist_mincount': 1, + }, { + 'url': 'https://www.twitch.tv/spamfish/videos/all', + 'only_matching': True, + }, { + 'url': 'https://m.twitch.tv/spamfish/videos/all', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/spamfish/videos', + 'only_matching': True, + }] + + Broadcast = collections.namedtuple('Broadcast', ['type', 'label']) + + _DEFAULT_BROADCAST = Broadcast(None, 'All Videos') + _BROADCASTS = { + 'archives': Broadcast('ARCHIVE', 'Past Broadcasts'), + 'highlights': Broadcast('HIGHLIGHT', 'Highlights'), + 'uploads': Broadcast('UPLOAD', 'Uploads'), + 'past_premieres': Broadcast('PAST_PREMIERE', 'Past Premieres'), + 'all': _DEFAULT_BROADCAST, + } + + _DEFAULT_SORTED_BY = 'Date' + _SORTED_BY = { + 'time': _DEFAULT_SORTED_BY, + 'views': 'Popular', + } + + _OPERATION_NAME = 'FilterableVideoTower_Videos' + _ENTRY_KIND = 'video' + _EDGE_KIND = 'VideoEdge' + _NODE_KIND = 'Video' + + @classmethod + def suitable(cls, url): + return (False + if any(ie.suitable(url) for ie in ( + TwitchVideosClipsIE, + TwitchVideosCollectionsIE)) + else super(TwitchVideosIE, cls).suitable(url)) + + @staticmethod + def _make_variables(channel_name, broadcast_type, sort): + return { + 'channelOwnerLogin': channel_name, + 'broadcastType': broadcast_type, + 'videoSort': sort.upper(), + } + + @staticmethod + def _extract_entry(node): + return _make_video_result(node) + + def _real_extract(self, url): + channel_name = self._match_id(url) + qs = parse_qs(url) + filter = qs.get('filter', ['all'])[0] + sort = qs.get('sort', ['time'])[0] + broadcast = self._BROADCASTS.get(filter, self._DEFAULT_BROADCAST) + return self.playlist_result( + self._entries(channel_name, broadcast.type, sort), + playlist_id=channel_name, + playlist_title='%s - %s sorted by %s' + % (channel_name, broadcast.label, + self._SORTED_BY.get(sort, self._DEFAULT_SORTED_BY))) + + +class TwitchVideosClipsIE(TwitchPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|go|m)\.)?twitch\.tv/(?P[^/]+)/(?:clips|videos/*?\?.*?\bfilter=clips)' + + _TESTS = [{ + # Clips + 'url': 'https://www.twitch.tv/vanillatv/clips?filter=clips&range=all', + 'info_dict': { + 'id': 'vanillatv', + 'title': 'vanillatv - Clips Top All', + }, + 'playlist_mincount': 1, + }, { + 'url': 'https://www.twitch.tv/dota2ruhub/videos?filter=clips&range=7d', + 'only_matching': True, + }] + + Clip = collections.namedtuple('Clip', ['filter', 'label']) + + _DEFAULT_CLIP = Clip('LAST_WEEK', 'Top 7D') + _RANGE = { + '24hr': Clip('LAST_DAY', 'Top 24H'), + '7d': _DEFAULT_CLIP, + '30d': Clip('LAST_MONTH', 'Top 30D'), + 'all': Clip('ALL_TIME', 'Top All'), + } + + # NB: values other than 20 result in skipped videos + _PAGE_LIMIT = 20 + + _OPERATION_NAME = 'ClipsCards__User' + _ENTRY_KIND = 'clip' + _EDGE_KIND = 'ClipEdge' + _NODE_KIND = 'Clip' + + @staticmethod + def _make_variables(channel_name, filter): + return { + 'login': channel_name, + 'criteria': { + 'filter': filter, + }, + } + + @staticmethod + def _extract_entry(node): + assert isinstance(node, dict) + clip_url = url_or_none(node.get('url')) + if not clip_url: + return + return { + '_type': 'url_transparent', + 'ie_key': TwitchClipsIE.ie_key(), + 'id': node.get('id'), + 'url': clip_url, + 'title': node.get('title'), + 'thumbnail': node.get('thumbnailURL'), + 'duration': float_or_none(node.get('durationSeconds')), + 'timestamp': unified_timestamp(node.get('createdAt')), + 'view_count': int_or_none(node.get('viewCount')), + 'language': node.get('language'), + } + + def _real_extract(self, url): + channel_name = self._match_id(url) + qs = parse_qs(url) + range = qs.get('range', ['7d'])[0] + clip = self._RANGE.get(range, self._DEFAULT_CLIP) + return self.playlist_result( + self._entries(channel_name, clip.filter), + playlist_id=channel_name, + playlist_title='%s - Clips %s' % (channel_name, clip.label)) + + +class TwitchVideosCollectionsIE(TwitchPlaylistBaseIE): + _VALID_URL = r'https?://(?:(?:www|go|m)\.)?twitch\.tv/(?P[^/]+)/videos/*?\?.*?\bfilter=collections' + + _TESTS = [{ + # Collections + 'url': 'https://www.twitch.tv/spamfish/videos?filter=collections', + 'info_dict': { + 'id': 'spamfish', + 'title': 'spamfish - Collections', + }, + 'playlist_mincount': 3, + }, { + 'url': 'https://www.twitch.tv/monstercat/videos?filter=collections', + 'info_dict': { + 'id': 'monstercat', + 'title': 'monstercat - Collections', + }, + 'playlist_mincount': 13, + }] + + _OPERATION_NAME = 'ChannelCollectionsContent' + _ENTRY_KIND = 'collection' + _EDGE_KIND = 'CollectionsItemEdge' + _NODE_KIND = 'Collection' + + @staticmethod + def _make_variables(channel_name): + return { + 'ownerLogin': channel_name, + } + + @staticmethod + def _extract_entry(node): + assert isinstance(node, dict) + collection_id = node.get('id') + if not collection_id: + return + return { + '_type': 'url_transparent', + 'ie_key': TwitchCollectionIE.ie_key(), + 'id': collection_id, + 'url': 'https://www.twitch.tv/collections/%s' % collection_id, + 'title': node.get('title'), + 'thumbnail': node.get('thumbnailURL'), + 'duration': float_or_none(node.get('lengthSeconds')), + 'timestamp': unified_timestamp(node.get('updatedAt')), + 'view_count': int_or_none(node.get('viewCount')), + } + + def _real_extract(self, url): + channel_name = self._match_id(url) + return self.playlist_result( + self._entries(channel_name), playlist_id=channel_name, + playlist_title='%s - Collections' % channel_name) + + +class TwitchStreamIE(TwitchBaseIE): + IE_NAME = 'twitch:stream' + _VALID_URL = r'''(?x) + https?:// + (?: + (?:(?:www|go|m)\.)?twitch\.tv/| + player\.twitch\.tv/\?.*?\bchannel= + ) + (?P[^/#?]+) + ''' + + _TESTS = [{ + 'url': 'http://www.twitch.tv/shroomztv', + 'info_dict': { + 'id': '12772022048', + 'display_id': 'shroomztv', + 'ext': 'mp4', + 'title': 're:^ShroomzTV [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'description': 'H1Z1 - lonewolfing with ShroomzTV | A3 Battle Royale later - @ShroomzTV', + 'is_live': True, + 'timestamp': 1421928037, + 'upload_date': '20150122', + 'uploader': 'ShroomzTV', + 'uploader_id': 'shroomztv', + 'view_count': int, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'skip': 'User does not exist', + }, { + 'url': 'http://www.twitch.tv/miracle_doto#profile-0', + 'only_matching': True, + }, { + 'url': 'https://player.twitch.tv/?channel=lotsofs', + 'only_matching': True, + }, { + 'url': 'https://go.twitch.tv/food', + 'only_matching': True, + }, { + 'url': 'https://m.twitch.tv/food', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/monstercat', + 'info_dict': { + 'id': '40500071752', + 'display_id': 'monstercat', + 'title': 're:Monstercat', + 'description': 'md5:0945ad625e615bc8f0469396537d87d9', + 'is_live': True, + 'timestamp': 1677107190, + 'upload_date': '20230222', + 'uploader': 'Monstercat', + 'uploader_id': 'monstercat', + 'live_status': 'is_live', + 'thumbnail': 're:https://.*.jpg', + 'ext': 'mp4', + }, + 'params': { + 'skip_download': 'Livestream', + }, + }] + + @classmethod + def suitable(cls, url): + return (False + if any(ie.suitable(url) for ie in ( + TwitchVodIE, + TwitchCollectionIE, + TwitchVideosIE, + TwitchVideosClipsIE, + TwitchVideosCollectionsIE, + TwitchClipsIE)) + else super(TwitchStreamIE, cls).suitable(url)) + + def _real_extract(self, url): + channel_name = self._match_id(url).lower() + + gql = self._download_gql( + channel_name, [{ + 'operationName': 'StreamMetadata', + 'variables': {'channelLogin': channel_name}, + }, { + 'operationName': 'ComscoreStreamingQuery', + 'variables': { + 'channel': channel_name, + 'clipSlug': '', + 'isClip': False, + 'isLive': True, + 'isVodOrCollection': False, + 'vodID': '', + }, + }, { + 'operationName': 'VideoPreviewOverlay', + 'variables': {'login': channel_name}, + }], + 'Downloading stream GraphQL') + + user = gql[0]['data']['user'] + + if not user: + raise ExtractorError( + '%s does not exist' % channel_name, expected=True) + + stream = user['stream'] + + if not stream: + raise UserNotLive(video_id=channel_name) + + access_token = self._download_access_token( + channel_name, 'stream', 'channelName') + token = access_token['value'] + + stream_id = stream.get('id') or channel_name + query = { + 'allow_source': 'true', + 'allow_audio_only': 'true', + 'allow_spectre': 'true', + 'p': random.randint(1000000, 10000000), + 'player': 'twitchweb', + 'playlist_include_framerate': 'true', + 'segment_preference': '4', + 'sig': access_token['signature'].encode('utf-8'), + 'token': token.encode('utf-8'), + } + formats = self._extract_m3u8_formats( + '%s/api/channel/hls/%s.m3u8' % (self._USHER_BASE, channel_name), + stream_id, 'mp4', query=query) + self._prefer_source(formats) + + view_count = stream.get('viewers') + timestamp = unified_timestamp(stream.get('createdAt')) + + sq_user = try_get(gql, lambda x: x[1]['data']['user'], dict) or {} + uploader = sq_user.get('displayName') + description = try_get( + sq_user, lambda x: x['broadcastSettings']['title'], compat_str) + + thumbnail = url_or_none(try_get( + gql, lambda x: x[2]['data']['user']['stream']['previewImageURL'], + compat_str)) + + title = uploader or channel_name + stream_type = stream.get('type') + if stream_type in ['rerun', 'live']: + title += ' (%s)' % stream_type + + return { + 'id': stream_id, + 'display_id': channel_name, + 'title': title, + 'description': description, + 'thumbnails': self._get_thumbnails(thumbnail), + 'uploader': uploader, + 'uploader_id': channel_name, + 'timestamp': timestamp, + 'view_count': view_count, + 'formats': formats, + 'is_live': stream_type == 'live', + } + + +class TwitchClipsIE(TwitchBaseIE): + IE_NAME = 'twitch:clips' + _VALID_URL = r'''(?x) + https?:// + (?: + clips\.twitch\.tv/(?:embed\?.*?\bclip=|(?:[^/]+/)*)| + (?:(?:www|go|m)\.)?twitch\.tv/(?:[^/]+/)?clip/ + ) + (?P[^/?#&]+) + ''' + + _TESTS = [{ + 'url': 'https://clips.twitch.tv/FaintLightGullWholeWheat', + 'md5': '761769e1eafce0ffebfb4089cb3847cd', + 'info_dict': { + 'id': '42850523', + 'display_id': 'FaintLightGullWholeWheat', + 'ext': 'mp4', + 'title': 'EA Play 2016 Live from the Novo Theatre', + 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1465767393, + 'upload_date': '20160612', + 'creator': 'EA', + 'uploader': 'stereotype_', + 'uploader_id': '43566419', + }, + }, { + # multiple formats + 'url': 'https://clips.twitch.tv/rflegendary/UninterestedBeeDAESuppy', + 'only_matching': True, + }, { + 'url': 'https://www.twitch.tv/sergeynixon/clip/StormyThankfulSproutFutureMan', + 'only_matching': True, + }, { + 'url': 'https://clips.twitch.tv/embed?clip=InquisitiveBreakableYogurtJebaited', + 'only_matching': True, + }, { + 'url': 'https://m.twitch.tv/rossbroadcast/clip/ConfidentBraveHumanChefFrank', + 'only_matching': True, + }, { + 'url': 'https://go.twitch.tv/rossbroadcast/clip/ConfidentBraveHumanChefFrank', + 'only_matching': True, + }, { + 'url': 'https://m.twitch.tv/clip/FaintLightGullWholeWheat', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + clip = self._download_gql( + video_id, [{ + 'operationName': 'VideoAccessToken_Clip', + 'variables': { + 'slug': video_id, + }, + }], + 'Downloading clip access token GraphQL')[0]['data']['clip'] + + if not clip: + raise ExtractorError( + 'This clip is no longer available', expected=True) + + access_query = { + 'sig': clip['playbackAccessToken']['signature'], + 'token': clip['playbackAccessToken']['value'], + } + + data = self._download_base_gql( + video_id, { + 'query': '''{ + clip(slug: "%s") { + broadcaster { + displayName + } + createdAt + curator { + displayName + id + } + durationSeconds + id + tiny: thumbnailURL(width: 86, height: 45) + small: thumbnailURL(width: 260, height: 147) + medium: thumbnailURL(width: 480, height: 272) + title + videoQualities { + frameRate + quality + sourceURL + } + viewCount + } +}''' % video_id}, 'Downloading clip GraphQL', fatal=False) + + if data: + clip = try_get(data, lambda x: x['data']['clip'], dict) or clip + + formats = [] + for option in clip.get('videoQualities', []): + if not isinstance(option, dict): + continue + source = url_or_none(option.get('sourceURL')) + if not source: + continue + formats.append({ + 'url': update_url_query(source, access_query), + 'format_id': option.get('quality'), + 'height': int_or_none(option.get('quality')), + 'fps': int_or_none(option.get('frameRate')), + }) + + thumbnails = [] + for thumbnail_id in ('tiny', 'small', 'medium'): + thumbnail_url = clip.get(thumbnail_id) + if not thumbnail_url: + continue + thumb = { + 'id': thumbnail_id, + 'url': thumbnail_url, + } + mobj = re.search(r'-(\d+)x(\d+)\.', thumbnail_url) + if mobj: + thumb.update({ + 'height': int(mobj.group(2)), + 'width': int(mobj.group(1)), + }) + thumbnails.append(thumb) + + old_id = self._search_regex(r'%7C(\d+)(?:-\d+)?.mp4', formats[-1]['url'], 'old id', default=None) + + return { + 'id': clip.get('id') or video_id, + '_old_archive_ids': [make_archive_id(self, old_id)] if old_id else None, + 'display_id': video_id, + 'title': clip.get('title'), + 'formats': formats, + 'duration': int_or_none(clip.get('durationSeconds')), + 'view_count': int_or_none(clip.get('viewCount')), + 'timestamp': unified_timestamp(clip.get('createdAt')), + 'thumbnails': thumbnails, + 'creator': try_get(clip, lambda x: x['broadcaster']['displayName'], compat_str), + 'uploader': try_get(clip, lambda x: x['curator']['displayName'], compat_str), + 'uploader_id': try_get(clip, lambda x: x['curator']['id'], compat_str), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/twitter.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/twitter.py new file mode 100644 index 0000000..b638621 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/twitter.py @@ -0,0 +1,1757 @@ +import json +import random +import re + +from .common import InfoExtractor +from .periscope import PeriscopeBaseIE, PeriscopeIE +from ..compat import functools # isort: split +from ..compat import ( + compat_parse_qs, + compat_urllib_parse_unquote, + compat_urllib_parse_urlparse, +) +from ..utils import ( + ExtractorError, + dict_get, + filter_dict, + float_or_none, + format_field, + int_or_none, + make_archive_id, + remove_end, + str_or_none, + strip_or_none, + traverse_obj, + try_call, + try_get, + unified_timestamp, + update_url_query, + url_or_none, + xpath_text, +) + + +class TwitterBaseIE(InfoExtractor): + _NETRC_MACHINE = 'twitter' + _API_BASE = 'https://api.twitter.com/1.1/' + _GRAPHQL_API_BASE = 'https://twitter.com/i/api/graphql/' + _BASE_REGEX = r'https?://(?:(?:www|m(?:obile)?)\.)?(?:twitter\.com|twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid\.onion)/' + _AUTH = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' + _LEGACY_AUTH = 'AAAAAAAAAAAAAAAAAAAAAIK1zgAAAAAA2tUWuhGZ2JceoId5GwYWU5GspY4%3DUq7gzFoCZs1QfwGoVdvSac3IniczZEYXIcDyumCauIXpcAPorE' + _flow_token = None + + _LOGIN_INIT_DATA = json.dumps({ + 'input_flow_data': { + 'flow_context': { + 'debug_overrides': {}, + 'start_location': { + 'location': 'unknown' + } + } + }, + 'subtask_versions': { + 'action_list': 2, + 'alert_dialog': 1, + 'app_download_cta': 1, + 'check_logged_in_account': 1, + 'choice_selection': 3, + 'contacts_live_sync_permission_prompt': 0, + 'cta': 7, + 'email_verification': 2, + 'end_flow': 1, + 'enter_date': 1, + 'enter_email': 2, + 'enter_password': 5, + 'enter_phone': 2, + 'enter_recaptcha': 1, + 'enter_text': 5, + 'enter_username': 2, + 'generic_urt': 3, + 'in_app_notification': 1, + 'interest_picker': 3, + 'js_instrumentation': 1, + 'menu_dialog': 1, + 'notifications_permission_prompt': 2, + 'open_account': 2, + 'open_home_timeline': 1, + 'open_link': 1, + 'phone_verification': 4, + 'privacy_options': 1, + 'security_key': 3, + 'select_avatar': 4, + 'select_banner': 2, + 'settings_list': 7, + 'show_code': 1, + 'sign_up': 2, + 'sign_up_review': 4, + 'tweet_selection_urt': 1, + 'update_users': 1, + 'upload_media': 1, + 'user_recommendations_list': 4, + 'user_recommendations_urt': 1, + 'wait_spinner': 3, + 'web_modal': 1 + } + }, separators=(',', ':')).encode() + + def _extract_variant_formats(self, variant, video_id): + variant_url = variant.get('url') + if not variant_url: + return [], {} + elif '.m3u8' in variant_url: + return self._extract_m3u8_formats_and_subtitles( + variant_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False) + else: + tbr = int_or_none(dict_get(variant, ('bitrate', 'bit_rate')), 1000) or None + f = { + 'url': variant_url, + 'format_id': 'http' + ('-%d' % tbr if tbr else ''), + 'tbr': tbr, + } + self._search_dimensions_in_video_url(f, variant_url) + return [f], {} + + def _extract_formats_from_vmap_url(self, vmap_url, video_id): + vmap_url = url_or_none(vmap_url) + if not vmap_url: + return [], {} + vmap_data = self._download_xml(vmap_url, video_id) + formats = [] + subtitles = {} + urls = [] + for video_variant in vmap_data.findall('.//{http://twitter.com/schema/videoVMapV2.xsd}videoVariant'): + video_variant.attrib['url'] = compat_urllib_parse_unquote( + video_variant.attrib['url']) + urls.append(video_variant.attrib['url']) + fmts, subs = self._extract_variant_formats( + video_variant.attrib, video_id) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + video_url = strip_or_none(xpath_text(vmap_data, './/MediaFile')) + if video_url not in urls: + fmts, subs = self._extract_variant_formats({'url': video_url}, video_id) + formats.extend(fmts) + subtitles = self._merge_subtitles(subtitles, subs) + return formats, subtitles + + @staticmethod + def _search_dimensions_in_video_url(a_format, video_url): + m = re.search(r'/(?P\d+)x(?P\d+)/', video_url) + if m: + a_format.update({ + 'width': int(m.group('width')), + 'height': int(m.group('height')), + }) + + @property + def is_logged_in(self): + return bool(self._get_cookies(self._API_BASE).get('auth_token')) + + @functools.cached_property + def _selected_api(self): + return self._configuration_arg('api', ['graphql'], ie_key='Twitter')[0] + + def _fetch_guest_token(self, display_id): + guest_token = traverse_obj(self._download_json( + f'{self._API_BASE}guest/activate.json', display_id, 'Downloading guest token', data=b'', + headers=self._set_base_headers(legacy=display_id and self._selected_api == 'legacy')), + ('guest_token', {str})) + if not guest_token: + raise ExtractorError('Could not retrieve guest token') + return guest_token + + def _set_base_headers(self, legacy=False): + bearer_token = self._LEGACY_AUTH if legacy and not self.is_logged_in else self._AUTH + return filter_dict({ + 'Authorization': f'Bearer {bearer_token}', + 'x-csrf-token': try_call(lambda: self._get_cookies(self._API_BASE)['ct0'].value), + }) + + def _call_login_api(self, note, headers, query={}, data=None): + response = self._download_json( + f'{self._API_BASE}onboarding/task.json', None, note, + headers=headers, query=query, data=data, expected_status=400) + error = traverse_obj(response, ('errors', 0, 'message', {str})) + if error: + raise ExtractorError(f'Login failed, Twitter API says: {error}', expected=True) + elif traverse_obj(response, 'status') != 'success': + raise ExtractorError('Login was unsuccessful') + + subtask = traverse_obj( + response, ('subtasks', ..., 'subtask_id', {str}), get_all=False) + if not subtask: + raise ExtractorError('Twitter API did not return next login subtask') + + self._flow_token = response['flow_token'] + + return subtask + + def _perform_login(self, username, password): + if self.is_logged_in: + return + + webpage = self._download_webpage('https://twitter.com/', None, 'Downloading login page') + guest_token = self._search_regex( + r'\.cookie\s*=\s*["\']gt=(\d+);', webpage, 'gt', default=None) or self._fetch_guest_token(None) + headers = { + **self._set_base_headers(), + 'content-type': 'application/json', + 'x-guest-token': guest_token, + 'x-twitter-client-language': 'en', + 'x-twitter-active-user': 'yes', + 'Referer': 'https://twitter.com/', + 'Origin': 'https://twitter.com', + } + + def build_login_json(*subtask_inputs): + return json.dumps({ + 'flow_token': self._flow_token, + 'subtask_inputs': subtask_inputs + }, separators=(',', ':')).encode() + + def input_dict(subtask_id, text): + return { + 'subtask_id': subtask_id, + 'enter_text': { + 'text': text, + 'link': 'next_link' + } + } + + next_subtask = self._call_login_api( + 'Downloading flow token', headers, query={'flow_name': 'login'}, data=self._LOGIN_INIT_DATA) + + while not self.is_logged_in: + if next_subtask == 'LoginJsInstrumentationSubtask': + next_subtask = self._call_login_api( + 'Submitting JS instrumentation response', headers, data=build_login_json({ + 'subtask_id': next_subtask, + 'js_instrumentation': { + 'response': '{}', + 'link': 'next_link' + } + })) + + elif next_subtask == 'LoginEnterUserIdentifierSSO': + next_subtask = self._call_login_api( + 'Submitting username', headers, data=build_login_json({ + 'subtask_id': next_subtask, + 'settings_list': { + 'setting_responses': [{ + 'key': 'user_identifier', + 'response_data': { + 'text_data': { + 'result': username + } + } + }], + 'link': 'next_link' + } + })) + + elif next_subtask == 'LoginEnterAlternateIdentifierSubtask': + next_subtask = self._call_login_api( + 'Submitting alternate identifier', headers, + data=build_login_json(input_dict(next_subtask, self._get_tfa_info( + 'one of username, phone number or email that was not used as --username')))) + + elif next_subtask == 'LoginEnterPassword': + next_subtask = self._call_login_api( + 'Submitting password', headers, data=build_login_json({ + 'subtask_id': next_subtask, + 'enter_password': { + 'password': password, + 'link': 'next_link' + } + })) + + elif next_subtask == 'AccountDuplicationCheck': + next_subtask = self._call_login_api( + 'Submitting account duplication check', headers, data=build_login_json({ + 'subtask_id': next_subtask, + 'check_logged_in_account': { + 'link': 'AccountDuplicationCheck_false' + } + })) + + elif next_subtask == 'LoginTwoFactorAuthChallenge': + next_subtask = self._call_login_api( + 'Submitting 2FA token', headers, data=build_login_json(input_dict( + next_subtask, self._get_tfa_info('two-factor authentication token')))) + + elif next_subtask == 'LoginAcid': + next_subtask = self._call_login_api( + 'Submitting confirmation code', headers, data=build_login_json(input_dict( + next_subtask, self._get_tfa_info('confirmation code sent to your email or phone')))) + + elif next_subtask == 'ArkoseLogin': + self.raise_login_required('Twitter is requiring captcha for this login attempt', method='cookies') + + elif next_subtask == 'DenyLoginSubtask': + self.raise_login_required('Twitter rejected this login attempt as suspicious', method='cookies') + + elif next_subtask == 'LoginSuccessSubtask': + raise ExtractorError('Twitter API did not grant auth token cookie') + + else: + raise ExtractorError(f'Unrecognized subtask ID "{next_subtask}"') + + self.report_login() + + def _call_api(self, path, video_id, query={}, graphql=False): + headers = self._set_base_headers(legacy=not graphql and self._selected_api == 'legacy') + headers.update({ + 'x-twitter-auth-type': 'OAuth2Session', + 'x-twitter-client-language': 'en', + 'x-twitter-active-user': 'yes', + } if self.is_logged_in else { + 'x-guest-token': self._fetch_guest_token(video_id) + }) + allowed_status = {400, 401, 403, 404} if graphql else {403} + result = self._download_json( + (self._GRAPHQL_API_BASE if graphql else self._API_BASE) + path, + video_id, headers=headers, query=query, expected_status=allowed_status, + note=f'Downloading {"GraphQL" if graphql else "legacy API"} JSON') + + if result.get('errors'): + errors = ', '.join(set(traverse_obj(result, ('errors', ..., 'message', {str})))) + if errors and 'not authorized' in errors: + self.raise_login_required(remove_end(errors, '.')) + raise ExtractorError(f'Error(s) while querying API: {errors or "Unknown error"}') + + return result + + def _build_graphql_query(self, media_id): + raise NotImplementedError('Method must be implemented to support GraphQL') + + def _call_graphql_api(self, endpoint, media_id): + data = self._build_graphql_query(media_id) + query = {key: json.dumps(value, separators=(',', ':')) for key, value in data.items()} + return traverse_obj(self._call_api(endpoint, media_id, query=query, graphql=True), 'data') + + +class TwitterCardIE(InfoExtractor): + IE_NAME = 'twitter:card' + _VALID_URL = TwitterBaseIE._BASE_REGEX + r'i/(?:cards/tfw/v1|videos(?:/tweet)?)/(?P\d+)' + _TESTS = [ + { + 'url': 'https://twitter.com/i/cards/tfw/v1/560070183650213889', + # MD5 checksums are different in different places + 'info_dict': { + 'id': '560070131976392705', + 'ext': 'mp4', + 'title': "Twitter - You can now shoot, edit and share video on Twitter. Capture life's most moving moments from your perspective.", + 'description': 'md5:18d3e24bb4f6e5007487dd546e53bd96', + 'uploader': 'Twitter', + 'uploader_id': 'Twitter', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 30.033, + 'timestamp': 1422366112, + 'upload_date': '20150127', + 'age_limit': 0, + 'comment_count': int, + 'tags': [], + 'repost_count': int, + 'like_count': int, + 'display_id': '560070183650213889', + 'uploader_url': 'https://twitter.com/Twitter', + }, + }, + { + 'url': 'https://twitter.com/i/cards/tfw/v1/623160978427936768', + 'md5': '7137eca597f72b9abbe61e5ae0161399', + 'info_dict': { + 'id': '623160978427936768', + 'ext': 'mp4', + 'title': "NASA - Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video.", + 'description': "Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video. https://t.co/BJYgOjSeGA", + 'uploader': 'NASA', + 'uploader_id': 'NASA', + 'timestamp': 1437408129, + 'upload_date': '20150720', + 'uploader_url': 'https://twitter.com/NASA', + 'age_limit': 0, + 'comment_count': int, + 'like_count': int, + 'repost_count': int, + 'tags': ['PlutoFlyby'], + }, + 'params': {'format': '[protocol=https]'} + }, + { + 'url': 'https://twitter.com/i/cards/tfw/v1/654001591733886977', + 'md5': 'b6d9683dd3f48e340ded81c0e917ad46', + 'info_dict': { + 'id': 'dq4Oj5quskI', + 'ext': 'mp4', + 'title': 'Ubuntu 11.10 Overview', + 'description': 'md5:a831e97fa384863d6e26ce48d1c43376', + 'upload_date': '20111013', + 'uploader': 'OMG! UBUNTU!', + 'uploader_id': 'omgubuntu', + 'channel_url': 'https://www.youtube.com/channel/UCIiSwcm9xiFb3Y4wjzR41eQ', + 'channel_id': 'UCIiSwcm9xiFb3Y4wjzR41eQ', + 'channel_follower_count': int, + 'chapters': 'count:8', + 'uploader_url': 'http://www.youtube.com/user/omgubuntu', + 'duration': 138, + 'categories': ['Film & Animation'], + 'age_limit': 0, + 'comment_count': int, + 'availability': 'public', + 'like_count': int, + 'thumbnail': 'https://i.ytimg.com/vi/dq4Oj5quskI/maxresdefault.jpg', + 'view_count': int, + 'tags': 'count:12', + 'channel': 'OMG! UBUNTU!', + 'playable_in_embed': True, + }, + 'add_ie': ['Youtube'], + }, + { + 'url': 'https://twitter.com/i/cards/tfw/v1/665289828897005568', + 'info_dict': { + 'id': 'iBb2x00UVlv', + 'ext': 'mp4', + 'upload_date': '20151113', + 'uploader_id': '1189339351084113920', + 'uploader': 'ArsenalTerje', + 'title': 'Vine by ArsenalTerje', + 'timestamp': 1447451307, + 'alt_title': 'Vine by ArsenalTerje', + 'comment_count': int, + 'like_count': int, + 'thumbnail': r're:^https?://[^?#]+\.jpg', + 'view_count': int, + 'repost_count': int, + }, + 'add_ie': ['Vine'], + 'params': {'skip_download': 'm3u8'}, + }, + { + 'url': 'https://twitter.com/i/videos/tweet/705235433198714880', + 'md5': '884812a2adc8aaf6fe52b15ccbfa3b88', + 'info_dict': { + 'id': '705235433198714880', + 'ext': 'mp4', + 'title': "Brent Yarina - Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight.", + 'description': "Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight. https://t.co/OrxcJ28Bns", + 'uploader': 'Brent Yarina', + 'uploader_id': 'BTNBrentYarina', + 'timestamp': 1456976204, + 'upload_date': '20160303', + }, + 'skip': 'This content is no longer available.', + }, + { + 'url': 'https://twitter.com/i/videos/752274308186120192', + 'only_matching': True, + }, + ] + + def _real_extract(self, url): + status_id = self._match_id(url) + return self.url_result( + 'https://twitter.com/statuses/' + status_id, + TwitterIE.ie_key(), status_id) + + +class TwitterIE(TwitterBaseIE): + IE_NAME = 'twitter' + _VALID_URL = TwitterBaseIE._BASE_REGEX + r'(?:(?:i/web|[^/]+)/status|statuses)/(?P\d+)(?:/(?:video|photo)/(?P\d+))?' + + _TESTS = [{ + 'url': 'https://twitter.com/freethenipple/status/643211948184596480', + 'info_dict': { + 'id': '643211870443208704', + 'display_id': '643211948184596480', + 'ext': 'mp4', + 'title': 'FREE THE NIPPLE - FTN supporters on Hollywood Blvd today!', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': 'FTN supporters on Hollywood Blvd today! http://t.co/c7jHH749xJ', + 'uploader': 'FREE THE NIPPLE', + 'uploader_id': 'freethenipple', + 'duration': 12.922, + 'timestamp': 1442188653, + 'upload_date': '20150913', + 'uploader_url': 'https://twitter.com/freethenipple', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': [], + 'age_limit': 18, + }, + }, { + 'url': 'https://twitter.com/giphz/status/657991469417025536/photo/1', + 'md5': 'f36dcd5fb92bf7057f155e7d927eeb42', + 'info_dict': { + 'id': '657991469417025536', + 'ext': 'mp4', + 'title': 'Gifs - tu vai cai tu vai cai tu nao eh capaz disso tu vai cai', + 'description': 'Gifs on Twitter: "tu vai cai tu vai cai tu nao eh capaz disso tu vai cai https://t.co/tM46VHFlO5"', + 'thumbnail': r're:^https?://.*\.png', + 'uploader': 'Gifs', + 'uploader_id': 'giphz', + }, + 'expected_warnings': ['height', 'width'], + 'skip': 'Account suspended', + }, { + 'url': 'https://twitter.com/starwars/status/665052190608723968', + 'info_dict': { + 'id': '665052190608723968', + 'display_id': '665052190608723968', + 'ext': 'mp4', + 'title': r're:Star Wars.*A new beginning is coming December 18.*', + 'description': 'A new beginning is coming December 18. Watch the official 60 second #TV spot for #StarWars: #TheForceAwakens. https://t.co/OkSqT2fjWJ', + 'uploader_id': 'starwars', + 'uploader': r're:Star Wars.*', + 'timestamp': 1447395772, + 'upload_date': '20151113', + 'uploader_url': 'https://twitter.com/starwars', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'tags': ['TV', 'StarWars', 'TheForceAwakens'], + 'age_limit': 0, + }, + }, { + 'url': 'https://twitter.com/BTNBrentYarina/status/705235433198714880', + 'info_dict': { + 'id': '705235433198714880', + 'ext': 'mp4', + 'title': "Brent Yarina - Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight.", + 'description': "Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight. https://t.co/OrxcJ28Bns", + 'uploader_id': 'BTNBrentYarina', + 'uploader': 'Brent Yarina', + 'timestamp': 1456976204, + 'upload_date': '20160303', + 'uploader_url': 'https://twitter.com/BTNBrentYarina', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'params': { + # The same video as https://twitter.com/i/videos/tweet/705235433198714880 + # Test case of TwitterCardIE + 'skip_download': True, + }, + 'skip': 'Dead external link', + }, { + 'url': 'https://twitter.com/jaydingeer/status/700207533655363584', + 'info_dict': { + 'id': '700207414000242688', + 'display_id': '700207533655363584', + 'ext': 'mp4', + 'title': 'jaydin donte geer - BEAT PROD: @suhmeduh #Damndaniel', + 'description': 'BEAT PROD: @suhmeduh https://t.co/HBrQ4AfpvZ #Damndaniel https://t.co/byBooq2ejZ', + 'thumbnail': r're:^https?://.*\.jpg', + 'uploader': 'jaydin donte geer', + 'uploader_id': 'jaydingeer', + 'duration': 30.0, + 'timestamp': 1455777459, + 'upload_date': '20160218', + 'uploader_url': 'https://twitter.com/jaydingeer', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': ['Damndaniel'], + 'age_limit': 0, + }, + }, { + 'url': 'https://twitter.com/Filmdrunk/status/713801302971588609', + 'md5': '89a15ed345d13b86e9a5a5e051fa308a', + 'info_dict': { + 'id': 'MIOxnrUteUd', + 'ext': 'mp4', + 'title': 'Dr.Pepperã®é£²ã¿æ–¹ #japanese #ãƒã‚« #ドクペ #電動ガン', + 'uploader': 'TAKUMA', + 'uploader_id': '1004126642786242560', + 'timestamp': 1402826626, + 'upload_date': '20140615', + 'thumbnail': r're:^https?://.*\.jpg', + 'alt_title': 'Vine by TAKUMA', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + }, + 'add_ie': ['Vine'], + }, { + 'url': 'https://twitter.com/captainamerica/status/719944021058060289', + 'info_dict': { + 'id': '717462543795523584', + 'display_id': '719944021058060289', + 'ext': 'mp4', + 'title': 'Captain America - @King0fNerd Are you sure you made the right choice? Find out in theaters.', + 'description': '@King0fNerd Are you sure you made the right choice? Find out in theaters. https://t.co/GpgYi9xMJI', + 'uploader_id': 'CaptainAmerica', + 'uploader': 'Captain America', + 'duration': 3.17, + 'timestamp': 1460483005, + 'upload_date': '20160412', + 'uploader_url': 'https://twitter.com/CaptainAmerica', + 'thumbnail': r're:^https?://.*\.jpg', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': [], + 'age_limit': 0, + }, + }, { + 'url': 'https://twitter.com/OPP_HSD/status/779210622571536384', + 'info_dict': { + 'id': '1zqKVVlkqLaKB', + 'ext': 'mp4', + 'title': 'Sgt Kerry Schmidt - Ontario Provincial Police - Road rage, mischief, assault, rollover and fire in one occurrence', + 'upload_date': '20160923', + 'uploader_id': '1PmKqpJdOJQoY', + 'uploader': 'Sgt Kerry Schmidt - Ontario Provincial Police', + 'timestamp': 1474613214, + 'thumbnail': r're:^https?://.*\.jpg', + }, + 'add_ie': ['Periscope'], + }, { + # has mp4 formats via mobile API + 'url': 'https://twitter.com/news_al3alm/status/852138619213144067', + 'info_dict': { + 'id': '852077943283097602', + 'ext': 'mp4', + 'title': 'عالم الأخبار - كلمة تاريخية بجلسة الجناسي التاريخية.. النائب خالد مؤنس العتيبي للمعارضين : اتقوا الله .. الظلم ظلمات يوم القيامة', + 'description': 'كلمة تاريخية بجلسة الجناسي التاريخية.. النائب خالد مؤنس العتيبي للمعارضين : اتقوا الله .. الظلم ظلمات يوم القيامة https://t.co/xg6OhpyKfN', + 'uploader': 'عالم الأخبار', + 'uploader_id': 'news_al3alm', + 'duration': 277.4, + 'timestamp': 1492000653, + 'upload_date': '20170412', + 'display_id': '852138619213144067', + 'age_limit': 0, + 'uploader_url': 'https://twitter.com/news_al3alm', + 'thumbnail': r're:^https?://.*\.jpg', + 'tags': [], + 'repost_count': int, + 'view_count': int, + 'like_count': int, + 'comment_count': int, + }, + }, { + 'url': 'https://twitter.com/i/web/status/910031516746514432', + 'info_dict': { + 'id': '910030238373089285', + 'display_id': '910031516746514432', + 'ext': 'mp4', + 'title': 'Préfet de Guadeloupe - [Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinés. Réfugiez-vous dans la pièce la + sûre.', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': '[Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinés. Réfugiez-vous dans la pièce la + sûre. https://t.co/mwx01Rs4lo', + 'uploader': 'Préfet de Guadeloupe', + 'uploader_id': 'Prefet971', + 'duration': 47.48, + 'timestamp': 1505803395, + 'upload_date': '20170919', + 'uploader_url': 'https://twitter.com/Prefet971', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': ['Maria'], + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, # requires ffmpeg + }, + }, { + # card via api.twitter.com/1.1/videos/tweet/config + 'url': 'https://twitter.com/LisPower1/status/1001551623938805763', + 'info_dict': { + 'id': '1001551417340022785', + 'display_id': '1001551623938805763', + 'ext': 'mp4', + 'title': 're:.*?Shep is on a roll today.*?', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': 'md5:37b9f2ff31720cef23b2bd42ee8a0f09', + 'uploader': 'Lis Power', + 'uploader_id': 'LisPower1', + 'duration': 111.278, + 'timestamp': 1527623489, + 'upload_date': '20180529', + 'uploader_url': 'https://twitter.com/LisPower1', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, # requires ffmpeg + }, + }, { + 'url': 'https://twitter.com/foobar/status/1087791357756956680', + 'info_dict': { + 'id': '1087791272830607360', + 'display_id': '1087791357756956680', + 'ext': 'mp4', + 'title': 'X - A new is coming. Some of you got an opt-in to try it now. Check out the emoji button, quick keyboard shortcuts, upgraded trends, advanced search, and more. Let us know your thoughts!', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': 'md5:6dfd341a3310fb97d80d2bf7145df976', + 'uploader': 'X', + 'uploader_id': 'X', + 'duration': 61.567, + 'timestamp': 1548184644, + 'upload_date': '20190122', + 'uploader_url': 'https://twitter.com/X', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'skip': 'This Tweet is unavailable', + }, { + # not available in Periscope + 'url': 'https://twitter.com/ViviEducation/status/1136534865145286656', + 'info_dict': { + 'id': '1vOGwqejwoWxB', + 'ext': 'mp4', + 'title': 'Vivi - Vivi founder @lior_rauchy announcing our new student feedback tool live at @EduTECH_AU #EduTECH2019', + 'uploader': 'Vivi', + 'uploader_id': '1eVjYOLGkGrQL', + 'thumbnail': r're:^https?://.*\.jpg', + 'tags': ['EduTECH2019'], + 'view_count': int, + }, + 'add_ie': ['TwitterBroadcast'], + 'skip': 'Broadcast no longer exists', + }, { + # unified card + 'url': 'https://twitter.com/BrooklynNets/status/1349794411333394432?s=20', + 'info_dict': { + 'id': '1349774757969989634', + 'display_id': '1349794411333394432', + 'ext': 'mp4', + 'title': 'md5:d1c4941658e4caaa6cb579260d85dcba', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': 'md5:71ead15ec44cee55071547d6447c6a3e', + 'uploader': 'Brooklyn Nets', + 'uploader_id': 'BrooklynNets', + 'duration': 324.484, + 'timestamp': 1610651040, + 'upload_date': '20210114', + 'uploader_url': 'https://twitter.com/BrooklynNets', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://twitter.com/oshtru/status/1577855540407197696', + 'info_dict': { + 'id': '1577855447914409984', + 'display_id': '1577855540407197696', + 'ext': 'mp4', + 'title': 'md5:9d198efb93557b8f8d5b78c480407214', + 'description': 'md5:b9c3699335447391d11753ab21c70a74', + 'upload_date': '20221006', + 'uploader': 'oshtru', + 'uploader_id': 'oshtru', + 'uploader_url': 'https://twitter.com/oshtru', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 30.03, + 'timestamp': 1665025050, + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'params': {'skip_download': True}, + }, { + 'url': 'https://twitter.com/UltimaShadowX/status/1577719286659006464', + 'info_dict': { + 'id': '1577719286659006464', + 'title': 'Ultima📛| New Era - Test', + 'description': 'Test https://t.co/Y3KEZD7Dad', + 'uploader': 'Ultima📛| New Era', + 'uploader_id': 'UltimaShadowX', + 'uploader_url': 'https://twitter.com/UltimaShadowX', + 'upload_date': '20221005', + 'timestamp': 1664992565, + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'tags': [], + 'age_limit': 0, + }, + 'playlist_count': 4, + 'params': {'skip_download': True}, + }, { + 'url': 'https://twitter.com/MesoMax919/status/1575560063510810624', + 'info_dict': { + 'id': '1575559336759263233', + 'display_id': '1575560063510810624', + 'ext': 'mp4', + 'title': 'md5:eec26382babd0f7c18f041db8ae1c9c9', + 'thumbnail': r're:^https?://.*\.jpg', + 'description': 'md5:95aea692fda36a12081b9629b02daa92', + 'uploader': 'Max Olson', + 'uploader_id': 'MesoMax919', + 'uploader_url': 'https://twitter.com/MesoMax919', + 'duration': 21.321, + 'timestamp': 1664477766, + 'upload_date': '20220929', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'view_count': int, + 'tags': ['HurricaneIan'], + 'age_limit': 0, + }, + }, { + # Adult content, fails if not logged in + 'url': 'https://twitter.com/Rizdraws/status/1575199173472927762', + 'info_dict': { + 'id': '1575199163847000068', + 'display_id': '1575199173472927762', + 'ext': 'mp4', + 'title': str, + 'description': str, + 'uploader': str, + 'uploader_id': 'Rizdraws', + 'uploader_url': 'https://twitter.com/Rizdraws', + 'upload_date': '20220928', + 'timestamp': 1664391723, + 'thumbnail': r're:^https?://.+\.jpg', + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'age_limit': 18, + 'tags': [] + }, + 'params': {'skip_download': 'The media could not be played'}, + 'skip': 'Requires authentication', + }, { + # Playlist result only with graphql API + 'url': 'https://twitter.com/Srirachachau/status/1395079556562706435', + 'playlist_mincount': 2, + 'info_dict': { + 'id': '1395079556562706435', + 'title': str, + 'tags': [], + 'uploader': str, + 'like_count': int, + 'upload_date': '20210519', + 'age_limit': 0, + 'repost_count': int, + 'description': 'Here it is! Finished my gothic western cartoon. Pretty proud of it. It\'s got some goofs and lots of splashy over the top violence, something for everyone, hope you like it https://t.co/fOsG5glUnw', + 'uploader_id': 'Srirachachau', + 'comment_count': int, + 'uploader_url': 'https://twitter.com/Srirachachau', + 'timestamp': 1621447860, + }, + }, { + 'url': 'https://twitter.com/DavidToons_/status/1578353380363501568', + 'playlist_mincount': 2, + 'info_dict': { + 'id': '1578353380363501568', + 'title': str, + 'uploader_id': 'DavidToons_', + 'repost_count': int, + 'like_count': int, + 'uploader': str, + 'timestamp': 1665143744, + 'uploader_url': 'https://twitter.com/DavidToons_', + 'description': 'Chris sounds like Linda from Bob\'s Burgers, so as an animator: this had to be done. https://t.co/WgJauwIW1w', + 'tags': [], + 'comment_count': int, + 'upload_date': '20221007', + 'age_limit': 0, + }, + }, { + 'url': 'https://twitter.com/primevideouk/status/1578401165338976258', + 'playlist_count': 2, + 'info_dict': { + 'id': '1578401165338976258', + 'title': str, + 'description': 'md5:659a6b517a034b4cee5d795381a2dc41', + 'uploader': str, + 'uploader_id': 'primevideouk', + 'timestamp': 1665155137, + 'upload_date': '20221007', + 'age_limit': 0, + 'uploader_url': 'https://twitter.com/primevideouk', + 'comment_count': int, + 'repost_count': int, + 'like_count': int, + 'tags': ['TheRingsOfPower'], + }, + }, { + # Twitter Spaces + 'url': 'https://twitter.com/MoniqueCamarra/status/1550101959377551360', + 'info_dict': { + 'id': '1lPJqmBeeNAJb', + 'ext': 'm4a', + 'title': 'EuroFile@6 Ukraine Up-date-Draghi Defenestration-the West', + 'uploader': r're:Monique Camarra.+?', + 'uploader_id': 'MoniqueCamarra', + 'live_status': 'was_live', + 'release_timestamp': 1658417414, + 'description': 'md5:acce559345fd49f129c20dbcda3f1201', + 'timestamp': 1658407771, + 'release_date': '20220721', + 'upload_date': '20220721', + }, + 'add_ie': ['TwitterSpaces'], + 'params': {'skip_download': 'm3u8'}, + 'skip': 'Requires authentication', + }, { + # URL specifies video number but --yes-playlist + 'url': 'https://twitter.com/CTVJLaidlaw/status/1600649710662213632/video/1', + 'playlist_mincount': 2, + 'info_dict': { + 'id': '1600649710662213632', + 'title': 'md5:be05989b0722e114103ed3851a0ffae2', + 'timestamp': 1670459604.0, + 'description': 'md5:591c19ce66fadc2359725d5cd0d1052c', + 'comment_count': int, + 'uploader_id': 'CTVJLaidlaw', + 'repost_count': int, + 'tags': ['colorectalcancer', 'cancerjourney', 'imnotaquitter'], + 'upload_date': '20221208', + 'age_limit': 0, + 'uploader': 'Jocelyn Laidlaw', + 'uploader_url': 'https://twitter.com/CTVJLaidlaw', + 'like_count': int, + }, + }, { + # URL specifies video number and --no-playlist + 'url': 'https://twitter.com/CTVJLaidlaw/status/1600649710662213632/video/2', + 'info_dict': { + 'id': '1600649511827013632', + 'ext': 'mp4', + 'title': 'md5:7662a0a27ce6faa3e5b160340f3cfab1', + 'thumbnail': r're:^https?://.+\.jpg', + 'timestamp': 1670459604.0, + 'uploader_id': 'CTVJLaidlaw', + 'uploader': 'Jocelyn Laidlaw', + 'repost_count': int, + 'comment_count': int, + 'tags': ['colorectalcancer', 'cancerjourney', 'imnotaquitter'], + 'duration': 102.226, + 'uploader_url': 'https://twitter.com/CTVJLaidlaw', + 'display_id': '1600649710662213632', + 'like_count': int, + 'view_count': int, + 'description': 'md5:591c19ce66fadc2359725d5cd0d1052c', + 'upload_date': '20221208', + 'age_limit': 0, + }, + 'params': {'noplaylist': True}, + }, { + # id pointing to TweetWithVisibilityResults type entity which wraps the actual Tweet over + # note the id different between extraction and url + 'url': 'https://twitter.com/s2FAKER/status/1621117700482416640', + 'info_dict': { + 'id': '1621117577354424321', + 'display_id': '1621117700482416640', + 'ext': 'mp4', + 'title': 'ë½€ - ì•„ 최우제 ì´ë™ì†ë„ ë´', + 'description': 'ì•„ 최우제 ì´ë™ì†ë„ ë´ https://t.co/dxu2U5vXXB', + 'duration': 24.598, + 'uploader': 'ë½€', + 'uploader_id': 's2FAKER', + 'uploader_url': 'https://twitter.com/s2FAKER', + 'upload_date': '20230202', + 'timestamp': 1675339553.0, + 'thumbnail': r're:https?://pbs\.twimg\.com/.+', + 'age_limit': 18, + 'tags': [], + 'like_count': int, + 'repost_count': int, + 'comment_count': int, + 'view_count': int, + }, + }, { + 'url': 'https://twitter.com/hlo_again/status/1599108751385972737/video/2', + 'info_dict': { + 'id': '1599108643743473680', + 'display_id': '1599108751385972737', + 'ext': 'mp4', + 'title': '\u06ea - \U0001F48B', + 'uploader_url': 'https://twitter.com/hlo_again', + 'like_count': int, + 'uploader_id': 'hlo_again', + 'thumbnail': 'https://pbs.twimg.com/ext_tw_video_thumb/1599108643743473680/pu/img/UG3xjov4rgg5sbYM.jpg?name=orig', + 'repost_count': int, + 'duration': 9.531, + 'comment_count': int, + 'view_count': int, + 'upload_date': '20221203', + 'age_limit': 0, + 'timestamp': 1670092210.0, + 'tags': [], + 'uploader': '\u06ea', + 'description': '\U0001F48B https://t.co/bTj9Qz7vQP', + }, + 'params': {'noplaylist': True}, + }, { + 'url': 'https://twitter.com/MunTheShinobi/status/1600009574919962625', + 'info_dict': { + 'id': '1600009362759733248', + 'display_id': '1600009574919962625', + 'ext': 'mp4', + 'uploader_url': 'https://twitter.com/MunTheShinobi', + 'description': 'This is a genius ad by Apple. \U0001f525\U0001f525\U0001f525\U0001f525\U0001f525 https://t.co/cNsA0MoOml', + 'view_count': int, + 'thumbnail': 'https://pbs.twimg.com/ext_tw_video_thumb/1600009362759733248/pu/img/XVhFQivj75H_YxxV.jpg?name=orig', + 'age_limit': 0, + 'uploader': 'Mün', + 'repost_count': int, + 'upload_date': '20221206', + 'title': 'Mün - This is a genius ad by Apple. \U0001f525\U0001f525\U0001f525\U0001f525\U0001f525', + 'comment_count': int, + 'like_count': int, + 'tags': [], + 'uploader_id': 'MunTheShinobi', + 'duration': 139.987, + 'timestamp': 1670306984.0, + }, + }, { + # retweeted_status (private) + 'url': 'https://twitter.com/liberdalau/status/1623739803874349067', + 'info_dict': { + 'id': '1623274794488659969', + 'display_id': '1623739803874349067', + 'ext': 'mp4', + 'title': 'Johnny Bullets - Me after going viral to over 30million people: Whoopsie-daisy', + 'description': 'md5:b06864cd3dc2554821cc327f5348485a', + 'uploader': 'Johnny Bullets', + 'uploader_id': 'Johnnybull3ts', + 'uploader_url': 'https://twitter.com/Johnnybull3ts', + 'age_limit': 0, + 'tags': [], + 'duration': 8.033, + 'timestamp': 1675853859.0, + 'upload_date': '20230208', + 'thumbnail': r're:https://pbs\.twimg\.com/ext_tw_video_thumb/.+', + 'like_count': int, + 'repost_count': int, + }, + 'skip': 'Protected tweet', + }, { + # retweeted_status + 'url': 'https://twitter.com/playstrumpcard/status/1695424220702888009', + 'info_dict': { + 'id': '1694928337846538240', + 'ext': 'mp4', + 'display_id': '1695424220702888009', + 'title': 'md5:e8daa9527bc2b947121395494f786d9d', + 'description': 'md5:004f2d37fd58737724ec75bc7e679938', + 'uploader': 'Benny Johnson', + 'uploader_id': 'bennyjohnson', + 'uploader_url': 'https://twitter.com/bennyjohnson', + 'age_limit': 0, + 'tags': [], + 'duration': 45.001, + 'timestamp': 1692962814.0, + 'upload_date': '20230825', + 'thumbnail': r're:https://pbs\.twimg\.com/amplify_video_thumb/.+', + 'like_count': int, + 'repost_count': int, + 'view_count': int, + 'comment_count': int, + }, + }, { + # retweeted_status w/ legacy API + 'url': 'https://twitter.com/playstrumpcard/status/1695424220702888009', + 'info_dict': { + 'id': '1694928337846538240', + 'ext': 'mp4', + 'display_id': '1695424220702888009', + 'title': 'md5:e8daa9527bc2b947121395494f786d9d', + 'description': 'md5:004f2d37fd58737724ec75bc7e679938', + 'uploader': 'Benny Johnson', + 'uploader_id': 'bennyjohnson', + 'uploader_url': 'https://twitter.com/bennyjohnson', + 'age_limit': 0, + 'tags': [], + 'duration': 45.001, + 'timestamp': 1692962814.0, + 'upload_date': '20230825', + 'thumbnail': r're:https://pbs\.twimg\.com/amplify_video_thumb/.+', + 'like_count': int, + 'repost_count': int, + }, + 'params': {'extractor_args': {'twitter': {'api': ['legacy']}}}, + }, { + # Broadcast embedded in tweet + 'url': 'https://twitter.com/JessicaDobsonWX/status/1693057346933600402', + 'info_dict': { + 'id': '1yNGaNLjEblJj', + 'ext': 'mp4', + 'title': 'Jessica Dobson - WAVE Weather Now - Saturday 8/19/23 Update', + 'uploader': 'Jessica Dobson', + 'uploader_id': '1DZEoDwDovRQa', + 'thumbnail': r're:^https?://.*\.jpg', + 'view_count': int, + }, + 'add_ie': ['TwitterBroadcast'], + }, { + # Animated gif and quote tweet video, with syndication API + 'url': 'https://twitter.com/BAKKOOONN/status/1696256659889565950', + 'playlist_mincount': 2, + 'info_dict': { + 'id': '1696256659889565950', + 'title': 'BAKOON - https://t.co/zom968d0a0', + 'description': 'https://t.co/zom968d0a0', + 'tags': [], + 'uploader': 'BAKOON', + 'uploader_id': 'BAKKOOONN', + 'uploader_url': 'https://twitter.com/BAKKOOONN', + 'age_limit': 18, + 'timestamp': 1693254077.0, + 'upload_date': '20230828', + 'like_count': int, + }, + 'params': {'extractor_args': {'twitter': {'api': ['syndication']}}}, + 'expected_warnings': ['Not all metadata'], + }, { + # onion route + 'url': 'https://twitter3e4tixl4xyajtrzo62zg5vztmjuricljdp2c5kshju4avyoid.onion/TwitterBlue/status/1484226494708662273', + 'only_matching': True, + }, { + # Twitch Clip Embed + 'url': 'https://twitter.com/GunB1g/status/1163218564784017422', + 'only_matching': True, + }, { + # promo_video_website card + 'url': 'https://twitter.com/GunB1g/status/1163218564784017422', + 'only_matching': True, + }, { + # promo_video_convo card + 'url': 'https://twitter.com/poco_dandy/status/1047395834013384704', + 'only_matching': True, + }, { + # appplayer card + 'url': 'https://twitter.com/poco_dandy/status/1150646424461176832', + 'only_matching': True, + }, { + # video_direct_message card + 'url': 'https://twitter.com/qarev001/status/1348948114569269251', + 'only_matching': True, + }, { + # poll2choice_video card + 'url': 'https://twitter.com/CAF_Online/status/1349365911120195585', + 'only_matching': True, + }, { + # poll3choice_video card + 'url': 'https://twitter.com/SamsungMobileSA/status/1348609186725289984', + 'only_matching': True, + }, { + # poll4choice_video card + 'url': 'https://twitter.com/SouthamptonFC/status/1347577658079641604', + 'only_matching': True, + }] + + _MEDIA_ID_RE = re.compile(r'_video/(\d+)/') + + @property + def _GRAPHQL_ENDPOINT(self): + if self.is_logged_in: + return 'zZXycP0V6H7m-2r0mOnFcA/TweetDetail' + return '2ICDjqPd81tulZcYrtpTuQ/TweetResultByRestId' + + def _graphql_to_legacy(self, data, twid): + result = traverse_obj(data, ( + 'threaded_conversation_with_injections_v2', 'instructions', 0, 'entries', + lambda _, v: v['entryId'] == f'tweet-{twid}', 'content', 'itemContent', + 'tweet_results', 'result', ('tweet', None), {dict}, + ), default={}, get_all=False) if self.is_logged_in else traverse_obj( + data, ('tweetResult', 'result', {dict}), default={}) + + if result.get('__typename') not in ('Tweet', 'TweetTombstone', 'TweetUnavailable', None): + self.report_warning(f'Unknown typename: {result.get("__typename")}', twid, only_once=True) + + if 'tombstone' in result: + cause = remove_end(traverse_obj(result, ('tombstone', 'text', 'text', {str})), '. Learn more') + raise ExtractorError(f'Twitter API says: {cause or "Unknown error"}', expected=True) + elif result.get('__typename') == 'TweetUnavailable': + reason = result.get('reason') + if reason == 'NsfwLoggedOut': + self.raise_login_required('NSFW tweet requires authentication') + elif reason == 'Protected': + self.raise_login_required('You are not authorized to view this protected tweet') + raise ExtractorError(reason or 'Requested tweet is unavailable', expected=True) + + status = result.get('legacy', {}) + status.update(traverse_obj(result, { + 'user': ('core', 'user_results', 'result', 'legacy'), + 'card': ('card', 'legacy'), + 'quoted_status': ('quoted_status_result', 'result', 'legacy'), + 'retweeted_status': ('legacy', 'retweeted_status_result', 'result', 'legacy'), + }, expected_type=dict, default={})) + + # extra transformations needed since result does not match legacy format + if status.get('retweeted_status'): + status['retweeted_status']['user'] = traverse_obj(status, ( + 'retweeted_status_result', 'result', 'core', 'user_results', 'result', 'legacy', {dict})) or {} + + binding_values = { + binding_value.get('key'): binding_value.get('value') + for binding_value in traverse_obj(status, ('card', 'binding_values', ..., {dict})) + } + if binding_values: + status['card']['binding_values'] = binding_values + + return status + + def _build_graphql_query(self, media_id): + return { + 'variables': { + 'focalTweetId': media_id, + 'includePromotedContent': True, + 'with_rux_injections': False, + 'withBirdwatchNotes': True, + 'withCommunity': True, + 'withDownvotePerspective': False, + 'withQuickPromoteEligibilityTweetFields': True, + 'withReactionsMetadata': False, + 'withReactionsPerspective': False, + 'withSuperFollowsTweetFields': True, + 'withSuperFollowsUserFields': True, + 'withV2Timeline': True, + 'withVoice': True, + }, + 'features': { + 'graphql_is_translatable_rweb_tweet_is_translatable_enabled': False, + 'interactive_text_enabled': True, + 'responsive_web_edit_tweet_api_enabled': True, + 'responsive_web_enhance_cards_enabled': True, + 'responsive_web_graphql_timeline_navigation_enabled': False, + 'responsive_web_text_conversations_enabled': False, + 'responsive_web_uc_gql_enabled': True, + 'standardized_nudges_misinfo': True, + 'tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled': False, + 'tweetypie_unmention_optimization_enabled': True, + 'unified_cards_ad_metadata_container_dynamic_card_content_query_enabled': True, + 'verified_phone_label_enabled': False, + 'vibe_api_enabled': True, + }, + } if self.is_logged_in else { + 'variables': { + 'tweetId': media_id, + 'withCommunity': False, + 'includePromotedContent': False, + 'withVoice': False, + }, + 'features': { + 'creator_subscriptions_tweet_preview_api_enabled': True, + 'tweetypie_unmention_optimization_enabled': True, + 'responsive_web_edit_tweet_api_enabled': True, + 'graphql_is_translatable_rweb_tweet_is_translatable_enabled': True, + 'view_counts_everywhere_api_enabled': True, + 'longform_notetweets_consumption_enabled': True, + 'responsive_web_twitter_article_tweet_consumption_enabled': False, + 'tweet_awards_web_tipping_enabled': False, + 'freedom_of_speech_not_reach_fetch_enabled': True, + 'standardized_nudges_misinfo': True, + 'tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled': True, + 'longform_notetweets_rich_text_read_enabled': True, + 'longform_notetweets_inline_media_enabled': True, + 'responsive_web_graphql_exclude_directive_enabled': True, + 'verified_phone_label_enabled': False, + 'responsive_web_media_download_video_enabled': False, + 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False, + 'responsive_web_graphql_timeline_navigation_enabled': True, + 'responsive_web_enhance_cards_enabled': False + }, + 'fieldToggles': { + 'withArticleRichContentState': False + } + } + + def _extract_status(self, twid): + if self.is_logged_in or self._selected_api == 'graphql': + status = self._graphql_to_legacy(self._call_graphql_api(self._GRAPHQL_ENDPOINT, twid), twid) + + elif self._selected_api == 'legacy': + status = self._call_api(f'statuses/show/{twid}.json', twid, { + 'cards_platform': 'Web-12', + 'include_cards': 1, + 'include_reply_count': 1, + 'include_user_entities': 0, + 'tweet_mode': 'extended', + }) + + elif self._selected_api == 'syndication': + self.report_warning( + 'Not all metadata or media is available via syndication endpoint', twid, only_once=True) + status = self._download_json( + 'https://cdn.syndication.twimg.com/tweet-result', twid, 'Downloading syndication JSON', + headers={'User-Agent': 'Googlebot'}, query={ + 'id': twid, + # TODO: token = ((Number(twid) / 1e15) * Math.PI).toString(36).replace(/(0+|\.)/g, '') + 'token': ''.join(random.choices('123456789abcdefghijklmnopqrstuvwxyz', k=10)), + }) + if not status: + raise ExtractorError('Syndication endpoint returned empty JSON response') + # Transform the result so its structure matches that of legacy/graphql + media = [] + for detail in traverse_obj(status, ((None, 'quoted_tweet'), 'mediaDetails', ..., {dict})): + detail['id_str'] = traverse_obj(detail, ( + 'video_info', 'variants', ..., 'url', {self._MEDIA_ID_RE.search}, 1), get_all=False) or twid + media.append(detail) + status['extended_entities'] = {'media': media} + + else: + raise ExtractorError(f'"{self._selected_api}" is not a valid API selection', expected=True) + + return traverse_obj(status, 'retweeted_status', None, expected_type=dict) or {} + + def _real_extract(self, url): + twid, selected_index = self._match_valid_url(url).group('id', 'index') + status = self._extract_status(twid) + + title = description = traverse_obj( + status, (('full_text', 'text'), {lambda x: x.replace('\n', ' ')}), get_all=False) or '' + # strip 'https -_t.co_BJYgOjSeGA' junk from filenames + title = re.sub(r'\s+(https?://[^ ]+)', '', title) + user = status.get('user') or {} + uploader = user.get('name') + if uploader: + title = f'{uploader} - {title}' + uploader_id = user.get('screen_name') + + info = { + 'id': twid, + 'title': title, + 'description': description, + 'uploader': uploader, + 'timestamp': unified_timestamp(status.get('created_at')), + 'uploader_id': uploader_id, + 'uploader_url': format_field(uploader_id, None, 'https://twitter.com/%s'), + 'like_count': int_or_none(status.get('favorite_count')), + 'repost_count': int_or_none(status.get('retweet_count')), + 'comment_count': int_or_none(status.get('reply_count')), + 'age_limit': 18 if status.get('possibly_sensitive') else 0, + 'tags': traverse_obj(status, ('entities', 'hashtags', ..., 'text')), + } + + def extract_from_video_info(media): + media_id = traverse_obj(media, 'id_str', 'id', expected_type=str_or_none) + self.write_debug(f'Extracting from video info: {media_id}') + + formats = [] + subtitles = {} + for variant in traverse_obj(media, ('video_info', 'variants', ...)): + fmts, subs = self._extract_variant_formats(variant, twid) + subtitles = self._merge_subtitles(subtitles, subs) + formats.extend(fmts) + + thumbnails = [] + media_url = media.get('media_url_https') or media.get('media_url') + if media_url: + def add_thumbnail(name, size): + thumbnails.append({ + 'id': name, + 'url': update_url_query(media_url, {'name': name}), + 'width': int_or_none(size.get('w') or size.get('width')), + 'height': int_or_none(size.get('h') or size.get('height')), + }) + for name, size in media.get('sizes', {}).items(): + add_thumbnail(name, size) + add_thumbnail('orig', media.get('original_info') or {}) + + return { + 'id': media_id, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'view_count': traverse_obj(media, ('mediaStats', 'viewCount', {int_or_none})), + 'duration': float_or_none(traverse_obj(media, ('video_info', 'duration_millis')), 1000), + # The codec of http formats are unknown + '_format_sort_fields': ('res', 'br', 'size', 'proto'), + } + + def extract_from_card_info(card): + if not card: + return + + self.write_debug(f'Extracting from card info: {card.get("url")}') + binding_values = card['binding_values'] + + def get_binding_value(k): + o = binding_values.get(k) or {} + return try_get(o, lambda x: x[x['type'].lower() + '_value']) + + card_name = card['name'].split(':')[-1] + if card_name == 'player': + yield { + '_type': 'url', + 'url': get_binding_value('player_url'), + } + elif card_name == 'periscope_broadcast': + yield { + '_type': 'url', + 'url': get_binding_value('url') or get_binding_value('player_url'), + 'ie_key': PeriscopeIE.ie_key(), + } + elif card_name == 'broadcast': + yield { + '_type': 'url', + 'url': get_binding_value('broadcast_url'), + 'ie_key': TwitterBroadcastIE.ie_key(), + } + elif card_name == 'audiospace': + yield { + '_type': 'url', + 'url': f'https://twitter.com/i/spaces/{get_binding_value("id")}', + 'ie_key': TwitterSpacesIE.ie_key(), + } + elif card_name == 'summary': + yield { + '_type': 'url', + 'url': get_binding_value('card_url'), + } + elif card_name == 'unified_card': + unified_card = self._parse_json(get_binding_value('unified_card'), twid) + yield from map(extract_from_video_info, traverse_obj( + unified_card, ('media_entities', ...), expected_type=dict)) + # amplify, promo_video_website, promo_video_convo, appplayer, + # video_direct_message, poll2choice_video, poll3choice_video, + # poll4choice_video, ... + else: + is_amplify = card_name == 'amplify' + vmap_url = get_binding_value('amplify_url_vmap') if is_amplify else get_binding_value('player_stream_url') + content_id = get_binding_value('%s_content_id' % (card_name if is_amplify else 'player')) + formats, subtitles = self._extract_formats_from_vmap_url(vmap_url, content_id or twid) + + thumbnails = [] + for suffix in ('_small', '', '_large', '_x_large', '_original'): + image = get_binding_value('player_image' + suffix) or {} + image_url = image.get('url') + if not image_url or '/player-placeholder' in image_url: + continue + thumbnails.append({ + 'id': suffix[1:] if suffix else 'medium', + 'url': image_url, + 'width': int_or_none(image.get('width')), + 'height': int_or_none(image.get('height')), + }) + + yield { + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'duration': int_or_none(get_binding_value( + 'content_duration_seconds')), + } + + videos = traverse_obj(status, ( + (None, 'quoted_status'), 'extended_entities', 'media', lambda _, m: m['type'] != 'photo', {dict})) + + if self._yes_playlist(twid, selected_index, video_label='URL-specified video number'): + selected_entries = (*map(extract_from_video_info, videos), *extract_from_card_info(status.get('card'))) + else: + desired_obj = traverse_obj(status, ( + (None, 'quoted_status'), 'extended_entities', 'media', int(selected_index) - 1, {dict}), get_all=False) + if not desired_obj: + raise ExtractorError(f'Video #{selected_index} is unavailable', expected=True) + elif desired_obj.get('type') != 'video': + raise ExtractorError(f'Media #{selected_index} is not a video', expected=True) + + # Restore original archive id and video index in title + for index, entry in enumerate(videos, 1): + if entry.get('id') != desired_obj.get('id'): + continue + if index == 1: + info['_old_archive_ids'] = [make_archive_id(self, twid)] + if len(videos) != 1: + info['title'] += f' #{index}' + break + + return {**info, **extract_from_video_info(desired_obj), 'display_id': twid} + + entries = [{**info, **data, 'display_id': twid} for data in selected_entries] + if not entries: + expanded_url = traverse_obj(status, ('entities', 'urls', 0, 'expanded_url'), expected_type=url_or_none) + if not expanded_url or expanded_url == url: + self.raise_no_formats('No video could be found in this tweet', expected=True) + return info + + return self.url_result(expanded_url, display_id=twid, **info) + + entries[0]['_old_archive_ids'] = [make_archive_id(self, twid)] + + if len(entries) == 1: + return entries[0] + + for index, entry in enumerate(entries, 1): + entry['title'] += f' #{index}' + + return self.playlist_result(entries, **info) + + +class TwitterAmplifyIE(TwitterBaseIE): + IE_NAME = 'twitter:amplify' + _VALID_URL = r'https?://amp\.twimg\.com/v/(?P[0-9a-f\-]{36})' + + _TEST = { + 'url': 'https://amp.twimg.com/v/0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951', + 'md5': 'fec25801d18a4557c5c9f33d2c379ffa', + 'info_dict': { + 'id': '0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951', + 'ext': 'mp4', + 'title': 'Twitter Video', + 'thumbnail': 're:^https?://.*', + }, + 'params': {'format': '[protocol=https]'}, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + vmap_url = self._html_search_meta( + 'twitter:amplify:vmap', webpage, 'vmap url') + formats, _ = self._extract_formats_from_vmap_url(vmap_url, video_id) + + thumbnails = [] + thumbnail = self._html_search_meta( + 'twitter:image:src', webpage, 'thumbnail', fatal=False) + + def _find_dimension(target): + w = int_or_none(self._html_search_meta( + 'twitter:%s:width' % target, webpage, fatal=False)) + h = int_or_none(self._html_search_meta( + 'twitter:%s:height' % target, webpage, fatal=False)) + return w, h + + if thumbnail: + thumbnail_w, thumbnail_h = _find_dimension('image') + thumbnails.append({ + 'url': thumbnail, + 'width': thumbnail_w, + 'height': thumbnail_h, + }) + + video_w, video_h = _find_dimension('player') + formats[0].update({ + 'width': video_w, + 'height': video_h, + }) + + return { + 'id': video_id, + 'title': 'Twitter Video', + 'formats': formats, + 'thumbnails': thumbnails, + } + + +class TwitterBroadcastIE(TwitterBaseIE, PeriscopeBaseIE): + IE_NAME = 'twitter:broadcast' + _VALID_URL = TwitterBaseIE._BASE_REGEX + r'i/broadcasts/(?P[0-9a-zA-Z]{13})' + + _TEST = { + # untitled Periscope video + 'url': 'https://twitter.com/i/broadcasts/1yNGaQLWpejGj', + 'info_dict': { + 'id': '1yNGaQLWpejGj', + 'ext': 'mp4', + 'title': 'Andrea May Sahouri - Periscope Broadcast', + 'uploader': 'Andrea May Sahouri', + 'uploader_id': '1PXEdBZWpGwKe', + 'thumbnail': r're:^https?://[^?#]+\.jpg\?token=', + 'view_count': int, + }, + } + + def _real_extract(self, url): + broadcast_id = self._match_id(url) + broadcast = self._call_api( + 'broadcasts/show.json', broadcast_id, + {'ids': broadcast_id})['broadcasts'][broadcast_id] + if not broadcast: + raise ExtractorError('Broadcast no longer exists', expected=True) + info = self._parse_broadcast_data(broadcast, broadcast_id) + media_key = broadcast['media_key'] + source = self._call_api( + f'live_video_stream/status/{media_key}', media_key)['source'] + m3u8_url = source.get('noRedirectPlaybackUrl') or source['location'] + if '/live_video_stream/geoblocked/' in m3u8_url: + self.raise_geo_restricted() + m3u8_id = compat_parse_qs(compat_urllib_parse_urlparse( + m3u8_url).query).get('type', [None])[0] + state, width, height = self._extract_common_format_info(broadcast) + info['formats'] = self._extract_pscp_m3u8_formats( + m3u8_url, broadcast_id, m3u8_id, state, width, height) + return info + + +class TwitterSpacesIE(TwitterBaseIE): + IE_NAME = 'twitter:spaces' + _VALID_URL = TwitterBaseIE._BASE_REGEX + r'i/spaces/(?P[0-9a-zA-Z]{13})' + + _TESTS = [{ + 'url': 'https://twitter.com/i/spaces/1RDxlgyvNXzJL', + 'info_dict': { + 'id': '1RDxlgyvNXzJL', + 'ext': 'm4a', + 'title': 'King Carlo e la mossa Kansas City per fare il Grande Centro', + 'description': 'Twitter Space participated by annarita digiorgio, Signor Ernesto, Raffaello Colosimo, Simone M. Sepe', + 'uploader': r're:Lucio Di Gaetano.*?', + 'uploader_id': 'luciodigaetano', + 'live_status': 'was_live', + 'timestamp': 1659877956, + 'upload_date': '20220807', + 'release_timestamp': 1659904215, + 'release_date': '20220807', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # post_live/TimedOut but downloadable + 'url': 'https://twitter.com/i/spaces/1vAxRAVQWONJl', + 'info_dict': { + 'id': '1vAxRAVQWONJl', + 'ext': 'm4a', + 'title': 'Framing Up FinOps: Billing Tools', + 'description': 'Twitter Space participated by rupa, Alfonso Hernandez', + 'uploader': 'Google Cloud', + 'uploader_id': 'googlecloud', + 'live_status': 'post_live', + 'timestamp': 1681409554, + 'upload_date': '20230413', + 'release_timestamp': 1681839000, + 'release_date': '20230418', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + # Needs ffmpeg as downloader, see: https://github.com/yt-dlp/yt-dlp/issues/7536 + 'url': 'https://twitter.com/i/spaces/1eaKbrQbjoRKX', + 'info_dict': { + 'id': '1eaKbrQbjoRKX', + 'ext': 'm4a', + 'title': 'ã‚', + 'description': 'Twitter Space participated by nobody yet', + 'uploader': 'æ¯æ ¹ã¨ã‚る🔪Twitchã§å¾©æ´»', + 'uploader_id': 'tomeru_ikinone', + 'live_status': 'was_live', + 'timestamp': 1685617198, + 'upload_date': '20230601', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + SPACE_STATUS = { + 'notstarted': 'is_upcoming', + 'ended': 'was_live', + 'running': 'is_live', + 'timedout': 'post_live', + } + + def _build_graphql_query(self, space_id): + return { + 'variables': { + 'id': space_id, + 'isMetatagsQuery': True, + 'withDownvotePerspective': False, + 'withReactionsMetadata': False, + 'withReactionsPerspective': False, + 'withReplays': True, + 'withSuperFollowsUserFields': True, + 'withSuperFollowsTweetFields': True, + }, + 'features': { + 'dont_mention_me_view_api_enabled': True, + 'interactive_text_enabled': True, + 'responsive_web_edit_tweet_api_enabled': True, + 'responsive_web_enhance_cards_enabled': True, + 'responsive_web_uc_gql_enabled': True, + 'spaces_2022_h2_clipping': True, + 'spaces_2022_h2_spaces_communities': False, + 'standardized_nudges_misinfo': True, + 'tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled': False, + 'vibe_api_enabled': True, + }, + } + + def _real_extract(self, url): + space_id = self._match_id(url) + if not self.is_logged_in: + self.raise_login_required('Twitter Spaces require authentication') + space_data = self._call_graphql_api('HPEisOmj1epUNLCWTYhUWw/AudioSpaceById', space_id)['audioSpace'] + if not space_data: + raise ExtractorError('Twitter Space not found', expected=True) + + metadata = space_data['metadata'] + live_status = try_call(lambda: self.SPACE_STATUS[metadata['state'].lower()]) + is_live = live_status == 'is_live' + + formats = [] + headers = {'Referer': 'https://twitter.com/'} + if live_status == 'is_upcoming': + self.raise_no_formats('Twitter Space not started yet', expected=True) + elif not is_live and not metadata.get('is_space_available_for_replay'): + self.raise_no_formats('Twitter Space ended and replay is disabled', expected=True) + elif metadata.get('media_key'): + source = traverse_obj( + self._call_api(f'live_video_stream/status/{metadata["media_key"]}', metadata['media_key']), + ('source', ('noRedirectPlaybackUrl', 'location'), {url_or_none}), get_all=False) + formats = self._extract_m3u8_formats( # XXX: Some Spaces need ffmpeg as downloader + source, metadata['media_key'], 'm4a', entry_protocol='m3u8', live=is_live, + headers=headers, fatal=False) if source else [] + for fmt in formats: + fmt.update({'vcodec': 'none', 'acodec': 'aac'}) + if not is_live: + fmt['container'] = 'm4a_dash' + + participants = ', '.join(traverse_obj( + space_data, ('participants', 'speakers', ..., 'display_name'))) or 'nobody yet' + + if not formats and live_status == 'post_live': + self.raise_no_formats('Twitter Space ended but not downloadable yet', expected=True) + + return { + 'id': space_id, + 'title': metadata.get('title'), + 'description': f'Twitter Space participated by {participants}', + 'uploader': traverse_obj( + metadata, ('creator_results', 'result', 'legacy', 'name')), + 'uploader_id': traverse_obj( + metadata, ('creator_results', 'result', 'legacy', 'screen_name')), + 'live_status': live_status, + 'release_timestamp': try_call( + lambda: int_or_none(metadata['scheduled_start'], scale=1000)), + 'timestamp': int_or_none(metadata.get('created_at'), scale=1000), + 'formats': formats, + 'http_headers': headers, + } + + +class TwitterShortenerIE(TwitterBaseIE): + IE_NAME = 'twitter:shortener' + _VALID_URL = r'https?://t\.co/(?P[^?#]+)|tco:(?P[^?#]+)' + _BASE_URL = 'https://t.co/' + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + eid, id = mobj.group('eid', 'id') + if eid: + id = eid + url = self._BASE_URL + id + new_url = self._request_webpage(url, id, headers={'User-Agent': 'curl'}).url + __UNSAFE_LINK = "https://twitter.com/safety/unsafe_link_warning?unsafe_link=" + if new_url.startswith(__UNSAFE_LINK): + new_url = new_url.replace(__UNSAFE_LINK, "") + return self.url_result(new_url) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/txxx.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/txxx.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/txxx.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/txxx.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/udemy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/udemy.py new file mode 100644 index 0000000..5c29605 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/udemy.py @@ -0,0 +1,474 @@ +import re + +from .common import InfoExtractor +from ..compat import compat_str, compat_urlparse +from ..networking import Request +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + determine_ext, + extract_attributes, + float_or_none, + int_or_none, + js_to_json, + smuggle_url, + try_get, + unescapeHTML, + unsmuggle_url, + url_or_none, + urlencode_postdata, +) + + +class UdemyIE(InfoExtractor): + IE_NAME = 'udemy' + _VALID_URL = r'''(?x) + https?:// + (?:[^/]+\.)?udemy\.com/ + (?: + [^#]+\#/lecture/| + lecture/view/?\?lectureId=| + [^/]+/learn/v4/t/lecture/ + ) + (?P\d+) + ''' + _LOGIN_URL = 'https://www.udemy.com/join/login-popup/?displayType=ajax&showSkipButton=1' + _ORIGIN_URL = 'https://www.udemy.com' + _NETRC_MACHINE = 'udemy' + + _TESTS = [{ + 'url': 'https://www.udemy.com/java-tutorial/#/lecture/172757', + 'md5': '98eda5b657e752cf945d8445e261b5c5', + 'info_dict': { + 'id': '160614', + 'ext': 'mp4', + 'title': 'Introduction and Installation', + 'description': 'md5:c0d51f6f21ef4ec65f091055a5eef876', + 'duration': 579.29, + }, + 'skip': 'Requires udemy account credentials', + }, { + # new URL schema + 'url': 'https://www.udemy.com/electric-bass-right-from-the-start/learn/v4/t/lecture/4580906', + 'only_matching': True, + }, { + # no url in outputs format entry + 'url': 'https://www.udemy.com/learn-web-development-complete-step-by-step-guide-to-success/learn/v4/t/lecture/4125812', + 'only_matching': True, + }, { + # only outputs rendition + 'url': 'https://www.udemy.com/how-you-can-help-your-local-community-5-amazing-examples/learn/v4/t/lecture/3225750?start=0', + 'only_matching': True, + }, { + 'url': 'https://wipro.udemy.com/java-tutorial/#/lecture/172757', + 'only_matching': True, + }] + + def _extract_course_info(self, webpage, video_id): + course = self._parse_json( + unescapeHTML(self._search_regex( + r'ng-init=["\'].*\bcourse=({.+?})[;"\']', + webpage, 'course', default='{}')), + video_id, fatal=False) or {} + course_id = course.get('id') or self._search_regex( + [ + r'data-course-id=["\'](\d+)', + r'"courseId"\s*:\s*(\d+)' + ], webpage, 'course id') + return course_id, course.get('title') + + def _enroll_course(self, base_url, webpage, course_id): + def combine_url(base_url, url): + return compat_urlparse.urljoin(base_url, url) if not url.startswith('http') else url + + checkout_url = unescapeHTML(self._search_regex( + r'href=(["\'])(?P(?:https?://(?:www\.)?udemy\.com)?/(?:payment|cart)/checkout/.+?)\1', + webpage, 'checkout url', group='url', default=None)) + if checkout_url: + raise ExtractorError( + 'Course %s is not free. You have to pay for it before you can download. ' + 'Use this URL to confirm purchase: %s' + % (course_id, combine_url(base_url, checkout_url)), + expected=True) + + enroll_url = unescapeHTML(self._search_regex( + r'href=(["\'])(?P(?:https?://(?:www\.)?udemy\.com)?/course/subscribe/.+?)\1', + webpage, 'enroll url', group='url', default=None)) + if enroll_url: + webpage = self._download_webpage( + combine_url(base_url, enroll_url), + course_id, 'Enrolling in the course', + headers={'Referer': base_url}) + if '>You have enrolled in' in webpage: + self.to_screen('%s: Successfully enrolled in the course' % course_id) + + def _download_lecture(self, course_id, lecture_id): + return self._download_json( + 'https://www.udemy.com/api-2.0/users/me/subscribed-courses/%s/lectures/%s?' + % (course_id, lecture_id), + lecture_id, 'Downloading lecture JSON', query={ + 'fields[lecture]': 'title,description,view_html,asset', + 'fields[asset]': 'asset_type,stream_url,thumbnail_url,download_urls,stream_urls,captions,data,course_is_drmed', + }) + + def _handle_error(self, response): + if not isinstance(response, dict): + return + error = response.get('error') + if error: + error_str = 'Udemy returned error #%s: %s' % (error.get('code'), error.get('message')) + error_data = error.get('data') + if error_data: + error_str += ' - %s' % error_data.get('formErrors') + raise ExtractorError(error_str, expected=True) + + def _download_webpage_handle(self, *args, **kwargs): + headers = kwargs.get('headers', {}).copy() + headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36' + kwargs['headers'] = headers + ret = super(UdemyIE, self)._download_webpage_handle( + *args, **kwargs) + if not ret: + return ret + webpage, _ = ret + if any(p in webpage for p in ( + '>Please verify you are a human', + 'Access to this page has been denied because we believe you are using automation tools to browse the website', + '"_pxCaptcha"')): + raise ExtractorError( + 'Udemy asks you to solve a CAPTCHA. Login with browser, ' + 'solve CAPTCHA, then export cookies and pass cookie file to ' + 'yt-dlp with --cookies.', expected=True) + return ret + + def _download_json(self, url_or_request, *args, **kwargs): + headers = { + 'X-Udemy-Snail-Case': 'true', + 'X-Requested-With': 'XMLHttpRequest', + } + for cookie in self.cookiejar: + if cookie.name == 'client_id': + headers['X-Udemy-Client-Id'] = cookie.value + elif cookie.name == 'access_token': + headers['X-Udemy-Bearer-Token'] = cookie.value + headers['X-Udemy-Authorization'] = 'Bearer %s' % cookie.value + + if isinstance(url_or_request, Request): + url_or_request.headers.update(headers) + else: + url_or_request = Request(url_or_request, headers=headers) + + response = super(UdemyIE, self)._download_json(url_or_request, *args, **kwargs) + self._handle_error(response) + return response + + def _perform_login(self, username, password): + login_popup = self._download_webpage( + self._LOGIN_URL, None, 'Downloading login popup') + + def is_logged(webpage): + return any(re.search(p, webpage) for p in ( + r'href=["\'](?:https://www\.udemy\.com)?/user/logout/', + r'>Logout<')) + + # already logged in + if is_logged(login_popup): + return + + login_form = self._form_hidden_inputs('login-form', login_popup) + + login_form.update({ + 'email': username, + 'password': password, + }) + + response = self._download_webpage( + self._LOGIN_URL, None, 'Logging in', + data=urlencode_postdata(login_form), + headers={ + 'Referer': self._ORIGIN_URL, + 'Origin': self._ORIGIN_URL, + }) + + if not is_logged(response): + error = self._html_search_regex( + r'(?s)]+class="form-errors[^"]*">(.+?)', + response, 'error message', default=None) + if error: + raise ExtractorError('Unable to login: %s' % error, expected=True) + raise ExtractorError('Unable to log in') + + def _real_extract(self, url): + lecture_id = self._match_id(url) + course_id = unsmuggle_url(url, {})[1].get('course_id') + + webpage = None + if not course_id: + webpage = self._download_webpage(url, lecture_id) + course_id, _ = self._extract_course_info(webpage, lecture_id) + + try: + lecture = self._download_lecture(course_id, lecture_id) + except ExtractorError as e: + # Error could possibly mean we are not enrolled in the course + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + webpage = webpage or self._download_webpage(url, lecture_id) + self._enroll_course(url, webpage, course_id) + lecture = self._download_lecture(course_id, lecture_id) + else: + raise + + title = lecture['title'] + description = lecture.get('description') + + asset = lecture['asset'] + + asset_type = asset.get('asset_type') or asset.get('assetType') + if asset_type != 'Video': + raise ExtractorError( + 'Lecture %s is not a video' % lecture_id, expected=True) + + stream_url = asset.get('stream_url') or asset.get('streamUrl') + if stream_url: + youtube_url = self._search_regex( + r'(https?://www\.youtube\.com/watch\?v=.*)', stream_url, 'youtube URL', default=None) + if youtube_url: + return self.url_result(youtube_url, 'Youtube') + + video_id = compat_str(asset['id']) + thumbnail = asset.get('thumbnail_url') or asset.get('thumbnailUrl') + duration = float_or_none(asset.get('data', {}).get('duration')) + + subtitles = {} + automatic_captions = {} + + formats = [] + + def extract_output_format(src, f_id): + return { + 'url': src.get('url'), + 'format_id': '%sp' % (src.get('height') or f_id), + 'width': int_or_none(src.get('width')), + 'height': int_or_none(src.get('height')), + 'vbr': int_or_none(src.get('video_bitrate_in_kbps')), + 'vcodec': src.get('video_codec'), + 'fps': int_or_none(src.get('frame_rate')), + 'abr': int_or_none(src.get('audio_bitrate_in_kbps')), + 'acodec': src.get('audio_codec'), + 'asr': int_or_none(src.get('audio_sample_rate')), + 'tbr': int_or_none(src.get('total_bitrate_in_kbps')), + 'filesize': int_or_none(src.get('file_size_in_bytes')), + } + + outputs = asset.get('data', {}).get('outputs') + if not isinstance(outputs, dict): + outputs = {} + + def add_output_format_meta(f, key): + output = outputs.get(key) + if isinstance(output, dict): + output_format = extract_output_format(output, key) + output_format.update(f) + return output_format + return f + + def extract_formats(source_list): + if not isinstance(source_list, list): + return + for source in source_list: + video_url = url_or_none(source.get('file') or source.get('src')) + if not video_url: + continue + if source.get('type') == 'application/x-mpegURL' or determine_ext(video_url) == 'm3u8': + formats.extend(self._extract_m3u8_formats( + video_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + continue + format_id = source.get('label') + f = { + 'url': video_url, + 'format_id': '%sp' % format_id, + 'height': int_or_none(format_id), + } + if format_id: + # Some videos contain additional metadata (e.g. + # https://www.udemy.com/ios9-swift/learn/#/lecture/3383208) + f = add_output_format_meta(f, format_id) + formats.append(f) + + def extract_subtitles(track_list): + if not isinstance(track_list, list): + return + for track in track_list: + if not isinstance(track, dict): + continue + if track.get('kind') != 'captions': + continue + src = url_or_none(track.get('src')) + if not src: + continue + lang = track.get('language') or track.get( + 'srclang') or track.get('label') + sub_dict = automatic_captions if track.get( + 'autogenerated') is True else subtitles + sub_dict.setdefault(lang, []).append({ + 'url': src, + }) + + for url_kind in ('download', 'stream'): + urls = asset.get('%s_urls' % url_kind) + if isinstance(urls, dict): + extract_formats(urls.get('Video')) + + captions = asset.get('captions') + if isinstance(captions, list): + for cc in captions: + if not isinstance(cc, dict): + continue + cc_url = url_or_none(cc.get('url')) + if not cc_url: + continue + lang = try_get(cc, lambda x: x['locale']['locale'], compat_str) + sub_dict = (automatic_captions if cc.get('source') == 'auto' + else subtitles) + sub_dict.setdefault(lang or 'en', []).append({ + 'url': cc_url, + }) + + view_html = lecture.get('view_html') + if view_html: + view_html_urls = set() + for source in re.findall(r']+>', view_html): + attributes = extract_attributes(source) + src = attributes.get('src') + if not src: + continue + res = attributes.get('data-res') + height = int_or_none(res) + if src in view_html_urls: + continue + view_html_urls.add(src) + if attributes.get('type') == 'application/x-mpegURL' or determine_ext(src) == 'm3u8': + m3u8_formats = self._extract_m3u8_formats( + src, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False) + for f in m3u8_formats: + m = re.search(r'/hls_(?P\d{3,4})_(?P\d{2,})/', f['url']) + if m: + if not f.get('height'): + f['height'] = int(m.group('height')) + if not f.get('tbr'): + f['tbr'] = int(m.group('tbr')) + formats.extend(m3u8_formats) + else: + formats.append(add_output_format_meta({ + 'url': src, + 'format_id': '%dp' % height if height else None, + 'height': height, + }, res)) + + # react rendition since 2017.04.15 (see + # https://github.com/ytdl-org/youtube-dl/issues/12744) + data = self._parse_json( + self._search_regex( + r'videojs-setup-data=(["\'])(?P{.+?})\1', view_html, + 'setup data', default='{}', group='data'), video_id, + transform_source=unescapeHTML, fatal=False) + if data and isinstance(data, dict): + extract_formats(data.get('sources')) + if not duration: + duration = int_or_none(data.get('duration')) + extract_subtitles(data.get('tracks')) + + if not subtitles and not automatic_captions: + text_tracks = self._parse_json( + self._search_regex( + r'text-tracks=(["\'])(?P\[.+?\])\1', view_html, + 'text tracks', default='{}', group='data'), video_id, + transform_source=lambda s: js_to_json(unescapeHTML(s)), + fatal=False) + extract_subtitles(text_tracks) + + if not formats and outputs: + for format_id, output in outputs.items(): + f = extract_output_format(output, format_id) + if f.get('url'): + formats.append(f) + + if not formats and asset.get('course_is_drmed'): + self.report_drm(video_id) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'duration': duration, + 'formats': formats, + 'subtitles': subtitles, + 'automatic_captions': automatic_captions, + } + + +class UdemyCourseIE(UdemyIE): # XXX: Do not subclass from concrete IE + IE_NAME = 'udemy:course' + _VALID_URL = r'https?://(?:[^/]+\.)?udemy\.com/(?P[^/?#&]+)' + _TESTS = [{ + 'url': 'https://www.udemy.com/java-tutorial/', + 'only_matching': True, + }, { + 'url': 'https://wipro.udemy.com/java-tutorial/', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if UdemyIE.suitable(url) else super(UdemyCourseIE, cls).suitable(url) + + def _real_extract(self, url): + course_path = self._match_id(url) + + webpage = self._download_webpage(url, course_path) + + course_id, title = self._extract_course_info(webpage, course_path) + + self._enroll_course(url, webpage, course_id) + + response = self._download_json( + 'https://www.udemy.com/api-2.0/courses/%s/cached-subscriber-curriculum-items' % course_id, + course_id, 'Downloading course curriculum', query={ + 'fields[chapter]': 'title,object_index', + 'fields[lecture]': 'title,asset', + 'page_size': '1000', + }) + + entries = [] + chapter, chapter_number = [None] * 2 + for entry in response['results']: + clazz = entry.get('_class') + if clazz == 'lecture': + asset = entry.get('asset') + if isinstance(asset, dict): + asset_type = asset.get('asset_type') or asset.get('assetType') + if asset_type != 'Video': + continue + lecture_id = entry.get('id') + if lecture_id: + entry = { + '_type': 'url_transparent', + 'url': smuggle_url( + f'https://www.udemy.com/{course_path}/learn/v4/t/lecture/{entry["id"]}', + {'course_id': course_id}), + 'title': entry.get('title'), + 'ie_key': UdemyIE.ie_key(), + } + if chapter_number: + entry['chapter_number'] = chapter_number + if chapter: + entry['chapter'] = chapter + entries.append(entry) + elif clazz == 'chapter': + chapter_number = entry.get('object_index') + chapter = entry.get('title') + + return self.playlist_result(entries, course_id, title) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/udn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/udn.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/udn.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/udn.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ufctv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ufctv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ufctv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ufctv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ukcolumn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ukcolumn.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ukcolumn.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ukcolumn.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/uktvplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/uktvplay.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/uktvplay.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/uktvplay.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/umg.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/umg.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/umg.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/umg.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/unistra.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/unistra.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/unistra.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/unistra.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/unity.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/unity.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/unity.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/unity.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/unscripted.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/unscripted.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/unscripted.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/unscripted.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/unsupported.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/unsupported.py new file mode 100644 index 0000000..bbcbf3a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/unsupported.py @@ -0,0 +1,177 @@ +from .common import InfoExtractor +from ..utils import ExtractorError, classproperty, remove_start + + +class UnsupportedInfoExtractor(InfoExtractor): + IE_DESC = False + URLS = () # Redefine in subclasses + + @classproperty + def IE_NAME(cls): + return remove_start(super().IE_NAME, 'Known') + + @classproperty + def _VALID_URL(cls): + return rf'https?://(?:www\.)?(?:{"|".join(cls.URLS)})' + + +LF = '\n ' + + +class KnownDRMIE(UnsupportedInfoExtractor): + """Sites that are known to use DRM for all their videos + + Add to this list only if: + * You are reasonably certain that the site uses DRM for ALL their videos + * Multiple users have asked about this site on github/reddit/discord + """ + + URLS = ( + r'play\.hbomax\.com', + r'channel(?:4|5)\.com', + r'peacocktv\.com', + r'(?:[\w\.]+\.)?disneyplus\.com', + r'open\.spotify\.com/(?:track|playlist|album|artist)', + r'tvnz\.co\.nz', + r'oneplus\.ch', + r'artstation\.com/learning/courses', + r'philo\.com', + r'(?:[\w\.]+\.)?mech-plus\.com', + r'aha\.video', + r'mubi\.com', + r'vootkids\.com', + r'nowtv\.it/watch', + r'tv\.apple\.com', + r'primevideo\.com', + r'hulu\.com', + r'resource\.inkryptvideos\.com', + r'joyn\.de', + r'amazon\.(?:\w{2}\.)?\w+/gp/video', + r'music\.amazon\.(?:\w{2}\.)?\w+', + ) + + _TESTS = [{ + # https://github.com/yt-dlp/yt-dlp/issues/4309 + 'url': 'https://peacocktv.com/watch/playback/vod/GMO_00000000073159_01/f9d03003-eb04-3c7f-a7b6-a83ab7eb55bc', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/1719, + 'url': 'https://www.channel4.com/programmes/gurren-lagann/on-demand/69960-001', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/1548 + 'url': 'https://www.channel5.com/show/uk-s-strongest-man-2021/season-2021/episode-1', + 'only_matching': True, + }, { + 'url': r'https://hsesn.apps.disneyplus.com', + 'only_matching': True, + }, { + 'url': r'https://www.disneyplus.com', + 'only_matching': True, + }, { + 'url': 'https://open.spotify.com/artist/', + 'only_matching': True, + }, { + 'url': 'https://open.spotify.com/track/', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/4122 + 'url': 'https://www.tvnz.co.nz/shows/ice-airport-alaska/episodes/s1-e1', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/1922 + 'url': 'https://www.oneplus.ch/play/1008188', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/1140 + 'url': 'https://www.artstation.com/learning/courses/dqQ/character-design-masterclass-with-serge-birault/chapters/Rxn3/introduction', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/3544 + 'url': 'https://www.philo.com/player/player/vod/Vk9EOjYwODU0ODg5OTY0ODY0OTQ5NA', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/3533 + 'url': 'https://www.mech-plus.com/player/24892/stream?assetType=episodes&playlist_id=6', + 'only_matching': True, + }, { + 'url': 'https://watch.mech-plus.com/details/25240?playlist_id=6', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/2934 + 'url': 'https://www.aha.video/player/movie/lucky-man', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/2743 + 'url': 'https://mubi.com/films/the-night-doctor', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/3287 + 'url': 'https://www.vootkids.com/movies/chhota-bheem-the-rise-of-kirmada/764459', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/2744 + 'url': 'https://www.nowtv.it/watch/home/asset/and-just-like-that/skyserie_f8fe979772e8437d8a61ab83b6d293e9/seasons/1/episodes/8/R_126182_HD', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/5557 + 'url': 'https://tv.apple.com/it/show/loot---una-fortuna/umc.cmc.5erbujil1mpazuerhr1udnk45?ctx_brand=tvs.sbd.4000', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/3072 + 'url': 'https://www.joyn.de/play/serien/clannad/1-1-wo-die-kirschblueten-fallen', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/7323 + 'url': 'https://music.amazon.co.jp/albums/B088Y368TK', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/7323 + 'url': 'https://www.amazon.co.jp/gp/video/detail/B09X5HBYRS/', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/6125 + 'url': 'https://www.primevideo.com/region/eu/detail/0H3DDB4KBJFNDCKKLHNRLRLVKQ/ref=atv_br_def_r_br_c_unkc_1_10', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/5740 + 'url': 'https://resource.inkryptvideos.com/v2-a83ns52/iframe/index.html#video_id=7999ea0f6e03439eb40d056258c2d736&otp=xxx', + 'only_matching': True, + }, { + # https://github.com/yt-dlp/yt-dlp/issues/5767 + 'url': 'https://www.hulu.com/movie/anthem-6b25fac9-da2b-45a3-8e09-e4156b0471cc', + 'only_matching': True, + }] + + def _real_extract(self, url): + raise ExtractorError( + f'The requested site is known to use DRM protection. ' + f'It will {self._downloader._format_err("NOT", self._downloader.Styles.EMPHASIS)} be supported.{LF}' + f'Please {self._downloader._format_err("DO NOT", self._downloader.Styles.ERROR)} open an issue, ' + 'unless you have evidence that the video is not DRM protected', expected=True) + + +class KnownPiracyIE(UnsupportedInfoExtractor): + """Sites that have been deemed to be piracy + + In order for this to not end up being a catalog of piracy sites, + only sites that were once supported should be added to this list + """ + + URLS = ( + r'dood\.(?:to|watch|so|pm|wf|re)', + # Sites youtube-dl supports, but we won't + r'viewsb\.com', + r'filemoon\.sx', + r'hentai\.animestigma\.com', + ) + + _TESTS = [{ + 'url': 'http://dood.to/e/5s1wmbdacezb', + 'only_matching': True, + }] + + def _real_extract(self, url): + raise ExtractorError( + f'This website is no longer supported since it has been determined to be primarily used for piracy.{LF}' + f'{self._downloader._format_err("DO NOT", self._downloader.Styles.ERROR)} open issues for it', expected=True) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/uol.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/uol.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/uol.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/uol.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/uplynk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/uplynk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/uplynk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/uplynk.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/urort.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/urort.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/urort.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/urort.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/urplay.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/urplay.py new file mode 100644 index 0000000..7f97fc9 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/urplay.py @@ -0,0 +1,164 @@ +from .common import InfoExtractor +from ..utils import ( + dict_get, + ExtractorError, + int_or_none, + ISO639Utils, + parse_age_limit, + try_get, + unified_timestamp, +) + + +class URPlayIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?ur(?:play|skola)\.se/(?:program|Produkter)/(?P[0-9]+)' + _TESTS = [{ + 'url': 'https://urplay.se/program/203704-ur-samtiden-livet-universum-och-rymdens-markliga-musik-om-vetenskap-kritiskt-tankande-och-motstand', + 'md5': '5ba36643c77cc3d34ffeadad89937d1e', + 'info_dict': { + 'id': '203704', + 'ext': 'mp4', + 'title': 'UR Samtiden - Livet, universum och rymdens märkliga musik : Om vetenskap, kritiskt tänkande och motstÃ¥nd', + 'description': 'md5:5344508a52aa78c1ced6c1b8b9e44e9a', + 'thumbnail': r're:^https?://.+\.jpg', + 'timestamp': 1513292400, + 'upload_date': '20171214', + 'series': 'UR Samtiden - Livet, universum och rymdens märkliga musik', + 'duration': 2269, + 'categories': ['Vetenskap & teknik'], + 'tags': ['Kritiskt tänkande', 'Vetenskap', 'Vetenskaplig verksamhet'], + 'episode': 'Om vetenskap, kritiskt tänkande och motstÃ¥nd', + 'age_limit': 15, + }, + }, { + 'url': 'https://urplay.se/program/222967-en-foralders-dagbok-mitt-barn-skadar-sig-sjalv', + 'info_dict': { + 'id': '222967', + 'ext': 'mp4', + 'title': 'En förälders dagbok : Mitt barn skadar sig själv', + 'description': 'md5:9f771eef03a732a213b367b52fe826ca', + 'thumbnail': r're:^https?://.+\.jpg', + 'timestamp': 1629676800, + 'upload_date': '20210823', + 'series': 'En förälders dagbok', + 'duration': 1740, + 'age_limit': 15, + 'episode_number': 3, + 'categories': 'count:2', + 'tags': 'count:7', + 'episode': 'Mitt barn skadar sig själv', + }, + }, { + 'url': 'https://urskola.se/Produkter/190031-Tripp-Trapp-Trad-Sovkudde', + 'info_dict': { + 'id': '190031', + 'ext': 'mp4', + 'title': 'Tripp, Trapp, Träd : Sovkudde', + 'description': 'md5:b86bffdae04a7e9379d1d7e5947df1d1', + 'thumbnail': r're:^https?://.+\.jpg', + 'timestamp': 1440086400, + 'upload_date': '20150820', + 'series': 'Tripp, Trapp, Träd', + 'duration': 865, + 'age_limit': 1, + 'episode_number': 1, + 'categories': [], + 'tags': ['Sova'], + 'episode': 'Sovkudde', + 'season': 'Säsong 1', + }, + }, { + 'url': 'http://urskola.se/Produkter/155794-Smasagor-meankieli-Grodan-i-vida-varlden', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + url = url.replace('skola.se/Produkter', 'play.se/program') + webpage = self._download_webpage(url, video_id) + urplayer_data = self._search_nextjs_data(webpage, video_id, fatal=False) or {} + if urplayer_data: + urplayer_data = try_get(urplayer_data, lambda x: x['props']['pageProps']['program'], dict) + if not urplayer_data: + raise ExtractorError('Unable to parse __NEXT_DATA__') + else: + accessible_episodes = self._parse_json(self._html_search_regex( + r'data-react-class="routes/Product/components/ProgramContainer/ProgramContainer"[^>]+data-react-props="({.+?})"', + webpage, 'urplayer data'), video_id)['accessibleEpisodes'] + urplayer_data = next(e for e in accessible_episodes if e.get('id') == int_or_none(video_id)) + episode = urplayer_data['title'] + + host = self._download_json('http://streaming-loadbalancer.ur.se/loadbalancer.json', video_id)['redirect'] + formats = [] + urplayer_streams = urplayer_data.get('streamingInfo', {}) + + for k, v in urplayer_streams.get('raw', {}).items(): + if not (k in ('sd', 'hd', 'mp3', 'm4a') and isinstance(v, dict)): + continue + file_http = v.get('location') + if file_http: + formats.extend(self._extract_wowza_formats( + 'http://%s/%splaylist.m3u8' % (host, file_http), + video_id, skip_protocols=['f4m', 'rtmp', 'rtsp'])) + + subtitles = {} + + def parse_lang_code(code): + "3-character language code or None (utils candidate)" + if code is None: + return + lang = code.lower() + if not ISO639Utils.long2short(lang): + lang = ISO639Utils.short2long(lang) + return lang or None + + for stream in urplayer_data['streamingInfo'].values(): + for k, v in stream.items(): + if (k in ('sd', 'hd') or not isinstance(v, dict)): + continue + lang, sttl_url = (v.get(kk) for kk in ('language', 'location', )) + if not sttl_url: + continue + lang = parse_lang_code(lang) + if not lang: + continue + sttl = subtitles.get(lang) or [] + sttl.append({'ext': k, 'url': sttl_url, }) + subtitles[lang] = sttl + + image = urplayer_data.get('image') or {} + thumbnails = [] + for k, v in image.items(): + t = { + 'id': k, + 'url': v, + } + wh = k.split('x') + if len(wh) == 2: + t.update({ + 'width': int_or_none(wh[0]), + 'height': int_or_none(wh[1]), + }) + thumbnails.append(t) + + series = urplayer_data.get('series') or {} + series_title = dict_get(series, ('seriesTitle', 'title')) or dict_get(urplayer_data, ('seriesTitle', 'mainTitle')) + + return { + 'id': video_id, + 'title': '%s : %s' % (series_title, episode) if series_title else episode, + 'description': urplayer_data.get('description'), + 'thumbnails': thumbnails, + 'timestamp': unified_timestamp(urplayer_data.get('publishedAt')), + 'series': series_title, + 'formats': formats, + 'duration': int_or_none(urplayer_data.get('duration')), + 'categories': urplayer_data.get('categories'), + 'tags': urplayer_data.get('keywords'), + 'season': series.get('label'), + 'episode': episode, + 'episode_number': int_or_none(urplayer_data.get('episodeNumber')), + 'age_limit': parse_age_limit(min(try_get(a, lambda x: x['from'], int) or 0 + for a in urplayer_data.get('ageRanges', []))), + 'subtitles': subtitles, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/usanetwork.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/usanetwork.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/usanetwork.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/usanetwork.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/usatoday.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/usatoday.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/usatoday.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/usatoday.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ustream.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ustream.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ustream.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ustream.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ustudio.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ustudio.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ustudio.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ustudio.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/utreon.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/utreon.py new file mode 100644 index 0000000..8a91691 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/utreon.py @@ -0,0 +1,81 @@ +from .common import InfoExtractor +from ..utils import ( + dict_get, + int_or_none, + str_or_none, + try_get, + unified_strdate, + url_or_none, +) + + +class UtreonIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?utreon\.com/v/(?P[\w-]+)' + _TESTS = [{ + 'url': 'https://utreon.com/v/z_I7ikQbuDw', + 'info_dict': { + 'id': 'z_I7ikQbuDw', + 'ext': 'mp4', + 'title': 'Freedom Friday meditation - Rising in the wind', + 'description': 'md5:a9bf15a42434a062fe313b938343ad1b', + 'uploader': 'Heather Dawn Elemental Health', + 'thumbnail': 'https://data-1.utreon.com/v/MG/M2/NT/z_I7ikQbuDw/z_I7ikQbuDw_preview.jpg', + 'release_date': '20210723', + } + }, { + 'url': 'https://utreon.com/v/jerJw5EOOVU', + 'info_dict': { + 'id': 'jerJw5EOOVU', + 'ext': 'mp4', + 'title': 'When I\'m alone, I love to reflect in peace, to make my dreams come true... [Quotes and Poems]', + 'description': 'md5:61ee6c2da98be51b04b969ca80273aaa', + 'uploader': 'Frases e Poemas Quotes and Poems', + 'thumbnail': 'https://data-1.utreon.com/v/Mz/Zh/ND/jerJw5EOOVU/jerJw5EOOVU_89af85470a4b16eededde7f8674c96d9_cover.jpg', + 'release_date': '20210723', + } + }, { + 'url': 'https://utreon.com/v/C4ZxXhYBBmE', + 'info_dict': { + 'id': 'C4ZxXhYBBmE', + 'ext': 'mp4', + 'title': 'Biden’s Capital Gains Tax Rate to Test World’s Highest', + 'description': 'md5:fb5a6c2e506f013cc76f133f673bc5c8', + 'uploader': 'Nomad Capitalist', + 'thumbnail': 'https://data-1.utreon.com/v/ZD/k1/Mj/C4ZxXhYBBmE/C4ZxXhYBBmE_628342076198c9c06dd6b2c665978584_cover.jpg', + 'release_date': '20210723', + } + }, { + 'url': 'https://utreon.com/v/Y-stEH-FBm8', + 'info_dict': { + 'id': 'Y-stEH-FBm8', + 'ext': 'mp4', + 'title': 'Creeper-Chan Pranks Steve! 💚 [MINECRAFT ANIME]', + 'description': 'md5:7a48450b0d761b96dec194be0c5ecb5f', + 'uploader': 'Merryweather Comics', + 'thumbnail': 'https://data-1.utreon.com/v/MT/E4/Zj/Y-stEH-FBm8/Y-stEH-FBm8_5290676a41a4a1096db133b09f54f77b_cover.jpg', + 'release_date': '20210718', + }}, + ] + + def _real_extract(self, url): + video_id = self._match_id(url) + json_data = self._download_json( + 'https://api.utreon.com/v1/videos/' + video_id, + video_id) + videos_json = json_data['videos'] + formats = [{ + 'url': format_url, + 'format_id': format_key.split('_')[1], + 'height': int(format_key.split('_')[1][:-1]), + } for format_key, format_url in videos_json.items() if url_or_none(format_url)] + thumbnail = url_or_none(dict_get(json_data, ('cover_image_url', 'preview_image_url'))) + return { + 'id': video_id, + 'title': json_data['title'], + 'formats': formats, + 'description': str_or_none(json_data.get('description')), + 'duration': int_or_none(json_data.get('duration')), + 'uploader': str_or_none(try_get(json_data, lambda x: x['channel']['title'])), + 'thumbnail': thumbnail, + 'release_date': unified_strdate(json_data.get('published_datetime')), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/varzesh3.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/varzesh3.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/varzesh3.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/varzesh3.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vbox7.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vbox7.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vbox7.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vbox7.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/veehd.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/veehd.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/veehd.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/veehd.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/veo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/veo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/veo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/veo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/veoh.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/veoh.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/veoh.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/veoh.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vesti.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vesti.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vesti.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vesti.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vevo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vevo.py new file mode 100644 index 0000000..aa40227 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vevo.py @@ -0,0 +1,353 @@ +import re +import json + +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + parse_iso8601, + parse_qs, +) + + +class VevoBaseIE(InfoExtractor): + def _extract_json(self, webpage, video_id): + return self._parse_json( + self._search_regex( + r'window\.__INITIAL_STORE__\s*=\s*({.+?});\s*', + webpage, 'initial store'), + video_id) + + +class VevoIE(VevoBaseIE): + ''' + Accepts urls from vevo.com or in the format 'vevo:{id}' + (currently used by MTVIE and MySpaceIE) + ''' + _VALID_URL = r'''(?x) + (?:https?://(?:www\.)?vevo\.com/watch/(?!playlist|genre)(?:[^/]+/(?:[^/]+/)?)?| + https?://cache\.vevo\.com/m/html/embed\.html\?video=| + https?://videoplayer\.vevo\.com/embed/embedded\?videoId=| + https?://embed\.vevo\.com/.*?[?&]isrc=| + https?://tv\.vevo\.com/watch/artist/(?:[^/]+)/| + vevo:) + (?P[^&?#]+)''' + _EMBED_REGEX = [r']+?src=(["\'])(?P(?:https?:)?//(?:cache\.)?vevo\.com/.+?)\1'] + + _TESTS = [{ + 'url': 'http://www.vevo.com/watch/hurts/somebody-to-die-for/GB1101300280', + 'md5': '95ee28ee45e70130e3ab02b0f579ae23', + 'info_dict': { + 'id': 'GB1101300280', + 'ext': 'mp4', + 'title': 'Hurts - Somebody to Die For', + 'timestamp': 1372057200, + 'upload_date': '20130624', + 'uploader': 'Hurts', + 'track': 'Somebody to Die For', + 'artist': 'Hurts', + 'genre': 'Pop', + }, + 'expected_warnings': ['Unable to download SMIL file', 'Unable to download info'], + }, { + 'note': 'v3 SMIL format', + 'url': 'http://www.vevo.com/watch/cassadee-pope/i-wish-i-could-break-your-heart/USUV71302923', + 'md5': 'f6ab09b034f8c22969020b042e5ac7fc', + 'info_dict': { + 'id': 'USUV71302923', + 'ext': 'mp4', + 'title': 'Cassadee Pope - I Wish I Could Break Your Heart', + 'timestamp': 1392796919, + 'upload_date': '20140219', + 'uploader': 'Cassadee Pope', + 'track': 'I Wish I Could Break Your Heart', + 'artist': 'Cassadee Pope', + 'genre': 'Country', + }, + 'expected_warnings': ['Unable to download SMIL file', 'Unable to download info'], + }, { + 'note': 'Age-limited video', + 'url': 'https://www.vevo.com/watch/justin-timberlake/tunnel-vision-explicit/USRV81300282', + 'info_dict': { + 'id': 'USRV81300282', + 'ext': 'mp4', + 'title': 'Justin Timberlake - Tunnel Vision (Explicit)', + 'age_limit': 18, + 'timestamp': 1372888800, + 'upload_date': '20130703', + 'uploader': 'Justin Timberlake', + 'track': 'Tunnel Vision (Explicit)', + 'artist': 'Justin Timberlake', + 'genre': 'Pop', + }, + 'expected_warnings': ['Unable to download SMIL file', 'Unable to download info'], + }, { + 'note': 'No video_info', + 'url': 'http://www.vevo.com/watch/k-camp-1/Till-I-Die/USUV71503000', + 'md5': '8b83cc492d72fc9cf74a02acee7dc1b0', + 'info_dict': { + 'id': 'USUV71503000', + 'ext': 'mp4', + 'title': 'K Camp ft. T.I. - Till I Die', + 'age_limit': 18, + 'timestamp': 1449468000, + 'upload_date': '20151207', + 'uploader': 'K Camp', + 'track': 'Till I Die', + 'artist': 'K Camp', + 'genre': 'Hip-Hop', + }, + 'expected_warnings': ['Unable to download SMIL file', 'Unable to download info'], + }, { + 'note': 'Featured test', + 'url': 'https://www.vevo.com/watch/lemaitre/Wait/USUV71402190', + 'md5': 'd28675e5e8805035d949dc5cf161071d', + 'info_dict': { + 'id': 'USUV71402190', + 'ext': 'mp4', + 'title': 'Lemaitre ft. LoLo - Wait', + 'age_limit': 0, + 'timestamp': 1413432000, + 'upload_date': '20141016', + 'uploader': 'Lemaitre', + 'track': 'Wait', + 'artist': 'Lemaitre', + 'genre': 'Electronic', + }, + 'expected_warnings': ['Unable to download SMIL file', 'Unable to download info'], + }, { + 'note': 'Only available via webpage', + 'url': 'http://www.vevo.com/watch/GBUV71600656', + 'md5': '67e79210613865b66a47c33baa5e37fe', + 'info_dict': { + 'id': 'GBUV71600656', + 'ext': 'mp4', + 'title': 'ABC - Viva Love', + 'age_limit': 0, + 'timestamp': 1461830400, + 'upload_date': '20160428', + 'uploader': 'ABC', + 'track': 'Viva Love', + 'artist': 'ABC', + 'genre': 'Pop', + }, + 'expected_warnings': ['Failed to download video versions info'], + }, { + # no genres available + 'url': 'http://www.vevo.com/watch/INS171400764', + 'only_matching': True, + }, { + # Another case available only via the webpage; using streams/streamsV3 formats + # Geo-restricted to Netherlands/Germany + 'url': 'http://www.vevo.com/watch/boostee/pop-corn-clip-officiel/FR1A91600909', + 'only_matching': True, + }, { + 'url': 'https://embed.vevo.com/?isrc=USH5V1923499&partnerId=4d61b777-8023-4191-9ede-497ed6c24647&partnerAdCode=', + 'only_matching': True, + }, { + 'url': 'https://tv.vevo.com/watch/artist/janet-jackson/US0450100550', + 'only_matching': True, + }] + _VERSIONS = { + 0: 'youtube', # only in AuthenticateVideo videoVersions + 1: 'level3', + 2: 'akamai', + 3: 'level3', + 4: 'amazon', + } + + def _initialize_api(self, video_id): + webpage = self._download_webpage( + 'https://accounts.vevo.com/token', None, + note='Retrieving oauth token', + errnote='Unable to retrieve oauth token', + data=json.dumps({ + 'client_id': 'SPupX1tvqFEopQ1YS6SS', + 'grant_type': 'urn:vevo:params:oauth:grant-type:anonymous', + }).encode('utf-8'), + headers={ + 'Content-Type': 'application/json', + }) + + if re.search(r'(?i)THIS PAGE IS CURRENTLY UNAVAILABLE IN YOUR REGION', webpage): + self.raise_geo_restricted( + '%s said: This page is currently unavailable in your region' % self.IE_NAME) + + auth_info = self._parse_json(webpage, video_id) + self._api_url_template = self.http_scheme() + '//apiv2.vevo.com/%s?token=' + auth_info['legacy_token'] + + def _call_api(self, path, *args, **kwargs): + try: + data = self._download_json(self._api_url_template % path, *args, **kwargs) + except ExtractorError as e: + if isinstance(e.cause, HTTPError): + errors = self._parse_json(e.cause.response.read().decode(), None)['errors'] + error_message = ', '.join([error['message'] for error in errors]) + raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True) + raise + return data + + def _real_extract(self, url): + video_id = self._match_id(url) + + self._initialize_api(video_id) + + video_info = self._call_api( + 'video/%s' % video_id, video_id, 'Downloading api video info', + 'Failed to download video info') + + video_versions = self._call_api( + 'video/%s/streams' % video_id, video_id, + 'Downloading video versions info', + 'Failed to download video versions info', + fatal=False) + + # Some videos are only available via webpage (e.g. + # https://github.com/ytdl-org/youtube-dl/issues/9366) + if not video_versions: + webpage = self._download_webpage(url, video_id) + json_data = self._extract_json(webpage, video_id) + if 'streams' in json_data.get('default', {}): + video_versions = json_data['default']['streams'][video_id][0] + else: + video_versions = [ + value + for key, value in json_data['apollo']['data'].items() + if key.startswith('%s.streams' % video_id)] + + uploader = None + artist = None + featured_artist = None + artists = video_info.get('artists') + for curr_artist in artists: + if curr_artist.get('role') == 'Featured': + featured_artist = curr_artist['name'] + else: + artist = uploader = curr_artist['name'] + + formats = [] + for video_version in video_versions: + version = self._VERSIONS.get(video_version.get('version'), 'generic') + version_url = video_version.get('url') + if not version_url: + continue + + if '.ism' in version_url: + continue + elif '.mpd' in version_url: + formats.extend(self._extract_mpd_formats( + version_url, video_id, mpd_id='dash-%s' % version, + note='Downloading %s MPD information' % version, + errnote='Failed to download %s MPD information' % version, + fatal=False)) + elif '.m3u8' in version_url: + formats.extend(self._extract_m3u8_formats( + version_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls-%s' % version, + note='Downloading %s m3u8 information' % version, + errnote='Failed to download %s m3u8 information' % version, + fatal=False)) + else: + m = re.search(r'''(?xi) + _(?P[a-z0-9]+) + _(?P[0-9]+)x(?P[0-9]+) + _(?P[a-z0-9]+) + _(?P[0-9]+) + _(?P[a-z0-9]+) + _(?P[0-9]+) + \.(?P[a-z0-9]+)''', version_url) + if not m: + continue + + formats.append({ + 'url': version_url, + 'format_id': f'http-{version}-{video_version.get("quality") or m.group("quality")}', + 'vcodec': m.group('vcodec'), + 'acodec': m.group('acodec'), + 'vbr': int(m.group('vbr')), + 'abr': int(m.group('abr')), + 'ext': m.group('ext'), + 'width': int(m.group('width')), + 'height': int(m.group('height')), + }) + + track = video_info['title'] + if featured_artist: + artist = '%s ft. %s' % (artist, featured_artist) + title = '%s - %s' % (artist, track) if artist else track + + genres = video_info.get('genres') + genre = ( + genres[0] if genres and isinstance(genres, list) + and isinstance(genres[0], compat_str) else None) + + is_explicit = video_info.get('isExplicit') + if is_explicit is True: + age_limit = 18 + elif is_explicit is False: + age_limit = 0 + else: + age_limit = None + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'thumbnail': video_info.get('imageUrl') or video_info.get('thumbnailUrl'), + 'timestamp': parse_iso8601(video_info.get('releaseDate')), + 'uploader': uploader, + 'duration': int_or_none(video_info.get('duration')), + 'view_count': int_or_none(video_info.get('views', {}).get('total')), + 'age_limit': age_limit, + 'track': track, + 'artist': uploader, + 'genre': genre, + } + + +class VevoPlaylistIE(VevoBaseIE): + _VALID_URL = r'https?://(?:www\.)?vevo\.com/watch/(?Pplaylist|genre)/(?P[^/?#&]+)' + + _TESTS = [{ + 'url': 'http://www.vevo.com/watch/genre/rock', + 'info_dict': { + 'id': 'rock', + 'title': 'Rock', + }, + 'playlist_count': 20, + }, { + 'url': 'http://www.vevo.com/watch/genre/rock?index=0', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + playlist_id = mobj.group('id') + playlist_kind = mobj.group('kind') + + webpage = self._download_webpage(url, playlist_id) + + qs = parse_qs(url) + index = qs.get('index', [None])[0] + + if index: + video_id = self._search_regex( + r']+content=(["\'])vevo://video/(?P.+?)\1[^>]*>', + webpage, 'video id', default=None, group='id') + if video_id: + return self.url_result('vevo:%s' % video_id, VevoIE.ie_key()) + + playlists = self._extract_json(webpage, playlist_id)['default']['%ss' % playlist_kind] + + playlist = (list(playlists.values())[0] + if playlist_kind == 'playlist' else playlists[playlist_id]) + + entries = [ + self.url_result('vevo:%s' % src, VevoIE.ie_key()) + for src in playlist['isrcs']] + + return self.playlist_result( + entries, playlist.get('playlistId') or playlist_id, + playlist.get('name'), playlist.get('description')) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vgtv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vgtv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vgtv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vgtv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vh1.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vh1.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vh1.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vh1.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vice.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vice.py new file mode 100644 index 0000000..8a71268 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vice.py @@ -0,0 +1,319 @@ +import functools +import hashlib +import json +import random +import time + +from .adobepass import AdobePassIE +from .common import InfoExtractor +from .youtube import YoutubeIE +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + clean_html, + ExtractorError, + int_or_none, + OnDemandPagedList, + parse_age_limit, + str_or_none, + try_get, +) + + +class ViceBaseIE(InfoExtractor): + def _call_api(self, resource, resource_key, resource_id, locale, fields, args=''): + return self._download_json( + 'https://video.vice.com/api/v1/graphql', resource_id, query={ + 'query': '''{ + %s(locale: "%s", %s: "%s"%s) { + %s + } +}''' % (resource, locale, resource_key, resource_id, args, fields), + })['data'][resource] + + +class ViceIE(ViceBaseIE, AdobePassIE): + IE_NAME = 'vice' + _VALID_URL = r'https?://(?:(?:video|vms)\.vice|(?:www\.)?vice(?:land|tv))\.com/(?P[^/]+)/(?:video/[^/]+|embed)/(?P[\da-f]{24})' + _EMBED_REGEX = [r']+\bsrc=["\'](?P(?:https?:)?//video\.vice\.com/[^/]+/embed/[\da-f]{24})'] + _TESTS = [{ + 'url': 'https://video.vice.com/en_us/video/pet-cremator/58c69e38a55424f1227dc3f7', + 'info_dict': { + 'id': '58c69e38a55424f1227dc3f7', + 'ext': 'mp4', + 'title': '10 Questions You Always Wanted To Ask: Pet Cremator', + 'description': 'md5:fe856caacf61fe0e74fab15ce2b07ca5', + 'uploader': 'vice', + 'uploader_id': '57a204088cb727dec794c67b', + 'timestamp': 1489664942, + 'upload_date': '20170316', + 'age_limit': 14, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + # geo restricted to US + 'url': 'https://video.vice.com/en_us/video/the-signal-from-tolva/5816510690b70e6c5fd39a56', + 'info_dict': { + 'id': '5816510690b70e6c5fd39a56', + 'ext': 'mp4', + 'uploader': 'vice', + 'title': 'The Signal From Tölva', + 'description': 'md5:3927e3c79f9e8094606a2b3c5b5e55d5', + 'uploader_id': '57a204088cb727dec794c67b', + 'timestamp': 1477941983, + 'upload_date': '20161031', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + 'url': 'https://video.vice.com/alps/video/ulfs-wien-beruchtigste-grafitti-crew-part-1/581b12b60a0e1f4c0fb6ea2f', + 'info_dict': { + 'id': '581b12b60a0e1f4c0fb6ea2f', + 'ext': 'mp4', + 'title': 'ULFs - Wien berüchtigste Grafitti Crew - Part 1', + 'description': 'Zwischen Hinterzimmer-Tattoos und U-Bahnschächten erzählen uns die Ulfs, wie es ist, "süchtig nach Sachbeschädigung" zu sein.', + 'uploader': 'vice', + 'uploader_id': '57a204088cb727dec794c67b', + 'timestamp': 1485368119, + 'upload_date': '20170125', + 'age_limit': 14, + }, + 'params': { + # AES-encrypted m3u8 + 'skip_download': True, + }, + }, { + 'url': 'https://video.vice.com/en_us/video/pizza-show-trailer/56d8c9a54d286ed92f7f30e4', + 'only_matching': True, + }, { + 'url': 'https://video.vice.com/en_us/embed/57f41d3556a0a80f54726060', + 'only_matching': True, + }, { + 'url': 'https://vms.vice.com/en_us/video/preplay/58c69e38a55424f1227dc3f7', + 'only_matching': True, + }, { + 'url': 'https://www.viceland.com/en_us/video/thursday-march-1-2018/5a8f2d7ff1cdb332dd446ec1', + 'only_matching': True, + }] + + def _real_extract(self, url): + locale, video_id = self._match_valid_url(url).groups() + + video = self._call_api('videos', 'id', video_id, locale, '''body + locked + rating + thumbnail_url + title''')[0] + title = video['title'].strip() + rating = video.get('rating') + + query = {} + if video.get('locked'): + resource = self._get_mvpd_resource( + 'VICELAND', title, video_id, rating) + query['tvetoken'] = self._extract_mvpd_auth( + url, video_id, 'VICELAND', resource) + + # signature generation algorithm is reverse engineered from signatureGenerator in + # webpack:///../shared/~/vice-player/dist/js/vice-player.js in + # https://www.viceland.com/assets/common/js/web.vendor.bundle.js + # new JS is located here https://vice-web-statics-cdn.vice.com/vice-player/player-embed.js + exp = int(time.time()) + 1440 + + query.update({ + 'exp': exp, + 'sign': hashlib.sha512(('%s:GET:%d' % (video_id, exp)).encode()).hexdigest(), + 'skipadstitching': 1, + 'platform': 'desktop', + 'rn': random.randint(10000, 100000), + }) + + try: + preplay = self._download_json( + 'https://vms.vice.com/%s/video/preplay/%s' % (locale, video_id), + video_id, query=query) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status in (400, 401): + error = json.loads(e.cause.response.read().decode()) + error_message = error.get('error_description') or error['details'] + raise ExtractorError('%s said: %s' % ( + self.IE_NAME, error_message), expected=True) + raise + + video_data = preplay['video'] + formats = self._extract_m3u8_formats( + preplay['playURL'], video_id, 'mp4', 'm3u8_native') + episode = video_data.get('episode') or {} + channel = video_data.get('channel') or {} + season = video_data.get('season') or {} + + subtitles = {} + for subtitle in preplay.get('subtitleURLs', []): + cc_url = subtitle.get('url') + if not cc_url: + continue + language_code = try_get(subtitle, lambda x: x['languages'][0]['language_code'], compat_str) or 'en' + subtitles.setdefault(language_code, []).append({ + 'url': cc_url, + }) + + return { + 'formats': formats, + 'id': video_id, + 'title': title, + 'description': clean_html(video.get('body')), + 'thumbnail': video.get('thumbnail_url'), + 'duration': int_or_none(video_data.get('video_duration')), + 'timestamp': int_or_none(video_data.get('created_at'), 1000), + 'age_limit': parse_age_limit(video_data.get('video_rating') or rating), + 'series': try_get(video_data, lambda x: x['show']['base']['display_title'], compat_str), + 'episode_number': int_or_none(episode.get('episode_number')), + 'episode_id': str_or_none(episode.get('id') or video_data.get('episode_id')), + 'season_number': int_or_none(season.get('season_number')), + 'season_id': str_or_none(season.get('id') or video_data.get('season_id')), + 'uploader': channel.get('name'), + 'uploader_id': str_or_none(channel.get('id')), + 'subtitles': subtitles, + } + + +class ViceShowIE(ViceBaseIE): + IE_NAME = 'vice:show' + _VALID_URL = r'https?://(?:video\.vice|(?:www\.)?vice(?:land|tv))\.com/(?P[^/]+)/show/(?P[^/?#&]+)' + _PAGE_SIZE = 25 + _TESTS = [{ + 'url': 'https://video.vice.com/en_us/show/fck-thats-delicious', + 'info_dict': { + 'id': '57a2040c8cb727dec794c901', + 'title': 'F*ck, That’s Delicious', + 'description': 'The life and eating habits of rap’s greatest bon vivant, Action Bronson.', + }, + 'playlist_mincount': 64, + }, { + 'url': 'https://www.vicetv.com/en_us/show/fck-thats-delicious', + 'only_matching': True, + }] + + def _fetch_page(self, locale, show_id, page): + videos = self._call_api('videos', 'show_id', show_id, locale, '''body + id + url''', ', page: %d, per_page: %d' % (page + 1, self._PAGE_SIZE)) + for video in videos: + yield self.url_result( + video['url'], ViceIE.ie_key(), video.get('id')) + + def _real_extract(self, url): + locale, display_id = self._match_valid_url(url).groups() + show = self._call_api('shows', 'slug', display_id, locale, '''dek + id + title''')[0] + show_id = show['id'] + + entries = OnDemandPagedList( + functools.partial(self._fetch_page, locale, show_id), + self._PAGE_SIZE) + + return self.playlist_result( + entries, show_id, show.get('title'), show.get('dek')) + + +class ViceArticleIE(ViceBaseIE): + IE_NAME = 'vice:article' + _VALID_URL = r'https://(?:www\.)?vice\.com/(?P[^/]+)/article/(?:[0-9a-z]{6}/)?(?P[^?#]+)' + + _TESTS = [{ + 'url': 'https://www.vice.com/en_us/article/on-set-with-the-woman-making-mormon-porn-in-utah', + 'info_dict': { + 'id': '58dc0a3dee202d2a0ccfcbd8', + 'ext': 'mp4', + 'title': 'Mormon War on Porn', + 'description': 'md5:1c5d91fe25fa8aa304f9def118b92dbf', + 'uploader': 'vice', + 'uploader_id': '57a204088cb727dec794c67b', + 'timestamp': 1491883129, + 'upload_date': '20170411', + 'age_limit': 17, + }, + 'params': { + # AES-encrypted m3u8 + 'skip_download': True, + }, + 'add_ie': [ViceIE.ie_key()], + }, { + 'url': 'https://www.vice.com/en_us/article/how-to-hack-a-car', + 'md5': '13010ee0bc694ea87ec40724397c2349', + 'info_dict': { + 'id': '3jstaBeXgAs', + 'ext': 'mp4', + 'title': 'How to Hack a Car: Phreaked Out (Episode 2)', + 'description': 'md5:ee95453f7ff495db8efe14ae8bf56f30', + 'uploader': 'Motherboard', + 'uploader_id': 'MotherboardTV', + 'upload_date': '20140529', + }, + 'add_ie': [YoutubeIE.ie_key()], + }, { + 'url': 'https://www.vice.com/en_us/article/znm9dx/karley-sciortino-slutever-reloaded', + 'md5': 'a7ecf64ee4fa19b916c16f4b56184ae2', + 'info_dict': { + 'id': '57f41d3556a0a80f54726060', + 'ext': 'mp4', + 'title': "Making The World's First Male Sex Doll", + 'description': 'md5:19b00b215b99961cf869c40fbe9df755', + 'uploader': 'vice', + 'uploader_id': '57a204088cb727dec794c67b', + 'timestamp': 1476919911, + 'upload_date': '20161019', + 'age_limit': 17, + }, + 'params': { + 'skip_download': True, + }, + 'add_ie': [ViceIE.ie_key()], + }, { + 'url': 'https://www.vice.com/en_us/article/cowboy-capitalists-part-1', + 'only_matching': True, + }, { + 'url': 'https://www.vice.com/ru/article/big-night-out-ibiza-clive-martin-229', + 'only_matching': True, + }] + + def _real_extract(self, url): + locale, display_id = self._match_valid_url(url).groups() + + article = self._call_api('articles', 'slug', display_id, locale, '''body + embed_code''')[0] + body = article['body'] + + def _url_res(video_url, ie_key): + return { + '_type': 'url_transparent', + 'url': video_url, + 'display_id': display_id, + 'ie_key': ie_key, + } + + vice_url = ViceIE._extract_url(body) + if vice_url: + return _url_res(vice_url, ViceIE.ie_key()) + + embed_code = self._search_regex( + r'embedCode=([^&\'"]+)', body, + 'ooyala embed code', default=None) + if embed_code: + return _url_res('ooyala:%s' % embed_code, 'Ooyala') + + youtube_url = YoutubeIE._extract_url(body) + if youtube_url: + return _url_res(youtube_url, YoutubeIE.ie_key()) + + video_url = self._html_search_regex( + r'data-video-url="([^"]+)"', + article['embed_code'], 'video URL') + + return _url_res(video_url, ViceIE.ie_key()) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vidbit.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vidbit.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vidbit.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vidbit.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/viddler.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viddler.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/viddler.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/viddler.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/videa.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videa.py new file mode 100644 index 0000000..634d2ed --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/videa.py @@ -0,0 +1,188 @@ +import random +import string +import struct + +from .common import InfoExtractor +from ..compat import compat_b64decode, compat_ord +from ..utils import ( + ExtractorError, + int_or_none, + mimetype2ext, + parse_codecs, + parse_qs, + update_url_query, + urljoin, + xpath_element, + xpath_text, +) + + +class VideaIE(InfoExtractor): + _VALID_URL = r'''(?x) + https?:// + videa(?:kid)?\.hu/ + (?: + videok/(?:[^/]+/)*[^?#&]+-| + (?:videojs_)?player\?.*?\bv=| + player/v/ + ) + (?P[^?#&]+) + ''' + _EMBED_REGEX = [r']+src=(["\'])(?P(?:https?:)?//videa\.hu/player\?.*?\bv=.+?)\1'] + _TESTS = [{ + 'url': 'http://videa.hu/videok/allatok/az-orult-kigyasz-285-kigyot-kigyo-8YfIAjxwWGwT8HVQ', + 'md5': '97a7af41faeaffd9f1fc864a7c7e7603', + 'info_dict': { + 'id': '8YfIAjxwWGwT8HVQ', + 'ext': 'mp4', + 'title': 'Az Å‘rült kígyász 285 kígyót enged szabadon', + 'thumbnail': r're:^https?://.*', + 'duration': 21, + 'age_limit': 0, + }, + }, { + 'url': 'http://videa.hu/videok/origo/jarmuvek/supercars-elozes-jAHDWfWSJH5XuFhH', + 'md5': 'd57ccd8812c7fd491d33b1eab8c99975', + 'info_dict': { + 'id': 'jAHDWfWSJH5XuFhH', + 'ext': 'mp4', + 'title': 'Supercars elÅ‘zés', + 'thumbnail': r're:^https?://.*', + 'duration': 64, + 'age_limit': 0, + }, + }, { + 'url': 'http://videa.hu/player?v=8YfIAjxwWGwT8HVQ', + 'md5': '97a7af41faeaffd9f1fc864a7c7e7603', + 'info_dict': { + 'id': '8YfIAjxwWGwT8HVQ', + 'ext': 'mp4', + 'title': 'Az Å‘rült kígyász 285 kígyót enged szabadon', + 'thumbnail': r're:^https?://.*', + 'duration': 21, + 'age_limit': 0, + }, + }, { + 'url': 'http://videa.hu/player/v/8YfIAjxwWGwT8HVQ?autoplay=1', + 'only_matching': True, + }, { + 'url': 'https://videakid.hu/videok/origo/jarmuvek/supercars-elozes-jAHDWfWSJH5XuFhH', + 'only_matching': True, + }, { + 'url': 'https://videakid.hu/player?v=8YfIAjxwWGwT8HVQ', + 'only_matching': True, + }, { + 'url': 'https://videakid.hu/player/v/8YfIAjxwWGwT8HVQ?autoplay=1', + 'only_matching': True, + }] + _STATIC_SECRET = 'xHb0ZvME5q8CBcoQi6AngerDu3FGO9fkUlwPmLVY_RTzj2hJIS4NasXWKy1td7p' + + @staticmethod + def rc4(cipher_text, key): + res = b'' + + key_len = len(key) + S = list(range(256)) + + j = 0 + for i in range(256): + j = (j + S[i] + ord(key[i % key_len])) % 256 + S[i], S[j] = S[j], S[i] + + i = 0 + j = 0 + for m in range(len(cipher_text)): + i = (i + 1) % 256 + j = (j + S[i]) % 256 + S[i], S[j] = S[j], S[i] + k = S[(S[i] + S[j]) % 256] + res += struct.pack('B', k ^ compat_ord(cipher_text[m])) + + return res.decode() + + def _real_extract(self, url): + video_id = self._match_id(url) + video_page = self._download_webpage(url, video_id) + + if 'videa.hu/player' in url: + player_url = url + player_page = video_page + else: + player_url = self._search_regex( + r'%s)/(?: + m/(?P[0-9a-f]+)| + (?:category/)?video/(?P[\w-]+)/(?P[0-9a-f]{32})| + media/embed.*(?:\?|&)key=(?P[0-9a-f]{32}&?) + )''' % ('|'.join(map(re.escape, _INSTANCES))) + + _TESTS = [ + { + 'url': 'https://videocampus.sachsen.de/m/e0d6c8ce6e394c188f1342f1ab7c50ed6fc4490b808699801def5cb2e46d76ca7367f622a9f516c542ffb805b24d6b643bd7c81f385acaac4c59081b87a2767b', + 'info_dict': { + 'id': 'e6b9349905c1628631f175712250f2a1', + 'title': 'Konstruktiver Entwicklungsprozess Vorlesung 7', + 'description': 'Konstruktiver Entwicklungsprozess Vorlesung 7', + 'thumbnail': 'https://videocampus.sachsen.de/cache/1a985379ad3aecba8097a6902c7daa4e.jpg', + 'ext': 'mp4', + }, + }, + { + 'url': 'https://videocampus.sachsen.de/video/Was-ist-selbstgesteuertes-Lernen/fc99c527e4205b121cb7c74433469262', + 'info_dict': { + 'id': 'fc99c527e4205b121cb7c74433469262', + 'title': 'Was ist selbstgesteuertes Lernen?', + 'description': 'md5:196aa3b0509a526db62f84679522a2f5', + 'thumbnail': 'https://videocampus.sachsen.de/cache/6f4a85096ba24cb398e6ce54446b57ae.jpg', + 'display_id': 'Was-ist-selbstgesteuertes-Lernen', + 'ext': 'mp4', + }, + }, + { + 'url': 'https://videocampus.sachsen.de/category/video/Tutorial-zur-Nutzung-von-Adobe-Connect-aus-Veranstalter-Sicht/09d4ed029002eb1bdda610f1103dd54c/100', + 'info_dict': { + 'id': '09d4ed029002eb1bdda610f1103dd54c', + 'title': 'Tutorial zur Nutzung von Adobe Connect aus Veranstalter-Sicht', + 'description': 'md5:3d379ca3cc17b9da6784d7f58cca4d58', + 'thumbnail': 'https://videocampus.sachsen.de/cache/2452498fe8c2d5a7dc79a05d30f407b6.jpg', + 'display_id': 'Tutorial-zur-Nutzung-von-Adobe-Connect-aus-Veranstalter-Sicht', + 'ext': 'mp4', + }, + }, + { + 'url': 'https://www2.univ-sba.dz/video/Presentation-de-la-Faculte-de-droit-et-des-sciences-politiques-Journee-portes-ouvertes-202122/0183356e41af7bfb83d7667b20d9b6a3', + 'info_dict': { + 'url': 'https://www2.univ-sba.dz/getMedium/0183356e41af7bfb83d7667b20d9b6a3.mp4', + 'id': '0183356e41af7bfb83d7667b20d9b6a3', + 'title': 'Présentation de la Faculté de droit et des sciences politiques - Journée portes ouvertes 2021/22', + 'description': 'md5:508958bd93e0ca002ac731d94182a54f', + 'thumbnail': 'https://www2.univ-sba.dz/cache/4d5d4a0b4189271a8cc6cb5328e14769.jpg', + 'display_id': 'Presentation-de-la-Faculte-de-droit-et-des-sciences-politiques-Journee-portes-ouvertes-202122', + 'ext': 'mp4', + } + }, + { + 'url': 'https://vimp.weka-fachmedien.de/video/Preisverleihung-Produkte-des-Jahres-2022/c8816f1cc942c12b6cce57c835cffd7c', + 'info_dict': { + 'id': 'c8816f1cc942c12b6cce57c835cffd7c', + 'title': 'Preisverleihung »Produkte des Jahres 2022«', + 'description': 'md5:60c347568ca89aa25b772c4ea564ebd3', + 'thumbnail': 'https://vimp.weka-fachmedien.de/cache/da9f3090e9227b25beacf67ccf94de14.png', + 'display_id': 'Preisverleihung-Produkte-des-Jahres-2022', + 'ext': 'mp4', + }, + }, + { + 'url': 'https://videocampus.sachsen.de/media/embed?key=fc99c527e4205b121cb7c74433469262', + 'info_dict': { + 'id': 'fc99c527e4205b121cb7c74433469262', + 'title': 'Was ist selbstgesteuertes Lernen?', + 'ext': 'mp4', + }, + }, + ] + + def _real_extract(self, url): + host, video_id, tmp_id, display_id, embed_id = self._match_valid_url(url).group( + 'host', 'id', 'tmp_id', 'display_id', 'embed_id') + webpage = self._download_webpage(url, video_id or tmp_id, fatal=False) or '' + + if not video_id: + video_id = embed_id or self._html_search_regex( + rf'src="https?://{host}/media/embed.*(?:\?|&)key=([0-9a-f]+)&?', + webpage, 'video_id') + + if not (display_id or tmp_id): + # Title, description from embedded page's meta wouldn't be correct + title = self._html_search_regex(r']* data-piwik-title="([^"<]+)"', webpage, 'title', fatal=False) + description = None + thumbnail = None + else: + title = self._html_search_meta(('og:title', 'twitter:title', 'title'), webpage, fatal=False) + description = self._html_search_meta( + ('og:description', 'twitter:description', 'description'), webpage, fatal=False) + thumbnail = self._html_search_meta(('og:image', 'twitter:image'), webpage, fatal=False) + + formats, subtitles = [], {} + try: + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + f'https://{host}/media/hlsMedium/key/{video_id}/format/auto/ext/mp4/learning/0/path/m3u8', + video_id, 'mp4', m3u8_id='hls', fatal=True) + except ExtractorError as e: + if not isinstance(e.cause, HTTPError) or e.cause.status not in (404, 500): + raise + + formats.append({'url': f'https://{host}/getMedium/{video_id}.mp4'}) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'display_id': display_id, + 'formats': formats, + 'subtitles': subtitles, + } + + +class ViMPPlaylistIE(InfoExtractor): + IE_NAME = 'ViMP:Playlist' + _VALID_URL = r'''(?x)(?Phttps?://(?:%s))/(?: + album/view/aid/(?P[0-9]+)| + (?Pcategory|channel)/(?P[\w-]+)/(?P[0-9]+) + )''' % '|'.join(map(re.escape, VideocampusSachsenIE._INSTANCES)) + + _TESTS = [{ + 'url': 'https://vimp.oth-regensburg.de/channel/Designtheorie-1-SoSe-2020/3', + 'info_dict': { + 'id': 'channel-3', + 'title': 'Designtheorie 1 SoSe 2020 :: Channels :: ViMP OTH Regensburg', + }, + 'playlist_mincount': 9, + }, { + 'url': 'https://www.fh-bielefeld.de/medienportal/album/view/aid/208', + 'info_dict': { + 'id': 'album-208', + 'title': 'KG Praktikum ABT/MEC :: Playlists :: FH-Medienportal', + }, + 'playlist_mincount': 4, + }, { + 'url': 'https://videocampus.sachsen.de/category/online-tutorials-onyx/91', + 'info_dict': { + 'id': 'category-91', + 'title': 'Online-Seminare ONYX - BPS - Bildungseinrichtungen - VCS', + }, + 'playlist_mincount': 7, + }] + _PAGE_SIZE = 10 + + def _fetch_page(self, host, url_part, id, data, page): + webpage = self._download_webpage( + f'{host}/media/ajax/component/boxList/{url_part}', id, + query={'page': page, 'page_only': 1}, data=urlencode_postdata(data)) + urls = re.findall(r'"([^"]+/video/[^"]+)"', webpage) + + for url in urls: + yield self.url_result(host + url, VideocampusSachsenIE) + + def _real_extract(self, url): + host, album_id, mode, name, id = self._match_valid_url(url).group( + 'host', 'album_id', 'mode', 'name', 'id') + + webpage = self._download_webpage(url, album_id or id, fatal=False) or '' + title = (self._html_search_meta('title', webpage, fatal=False) + or self._html_extract_title(webpage)) + + url_part = (f'aid/{album_id}' if album_id + else f'category/{name}/category_id/{id}' if mode == 'category' + else f'title/{name}/channel/{id}') + + mode = mode or 'album' + data = { + 'vars[mode]': mode, + f'vars[{mode}]': album_id or id, + 'vars[context]': '4' if album_id else '1' if mode == 'category' else '3', + 'vars[context_id]': album_id or id, + 'vars[layout]': 'thumb', + 'vars[per_page][thumb]': str(self._PAGE_SIZE), + } + + return self.playlist_result( + OnDemandPagedList(functools.partial( + self._fetch_page, host, url_part, album_id or id, data), self._PAGE_SIZE), + playlist_title=title, id=f'{mode}-{album_id or id}') diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/videodetective.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videodetective.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/videodetective.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/videodetective.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/videofyme.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videofyme.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/videofyme.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/videofyme.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/videoken.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videoken.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/videoken.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/videoken.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/videomore.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videomore.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/videomore.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/videomore.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/videopress.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/videopress.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/videopress.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/videopress.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vidio.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vidio.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vidio.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vidio.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vidlii.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vidlii.py new file mode 100644 index 0000000..44353b7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vidlii.py @@ -0,0 +1,154 @@ +import re + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import ( + format_field, + float_or_none, + get_element_by_id, + int_or_none, + str_to_int, + strip_or_none, + unified_strdate, + urljoin, +) + + +class VidLiiIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?vidlii\.com/(?:watch|embed)\?.*?\bv=(?P[0-9A-Za-z_-]{11})' + _TESTS = [{ + 'url': 'https://www.vidlii.com/watch?v=tJluaH4BJ3v', + 'md5': '9bf7d1e005dfa909b6efb0a1ff5175e2', + 'info_dict': { + 'id': 'tJluaH4BJ3v', + 'ext': 'mp4', + 'title': 'Vidlii is against me', + 'description': 'md5:fa3f119287a2bfb922623b52b1856145', + 'thumbnail': 're:https://.*.jpg', + 'uploader': 'APPle5auc31995', + 'uploader_url': 'https://www.vidlii.com/user/APPle5auc31995', + 'upload_date': '20171107', + 'duration': 212, + 'view_count': int, + 'comment_count': int, + 'average_rating': float, + 'categories': ['News & Politics'], + 'tags': ['Vidlii', 'Jan', 'Videogames'], + } + }, { + 'url': 'https://www.vidlii.com/watch?v=zTAtaAgOLKt', + 'md5': '5778f7366aa4c569b77002f8bf6b614f', + 'info_dict': { + 'id': 'zTAtaAgOLKt', + 'ext': 'mp4', + 'title': 'FULPTUBE SUCKS.', + 'description': 'md5:087b2ca355d4c8f8f77e97c43e72d711', + 'thumbnail': 'https://www.vidlii.com/usfi/thmp/zTAtaAgOLKt.jpg', + 'uploader': 'Homicide', + 'uploader_url': 'https://www.vidlii.com/user/Homicide', + 'upload_date': '20210612', + 'duration': 89, + 'view_count': int, + 'comment_count': int, + 'average_rating': float, + 'categories': ['News & Politics'], + 'tags': ['fulp', 'tube', 'sucks', 'bad', 'fulptube'], + }, + }, { + 'url': 'https://www.vidlii.com/embed?v=tJluaH4BJ3v&a=0', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage( + 'https://www.vidlii.com/watch?v=%s' % video_id, video_id) + formats = [] + + sources = [source[1] for source in re.findall( + r'src\s*:\s*(["\'])(?P(?:https?://)?(?:(?!\1).)+)\1', + webpage) or []] + for source in sources: + source = urljoin(url, source) + height = int(self._search_regex(r'(\d+).mp4', source, 'height', default=360)) + if self._request_webpage(HEADRequest(source), video_id, f'Checking {height}p url', errnote=False): + formats.append({ + 'url': source, + 'format_id': f'{height}p', + 'height': height, + }) + + title = self._search_regex( + (r'

      ([^<]+)

      ', r'([^<]+) - VidLii<'), webpage, + 'title') + + description = self._html_search_meta( + ('description', 'twitter:description'), webpage, + default=None) or strip_or_none( + get_element_by_id('des_text', webpage)) + + thumbnail = self._html_search_meta( + 'twitter:image', webpage, default=None) + if not thumbnail: + thumbnail_path = self._search_regex( + r'img\s*:\s*(["\'])(?P<url>(?:(?!\1).)+)\1', webpage, + 'thumbnail', fatal=False, group='url') + if thumbnail_path: + thumbnail = urljoin(url, thumbnail_path) + + uploader = self._search_regex( + r'<div[^>]+class=["\']wt_person[^>]+>\s*<a[^>]+\bhref=["\']/user/[^>]+>([^<]+)', + webpage, 'uploader', fatal=False) + uploader_url = format_field(uploader, None, 'https://www.vidlii.com/user/%s') + + upload_date = unified_strdate(self._html_search_meta( + 'datePublished', webpage, default=None) or self._search_regex( + r'<date>([^<]+)', webpage, 'upload date', fatal=False)) + + duration = int_or_none(self._html_search_meta( + 'video:duration', webpage, 'duration', + default=None) or self._search_regex( + r'duration\s*:\s*(\d+)', webpage, 'duration', fatal=False)) + + view_count = str_to_int(self._search_regex( + (r'<strong>([,0-9]+)</strong> views', + r'Views\s*:\s*<strong>([,0-9]+)</strong>'), + webpage, 'view count', fatal=False)) + + comment_count = int_or_none(self._search_regex( + (r'<span[^>]+id=["\']cmt_num[^>]+>(\d+)', + r'Comments\s*:\s*<strong>(\d+)'), + webpage, 'comment count', fatal=False)) + + average_rating = float_or_none(self._search_regex( + r'rating\s*:\s*([\d.]+)', webpage, 'average rating', fatal=False)) + + category = self._html_search_regex( + r'<div>Category\s*:\s*</div>\s*<div>\s*<a[^>]+>([^<]+)', webpage, + 'category', fatal=False) + categories = [category] if category else None + + tags = [ + strip_or_none(tag) + for tag in re.findall( + r'<a[^>]+\bhref=["\']/results\?.*?q=[^>]*>([^<]+)', + webpage) if strip_or_none(tag) + ] or None + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'uploader': uploader, + 'formats': formats, + 'uploader_url': uploader_url, + 'upload_date': upload_date, + 'duration': duration, + 'view_count': view_count, + 'comment_count': comment_count, + 'average_rating': average_rating, + 'categories': categories, + 'tags': tags, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/viewlift.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viewlift.py new file mode 100644 index 0000000..8f686f0 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/viewlift.py @@ -0,0 +1,336 @@ +import json + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + parse_age_limit, + traverse_obj, +) + + +class ViewLiftBaseIE(InfoExtractor): + _API_BASE = 'https://prod-api.viewlift.com/' + _DOMAINS_REGEX = r'(?:(?:main\.)?snagfilms|snagxtreme|funnyforfree|kiddovid|winnersview|(?:monumental|lax)sportsnetwork|vayafilm|failarmy|ftfnext|lnppass\.legapallacanestro|moviespree|app\.myoutdoortv|neoufitness|pflmma|theidentitytb)\.com|(?:hoichoi|app\.horseandcountry|kronon|marquee|supercrosslive)\.tv' + _SITE_MAP = { + 'ftfnext': 'lax', + 'funnyforfree': 'snagfilms', + 'hoichoi': 'hoichoitv', + 'kiddovid': 'snagfilms', + 'laxsportsnetwork': 'lax', + 'legapallacanestro': 'lnp', + 'marquee': 'marquee-tv', + 'monumentalsportsnetwork': 'monumental-network', + 'moviespree': 'bingeflix', + 'pflmma': 'pfl', + 'snagxtreme': 'snagfilms', + 'theidentitytb': 'tampabay', + 'vayafilm': 'snagfilms', + } + _TOKENS = {} + + def _fetch_token(self, site, url): + if self._TOKENS.get(site): + return + + cookies = self._get_cookies(url) + if cookies and cookies.get('token'): + self._TOKENS[site] = self._search_regex(r'22authorizationToken\%22:\%22([^\%]+)\%22', cookies['token'].value, 'token') + if not self._TOKENS.get(site): + self.raise_login_required('Cookies (not necessarily logged in) are needed to download from this website', method='cookies') + + def _call_api(self, site, path, video_id, url, query): + self._fetch_token(site, url) + try: + return self._download_json( + self._API_BASE + path, video_id, headers={'Authorization': self._TOKENS.get(site)}, query=query) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + webpage = e.cause.response.read().decode() + try: + error_message = traverse_obj(json.loads(webpage), 'errorMessage', 'message') + except json.JSONDecodeError: + raise ExtractorError(f'{site} said: {webpage}', cause=e.cause) + if error_message: + if 'has not purchased' in error_message: + self.raise_login_required(method='cookies') + raise ExtractorError(error_message, expected=True) + raise + + +class ViewLiftEmbedIE(ViewLiftBaseIE): + IE_NAME = 'viewlift:embed' + _VALID_URL = r'https?://(?:(?:www|embed)\.)?(?P<domain>%s)/embed/player\?.*\bfilmId=(?P<id>[\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12})' % ViewLiftBaseIE._DOMAINS_REGEX + _EMBED_REGEX = [r'<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//(?:embed\.)?(?:%s)/embed/player.+?)\1' % ViewLiftBaseIE._DOMAINS_REGEX] + _TESTS = [{ + 'url': 'http://embed.snagfilms.com/embed/player?filmId=74849a00-85a9-11e1-9660-123139220831&w=500', + 'md5': '2924e9215c6eff7a55ed35b72276bd93', + 'info_dict': { + 'id': '74849a00-85a9-11e1-9660-123139220831', + 'ext': 'mp4', + 'title': '#whilewewatch', + 'description': 'md5:b542bef32a6f657dadd0df06e26fb0c8', + 'timestamp': 1334350096, + 'upload_date': '20120413', + } + }, { + # invalid labels, 360p is better that 480p + 'url': 'http://www.snagfilms.com/embed/player?filmId=17ca0950-a74a-11e0-a92a-0026bb61d036', + 'md5': '882fca19b9eb27ef865efeeaed376a48', + 'info_dict': { + 'id': '17ca0950-a74a-11e0-a92a-0026bb61d036', + 'ext': 'mp4', + 'title': 'Life in Limbo', + }, + 'skip': 'The video does not exist', + }, { + 'url': 'http://www.snagfilms.com/embed/player?filmId=0000014c-de2f-d5d6-abcf-ffef58af0017', + 'only_matching': True, + }] + + def _real_extract(self, url): + domain, film_id = self._match_valid_url(url).groups() + site = domain.split('.')[-2] + if site in self._SITE_MAP: + site = self._SITE_MAP[site] + + content_data = self._call_api( + site, 'entitlement/video/status', film_id, url, { + 'id': film_id + })['video'] + gist = content_data['gist'] + title = gist['title'] + video_assets = content_data['streamingInfo']['videoAssets'] + + hls_url = video_assets.get('hls') + formats, subtitles = [], {} + if hls_url: + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + hls_url, film_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=False) + + for video_asset in video_assets.get('mpeg') or []: + video_asset_url = video_asset.get('url') + if not video_asset_url: + continue + bitrate = int_or_none(video_asset.get('bitrate')) + height = int_or_none(self._search_regex( + r'^_?(\d+)[pP]$', video_asset.get('renditionValue'), + 'height', default=None)) + formats.append({ + 'url': video_asset_url, + 'format_id': 'http%s' % ('-%d' % bitrate if bitrate else ''), + 'tbr': bitrate, + 'height': height, + 'vcodec': video_asset.get('codec'), + }) + + subs = {} + for sub in traverse_obj(content_data, ('contentDetails', 'closedCaptions')) or []: + sub_url = sub.get('url') + if not sub_url: + continue + subs.setdefault(sub.get('language', 'English'), []).append({ + 'url': sub_url, + }) + + return { + 'id': film_id, + 'title': title, + 'description': gist.get('description'), + 'thumbnail': gist.get('videoImageUrl'), + 'duration': int_or_none(gist.get('runtime')), + 'age_limit': parse_age_limit(content_data.get('parentalRating')), + 'timestamp': int_or_none(gist.get('publishDate'), 1000), + 'formats': formats, + 'subtitles': self._merge_subtitles(subs, subtitles), + 'categories': traverse_obj(content_data, ('categories', ..., 'title')), + 'tags': traverse_obj(content_data, ('tags', ..., 'title')), + } + + +class ViewLiftIE(ViewLiftBaseIE): + IE_NAME = 'viewlift' + _API_BASE = 'https://prod-api-cached-2.viewlift.com/' + _VALID_URL = r'https?://(?:www\.)?(?P<domain>%s)(?P<path>(?:/(?:films/title|show|(?:news/)?videos?|watch))?/(?P<id>[^?#]+))' % ViewLiftBaseIE._DOMAINS_REGEX + _TESTS = [{ + 'url': 'http://www.snagfilms.com/films/title/lost_for_life', + 'md5': '19844f897b35af219773fd63bdec2942', + 'info_dict': { + 'id': '0000014c-de2f-d5d6-abcf-ffef58af0017', + 'display_id': 'lost_for_life', + 'ext': 'mp4', + 'title': 'Lost for Life', + 'description': 'md5:ea10b5a50405ae1f7b5269a6ec594102', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 4489, + 'categories': 'mincount:3', + 'age_limit': 14, + 'upload_date': '20150421', + 'timestamp': 1429656820, + } + }, { + 'url': 'http://www.snagfilms.com/show/the_world_cut_project/india', + 'md5': 'e6292e5b837642bbda82d7f8bf3fbdfd', + 'info_dict': { + 'id': '00000145-d75c-d96e-a9c7-ff5c67b20000', + 'display_id': 'the_world_cut_project/india', + 'ext': 'mp4', + 'title': 'India', + 'description': 'md5:5c168c5a8f4719c146aad2e0dfac6f5f', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 979, + 'timestamp': 1399478279, + 'upload_date': '20140507', + } + }, { + 'url': 'http://main.snagfilms.com/augie_alone/s_2_ep_12_love', + 'info_dict': { + 'id': '00000148-7b53-de26-a9fb-fbf306f70020', + 'display_id': 'augie_alone/s_2_ep_12_love', + 'ext': 'mp4', + 'title': 'S. 2 Ep. 12 - Love', + 'description': 'Augie finds love.', + 'thumbnail': r're:^https?://.*\.jpg', + 'duration': 107, + 'upload_date': '20141012', + 'timestamp': 1413129540, + 'age_limit': 17, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'http://main.snagfilms.com/films/title/the_freebie', + 'only_matching': True, + }, { + # Film is not playable in your area. + 'url': 'http://www.snagfilms.com/films/title/inside_mecca', + 'only_matching': True, + }, { + # Film is not available. + 'url': 'http://www.snagfilms.com/show/augie_alone/flirting', + 'only_matching': True, + }, { + 'url': 'http://www.winnersview.com/videos/the-good-son', + 'only_matching': True, + }, { + # Was once Kaltura embed + 'url': 'https://www.monumentalsportsnetwork.com/videos/john-carlson-postgame-2-25-15', + 'only_matching': True, + }, { + 'url': 'https://www.marquee.tv/watch/sadlerswells-sacredmonsters', + 'only_matching': True, + }, { # Free film with langauge code + 'url': 'https://www.hoichoi.tv/bn/films/title/shuyopoka', + 'info_dict': { + 'id': '7a7a9d33-1f4c-4771-9173-ee4fb6dbf196', + 'ext': 'mp4', + 'title': 'Shuyopoka', + 'description': 'md5:e28f2fb8680096a69c944d37c1fa5ffc', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20211006', + 'series': None + }, + 'params': {'skip_download': True}, + }, { # Free film + 'url': 'https://www.hoichoi.tv/films/title/dadu-no1', + 'info_dict': { + 'id': '0000015b-b009-d126-a1db-b81ff3780000', + 'ext': 'mp4', + 'title': 'Dadu No.1', + 'description': 'md5:605cba408e51a79dafcb824bdeded51e', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20210827', + 'series': None + }, + 'params': {'skip_download': True}, + }, { # Free episode + 'url': 'https://www.hoichoi.tv/webseries/case-jaundice-s01-e01', + 'info_dict': { + 'id': 'f779e07c-30c8-459c-8612-5a834ab5e5ba', + 'ext': 'mp4', + 'title': 'Humans Vs. Corona', + 'description': 'md5:ca30a682b4528d02a3eb6d0427dd0f87', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20210830', + 'series': 'Case Jaundice' + }, + 'params': {'skip_download': True}, + }, { # Free video + 'url': 'https://www.hoichoi.tv/videos/1549072415320-six-episode-02-hindi', + 'info_dict': { + 'id': 'b41fa1ce-aca6-47b6-b208-283ff0a2de30', + 'ext': 'mp4', + 'title': 'Woman in red - Hindi', + 'description': 'md5:9d21edc1827d32f8633eb67c2054fc31', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20211006', + 'series': 'Six (Hindi)' + }, + 'params': {'skip_download': True}, + }, { # Free episode + 'url': 'https://www.hoichoi.tv/shows/watch-asian-paints-moner-thikana-online-season-1-episode-1', + 'info_dict': { + 'id': '1f45d185-8500-455c-b88d-13252307c3eb', + 'ext': 'mp4', + 'title': 'Jisshu Sengupta', + 'description': 'md5:ef6ffae01a3d83438597367400f824ed', + 'thumbnail': r're:^https?://.*\.jpg$', + 'upload_date': '20211004', + 'series': 'Asian Paints Moner Thikana' + }, + 'params': {'skip_download': True}, + }, { # Free series + 'url': 'https://www.hoichoi.tv/shows/watch-moner-thikana-bengali-web-series-online', + 'playlist_mincount': 5, + 'info_dict': { + 'id': 'watch-moner-thikana-bengali-web-series-online', + }, + }, { # Premium series + 'url': 'https://www.hoichoi.tv/shows/watch-byomkesh-bengali-web-series-online', + 'playlist_mincount': 14, + 'info_dict': { + 'id': 'watch-byomkesh-bengali-web-series-online', + }, + }, { # Premium movie + 'url': 'https://www.hoichoi.tv/movies/detective-2020', + 'only_matching': True + }] + + @classmethod + def suitable(cls, url): + return False if ViewLiftEmbedIE.suitable(url) else super(ViewLiftIE, cls).suitable(url) + + def _show_entries(self, domain, seasons): + for season in seasons: + for episode in season.get('episodes') or []: + path = traverse_obj(episode, ('gist', 'permalink')) + if path: + yield self.url_result(f'https://www.{domain}{path}', ie=self.ie_key()) + + def _real_extract(self, url): + domain, path, display_id = self._match_valid_url(url).groups() + site = domain.split('.')[-2] + if site in self._SITE_MAP: + site = self._SITE_MAP[site] + modules = self._call_api( + site, 'content/pages', display_id, url, { + 'includeContent': 'true', + 'moduleOffset': 1, + 'path': path, + 'site': site, + })['modules'] + + seasons = next((m['contentData'][0]['seasons'] for m in modules if m.get('moduleType') == 'ShowDetailModule'), None) + if seasons: + return self.playlist_result(self._show_entries(domain, seasons), display_id) + + film_id = next(m['contentData'][0]['gist']['id'] for m in modules if m.get('moduleType') == 'VideoDetailModule') + return { + '_type': 'url_transparent', + 'url': 'http://%s/embed/player?filmId=%s' % (domain, film_id), + 'id': film_id, + 'display_id': display_id, + 'ie_key': 'ViewLiftEmbed', + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/viidea.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viidea.py new file mode 100644 index 0000000..649ffe3 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/viidea.py @@ -0,0 +1,199 @@ +import re + +from .common import InfoExtractor +from ..compat import ( + compat_str, + compat_urlparse, +) +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + js_to_json, + parse_duration, + parse_iso8601, +) + + +class ViideaIE(InfoExtractor): + _VALID_URL = r'''(?x)https?://(?:www\.)?(?: + videolectures\.net| + flexilearn\.viidea\.net| + presentations\.ocwconsortium\.org| + video\.travel-zoom\.si| + video\.pomp-forum\.si| + tv\.nil\.si| + video\.hekovnik.com| + video\.szko\.si| + kpk\.viidea\.com| + inside\.viidea\.net| + video\.kiberpipa\.org| + bvvideo\.si| + kongres\.viidea\.net| + edemokracija\.viidea\.com + )(?:/lecture)?/(?P<id>[^/]+)(?:/video/(?P<part>\d+))?/*(?:[#?].*)?$''' + + _TESTS = [{ + 'url': 'http://videolectures.net/promogram_igor_mekjavic_eng/', + 'info_dict': { + 'id': '20171', + 'display_id': 'promogram_igor_mekjavic_eng', + 'ext': 'mp4', + 'title': 'Automatics, robotics and biocybernetics', + 'description': 'md5:815fc1deb6b3a2bff99de2d5325be482', + 'thumbnail': r're:http://.*\.jpg', + 'timestamp': 1372349289, + 'upload_date': '20130627', + 'duration': 565, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + # video with invalid direct format links (HTTP 403) + 'url': 'http://videolectures.net/russir2010_filippova_nlp/', + 'info_dict': { + 'id': '14891', + 'display_id': 'russir2010_filippova_nlp', + 'ext': 'flv', + 'title': 'NLP at Google', + 'description': 'md5:fc7a6d9bf0302d7cc0e53f7ca23747b3', + 'thumbnail': r're:http://.*\.jpg', + 'timestamp': 1284375600, + 'upload_date': '20100913', + 'duration': 5352, + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, { + # event playlist + 'url': 'http://videolectures.net/deeplearning2015_montreal/', + 'info_dict': { + 'id': '23181', + 'title': 'Deep Learning Summer School, Montreal 2015', + 'description': 'md5:0533a85e4bd918df52a01f0e1ebe87b7', + 'thumbnail': r're:http://.*\.jpg', + 'timestamp': 1438560000, + }, + 'playlist_count': 30, + }, { + # multi part lecture + 'url': 'http://videolectures.net/mlss09uk_bishop_ibi/', + 'info_dict': { + 'id': '9737', + 'display_id': 'mlss09uk_bishop_ibi', + 'title': 'Introduction To Bayesian Inference', + 'thumbnail': r're:http://.*\.jpg', + 'timestamp': 1251622800, + }, + 'playlist': [{ + 'info_dict': { + 'id': '9737_part1', + 'display_id': 'mlss09uk_bishop_ibi_part1', + 'ext': 'wmv', + 'title': 'Introduction To Bayesian Inference (Part 1)', + 'thumbnail': r're:http://.*\.jpg', + 'duration': 4622, + 'timestamp': 1251622800, + 'upload_date': '20090830', + }, + }, { + 'info_dict': { + 'id': '9737_part2', + 'display_id': 'mlss09uk_bishop_ibi_part2', + 'ext': 'wmv', + 'title': 'Introduction To Bayesian Inference (Part 2)', + 'thumbnail': r're:http://.*\.jpg', + 'duration': 5641, + 'timestamp': 1251622800, + 'upload_date': '20090830', + }, + }], + 'playlist_count': 2, + }] + + def _real_extract(self, url): + lecture_slug, explicit_part_id = self._match_valid_url(url).groups() + + webpage = self._download_webpage(url, lecture_slug) + + cfg = self._parse_json(self._search_regex( + [r'cfg\s*:\s*({.+?})\s*,\s*[\da-zA-Z_]+\s*:\s*\(?\s*function', + r'cfg\s*:\s*({[^}]+})'], + webpage, 'cfg'), lecture_slug, js_to_json) + + lecture_id = compat_str(cfg['obj_id']) + + base_url = self._proto_relative_url(cfg['livepipe'], 'http:') + + try: + lecture_data = self._download_json( + '%s/site/api/lecture/%s?format=json' % (base_url, lecture_id), + lecture_id)['lecture'][0] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 403: + msg = self._parse_json( + e.cause.response.read().decode('utf-8'), lecture_id) + raise ExtractorError(msg['detail'], expected=True) + raise + + lecture_info = { + 'id': lecture_id, + 'display_id': lecture_slug, + 'title': lecture_data['title'], + 'timestamp': parse_iso8601(lecture_data.get('time')), + 'description': lecture_data.get('description_wiki'), + 'thumbnail': lecture_data.get('thumb'), + } + + playlist_entries = [] + lecture_type = lecture_data.get('type') + parts = [compat_str(video) for video in cfg.get('videos', [])] + if parts: + multipart = len(parts) > 1 + + def extract_part(part_id): + smil_url = '%s/%s/video/%s/smil.xml' % (base_url, lecture_slug, part_id) + smil = self._download_smil(smil_url, lecture_id) + info = self._parse_smil(smil, smil_url, lecture_id) + info['id'] = lecture_id if not multipart else '%s_part%s' % (lecture_id, part_id) + info['display_id'] = lecture_slug if not multipart else '%s_part%s' % (lecture_slug, part_id) + if multipart: + info['title'] += ' (Part %s)' % part_id + switch = smil.find('.//switch') + if switch is not None: + info['duration'] = parse_duration(switch.attrib.get('dur')) + item_info = lecture_info.copy() + item_info.update(info) + return item_info + + if explicit_part_id or not multipart: + result = extract_part(explicit_part_id or parts[0]) + else: + result = { + '_type': 'multi_video', + 'entries': [extract_part(part) for part in parts], + } + result.update(lecture_info) + + # Immediately return explicitly requested part or non event item + if explicit_part_id or lecture_type != 'evt': + return result + + playlist_entries.append(result) + + # It's probably a playlist + if not parts or lecture_type == 'evt': + playlist_webpage = self._download_webpage( + '%s/site/ajax/drilldown/?id=%s' % (base_url, lecture_id), lecture_id) + entries = [ + self.url_result(compat_urlparse.urljoin(url, video_url), 'Viidea') + for _, video_url in re.findall( + r'<a[^>]+href=(["\'])(.+?)\1[^>]+id=["\']lec=\d+', playlist_webpage)] + playlist_entries.extend(entries) + + playlist = self.playlist_result(playlist_entries, lecture_id) + playlist.update(lecture_info) + return playlist diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/viki.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viki.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/viki.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/viki.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vimeo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vimeo.py new file mode 100644 index 0000000..e72fa50 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vimeo.py @@ -0,0 +1,1447 @@ +import base64 +import functools +import re +import itertools + +from .common import InfoExtractor +from ..compat import compat_str, compat_urlparse +from ..networking import HEADRequest, Request +from ..networking.exceptions import HTTPError +from ..utils import ( + clean_html, + determine_ext, + ExtractorError, + get_element_by_class, + js_to_json, + int_or_none, + merge_dicts, + OnDemandPagedList, + parse_filesize, + parse_iso8601, + parse_qs, + smuggle_url, + str_or_none, + try_get, + unified_timestamp, + unsmuggle_url, + urlencode_postdata, + urljoin, + urlhandle_detect_ext, +) + + +class VimeoBaseInfoExtractor(InfoExtractor): + _NETRC_MACHINE = 'vimeo' + _LOGIN_REQUIRED = False + _LOGIN_URL = 'https://vimeo.com/log_in' + + @staticmethod + def _smuggle_referrer(url, referrer_url): + return smuggle_url(url, {'http_headers': {'Referer': referrer_url}}) + + def _unsmuggle_headers(self, url): + """@returns (url, smuggled_data, headers)""" + url, data = unsmuggle_url(url, {}) + headers = self.get_param('http_headers').copy() + if 'http_headers' in data: + headers.update(data['http_headers']) + return url, data, headers + + def _perform_login(self, username, password): + webpage = self._download_webpage( + self._LOGIN_URL, None, 'Downloading login page') + token, vuid = self._extract_xsrft_and_vuid(webpage) + data = { + 'action': 'login', + 'email': username, + 'password': password, + 'service': 'vimeo', + 'token': token, + } + self._set_vimeo_cookie('vuid', vuid) + try: + self._download_webpage( + self._LOGIN_URL, None, 'Logging in', + data=urlencode_postdata(data), headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Referer': self._LOGIN_URL, + }) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 418: + raise ExtractorError( + 'Unable to log in: bad username or password', + expected=True) + raise ExtractorError('Unable to log in') + + def _real_initialize(self): + if self._LOGIN_REQUIRED and not self._get_cookies('https://vimeo.com').get('vuid'): + self._raise_login_required() + + def _get_video_password(self): + password = self.get_param('videopassword') + if password is None: + raise ExtractorError( + 'This video is protected by a password, use the --video-password option', + expected=True) + return password + + def _verify_video_password(self, url, video_id, password, token, vuid): + if url.startswith('http://'): + # vimeo only supports https now, but the user can give an http url + url = url.replace('http://', 'https://') + self._set_vimeo_cookie('vuid', vuid) + return self._download_webpage( + url + '/password', video_id, 'Verifying the password', + 'Wrong password', data=urlencode_postdata({ + 'password': password, + 'token': token, + }), headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Referer': url, + }) + + def _extract_xsrft_and_vuid(self, webpage): + xsrft = self._search_regex( + r'(?:(?P<q1>["\'])xsrft(?P=q1)\s*:|xsrft\s*[=:])\s*(?P<q>["\'])(?P<xsrft>.+?)(?P=q)', + webpage, 'login token', group='xsrft') + vuid = self._search_regex( + r'["\']vuid["\']\s*:\s*(["\'])(?P<vuid>.+?)\1', + webpage, 'vuid', group='vuid') + return xsrft, vuid + + def _extract_vimeo_config(self, webpage, video_id, *args, **kwargs): + vimeo_config = self._search_regex( + r'vimeo\.config\s*=\s*(?:({.+?})|_extend\([^,]+,\s+({.+?})\));', + webpage, 'vimeo config', *args, **kwargs) + if vimeo_config: + return self._parse_json(vimeo_config, video_id) + + def _set_vimeo_cookie(self, name, value): + self._set_cookie('vimeo.com', name, value) + + def _parse_config(self, config, video_id): + video_data = config['video'] + video_title = video_data.get('title') + live_event = video_data.get('live_event') or {} + is_live = live_event.get('status') == 'started' + request = config.get('request') or {} + + formats = [] + subtitles = {} + + config_files = video_data.get('files') or request.get('files') or {} + for f in (config_files.get('progressive') or []): + video_url = f.get('url') + if not video_url: + continue + formats.append({ + 'url': video_url, + 'format_id': 'http-%s' % f.get('quality'), + 'source_preference': 10, + 'width': int_or_none(f.get('width')), + 'height': int_or_none(f.get('height')), + 'fps': int_or_none(f.get('fps')), + 'tbr': int_or_none(f.get('bitrate')), + }) + + # TODO: fix handling of 308 status code returned for live archive manifest requests + sep_pattern = r'/sep/video/' + for files_type in ('hls', 'dash'): + for cdn_name, cdn_data in (try_get(config_files, lambda x: x[files_type]['cdns']) or {}).items(): + manifest_url = cdn_data.get('url') + if not manifest_url: + continue + format_id = '%s-%s' % (files_type, cdn_name) + sep_manifest_urls = [] + if re.search(sep_pattern, manifest_url): + for suffix, repl in (('', 'video'), ('_sep', 'sep/video')): + sep_manifest_urls.append((format_id + suffix, re.sub( + sep_pattern, '/%s/' % repl, manifest_url))) + else: + sep_manifest_urls = [(format_id, manifest_url)] + for f_id, m_url in sep_manifest_urls: + if files_type == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + m_url, video_id, 'mp4', live=is_live, m3u8_id=f_id, + note='Downloading %s m3u8 information' % cdn_name, + fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif files_type == 'dash': + if 'json=1' in m_url: + real_m_url = (self._download_json(m_url, video_id, fatal=False) or {}).get('url') + if real_m_url: + m_url = real_m_url + fmts, subs = self._extract_mpd_formats_and_subtitles( + m_url.replace('/master.json', '/master.mpd'), video_id, f_id, + 'Downloading %s MPD information' % cdn_name, + fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + live_archive = live_event.get('archive') or {} + live_archive_source_url = live_archive.get('source_url') + if live_archive_source_url and live_archive.get('status') == 'done': + formats.append({ + 'format_id': 'live-archive-source', + 'url': live_archive_source_url, + 'quality': 10, + }) + + for tt in (request.get('text_tracks') or []): + subtitles.setdefault(tt['lang'], []).append({ + 'ext': 'vtt', + 'url': urljoin('https://vimeo.com', tt['url']), + }) + + thumbnails = [] + if not is_live: + for key, thumb in (video_data.get('thumbs') or {}).items(): + thumbnails.append({ + 'id': key, + 'width': int_or_none(key), + 'url': thumb, + }) + thumbnail = video_data.get('thumbnail') + if thumbnail: + thumbnails.append({ + 'url': thumbnail, + }) + + owner = video_data.get('owner') or {} + video_uploader_url = owner.get('url') + + duration = int_or_none(video_data.get('duration')) + chapter_data = try_get(config, lambda x: x['embed']['chapters']) or [] + chapters = [{ + 'title': current_chapter.get('title'), + 'start_time': current_chapter.get('timecode'), + 'end_time': next_chapter.get('timecode'), + } for current_chapter, next_chapter in zip(chapter_data, chapter_data[1:] + [{'timecode': duration}])] + if chapters and chapters[0]['start_time']: # Chapters may not start from 0 + chapters[:0] = [{'title': '<Untitled>', 'start_time': 0, 'end_time': chapters[0]['start_time']}] + + return { + 'id': str_or_none(video_data.get('id')) or video_id, + 'title': video_title, + 'uploader': owner.get('name'), + 'uploader_id': video_uploader_url.split('/')[-1] if video_uploader_url else None, + 'uploader_url': video_uploader_url, + 'thumbnails': thumbnails, + 'duration': duration, + 'chapters': chapters or None, + 'formats': formats, + 'subtitles': subtitles, + 'is_live': is_live, + # Note: Bitrates are completely broken. Single m3u8 may contain entries in kbps and bps + # at the same time without actual units specified. + '_format_sort_fields': ('quality', 'res', 'fps', 'hdr:12', 'source'), + } + + def _extract_original_format(self, url, video_id, unlisted_hash=None): + query = {'action': 'load_download_config'} + if unlisted_hash: + query['unlisted_hash'] = unlisted_hash + download_data = self._download_json( + url, video_id, fatal=False, query=query, + headers={'X-Requested-With': 'XMLHttpRequest'}, + expected_status=(403, 404)) or {} + source_file = download_data.get('source_file') + download_url = try_get(source_file, lambda x: x['download_url']) + if download_url and not source_file.get('is_cold') and not source_file.get('is_defrosting'): + source_name = source_file.get('public_name', 'Original') + if self._is_valid_url(download_url, video_id, '%s video' % source_name): + ext = (try_get( + source_file, lambda x: x['extension'], + compat_str) or determine_ext( + download_url, None) or 'mp4').lower() + return { + 'url': download_url, + 'ext': ext, + 'width': int_or_none(source_file.get('width')), + 'height': int_or_none(source_file.get('height')), + 'filesize': parse_filesize(source_file.get('size')), + 'format_id': source_name, + 'quality': 1, + } + + jwt_response = self._download_json( + 'https://vimeo.com/_rv/viewer', video_id, note='Downloading jwt token', fatal=False) or {} + if not jwt_response.get('jwt'): + return + headers = {'Authorization': 'jwt %s' % jwt_response['jwt']} + original_response = self._download_json( + f'https://api.vimeo.com/videos/{video_id}', video_id, + headers=headers, fatal=False, expected_status=(403, 404)) or {} + for download_data in original_response.get('download') or []: + download_url = download_data.get('link') + if not download_url or download_data.get('quality') != 'source': + continue + ext = determine_ext(parse_qs(download_url).get('filename', [''])[0].lower(), default_ext=None) + if not ext: + urlh = self._request_webpage( + HEADRequest(download_url), video_id, fatal=False, note='Determining source extension') + ext = urlh and urlhandle_detect_ext(urlh) + return { + 'url': download_url, + 'ext': ext or 'unknown_video', + 'format_id': download_data.get('public_name', 'Original'), + 'width': int_or_none(download_data.get('width')), + 'height': int_or_none(download_data.get('height')), + 'fps': int_or_none(download_data.get('fps')), + 'filesize': int_or_none(download_data.get('size')), + 'quality': 1, + } + + +class VimeoIE(VimeoBaseInfoExtractor): + """Information extractor for vimeo.com.""" + + # _VALID_URL matches Vimeo URLs + _VALID_URL = r'''(?x) + https?:// + (?: + (?: + www| + player + ) + \. + )? + vimeo\.com/ + (?: + (?P<u>user)| + (?!(?:channels|album|showcase)/[^/?#]+/?(?:$|[?#])|[^/]+/review/|ondemand/) + (?:.*?/)?? + (?P<q> + (?: + play_redirect_hls| + moogaloop\.swf)\?clip_id= + )? + (?:videos?/)? + ) + (?P<id>[0-9]+) + (?(u) + /(?!videos|likes)[^/?#]+/?| + (?(q)|/(?P<unlisted_hash>[\da-f]{10}))? + ) + (?:(?(q)[&]|(?(u)|/?)[?]).*?)?(?:[#].*)?$ + ''' + IE_NAME = 'vimeo' + _EMBED_REGEX = [ + # iframe + r'<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//player\.vimeo\.com/video/\d+.*?)\1', + # Embedded (swf embed) Vimeo player + r'<embed[^>]+?src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?vimeo\.com/moogaloop\.swf.+?)\1', + # Non-standard embedded Vimeo player + r'<video[^>]+src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?vimeo\.com/[0-9]+)\1', + ] + _TESTS = [ + { + 'url': 'http://vimeo.com/56015672#at=0', + 'md5': '8879b6cc097e987f02484baf890129e5', + 'info_dict': { + 'id': '56015672', + 'ext': 'mp4', + 'title': "youtube-dl test video '' ä↭ð•-BaW jenozKc", + 'description': 'md5:2d3305bad981a06ff79f027f19865021', + 'timestamp': 1355990239, + 'upload_date': '20121220', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/user7108434', + 'uploader_id': 'user7108434', + 'uploader': 'Filippo Valsorda', + 'duration': 10, + 'license': 'by-sa', + }, + 'params': { + 'format': 'best[protocol=https]', + }, + 'skip': 'No longer available' + }, + { + 'url': 'http://player.vimeo.com/video/54469442', + 'md5': '619b811a4417aa4abe78dc653becf511', + 'note': 'Videos that embed the url in the player page', + 'info_dict': { + 'id': '54469442', + 'ext': 'mp4', + 'title': 'Kathy Sierra: Building the minimum Badass User, Business of Software 2012', + 'uploader': 'Business of Software', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/businessofsoftware', + 'uploader_id': 'businessofsoftware', + 'duration': 3610, + 'description': None, + 'thumbnail': 'https://i.vimeocdn.com/video/376682406-f34043e7b766af6bef2af81366eacd6724f3fc3173179a11a97a1e26587c9529-d_1280', + }, + 'params': { + 'format': 'best[protocol=https]', + }, + }, + { + 'url': 'http://vimeo.com/68375962', + 'md5': 'aaf896bdb7ddd6476df50007a0ac0ae7', + 'note': 'Video protected with password', + 'info_dict': { + 'id': '68375962', + 'ext': 'mp4', + 'title': 'youtube-dl password protected test video', + 'timestamp': 1371200155, + 'upload_date': '20130614', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/user18948128', + 'uploader_id': 'user18948128', + 'uploader': 'Jaime Marquínez Ferrándiz', + 'duration': 10, + 'description': 'md5:6173f270cd0c0119f22817204b3eb86c', + 'thumbnail': 'https://i.vimeocdn.com/video/440665496-b2c5aee2b61089442c794f64113a8e8f7d5763c3e6b3ebfaf696ae6413f8b1f4-d_1280', + 'view_count': int, + 'comment_count': int, + 'like_count': int, + }, + 'params': { + 'format': 'best[protocol=https]', + 'videopassword': 'youtube-dl', + }, + }, + { + 'url': 'http://vimeo.com/channels/keypeele/75629013', + 'md5': '2f86a05afe9d7abc0b9126d229bbe15d', + 'info_dict': { + 'id': '75629013', + 'ext': 'mp4', + 'title': 'Key & Peele: Terrorist Interrogation', + 'description': 'md5:6173f270cd0c0119f22817204b3eb86c', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/atencio', + 'uploader_id': 'atencio', + 'uploader': 'Peter Atencio', + 'channel_id': 'keypeele', + 'channel_url': r're:https?://(?:www\.)?vimeo\.com/channels/keypeele', + 'timestamp': 1380339469, + 'upload_date': '20130928', + 'duration': 187, + 'thumbnail': 'https://i.vimeocdn.com/video/450239872-a05512d9b1e55d707a7c04365c10980f327b06d966351bc403a5d5d65c95e572-d_1280', + 'view_count': int, + 'comment_count': int, + 'like_count': int, + }, + 'params': {'format': 'http-1080p'}, + }, + { + 'url': 'http://vimeo.com/76979871', + 'note': 'Video with subtitles', + 'info_dict': { + 'id': '76979871', + 'ext': 'mov', + 'title': 'The New Vimeo Player (You Know, For Videos)', + 'description': 'md5:2ec900bf97c3f389378a96aee11260ea', + 'timestamp': 1381846109, + 'upload_date': '20131015', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/staff', + 'uploader_id': 'staff', + 'uploader': 'Vimeo Staff', + 'duration': 62, + 'subtitles': { + 'de': [{'ext': 'vtt'}], + 'en': [{'ext': 'vtt'}], + 'es': [{'ext': 'vtt'}], + 'fr': [{'ext': 'vtt'}], + }, + }, + 'expected_warnings': ['Ignoring subtitle tracks found in the HLS manifest'], + }, + { + # from https://www.ouya.tv/game/Pier-Solar-and-the-Great-Architects/ + 'url': 'https://player.vimeo.com/video/98044508', + 'note': 'The js code contains assignments to the same variable as the config', + 'info_dict': { + 'id': '98044508', + 'ext': 'mp4', + 'title': 'Pier Solar OUYA Official Trailer', + 'uploader': 'Tulio Gonçalves', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/user28849593', + 'uploader_id': 'user28849593', + 'duration': 118, + 'thumbnail': 'https://i.vimeocdn.com/video/478636036-c18440305ef3df9decfb6bf207a61fe39d2d17fa462a96f6f2d93d30492b037d-d_1280', + }, + }, + { + # contains original format + 'url': 'https://vimeo.com/33951933', + 'md5': '53c688fa95a55bf4b7293d37a89c5c53', + 'info_dict': { + 'id': '33951933', + 'ext': 'mp4', + 'title': 'FOX CLASSICS - Forever Classic ID - A Full Minute', + 'uploader': 'The DMCI', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/dmci', + 'uploader_id': 'dmci', + 'timestamp': 1324343742, + 'upload_date': '20111220', + 'description': 'md5:ae23671e82d05415868f7ad1aec21147', + 'duration': 60, + 'comment_count': int, + 'view_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/231174622-dd07f015e9221ff529d451e1cc31c982b5d87bfafa48c4189b1da72824ee289a-d_1280', + 'like_count': int, + }, + }, + { + 'note': 'Contains original format not accessible in webpage', + 'url': 'https://vimeo.com/393756517', + 'md5': 'c464af248b592190a5ffbb5d33f382b0', + 'info_dict': { + 'id': '393756517', + 'ext': 'mov', + 'timestamp': 1582642091, + 'uploader_id': 'frameworkla', + 'title': 'Straight To Hell - Sabrina: Netflix', + 'uploader': 'Framework Studio', + 'description': 'md5:f2edc61af3ea7a5592681ddbb683db73', + 'upload_date': '20200225', + 'duration': 176, + 'thumbnail': 'https://i.vimeocdn.com/video/859377297-836494a4ef775e9d4edbace83937d9ad34dc846c688c0c419c0e87f7ab06c4b3-d_1280', + 'uploader_url': 'https://vimeo.com/frameworkla', + }, + }, + { + # only available via https://vimeo.com/channels/tributes/6213729 and + # not via https://vimeo.com/6213729 + 'url': 'https://vimeo.com/channels/tributes/6213729', + 'info_dict': { + 'id': '6213729', + 'ext': 'mp4', + 'title': 'Vimeo Tribute: The Shining', + 'uploader': 'Casey Donahue', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/caseydonahue', + 'uploader_id': 'caseydonahue', + 'channel_url': r're:https?://(?:www\.)?vimeo\.com/channels/tributes', + 'channel_id': 'tributes', + 'timestamp': 1250886430, + 'upload_date': '20090821', + 'description': 'md5:bdbf314014e58713e6e5b66eb252f4a6', + 'duration': 321, + 'comment_count': int, + 'view_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/22728298-bfc22146f930de7cf497821c7b0b9f168099201ecca39b00b6bd31fcedfca7a6-d_1280', + 'like_count': int, + }, + 'params': { + 'skip_download': True, + }, + }, + { + # redirects to ondemand extractor and should be passed through it + # for successful extraction + 'url': 'https://vimeo.com/73445910', + 'info_dict': { + 'id': '73445910', + 'ext': 'mp4', + 'title': 'The Reluctant Revolutionary', + 'uploader': '10Ft Films', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/tenfootfilms', + 'uploader_id': 'tenfootfilms', + 'description': 'md5:0fa704e05b04f91f40b7f3ca2e801384', + 'upload_date': '20130830', + 'timestamp': 1377853339, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'this page is no longer available.', + }, + { + 'url': 'http://player.vimeo.com/video/68375962', + 'md5': 'aaf896bdb7ddd6476df50007a0ac0ae7', + 'info_dict': { + 'id': '68375962', + 'ext': 'mp4', + 'title': 'youtube-dl password protected test video', + 'timestamp': 1371200155, + 'upload_date': '20130614', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/user18948128', + 'uploader_id': 'user18948128', + 'uploader': 'Jaime Marquínez Ferrándiz', + 'duration': 10, + 'description': 'md5:6173f270cd0c0119f22817204b3eb86c', + 'thumbnail': 'https://i.vimeocdn.com/video/440665496-b2c5aee2b61089442c794f64113a8e8f7d5763c3e6b3ebfaf696ae6413f8b1f4-d_1280', + 'view_count': int, + 'comment_count': int, + 'like_count': int, + }, + 'params': { + 'format': 'best[protocol=https]', + 'videopassword': 'youtube-dl', + }, + }, + { + 'url': 'http://vimeo.com/moogaloop.swf?clip_id=2539741', + 'only_matching': True, + }, + { + 'url': 'https://vimeo.com/109815029', + 'note': 'Video not completely processed, "failed" seed status', + 'only_matching': True, + }, + { + 'url': 'https://vimeo.com/groups/travelhd/videos/22439234', + 'only_matching': True, + }, + { + 'url': 'https://vimeo.com/album/2632481/video/79010983', + 'only_matching': True, + }, + { + 'url': 'https://vimeo.com/showcase/3253534/video/119195465', + 'note': 'A video in a password protected album (showcase)', + 'info_dict': { + 'id': '119195465', + 'ext': 'mp4', + 'title': "youtube-dl test video '' ä↭ð•-BaW jenozKc", + 'uploader': 'Philipp Hagemeister', + 'uploader_id': 'user20132939', + 'description': 'md5:fa7b6c6d8db0bdc353893df2f111855b', + 'upload_date': '20150209', + 'timestamp': 1423518307, + 'thumbnail': 'https://i.vimeocdn.com/video/default_1280', + 'duration': 10, + 'like_count': int, + 'uploader_url': 'https://vimeo.com/user20132939', + 'view_count': int, + 'comment_count': int, + }, + 'params': { + 'format': 'best[protocol=https]', + 'videopassword': 'youtube-dl', + }, + }, + { + # source file returns 403: Forbidden + 'url': 'https://vimeo.com/7809605', + 'only_matching': True, + }, + { + 'note': 'Direct URL with hash', + 'url': 'https://vimeo.com/160743502/abd0e13fb4', + 'info_dict': { + 'id': '160743502', + 'ext': 'mp4', + 'uploader': 'Julian Tryba', + 'uploader_id': 'aliniamedia', + 'title': 'Harrisville New Hampshire', + 'timestamp': 1459259666, + 'upload_date': '20160329', + 'release_timestamp': 1459259666, + 'license': 'by-nc', + 'duration': 159, + 'comment_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/562802436-585eeb13b5020c6ac0f171a2234067938098f84737787df05ff0d767f6d54ee9-d_1280', + 'like_count': int, + 'uploader_url': 'https://vimeo.com/aliniamedia', + 'release_date': '20160329', + }, + 'params': {'skip_download': True}, + }, + { + 'url': 'https://vimeo.com/138909882', + 'info_dict': { + 'id': '138909882', + 'ext': 'mp4', + 'title': 'Eastnor Castle 2015 Firework Champions - The Promo!', + 'description': 'md5:5967e090768a831488f6e74b7821b3c1', + 'uploader_id': 'fireworkchampions', + 'uploader': 'Firework Champions', + 'upload_date': '20150910', + 'timestamp': 1441901895, + }, + 'params': { + 'skip_download': True, + 'format': 'Original', + }, + }, + { + 'url': 'https://vimeo.com/channels/staffpicks/143603739', + 'info_dict': { + 'id': '143603739', + 'ext': 'mp4', + 'uploader': 'Karim Huu Do', + 'timestamp': 1445846953, + 'upload_date': '20151026', + 'title': 'The Shoes - Submarine Feat. Blaine Harrison', + 'uploader_id': 'karimhd', + 'description': 'md5:8e2eea76de4504c2e8020a9bcfa1e843', + 'channel_id': 'staffpicks', + 'duration': 336, + 'comment_count': int, + 'view_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/541243181-b593db36a16db2f0096f655da3f5a4dc46b8766d77b0f440df937ecb0c418347-d_1280', + 'like_count': int, + 'uploader_url': 'https://vimeo.com/karimhd', + 'channel_url': 'https://vimeo.com/channels/staffpicks', + }, + 'params': {'skip_download': 'm3u8'}, + }, + { + # requires passing unlisted_hash(a52724358e) to load_download_config request + 'url': 'https://vimeo.com/392479337/a52724358e', + 'only_matching': True, + }, + { + # similar, but all numeric: ID must be 581039021, not 9603038895 + # issue #29690 + 'url': 'https://vimeo.com/581039021/9603038895', + 'info_dict': { + 'id': '581039021', + 'ext': 'mp4', + 'timestamp': 1627621014, + 'release_timestamp': 1627621014, + 'duration': 976, + 'comment_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/1202249320-4ddb2c30398c0dc0ee059172d1bd5ea481ad12f0e0e3ad01d2266f56c744b015-d_1280', + 'like_count': int, + 'uploader_url': 'https://vimeo.com/txwestcapital', + 'release_date': '20210730', + 'uploader': 'Christopher Inks', + 'title': 'Thursday, July 29, 2021 BMA Evening Video Update', + 'uploader_id': 'txwestcapital', + 'upload_date': '20210730', + }, + 'params': { + 'skip_download': True, + }, + }, + { + # user playlist alias -> https://vimeo.com/258705797 + 'url': 'https://vimeo.com/user26785108/newspiritualguide', + 'only_matching': True, + }, + # https://gettingthingsdone.com/workflowmap/ + # vimeo embed with check-password page protected by Referer header + ] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + for embed_url in super()._extract_embed_urls(url, webpage): + yield cls._smuggle_referrer(embed_url, url) + + @classmethod + def _extract_url(cls, url, webpage): + return next(cls._extract_embed_urls(url, webpage), None) + + def _verify_player_video_password(self, url, video_id, headers): + password = self._get_video_password() + data = urlencode_postdata({ + 'password': base64.b64encode(password.encode()), + }) + headers = merge_dicts(headers, { + 'Content-Type': 'application/x-www-form-urlencoded', + }) + checked = self._download_json( + f'{compat_urlparse.urlsplit(url)._replace(query=None).geturl()}/check-password', + video_id, 'Verifying the password', data=data, headers=headers) + if checked is False: + raise ExtractorError('Wrong video password', expected=True) + return checked + + def _extract_from_api(self, video_id, unlisted_hash=None): + token = self._download_json( + 'https://vimeo.com/_rv/jwt', video_id, headers={ + 'X-Requested-With': 'XMLHttpRequest' + })['token'] + api_url = 'https://api.vimeo.com/videos/' + video_id + if unlisted_hash: + api_url += ':' + unlisted_hash + video = self._download_json( + api_url, video_id, headers={ + 'Authorization': 'jwt ' + token, + }, query={ + 'fields': 'config_url,created_time,description,license,metadata.connections.comments.total,metadata.connections.likes.total,release_time,stats.plays', + }) + info = self._parse_config(self._download_json( + video['config_url'], video_id), video_id) + get_timestamp = lambda x: parse_iso8601(video.get(x + '_time')) + info.update({ + 'description': video.get('description'), + 'license': video.get('license'), + 'release_timestamp': get_timestamp('release'), + 'timestamp': get_timestamp('created'), + 'view_count': int_or_none(try_get(video, lambda x: x['stats']['plays'])), + }) + connections = try_get( + video, lambda x: x['metadata']['connections'], dict) or {} + for k in ('comment', 'like'): + info[k + '_count'] = int_or_none(try_get(connections, lambda x: x[k + 's']['total'])) + return info + + def _try_album_password(self, url): + album_id = self._search_regex( + r'vimeo\.com/(?:album|showcase)/([^/]+)', url, 'album id', default=None) + if not album_id: + return + viewer = self._download_json( + 'https://vimeo.com/_rv/viewer', album_id, fatal=False) + if not viewer: + webpage = self._download_webpage(url, album_id) + viewer = self._parse_json(self._search_regex( + r'bootstrap_data\s*=\s*({.+?})</script>', + webpage, 'bootstrap data'), album_id)['viewer'] + jwt = viewer['jwt'] + album = self._download_json( + 'https://api.vimeo.com/albums/' + album_id, + album_id, headers={'Authorization': 'jwt ' + jwt}, + query={'fields': 'description,name,privacy'}) + if try_get(album, lambda x: x['privacy']['view']) == 'password': + password = self.get_param('videopassword') + if not password: + raise ExtractorError( + 'This album is protected by a password, use the --video-password option', + expected=True) + self._set_vimeo_cookie('vuid', viewer['vuid']) + try: + self._download_json( + 'https://vimeo.com/showcase/%s/auth' % album_id, + album_id, 'Verifying the password', data=urlencode_postdata({ + 'password': password, + 'token': viewer['xsrft'], + }), headers={ + 'X-Requested-With': 'XMLHttpRequest', + }) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + raise ExtractorError('Wrong password', expected=True) + raise + + def _real_extract(self, url): + url, data, headers = self._unsmuggle_headers(url) + if 'Referer' not in headers: + headers['Referer'] = url + + # Extract ID from URL + mobj = self._match_valid_url(url).groupdict() + video_id, unlisted_hash = mobj['id'], mobj.get('unlisted_hash') + if unlisted_hash: + return self._extract_from_api(video_id, unlisted_hash) + + if any(p in url for p in ('play_redirect_hls', 'moogaloop.swf')): + url = 'https://vimeo.com/' + video_id + + self._try_album_password(url) + try: + # Retrieve video webpage to extract further information + webpage, urlh = self._download_webpage_handle( + url, video_id, headers=headers) + redirect_url = urlh.url + except ExtractorError as ee: + if isinstance(ee.cause, HTTPError) and ee.cause.status == 403: + errmsg = ee.cause.response.read() + if b'Because of its privacy settings, this video cannot be played here' in errmsg: + raise ExtractorError( + 'Cannot download embed-only video without embedding ' + 'URL. Please call yt-dlp with the URL of the page ' + 'that embeds this video.', + expected=True) + raise + + if '://player.vimeo.com/video/' in url: + config = self._search_json( + r'\b(?:playerC|c)onfig\s*=', webpage, 'info section', video_id) + if config.get('view') == 4: + config = self._verify_player_video_password( + redirect_url, video_id, headers) + return self._parse_config(config, video_id) + + if re.search(r'<form[^>]+?id="pw_form"', webpage): + video_password = self._get_video_password() + token, vuid = self._extract_xsrft_and_vuid(webpage) + webpage = self._verify_video_password( + redirect_url, video_id, video_password, token, vuid) + + vimeo_config = self._extract_vimeo_config(webpage, video_id, default=None) + if vimeo_config: + seed_status = vimeo_config.get('seed_status') or {} + if seed_status.get('state') == 'failed': + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, seed_status['title']), + expected=True) + + cc_license = None + timestamp = None + video_description = None + info_dict = {} + config_url = None + + channel_id = self._search_regex( + r'vimeo\.com/channels/([^/]+)', url, 'channel id', default=None) + if channel_id: + config_url = self._html_search_regex( + r'\bdata-config-url="([^"]+)"', webpage, 'config URL', default=None) + video_description = clean_html(get_element_by_class('description', webpage)) + info_dict.update({ + 'channel_id': channel_id, + 'channel_url': 'https://vimeo.com/channels/' + channel_id, + }) + if not config_url: + page_config = self._parse_json(self._search_regex( + r'vimeo\.(?:clip|vod_title)_page_config\s*=\s*({.+?});', + webpage, 'page config', default='{}'), video_id, fatal=False) + if not page_config: + return self._extract_from_api(video_id) + config_url = page_config['player']['config_url'] + cc_license = page_config.get('cc_license') + clip = page_config.get('clip') or {} + timestamp = clip.get('uploaded_on') + video_description = clean_html( + clip.get('description') or page_config.get('description_html_escaped')) + config = self._download_json(config_url, video_id) + video = config.get('video') or {} + vod = video.get('vod') or {} + + def is_rented(): + if '>You rented this title.<' in webpage: + return True + if try_get(config, lambda x: x['user']['purchased']): + return True + for purchase_option in (vod.get('purchase_options') or []): + if purchase_option.get('purchased'): + return True + label = purchase_option.get('label_string') + if label and (label.startswith('You rented this') or label.endswith(' remaining')): + return True + return False + + if is_rented() and vod.get('is_trailer'): + feature_id = vod.get('feature_id') + if feature_id and not data.get('force_feature_id', False): + return self.url_result(smuggle_url( + 'https://player.vimeo.com/player/%s' % feature_id, + {'force_feature_id': True}), 'Vimeo') + + if not video_description: + video_description = self._html_search_regex( + r'(?s)<div\s+class="[^"]*description[^"]*"[^>]*>(.*?)</div>', + webpage, 'description', default=None) + if not video_description: + video_description = self._html_search_meta( + ['description', 'og:description', 'twitter:description'], + webpage, default=None) + if not video_description: + self.report_warning('Cannot find video description') + + if not timestamp: + timestamp = self._search_regex( + r'<time[^>]+datetime="([^"]+)"', webpage, + 'timestamp', default=None) + + view_count = int_or_none(self._search_regex(r'UserPlays:(\d+)', webpage, 'view count', default=None)) + like_count = int_or_none(self._search_regex(r'UserLikes:(\d+)', webpage, 'like count', default=None)) + comment_count = int_or_none(self._search_regex(r'UserComments:(\d+)', webpage, 'comment count', default=None)) + + formats = [] + + source_format = self._extract_original_format( + 'https://vimeo.com/' + video_id, video_id, video.get('unlisted_hash')) + if source_format: + formats.append(source_format) + + info_dict_config = self._parse_config(config, video_id) + formats.extend(info_dict_config['formats']) + info_dict['_format_sort_fields'] = info_dict_config['_format_sort_fields'] + + json_ld = self._search_json_ld(webpage, video_id, default={}) + + if not cc_license: + cc_license = self._search_regex( + r'<link[^>]+rel=["\']license["\'][^>]+href=(["\'])(?P<license>(?:(?!\1).)+)\1', + webpage, 'license', default=None, group='license') + + info_dict.update({ + 'formats': formats, + 'timestamp': unified_timestamp(timestamp), + 'description': video_description, + 'webpage_url': url, + 'view_count': view_count, + 'like_count': like_count, + 'comment_count': comment_count, + 'license': cc_license, + }) + + return merge_dicts(info_dict, info_dict_config, json_ld) + + +class VimeoOndemandIE(VimeoIE): # XXX: Do not subclass from concrete IE + IE_NAME = 'vimeo:ondemand' + _VALID_URL = r'https?://(?:www\.)?vimeo\.com/ondemand/(?:[^/]+/)?(?P<id>[^/?#&]+)' + _TESTS = [{ + # ondemand video not available via https://vimeo.com/id + 'url': 'https://vimeo.com/ondemand/20704', + 'md5': 'c424deda8c7f73c1dfb3edd7630e2f35', + 'info_dict': { + 'id': '105442900', + 'ext': 'mp4', + 'title': 'המעבדה - במ××™ ×™×•×ª× ×¤×œ×“×ž×Ÿ', + 'uploader': '×’× ×¡×¨×˜×™×', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/gumfilms', + 'uploader_id': 'gumfilms', + 'description': 'md5:aeeba3dbd4d04b0fa98a4fdc9c639998', + 'upload_date': '20140906', + 'timestamp': 1410032453, + 'thumbnail': 'https://i.vimeocdn.com/video/488238335-d7bf151c364cff8d467f1b73784668fe60aae28a54573a35d53a1210ae283bd8-d_1280', + 'comment_count': int, + 'license': 'https://creativecommons.org/licenses/by-nc-nd/3.0/', + 'duration': 53, + 'view_count': int, + 'like_count': int, + }, + 'params': { + 'format': 'best[protocol=https]', + }, + 'expected_warnings': ['Unable to download JSON metadata'], + }, { + # requires Referer to be passed along with og:video:url + 'url': 'https://vimeo.com/ondemand/36938/126682985', + 'info_dict': { + 'id': '126584684', + 'ext': 'mp4', + 'title': 'Rävlock, rätt läte pÃ¥ rätt plats', + 'uploader': 'Lindroth & Norin', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/lindrothnorin', + 'uploader_id': 'lindrothnorin', + 'description': 'md5:c3c46a90529612c8279fb6af803fc0df', + 'upload_date': '20150502', + 'timestamp': 1430586422, + 'duration': 121, + 'comment_count': int, + 'view_count': int, + 'thumbnail': 'https://i.vimeocdn.com/video/517077723-7066ae1d9a79d3eb361334fb5d58ec13c8f04b52f8dd5eadfbd6fb0bcf11f613-d_1280', + 'like_count': int, + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['Unable to download JSON metadata'], + }, { + 'url': 'https://vimeo.com/ondemand/nazmaalik', + 'only_matching': True, + }, { + 'url': 'https://vimeo.com/ondemand/141692381', + 'only_matching': True, + }, { + 'url': 'https://vimeo.com/ondemand/thelastcolony/150274832', + 'only_matching': True, + }] + + +class VimeoChannelIE(VimeoBaseInfoExtractor): + IE_NAME = 'vimeo:channel' + _VALID_URL = r'https://vimeo\.com/channels/(?P<id>[^/?#]+)/?(?:$|[?#])' + _MORE_PAGES_INDICATOR = r'<a.+?rel="next"' + _TITLE = None + _TITLE_RE = r'<link rel="alternate"[^>]+?title="(.*?)"' + _TESTS = [{ + 'url': 'https://vimeo.com/channels/tributes', + 'info_dict': { + 'id': 'tributes', + 'title': 'Vimeo Tributes', + }, + 'playlist_mincount': 22, + }] + _BASE_URL_TEMPL = 'https://vimeo.com/channels/%s' + + def _page_url(self, base_url, pagenum): + return '%s/videos/page:%d/' % (base_url, pagenum) + + def _extract_list_title(self, webpage): + return self._TITLE or self._html_search_regex( + self._TITLE_RE, webpage, 'list title', fatal=False) + + def _title_and_entries(self, list_id, base_url): + for pagenum in itertools.count(1): + page_url = self._page_url(base_url, pagenum) + webpage = self._download_webpage( + page_url, list_id, + 'Downloading page %s' % pagenum) + + if pagenum == 1: + yield self._extract_list_title(webpage) + + # Try extracting href first since not all videos are available via + # short https://vimeo.com/id URL (e.g. https://vimeo.com/channels/tributes/6213729) + clips = re.findall( + r'id="clip_(\d+)"[^>]*>\s*<a[^>]+href="(/(?:[^/]+/)*\1)(?:[^>]+\btitle="([^"]+)")?', webpage) + if clips: + for video_id, video_url, video_title in clips: + yield self.url_result( + compat_urlparse.urljoin(base_url, video_url), + VimeoIE.ie_key(), video_id=video_id, video_title=video_title) + # More relaxed fallback + else: + for video_id in re.findall(r'id=["\']clip_(\d+)', webpage): + yield self.url_result( + 'https://vimeo.com/%s' % video_id, + VimeoIE.ie_key(), video_id=video_id) + + if re.search(self._MORE_PAGES_INDICATOR, webpage, re.DOTALL) is None: + break + + def _extract_videos(self, list_id, base_url): + title_and_entries = self._title_and_entries(list_id, base_url) + list_title = next(title_and_entries) + return self.playlist_result(title_and_entries, list_id, list_title) + + def _real_extract(self, url): + channel_id = self._match_id(url) + return self._extract_videos(channel_id, self._BASE_URL_TEMPL % channel_id) + + +class VimeoUserIE(VimeoChannelIE): # XXX: Do not subclass from concrete IE + IE_NAME = 'vimeo:user' + _VALID_URL = r'https://vimeo\.com/(?!(?:[0-9]+|watchlater)(?:$|[?#/]))(?P<id>[^/]+)(?:/videos)?/?(?:$|[?#])' + _TITLE_RE = r'<a[^>]+?class="user">([^<>]+?)</a>' + _TESTS = [{ + 'url': 'https://vimeo.com/nkistudio/videos', + 'info_dict': { + 'title': 'Nki', + 'id': 'nkistudio', + }, + 'playlist_mincount': 66, + }, { + 'url': 'https://vimeo.com/nkistudio/', + 'only_matching': True, + }] + _BASE_URL_TEMPL = 'https://vimeo.com/%s' + + +class VimeoAlbumIE(VimeoBaseInfoExtractor): + IE_NAME = 'vimeo:album' + _VALID_URL = r'https://vimeo\.com/(?:album|showcase)/(?P<id>\d+)(?:$|[?#]|/(?!video))' + _TITLE_RE = r'<header id="page_header">\n\s*<h1>(.*?)</h1>' + _TESTS = [{ + 'url': 'https://vimeo.com/album/2632481', + 'info_dict': { + 'id': '2632481', + 'title': 'Staff Favorites: November 2013', + }, + 'playlist_mincount': 13, + }, { + 'note': 'Password-protected album', + 'url': 'https://vimeo.com/album/3253534', + 'info_dict': { + 'title': 'test', + 'id': '3253534', + }, + 'playlist_count': 1, + 'params': { + 'videopassword': 'youtube-dl', + } + }] + _PAGE_SIZE = 100 + + def _fetch_page(self, album_id, authorization, hashed_pass, page): + api_page = page + 1 + query = { + 'fields': 'link,uri', + 'page': api_page, + 'per_page': self._PAGE_SIZE, + } + if hashed_pass: + query['_hashed_pass'] = hashed_pass + try: + videos = self._download_json( + 'https://api.vimeo.com/albums/%s/videos' % album_id, + album_id, 'Downloading page %d' % api_page, query=query, headers={ + 'Authorization': 'jwt ' + authorization, + })['data'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 400: + return + for video in videos: + link = video.get('link') + if not link: + continue + uri = video.get('uri') + video_id = self._search_regex(r'/videos/(\d+)', uri, 'video_id', default=None) if uri else None + yield self.url_result(link, VimeoIE.ie_key(), video_id) + + def _real_extract(self, url): + album_id = self._match_id(url) + viewer = self._download_json( + 'https://vimeo.com/_rv/viewer', album_id, fatal=False) + if not viewer: + webpage = self._download_webpage(url, album_id) + viewer = self._parse_json(self._search_regex( + r'bootstrap_data\s*=\s*({.+?})</script>', + webpage, 'bootstrap data'), album_id)['viewer'] + jwt = viewer['jwt'] + album = self._download_json( + 'https://api.vimeo.com/albums/' + album_id, + album_id, headers={'Authorization': 'jwt ' + jwt}, + query={'fields': 'description,name,privacy'}) + hashed_pass = None + if try_get(album, lambda x: x['privacy']['view']) == 'password': + password = self.get_param('videopassword') + if not password: + raise ExtractorError( + 'This album is protected by a password, use the --video-password option', + expected=True) + self._set_vimeo_cookie('vuid', viewer['vuid']) + try: + hashed_pass = self._download_json( + 'https://vimeo.com/showcase/%s/auth' % album_id, + album_id, 'Verifying the password', data=urlencode_postdata({ + 'password': password, + 'token': viewer['xsrft'], + }), headers={ + 'X-Requested-With': 'XMLHttpRequest', + })['hashed_pass'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + raise ExtractorError('Wrong password', expected=True) + raise + entries = OnDemandPagedList(functools.partial( + self._fetch_page, album_id, jwt, hashed_pass), self._PAGE_SIZE) + return self.playlist_result( + entries, album_id, album.get('name'), album.get('description')) + + +class VimeoGroupsIE(VimeoChannelIE): # XXX: Do not subclass from concrete IE + IE_NAME = 'vimeo:group' + _VALID_URL = r'https://vimeo\.com/groups/(?P<id>[^/]+)(?:/(?!videos?/\d+)|$)' + _TESTS = [{ + 'url': 'https://vimeo.com/groups/meetup', + 'info_dict': { + 'id': 'meetup', + 'title': 'Vimeo Meetup!', + }, + 'playlist_mincount': 27, + }] + _BASE_URL_TEMPL = 'https://vimeo.com/groups/%s' + + +class VimeoReviewIE(VimeoBaseInfoExtractor): + IE_NAME = 'vimeo:review' + IE_DESC = 'Review pages on vimeo' + _VALID_URL = r'(?P<url>https://vimeo\.com/[^/]+/review/(?P<id>[^/]+)/[0-9a-f]{10})' + _TESTS = [{ + 'url': 'https://vimeo.com/user21297594/review/75524534/3c257a1b5d', + 'md5': 'c507a72f780cacc12b2248bb4006d253', + 'info_dict': { + 'id': '75524534', + 'ext': 'mp4', + 'title': "DICK HARDWICK 'Comedian'", + 'uploader': 'Richard Hardwick', + 'uploader_id': 'user21297594', + 'description': "Comedian Dick Hardwick's five minute demo filmed in front of a live theater audience.\nEdit by Doug Mattocks", + 'duration': 304, + 'thumbnail': 'https://i.vimeocdn.com/video/450115033-43303819d9ebe24c2630352e18b7056d25197d09b3ae901abdac4c4f1d68de71-d_1280', + 'uploader_url': 'https://vimeo.com/user21297594', + }, + }, { + 'note': 'video player needs Referer', + 'url': 'https://vimeo.com/user22258446/review/91613211/13f927e053', + 'md5': '6295fdab8f4bf6a002d058b2c6dce276', + 'info_dict': { + 'id': '91613211', + 'ext': 'mp4', + 'title': 're:(?i)^Death by dogma versus assembling agile . Sander Hoogendoorn', + 'uploader': 'DevWeek Events', + 'duration': 2773, + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader_id': 'user22258446', + }, + 'skip': 'video gone', + }, { + 'note': 'Password protected', + 'url': 'https://vimeo.com/user37284429/review/138823582/c4d865efde', + 'info_dict': { + 'id': '138823582', + 'ext': 'mp4', + 'title': 'EFFICIENT PICKUP MASTERCLASS MODULE 1', + 'uploader': 'TMB', + 'uploader_id': 'user37284429', + }, + 'params': { + 'videopassword': 'holygrail', + }, + 'skip': 'video gone', + }] + + def _real_extract(self, url): + page_url, video_id = self._match_valid_url(url).groups() + data = self._download_json( + page_url.replace('/review/', '/review/data/'), video_id) + if data.get('isLocked') is True: + video_password = self._get_video_password() + viewer = self._download_json( + 'https://vimeo.com/_rv/viewer', video_id) + webpage = self._verify_video_password( + 'https://vimeo.com/' + video_id, video_id, + video_password, viewer['xsrft'], viewer['vuid']) + clip_page_config = self._parse_json(self._search_regex( + r'window\.vimeo\.clip_page_config\s*=\s*({.+?});', + webpage, 'clip page config'), video_id) + config_url = clip_page_config['player']['config_url'] + clip_data = clip_page_config.get('clip') or {} + else: + clip_data = data['clipData'] + config_url = clip_data['configUrl'] + config = self._download_json(config_url, video_id) + info_dict = self._parse_config(config, video_id) + source_format = self._extract_original_format( + page_url + '/action', video_id) + if source_format: + info_dict['formats'].append(source_format) + info_dict['description'] = clean_html(clip_data.get('description')) + return info_dict + + +class VimeoWatchLaterIE(VimeoChannelIE): # XXX: Do not subclass from concrete IE + IE_NAME = 'vimeo:watchlater' + IE_DESC = 'Vimeo watch later list, ":vimeowatchlater" keyword (requires authentication)' + _VALID_URL = r'https://vimeo\.com/(?:home/)?watchlater|:vimeowatchlater' + _TITLE = 'Watch Later' + _LOGIN_REQUIRED = True + _TESTS = [{ + 'url': 'https://vimeo.com/watchlater', + 'only_matching': True, + }] + + def _page_url(self, base_url, pagenum): + url = '%s/page:%d/' % (base_url, pagenum) + request = Request(url) + # Set the header to get a partial html page with the ids, + # the normal page doesn't contain them. + request.headers['X-Requested-With'] = 'XMLHttpRequest' + return request + + def _real_extract(self, url): + return self._extract_videos('watchlater', 'https://vimeo.com/watchlater') + + +class VimeoLikesIE(VimeoChannelIE): # XXX: Do not subclass from concrete IE + _VALID_URL = r'https://(?:www\.)?vimeo\.com/(?P<id>[^/]+)/likes/?(?:$|[?#]|sort:)' + IE_NAME = 'vimeo:likes' + IE_DESC = 'Vimeo user likes' + _TESTS = [{ + 'url': 'https://vimeo.com/user755559/likes/', + 'playlist_mincount': 293, + 'info_dict': { + 'id': 'user755559', + 'title': 'urza’s Likes', + }, + }, { + 'url': 'https://vimeo.com/stormlapse/likes', + 'only_matching': True, + }] + + def _page_url(self, base_url, pagenum): + return '%s/page:%d/' % (base_url, pagenum) + + def _real_extract(self, url): + user_id = self._match_id(url) + return self._extract_videos(user_id, 'https://vimeo.com/%s/likes' % user_id) + + +class VHXEmbedIE(VimeoBaseInfoExtractor): + IE_NAME = 'vhx:embed' + _VALID_URL = r'https?://embed\.vhx\.tv/videos/(?P<id>\d+)' + _EMBED_REGEX = [r'<iframe[^>]+src="(?P<url>https?://embed\.vhx\.tv/videos/\d+[^"]*)"'] + + @classmethod + def _extract_embed_urls(cls, url, webpage): + for embed_url in super()._extract_embed_urls(url, webpage): + yield cls._smuggle_referrer(embed_url, url) + + def _real_extract(self, url): + video_id = self._match_id(url) + url, _, headers = self._unsmuggle_headers(url) + webpage = self._download_webpage(url, video_id, headers=headers) + config_url = self._parse_json(self._search_regex( + r'window\.OTTData\s*=\s*({.+})', webpage, + 'ott data'), video_id, js_to_json)['config_url'] + config = self._download_json(config_url, video_id) + info = self._parse_config(config, video_id) + info['id'] = video_id + return info + + +class VimeoProIE(VimeoBaseInfoExtractor): + IE_NAME = 'vimeo:pro' + _VALID_URL = r'https?://(?:www\.)?vimeopro\.com/[^/?#]+/(?P<slug>[^/?#]+)(?:(?:/videos?/(?P<id>[0-9]+)))?' + _TESTS = [{ + # Vimeo URL derived from video_id + 'url': 'http://vimeopro.com/openstreetmapus/state-of-the-map-us-2013/video/68093876', + 'md5': '3b5ca6aa22b60dfeeadf50b72e44ed82', + 'note': 'Vimeo Pro video (#1197)', + 'info_dict': { + 'id': '68093876', + 'ext': 'mp4', + 'uploader_url': r're:https?://(?:www\.)?vimeo\.com/openstreetmapus', + 'uploader_id': 'openstreetmapus', + 'uploader': 'OpenStreetMap US', + 'title': 'Andy Allan - Putting the Carto into OpenStreetMap Cartography', + 'description': 'md5:2c362968038d4499f4d79f88458590c1', + 'duration': 1595, + 'upload_date': '20130610', + 'timestamp': 1370893156, + 'license': 'by', + 'thumbnail': 'https://i.vimeocdn.com/video/440260469-19b0d92fca3bd84066623b53f1eb8aaa3980c6c809e2d67b6b39ab7b4a77a344-d_960', + 'view_count': int, + 'comment_count': int, + 'like_count': int, + 'tags': 'count:1', + }, + 'params': { + 'format': 'best[protocol=https]', + }, + }, { + # password-protected VimeoPro page with Vimeo player embed + 'url': 'https://vimeopro.com/cadfem/simulation-conference-mechanische-systeme-in-perfektion', + 'info_dict': { + 'id': '764543723', + 'ext': 'mp4', + 'title': 'Mechanische Systeme in Perfektion: Realität erfassen, Innovation treiben', + 'thumbnail': 'https://i.vimeocdn.com/video/1543784598-a1a750494a485e601110136b9fe11e28c2131942452b3a5d30391cb3800ca8fd-d_1280', + 'description': 'md5:2a9d195cd1b0f6f79827107dc88c2420', + 'uploader': 'CADFEM', + 'uploader_id': 'cadfem', + 'uploader_url': 'https://vimeo.com/cadfem', + 'duration': 12505, + 'chapters': 'count:10', + }, + 'params': { + 'videopassword': 'Conference2022', + 'skip_download': True, + }, + }] + + def _real_extract(self, url): + display_id, video_id = self._match_valid_url(url).group('slug', 'id') + if video_id: + display_id = video_id + webpage = self._download_webpage(url, display_id) + + password_form = self._search_regex( + r'(?is)<form[^>]+?method=["\']post["\'][^>]*>(.+?password.+?)</form>', + webpage, 'password form', default=None) + if password_form: + try: + webpage = self._download_webpage(url, display_id, data=urlencode_postdata({ + 'password': self._get_video_password(), + **self._hidden_inputs(password_form), + }), note='Logging in with video password') + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 418: + raise ExtractorError('Wrong video password', expected=True) + raise + + description = None + # even if we have video_id, some videos require player URL with portfolio_id query param + # https://github.com/ytdl-org/youtube-dl/issues/20070 + vimeo_url = VimeoIE._extract_url(url, webpage) + if vimeo_url: + description = self._html_search_meta('description', webpage, default=None) + elif video_id: + vimeo_url = f'https://vimeo.com/{video_id}' + else: + raise ExtractorError( + 'No Vimeo embed or video ID could be found in VimeoPro page', expected=True) + + return self.url_result(vimeo_url, VimeoIE, video_id, url_transparent=True, + description=description) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vimm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vimm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vimm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vimm.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vimple.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vimple.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vimple.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vimple.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vine.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vine.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vine.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vine.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/viqeo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viqeo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/viqeo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/viqeo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/viu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/viu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/viu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/viu.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vk.py new file mode 100644 index 0000000..c12e873 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vk.py @@ -0,0 +1,842 @@ +import collections +import hashlib +import re + +from .common import InfoExtractor +from .dailymotion import DailymotionIE +from .odnoklassniki import OdnoklassnikiIE +from .pladform import PladformIE +from .sibnet import SibnetEmbedIE +from .vimeo import VimeoIE +from .youtube import YoutubeIE +from ..utils import ( + ExtractorError, + UserNotLive, + clean_html, + get_element_by_class, + get_element_html_by_id, + int_or_none, + join_nonempty, + parse_resolution, + str_or_none, + str_to_int, + try_call, + unescapeHTML, + unified_timestamp, + update_url_query, + url_or_none, + urlencode_postdata, + urljoin, + traverse_obj, +) + + +class VKBaseIE(InfoExtractor): + _NETRC_MACHINE = 'vk' + + def _download_webpage_handle(self, url_or_request, video_id, *args, fatal=True, **kwargs): + response = super()._download_webpage_handle(url_or_request, video_id, *args, fatal=fatal, **kwargs) + challenge_url, cookie = response[1].url if response else '', None + if challenge_url.startswith('https://vk.com/429.html?'): + cookie = self._get_cookies(challenge_url).get('hash429') + if not cookie: + return response + + hash429 = hashlib.md5(cookie.value.encode('ascii')).hexdigest() + self._request_webpage( + update_url_query(challenge_url, {'key': hash429}), video_id, fatal=fatal, + note='Resolving WAF challenge', errnote='Failed to bypass WAF challenge') + return super()._download_webpage_handle(url_or_request, video_id, *args, fatal=True, **kwargs) + + def _perform_login(self, username, password): + login_page, url_handle = self._download_webpage_handle( + 'https://vk.com', None, 'Downloading login page') + + login_form = self._hidden_inputs(login_page) + + login_form.update({ + 'email': username.encode('cp1251'), + 'pass': password.encode('cp1251'), + }) + + # vk serves two same remixlhk cookies in Set-Cookie header and expects + # first one to be actually set + self._apply_first_set_cookie_header(url_handle, 'remixlhk') + + login_page = self._download_webpage( + 'https://vk.com/login', None, + note='Logging in', + data=urlencode_postdata(login_form)) + + if re.search(r'onLoginFailed', login_page): + raise ExtractorError( + 'Unable to login, incorrect username and/or password', expected=True) + + def _download_payload(self, path, video_id, data, fatal=True): + endpoint = f'https://vk.com/{path}.php' + data['al'] = 1 + code, payload = self._download_json( + endpoint, video_id, data=urlencode_postdata(data), fatal=fatal, + headers={ + 'Referer': endpoint, + 'X-Requested-With': 'XMLHttpRequest', + })['payload'] + if code == '3': + self.raise_login_required() + elif code == '8': + raise ExtractorError(clean_html(payload[0][1:-1]), expected=True) + return payload + + +class VKIE(VKBaseIE): + IE_NAME = 'vk' + IE_DESC = 'VK' + _EMBED_REGEX = [r'<iframe[^>]+?src=(["\'])(?P<url>https?://vk\.com/video_ext\.php.+?)\1'] + _VALID_URL = r'''(?x) + https?:// + (?: + (?: + (?:(?:m|new)\.)?vk\.com/video_| + (?:www\.)?daxab\.com/ + ) + ext\.php\?(?P<embed_query>.*?\boid=(?P<oid>-?\d+).*?\bid=(?P<id>\d+).*)| + (?: + (?:(?:m|new)\.)?vk\.com/(?:.+?\?.*?z=)?(?:video|clip)| + (?:www\.)?daxab\.com/embed/ + ) + (?P<videoid>-?\d+_\d+)(?:.*\blist=(?P<list_id>([\da-f]+)|(ln-[\da-zA-Z]+)))? + ) + ''' + + _TESTS = [ + { + 'url': 'http://vk.com/videos-77521?z=video-77521_162222515%2Fclub77521', + 'info_dict': { + 'id': '-77521_162222515', + 'ext': 'mp4', + 'title': 'ProtivoGunz - Ð¥ÑƒÑ‘Ð²Ð°Ñ Ð¿ÐµÑнÑ', + 'uploader': 're:(?:Noize MC|Alexander Ilyashenko).*', + 'uploader_id': '39545378', + 'duration': 195, + 'timestamp': 1329049880, + 'upload_date': '20120212', + 'comment_count': int, + 'like_count': int, + 'thumbnail': r're:https?://.+(?:\.jpg|getVideoPreview.*)$', + }, + 'params': {'skip_download': 'm3u8'}, + }, + { + 'url': 'http://vk.com/video205387401_165548505', + 'info_dict': { + 'id': '205387401_165548505', + 'ext': 'mp4', + 'title': 'No name', + 'uploader': 'Tom Cruise', + 'uploader_id': '205387401', + 'duration': 9, + 'timestamp': 1374364108, + 'upload_date': '20130720', + 'comment_count': int, + 'like_count': int, + 'thumbnail': r're:https?://.+(?:\.jpg|getVideoPreview.*)$', + } + }, + { + 'note': 'Embedded video', + 'url': 'https://vk.com/video_ext.php?oid=-77521&id=162222515&hash=87b046504ccd8bfa', + 'info_dict': { + 'id': '-77521_162222515', + 'ext': 'mp4', + 'uploader': 're:(?:Noize MC|Alexander Ilyashenko).*', + 'title': 'ProtivoGunz - Ð¥ÑƒÑ‘Ð²Ð°Ñ Ð¿ÐµÑнÑ', + 'duration': 195, + 'upload_date': '20120212', + 'timestamp': 1329049880, + 'uploader_id': '39545378', + 'thumbnail': r're:https?://.+(?:\.jpg|getVideoPreview.*)$', + }, + 'params': {'skip_download': 'm3u8'}, + }, + { + 'url': 'https://vk.com/video-93049196_456239755?list=ln-cBjJ7S4jYYx3ADnmDT', + 'info_dict': { + 'id': '-93049196_456239755', + 'ext': 'mp4', + 'title': '8 ÑÐµÑ€Ð¸Ñ (озвучка)', + 'duration': 8383, + 'comment_count': int, + 'uploader': 'Dizi2021', + 'like_count': int, + 'timestamp': 1640162189, + 'upload_date': '20211222', + 'uploader_id': '-93049196', + 'thumbnail': r're:https?://.+(?:\.jpg|getVideoPreview.*)$', + }, + }, + { + 'note': 'youtube embed', + 'url': 'https://vk.com/video276849682_170681728', + 'info_dict': { + 'id': 'V3K4mi0SYkc', + 'ext': 'mp4', + 'title': "DSWD Awards 'Children's Joy Foundation, Inc.' Certificate of Registration and License to Operate", + 'description': 'md5:bf9c26cfa4acdfb146362682edd3827a', + 'duration': 178, + 'upload_date': '20130117', + 'uploader': "Children's Joy Foundation Inc.", + 'uploader_id': 'thecjf', + 'view_count': int, + 'channel_id': 'UCgzCNQ11TmR9V97ECnhi3gw', + 'availability': 'public', + 'like_count': int, + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel': 'Children\'s Joy Foundation Inc.', + 'uploader_url': 'http://www.youtube.com/user/thecjf', + 'thumbnail': r're:https?://.+\.jpg$', + 'tags': 'count:27', + 'start_time': 0.0, + 'categories': ['Nonprofits & Activism'], + 'channel_url': 'https://www.youtube.com/channel/UCgzCNQ11TmR9V97ECnhi3gw', + 'channel_follower_count': int, + 'age_limit': 0, + }, + }, + { + 'note': 'dailymotion embed', + 'url': 'https://vk.com/video-95168827_456239103?list=cca524a0f0d5557e16', + 'info_dict': { + 'id': 'x8gfli0', + 'ext': 'mp4', + 'title': 'md5:45410f60ccd4b2760da98cb5fc777d70', + 'description': 'md5:2e71c5c9413735cfa06cf1a166f16c84', + 'uploader': 'Movies and cinema.', + 'upload_date': '20221218', + 'uploader_id': 'x1jdavv', + 'timestamp': 1671387617, + 'age_limit': 0, + 'duration': 2918, + 'like_count': int, + 'view_count': int, + 'thumbnail': r're:https?://.+x1080$', + 'tags': list + }, + }, + { + 'url': 'https://vk.com/clips-74006511?z=clip-74006511_456247211', + 'info_dict': { + 'id': '-74006511_456247211', + 'ext': 'mp4', + 'comment_count': int, + 'duration': 9, + 'like_count': int, + 'thumbnail': r're:https?://.+(?:\.jpg|getVideoPreview.*)$', + 'timestamp': 1664995597, + 'title': 'Clip by @madempress', + 'upload_date': '20221005', + 'uploader': 'Ð¨Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸Ð¼Ð¿ÐµÑ€Ð°Ñ‚Ñ€Ð¸Ñ†Ð°', + 'uploader_id': '-74006511', + }, + }, + { + # video key is extra_data not url\d+ + 'url': 'http://vk.com/video-110305615_171782105', + 'md5': 'e13fcda136f99764872e739d13fac1d1', + 'info_dict': { + 'id': '-110305615_171782105', + 'ext': 'mp4', + 'title': 'S-Dance, репетиции к The way show', + 'uploader': 'THE WAY SHOW | 17 апрелÑ', + 'uploader_id': '-110305615', + 'timestamp': 1454859345, + 'upload_date': '20160207', + }, + 'skip': 'Removed', + }, + { + 'note': 'finished live stream, postlive_mp4', + 'url': 'https://vk.com/videos-387766?z=video-387766_456242764%2Fpl_-387766_-2', + 'info_dict': { + 'id': '-387766_456242764', + 'ext': 'mp4', + 'title': 'ИгроМир 2016 День 1 — Ð˜Ð³Ñ€Ð¾Ð¼Ð°Ð½Ð¸Ñ Ð£Ñ‚Ñ€Ð¾Ð¼', + 'uploader': 'ИгроманиÑ', + 'duration': 5239, + 'upload_date': '20160929', + 'uploader_id': '-387766', + 'timestamp': 1475137527, + 'thumbnail': r're:https?://.+\.jpg$', + 'comment_count': int, + 'like_count': int, + }, + 'params': { + 'skip_download': True, + }, + }, + { + # live stream, hls and rtmp links, most likely already finished live + # stream by the time you are reading this comment + 'url': 'https://vk.com/video-140332_456239111', + 'only_matching': True, + }, + { + # removed video, just testing that we match the pattern + 'url': 'http://vk.com/feed?z=video-43215063_166094326%2Fbb50cacd3177146d7a', + 'only_matching': True, + }, + { + # age restricted video, requires vk account credentials + 'url': 'https://vk.com/video205387401_164765225', + 'only_matching': True, + }, + { + # pladform embed + 'url': 'https://vk.com/video-76116461_171554880', + 'only_matching': True, + }, + { + 'url': 'http://new.vk.com/video205387401_165548505', + 'only_matching': True, + }, + { + # This video is no longer available, because its author has been blocked. + 'url': 'https://vk.com/video-10639516_456240611', + 'only_matching': True, + }, + { + # The video is not available in your region. + 'url': 'https://vk.com/video-51812607_171445436', + 'only_matching': True, + }, + { + 'url': 'https://vk.com/clip30014565_456240946', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('videoid') + + mv_data = {} + if video_id: + data = { + 'act': 'show', + 'video': video_id, + } + # Some videos (removed?) can only be downloaded with list id specified + list_id = mobj.group('list_id') + if list_id: + data['list'] = list_id + + payload = self._download_payload('al_video', video_id, data) + info_page = payload[1] + opts = payload[-1] + mv_data = opts.get('mvData') or {} + player = opts.get('player') or {} + else: + video_id = '%s_%s' % (mobj.group('oid'), mobj.group('id')) + + info_page = self._download_webpage( + 'http://vk.com/video_ext.php?' + mobj.group('embed_query'), video_id) + + error_message = self._html_search_regex( + [r'(?s)<!><div[^>]+class="video_layer_message"[^>]*>(.+?)</div>', + r'(?s)<div[^>]+id="video_ext_msg"[^>]*>(.+?)</div>'], + info_page, 'error message', default=None) + if error_message: + raise ExtractorError(error_message, expected=True) + + if re.search(r'<!>/login\.php\?.*\bact=security_check', info_page): + raise ExtractorError( + 'You are trying to log in from an unusual location. You should confirm ownership at vk.com to log in with this IP.', + expected=True) + + ERROR_COPYRIGHT = 'Video %s has been removed from public access due to rightholder complaint.' + + ERRORS = { + r'>ВидеозапиÑÑŒ .*? была изъÑта из публичного доÑтупа в ÑвÑзи Ñ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸ÐµÐ¼ правообладателÑ.<': + ERROR_COPYRIGHT, + + r'>The video .*? was removed from public access by request of the copyright holder.<': + ERROR_COPYRIGHT, + + r'<!>Please log in or <': + 'Video %s is only available for registered users, ' + 'use --username and --password options to provide account credentials.', + + r'<!>Unknown error': + 'Video %s does not exist.', + + r'<!>Видео временно недоÑтупно': + 'Video %s is temporarily unavailable.', + + r'<!>Access denied': + 'Access denied to video %s.', + + r'<!>ВидеозапиÑÑŒ недоÑтупна, так как её автор был заблокирован.': + 'Video %s is no longer available, because its author has been blocked.', + + r'<!>This video is no longer available, because its author has been blocked.': + 'Video %s is no longer available, because its author has been blocked.', + + r'<!>This video is no longer available, because it has been deleted.': + 'Video %s is no longer available, because it has been deleted.', + + r'<!>The video .+? is not available in your region.': + 'Video %s is not available in your region.', + } + + for error_re, error_msg in ERRORS.items(): + if re.search(error_re, info_page): + raise ExtractorError(error_msg % video_id, expected=True) + + player = self._parse_json(self._search_regex( + r'var\s+playerParams\s*=\s*({.+?})\s*;\s*\n', + info_page, 'player params'), video_id) + + youtube_url = YoutubeIE._extract_url(info_page) + if youtube_url: + return self.url_result(youtube_url, YoutubeIE.ie_key()) + + vimeo_url = VimeoIE._extract_url(url, info_page) + if vimeo_url is not None: + return self.url_result(vimeo_url, VimeoIE.ie_key()) + + pladform_url = PladformIE._extract_url(info_page) + if pladform_url: + return self.url_result(pladform_url, PladformIE.ie_key()) + + m_rutube = re.search( + r'\ssrc="((?:https?:)?//rutube\.ru\\?/(?:video|play)\\?/embed(?:.*?))\\?"', info_page) + if m_rutube is not None: + rutube_url = self._proto_relative_url( + m_rutube.group(1).replace('\\', '')) + return self.url_result(rutube_url) + + dailymotion_url = next(DailymotionIE._extract_embed_urls(url, info_page), None) + if dailymotion_url: + return self.url_result(dailymotion_url, DailymotionIE.ie_key()) + + odnoklassniki_url = OdnoklassnikiIE._extract_url(info_page) + if odnoklassniki_url: + return self.url_result(odnoklassniki_url, OdnoklassnikiIE.ie_key()) + + sibnet_url = next(SibnetEmbedIE._extract_embed_urls(url, info_page), None) + if sibnet_url: + return self.url_result(sibnet_url) + + m_opts = re.search(r'(?s)var\s+opts\s*=\s*({.+?});', info_page) + if m_opts: + m_opts_url = re.search(r"url\s*:\s*'((?!/\b)[^']+)", m_opts.group(1)) + if m_opts_url: + opts_url = m_opts_url.group(1) + if opts_url.startswith('//'): + opts_url = 'http:' + opts_url + return self.url_result(opts_url) + + data = player['params'][0] + title = unescapeHTML(data['md_title']) + + # 2 = live + # 3 = post live (finished live) + is_live = data.get('live') == 2 + + timestamp = unified_timestamp(self._html_search_regex( + r'class=["\']mv_info_date[^>]+>([^<]+)(?:<|from)', info_page, + 'upload date', default=None)) or int_or_none(data.get('date')) + + view_count = str_to_int(self._search_regex( + r'class=["\']mv_views_count[^>]+>\s*([\d,.]+)', + info_page, 'view count', default=None)) + + formats = [] + for format_id, format_url in data.items(): + format_url = url_or_none(format_url) + if not format_url or not format_url.startswith(('http', '//', 'rtmp')): + continue + if (format_id.startswith(('url', 'cache')) + or format_id in ('extra_data', 'live_mp4', 'postlive_mp4')): + height = int_or_none(self._search_regex( + r'^(?:url|cache)(\d+)', format_id, 'height', default=None)) + formats.append({ + 'format_id': format_id, + 'url': format_url, + 'height': height, + }) + elif format_id == 'hls': + formats.extend(self._extract_m3u8_formats( + format_url, video_id, 'mp4', 'm3u8_native', + m3u8_id=format_id, fatal=False, live=is_live)) + elif format_id == 'rtmp': + formats.append({ + 'format_id': format_id, + 'url': format_url, + 'ext': 'flv', + }) + + subtitles = {} + for sub in data.get('subs') or {}: + subtitles.setdefault(sub.get('lang', 'en'), []).append({ + 'ext': sub.get('title', '.srt').split('.')[-1], + 'url': url_or_none(sub.get('url')), + }) + + return { + 'id': video_id, + 'formats': formats, + 'title': title, + 'thumbnail': data.get('jpg'), + 'uploader': data.get('md_author'), + 'uploader_id': str_or_none(data.get('author_id') or mv_data.get('authorId')), + 'duration': int_or_none(data.get('duration') or mv_data.get('duration')), + 'timestamp': timestamp, + 'view_count': view_count, + 'like_count': int_or_none(mv_data.get('likes')), + 'comment_count': int_or_none(mv_data.get('commcount')), + 'is_live': is_live, + 'subtitles': subtitles, + } + + +class VKUserVideosIE(VKBaseIE): + IE_NAME = 'vk:uservideos' + IE_DESC = "VK - User's Videos" + _VALID_URL = r'https?://(?:(?:m|new)\.)?vk\.com/video/(?:playlist/)?(?P<id>[^?$#/&]+)(?!\?.*\bz=video)(?:[/?#&](?:.*?\bsection=(?P<section>\w+))?|$)' + _TEMPLATE_URL = 'https://vk.com/videos' + _TESTS = [{ + 'url': 'https://vk.com/video/@mobidevices', + 'info_dict': { + 'id': '-17892518_all', + }, + 'playlist_mincount': 1355, + }, { + 'url': 'https://vk.com/video/@mobidevices?section=uploaded', + 'info_dict': { + 'id': '-17892518_uploaded', + }, + 'playlist_mincount': 182, + }, { + 'url': 'https://vk.com/video/playlist/-174476437_2', + 'info_dict': { + 'id': '-174476437_playlist_2', + 'title': 'ÐнонÑÑ‹' + }, + 'playlist_mincount': 108, + }] + _VIDEO = collections.namedtuple('Video', ['owner_id', 'id']) + + def _entries(self, page_id, section): + video_list_json = self._download_payload('al_video', page_id, { + 'act': 'load_videos_silent', + 'offset': 0, + 'oid': page_id, + 'section': section, + })[0][section] + count = video_list_json['count'] + total = video_list_json['total'] + video_list = video_list_json['list'] + + while True: + for video in video_list: + v = self._VIDEO._make(video[:2]) + video_id = '%d_%d' % (v.owner_id, v.id) + yield self.url_result( + 'http://vk.com/video' + video_id, VKIE.ie_key(), video_id) + if count >= total: + break + video_list_json = self._download_payload('al_video', page_id, { + 'act': 'load_videos_silent', + 'offset': count, + 'oid': page_id, + 'section': section, + })[0][section] + count += video_list_json['count'] + video_list = video_list_json['list'] + + def _real_extract(self, url): + u_id, section = self._match_valid_url(url).groups() + webpage = self._download_webpage(url, u_id) + + if u_id.startswith('@'): + page_id = self._search_regex(r'data-owner-id\s?=\s?"([^"]+)"', webpage, 'page_id') + elif '_' in u_id: + page_id, section = u_id.split('_', 1) + section = f'playlist_{section}' + else: + raise ExtractorError('Invalid URL', expected=True) + + if not section: + section = 'all' + + playlist_title = clean_html(get_element_by_class('VideoInfoPanel__title', webpage)) + return self.playlist_result(self._entries(page_id, section), '%s_%s' % (page_id, section), playlist_title) + + +class VKWallPostIE(VKBaseIE): + IE_NAME = 'vk:wallpost' + _VALID_URL = r'https?://(?:(?:(?:(?:m|new)\.)?vk\.com/(?:[^?]+\?.*\bw=)?wall(?P<id>-?\d+_\d+)))' + _TESTS = [{ + # public page URL, audio playlist + 'url': 'https://vk.com/bs.official?w=wall-23538238_35', + 'info_dict': { + 'id': '-23538238_35', + 'title': 'Black Shadow - Wall post -23538238_35', + 'description': 'md5:190c78f905a53e0de793d83933c6e67f', + }, + 'playlist': [{ + 'md5': '5ba93864ec5b85f7ce19a9af4af080f6', + 'info_dict': { + 'id': '135220665_111806521', + 'ext': 'm4a', + 'title': 'Black Shadow - Слепое Верование', + 'duration': 370, + 'uploader': 'Black Shadow', + 'artist': 'Black Shadow', + 'track': 'Слепое Верование', + }, + }, { + 'md5': '4cc7e804579122b17ea95af7834c9233', + 'info_dict': { + 'id': '135220665_111802303', + 'ext': 'm4a', + 'title': 'Black Shadow - Война - ÐегаÑимое Бездны ПламÑ!', + 'duration': 423, + 'uploader': 'Black Shadow', + 'artist': 'Black Shadow', + 'track': 'Война - ÐегаÑимое Бездны ПламÑ!', + }, + }], + 'params': { + 'skip_download': True, + }, + }, { + # single YouTube embed with irrelevant reaction videos + 'url': 'https://vk.com/wall-32370614_7173954', + 'info_dict': { + 'id': '-32370614_7173954', + 'title': 'md5:9f93c405bbc00061d34007d78c75e3bc', + 'description': 'md5:953b811f26fa9f21ee5856e2ea8e68fc', + }, + 'playlist_count': 1, + }, { + # wall page URL + 'url': 'https://vk.com/wall-23538238_35', + 'only_matching': True, + }, { + # mobile wall page URL + 'url': 'https://m.vk.com/wall-23538238_35', + 'only_matching': True, + }] + _BASE64_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=' + _AUDIO = collections.namedtuple('Audio', ['id', 'owner_id', 'url', 'title', 'performer', 'duration', 'album_id', 'unk', 'author_link', 'lyrics', 'flags', 'context', 'extra', 'hashes', 'cover_url', 'ads']) + + def _decode(self, enc): + dec = '' + e = n = 0 + for c in enc: + r = self._BASE64_CHARS.index(c) + cond = n % 4 + e = 64 * e + r if cond else r + n += 1 + if cond: + dec += chr(255 & e >> (-2 * n & 6)) + return dec + + def _unmask_url(self, mask_url, vk_id): + if 'audio_api_unavailable' in mask_url: + extra = mask_url.split('?extra=')[1].split('#') + func, base = self._decode(extra[1]).split(chr(11)) + mask_url = list(self._decode(extra[0])) + url_len = len(mask_url) + indexes = [None] * url_len + index = int(base) ^ vk_id + for n in range(url_len - 1, -1, -1): + index = (url_len * (n + 1) ^ index + n) % url_len + indexes[n] = index + for n in range(1, url_len): + c = mask_url[n] + index = indexes[url_len - 1 - n] + mask_url[n] = mask_url[index] + mask_url[index] = c + mask_url = ''.join(mask_url) + return mask_url + + def _real_extract(self, url): + post_id = self._match_id(url) + + webpage = self._download_payload('wkview', post_id, { + 'act': 'show', + 'w': 'wall' + post_id, + })[1] + + uploader = clean_html(get_element_by_class('PostHeaderTitle__authorName', webpage)) + + entries = [] + + for audio in re.findall(r'data-audio="([^"]+)', webpage): + audio = self._parse_json(unescapeHTML(audio), post_id) + if not audio['url']: + continue + title = unescapeHTML(audio.get('title')) + artist = unescapeHTML(audio.get('artist')) + entries.append({ + 'id': f'{audio["owner_id"]}_{audio["id"]}', + 'title': join_nonempty(artist, title, delim=' - '), + 'thumbnails': try_call(lambda: [{'url': u} for u in audio['coverUrl'].split(',')]), + 'duration': int_or_none(audio.get('duration')), + 'uploader': uploader, + 'artist': artist, + 'track': title, + 'formats': [{ + 'url': audio['url'], + 'ext': 'm4a', + 'vcodec': 'none', + 'acodec': 'mp3', + 'container': 'm4a_dash', + }], + }) + + entries.extend(self.url_result(urljoin(url, entry), VKIE) for entry in set(re.findall( + r'<a[^>]+href=(?:["\'])(/video(?:-?[\d_]+)[^"\']*)', + get_element_html_by_id('wl_post_body', webpage)))) + + return self.playlist_result( + entries, post_id, join_nonempty(uploader, f'Wall post {post_id}', delim=' - '), + clean_html(get_element_by_class('wall_post_text', webpage))) + + +class VKPlayBaseIE(InfoExtractor): + _RESOLUTIONS = { + 'tiny': '256x144', + 'lowest': '426x240', + 'low': '640x360', + 'medium': '852x480', + 'high': '1280x720', + 'full_hd': '1920x1080', + 'quad_hd': '2560x1440', + } + + def _extract_from_initial_state(self, url, video_id, path): + webpage = self._download_webpage(url, video_id) + video_info = traverse_obj(self._search_json( + r'<script[^>]+\bid="initial-state"[^>]*>', webpage, 'initial state', video_id), + path, expected_type=dict) + if not video_info: + raise ExtractorError('Unable to extract video info from html inline initial state') + return video_info + + def _extract_formats(self, stream_info, video_id): + formats = [] + for stream in traverse_obj(stream_info, ( + 'data', 0, 'playerUrls', lambda _, v: url_or_none(v['url']) and v['type'])): + url = stream['url'] + format_id = str_or_none(stream['type']) + if format_id in ('hls', 'live_hls', 'live_playback_hls') or '.m3u8' in url: + formats.extend(self._extract_m3u8_formats(url, video_id, m3u8_id=format_id, fatal=False)) + elif format_id == 'dash': + formats.extend(self._extract_mpd_formats(url, video_id, mpd_id=format_id, fatal=False)) + elif format_id in ('live_dash', 'live_playback_dash'): + self.write_debug(f'Not extracting unsupported format "{format_id}"') + else: + formats.append({ + 'url': url, + 'ext': 'mp4', + 'format_id': format_id, + **parse_resolution(self._RESOLUTIONS.get(format_id)), + }) + return formats + + def _extract_common_meta(self, stream_info): + return traverse_obj(stream_info, { + 'id': ('id', {str_or_none}), + 'title': ('title', {str}), + 'release_timestamp': ('startTime', {int_or_none}), + 'thumbnail': ('previewUrl', {url_or_none}), + 'view_count': ('count', 'views', {int_or_none}), + 'like_count': ('count', 'likes', {int_or_none}), + 'categories': ('category', 'title', {str}, {lambda x: [x] if x else None}), + 'uploader': (('user', ('blog', 'owner')), 'nick', {str}), + 'uploader_id': (('user', ('blog', 'owner')), 'id', {str_or_none}), + 'duration': ('duration', {int_or_none}), + 'is_live': ('isOnline', {bool}), + 'concurrent_view_count': ('count', 'viewers', {int_or_none}), + }, get_all=False) + + +class VKPlayIE(VKPlayBaseIE): + _VALID_URL = r'https?://vkplay\.live/(?P<username>[^/#?]+)/record/(?P<id>[a-f0-9-]+)' + _TESTS = [{ + 'url': 'https://vkplay.live/zitsmann/record/f5e6e3b5-dc52-4d14-965d-0680dd2882da', + 'info_dict': { + 'id': 'f5e6e3b5-dc52-4d14-965d-0680dd2882da', + 'ext': 'mp4', + 'title': 'Atomic Heart (пробуем!) ÑпаÑибо подпиÑчику EKZO!', + 'uploader': 'ZitsmanN', + 'uploader_id': '13159830', + 'release_timestamp': 1683461378, + 'release_date': '20230507', + 'thumbnail': r're:https://images.vkplay.live/public_video_stream/record/f5e6e3b5-dc52-4d14-965d-0680dd2882da/preview\?change_time=\d+', + 'duration': 10608, + 'view_count': int, + 'like_count': int, + 'categories': ['Atomic Heart'], + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + username, video_id = self._match_valid_url(url).groups() + + record_info = traverse_obj(self._download_json( + f'https://api.vkplay.live/v1/blog/{username}/public_video_stream/record/{video_id}', video_id, fatal=False), + ('data', 'record', {dict})) + if not record_info: + record_info = self._extract_from_initial_state(url, video_id, ('record', 'currentRecord', 'data')) + + return { + **self._extract_common_meta(record_info), + 'id': video_id, + 'formats': self._extract_formats(record_info, video_id), + } + + +class VKPlayLiveIE(VKPlayBaseIE): + _VALID_URL = r'https?://vkplay\.live/(?P<id>[^/#?]+)/?(?:[#?]|$)' + _TESTS = [{ + 'url': 'https://vkplay.live/bayda', + 'info_dict': { + 'id': 'f02c321e-427b-408d-b12f-ae34e53e0ea2', + 'ext': 'mp4', + 'title': r're:ÑÑкапизм крута .*', + 'uploader': 'Bayda', + 'uploader_id': 12279401, + 'release_timestamp': 1687209962, + 'release_date': '20230619', + 'thumbnail': r're:https://images.vkplay.live/public_video_stream/12279401/preview\?change_time=\d+', + 'view_count': int, + 'concurrent_view_count': int, + 'like_count': int, + 'categories': ['EVE Online'], + 'live_status': 'is_live', + }, + 'skip': 'livestream', + 'params': {'skip_download': True}, + }] + + def _real_extract(self, url): + username = self._match_id(url) + + stream_info = self._download_json( + f'https://api.vkplay.live/v1/blog/{username}/public_video_stream', username, fatal=False) + if not stream_info: + stream_info = self._extract_from_initial_state(url, username, ('stream', 'stream', 'data', 'stream')) + + formats = self._extract_formats(stream_info, username) + if not formats and not traverse_obj(stream_info, ('isOnline', {bool})): + raise UserNotLive(video_id=username) + + return { + **self._extract_common_meta(stream_info), + 'formats': formats, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vocaroo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vocaroo.py new file mode 100644 index 0000000..d98fbfd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vocaroo.py @@ -0,0 +1,63 @@ +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import float_or_none + + +class VocarooIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?(?:vocaroo\.com|voca\.ro)/(?:embed/)?(?P<id>\w+)' + _EMBED_REGEX = [r'<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?(?:www\.)?vocaroo\.com/embed/.+?)\1'] + _TESTS = [ + { + 'url': 'https://vocaroo.com/1de8yA3LNe77', + 'md5': 'c557841d5e50261777a6585648adf439', + 'info_dict': { + 'id': '1de8yA3LNe77', + 'ext': 'mp3', + 'title': 'Vocaroo video #1de8yA3LNe77', + 'timestamp': 1675059800.370, + 'upload_date': '20230130', + }, + }, + { + 'url': 'https://vocaroo.com/embed/12WqtjLnpj6g?autoplay=0', + 'only_matching': True, + }, + { + 'url': 'https://voca.ro/12D52rgpzkB0', + 'only_matching': True, + }, + ] + + _WEBPAGE_TESTS = [ + { + 'url': 'https://qbnu.github.io/cool.html', + 'md5': 'f322e529275dd8a47994919eeac404a5', + 'info_dict': { + 'id': '19cgWmKO6AmC', + 'ext': 'mp3', + 'title': 'Vocaroo video #19cgWmKO6AmC', + 'timestamp': 1675093841.408, + 'upload_date': '20230130', + }, + }, + ] + + def _real_extract(self, url): + audio_id = self._match_id(url) + if len(audio_id) == 10 or (len(audio_id) == 12 and audio_id[0] == '1'): + media_subdomain = 'media1' + else: + media_subdomain = 'media' + + url = f'https://{media_subdomain}.vocaroo.com/mp3/{audio_id}' + http_headers = {'Referer': 'https://vocaroo.com/'} + resp = self._request_webpage(HEADRequest(url), audio_id, headers=http_headers) + return { + 'id': audio_id, + 'title': '', + 'url': url, + 'ext': 'mp3', + 'timestamp': float_or_none(resp.getheader('x-bz-upload-timestamp'), scale=1000), + 'vcodec': 'none', + 'http_headers': http_headers, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vodlocker.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vodlocker.py new file mode 100644 index 0000000..b215d6c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vodlocker.py @@ -0,0 +1,73 @@ +from .common import InfoExtractor +from ..networking import Request +from ..utils import NO_DEFAULT, ExtractorError, urlencode_postdata + + +class VodlockerIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?vodlocker\.(?:com|city)/(?:embed-)?(?P<id>[0-9a-zA-Z]+)(?:\..*?)?' + + _TESTS = [{ + 'url': 'http://vodlocker.com/e8wvyzz4sl42', + 'md5': 'ce0c2d18fa0735f1bd91b69b0e54aacf', + 'info_dict': { + 'id': 'e8wvyzz4sl42', + 'ext': 'mp4', + 'title': 'Germany vs Brazil', + 'thumbnail': r're:http://.*\.jpg', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + if any(p in webpage for p in ( + '>THIS FILE WAS DELETED<', + '>File Not Found<', + 'The file you were looking for could not be found, sorry for any inconvenience.<', + '>The file was removed')): + raise ExtractorError('Video %s does not exist' % video_id, expected=True) + + fields = self._hidden_inputs(webpage) + + if fields['op'] == 'download1': + self._sleep(3, video_id) # they do detect when requests happen too fast! + post = urlencode_postdata(fields) + req = Request(url, post) + req.headers['Content-type'] = 'application/x-www-form-urlencoded' + webpage = self._download_webpage( + req, video_id, 'Downloading video page') + + def extract_file_url(html, default=NO_DEFAULT): + return self._search_regex( + r'file:\s*"(http[^\"]+)",', html, 'file url', default=default) + + video_url = extract_file_url(webpage, default=None) + + if not video_url: + embed_url = self._search_regex( + r'<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?vodlocker\.(?:com|city)/embed-.+?)\1', + webpage, 'embed url', group='url') + embed_webpage = self._download_webpage( + embed_url, video_id, 'Downloading embed webpage') + video_url = extract_file_url(embed_webpage) + thumbnail_webpage = embed_webpage + else: + thumbnail_webpage = webpage + + title = self._search_regex( + r'id="file_title".*?>\s*(.*?)\s*<(?:br|span)', webpage, 'title') + thumbnail = self._search_regex( + r'image:\s*"(http[^\"]+)",', thumbnail_webpage, 'thumbnail', fatal=False) + + formats = [{ + 'format_id': 'sd', + 'url': video_url, + }] + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'formats': formats, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vodpl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vodpl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vodpl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vodpl.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vodplatform.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vodplatform.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vodplatform.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vodplatform.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/voicerepublic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/voicerepublic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/voicerepublic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/voicerepublic.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/voicy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/voicy.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/voicy.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/voicy.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/volejtv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/volejtv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/volejtv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/volejtv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/voot.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/voot.py new file mode 100644 index 0000000..b19a279 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/voot.py @@ -0,0 +1,210 @@ +import json +import time +import uuid + +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + float_or_none, + int_or_none, + jwt_decode_hs256, + parse_age_limit, + traverse_obj, + try_call, + try_get, + unified_strdate, +) + + +class VootBaseIE(InfoExtractor): + _NETRC_MACHINE = 'voot' + _GEO_BYPASS = False + _LOGIN_HINT = 'Log in with "-u <email_address> -p <password>", or use "-u token -p <auth_token>" to login with auth token.' + _TOKEN = None + _EXPIRY = 0 + _API_HEADERS = {'Origin': 'https://www.voot.com', 'Referer': 'https://www.voot.com/'} + + def _perform_login(self, username, password): + if self._TOKEN and self._EXPIRY: + return + + if username.lower() == 'token' and try_call(lambda: jwt_decode_hs256(password)): + VootBaseIE._TOKEN = password + VootBaseIE._EXPIRY = jwt_decode_hs256(password)['exp'] + self.report_login() + + # Mobile number as username is not supported + elif not username.isdigit(): + check_username = self._download_json( + 'https://userauth.voot.com/usersV3/v3/checkUser', None, data=json.dumps({ + 'type': 'email', + 'email': username + }, separators=(',', ':')).encode(), headers={ + **self._API_HEADERS, + 'Content-Type': 'application/json;charset=utf-8', + }, note='Checking username', expected_status=403) + if not traverse_obj(check_username, ('isExist', {bool})): + if traverse_obj(check_username, ('status', 'code', {int})) == 9999: + self.raise_geo_restricted(countries=['IN']) + raise ExtractorError('Incorrect username', expected=True) + auth_token = traverse_obj(self._download_json( + 'https://userauth.voot.com/usersV3/v3/login', None, data=json.dumps({ + 'type': 'traditional', + 'deviceId': str(uuid.uuid4()), + 'deviceBrand': 'PC/MAC', + 'data': { + 'email': username, + 'password': password + } + }, separators=(',', ':')).encode(), headers={ + **self._API_HEADERS, + 'Content-Type': 'application/json;charset=utf-8', + }, note='Logging in', expected_status=400), ('data', 'authToken', {dict})) + if not auth_token: + raise ExtractorError('Incorrect password', expected=True) + VootBaseIE._TOKEN = auth_token['accessToken'] + VootBaseIE._EXPIRY = auth_token['expirationTime'] + + else: + raise ExtractorError(self._LOGIN_HINT, expected=True) + + def _check_token_expiry(self): + if int(time.time()) >= self._EXPIRY: + raise ExtractorError('Access token has expired', expected=True) + + def _real_initialize(self): + if not self._TOKEN: + self.raise_login_required(self._LOGIN_HINT, method=None) + self._check_token_expiry() + + +class VootIE(VootBaseIE): + _VALID_URL = r'''(?x) + (?: + voot:| + https?://(?:www\.)?voot\.com/? + (?: + movies?/[^/]+/| + (?:shows|kids)/(?:[^/]+/){4} + ) + ) + (?P<id>\d{3,}) + ''' + _TESTS = [{ + 'url': 'https://www.voot.com/shows/ishq-ka-rang-safed/1/360558/is-this-the-end-of-kamini-/441353', + 'info_dict': { + 'id': '441353', + 'ext': 'mp4', + 'title': 'Is this the end of Kamini?', + 'description': 'md5:06291fbbbc4dcbe21235c40c262507c1', + 'timestamp': 1472103000, + 'upload_date': '20160825', + 'series': 'Ishq Ka Rang Safed', + 'season_number': 1, + 'episode': 'Is this the end of Kamini?', + 'episode_number': 340, + 'release_date': '20160825', + 'season': 'Season 1', + 'age_limit': 13, + 'duration': 1146.0, + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://www.voot.com/kids/characters/mighty-cat-masked-niyander-e-/400478/school-bag-disappears/440925', + 'only_matching': True, + }, { + 'url': 'https://www.voot.com/movies/pandavas-5/424627', + 'only_matching': True, + }, { + 'url': 'https://www.voot.com/movie/fight-club/621842', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + media_info = self._download_json( + 'https://psapi.voot.com/jio/voot/v1/voot-web/content/query/asset-details', video_id, + query={'ids': f'include:{video_id}', 'responseType': 'common'}, headers={'accesstoken': self._TOKEN}) + + try: + m3u8_url = self._download_json( + 'https://vootapi.media.jio.com/playback/v1/playbackrights', video_id, + 'Downloading playback JSON', data=b'{}', headers={ + **self.geo_verification_headers(), + **self._API_HEADERS, + 'Content-Type': 'application/json;charset=utf-8', + 'platform': 'androidwebdesktop', + 'vootid': video_id, + 'voottoken': self._TOKEN, + })['m3u8'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 400: + self._check_token_expiry() + raise + + formats = self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', m3u8_id='hls') + self._remove_duplicate_formats(formats) + + return { + 'id': video_id, + # '/_definst_/smil:vod/' m3u8 manifests claim to have 720p+ formats but max out at 480p + 'formats': traverse_obj(formats, ( + lambda _, v: '/_definst_/smil:vod/' not in v['url'] or v['height'] <= 480)), + 'http_headers': self._API_HEADERS, + **traverse_obj(media_info, ('result', 0, { + 'title': ('fullTitle', {str}), + 'description': ('fullSynopsis', {str}), + 'series': ('showName', {str}), + 'season_number': ('season', {int_or_none}), + 'episode': ('fullTitle', {str}), + 'episode_number': ('episode', {int_or_none}), + 'timestamp': ('uploadTime', {int_or_none}), + 'release_date': ('telecastDate', {unified_strdate}), + 'age_limit': ('ageNemonic', {parse_age_limit}), + 'duration': ('duration', {float_or_none}), + })), + } + + +class VootSeriesIE(VootBaseIE): + _VALID_URL = r'https?://(?:www\.)?voot\.com/shows/[^/]+/(?P<id>\d{3,})' + _TESTS = [{ + 'url': 'https://www.voot.com/shows/chakravartin-ashoka-samrat/100002', + 'playlist_mincount': 442, + 'info_dict': { + 'id': '100002', + }, + }, { + 'url': 'https://www.voot.com/shows/ishq-ka-rang-safed/100003', + 'playlist_mincount': 341, + 'info_dict': { + 'id': '100003', + }, + }] + _SHOW_API = 'https://psapi.voot.com/media/voot/v1/voot-web/content/generic/season-by-show?sort=season%3Aasc&id={}&responseType=common' + _SEASON_API = 'https://psapi.voot.com/media/voot/v1/voot-web/content/generic/series-wise-episode?sort=episode%3Aasc&id={}&responseType=common&page={:d}' + + def _entries(self, show_id): + show_json = self._download_json(self._SHOW_API.format(show_id), video_id=show_id) + for season in show_json.get('result', []): + page_num = 1 + season_id = try_get(season, lambda x: x['id'], compat_str) + season_json = self._download_json(self._SEASON_API.format(season_id, page_num), + video_id=season_id, + note='Downloading JSON metadata page %d' % page_num) + episodes_json = season_json.get('result', []) + while episodes_json: + page_num += 1 + for episode in episodes_json: + video_id = episode.get('id') + yield self.url_result( + 'voot:%s' % video_id, ie=VootIE.ie_key(), video_id=video_id) + episodes_json = self._download_json(self._SEASON_API.format(season_id, page_num), + video_id=season_id, + note='Downloading JSON metadata page %d' % page_num)['result'] + + def _real_extract(self, url): + show_id = self._match_id(url) + return self.playlist_result(self._entries(show_id), playlist_id=show_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/voxmedia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/voxmedia.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/voxmedia.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/voxmedia.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vrak.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vrak.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vrak.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vrak.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vrt.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vrt.py new file mode 100644 index 0000000..497233d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vrt.py @@ -0,0 +1,427 @@ +import functools +import json +import time +import urllib.parse + +from .gigya import GigyaBaseIE +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + clean_html, + extract_attributes, + float_or_none, + get_element_by_class, + get_element_html_by_class, + int_or_none, + join_nonempty, + jwt_encode_hs256, + make_archive_id, + parse_age_limit, + parse_iso8601, + str_or_none, + strip_or_none, + traverse_obj, + url_or_none, + urlencode_postdata, +) + + +class VRTBaseIE(GigyaBaseIE): + _GEO_BYPASS = False + _PLAYER_INFO = { + 'platform': 'desktop', + 'app': { + 'type': 'browser', + 'name': 'Chrome', + }, + 'device': 'undefined (undefined)', + 'os': { + 'name': 'Windows', + 'version': 'x86_64' + }, + 'player': { + 'name': 'VRT web player', + 'version': '2.7.4-prod-2023-04-19T06:05:45' + } + } + # From https://player.vrt.be/vrtnws/js/main.js & https://player.vrt.be/ketnet/js/main.8cdb11341bcb79e4cd44.js + _JWT_KEY_ID = '0-0Fp51UZykfaiCJrfTE3+oMI8zvDteYfPtR+2n1R+z8w=' + _JWT_SIGNING_KEY = 'b5f500d55cb44715107249ccd8a5c0136cfb2788dbb71b90a4f142423bacaf38' # -dev + # player-stag.vrt.be key: d23987504521ae6fbf2716caca6700a24bb1579477b43c84e146b279de5ca595 + # player.vrt.be key: 2a9251d782700769fb856da5725daf38661874ca6f80ae7dc2b05ec1a81a24ae + + def _extract_formats_and_subtitles(self, data, video_id): + if traverse_obj(data, 'drm'): + self.report_drm(video_id) + + formats, subtitles = [], {} + for target in traverse_obj(data, ('targetUrls', lambda _, v: url_or_none(v['url']) and v['type'])): + format_type = target['type'].upper() + format_url = target['url'] + if format_type in ('HLS', 'HLS_AES'): + fmts, subs = self._extract_m3u8_formats_and_subtitles( + format_url, video_id, 'mp4', m3u8_id=format_type, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif format_type == 'HDS': + formats.extend(self._extract_f4m_formats( + format_url, video_id, f4m_id=format_type, fatal=False)) + elif format_type == 'MPEG_DASH': + fmts, subs = self._extract_mpd_formats_and_subtitles( + format_url, video_id, mpd_id=format_type, fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif format_type == 'HSS': + fmts, subs = self._extract_ism_formats_and_subtitles( + format_url, video_id, ism_id='mss', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'format_id': format_type, + 'url': format_url, + }) + + for sub in traverse_obj(data, ('subtitleUrls', lambda _, v: v['url'] and v['type'] == 'CLOSED')): + subtitles.setdefault('nl', []).append({'url': sub['url']}) + + return formats, subtitles + + def _call_api(self, video_id, client='null', id_token=None, version='v2'): + player_info = {'exp': (round(time.time(), 3) + 900), **self._PLAYER_INFO} + player_token = self._download_json( + 'https://media-services-public.vrt.be/vualto-video-aggregator-web/rest/external/v2/tokens', + video_id, 'Downloading player token', headers={ + **self.geo_verification_headers(), + 'Content-Type': 'application/json', + }, data=json.dumps({ + 'identityToken': id_token or {}, + 'playerInfo': jwt_encode_hs256(player_info, self._JWT_SIGNING_KEY, headers={ + 'kid': self._JWT_KEY_ID + }).decode() + }, separators=(',', ':')).encode())['vrtPlayerToken'] + + return self._download_json( + f'https://media-services-public.vrt.be/media-aggregator/{version}/media-items/{video_id}', + video_id, 'Downloading API JSON', query={ + 'vrtPlayerToken': player_token, + 'client': client, + }, expected_status=400) + + +class VRTIE(VRTBaseIE): + IE_DESC = 'VRT NWS, Flanders News, Flandern Info and Sporza' + _VALID_URL = r'https?://(?:www\.)?(?P<site>vrt\.be/vrtnws|sporza\.be)/[a-z]{2}/\d{4}/\d{2}/\d{2}/(?P<id>[^/?&#]+)' + _TESTS = [{ + 'url': 'https://www.vrt.be/vrtnws/nl/2019/05/15/beelden-van-binnenkant-notre-dame-een-maand-na-de-brand/', + 'info_dict': { + 'id': 'pbs-pub-7855fc7b-1448-49bc-b073-316cb60caa71$vid-2ca50305-c38a-4762-9890-65cbd098b7bd', + 'ext': 'mp4', + 'title': 'Beelden van binnenkant Notre-Dame, één maand na de brand', + 'description': 'md5:6fd85f999b2d1841aa5568f4bf02c3ff', + 'duration': 31.2, + 'thumbnail': 'https://images.vrt.be/orig/2019/05/15/2d914d61-7710-11e9-abcc-02b7b76bf47f.jpg', + }, + 'params': {'skip_download': 'm3u8'}, + }, { + 'url': 'https://sporza.be/nl/2019/05/15/de-belgian-cats-zijn-klaar-voor-het-ek/', + 'info_dict': { + 'id': 'pbs-pub-f2c86a46-8138-413a-a4b9-a0015a16ce2c$vid-1f112b31-e58e-4379-908d-aca6d80f8818', + 'ext': 'mp4', + 'title': 'De Belgian Cats zijn klaar voor het EK', + 'description': 'Video: De Belgian Cats zijn klaar voor het EK mét Ann Wauters | basketbal, sport in het journaal', + 'duration': 115.17, + 'thumbnail': 'https://images.vrt.be/orig/2019/05/15/11c0dba3-770e-11e9-abcc-02b7b76bf47f.jpg', + }, + 'params': {'skip_download': 'm3u8'}, + }] + _CLIENT_MAP = { + 'vrt.be/vrtnws': 'vrtnieuws', + 'sporza.be': 'sporza', + } + + def _real_extract(self, url): + site, display_id = self._match_valid_url(url).groups() + webpage = self._download_webpage(url, display_id) + attrs = extract_attributes(get_element_html_by_class('vrtvideo', webpage) or '') + + asset_id = attrs.get('data-video-id') or attrs['data-videoid'] + publication_id = traverse_obj(attrs, 'data-publication-id', 'data-publicationid') + if publication_id: + asset_id = f'{publication_id}${asset_id}' + client = traverse_obj(attrs, 'data-client-code', 'data-client') or self._CLIENT_MAP[site] + + data = self._call_api(asset_id, client) + formats, subtitles = self._extract_formats_and_subtitles(data, asset_id) + + description = self._html_search_meta( + ['og:description', 'twitter:description', 'description'], webpage) + if description == '…': + description = None + + return { + 'id': asset_id, + 'formats': formats, + 'subtitles': subtitles, + 'description': description, + 'thumbnail': url_or_none(attrs.get('data-posterimage')), + 'duration': float_or_none(attrs.get('data-duration'), 1000), + '_old_archive_ids': [make_archive_id('Canvas', asset_id)], + **traverse_obj(data, { + 'title': ('title', {str}), + 'description': ('shortDescription', {str}), + 'duration': ('duration', {functools.partial(float_or_none, scale=1000)}), + 'thumbnail': ('posterImageUrl', {url_or_none}), + }), + } + + +class VrtNUIE(VRTBaseIE): + IE_DESC = 'VRT MAX' + _VALID_URL = r'https?://(?:www\.)?vrt\.be/vrtnu/a-z/(?:[^/]+/){2}(?P<id>[^/?#&]+)' + _TESTS = [{ + # CONTENT_IS_AGE_RESTRICTED + 'url': 'https://www.vrt.be/vrtnu/a-z/de-ideale-wereld/2023-vj/de-ideale-wereld-d20230116/', + 'info_dict': { + 'id': 'pbs-pub-855b00a8-6ce2-4032-ac4f-1fcf3ae78524$vid-d2243aa1-ec46-4e34-a55b-92568459906f', + 'ext': 'mp4', + 'title': 'Tom Waes', + 'description': 'Satirisch actualiteitenmagazine met Ella Leyers. Tom Waes is te gast.', + 'timestamp': 1673905125, + 'release_timestamp': 1673905125, + 'series': 'De ideale wereld', + 'season_id': '1672830988794', + 'episode': 'Aflevering 1', + 'episode_number': 1, + 'episode_id': '1672830988861', + 'display_id': 'de-ideale-wereld-d20230116', + 'channel': 'VRT', + 'duration': 1939.0, + 'thumbnail': 'https://images.vrt.be/orig/2023/01/10/1bb39cb3-9115-11ed-b07d-02b7b76bf47f.jpg', + 'release_date': '20230116', + 'upload_date': '20230116', + 'age_limit': 12, + }, + }, { + 'url': 'https://www.vrt.be/vrtnu/a-z/buurman--wat-doet-u-nu-/6/buurman--wat-doet-u-nu--s6-trailer/', + 'info_dict': { + 'id': 'pbs-pub-ad4050eb-d9e5-48c2-9ec8-b6c355032361$vid-0465537a-34a8-4617-8352-4d8d983b4eee', + 'ext': 'mp4', + 'title': 'Trailer seizoen 6 \'Buurman, wat doet u nu?\'', + 'description': 'md5:197424726c61384b4e5c519f16c0cf02', + 'timestamp': 1652940000, + 'release_timestamp': 1652940000, + 'series': 'Buurman, wat doet u nu?', + 'season': 'Seizoen 6', + 'season_number': 6, + 'season_id': '1652344200907', + 'episode': 'Aflevering 0', + 'episode_number': 0, + 'episode_id': '1652951873524', + 'display_id': 'buurman--wat-doet-u-nu--s6-trailer', + 'channel': 'VRT', + 'duration': 33.13, + 'thumbnail': 'https://images.vrt.be/orig/2022/05/23/3c234d21-da83-11ec-b07d-02b7b76bf47f.jpg', + 'release_date': '20220519', + 'upload_date': '20220519', + }, + 'params': {'skip_download': 'm3u8'}, + }] + _NETRC_MACHINE = 'vrtnu' + _authenticated = False + + def _perform_login(self, username, password): + auth_info = self._gigya_login({ + 'APIKey': '3_0Z2HujMtiWq_pkAjgnS2Md2E11a1AwZjYiBETtwNE-EoEHDINgtnvcAOpNgmrVGy', + 'targetEnv': 'jssdk', + 'loginID': username, + 'password': password, + 'authMode': 'cookie', + }) + + if auth_info.get('errorDetails'): + raise ExtractorError(f'Unable to login. VrtNU said: {auth_info["errorDetails"]}', expected=True) + + # Sometimes authentication fails for no good reason, retry + for retry in self.RetryManager(): + if retry.attempt > 1: + self._sleep(1, None) + try: + self._request_webpage( + 'https://token.vrt.be/vrtnuinitlogin', None, note='Requesting XSRF Token', + errnote='Could not get XSRF Token', query={ + 'provider': 'site', + 'destination': 'https://www.vrt.be/vrtnu/', + }) + self._request_webpage( + 'https://login.vrt.be/perform_login', None, + note='Performing login', errnote='Login failed', + query={'client_id': 'vrtnu-site'}, data=urlencode_postdata({ + 'UID': auth_info['UID'], + 'UIDSignature': auth_info['UIDSignature'], + 'signatureTimestamp': auth_info['signatureTimestamp'], + '_csrf': self._get_cookies('https://login.vrt.be').get('OIDCXSRF').value, + })) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + retry.error = e + continue + raise + + self._authenticated = True + + def _real_extract(self, url): + display_id = self._match_id(url) + parsed_url = urllib.parse.urlparse(url) + details = self._download_json( + f'{parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path.rstrip("/")}.model.json', + display_id, 'Downloading asset JSON', 'Unable to download asset JSON')['details'] + + watch_info = traverse_obj(details, ( + 'actions', lambda _, v: v['type'] == 'watch-episode', {dict}), get_all=False) or {} + video_id = join_nonempty( + 'episodePublicationId', 'episodeVideoId', delim='$', from_dict=watch_info) + if '$' not in video_id: + raise ExtractorError('Unable to extract video ID') + + vrtnutoken = self._download_json( + 'https://token.vrt.be/refreshtoken', video_id, note='Retrieving vrtnutoken', + errnote='Token refresh failed')['vrtnutoken'] if self._authenticated else None + + video_info = self._call_api(video_id, 'vrtnu-web@PROD', vrtnutoken) + + if 'title' not in video_info: + code = video_info.get('code') + if code in ('AUTHENTICATION_REQUIRED', 'CONTENT_IS_AGE_RESTRICTED'): + self.raise_login_required(code, method='password') + elif code in ('INVALID_LOCATION', 'CONTENT_AVAILABLE_ONLY_IN_BE'): + self.raise_geo_restricted(countries=['BE']) + elif code == 'CONTENT_AVAILABLE_ONLY_FOR_BE_RESIDENTS_AND_EXPATS': + if not self._authenticated: + self.raise_login_required(code, method='password') + self.raise_geo_restricted(countries=['BE']) + raise ExtractorError(code, expected=True) + + formats, subtitles = self._extract_formats_and_subtitles(video_info, video_id) + + return { + **traverse_obj(details, { + 'title': 'title', + 'description': ('description', {clean_html}), + 'timestamp': ('data', 'episode', 'onTime', 'raw', {parse_iso8601}), + 'release_timestamp': ('data', 'episode', 'onTime', 'raw', {parse_iso8601}), + 'series': ('data', 'program', 'title'), + 'season': ('data', 'season', 'title', 'value'), + 'season_number': ('data', 'season', 'title', 'raw', {int_or_none}), + 'season_id': ('data', 'season', 'id', {str_or_none}), + 'episode': ('data', 'episode', 'number', 'value', {str_or_none}), + 'episode_number': ('data', 'episode', 'number', 'raw', {int_or_none}), + 'episode_id': ('data', 'episode', 'id', {str_or_none}), + 'age_limit': ('data', 'episode', 'age', 'raw', {parse_age_limit}), + }), + 'id': video_id, + 'display_id': display_id, + 'channel': 'VRT', + 'formats': formats, + 'duration': float_or_none(video_info.get('duration'), 1000), + 'thumbnail': url_or_none(video_info.get('posterImageUrl')), + 'subtitles': subtitles, + '_old_archive_ids': [make_archive_id('Canvas', video_id)], + } + + +class KetnetIE(VRTBaseIE): + _VALID_URL = r'https?://(?:www\.)?ketnet\.be/(?P<id>(?:[^/]+/)*[^/?#&]+)' + _TESTS = [{ + 'url': 'https://www.ketnet.be/kijken/m/meisjes/6/meisjes-s6a5', + 'info_dict': { + 'id': 'pbs-pub-39f8351c-a0a0-43e6-8394-205d597d6162$vid-5e306921-a9aa-4fa9-9f39-5b82c8f1028e', + 'ext': 'mp4', + 'title': 'Meisjes', + 'episode': 'Reeks 6: Week 5', + 'season': 'Reeks 6', + 'series': 'Meisjes', + 'timestamp': 1685251800, + 'upload_date': '20230528', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + + video = self._download_json( + 'https://senior-bff.ketnet.be/graphql', display_id, query={ + 'query': '''{ + video(id: "content/ketnet/nl/%s.model.json") { + description + episodeNr + imageUrl + mediaReference + programTitle + publicationDate + seasonTitle + subtitleVideodetail + titleVideodetail + } +}''' % display_id, + })['data']['video'] + + video_id = urllib.parse.unquote(video['mediaReference']) + data = self._call_api(video_id, 'ketnet@PROD', version='v1') + formats, subtitles = self._extract_formats_and_subtitles(data, video_id) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + '_old_archive_ids': [make_archive_id('Canvas', video_id)], + **traverse_obj(video, { + 'title': ('titleVideodetail', {str}), + 'description': ('description', {str}), + 'thumbnail': ('thumbnail', {url_or_none}), + 'timestamp': ('publicationDate', {parse_iso8601}), + 'series': ('programTitle', {str}), + 'season': ('seasonTitle', {str}), + 'episode': ('subtitleVideodetail', {str}), + 'episode_number': ('episodeNr', {int_or_none}), + }), + } + + +class DagelijkseKostIE(VRTBaseIE): + IE_DESC = 'dagelijksekost.een.be' + _VALID_URL = r'https?://dagelijksekost\.een\.be/gerechten/(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://dagelijksekost.een.be/gerechten/hachis-parmentier-met-witloof', + 'info_dict': { + 'id': 'md-ast-27a4d1ff-7d7b-425e-b84f-a4d227f592fa', + 'ext': 'mp4', + 'title': 'Hachis parmentier met witloof', + 'description': 'md5:9960478392d87f63567b5b117688cdc5', + 'display_id': 'hachis-parmentier-met-witloof', + }, + 'params': {'skip_download': 'm3u8'}, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + video_id = self._html_search_regex( + r'data-url=(["\'])(?P<id>(?:(?!\1).)+)\1', webpage, 'video id', group='id') + + data = self._call_api(video_id, 'dako@prod', version='v1') + formats, subtitles = self._extract_formats_and_subtitles(data, video_id) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + 'display_id': display_id, + 'title': strip_or_none(get_element_by_class( + 'dish-metadata__title', webpage) or self._html_search_meta('twitter:title', webpage)), + 'description': clean_html(get_element_by_class( + 'dish-description', webpage)) or self._html_search_meta( + ['description', 'twitter:description', 'og:description'], webpage), + '_old_archive_ids': [make_archive_id('Canvas', video_id)], + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vrv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vrv.py new file mode 100644 index 0000000..523c442 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vrv.py @@ -0,0 +1,269 @@ +import base64 +import hashlib +import hmac +import json +import random +import string +import time +import urllib.parse + +from .common import InfoExtractor +from ..compat import compat_urllib_parse_urlencode +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + float_or_none, + int_or_none, + join_nonempty, + traverse_obj, +) + + +class VRVBaseIE(InfoExtractor): + _API_DOMAIN = None + _API_PARAMS = {} + _CMS_SIGNING = {} + _TOKEN = None + _TOKEN_SECRET = '' + + def _call_api(self, path, video_id, note, data=None): + # https://tools.ietf.org/html/rfc5849#section-3 + base_url = self._API_DOMAIN + '/core/' + path + query = [ + ('oauth_consumer_key', self._API_PARAMS['oAuthKey']), + ('oauth_nonce', ''.join(random.choices(string.ascii_letters, k=32))), + ('oauth_signature_method', 'HMAC-SHA1'), + ('oauth_timestamp', int(time.time())), + ] + if self._TOKEN: + query.append(('oauth_token', self._TOKEN)) + encoded_query = compat_urllib_parse_urlencode(query) + headers = self.geo_verification_headers() + if data: + data = json.dumps(data).encode() + headers['Content-Type'] = 'application/json' + base_string = '&'.join([ + 'POST' if data else 'GET', + urllib.parse.quote(base_url, ''), + urllib.parse.quote(encoded_query, '')]) + oauth_signature = base64.b64encode(hmac.new( + (self._API_PARAMS['oAuthSecret'] + '&' + self._TOKEN_SECRET).encode('ascii'), + base_string.encode(), hashlib.sha1).digest()).decode() + encoded_query += '&oauth_signature=' + urllib.parse.quote(oauth_signature, '') + try: + return self._download_json( + '?'.join([base_url, encoded_query]), video_id, + note='Downloading %s JSON metadata' % note, headers=headers, data=data) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + raise ExtractorError(json.loads(e.cause.response.read().decode())['message'], expected=True) + raise + + def _call_cms(self, path, video_id, note): + if not self._CMS_SIGNING: + index = self._call_api('index', video_id, 'CMS Signing') + self._CMS_SIGNING = index.get('cms_signing') or {} + if not self._CMS_SIGNING: + for signing_policy in index.get('signing_policies', []): + signing_path = signing_policy.get('path') + if signing_path and signing_path.startswith('/cms/'): + name, value = signing_policy.get('name'), signing_policy.get('value') + if name and value: + self._CMS_SIGNING[name] = value + return self._download_json( + self._API_DOMAIN + path, video_id, query=self._CMS_SIGNING, + note='Downloading %s JSON metadata' % note, headers=self.geo_verification_headers()) + + def _get_cms_resource(self, resource_key, video_id): + return self._call_api( + 'cms_resource', video_id, 'resource path', data={ + 'resource_key': resource_key, + })['__links__']['cms_resource']['href'] + + def _extract_vrv_formats(self, url, video_id, stream_format, audio_lang, hardsub_lang): + if not url or stream_format not in ('hls', 'dash', 'adaptive_hls'): + return [] + format_id = join_nonempty( + stream_format, + audio_lang and 'audio-%s' % audio_lang, + hardsub_lang and 'hardsub-%s' % hardsub_lang) + if 'hls' in stream_format: + adaptive_formats = self._extract_m3u8_formats( + url, video_id, 'mp4', m3u8_id=format_id, + note='Downloading %s information' % format_id, + fatal=False) + elif stream_format == 'dash': + adaptive_formats = self._extract_mpd_formats( + url, video_id, mpd_id=format_id, + note='Downloading %s information' % format_id, + fatal=False) + if audio_lang: + for f in adaptive_formats: + if f.get('acodec') != 'none': + f['language'] = audio_lang + return adaptive_formats + + def _set_api_params(self): + webpage = self._download_webpage( + 'https://vrv.co/', None, headers=self.geo_verification_headers()) + self._API_PARAMS = self._parse_json(self._search_regex( + [ + r'window\.__APP_CONFIG__\s*=\s*({.+?})(?:</script>|;)', + r'window\.__APP_CONFIG__\s*=\s*({.+})' + ], webpage, 'app config'), None)['cxApiParams'] + self._API_DOMAIN = self._API_PARAMS.get('apiDomain', 'https://api.vrv.co') + + +class VRVIE(VRVBaseIE): + IE_NAME = 'vrv' + _VALID_URL = r'https?://(?:www\.)?vrv\.co/watch/(?P<id>[A-Z0-9]+)' + _TESTS = [{ + 'url': 'https://vrv.co/watch/GR9PNZ396/Hidden-America-with-Jonah-Ray:BOSTON-WHERE-THE-PAST-IS-THE-PRESENT', + 'info_dict': { + 'id': 'GR9PNZ396', + 'ext': 'mp4', + 'title': 'BOSTON: WHERE THE PAST IS THE PRESENT', + 'description': 'md5:4ec8844ac262ca2df9e67c0983c6b83f', + 'uploader_id': 'seeso', + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + }, { + # movie listing + 'url': 'https://vrv.co/watch/G6NQXZ1J6/Lily-CAT', + 'info_dict': { + 'id': 'G6NQXZ1J6', + 'title': 'Lily C.A.T', + 'description': 'md5:988b031e7809a6aeb60968be4af7db07', + }, + 'playlist_count': 2, + }] + _NETRC_MACHINE = 'vrv' + + def _perform_login(self, username, password): + token_credentials = self._call_api( + 'authenticate/by:credentials', None, 'Token Credentials', data={ + 'email': username, + 'password': password, + }) + self._TOKEN = token_credentials['oauth_token'] + self._TOKEN_SECRET = token_credentials['oauth_token_secret'] + + def _initialize_pre_login(self): + return self._set_api_params() + + def _real_extract(self, url): + video_id = self._match_id(url) + + object_data = self._call_cms(self._get_cms_resource( + 'cms:/objects/' + video_id, video_id), video_id, 'object')['items'][0] + resource_path = object_data['__links__']['resource']['href'] + video_data = self._call_cms(resource_path, video_id, 'video') + title = video_data['title'] + description = video_data.get('description') + + if video_data.get('__class__') == 'movie_listing': + items = self._call_cms( + video_data['__links__']['movie_listing/movies']['href'], + video_id, 'movie listing').get('items') or [] + if len(items) != 1: + entries = [] + for item in items: + item_id = item.get('id') + if not item_id: + continue + entries.append(self.url_result( + 'https://vrv.co/watch/' + item_id, + self.ie_key(), item_id, item.get('title'))) + return self.playlist_result(entries, video_id, title, description) + video_data = items[0] + + streams_path = video_data['__links__'].get('streams', {}).get('href') + if not streams_path: + self.raise_login_required() + streams_json = self._call_cms(streams_path, video_id, 'streams') + + audio_locale = streams_json.get('audio_locale') + formats = [] + for stream_type, streams in streams_json.get('streams', {}).items(): + if stream_type in ('adaptive_hls', 'adaptive_dash'): + for stream in streams.values(): + formats.extend(self._extract_vrv_formats( + stream.get('url'), video_id, stream_type.split('_')[1], + audio_locale, stream.get('hardsub_locale'))) + + subtitles = {} + for k in ('captions', 'subtitles'): + for subtitle in streams_json.get(k, {}).values(): + subtitle_url = subtitle.get('url') + if not subtitle_url: + continue + subtitles.setdefault(subtitle.get('locale', 'en-US'), []).append({ + 'url': subtitle_url, + 'ext': subtitle.get('format', 'ass'), + }) + + thumbnails = [] + for thumbnail in traverse_obj(video_data, ('images', 'thumbnail', ..., ...)) or []: + thumbnail_url = thumbnail.get('source') + if not thumbnail_url: + continue + thumbnails.append({ + 'url': thumbnail_url, + 'width': int_or_none(thumbnail.get('width')), + 'height': int_or_none(thumbnail.get('height')), + }) + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnails': thumbnails, + 'description': description, + 'duration': float_or_none(video_data.get('duration_ms'), 1000), + 'uploader_id': video_data.get('channel_id'), + 'series': video_data.get('series_title'), + 'season': video_data.get('season_title'), + 'season_number': int_or_none(video_data.get('season_number')), + 'season_id': video_data.get('season_id'), + 'episode': title, + 'episode_number': int_or_none(video_data.get('episode_number')), + 'episode_id': video_data.get('production_episode_id'), + } + + +class VRVSeriesIE(VRVBaseIE): + IE_NAME = 'vrv:series' + _VALID_URL = r'https?://(?:www\.)?vrv\.co/series/(?P<id>[A-Z0-9]+)' + _TEST = { + 'url': 'https://vrv.co/series/G68VXG3G6/The-Perfect-Insider', + 'info_dict': { + 'id': 'G68VXG3G6', + }, + 'playlist_mincount': 11, + } + + def _initialize_pre_login(self): + return self._set_api_params() + + def _real_extract(self, url): + series_id = self._match_id(url) + + seasons_path = self._get_cms_resource( + 'cms:/seasons?series_id=' + series_id, series_id) + seasons_data = self._call_cms(seasons_path, series_id, 'seasons') + + entries = [] + for season in seasons_data.get('items', []): + episodes_path = season['__links__']['season/episodes']['href'] + episodes = self._call_cms(episodes_path, series_id, 'episodes') + for episode in episodes.get('items', []): + episode_id = episode['id'] + entries.append(self.url_result( + 'https://vrv.co/watch/' + episode_id, + 'VRV', episode_id, episode.get('title'))) + + return self.playlist_result(entries, series_id) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/vshare.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vshare.py new file mode 100644 index 0000000..443ed43 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/vshare.py @@ -0,0 +1,57 @@ +from .common import InfoExtractor +from ..utils import ExtractorError, decode_packed_codes + + +class VShareIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?vshare\.io/[dv]/(?P<id>[^/?#&]+)' + _EMBED_REGEX = [r'<iframe[^>]+?src=["\'](?P<url>(?:https?:)?//(?:www\.)?vshare\.io/v/[^/?#&]+)'] + _TESTS = [{ + 'url': 'https://vshare.io/d/0f64ce6', + 'md5': '17b39f55b5497ae8b59f5fbce8e35886', + 'info_dict': { + 'id': '0f64ce6', + 'title': 'vl14062007715967', + 'ext': 'mp4', + } + }, { + 'url': 'https://vshare.io/v/0f64ce6/width-650/height-430/1', + 'only_matching': True, + }] + + def _extract_packed(self, webpage): + packed = self._search_regex( + r'(eval\(function.+)', webpage, 'packed code') + unpacked = decode_packed_codes(packed) + digits = self._search_regex(r'\[([\d,]+)\]', unpacked, 'digits') + digits = [int(digit) for digit in digits.split(',')] + key_digit = self._search_regex( + r'fromCharCode\(.+?(\d+)\)}', unpacked, 'key digit') + chars = [chr(d - int(key_digit)) for d in digits] + return ''.join(chars) + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage( + 'https://vshare.io/v/%s/width-650/height-430/1' % video_id, + video_id, headers={'Referer': url}) + + title = self._html_extract_title(webpage) + title = title.split(' - ')[0] + + error = self._html_search_regex( + r'(?s)<div[^>]+\bclass=["\']xxx-error[^>]+>(.+?)</div', webpage, + 'error', default=None) + if error: + raise ExtractorError(error, expected=True) + + info = self._parse_html5_media_entries( + url, '<video>%s</video>' % self._extract_packed(webpage), + video_id)[0] + + info.update({ + 'id': video_id, + 'title': title, + }) + + return info diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vtm.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vtm.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vtm.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vtm.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vuclip.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vuclip.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vuclip.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vuclip.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vupload.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vupload.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vupload.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vupload.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vvvvid.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vvvvid.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vvvvid.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vvvvid.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vyborymos.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vyborymos.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vyborymos.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vyborymos.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/vzaar.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/vzaar.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/vzaar.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/vzaar.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wakanim.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wakanim.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wakanim.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wakanim.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/walla.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/walla.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/walla.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/walla.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wasdtv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wasdtv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wasdtv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wasdtv.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/washingtonpost.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/washingtonpost.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/washingtonpost.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/washingtonpost.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wat.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wat.py new file mode 100644 index 0000000..9ea3fdd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wat.py @@ -0,0 +1,119 @@ +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + ExtractorError, + int_or_none, + try_get, + unified_strdate, +) + + +class WatIE(InfoExtractor): + _VALID_URL = r'(?:wat:|https?://(?:www\.)?wat\.tv/video/.*-)(?P<id>[0-9a-z]+)' + IE_NAME = 'wat.tv' + _TESTS = [ + { + 'url': 'http://www.wat.tv/video/soupe-figues-l-orange-aux-epices-6z1uz_2hvf7_.html', + 'info_dict': { + 'id': '11713067', + 'ext': 'mp4', + 'title': 'Soupe de figues à l\'orange et aux épices', + 'description': 'Retrouvez l\'émission "Petits plats en équilibre", diffusée le 18 août 2014.', + 'upload_date': '20140819', + 'duration': 120, + }, + 'params': { + # m3u8 download + 'skip_download': True, + }, + 'expected_warnings': ['HTTP Error 404'], + 'skip': 'This content is no longer available', + }, + { + 'url': 'http://www.wat.tv/video/gregory-lemarchal-voix-ange-6z1v7_6ygkj_.html', + 'md5': 'b16574df2c3cd1a36ca0098f2a791925', + 'info_dict': { + 'id': '11713075', + 'ext': 'mp4', + 'title': 'Grégory Lemarchal, une voix d\'ange depuis 10 ans (1/3)', + 'upload_date': '20140816', + }, + 'expected_warnings': ["Ce contenu n'est pas disponible pour l'instant."], + 'skip': 'This content is no longer available', + }, + { + 'url': 'wat:14010600', + 'info_dict': { + 'id': '14010600', + 'title': 'Burger Quiz - S03 EP21 avec Eye Haidara, Anne Depétrini, Jonathan Zaccaï et Pio Marmaï', + 'thumbnail': 'https://photos.tf1.fr/1280/720/burger-quiz-11-9adb79-0@1x.jpg', + 'upload_date': '20230819', + 'duration': 2312, + 'ext': 'mp4', + }, + 'params': {'skip_download': 'm3u8'}, + } + ] + _GEO_BYPASS = False + + def _real_extract(self, url): + video_id = self._match_id(url) + video_id = video_id if video_id.isdigit() and len(video_id) > 6 else compat_str(int(video_id, 36)) + + # 'contentv4' is used in the website, but it also returns the related + # videos, we don't need them + # video_data = self._download_json( + # 'http://www.wat.tv/interface/contentv4s/' + video_id, video_id) + video_data = self._download_json( + 'https://mediainfo.tf1.fr/mediainfocombo/' + video_id, + video_id, query={'pver': '5010000'}) + video_info = video_data['media'] + + error_desc = video_info.get('error_desc') + if error_desc: + if video_info.get('error_code') == 'GEOBLOCKED': + self.raise_geo_restricted(error_desc, video_info.get('geoList')) + raise ExtractorError(error_desc, expected=True) + + title = video_info['title'] + + formats = [] + subtitles = {} + + def extract_formats(manifest_urls): + for f, f_url in manifest_urls.items(): + if not f_url: + continue + if f in ('dash', 'mpd'): + fmts, subs = self._extract_mpd_formats_and_subtitles( + f_url.replace('://das-q1.tf1.fr/', '://das-q1-ssl.tf1.fr/'), + video_id, mpd_id='dash', fatal=False) + elif f == 'hls': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + f_url, video_id, 'mp4', + 'm3u8_native', m3u8_id='hls', fatal=False) + else: + continue + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + + delivery = video_data.get('delivery') or {} + extract_formats({delivery.get('format'): delivery.get('url')}) + if not formats: + if delivery.get('drm'): + self.report_drm(video_id) + manifest_urls = self._download_json( + 'http://www.wat.tv/get/webhtml/' + video_id, video_id, fatal=False) + if manifest_urls: + extract_formats(manifest_urls) + + return { + 'id': video_id, + 'title': title, + 'thumbnail': video_info.get('preview'), + 'upload_date': unified_strdate(try_get( + video_data, lambda x: x['mediametrie']['chapters'][0]['estatS4'])), + 'duration': int_or_none(video_info.get('duration')), + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/watchbox.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/watchbox.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/watchbox.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/watchbox.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/watchindianporn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/watchindianporn.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/watchindianporn.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/watchindianporn.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wdr.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wdr.py new file mode 100644 index 0000000..6767f26 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wdr.py @@ -0,0 +1,385 @@ +import re + +from .common import InfoExtractor +from ..compat import ( + compat_str, + compat_urlparse, +) +from ..utils import ( + determine_ext, + dict_get, + ExtractorError, + js_to_json, + strip_jsonp, + try_get, + unified_strdate, + update_url_query, + urlhandle_detect_ext, + url_or_none, +) + + +class WDRIE(InfoExtractor): + __API_URL_TPL = '//deviceids-medp.wdr.de/ondemand/%s/%s' + _VALID_URL = r'''(?x)https?:// + (?:deviceids-medp\.wdr\.de/ondemand/\d+/| + kinder\.wdr\.de/(?!mediathek/)[^#?]+-) + (?P<id>\d+)\.(?:js|assetjsonp) + ''' + _GEO_COUNTRIES = ['DE'] + _TESTS = [{ + 'url': 'http://deviceids-medp.wdr.de/ondemand/155/1557833.js', + 'info_dict': { + 'id': 'mdb-1557833', + 'ext': 'mp4', + 'title': 'Biathlon-Staffel verpasst Podest bei Olympia-Generalprobe', + 'upload_date': '20180112', + }, + }] + + def _asset_url(self, wdr_id): + id_len = max(len(wdr_id), 5) + return ''.join(('https:', self.__API_URL_TPL % (wdr_id[:id_len - 4], wdr_id, ), '.js')) + + def _real_extract(self, url): + video_id = self._match_id(url) + + if url.startswith('wdr:'): + video_id = url[4:] + url = self._asset_url(video_id) + + metadata = self._download_json( + url, video_id, transform_source=strip_jsonp) + + is_live = metadata.get('mediaType') == 'live' + + tracker_data = metadata['trackerData'] + title = tracker_data['trackerClipTitle'] + media_resource = metadata['mediaResource'] + + formats = [] + subtitles = {} + + # check if the metadata contains a direct URL to a file + for kind, media in media_resource.items(): + if kind == 'captionsHash': + for ext, url in media.items(): + subtitles.setdefault('de', []).append({ + 'url': url, + 'ext': ext, + }) + continue + + if kind not in ('dflt', 'alt'): + continue + if not isinstance(media, dict): + continue + + for tag_name, medium_url in media.items(): + if tag_name not in ('videoURL', 'audioURL'): + continue + + ext = determine_ext(medium_url) + if ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + medium_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls')) + elif ext == 'f4m': + manifest_url = update_url_query( + medium_url, {'hdcore': '3.2.0', 'plugin': 'aasp-3.2.0.77.18'}) + formats.extend(self._extract_f4m_formats( + manifest_url, video_id, f4m_id='hds', fatal=False)) + elif ext == 'smil': + formats.extend(self._extract_smil_formats( + medium_url, 'stream', fatal=False)) + else: + a_format = { + 'url': medium_url + } + if ext == 'unknown_video': + urlh = self._request_webpage( + medium_url, video_id, note='Determining extension') + ext = urlhandle_detect_ext(urlh) + a_format['ext'] = ext + formats.append(a_format) + + caption_url = media_resource.get('captionURL') + if caption_url: + subtitles['de'] = [{ + 'url': caption_url, + 'ext': 'ttml', + }] + captions_hash = media_resource.get('captionsHash') + if isinstance(captions_hash, dict): + for ext, format_url in captions_hash.items(): + format_url = url_or_none(format_url) + if not format_url: + continue + subtitles.setdefault('de', []).append({ + 'url': format_url, + 'ext': determine_ext(format_url, None) or ext, + }) + + return { + 'id': tracker_data.get('trackerClipId', video_id), + 'title': title, + 'alt_title': tracker_data.get('trackerClipSubcategory'), + 'formats': formats, + 'subtitles': subtitles, + 'upload_date': unified_strdate(tracker_data.get('trackerClipAirTime')), + 'is_live': is_live, + } + + +class WDRPageIE(WDRIE): # XXX: Do not subclass from concrete IE + _MAUS_REGEX = r'https?://(?:www\.)wdrmaus.de/(?:[^/]+/)*?(?P<maus_id>[^/?#.]+)(?:/?|/index\.php5|\.php5)$' + _PAGE_REGEX = r'/(?:mediathek/)?(?:[^/]+/)*(?P<display_id>[^/]+)\.html' + _VALID_URL = r'https?://(?:www\d?\.)?(?:(?:kinder\.)?wdr\d?|sportschau)\.de' + _PAGE_REGEX + '|' + _MAUS_REGEX + + _TESTS = [ + { + 'url': 'http://www1.wdr.de/mediathek/video/sendungen/doku-am-freitag/video-geheimnis-aachener-dom-100.html', + # HDS download, MD5 is unstable + 'info_dict': { + 'id': 'mdb-1058683', + 'ext': 'flv', + 'display_id': 'doku-am-freitag/video-geheimnis-aachener-dom-100', + 'title': 'Geheimnis Aachener Dom', + 'alt_title': 'Doku am Freitag', + 'upload_date': '20160304', + 'description': 'md5:87be8ff14d8dfd7a7ee46f0299b52318', + 'is_live': False, + 'subtitles': {'de': [{ + 'url': 'http://ondemand-ww.wdr.de/medp/fsk0/105/1058683/1058683_12220974.xml', + 'ext': 'ttml', + }]}, + }, + 'skip': 'HTTP Error 404: Not Found', + }, + { + 'url': 'http://www1.wdr.de/mediathek/audio/wdr3/wdr3-gespraech-am-samstag/audio-schriftstellerin-juli-zeh-100.html', + 'md5': 'f4c1f96d01cf285240f53ea4309663d8', + 'info_dict': { + 'id': 'mdb-1072000', + 'ext': 'mp3', + 'display_id': 'wdr3-gespraech-am-samstag/audio-schriftstellerin-juli-zeh-100', + 'title': 'Schriftstellerin Juli Zeh', + 'alt_title': 'WDR 3 Gespräch am Samstag', + 'upload_date': '20160312', + 'description': 'md5:e127d320bc2b1f149be697ce044a3dd7', + 'is_live': False, + 'subtitles': {} + }, + 'skip': 'HTTP Error 404: Not Found', + }, + { + # FIXME: Asset JSON is directly embedded in webpage + 'url': 'http://www1.wdr.de/mediathek/video/live/index.html', + 'info_dict': { + 'id': 'mdb-2296252', + 'ext': 'mp4', + 'title': r're:^WDR Fernsehen im Livestream (?:\(nur in Deutschland erreichbar\) )?[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'alt_title': 'WDR Fernsehen Live', + 'upload_date': '20201112', + 'is_live': True, + }, + 'params': { + 'skip_download': True, # m3u8 download + }, + }, + { + 'url': 'http://www1.wdr.de/mediathek/video/sendungen/aktuelle-stunde/aktuelle-stunde-120.html', + 'playlist_mincount': 6, + 'info_dict': { + 'id': 'aktuelle-stunde-120', + }, + }, + { + 'url': 'http://www.wdrmaus.de/aktuelle-sendung/index.php5', + 'info_dict': { + 'id': 'mdb-2627637', + 'ext': 'mp4', + 'upload_date': 're:^[0-9]{8}$', + 'title': 're:^Die Sendung (?:mit der Maus )?vom [0-9.]{10}$', + }, + 'skip': 'The id changes from week to week because of the new episode' + }, + { + 'url': 'http://www.wdrmaus.de/filme/sachgeschichten/achterbahn.php5', + 'md5': '803138901f6368ee497b4d195bb164f2', + 'info_dict': { + 'id': 'mdb-186083', + 'ext': 'mp4', + 'upload_date': '20130919', + 'title': 'Sachgeschichte - Achterbahn ', + }, + 'skip': 'HTTP Error 404: Not Found', + }, + { + 'url': 'http://www1.wdr.de/radio/player/radioplayer116~_layout-popupVersion.html', + # Live stream, MD5 unstable + 'info_dict': { + 'id': 'mdb-869971', + 'ext': 'mp4', + 'title': r're:^COSMO Livestream [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', + 'alt_title': 'COSMO Livestream', + 'live_status': 'is_live', + 'upload_date': '20160101', + }, + 'params': { + 'skip_download': True, # m3u8 download + } + }, + { + 'url': 'http://www.sportschau.de/handballem2018/handball-nationalmannschaft-em-stolperstein-vorrunde-100.html', + 'info_dict': { + 'id': 'mdb-1556012', + 'ext': 'mp4', + 'title': 'DHB-Vizepräsident Bob Hanning - "Die Weltspitze ist extrem breit"', + 'upload_date': '20180111', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'HTTP Error 404: Not Found', + }, + { + 'url': 'http://www.sportschau.de/handballem2018/audio-vorschau---die-handball-em-startet-mit-grossem-favoritenfeld-100.html', + 'only_matching': True, + }, + { + 'url': 'https://kinder.wdr.de/tv/die-sendung-mit-dem-elefanten/av/video-folge---astronaut-100.html', + 'only_matching': True, + }, + { + 'url': 'https://www1.wdr.de/mediathek/video/sendungen/rockpalast/video-baroness---freak-valley-festival--100.html', + 'info_dict': { + 'id': 'mdb-2741028', + 'ext': 'mp4', + 'title': 'Baroness - Freak Valley Festival 2022', + 'alt_title': 'Rockpalast', + 'upload_date': '20220725', + }, + } + ] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + display_id = dict_get(mobj.groupdict(), ('display_id', 'maus_id'), 'wdrmaus') + webpage = self._download_webpage(url, display_id) + + entries = [] + + # Article with several videos + + # for wdr.de the data-extension-ard is in a tag with the class "mediaLink" + # for wdr.de radio players, in a tag with the class "wdrrPlayerPlayBtn" + # for wdrmaus, in a tag with the class "videoButton" (previously a link + # to the page in a multiline "videoLink"-tag) + for mobj in re.finditer( + r'''(?sx)class= + (?: + (["\'])(?:mediaLink|wdrrPlayerPlayBtn|videoButton)\b.*?\1[^>]+| + (["\'])videoLink\b.*?\2[\s]*>\n[^\n]* + )data-extension(?:-ard)?=(["\'])(?P<data>(?:(?!\3).)+)\3 + ''', webpage): + media_link_obj = self._parse_json( + mobj.group('data'), display_id, transform_source=js_to_json, + fatal=False) + if not media_link_obj: + continue + jsonp_url = try_get( + media_link_obj, lambda x: x['mediaObj']['url'], compat_str) + if jsonp_url: + # metadata, or player JS with ['ref'] giving WDR id, or just media, perhaps + clip_id = media_link_obj['mediaObj'].get('ref') + if jsonp_url.endswith('.assetjsonp'): + asset = self._download_json( + jsonp_url, display_id, fatal=False, transform_source=strip_jsonp) + clip_id = try_get(asset, lambda x: x['trackerData']['trackerClipId'], compat_str) + if clip_id: + jsonp_url = self._asset_url(clip_id[4:]) + entries.append(self.url_result(jsonp_url, ie=WDRIE.ie_key())) + + # Playlist (e.g. https://www1.wdr.de/mediathek/video/sendungen/aktuelle-stunde/aktuelle-stunde-120.html) + if not entries: + entries = [ + self.url_result( + compat_urlparse.urljoin(url, mobj.group('href')), + ie=WDRPageIE.ie_key()) + for mobj in re.finditer( + r'<a[^>]+\bhref=(["\'])(?P<href>(?:(?!\1).)+)\1[^>]+\bdata-extension(?:-ard)?=', + webpage) if re.match(self._PAGE_REGEX, mobj.group('href')) + ] + + return self.playlist_result(entries, playlist_id=display_id) + + +class WDRElefantIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)wdrmaus\.de/elefantenseite/#(?P<id>.+)' + _TEST = { + 'url': 'http://www.wdrmaus.de/elefantenseite/#elefantenkino_wippe', + # adaptive stream: unstable file MD5 + 'info_dict': { + 'title': 'Wippe', + 'id': 'mdb-1198320', + 'ext': 'mp4', + 'age_limit': None, + 'upload_date': '20071003' + }, + } + + def _real_extract(self, url): + display_id = self._match_id(url) + + # Table of Contents seems to always be at this address, so fetch it directly. + # The website fetches configurationJS.php5, which links to tableOfContentsJS.php5. + table_of_contents = self._download_json( + 'https://www.wdrmaus.de/elefantenseite/data/tableOfContentsJS.php5', + display_id) + if display_id not in table_of_contents: + raise ExtractorError( + 'No entry in site\'s table of contents for this URL. ' + 'Is the fragment part of the URL (after the #) correct?', + expected=True) + xml_metadata_path = table_of_contents[display_id]['xmlPath'] + xml_metadata = self._download_xml( + 'https://www.wdrmaus.de/elefantenseite/' + xml_metadata_path, + display_id) + zmdb_url_element = xml_metadata.find('./movie/zmdb_url') + if zmdb_url_element is None: + raise ExtractorError( + '%s is not a video' % display_id, expected=True) + return self.url_result(zmdb_url_element.text, ie=WDRIE.ie_key()) + + +class WDRMobileIE(InfoExtractor): + _VALID_URL = r'''(?x) + https?://mobile-ondemand\.wdr\.de/ + .*?/fsk(?P<age_limit>[0-9]+) + /[0-9]+/[0-9]+/ + (?P<id>[0-9]+)_(?P<title>[0-9]+)''' + IE_NAME = 'wdr:mobile' + _WORKING = False # no such domain + _TEST = { + 'url': 'http://mobile-ondemand.wdr.de/CMS2010/mdb/ondemand/weltweit/fsk0/42/421735/421735_4283021.mp4', + 'info_dict': { + 'title': '4283021', + 'id': '421735', + 'ext': 'mp4', + 'age_limit': 0, + }, + 'skip': 'Problems with loading data.' + } + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + return { + 'id': mobj.group('id'), + 'title': mobj.group('title'), + 'age_limit': int(mobj.group('age_limit')), + 'url': url, + 'http_headers': { + 'User-Agent': 'mobile', + }, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/webcamerapl.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/webcamerapl.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/webcamerapl.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/webcamerapl.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/webcaster.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/webcaster.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/webcaster.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/webcaster.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/webofstories.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/webofstories.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/webofstories.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/webofstories.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/weibo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/weibo.py new file mode 100644 index 0000000..b0c3052 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/weibo.py @@ -0,0 +1,241 @@ +import random +import itertools +import urllib.parse + +from .common import InfoExtractor +from ..utils import ( + int_or_none, + make_archive_id, + mimetype2ext, + parse_resolution, + str_or_none, + strip_jsonp, + traverse_obj, + url_or_none, + urlencode_postdata, + urljoin, +) + + +class WeiboBaseIE(InfoExtractor): + def _update_visitor_cookies(self, video_id): + visitor_data = self._download_json( + 'https://passport.weibo.com/visitor/genvisitor', video_id, + note='Generating first-visit guest request', + transform_source=strip_jsonp, + data=urlencode_postdata({ + 'cb': 'gen_callback', + 'fp': '{"os":"2","browser":"Gecko57,0,0,0","fonts":"undefined","screenInfo":"1440*900*24","plugins":""}', + })) + + self._download_webpage( + 'https://passport.weibo.com/visitor/visitor', video_id, + note='Running first-visit callback to get guest cookies', + query={ + 'a': 'incarnate', + 't': visitor_data['data']['tid'], + 'w': 2, + 'c': '%03d' % visitor_data['data']['confidence'], + 'cb': 'cross_domain', + 'from': 'weibo', + '_rand': random.random(), + }) + + def _weibo_download_json(self, url, video_id, *args, fatal=True, note='Downloading JSON metadata', **kwargs): + webpage, urlh = self._download_webpage_handle(url, video_id, *args, fatal=fatal, note=note, **kwargs) + if urllib.parse.urlparse(urlh.url).netloc == 'passport.weibo.com': + self._update_visitor_cookies(video_id) + webpage = self._download_webpage(url, video_id, *args, fatal=fatal, note=note, **kwargs) + return self._parse_json(webpage, video_id, fatal=fatal) + + def _extract_formats(self, video_info): + media_info = traverse_obj(video_info, ('page_info', 'media_info')) + formats = traverse_obj(media_info, ( + 'playback_list', lambda _, v: url_or_none(v['play_info']['url']), 'play_info', { + 'url': 'url', + 'format': ('quality_desc', {str}), + 'format_id': ('label', {str}), + 'ext': ('mime', {mimetype2ext}), + 'tbr': ('bitrate', {int_or_none}, {lambda x: x or None}), + 'vcodec': ('video_codecs', {str}), + 'fps': ('fps', {int_or_none}), + 'width': ('width', {int_or_none}), + 'height': ('height', {int_or_none}), + 'filesize': ('size', {int_or_none}), + 'acodec': ('audio_codecs', {str}), + 'asr': ('audio_sample_rate', {int_or_none}), + 'audio_channels': ('audio_channels', {int_or_none}), + })) + if not formats: # fallback, should be barely used + for url in set(traverse_obj(media_info, (..., {url_or_none}))): + if 'label=' in url: # filter out non-video urls + format_id, resolution = self._search_regex( + r'label=(\w+)&template=(\d+x\d+)', url, 'format info', + group=(1, 2), default=(None, None)) + formats.append({ + 'url': url, + 'format_id': format_id, + **parse_resolution(resolution), + **traverse_obj(media_info, ( + 'video_details', lambda _, v: v['label'].startswith(format_id), { + 'size': ('size', {int_or_none}), + 'tbr': ('bitrate', {int_or_none}), + } + ), get_all=False), + }) + return formats + + def _parse_video_info(self, video_info, video_id=None): + return { + 'id': video_id, + 'extractor_key': WeiboIE.ie_key(), + 'extractor': WeiboIE.IE_NAME, + 'formats': self._extract_formats(video_info), + 'http_headers': {'Referer': 'https://weibo.com/'}, + '_old_archive_ids': [make_archive_id('WeiboMobile', video_id)], + **traverse_obj(video_info, { + 'id': (('id', 'id_str', 'mid'), {str_or_none}), + 'display_id': ('mblogid', {str_or_none}), + 'title': ('page_info', 'media_info', ('video_title', 'kol_title', 'name'), {str}, {lambda x: x or None}), + 'description': ('text_raw', {str}), + 'duration': ('page_info', 'media_info', 'duration', {int_or_none}), + 'timestamp': ('page_info', 'media_info', 'video_publish_time', {int_or_none}), + 'thumbnail': ('page_info', 'page_pic', {url_or_none}), + 'uploader': ('user', 'screen_name', {str}), + 'uploader_id': ('user', ('id', 'id_str'), {str_or_none}), + 'uploader_url': ('user', 'profile_url', {lambda x: urljoin('https://weibo.com/', x)}), + 'view_count': ('page_info', 'media_info', 'online_users_number', {int_or_none}), + 'like_count': ('attitudes_count', {int_or_none}), + 'repost_count': ('reposts_count', {int_or_none}), + }, get_all=False), + 'tags': traverse_obj(video_info, ('topic_struct', ..., 'topic_title', {str})) or None, + } + + +class WeiboIE(WeiboBaseIE): + _VALID_URL = r'https?://(?:m\.weibo\.cn/status|(?:www\.)?weibo\.com/\d+)/(?P<id>[a-zA-Z0-9]+)' + _TESTS = [{ + 'url': 'https://weibo.com/7827771738/N4xlMvjhI', + 'info_dict': { + 'id': '4910815147462302', + 'ext': 'mp4', + 'display_id': 'N4xlMvjhI', + 'title': 'ã€ç¡å‰æ¶ˆæ¯æš‘å‡ç‰ˆç¬¬ä¸€æœŸï¼šæ‹‰æ³°å›½ä¸€æŠŠ 对中国有好处】', + 'description': 'md5:e2637a7673980d68694ea7c43cf12a5f', + 'duration': 918, + 'timestamp': 1686312819, + 'upload_date': '20230609', + 'thumbnail': r're:https://.*\.jpg', + 'uploader': 'ç¡å‰è§†é¢‘基地', + 'uploader_id': '7827771738', + 'uploader_url': 'https://weibo.com/u/7827771738', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + 'tags': ['泰国大选远进党获胜', 'ç¡å‰æ¶ˆæ¯', '暑期版'], + }, + }, { + 'url': 'https://m.weibo.cn/status/4189191225395228', + 'info_dict': { + 'id': '4189191225395228', + 'ext': 'mp4', + 'display_id': 'FBqgOmDxO', + 'title': '柴犬柴犬的秒æ‹è§†é¢‘', + 'description': 'md5:80f461ab5cdae6bbdb70efbf5a1db24f', + 'duration': 53, + 'timestamp': 1514264429, + 'upload_date': '20171226', + 'thumbnail': r're:https://.*\.jpg', + 'uploader': '柴犬柴犬', + 'uploader_id': '5926682210', + 'uploader_url': 'https://weibo.com/u/5926682210', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + } + }, { + 'url': 'https://weibo.com/0/4224132150961381', + 'note': 'no playback_list example', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + return self._parse_video_info(self._weibo_download_json( + f'https://weibo.com/ajax/statuses/show?id={video_id}', video_id)) + + +class WeiboVideoIE(WeiboBaseIE): + _VALID_URL = r'https?://(?:www\.)?weibo\.com/tv/show/(?P<id>\d+:\d+)' + _TESTS = [{ + 'url': 'https://weibo.com/tv/show/1034:4797699866951785?from=old_pc_videoshow', + 'info_dict': { + 'id': '4797700463137878', + 'ext': 'mp4', + 'display_id': 'LEZDodaiW', + 'title': '呃,ç¨å¾®äº†è§£äº†ä¸€ä¸‹é¡çƒŸmiya,感觉这东西也太二了', + 'description': '呃,ç¨å¾®äº†è§£äº†ä¸€ä¸‹é¡çƒŸmiya,感觉这东西也太二了 http://t.cn/A6aerGsM ​​​', + 'duration': 76, + 'timestamp': 1659344278, + 'upload_date': '20220801', + 'thumbnail': r're:https://.*\.jpg', + 'uploader': 'å›å­çˆ±è´¢é™ˆå¹³å®‰', + 'uploader_id': '3905382233', + 'uploader_url': 'https://weibo.com/u/3905382233', + 'view_count': int, + 'like_count': int, + 'repost_count': int, + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + post_data = f'data={{"Component_Play_Playinfo":{{"oid":"{video_id}"}}}}'.encode() + video_info = self._weibo_download_json( + f'https://weibo.com/tv/api/component?page=%2Ftv%2Fshow%2F{video_id.replace(":", "%3A")}', + video_id, headers={'Referer': url}, data=post_data)['data']['Component_Play_Playinfo'] + return self.url_result(f'https://weibo.com/0/{video_info["mid"]}', WeiboIE) + + +class WeiboUserIE(WeiboBaseIE): + _VALID_URL = r'https?://(?:www\.)?weibo\.com/u/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://weibo.com/u/2066652961?tabtype=video', + 'info_dict': { + 'id': '2066652961', + 'title': 'è§å½±æ®¿ä¸‹çš„视频', + 'description': 'è§å½±æ®¿ä¸‹çš„全部视频', + 'uploader': 'è§å½±æ®¿ä¸‹', + }, + 'playlist_mincount': 195, + }] + + def _fetch_page(self, uid, cursor=0, page=1): + return self._weibo_download_json( + 'https://weibo.com/ajax/profile/getWaterFallContent', + uid, note=f'Downloading videos page {page}', + query={'uid': uid, 'cursor': cursor})['data'] + + def _entries(self, uid, first_page): + cursor = 0 + for page in itertools.count(1): + response = first_page if page == 1 else self._fetch_page(uid, cursor, page) + for video_info in traverse_obj(response, ('list', ..., {dict})): + yield self._parse_video_info(video_info) + cursor = response.get('next_cursor') + if (int_or_none(cursor) or -1) < 0: + break + + def _real_extract(self, url): + uid = self._match_id(url) + first_page = self._fetch_page(uid) + uploader = traverse_obj(first_page, ('list', ..., 'user', 'screen_name', {str}), get_all=False) + metainfo = { + 'title': f'{uploader}的视频', + 'description': f'{uploader}的全部视频', + 'uploader': uploader, + } if uploader else {} + + return self.playlist_result(self._entries(uid, first_page), uid, **metainfo) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/weiqitv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/weiqitv.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/weiqitv.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/weiqitv.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/weverse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/weverse.py new file mode 100644 index 0000000..47f3680 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/weverse.py @@ -0,0 +1,608 @@ +import base64 +import hashlib +import hmac +import itertools +import json +import re +import time +import urllib.parse +import uuid + +from .common import InfoExtractor +from .naver import NaverBaseIE +from .youtube import YoutubeIE +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + UserNotLive, + float_or_none, + int_or_none, + str_or_none, + traverse_obj, + try_call, + update_url_query, + url_or_none, +) + + +class WeverseBaseIE(InfoExtractor): + _NETRC_MACHINE = 'weverse' + _ACCOUNT_API_BASE = 'https://accountapi.weverse.io/web/api/v2' + _API_HEADERS = { + 'Referer': 'https://weverse.io/', + 'WEV-device-Id': str(uuid.uuid4()), + } + + def _perform_login(self, username, password): + if self._API_HEADERS.get('Authorization'): + return + + headers = { + 'x-acc-app-secret': '5419526f1c624b38b10787e5c10b2a7a', + 'x-acc-app-version': '2.2.6', + 'x-acc-language': 'en', + 'x-acc-service-id': 'weverse', + 'x-acc-trace-id': str(uuid.uuid4()), + 'x-clog-user-device-id': str(uuid.uuid4()), + } + check_username = self._download_json( + f'{self._ACCOUNT_API_BASE}/signup/email/status', None, + note='Checking username', query={'email': username}, headers=headers) + if not check_username.get('hasPassword'): + raise ExtractorError('Invalid username provided', expected=True) + + headers['content-type'] = 'application/json' + try: + auth = self._download_json( + f'{self._ACCOUNT_API_BASE}/auth/token/by-credentials', None, data=json.dumps({ + 'email': username, + 'password': password, + }, separators=(',', ':')).encode(), headers=headers, note='Logging in') + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + raise ExtractorError('Invalid password provided', expected=True) + raise + + WeverseBaseIE._API_HEADERS['Authorization'] = f'Bearer {auth["accessToken"]}' + + def _real_initialize(self): + if self._API_HEADERS.get('Authorization'): + return + + token = try_call(lambda: self._get_cookies('https://weverse.io/')['we2_access_token'].value) + if token: + WeverseBaseIE._API_HEADERS['Authorization'] = f'Bearer {token}' + + def _call_api(self, ep, video_id, data=None, note='Downloading API JSON'): + # Ref: https://ssl.pstatic.net/static/wevweb/2_3_2_11101725/public/static/js/2488.a09b41ff.chunk.js + # From https://ssl.pstatic.net/static/wevweb/2_3_2_11101725/public/static/js/main.e206f7c1.js: + key = b'1b9cb6378d959b45714bec49971ade22e6e24e42' + api_path = update_url_query(ep, { + 'appId': 'be4d79eb8fc7bd008ee82c8ec4ff6fd4', + 'language': 'en', + 'platform': 'WEB', + 'wpf': 'pc', + }) + wmsgpad = int(time.time() * 1000) + wmd = base64.b64encode(hmac.HMAC( + key, f'{api_path[:255]}{wmsgpad}'.encode(), digestmod=hashlib.sha1).digest()).decode() + headers = {'Content-Type': 'application/json'} if data else {} + try: + return self._download_json( + f'https://global.apis.naver.com/weverse/wevweb{api_path}', video_id, note=note, + data=data, headers={**self._API_HEADERS, **headers}, query={ + 'wmsgpad': wmsgpad, + 'wmd': wmd, + }) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 401: + self.raise_login_required( + 'Session token has expired. Log in again or refresh cookies in browser') + elif isinstance(e.cause, HTTPError) and e.cause.status == 403: + if 'Authorization' in self._API_HEADERS: + raise ExtractorError('Your account does not have access to this content', expected=True) + self.raise_login_required() + raise + + def _call_post_api(self, video_id): + path = '' if 'Authorization' in self._API_HEADERS else '/preview' + return self._call_api(f'/post/v1.0/post-{video_id}{path}?fieldSet=postV1', video_id) + + def _get_community_id(self, channel): + return str(self._call_api( + f'/community/v1.0/communityIdUrlPathByUrlPathArtistCode?keyword={channel}', + channel, note='Fetching community ID')['communityId']) + + def _get_formats(self, data, video_id): + formats = traverse_obj(data, ('videos', 'list', lambda _, v: url_or_none(v['source']), { + 'url': 'source', + 'width': ('encodingOption', 'width', {int_or_none}), + 'height': ('encodingOption', 'height', {int_or_none}), + 'vcodec': 'type', + 'vbr': ('bitrate', 'video', {int_or_none}), + 'abr': ('bitrate', 'audio', {int_or_none}), + 'filesize': ('size', {int_or_none}), + 'format_id': ('encodingOption', 'id', {str_or_none}), + })) + + for stream in traverse_obj(data, ('streams', lambda _, v: v['type'] == 'HLS' and url_or_none(v['source']))): + query = {} + for param in traverse_obj(stream, ('keys', lambda _, v: v['type'] == 'param' and v['name'])): + query[param['name']] = param.get('value', '') + fmts = self._extract_m3u8_formats( + stream['source'], video_id, 'mp4', m3u8_id='hls', fatal=False, query=query) + if query: + for fmt in fmts: + fmt['url'] = update_url_query(fmt['url'], query) + fmt['extra_param_to_segment_url'] = urllib.parse.urlencode(query) + formats.extend(fmts) + + return formats + + def _get_subs(self, caption_url): + subs_ext_re = r'\.(?:ttml|vtt)' + replace_ext = lambda x, y: re.sub(subs_ext_re, y, x) + if re.search(subs_ext_re, caption_url): + return [replace_ext(caption_url, '.ttml'), replace_ext(caption_url, '.vtt')] + return [caption_url] + + def _parse_post_meta(self, metadata): + return traverse_obj(metadata, { + 'title': ((('extension', 'mediaInfo', 'title'), 'title'), {str}), + 'description': ((('extension', 'mediaInfo', 'body'), 'body'), {str}), + 'uploader': ('author', 'profileName', {str}), + 'uploader_id': ('author', 'memberId', {str}), + 'creator': ('community', 'communityName', {str}), + 'channel_id': (('community', 'author'), 'communityId', {str_or_none}), + 'duration': ('extension', 'video', 'playTime', {float_or_none}), + 'timestamp': ('publishedAt', {lambda x: int_or_none(x, 1000)}), + 'release_timestamp': ('extension', 'video', 'onAirStartAt', {lambda x: int_or_none(x, 1000)}), + 'thumbnail': ('extension', (('mediaInfo', 'thumbnail', 'url'), ('video', 'thumb')), {url_or_none}), + 'view_count': ('extension', 'video', 'playCount', {int_or_none}), + 'like_count': ('extension', 'video', 'likeCount', {int_or_none}), + 'comment_count': ('commentCount', {int_or_none}), + }, get_all=False) + + def _extract_availability(self, data): + return self._availability(**traverse_obj(data, ((('extension', 'video'), None), { + 'needs_premium': 'paid', + 'needs_subscription': 'membershipOnly', + }), get_all=False, expected_type=bool), needs_auth=True) + + def _extract_live_status(self, data): + data = traverse_obj(data, ('extension', 'video', {dict})) or {} + if data.get('type') == 'LIVE': + return traverse_obj({ + 'ONAIR': 'is_live', + 'DONE': 'post_live', + 'STANDBY': 'is_upcoming', + 'DELAY': 'is_upcoming', + }, (data.get('status'), {str})) or 'is_live' + return 'was_live' if data.get('liveToVod') else 'not_live' + + +class WeverseIE(WeverseBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/live/(?P<id>[\d-]+)' + _TESTS = [{ + 'url': 'https://weverse.io/billlie/live/0-107323480', + 'md5': '1fa849f00181eef9100d3c8254c47979', + 'info_dict': { + 'id': '0-107323480', + 'ext': 'mp4', + 'title': '행복한 í‰ì´ë£¨ðŸ’œ', + 'description': '', + 'uploader': 'Billlie', + 'uploader_id': '5ae14aed7b7cdc65fa87c41fe06cc936', + 'channel': 'billlie', + 'channel_id': '72', + 'channel_url': 'https://weverse.io/billlie', + 'creator': 'Billlie', + 'timestamp': 1666262062, + 'upload_date': '20221020', + 'release_timestamp': 1666262058, + 'release_date': '20221020', + 'duration': 3102, + 'thumbnail': r're:^https?://.*\.jpe?g$', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'was_live', + }, + }, { + 'url': 'https://weverse.io/lesserafim/live/2-102331763', + 'md5': 'e46125c08b13a6c8c1f4565035cca987', + 'info_dict': { + 'id': '2-102331763', + 'ext': 'mp4', + 'title': 'ðŸŽ‚ê¹€ì±„ì› ìƒì‹ ðŸŽ‚', + 'description': 'ðŸŽ‚ê¹€ì±„ì› ìƒì‹ ðŸŽ‚', + 'uploader': 'LE SSERAFIM ', + 'uploader_id': 'd26ddc1e258488a0a2b795218d14d59d', + 'channel': 'lesserafim', + 'channel_id': '47', + 'channel_url': 'https://weverse.io/lesserafim', + 'creator': 'LE SSERAFIM', + 'timestamp': 1659353400, + 'upload_date': '20220801', + 'release_timestamp': 1659353400, + 'release_date': '20220801', + 'duration': 3006, + 'thumbnail': r're:^https?://.*\.jpe?g$', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'was_live', + 'subtitles': { + 'id_ID': 'count:2', + 'en_US': 'count:2', + 'es_ES': 'count:2', + 'vi_VN': 'count:2', + 'th_TH': 'count:2', + 'zh_CN': 'count:2', + 'zh_TW': 'count:2', + 'ja_JP': 'count:2', + 'ko_KR': 'count:2', + }, + }, + }, { + 'url': 'https://weverse.io/treasure/live/2-117230416', + 'info_dict': { + 'id': '2-117230416', + 'ext': 'mp4', + 'title': r're:스껄ë„려님 첫 스무살 ìƒíŒŒðŸ¦‹', + 'description': '', + 'uploader': 'TREASURE', + 'uploader_id': '77eabbc449ca37f7970054a136f60082', + 'channel': 'treasure', + 'channel_id': '20', + 'channel_url': 'https://weverse.io/treasure', + 'creator': 'TREASURE', + 'timestamp': 1680667651, + 'upload_date': '20230405', + 'release_timestamp': 1680667639, + 'release_date': '20230405', + 'thumbnail': r're:^https?://.*\.jpe?g$', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'is_live', + }, + 'skip': 'Livestream has ended', + }] + + def _real_extract(self, url): + channel, video_id = self._match_valid_url(url).group('artist', 'id') + post = self._call_post_api(video_id) + api_video_id = post['extension']['video']['videoId'] + availability = self._extract_availability(post) + live_status = self._extract_live_status(post) + video_info, formats = {}, [] + + if live_status == 'is_upcoming': + self.raise_no_formats('Livestream has not yet started', expected=True) + + elif live_status == 'is_live': + video_info = self._call_api( + f'/video/v1.0/lives/{api_video_id}/playInfo?preview.format=json&preview.version=v2', + video_id, note='Downloading live JSON') + playback = self._parse_json(video_info['lipPlayback'], video_id) + m3u8_url = traverse_obj(playback, ( + 'media', lambda _, v: v['protocol'] == 'HLS', 'path', {url_or_none}), get_all=False) + formats = self._extract_m3u8_formats(m3u8_url, video_id, 'mp4', m3u8_id='hls', live=True) + + elif live_status == 'post_live': + if availability in ('premium_only', 'subscriber_only'): + self.report_drm(video_id) + self.raise_no_formats( + 'Livestream has ended and downloadable VOD is not available', expected=True) + + else: + infra_video_id = post['extension']['video']['infraVideoId'] + in_key = self._call_api( + f'/video/v1.0/vod/{api_video_id}/inKey?preview=false', video_id, + data=b'{}', note='Downloading VOD API key')['inKey'] + + video_info = self._download_json( + f'https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/{infra_video_id}', + video_id, note='Downloading VOD JSON', query={ + 'key': in_key, + 'sid': traverse_obj(post, ('extension', 'video', 'serviceId')) or '2070', + 'pid': str(uuid.uuid4()), + 'nonce': int(time.time() * 1000), + 'devt': 'html5_pc', + 'prv': 'Y' if post.get('membershipOnly') else 'N', + 'aup': 'N', + 'stpb': 'N', + 'cpl': 'en', + 'env': 'prod', + 'lc': 'en', + 'adi': '[{"adSystem":"null"}]', + 'adu': '/', + }) + + formats = self._get_formats(video_info, video_id) + has_drm = traverse_obj(video_info, ('meta', 'provider', 'name', {str.lower})) == 'drm' + if has_drm and formats: + self.report_warning( + 'Requested content is DRM-protected, only a 30-second preview is available', video_id) + elif has_drm and not formats: + self.report_drm(video_id) + + return { + 'id': video_id, + 'channel': channel, + 'channel_url': f'https://weverse.io/{channel}', + 'formats': formats, + 'availability': availability, + 'live_status': live_status, + **self._parse_post_meta(post), + **NaverBaseIE.process_subtitles(video_info, self._get_subs), + } + + +class WeverseMediaIE(WeverseBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/media/(?P<id>[\d-]+)' + _TESTS = [{ + 'url': 'https://weverse.io/billlie/media/4-116372884', + 'md5': '8efc9cfd61b2f25209eb1a5326314d28', + 'info_dict': { + 'id': 'e-C9wLSQs6o', + 'ext': 'mp4', + 'title': 'Billlie | \'EUNOIA\' Performance Video (heartbeat ver.)', + 'description': 'md5:6181caaf2a2397bca913ffe368c104e5', + 'channel': 'Billlie', + 'channel_id': 'UCyc9sUCxELTDK9vELO5Fzeg', + 'channel_url': 'https://www.youtube.com/channel/UCyc9sUCxELTDK9vELO5Fzeg', + 'uploader': 'Billlie', + 'uploader_id': '@Billlie', + 'uploader_url': 'http://www.youtube.com/@Billlie', + 'upload_date': '20230403', + 'duration': 211, + 'age_limit': 0, + 'playable_in_embed': True, + 'live_status': 'not_live', + 'availability': 'public', + 'view_count': int, + 'comment_count': int, + 'like_count': int, + 'channel_follower_count': int, + 'thumbnail': 'https://i.ytimg.com/vi/e-C9wLSQs6o/maxresdefault.jpg', + 'categories': ['Entertainment'], + 'tags': 'count:7', + }, + }, { + 'url': 'https://weverse.io/billlie/media/3-102914520', + 'md5': '031551fcbd716bc4f080cb6174a43d8a', + 'info_dict': { + 'id': '3-102914520', + 'ext': 'mp4', + 'title': 'From. SUHYEON🌸', + 'description': 'Billlie 멤버별 ë…ì  ì˜ìƒ 공개💙💜', + 'uploader': 'Billlie_official', + 'uploader_id': 'f569c6e92f7eaffef0a395037dcaa54f', + 'channel': 'billlie', + 'channel_id': '72', + 'channel_url': 'https://weverse.io/billlie', + 'creator': 'Billlie', + 'timestamp': 1662174000, + 'upload_date': '20220903', + 'release_timestamp': 1662174000, + 'release_date': '20220903', + 'duration': 17.0, + 'thumbnail': r're:^https?://.*\.jpe?g$', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'not_live', + }, + }] + + def _real_extract(self, url): + channel, video_id = self._match_valid_url(url).group('artist', 'id') + post = self._call_post_api(video_id) + media_type = traverse_obj(post, ('extension', 'mediaInfo', 'mediaType', {str.lower})) + youtube_id = traverse_obj(post, ('extension', 'youtube', 'youtubeVideoId', {str})) + + if media_type == 'vod': + return self.url_result(f'https://weverse.io/{channel}/live/{video_id}', WeverseIE) + elif media_type == 'youtube' and youtube_id: + return self.url_result(youtube_id, YoutubeIE) + elif media_type == 'image': + self.raise_no_formats('No video content found in webpage', expected=True) + elif media_type: + raise ExtractorError(f'Unsupported media type "{media_type}"') + + self.raise_no_formats('No video content found in webpage') + + +class WeverseMomentIE(WeverseBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<artist>[^/?#]+)/moment/(?P<uid>[\da-f]+)/post/(?P<id>[\d-]+)' + _TESTS = [{ + 'url': 'https://weverse.io/secretnumber/moment/66a07e164b56a696ee71c99315ffe27b/post/1-117229444', + 'md5': '87733ac19a54081b7dfc2442036d282b', + 'info_dict': { + 'id': '1-117229444', + 'ext': 'mp4', + 'title': '今日もã‚ã£ã¡ã‚ƒã„ã„天気☀ï¸ðŸŒ¤ï¸', + 'uploader': '레아', + 'uploader_id': '66a07e164b56a696ee71c99315ffe27b', + 'channel': 'secretnumber', + 'channel_id': '56', + 'creator': 'SECRET NUMBER', + 'duration': 10, + 'upload_date': '20230405', + 'timestamp': 1680653968, + 'thumbnail': r're:^https?://.*\.jpe?g$', + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + }, + 'skip': 'Moment has expired', + }] + + def _real_extract(self, url): + channel, uploader_id, video_id = self._match_valid_url(url).group('artist', 'uid', 'id') + post = self._call_post_api(video_id) + api_video_id = post['extension']['moment']['video']['videoId'] + video_info = self._call_api( + f'/cvideo/v1.0/cvideo-{api_video_id}/playInfo?videoId={api_video_id}', video_id, + note='Downloading moment JSON')['playInfo'] + + return { + 'id': video_id, + 'channel': channel, + 'uploader_id': uploader_id, + 'formats': self._get_formats(video_info, video_id), + 'availability': self._extract_availability(post), + **traverse_obj(post, { + 'title': ((('extension', 'moment', 'body'), 'body'), {str}), + 'uploader': ('author', 'profileName', {str}), + 'creator': (('community', 'author'), 'communityName', {str}), + 'channel_id': (('community', 'author'), 'communityId', {str_or_none}), + 'duration': ('extension', 'moment', 'video', 'uploadInfo', 'playTime', {float_or_none}), + 'timestamp': ('publishedAt', {lambda x: int_or_none(x, 1000)}), + 'thumbnail': ('extension', 'moment', 'video', 'uploadInfo', 'imageUrl', {url_or_none}), + 'like_count': ('emotionCount', {int_or_none}), + 'comment_count': ('commentCount', {int_or_none}), + }, get_all=False), + **NaverBaseIE.process_subtitles(video_info, self._get_subs), + } + + +class WeverseTabBaseIE(WeverseBaseIE): + _ENDPOINT = None + _PATH = None + _QUERY = {} + _RESULT_IE = None + + def _entries(self, channel_id, channel, first_page): + query = self._QUERY.copy() + + for page in itertools.count(1): + posts = first_page if page == 1 else self._call_api( + update_url_query(self._ENDPOINT % channel_id, query), channel, + note=f'Downloading {self._PATH} tab page {page}') + + for post in traverse_obj(posts, ('data', lambda _, v: v['postId'])): + yield self.url_result( + f'https://weverse.io/{channel}/{self._PATH}/{post["postId"]}', + self._RESULT_IE, post['postId'], **self._parse_post_meta(post), + channel=channel, channel_url=f'https://weverse.io/{channel}', + availability=self._extract_availability(post), + live_status=self._extract_live_status(post)) + + query['after'] = traverse_obj(posts, ('paging', 'nextParams', 'after', {str})) + if not query['after']: + break + + def _real_extract(self, url): + channel = self._match_id(url) + channel_id = self._get_community_id(channel) + + first_page = self._call_api( + update_url_query(self._ENDPOINT % channel_id, self._QUERY), channel, + note=f'Downloading {self._PATH} tab page 1') + + return self.playlist_result( + self._entries(channel_id, channel, first_page), f'{channel}-{self._PATH}', + **traverse_obj(first_page, ('data', ..., { + 'playlist_title': ('community', 'communityName', {str}), + 'thumbnail': ('author', 'profileImageUrl', {url_or_none}), + }), get_all=False)) + + +class WeverseLiveTabIE(WeverseTabBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/live/?(?:[?#]|$)' + _TESTS = [{ + 'url': 'https://weverse.io/billlie/live/', + 'playlist_mincount': 55, + 'info_dict': { + 'id': 'billlie-live', + 'title': 'Billlie', + 'thumbnail': r're:^https?://.*\.jpe?g$', + }, + }] + + _ENDPOINT = '/post/v1.0/community-%s/liveTabPosts' + _PATH = 'live' + _QUERY = {'fieldSet': 'postsV1'} + _RESULT_IE = WeverseIE + + +class WeverseMediaTabIE(WeverseTabBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/media(?:/|/all|/new)?(?:[?#]|$)' + _TESTS = [{ + 'url': 'https://weverse.io/billlie/media/', + 'playlist_mincount': 231, + 'info_dict': { + 'id': 'billlie-media', + 'title': 'Billlie', + 'thumbnail': r're:^https?://.*\.jpe?g$', + }, + }, { + 'url': 'https://weverse.io/lesserafim/media/all', + 'only_matching': True, + }, { + 'url': 'https://weverse.io/lesserafim/media/new', + 'only_matching': True, + }] + + _ENDPOINT = '/media/v1.0/community-%s/more' + _PATH = 'media' + _QUERY = {'fieldSet': 'postsV1', 'filterType': 'RECENT'} + _RESULT_IE = WeverseMediaIE + + +class WeverseLiveIE(WeverseBaseIE): + _VALID_URL = r'https?://(?:www\.|m\.)?weverse\.io/(?P<id>[^/?#]+)/?(?:[?#]|$)' + _TESTS = [{ + 'url': 'https://weverse.io/purplekiss', + 'info_dict': { + 'id': '3-116560493', + 'ext': 'mp4', + 'title': r're:모하냥🫶ðŸ»', + 'description': 'ë‚´ì¼ì€ 금요ì¼~><', + 'uploader': '채ì¸', + 'uploader_id': '1ffb1d9d904d6b3db2783f876eb9229d', + 'channel': 'purplekiss', + 'channel_id': '35', + 'channel_url': 'https://weverse.io/purplekiss', + 'creator': 'PURPLE KISS', + 'timestamp': 1680780892, + 'upload_date': '20230406', + 'release_timestamp': 1680780883, + 'release_date': '20230406', + 'thumbnail': 'https://weverse-live.pstatic.net/v1.0/live/62044/thumb', + 'view_count': int, + 'like_count': int, + 'comment_count': int, + 'availability': 'needs_auth', + 'live_status': 'is_live', + }, + 'skip': 'Livestream has ended', + }, { + 'url': 'https://weverse.io/billlie/', + 'only_matching': True, + }] + + def _real_extract(self, url): + channel = self._match_id(url) + channel_id = self._get_community_id(channel) + + video_id = traverse_obj( + self._call_api(update_url_query(f'/post/v1.0/community-{channel_id}/liveTab', { + 'debugMessage': 'true', + 'fields': 'onAirLivePosts.fieldSet(postsV1).limit(10),reservedLivePosts.fieldSet(postsV1).limit(10)', + }), channel, note='Downloading live JSON'), ( + ('onAirLivePosts', 'reservedLivePosts'), 'data', + lambda _, v: self._extract_live_status(v) in ('is_live', 'is_upcoming'), 'postId', {str}), + get_all=False) + + if not video_id: + raise UserNotLive(video_id=channel) + + return self.url_result(f'https://weverse.io/{channel}/live/{video_id}', WeverseIE) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wevidi.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wevidi.py new file mode 100644 index 0000000..3b6d032 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wevidi.py @@ -0,0 +1,108 @@ +from .common import InfoExtractor +from ..utils import clean_html, float_or_none, get_element_by_class, js_to_json, traverse_obj + + +class WeVidiIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?wevidi\.net/watch/(?P<id>[\w-]{11})' + _TESTS = [{ + 'url': 'https://wevidi.net/watch/2th7UO5F4KV', + 'md5': 'b913d1ff5bbad499e2c7ef4aa6d829d7', + 'info_dict': { + 'id': '2th7UO5F4KV', + 'ext': 'mp4', + 'title': 'YouTube Alternative: WeVidi - customizable channels & more', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:73a27d0a87d49fbcc5584566326ebeed', + 'uploader': 'eclecRC', + 'duration': 932.098, + } + }, { + 'url': 'https://wevidi.net/watch/ievRuuQHbPS', + 'md5': 'ce8a94989a959bff9003fa27ee572935', + 'info_dict': { + 'id': 'ievRuuQHbPS', + 'ext': 'mp4', + 'title': 'WeVidi Playlists', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:32cdfca272687390d9bd9b0c9c6153ee', + 'uploader': 'WeVidi', + 'duration': 36.1999, + } + }, { + 'url': 'https://wevidi.net/watch/PcMzDWaQSWb', + 'md5': '55ee0d3434be5d9e5cc76b83f2bb57ec', + 'info_dict': { + 'id': 'PcMzDWaQSWb', + 'ext': 'mp4', + 'title': 'Cat blep', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:e2c9e2b54b8bb424cc64937c8fdc068f', + 'uploader': 'WeVidi', + 'duration': 41.972, + } + }, { + 'url': 'https://wevidi.net/watch/wJnRqDHNe_u', + 'md5': 'c8f263dd47e66cc17546b3abf47b5a77', + 'info_dict': { + 'id': 'wJnRqDHNe_u', + 'ext': 'mp4', + 'title': 'Gissy Talks: YouTube Alternatives', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:e65036f0d4af80e0af191bd11af5195e', + 'uploader': 'GissyEva', + 'duration': 630.451, + } + }, { + 'url': 'https://wevidi.net/watch/4m1c4yJR_yc', + 'md5': 'c63ce5ca6990dce86855fc02ca5bc1ed', + 'info_dict': { + 'id': '4m1c4yJR_yc', + 'ext': 'mp4', + 'title': 'Enough of that! - Awesome Exilez Podcast', + 'thumbnail': r're:^https?://.*\.jpg$', + 'description': 'md5:96af99dd63468b2dfab3020560e3e9b2', + 'uploader': 'eclecRC', + 'duration': 6.804, + } + }] + + def _extract_formats(self, wvplayer_props): + # Taken from WeVidi player JS: https://wevidi.net/layouts/default/static/player.min.js + resolution_map = { + 1: 144, + 2: 240, + 3: 360, + 4: 480, + 5: 720, + 6: 1080 + } + + src_path = f'{wvplayer_props["srcVID"]}/{wvplayer_props["srcUID"]}/{wvplayer_props["srcNAME"]}' + for res in traverse_obj(wvplayer_props, ('resolutions', ..., {int}, {lambda x: x or None})): + format_id = str(-(res // -2) - 1) + yield { + 'acodec': 'mp4a.40.2', + 'ext': 'mp4', + 'format_id': format_id, + 'height': resolution_map.get(res), + 'url': f'https://www.wevidi.net/videoplayback/{src_path}/{format_id}', + 'vcodec': 'avc1.42E01E', + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + wvplayer_props = self._search_json( + r'WVPlayer\(', webpage, 'player', video_id, + transform_source=lambda x: js_to_json(x.replace('||', '}'))) + + return { + 'id': video_id, + 'title': clean_html(get_element_by_class('video_title', webpage)), + 'description': clean_html(get_element_by_class('descr_long', webpage)), + 'uploader': clean_html(get_element_by_class('username', webpage)), + 'formats': list(self._extract_formats(wvplayer_props)), + 'thumbnail': self._og_search_thumbnail(webpage), + 'duration': float_or_none(wvplayer_props.get('duration')), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/weyyak.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/weyyak.py new file mode 100644 index 0000000..ef12be8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/weyyak.py @@ -0,0 +1,86 @@ +from .common import InfoExtractor +from ..utils import ( + float_or_none, + int_or_none, + parse_age_limit, + traverse_obj, + unified_timestamp, + url_or_none, +) + + +class WeyyakIE(InfoExtractor): + _VALID_URL = r'https?://weyyak\.com/(?P<lang>\w+)/(?:player/)?(?P<type>episode|movie)/(?P<id>\d+)' + _TESTS = [ + { + 'url': 'https://weyyak.com/en/player/episode/1341952/Ribat-Al-Hob-Episode49', + 'md5': '0caf55c1a615531c8fe60f146ae46849', + 'info_dict': { + 'id': '1341952', + 'ext': 'mp4', + 'title': 'Ribat Al Hob', + 'duration': 2771, + 'alt_title': 'رباط الحب', + 'season': 'Season 1', + 'season_number': 1, + 'episode': 'Episode 49', + 'episode_number': 49, + 'timestamp': 1485907200, + 'upload_date': '20170201', + 'thumbnail': r're:^https://content\.weyyak\.com/.+/poster-image', + 'categories': ['Drama', 'Thrillers', 'Romance'], + 'tags': 'count:8', + }, + }, + { + 'url': 'https://weyyak.com/en/movie/233255/8-Seconds', + 'md5': 'fe740ae0f63e4d1c8a7fc147a410c564', + 'info_dict': { + 'id': '233255', + 'ext': 'mp4', + 'title': '8 Seconds', + 'duration': 6490, + 'alt_title': '8 ثواني', + 'description': 'md5:45b83a155c30b49950624c7e99600b9d', + 'age_limit': 15, + 'release_year': 2015, + 'timestamp': 1683106031, + 'upload_date': '20230503', + 'thumbnail': r're:^https://content\.weyyak\.com/.+/poster-image', + 'categories': ['Drama', 'Social'], + 'cast': ['Ceylin Adiyaman', 'Esra Inal'], + }, + }, + ] + + def _real_extract(self, url): + video_id, lang, type_ = self._match_valid_url(url).group('id', 'lang', 'type') + + path = 'episode/' if type_ == 'episode' else 'contents/moviedetails?contentkey=' + data = self._download_json( + f'https://msapifo-prod-me.weyyak.z5.com/v1/{lang}/{path}{video_id}', video_id)['data'] + m3u8_url = self._download_json( + f'https://api-weyyak.akamaized.net/get_info/{data["video_id"]}', + video_id, 'Extracting video details')['url_video'] + formats, subtitles = self._extract_m3u8_formats_and_subtitles(m3u8_url, video_id) + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(data, { + 'title': ('title', {str}), + 'alt_title': ('translated_title', {str}), + 'description': ('synopsis', {str}), + 'duration': ('length', {float_or_none}), + 'age_limit': ('age_rating', {parse_age_limit}), + 'season_number': ('season_number', {int_or_none}), + 'episode_number': ('episode_number', {int_or_none}), + 'thumbnail': ('imagery', 'thumbnail', {url_or_none}), + 'categories': ('genres', ..., {str}), + 'tags': ('tags', ..., {str}), + 'cast': (('main_actor', 'main_actress'), {str}), + 'timestamp': ('insertedAt', {unified_timestamp}), + 'release_year': ('production_year', {int_or_none}), + }), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/whowatch.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/whowatch.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/whowatch.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/whowatch.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/whyp.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/whyp.py new file mode 100644 index 0000000..fef89c3 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/whyp.py @@ -0,0 +1,50 @@ +from .common import InfoExtractor +from ..utils import ( + float_or_none, + str_or_none, + traverse_obj, + url_or_none, +) + + +class WhypIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?whyp\.it/tracks/(?P<id>\d+)' + _TESTS = [{ + 'url': 'https://www.whyp.it/tracks/18337/home-page-example-track-b4kq7', + 'md5': 'c1187b42ebf8605284e3dc92aeb33d16', + 'info_dict': { + 'url': 'https://cdn.whyp.it/50eb17cc-e9ff-4e18-b89b-dc9206a95cb1.mp3', + 'id': '18337', + 'title': 'Home Page Example Track', + 'description': 'md5:bd758000fb93f3159339c852b5b9133c', + 'ext': 'mp3', + 'duration': 52.82, + 'uploader': 'Brad', + 'uploader_id': '1', + 'thumbnail': 'https://cdn.whyp.it/a537bb36-3373-4c61-96c8-27fc1b2f427a.jpg', + }, + }, { + 'url': 'https://www.whyp.it/tracks/18337', + 'only_matching': True, + }] + + def _real_extract(self, url): + unique_id = self._match_id(url) + webpage = self._download_webpage(url, unique_id) + data = self._search_nuxt_data(webpage, unique_id)['rawTrack'] + + return { + 'url': data['audio_url'], + 'id': unique_id, + **traverse_obj(data, { + 'title': 'title', + 'description': 'description', + 'duration': ('duration', {float_or_none}), + 'uploader': ('user', 'username'), + 'uploader_id': ('user', 'id', {str_or_none}), + 'thumbnail': ('artwork_url', {url_or_none}), + }), + 'ext': 'mp3', + 'vcodec': 'none', + 'http_headers': {'Referer': 'https://whyp.it/'}, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wikimedia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wikimedia.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wikimedia.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wikimedia.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/willow.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/willow.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/willow.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/willow.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wimbledon.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wimbledon.py new file mode 100644 index 0000000..0223e54 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wimbledon.py @@ -0,0 +1,61 @@ +from .common import InfoExtractor +from ..utils import ( + parse_duration, + traverse_obj, +) + + +class WimbledonIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?wimbledon\.com/\w+/video/media/(?P<id>\d+)\.html' + _TESTS = [{ + 'url': 'https://www.wimbledon.com/en_GB/video/media/6330247525112.html', + 'info_dict': { + 'id': '6330247525112', + 'ext': 'mp4', + 'timestamp': 1687972186, + 'description': '', + 'thumbnail': r're:^https://[\w.-]+\.prod\.boltdns\.net/[^?#]+/image\.jpg', + 'upload_date': '20230628', + 'title': 'Coco Gauff | My Wimbledon Inspiration', + 'tags': ['features', 'trending', 'homepage'], + 'uploader_id': '3506358525001', + 'duration': 163072.0, + }, + }, { + 'url': 'https://www.wimbledon.com/en_GB/video/media/6308703111112.html', + 'info_dict': { + 'id': '6308703111112', + 'ext': 'mp4', + 'thumbnail': r're:^https://[\w.-]+\.prod\.boltdns\.net/[^?#]+/image\.jpg', + 'description': 'null', + 'upload_date': '20220629', + 'uploader_id': '3506358525001', + 'title': 'Roblox | WimbleWorld ', + 'duration': 101440.0, + 'tags': ['features', 'kids'], + 'timestamp': 1656500867, + }, + }, { + 'url': 'https://www.wimbledon.com/en_US/video/media/6309327106112.html', + 'only_matching': True, + }, { + 'url': 'https://www.wimbledon.com/es_Es/video/media/6308377909112.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + metadata = self._download_json( + f'https://www.wimbledon.com/relatedcontent/rest/v2/wim_v1/en/content/wim_v1_{video_id}_en', video_id) + + return { + '_type': 'url_transparent', + 'url': f'http://players.brightcove.net/3506358525001/default_default/index.html?videoId={video_id}', + 'ie_key': 'BrightcoveNew', + 'id': video_id, + **traverse_obj(metadata, { + 'title': 'title', + 'description': 'description', + 'duration': ('metadata', 'duration', {parse_duration}), + }), + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wimtv.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wimtv.py new file mode 100644 index 0000000..f9bf092 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wimtv.py @@ -0,0 +1,150 @@ +from .common import InfoExtractor +from ..utils import ( + determine_ext, + parse_duration, + urlencode_postdata, + ExtractorError, +) + + +class WimTVIE(InfoExtractor): + _player = None + _UUID_RE = r'[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}' + _VALID_URL = r'''(?x: + https?://platform\.wim\.tv/ + (?: + (?:embed/)?\? + |\#/webtv/.+?/ + ) + (?P<type>vod|live|cast)[=/] + (?P<id>%s).*?)''' % _UUID_RE + _EMBED_REGEX = [rf'<iframe[^>]+src=["\'](?P<url>{_VALID_URL})'] + _TESTS = [{ + # vod stream + 'url': 'https://platform.wim.tv/embed/?vod=db29fb32-bade-47b6-a3a6-cb69fe80267a', + 'md5': 'db29fb32-bade-47b6-a3a6-cb69fe80267a', + 'info_dict': { + 'id': 'db29fb32-bade-47b6-a3a6-cb69fe80267a', + 'ext': 'mp4', + 'title': 'AMA SUPERCROSS 2020 - R2 ST. LOUIS', + 'duration': 6481, + 'thumbnail': r're:https?://.+?/thumbnail/.+?/720$' + }, + 'params': { + 'skip_download': True, + }, + }, { + # live stream + 'url': 'https://platform.wim.tv/embed/?live=28e22c22-49db-40f3-8c37-8cbb0ff44556&autostart=true', + 'info_dict': { + 'id': '28e22c22-49db-40f3-8c37-8cbb0ff44556', + 'ext': 'mp4', + 'title': 'Streaming MSmotorTV', + 'is_live': True, + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://platform.wim.tv/#/webtv/automotornews/vod/422492b6-539e-474d-9c6b-68c9d5893365', + 'only_matching': True, + }, { + 'url': 'https://platform.wim.tv/#/webtv/renzoarborechannel/cast/f47e0d15-5b45-455e-bf0d-dba8ffa96365', + 'only_matching': True, + }] + + def _real_initialize(self): + if not self._player: + self._get_player_data() + + def _get_player_data(self): + msg_id = 'Player data' + self._player = {} + + datas = [{ + 'url': 'https://platform.wim.tv/common/libs/player/wimtv/wim-rest.js', + 'vars': [{ + 'regex': r'appAuth = "(.+?)"', + 'variable': 'app_auth', + }] + }, { + 'url': 'https://platform.wim.tv/common/config/endpointconfig.js', + 'vars': [{ + 'regex': r'PRODUCTION_HOSTNAME_THUMB = "(.+?)"', + 'variable': 'thumb_server', + }, { + 'regex': r'PRODUCTION_HOSTNAME_THUMB\s*\+\s*"(.+?)"', + 'variable': 'thumb_server_path', + }] + }] + + for data in datas: + temp = self._download_webpage(data['url'], msg_id) + for var in data['vars']: + val = self._search_regex(var['regex'], temp, msg_id) + if not val: + raise ExtractorError('%s not found' % var['variable']) + self._player[var['variable']] = val + + def _generate_token(self): + json = self._download_json( + 'https://platform.wim.tv/wimtv-server/oauth/token', 'Token generation', + headers={'Authorization': 'Basic %s' % self._player['app_auth']}, + data=urlencode_postdata({'grant_type': 'client_credentials'})) + token = json.get('access_token') + if not token: + raise ExtractorError('access token not generated') + return token + + def _generate_thumbnail(self, thumb_id, width='720'): + if not thumb_id or not self._player.get('thumb_server'): + return None + if not self._player.get('thumb_server_path'): + self._player['thumb_server_path'] = '' + return '%s%s/asset/thumbnail/%s/%s' % ( + self._player['thumb_server'], + self._player['thumb_server_path'], + thumb_id, width) + + def _real_extract(self, url): + urlc = self._match_valid_url(url).groupdict() + video_id = urlc['id'] + stream_type = is_live = None + if urlc['type'] in {'live', 'cast'}: + stream_type = urlc['type'] + '/channel' + is_live = True + else: + stream_type = 'vod' + is_live = False + token = self._generate_token() + json = self._download_json( + 'https://platform.wim.tv/wimtv-server/api/public/%s/%s/play' % ( + stream_type, video_id), video_id, + headers={'Authorization': 'Bearer %s' % token, + 'Content-Type': 'application/json'}, + data=bytes('{}', 'utf-8')) + + formats = [] + for src in json.get('srcs') or []: + if src.get('mimeType') == 'application/x-mpegurl': + formats.extend( + self._extract_m3u8_formats( + src.get('uniqueStreamer'), video_id, 'mp4')) + if src.get('mimeType') == 'video/flash': + formats.append({ + 'format_id': 'rtmp', + 'url': src.get('uniqueStreamer'), + 'ext': determine_ext(src.get('uniqueStreamer'), 'flv'), + 'rtmp_live': is_live, + }) + json = json.get('resource') + thumb = self._generate_thumbnail(json.get('thumbnailId')) + + return { + 'id': video_id, + 'title': json.get('title') or json.get('name'), + 'duration': parse_duration(json.get('duration')), + 'formats': formats, + 'thumbnail': thumb, + 'is_live': is_live, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wistia.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wistia.py new file mode 100644 index 0000000..bce5e83 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wistia.py @@ -0,0 +1,394 @@ +import re +import urllib.parse +from base64 import b64decode + +from .common import InfoExtractor +from ..networking import HEADRequest +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + determine_ext, + float_or_none, + int_or_none, + parse_qs, + traverse_obj, + try_get, + update_url_query, + urlhandle_detect_ext, +) + + +class WistiaBaseIE(InfoExtractor): + _VALID_ID_REGEX = r'(?P<id>[a-z0-9]{10})' + _VALID_URL_BASE = r'https?://(?:\w+\.)?wistia\.(?:net|com)/(?:embed/)?' + _EMBED_BASE_URL = 'http://fast.wistia.net/embed/' + + def _download_embed_config(self, config_type, config_id, referer): + base_url = self._EMBED_BASE_URL + '%s/%s' % (config_type, config_id) + embed_config = self._download_json( + base_url + '.json', config_id, headers={ + 'Referer': referer if referer.startswith('http') else base_url, # Some videos require this. + }) + + error = traverse_obj(embed_config, 'error') + if error: + raise ExtractorError( + f'Error while getting the playlist: {error}', expected=True) + + return embed_config + + def _get_real_ext(self, url): + ext = determine_ext(url, default_ext='bin') + if ext == 'bin': + urlh = self._request_webpage( + HEADRequest(url), None, note='Checking media extension', + errnote='HEAD request returned error', fatal=False) + if urlh: + ext = urlhandle_detect_ext(urlh, default='bin') + return 'mp4' if ext == 'mov' else ext + + def _extract_media(self, embed_config): + data = embed_config['media'] + video_id = data['hashedId'] + title = data['name'] + + formats = [] + thumbnails = [] + for a in data['assets']: + aurl = a.get('url') + if not aurl: + continue + astatus = a.get('status') + atype = a.get('type') + if (astatus is not None and astatus != 2) or atype in ('preview', 'storyboard'): + continue + elif atype in ('still', 'still_image'): + thumbnails.append({ + 'url': aurl.replace('.bin', f'.{self._get_real_ext(aurl)}'), + 'width': int_or_none(a.get('width')), + 'height': int_or_none(a.get('height')), + 'filesize': int_or_none(a.get('size')), + }) + else: + aext = a.get('ext') or self._get_real_ext(aurl) + display_name = a.get('display_name') + format_id = atype + if atype and atype.endswith('_video') and display_name: + format_id = '%s-%s' % (atype[:-6], display_name) + f = { + 'format_id': format_id, + 'url': aurl, + 'tbr': int_or_none(a.get('bitrate')) or None, + 'quality': 1 if atype == 'original' else None, + } + if display_name == 'Audio': + f.update({ + 'vcodec': 'none', + }) + else: + f.update({ + 'width': int_or_none(a.get('width')), + 'height': int_or_none(a.get('height')), + 'vcodec': a.get('codec'), + }) + if a.get('container') == 'm3u8' or aext == 'm3u8': + ts_f = f.copy() + ts_f.update({ + 'ext': 'ts', + 'format_id': f['format_id'].replace('hls-', 'ts-'), + 'url': f['url'].replace('.bin', '.ts'), + }) + formats.append(ts_f) + f.update({ + 'ext': 'mp4', + 'protocol': 'm3u8_native', + }) + else: + f.update({ + 'container': a.get('container'), + 'ext': aext, + 'filesize': int_or_none(a.get('size')), + }) + formats.append(f) + + subtitles = {} + for caption in data.get('captions', []): + language = caption.get('language') + if not language: + continue + subtitles[language] = [{ + 'url': self._EMBED_BASE_URL + 'captions/' + video_id + '.vtt?language=' + language, + }] + + return { + 'id': video_id, + 'title': title, + 'description': data.get('seoDescription'), + 'formats': formats, + 'thumbnails': thumbnails, + 'duration': float_or_none(data.get('duration')), + 'timestamp': int_or_none(data.get('createdAt')), + 'subtitles': subtitles, + } + + @classmethod + def _extract_from_webpage(cls, url, webpage): + from .teachable import TeachableIE + + if list(TeachableIE._extract_embed_urls(url, webpage)): + return + + yield from super()._extract_from_webpage(url, webpage) + + @classmethod + def _extract_wistia_async_embed(cls, webpage): + # https://wistia.com/support/embed-and-share/video-on-your-website + # https://wistia.com/support/embed-and-share/channel-embeds + yield from re.finditer( + r'''(?sx) + <(?:div|section)[^>]+class=([\"'])(?:(?!\1).)*?(?P<type>wistia[a-z_0-9]+)\s*\bwistia_async_(?P<id>[a-z0-9]{10})\b(?:(?!\1).)*?\1 + ''', webpage) + + @classmethod + def _extract_url_media_id(cls, url): + mobj = re.search(r'(?:wmediaid|wvideo(?:id)?)]?=(?P<id>[a-z0-9]{10})', urllib.parse.unquote_plus(url)) + if mobj: + return mobj.group('id') + + +class WistiaIE(WistiaBaseIE): + _VALID_URL = r'(?:wistia:|%s(?:iframe|medias)/)%s' % (WistiaBaseIE._VALID_URL_BASE, WistiaBaseIE._VALID_ID_REGEX) + _EMBED_REGEX = [ + r'''(?x) + <(?:meta[^>]+?content|(?:iframe|script)[^>]+?src)=["\'] + (?P<url>(?:https?:)?//(?:fast\.)?wistia\.(?:net|com)/embed/(?:iframe|medias)/[a-z0-9]{10}) + '''] + _TESTS = [{ + # with hls video + 'url': 'wistia:807fafadvk', + 'md5': 'daff0f3687a41d9a71b40e0e8c2610fe', + 'info_dict': { + 'id': '807fafadvk', + 'ext': 'mp4', + 'title': 'Drip Brennan Dunn Workshop', + 'description': 'a JV Webinars video', + 'upload_date': '20160518', + 'timestamp': 1463607249, + 'duration': 4987.11, + }, + 'skip': 'video unavailable', + }, { + 'url': 'wistia:a6ndpko1wg', + 'md5': '10c1ce9c4dde638202513ed17a3767bd', + 'info_dict': { + 'id': 'a6ndpko1wg', + 'ext': 'mp4', + 'title': 'Episode 2: Boxed Water\'s retention is thirsty', + 'upload_date': '20210324', + 'description': 'md5:da5994c2c2d254833b412469d9666b7a', + 'duration': 966.0, + 'timestamp': 1616614369, + 'thumbnail': 'https://embed-ssl.wistia.com/deliveries/53dc60239348dc9b9fba3755173ea4c2.png', + } + }, { + 'url': 'wistia:5vd7p4bct5', + 'md5': 'b9676d24bf30945d97060638fbfe77f0', + 'info_dict': { + 'id': '5vd7p4bct5', + 'ext': 'mp4', + 'title': 'md5:eaa9f64c4efd7b5f098b9b6118597679', + 'description': 'md5:a9bea0315f0616aa5df2dc413ddcdd0f', + 'upload_date': '20220915', + 'timestamp': 1663258727, + 'duration': 623.019, + 'thumbnail': r're:https?://embed(?:-ssl)?.wistia.com/.+\.jpg$', + }, + }, { + 'url': 'wistia:sh7fpupwlt', + 'only_matching': True, + }, { + 'url': 'http://fast.wistia.net/embed/iframe/sh7fpupwlt', + 'only_matching': True, + }, { + 'url': 'http://fast.wistia.com/embed/iframe/sh7fpupwlt', + 'only_matching': True, + }, { + 'url': 'http://fast.wistia.net/embed/medias/sh7fpupwlt.json', + 'only_matching': True, + }] + + _WEBPAGE_TESTS = [{ + 'url': 'https://www.weidert.com/blog/wistia-channels-video-marketing-tool', + 'info_dict': { + 'id': 'cqwukac3z1', + 'ext': 'mp4', + 'title': 'How Wistia Channels Can Help Capture Inbound Value From Your Video Content', + 'duration': 158.125, + 'timestamp': 1618974400, + 'description': 'md5:27abc99a758573560be72600ef95cece', + 'upload_date': '20210421', + 'thumbnail': 'https://embed-ssl.wistia.com/deliveries/6c551820ae950cdee2306d6cbe9ef742.jpg', + } + }, { + 'url': 'https://study.com/academy/lesson/north-american-exploration-failed-colonies-of-spain-france-england.html#lesson', + 'md5': 'b9676d24bf30945d97060638fbfe77f0', + 'info_dict': { + 'id': '5vd7p4bct5', + 'ext': 'mp4', + 'title': 'paywall_north-american-exploration-failed-colonies-of-spain-france-england', + 'upload_date': '20220915', + 'timestamp': 1663258727, + 'duration': 623.019, + 'thumbnail': 'https://embed-ssl.wistia.com/deliveries/83e6ec693e2c05a0ce65809cbaead86a.jpg', + 'description': 'a Paywall Videos video', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + embed_config = self._download_embed_config('medias', video_id, url) + return self._extract_media(embed_config) + + @classmethod + def _extract_embed_urls(cls, url, webpage): + urls = list(super()._extract_embed_urls(url, webpage)) + for match in cls._extract_wistia_async_embed(webpage): + if match.group('type') != 'wistia_channel': + urls.append('wistia:%s' % match.group('id')) + for match in re.finditer(r'(?:data-wistia-?id=["\']|Wistia\.embed\(["\']|id=["\']wistia_)(?P<id>[a-z0-9]{10})', + webpage): + urls.append('wistia:%s' % match.group('id')) + if not WistiaChannelIE._extract_embed_urls(url, webpage): # Fallback + media_id = cls._extract_url_media_id(url) + if media_id: + urls.append('wistia:%s' % match.group('id')) + return urls + + +class WistiaPlaylistIE(WistiaBaseIE): + _VALID_URL = r'%splaylists/%s' % (WistiaBaseIE._VALID_URL_BASE, WistiaBaseIE._VALID_ID_REGEX) + + _TEST = { + 'url': 'https://fast.wistia.net/embed/playlists/aodt9etokc', + 'info_dict': { + 'id': 'aodt9etokc', + }, + 'playlist_count': 3, + } + + def _real_extract(self, url): + playlist_id = self._match_id(url) + playlist = self._download_embed_config('playlists', playlist_id, url) + + entries = [] + for media in (try_get(playlist, lambda x: x[0]['medias']) or []): + embed_config = media.get('embed_config') + if not embed_config: + continue + entries.append(self._extract_media(embed_config)) + + return self.playlist_result(entries, playlist_id) + + +class WistiaChannelIE(WistiaBaseIE): + _VALID_URL = r'(?:wistiachannel:|%schannel/)%s' % (WistiaBaseIE._VALID_URL_BASE, WistiaBaseIE._VALID_ID_REGEX) + + _TESTS = [{ + # JSON Embed API returns 403, should fall back to webpage + 'url': 'https://fast.wistia.net/embed/channel/yvyvu7wjbg?wchannelid=yvyvu7wjbg', + 'info_dict': { + 'id': 'yvyvu7wjbg', + 'title': 'Copysmith Tutorials and Education!', + 'description': 'Learn all things Copysmith via short and informative videos!' + }, + 'playlist_mincount': 7, + 'expected_warnings': ['falling back to webpage'], + }, { + 'url': 'https://fast.wistia.net/embed/channel/3802iirk0l', + 'info_dict': { + 'id': '3802iirk0l', + 'title': 'The Roof', + }, + 'playlist_mincount': 20, + }, { + # link to popup video, follow --no-playlist + 'url': 'https://fast.wistia.net/embed/channel/3802iirk0l?wchannelid=3802iirk0l&wmediaid=sp5dqjzw3n', + 'info_dict': { + 'id': 'sp5dqjzw3n', + 'ext': 'mp4', + 'title': 'The Roof S2: The Modern CRO', + 'thumbnail': 'https://embed-ssl.wistia.com/deliveries/dadfa9233eaa505d5e0c85c23ff70741.png', + 'duration': 86.487, + 'description': 'A sales leader on The Roof? Man, they really must be letting anyone up here this season.\n', + 'timestamp': 1619790290, + 'upload_date': '20210430', + }, + 'params': {'noplaylist': True, 'skip_download': True}, + }] + _WEBPAGE_TESTS = [{ + 'url': 'https://www.profitwell.com/recur/boxed-out', + 'info_dict': { + 'id': '6jyvmqz6zs', + 'title': 'Boxed Out', + 'description': 'md5:14a8a93a1dbe236718e6a59f8c8c7bae', + }, + 'playlist_mincount': 30, + }, { + # section instead of div + 'url': 'https://360learning.com/studio/onboarding-joei/', + 'info_dict': { + 'id': 'z874k93n2o', + 'title': 'Onboarding Joei.', + 'description': 'Coming to you weekly starting Feb 19th.', + }, + 'playlist_mincount': 20, + }, { + 'url': 'https://amplitude.com/amplify-sessions?amp%5Bwmediaid%5D=pz0m0l0if3&%5Bwvideo%5D=pz0m0l0if3&wchannelid=emyjmwjf79&wmediaid=i8um783bdt', + 'info_dict': { + 'id': 'pz0m0l0if3', + 'title': 'A Framework for Improving Product Team Performance', + 'ext': 'mp4', + 'timestamp': 1653935275, + 'upload_date': '20220530', + 'description': 'Learn how to help your company improve and achieve your product related goals.', + 'duration': 1854.39, + 'thumbnail': 'https://embed-ssl.wistia.com/deliveries/12fd19e56413d9d6f04e2185c16a6f8854e25226.png', + }, + 'params': {'noplaylist': True, 'skip_download': True}, + }] + + def _real_extract(self, url): + channel_id = self._match_id(url) + media_id = self._extract_url_media_id(url) + if not self._yes_playlist(channel_id, media_id, playlist_label='channel'): + return self.url_result(f'wistia:{media_id}', 'Wistia') + + try: + data = self._download_embed_config('channel', channel_id, url) + except (ExtractorError, HTTPError): + # Some channels give a 403 from the JSON API + self.report_warning('Failed to download channel data from API, falling back to webpage.') + webpage = self._download_webpage(f'https://fast.wistia.net/embed/channel/{channel_id}', channel_id) + data = self._parse_json( + self._search_regex(r'wchanneljsonp-%s\'\]\s*=[^\"]*\"([A-Za-z0-9=/]*)' % channel_id, webpage, 'jsonp', channel_id), + channel_id, transform_source=lambda x: urllib.parse.unquote_plus(b64decode(x).decode('utf-8'))) + + # XXX: can there be more than one series? + series = traverse_obj(data, ('series', 0), default={}) + + entries = [ + self.url_result(f'wistia:{video["hashedId"]}', WistiaIE, title=video.get('name')) + for video in traverse_obj(series, ('sections', ..., 'videos', ...)) or [] + if video.get('hashedId') + ] + + return self.playlist_result( + entries, channel_id, playlist_title=series.get('title'), playlist_description=series.get('description')) + + @classmethod + def _extract_embed_urls(cls, url, webpage): + yield from super()._extract_embed_urls(url, webpage) + for match in cls._extract_wistia_async_embed(webpage): + if match.group('type') == 'wistia_channel': + # original url may contain wmediaid query param + yield update_url_query(f'wistiachannel:{match.group("id")}', parse_qs(url)) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wordpress.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wordpress.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wordpress.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wordpress.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/worldstarhiphop.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/worldstarhiphop.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/worldstarhiphop.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/worldstarhiphop.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wppilot.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wppilot.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wppilot.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wppilot.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wrestleuniverse.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wrestleuniverse.py new file mode 100644 index 0000000..145246a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wrestleuniverse.py @@ -0,0 +1,304 @@ +import base64 +import binascii +import json +import time +import uuid + +from .common import InfoExtractor +from ..dependencies import Cryptodome +from ..utils import ( + ExtractorError, + int_or_none, + jwt_decode_hs256, + traverse_obj, + try_call, + url_or_none, + urlencode_postdata, + variadic, +) + + +class WrestleUniverseBaseIE(InfoExtractor): + _NETRC_MACHINE = 'wrestleuniverse' + _VALID_URL_TMPL = r'https?://(?:www\.)?wrestle-universe\.com/(?:(?P<lang>\w{2})/)?%s/(?P<id>\w+)' + _API_HOST = 'api.wrestle-universe.com' + _API_PATH = None + _REAL_TOKEN = None + _TOKEN_EXPIRY = None + _REFRESH_TOKEN = None + _DEVICE_ID = None + _LOGIN_QUERY = {'key': 'AIzaSyCaRPBsDQYVDUWWBXjsTrHESi2r_F3RAdA'} + _LOGIN_HEADERS = { + 'Accept': '*/*', + 'Content-Type': 'application/json', + 'X-Client-Version': 'Chrome/JsCore/9.9.4/FirebaseCore-web', + 'X-Firebase-gmpid': '1:307308870738:web:820f38fe5150c8976e338b', + 'Referer': 'https://www.wrestle-universe.com/', + 'Origin': 'https://www.wrestle-universe.com', + } + + @property + def _TOKEN(self): + if not self._REAL_TOKEN or not self._TOKEN_EXPIRY: + token = try_call(lambda: self._get_cookies('https://www.wrestle-universe.com/')['token'].value) + if not token and not self._REFRESH_TOKEN: + self.raise_login_required() + self._TOKEN = token + + if not self._REAL_TOKEN or self._TOKEN_EXPIRY <= int(time.time()): + if not self._REFRESH_TOKEN: + raise ExtractorError( + 'Expired token. Refresh your cookies in browser and try again', expected=True) + self._refresh_token() + + return self._REAL_TOKEN + + @_TOKEN.setter + def _TOKEN(self, value): + self._REAL_TOKEN = value + + expiry = traverse_obj(value, ({jwt_decode_hs256}, 'exp', {int_or_none})) + if not expiry: + raise ExtractorError('There was a problem with the auth token') + self._TOKEN_EXPIRY = expiry + + def _perform_login(self, username, password): + login = self._download_json( + 'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword', None, + 'Logging in', query=self._LOGIN_QUERY, headers=self._LOGIN_HEADERS, data=json.dumps({ + 'returnSecureToken': True, + 'email': username, + 'password': password, + }, separators=(',', ':')).encode(), expected_status=400) + token = traverse_obj(login, ('idToken', {str})) + if not token: + raise ExtractorError( + f'Unable to log in: {traverse_obj(login, ("error", "message"))}', expected=True) + self._REFRESH_TOKEN = traverse_obj(login, ('refreshToken', {str})) + if not self._REFRESH_TOKEN: + self.report_warning('No refresh token was granted') + self._TOKEN = token + + def _real_initialize(self): + if self._DEVICE_ID: + return + + self._DEVICE_ID = self._configuration_arg('device_id', [None], ie_key=self._NETRC_MACHINE)[0] + if not self._DEVICE_ID: + self._DEVICE_ID = self.cache.load(self._NETRC_MACHINE, 'device_id') + if self._DEVICE_ID: + return + self._DEVICE_ID = str(uuid.uuid4()) + + self.cache.store(self._NETRC_MACHINE, 'device_id', self._DEVICE_ID) + + def _refresh_token(self): + refresh = self._download_json( + 'https://securetoken.googleapis.com/v1/token', None, 'Refreshing token', + query=self._LOGIN_QUERY, data=urlencode_postdata({ + 'grant_type': 'refresh_token', + 'refresh_token': self._REFRESH_TOKEN, + }), headers={ + **self._LOGIN_HEADERS, + 'Content-Type': 'application/x-www-form-urlencoded', + }) + if traverse_obj(refresh, ('refresh_token', {str})): + self._REFRESH_TOKEN = refresh['refresh_token'] + token = traverse_obj(refresh, 'access_token', 'id_token', expected_type=str) + if not token: + raise ExtractorError('No auth token returned from refresh request') + self._TOKEN = token + + def _call_api(self, video_id, param='', msg='API', auth=True, data=None, query={}, fatal=True): + headers = {'CA-CID': ''} + if data: + headers['Content-Type'] = 'application/json;charset=utf-8' + data = json.dumps(data, separators=(',', ':')).encode() + if auth and self._TOKEN: + headers['Authorization'] = f'Bearer {self._TOKEN}' + return self._download_json( + f'https://{self._API_HOST}/v1/{self._API_PATH}/{video_id}{param}', video_id, + note=f'Downloading {msg} JSON', errnote=f'Failed to download {msg} JSON', + data=data, headers=headers, query=query, fatal=fatal) + + def _call_encrypted_api(self, video_id, param='', msg='API', data={}, query={}, fatal=True): + if not Cryptodome.RSA: + raise ExtractorError('pycryptodomex not found. Please install', expected=True) + private_key = Cryptodome.RSA.generate(2048) + cipher = Cryptodome.PKCS1_OAEP.new(private_key, hashAlgo=Cryptodome.SHA1) + + def decrypt(data): + if not data: + return None + try: + return cipher.decrypt(base64.b64decode(data)).decode() + except (ValueError, binascii.Error) as e: + raise ExtractorError(f'Could not decrypt data: {e}') + + token = base64.b64encode(private_key.public_key().export_key('DER')).decode() + api_json = self._call_api(video_id, param, msg, data={ + 'deviceId': self._DEVICE_ID, + 'token': token, + **data, + }, query=query, fatal=fatal) + return api_json, decrypt + + def _download_metadata(self, url, video_id, lang, props_keys): + metadata = self._call_api(video_id, msg='metadata', query={'al': lang or 'ja'}, auth=False, fatal=False) + if not metadata: + webpage = self._download_webpage(url, video_id) + nextjs_data = self._search_nextjs_data(webpage, video_id) + metadata = traverse_obj(nextjs_data, ( + 'props', 'pageProps', *variadic(props_keys, (str, bytes, dict, set)), {dict})) or {} + return metadata + + def _get_formats(self, data, path, video_id=None): + hls_url = traverse_obj(data, path, get_all=False) + if not hls_url and not data.get('canWatch'): + self.raise_no_formats( + 'This account does not have access to the requested content', expected=True) + elif not hls_url: + self.raise_no_formats('No supported formats found') + return self._extract_m3u8_formats(hls_url, video_id, 'mp4', m3u8_id='hls', live=True) + + +class WrestleUniverseVODIE(WrestleUniverseBaseIE): + _VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'videos' + _TESTS = [{ + 'url': 'https://www.wrestle-universe.com/en/videos/dp8mpjmcKfxzUhEHM2uFws', + 'info_dict': { + 'id': 'dp8mpjmcKfxzUhEHM2uFws', + 'ext': 'mp4', + 'title': 'The 3rd “Futari wa Princess†Max Heart Tournament', + 'description': 'md5:318d5061e944797fbbb81d5c7dd00bf5', + 'location': '埼玉・春日部ãµã‚Œã‚ã„キューブ', + 'channel': 'tjpw', + 'duration': 7119, + 'timestamp': 1674979200, + 'upload_date': '20230129', + 'thumbnail': 'https://image.asset.wrestle-universe.com/8FjD67P8rZc446RBQs5RBN/8FjD67P8rZc446RBQs5RBN', + 'chapters': 'count:7', + 'cast': 'count:21', + }, + 'params': { + 'skip_download': 'm3u8', + }, + }] + + _API_PATH = 'videoEpisodes' + + def _real_extract(self, url): + lang, video_id = self._match_valid_url(url).group('lang', 'id') + metadata = self._download_metadata(url, video_id, lang, 'videoEpisodeFallbackData') + video_data = self._call_api(video_id, ':watch', 'watch', data={'deviceId': self._DEVICE_ID}) + + return { + 'id': video_id, + 'formats': self._get_formats(video_data, ( + (('protocolHls', 'url'), ('chromecastUrls', ...)), {url_or_none}), video_id), + **traverse_obj(metadata, { + 'title': ('displayName', {str}), + 'description': ('description', {str}), + 'channel': ('labels', 'group', {str}), + 'location': ('labels', 'venue', {str}), + 'timestamp': ('watchStartTime', {int_or_none}), + 'thumbnail': ('keyVisualUrl', {url_or_none}), + 'cast': ('casts', ..., 'displayName', {str}), + 'duration': ('duration', {int}), + 'chapters': ('videoChapters', lambda _, v: isinstance(v.get('start'), int), { + 'title': ('displayName', {str}), + 'start_time': ('start', {int}), + 'end_time': ('end', {int}), + }), + }), + } + + +class WrestleUniversePPVIE(WrestleUniverseBaseIE): + _VALID_URL = WrestleUniverseBaseIE._VALID_URL_TMPL % 'lives' + _TESTS = [{ + 'note': 'HLS AES-128 key obtained via API', + 'url': 'https://www.wrestle-universe.com/en/lives/buH9ibbfhdJAY4GKZcEuJX', + 'info_dict': { + 'id': 'buH9ibbfhdJAY4GKZcEuJX', + 'ext': 'mp4', + 'title': 'ã€PPV】Beyond the origins, into the future', + 'description': 'md5:9a872db68cd09be4a1e35a3ee8b0bdfc', + 'channel': 'tjpw', + 'location': 'æ±äº¬ãƒ»Twin Box AKIHABARA', + 'duration': 10098, + 'timestamp': 1675076400, + 'upload_date': '20230130', + 'thumbnail': 'https://image.asset.wrestle-universe.com/rJs2m7cBaLXrwCcxMdQGRM/rJs2m7cBaLXrwCcxMdQGRM', + 'thumbnails': 'count:3', + 'hls_aes': { + 'key': '5633184acd6e43f1f1ac71c6447a4186', + 'iv': '5bac71beb33197d5600337ce86de7862', + }, + }, + 'params': { + 'skip_download': 'm3u8', + }, + 'skip': 'No longer available', + }, { + 'note': 'unencrypted HLS', + 'url': 'https://www.wrestle-universe.com/en/lives/wUG8hP5iApC63jbtQzhVVx', + 'info_dict': { + 'id': 'wUG8hP5iApC63jbtQzhVVx', + 'ext': 'mp4', + 'title': 'GRAND PRINCESS \'22', + 'description': 'md5:e4f43d0d4262de3952ff34831bc99858', + 'channel': 'tjpw', + 'location': 'æ±äº¬ãƒ»ä¸¡å›½å›½æŠ€é¤¨', + 'duration': 18044, + 'timestamp': 1647665400, + 'upload_date': '20220319', + 'thumbnail': 'https://image.asset.wrestle-universe.com/i8jxSTCHPfdAKD4zN41Psx/i8jxSTCHPfdAKD4zN41Psx', + 'thumbnails': 'count:3', + }, + 'params': { + 'skip_download': 'm3u8', + }, + }] + + _API_PATH = 'events' + + def _real_extract(self, url): + lang, video_id = self._match_valid_url(url).group('lang', 'id') + metadata = self._download_metadata(url, video_id, lang, 'eventFallbackData') + + info = { + 'id': video_id, + **traverse_obj(metadata, { + 'title': ('displayName', {str}), + 'description': ('description', {str}), + 'channel': ('labels', 'group', {str}), + 'location': ('labels', 'venue', {str}), + 'timestamp': ('startTime', {int_or_none}), + 'thumbnails': (('keyVisualUrl', 'alterKeyVisualUrl', 'heroKeyVisualUrl'), {'url': {url_or_none}}), + }), + } + + ended_time = traverse_obj(metadata, ('endedTime', {int_or_none})) + if info.get('timestamp') and ended_time: + info['duration'] = ended_time - info['timestamp'] + + video_data, decrypt = self._call_encrypted_api( + video_id, ':watchArchive', 'watch archive', data={'method': 1}) + info['formats'] = self._get_formats(video_data, ( + ('hls', None), ('urls', 'chromecastUrls'), ..., {url_or_none}), video_id) + for f in info['formats']: + # bitrates are exaggerated in PPV playlists, so avoid wrong/huge filesize_approx values + if f.get('tbr'): + f['tbr'] = int(f['tbr'] / 2.5) + + hls_aes_key = traverse_obj(video_data, ('hls', 'key', {decrypt})) + if hls_aes_key: + info['hls_aes'] = { + 'key': hls_aes_key, + 'iv': traverse_obj(video_data, ('hls', 'iv', {decrypt})), + } + elif traverse_obj(video_data, ('hls', 'encryptType', {int})): + self.report_warning('HLS AES-128 key was not found in API response') + + return info diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wsj.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wsj.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wsj.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wsj.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/wwe.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wwe.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/wwe.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/wwe.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/wykop.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/wykop.py new file mode 100644 index 0000000..1d29cc8 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/wykop.py @@ -0,0 +1,268 @@ +import json + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + format_field, + parse_iso8601, + traverse_obj, + url_or_none, +) + + +class WykopBaseExtractor(InfoExtractor): + def _get_token(self, force_refresh=False): + if not force_refresh: + maybe_cached = self.cache.load('wykop', 'bearer') + if maybe_cached: + return maybe_cached + + new_token = traverse_obj( + self._do_call_api('auth', None, 'Downloading anonymous auth token', data={ + # hardcoded in frontend + 'key': 'w53947240748', + 'secret': 'd537d9e0a7adc1510842059ae5316419', + }), ('data', 'token')) + + self.cache.store('wykop', 'bearer', new_token) + return new_token + + def _do_call_api(self, path, video_id, note='Downloading JSON metadata', data=None, headers={}): + if data: + data = json.dumps({'data': data}).encode() + headers['Content-Type'] = 'application/json' + + return self._download_json( + f'https://wykop.pl/api/v3/{path}', video_id, + note=note, data=data, headers=headers) + + def _call_api(self, path, video_id, note='Downloading JSON metadata'): + token = self._get_token() + for retrying in range(2): + try: + return self._do_call_api(path, video_id, note, headers={'Authorization': f'Bearer {token}'}) + except ExtractorError as e: + if not retrying and isinstance(e.cause, HTTPError) and e.cause.status == 403: + token = self._get_token(True) + continue + raise + + def _common_data_extract(self, data): + author = traverse_obj(data, ('author', 'username'), expected_type=str) + + return { + '_type': 'url_transparent', + 'display_id': data.get('slug'), + 'url': traverse_obj(data, + ('media', 'embed', 'url'), # what gets an iframe embed + ('source', 'url'), # clickable url (dig only) + expected_type=url_or_none), + 'thumbnail': traverse_obj( + data, ('media', 'photo', 'url'), ('media', 'embed', 'thumbnail'), expected_type=url_or_none), + 'uploader': author, + 'uploader_id': author, + 'uploader_url': format_field(author, None, 'https://wykop.pl/ludzie/%s'), + 'timestamp': parse_iso8601(data.get('created_at'), delimiter=' '), # time it got submitted + 'like_count': traverse_obj(data, ('votes', 'up'), expected_type=int), + 'dislike_count': traverse_obj(data, ('votes', 'down'), expected_type=int), + 'comment_count': traverse_obj(data, ('comments', 'count'), expected_type=int), + 'age_limit': 18 if data.get('adult') else 0, + 'tags': data.get('tags'), + } + + +class WykopDigIE(WykopBaseExtractor): + IE_NAME = 'wykop:dig' + _VALID_URL = r'https?://(?:www\.)?wykop\.pl/link/(?P<id>\d+)' + + _TESTS = [{ + 'url': 'https://wykop.pl/link/6912923/najbardziej-zrzedliwy-kot-na-swiecie-i-frozen-planet-ii-i-bbc-earth', + 'info_dict': { + 'id': 'rlSTBvViflc', + 'ext': 'mp4', + 'title': 'Najbardziej zrzÄ™dliwy kot na Å›wiecie I Frozen Planet II I BBC Earth', + 'display_id': 'najbardziej-zrzedliwy-kot-na-swiecie-i-frozen-planet-ii-i-bbc-earth', + 'description': 'md5:ac0f87dea1cdcb6b0c53f3612a095c87', + 'tags': ['zwierzaczki', 'koty', 'smiesznykotek', 'humor', 'rozrywka', 'ciekawostki'], + 'age_limit': 0, + 'timestamp': 1669154480, + 'release_timestamp': 1669194241, + 'release_date': '20221123', + 'uploader': 'starnak', + 'uploader_id': 'starnak', + 'uploader_url': 'https://wykop.pl/ludzie/starnak', + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'thumbnail': r're:https?://wykop\.pl/cdn/.+', + 'view_count': int, + 'channel': 'BBC Earth', + 'channel_id': 'UCwmZiChSryoWQCZMIQezgTg', + 'channel_url': 'https://www.youtube.com/channel/UCwmZiChSryoWQCZMIQezgTg', + 'categories': ['Pets & Animals'], + 'upload_date': '20220923', + 'duration': 191, + 'channel_follower_count': int, + 'availability': 'public', + 'live_status': 'not_live', + 'playable_in_embed': True, + }, + }] + + @classmethod + def suitable(cls, url): + return cls._match_valid_url(url) and not WykopDigCommentIE.suitable(url) + + def _real_extract(self, url): + video_id = self._match_id(url) + data = self._call_api(f'links/{video_id}', video_id)['data'] + + return { + **self._common_data_extract(data), + 'id': video_id, + 'title': data['title'], + 'description': data.get('description'), + # time it got "digged" to the homepage + 'release_timestamp': parse_iso8601(data.get('published_at'), delimiter=' '), + } + + +class WykopDigCommentIE(WykopBaseExtractor): + IE_NAME = 'wykop:dig:comment' + _VALID_URL = r'https?://(?:www\.)?wykop\.pl/link/(?P<dig_id>\d+)/[^/]+/komentarz/(?P<id>\d+)' + + _TESTS = [{ + 'url': 'https://wykop.pl/link/6992589/strollowal-oszusta-przez-ponad-24-minuty-udawal-naiwniaka-i-nagral-rozmowe/komentarz/114540527/podobna-sytuacja-ponizej-ciekawa-dyskusja-z-oszustem-na-sam-koniec-sam-bylem-w-biurze-swiadkiem-podobnej-rozmowy-niemal-zakonczonej-sukcesem-bandyty-g', + 'info_dict': { + 'id': 'u6tEi2FmKZY', + 'ext': 'mp4', + 'title': 'md5:e7c741c5baa7ed6478000caf72865577', + 'display_id': 'md5:45b2d12bd0e262d09cc7cf7abc8412db', + 'description': 'md5:bcec7983429f9c0630f9deb9d3d1ba5e', + 'timestamp': 1674476945, + 'uploader': 'Bartholomew', + 'uploader_id': 'Bartholomew', + 'uploader_url': 'https://wykop.pl/ludzie/Bartholomew', + 'thumbnail': r're:https?://wykop\.pl/cdn/.+', + 'tags': [], + 'availability': 'public', + 'duration': 1838, + 'upload_date': '20230117', + 'categories': ['Entertainment'], + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'comment_count': int, + 'channel_follower_count': int, + 'playable_in_embed': True, + 'live_status': 'not_live', + 'age_limit': 0, + 'chapters': 'count:3', + 'channel': 'Poszukiwacze Okazji', + 'channel_id': 'UCzzvJDZThwv06dR4xmzrZBw', + 'channel_url': 'https://www.youtube.com/channel/UCzzvJDZThwv06dR4xmzrZBw', + }, + }] + + def _real_extract(self, url): + dig_id, comment_id = self._search_regex(self._VALID_URL, url, 'dig and comment ids', group=('dig_id', 'id')) + data = self._call_api(f'links/{dig_id}/comments/{comment_id}', comment_id)['data'] + + return { + **self._common_data_extract(data), + 'id': comment_id, + 'title': f"{traverse_obj(data, ('author', 'username'))} - {data.get('content') or ''}", + 'description': data.get('content'), + } + + +class WykopPostIE(WykopBaseExtractor): + IE_NAME = 'wykop:post' + _VALID_URL = r'https?://(?:www\.)?wykop\.pl/wpis/(?P<id>\d+)' + + _TESTS = [{ + 'url': 'https://wykop.pl/wpis/68893343/kot-koty-smiesznykotek', + 'info_dict': { + 'id': 'PL8JMjiUPHUhwc9ZlKa_5IFeBwBV8Xe7jI', + 'title': 'PawelW124 - #kot #koty #smiesznykotek', + 'description': '#kot #koty #smiesznykotek', + 'display_id': 'kot-koty-smiesznykotek', + 'tags': ['kot', 'koty', 'smiesznykotek'], + 'uploader': 'PawelW124', + 'uploader_id': 'PawelW124', + 'uploader_url': 'https://wykop.pl/ludzie/PawelW124', + 'timestamp': 1668938142, + 'age_limit': 0, + 'like_count': int, + 'dislike_count': int, + 'thumbnail': r're:https?://wykop\.pl/cdn/.+', + 'comment_count': int, + 'channel': 'Revan', + 'channel_id': 'UCW9T_-uZoiI7ROARQdTDyOw', + 'channel_url': 'https://www.youtube.com/channel/UCW9T_-uZoiI7ROARQdTDyOw', + 'upload_date': '20221120', + 'modified_date': '20220814', + 'availability': 'public', + 'view_count': int, + }, + 'playlist_mincount': 15, + 'params': { + 'flat_playlist': True, + } + }] + + @classmethod + def suitable(cls, url): + return cls._match_valid_url(url) and not WykopPostCommentIE.suitable(url) + + def _real_extract(self, url): + video_id = self._match_id(url) + data = self._call_api(f'entries/{video_id}', video_id)['data'] + + return { + **self._common_data_extract(data), + 'id': video_id, + 'title': f"{traverse_obj(data, ('author', 'username'))} - {data.get('content') or ''}", + 'description': data.get('content'), + } + + +class WykopPostCommentIE(WykopBaseExtractor): + IE_NAME = 'wykop:post:comment' + _VALID_URL = r'https?://(?:www\.)?wykop\.pl/wpis/(?P<post_id>\d+)/[^/#]+#(?P<id>\d+)' + + _TESTS = [{ + 'url': 'https://wykop.pl/wpis/70084873/test-test-test#249303979', + 'info_dict': { + 'id': 'confusedquickarmyant', + 'ext': 'mp4', + 'title': 'tpap - treść komentarza', + 'display_id': 'tresc-komentarza', + 'description': 'treść komentarza', + 'uploader': 'tpap', + 'uploader_id': 'tpap', + 'uploader_url': 'https://wykop.pl/ludzie/tpap', + 'timestamp': 1675349470, + 'upload_date': '20230202', + 'tags': [], + 'duration': 2.12, + 'age_limit': 0, + 'categories': [], + 'view_count': int, + 'like_count': int, + 'dislike_count': int, + 'thumbnail': r're:https?://wykop\.pl/cdn/.+', + }, + }] + + def _real_extract(self, url): + post_id, comment_id = self._search_regex(self._VALID_URL, url, 'post and comment ids', group=('post_id', 'id')) + data = self._call_api(f'entries/{post_id}/comments/{comment_id}', comment_id)['data'] + + return { + **self._common_data_extract(data), + 'id': comment_id, + 'title': f"{traverse_obj(data, ('author', 'username'))} - {data.get('content') or ''}", + 'description': data.get('content'), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xanimu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xanimu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xanimu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xanimu.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xbef.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xbef.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xbef.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xbef.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xboxclips.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xboxclips.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xboxclips.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xboxclips.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xfileshare.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xfileshare.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xfileshare.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xfileshare.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/xhamster.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xhamster.py new file mode 100644 index 0000000..01ac5dd --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/xhamster.py @@ -0,0 +1,465 @@ +import itertools +import re + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + clean_html, + determine_ext, + dict_get, + extract_attributes, + ExtractorError, + float_or_none, + int_or_none, + parse_duration, + str_or_none, + try_get, + unified_strdate, + url_or_none, + urljoin, +) + + +class XHamsterIE(InfoExtractor): + _DOMAINS = r'(?:xhamster\.(?:com|one|desi)|xhms\.pro|xhamster\d+\.com|xhday\.com|xhvid\.com)' + _VALID_URL = r'''(?x) + https?:// + (?:[^/?#]+\.)?%s/ + (?: + movies/(?P<id>[\dA-Za-z]+)/(?P<display_id>[^/]*)\.html| + videos/(?P<display_id_2>[^/]*)-(?P<id_2>[\dA-Za-z]+) + ) + ''' % _DOMAINS + _TESTS = [{ + 'url': 'https://xhamster.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'md5': '34e1ab926db5dc2750fed9e1f34304bb', + 'info_dict': { + 'id': '1509445', + 'display_id': 'femaleagent-shy-beauty-takes-the-bait', + 'ext': 'mp4', + 'title': 'FemaleAgent Shy beauty takes the bait', + 'timestamp': 1350194821, + 'upload_date': '20121014', + 'uploader': 'Ruseful2011', + 'uploader_id': 'ruseful2011', + 'duration': 893, + 'age_limit': 18, + }, + }, { + 'url': 'https://xhamster.com/videos/britney-spears-sexy-booty-2221348?hd=', + 'info_dict': { + 'id': '2221348', + 'display_id': 'britney-spears-sexy-booty', + 'ext': 'mp4', + 'title': 'Britney Spears Sexy Booty', + 'timestamp': 1379123460, + 'upload_date': '20130914', + 'uploader': 'jojo747400', + 'duration': 200, + 'age_limit': 18, + }, + 'params': { + 'skip_download': True, + }, + }, { + # empty seo, unavailable via new URL schema + 'url': 'http://xhamster.com/movies/5667973/.html', + 'info_dict': { + 'id': '5667973', + 'ext': 'mp4', + 'title': '....', + 'timestamp': 1454948101, + 'upload_date': '20160208', + 'uploader': 'parejafree', + 'uploader_id': 'parejafree', + 'duration': 72, + 'age_limit': 18, + }, + 'params': { + 'skip_download': True, + }, + }, { + # mobile site + 'url': 'https://m.xhamster.com/videos/cute-teen-jacqueline-solo-masturbation-8559111', + 'only_matching': True, + }, { + 'url': 'https://xhamster.com/movies/2272726/amber_slayed_by_the_knight.html', + 'only_matching': True, + }, { + # This video is visible for marcoalfa123456's friends only + 'url': 'https://it.xhamster.com/movies/7263980/la_mia_vicina.html', + 'only_matching': True, + }, { + # new URL schema + 'url': 'https://pt.xhamster.com/videos/euro-pedal-pumping-7937821', + 'only_matching': True, + }, { + 'url': 'https://xhamster.one/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'only_matching': True, + }, { + 'url': 'https://xhamster.desi/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'only_matching': True, + }, { + 'url': 'https://xhamster2.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'only_matching': True, + }, { + 'url': 'https://xhamster11.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'only_matching': True, + }, { + 'url': 'https://xhamster26.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445', + 'only_matching': True, + }, { + 'url': 'http://xhamster.com/movies/1509445/femaleagent_shy_beauty_takes_the_bait.html', + 'only_matching': True, + }, { + 'url': 'http://xhamster.com/movies/2221348/britney_spears_sexy_booty.html?hd', + 'only_matching': True, + }, { + 'url': 'http://de.xhamster.com/videos/skinny-girl-fucks-herself-hard-in-the-forest-xhnBJZx', + 'only_matching': True, + }, { + 'url': 'https://xhday.com/videos/strapless-threesome-xhh7yVf', + 'only_matching': True, + }, { + 'url': 'https://xhvid.com/videos/lk-mm-xhc6wn6', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('id') or mobj.group('id_2') + display_id = mobj.group('display_id') or mobj.group('display_id_2') + + desktop_url = re.sub(r'^(https?://(?:.+?\.)?)m\.', r'\1', url) + webpage, urlh = self._download_webpage_handle(desktop_url, video_id) + + error = self._html_search_regex( + r'<div[^>]+id=["\']videoClosed["\'][^>]*>(.+?)</div>', + webpage, 'error', default=None) + if error: + raise ExtractorError(error, expected=True) + + age_limit = self._rta_search(webpage) + + def get_height(s): + return int_or_none(self._search_regex( + r'^(\d+)[pP]', s, 'height', default=None)) + + initials = self._parse_json( + self._search_regex( + (r'window\.initials\s*=\s*({.+?})\s*;\s*</script>', + r'window\.initials\s*=\s*({.+?})\s*;'), webpage, 'initials', + default='{}'), + video_id, fatal=False) + if initials: + video = initials['videoModel'] + title = video['title'] + formats = [] + format_urls = set() + format_sizes = {} + sources = try_get(video, lambda x: x['sources'], dict) or {} + for format_id, formats_dict in sources.items(): + if not isinstance(formats_dict, dict): + continue + download_sources = try_get(sources, lambda x: x['download'], dict) or {} + for quality, format_dict in download_sources.items(): + if not isinstance(format_dict, dict): + continue + format_sizes[quality] = float_or_none(format_dict.get('size')) + for quality, format_item in formats_dict.items(): + if format_id == 'download': + # Download link takes some time to be generated, + # skipping for now + continue + format_url = format_item + format_url = url_or_none(format_url) + if not format_url or format_url in format_urls: + continue + format_urls.add(format_url) + formats.append({ + 'format_id': '%s-%s' % (format_id, quality), + 'url': format_url, + 'ext': determine_ext(format_url, 'mp4'), + 'height': get_height(quality), + 'filesize': format_sizes.get(quality), + 'http_headers': { + 'Referer': urlh.url, + }, + }) + xplayer_sources = try_get( + initials, lambda x: x['xplayerSettings']['sources'], dict) + if xplayer_sources: + hls_sources = xplayer_sources.get('hls') + if isinstance(hls_sources, dict): + for hls_format_key in ('url', 'fallback'): + hls_url = hls_sources.get(hls_format_key) + if not hls_url: + continue + hls_url = urljoin(url, hls_url) + if not hls_url or hls_url in format_urls: + continue + format_urls.add(hls_url) + formats.extend(self._extract_m3u8_formats( + hls_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + standard_sources = xplayer_sources.get('standard') + if isinstance(standard_sources, dict): + for format_id, formats_list in standard_sources.items(): + if not isinstance(formats_list, list): + continue + for standard_format in formats_list: + if not isinstance(standard_format, dict): + continue + for standard_format_key in ('url', 'fallback'): + standard_url = standard_format.get(standard_format_key) + if not standard_url: + continue + standard_url = urljoin(url, standard_url) + if not standard_url or standard_url in format_urls: + continue + format_urls.add(standard_url) + ext = determine_ext(standard_url, 'mp4') + if ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + standard_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + continue + quality = (str_or_none(standard_format.get('quality')) + or str_or_none(standard_format.get('label')) + or '') + formats.append({ + 'format_id': '%s-%s' % (format_id, quality), + 'url': standard_url, + 'ext': ext, + 'height': get_height(quality), + 'filesize': format_sizes.get(quality), + 'http_headers': { + 'Referer': standard_url, + }, + }) + + categories_list = video.get('categories') + if isinstance(categories_list, list): + categories = [] + for c in categories_list: + if not isinstance(c, dict): + continue + c_name = c.get('name') + if isinstance(c_name, compat_str): + categories.append(c_name) + else: + categories = None + + uploader_url = url_or_none(try_get(video, lambda x: x['author']['pageURL'])) + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': video.get('description'), + 'timestamp': int_or_none(video.get('created')), + 'uploader': try_get( + video, lambda x: x['author']['name'], compat_str), + 'uploader_url': uploader_url, + 'uploader_id': uploader_url.split('/')[-1] if uploader_url else None, + 'thumbnail': video.get('thumbURL'), + 'duration': int_or_none(video.get('duration')), + 'view_count': int_or_none(video.get('views')), + 'like_count': int_or_none(try_get( + video, lambda x: x['rating']['likes'], int)), + 'dislike_count': int_or_none(try_get( + video, lambda x: x['rating']['dislikes'], int)), + 'comment_count': int_or_none(video.get('views')), + 'age_limit': age_limit if age_limit is not None else 18, + 'categories': categories, + 'formats': formats, + } + + # Old layout fallback + + title = self._html_search_regex( + [r'<h1[^>]*>([^<]+)</h1>', + r'<meta[^>]+itemprop=".*?caption.*?"[^>]+content="(.+?)"', + r'<title[^>]*>(.+?)(?:,\s*[^,]*?\s*Porn\s*[^,]*?:\s*xHamster[^<]*| - xHamster\.com)'], + webpage, 'title') + + formats = [] + format_urls = set() + + sources = self._parse_json( + self._search_regex( + r'sources\s*:\s*({.+?})\s*,?\s*\n', webpage, 'sources', + default='{}'), + video_id, fatal=False) + for format_id, format_url in sources.items(): + format_url = url_or_none(format_url) + if not format_url: + continue + if format_url in format_urls: + continue + format_urls.add(format_url) + formats.append({ + 'format_id': format_id, + 'url': format_url, + 'height': get_height(format_id), + }) + + video_url = self._search_regex( + [r'''file\s*:\s*(?P["'])(?P.+?)(?P=q)''', + r'''["'])(?P.+?)(?P=q)\s+class=["']mp4Thumb''', + r''']+file=(?P["'])(?P.+?)(?P=q)[^>]*>'''], + webpage, 'video url', group='mp4', default=None) + if video_url and video_url not in format_urls: + formats.append({ + 'url': video_url, + }) + + # Only a few videos have an description + mobj = re.search(r'Description: ([^<]+)', webpage) + description = mobj.group(1) if mobj else None + + upload_date = unified_strdate(self._search_regex( + r'hint=["\'](\d{4}-\d{2}-\d{2}) \d{2}:\d{2}:\d{2} [A-Z]{3,4}', + webpage, 'upload date', fatal=False)) + + uploader = self._html_search_regex( + r']+itemprop=["\']author[^>]+>]+>]+>([^<]+)', + webpage, 'uploader', default='anonymous') + + thumbnail = self._search_regex( + [r'''["']thumbUrl["']\s*:\s*(?P["'])(?P.+?)(?P=q)''', + r''']+"poster"=(?P["'])(?P.+?)(?P=q)[^>]*>'''], + webpage, 'thumbnail', fatal=False, group='thumbnail') + + duration = parse_duration(self._search_regex( + [r'<[^<]+\bitemprop=["\']duration["\'][^<]+\bcontent=["\'](.+?)["\']', + r'Runtime:\s*\s*([\d:]+)'], webpage, + 'duration', fatal=False)) + + view_count = int_or_none(self._search_regex( + r'content=["\']User(?:View|Play)s:(\d+)', + webpage, 'view count', fatal=False)) + + mobj = re.search(r'hint=[\'"](?P\d+) Likes / (?P\d+) Dislikes', webpage) + (like_count, dislike_count) = (mobj.group('likecount'), mobj.group('dislikecount')) if mobj else (None, None) + + mobj = re.search(r'Comments \((?P\d+)\)', webpage) + comment_count = mobj.group('commentcount') if mobj else 0 + + categories_html = self._search_regex( + r'(?s)Categories:.+?)', webpage, + 'categories', default=None) + categories = [clean_html(category) for category in re.findall( + r']+>(.+?)
      ', categories_html)] if categories_html else None + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': description, + 'upload_date': upload_date, + 'uploader': uploader, + 'uploader_id': uploader.lower() if uploader else None, + 'thumbnail': thumbnail, + 'duration': duration, + 'view_count': view_count, + 'like_count': int_or_none(like_count), + 'dislike_count': int_or_none(dislike_count), + 'comment_count': int_or_none(comment_count), + 'age_limit': age_limit, + 'categories': categories, + 'formats': formats, + } + + +class XHamsterEmbedIE(InfoExtractor): + _VALID_URL = r'https?://(?:[^/?#]+\.)?%s/xembed\.php\?video=(?P\d+)' % XHamsterIE._DOMAINS + _EMBED_REGEX = [r']+?src=(["\'])(?P(?:https?:)?//(?:www\.)?xhamster\.com/xembed\.php\?video=\d+)\1'] + _TEST = { + 'url': 'http://xhamster.com/xembed.php?video=3328539', + 'info_dict': { + 'id': '3328539', + 'ext': 'mp4', + 'title': 'Pen Masturbation', + 'timestamp': 1406581861, + 'upload_date': '20140728', + 'uploader': 'ManyakisArt', + 'duration': 5, + 'age_limit': 18, + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + + video_url = self._search_regex( + r'href="(https?://xhamster\.com/(?:movies/{0}/[^"]*\.html|videos/[^/]*-{0})[^"]*)"'.format(video_id), + webpage, 'xhamster url', default=None) + + if not video_url: + vars = self._parse_json( + self._search_regex(r'vars\s*:\s*({.+?})\s*,\s*\n', webpage, 'vars'), + video_id) + video_url = dict_get(vars, ('downloadLink', 'homepageLink', 'commentsLink', 'shareUrl')) + + return self.url_result(video_url, 'XHamster') + + +class XHamsterUserIE(InfoExtractor): + _VALID_URL = rf'https?://(?:[^/?#]+\.)?{XHamsterIE._DOMAINS}/(?:(?Pusers)|creators)/(?P[^/?#&]+)' + _TESTS = [{ + # Paginated user profile + 'url': 'https://xhamster.com/users/netvideogirls/videos', + 'info_dict': { + 'id': 'netvideogirls', + }, + 'playlist_mincount': 267, + }, { + # Non-paginated user profile + 'url': 'https://xhamster.com/users/firatkaan/videos', + 'info_dict': { + 'id': 'firatkaan', + }, + 'playlist_mincount': 1, + }, { + 'url': 'https://xhamster.com/creators/squirt-orgasm-69', + 'info_dict': { + 'id': 'squirt-orgasm-69', + }, + 'playlist_mincount': 150, + }, { + 'url': 'https://xhday.com/users/mobhunter', + 'only_matching': True, + }, { + 'url': 'https://xhvid.com/users/pelushe21', + 'only_matching': True, + }] + + def _entries(self, user_id, is_user): + prefix, suffix = ('users', 'videos') if is_user else ('creators', 'exclusive') + next_page_url = f'https://xhamster.com/{prefix}/{user_id}/{suffix}/1' + for pagenum in itertools.count(1): + page = self._download_webpage( + next_page_url, user_id, 'Downloading page %s' % pagenum) + for video_tag in re.findall( + r'(]+class=["\'].*?\bvideo-thumb__image-container[^>]+>)', + page): + video = extract_attributes(video_tag) + video_url = url_or_none(video.get('href')) + if not video_url or not XHamsterIE.suitable(video_url): + continue + video_id = XHamsterIE._match_id(video_url) + yield self.url_result( + video_url, ie=XHamsterIE.ie_key(), video_id=video_id) + mobj = re.search(r']+data-page=["\']next[^>]+>', page) + if not mobj: + break + next_page = extract_attributes(mobj.group(0)) + next_page_url = url_or_none(next_page.get('href')) + if not next_page_url: + break + + def _real_extract(self, url): + user, user_id = self._match_valid_url(url).group('user', 'id') + return self.playlist_result(self._entries(user_id, bool(user)), user_id) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/ximalaya.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ximalaya.py new file mode 100644 index 0000000..3d5e6cf --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/ximalaya.py @@ -0,0 +1,167 @@ +import math + +from .common import InfoExtractor +from ..utils import traverse_obj, try_call, InAdvancePagedList + + +class XimalayaBaseIE(InfoExtractor): + _GEO_COUNTRIES = ['CN'] + + +class XimalayaIE(XimalayaBaseIE): + IE_NAME = 'ximalaya' + IE_DESC = '喜马拉雅FM' + _VALID_URL = r'https?://(?:www\.|m\.)?ximalaya\.com/(:?(?P\d+)/)?sound/(?P[0-9]+)' + _TESTS = [ + { + 'url': 'http://www.ximalaya.com/sound/47740352/', + 'info_dict': { + 'id': '47740352', + 'ext': 'm4a', + 'uploader': 'å°å½¬å½¬çˆ±å¬ä¹¦', + 'uploader_id': 61425525, + 'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/', + 'title': '261.å”诗三百首.å·å…«.é€å­Ÿæµ©ç„¶ä¹‹å¹¿é™µ.æŽç™½', + 'description': "contains:《é€å­Ÿæµ©ç„¶ä¹‹å¹¿é™µã€‹\n作者:æŽç™½\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟è§é•¿æ±Ÿå¤©é™…æµã€‚", + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': [ + { + 'name': 'cover_url', + 'url': r're:^https?://.*\.jpg', + }, + { + 'name': 'cover_url_142', + 'url': r're:^https?://.*\.jpg', + 'width': 180, + 'height': 180 + } + ], + 'categories': ['å…¶ä»–'], + 'duration': 93, + 'view_count': int, + 'like_count': int, + } + }, + { + 'url': 'http://m.ximalaya.com/61425525/sound/47740352/', + 'info_dict': { + 'id': '47740352', + 'ext': 'm4a', + 'uploader': 'å°å½¬å½¬çˆ±å¬ä¹¦', + 'uploader_id': 61425525, + 'uploader_url': 'http://www.ximalaya.com/zhubo/61425525/', + 'title': '261.å”诗三百首.å·å…«.é€å­Ÿæµ©ç„¶ä¹‹å¹¿é™µ.æŽç™½', + 'description': "contains:《é€å­Ÿæµ©ç„¶ä¹‹å¹¿é™µã€‹\n作者:æŽç™½\n故人西辞黄鹤楼,烟花三月下扬州。\n孤帆远影碧空尽,惟è§é•¿æ±Ÿå¤©é™…æµã€‚", + 'thumbnail': r're:^https?://.*\.jpg', + 'thumbnails': [ + { + 'name': 'cover_url', + 'url': r're:^https?://.*\.jpg', + }, + { + 'name': 'cover_url_142', + 'url': r're:^https?://.*\.jpg', + 'width': 180, + 'height': 180 + } + ], + 'categories': ['人文'], + 'duration': 93, + 'view_count': int, + 'like_count': int, + } + } + ] + + def _real_extract(self, url): + scheme = 'https' if url.startswith('https') else 'http' + + audio_id = self._match_id(url) + audio_info_file = '%s://m.ximalaya.com/tracks/%s.json' % (scheme, audio_id) + audio_info = self._download_json(audio_info_file, audio_id, + 'Downloading info json %s' % audio_info_file, + 'Unable to download info file') + + formats = [{ + 'format_id': f'{bps}k', + 'url': audio_info[k], + 'abr': bps, + 'vcodec': 'none' + } for bps, k in ((24, 'play_path_32'), (64, 'play_path_64')) if audio_info.get(k)] + + thumbnails = [] + for k in audio_info.keys(): + # cover pics kyes like: cover_url', 'cover_url_142' + if k.startswith('cover_url'): + thumbnail = {'name': k, 'url': audio_info[k]} + if k == 'cover_url_142': + thumbnail['width'] = 180 + thumbnail['height'] = 180 + thumbnails.append(thumbnail) + + audio_uploader_id = audio_info.get('uid') + + audio_description = try_call( + lambda: audio_info['intro'].replace('\r\n\r\n\r\n ', '\n').replace('\r\n', '\n')) + + return { + 'id': audio_id, + 'uploader': audio_info.get('nickname'), + 'uploader_id': audio_uploader_id, + 'uploader_url': f'{scheme}://www.ximalaya.com/zhubo/{audio_uploader_id}/' if audio_uploader_id else None, + 'title': audio_info['title'], + 'thumbnails': thumbnails, + 'description': audio_description, + 'categories': list(filter(None, [audio_info.get('category_name')])), + 'duration': audio_info.get('duration'), + 'view_count': audio_info.get('play_count'), + 'like_count': audio_info.get('favorites_count'), + 'formats': formats, + } + + +class XimalayaAlbumIE(XimalayaBaseIE): + IE_NAME = 'ximalaya:album' + IE_DESC = '喜马拉雅FM 专辑' + _VALID_URL = r'https?://(?:www\.|m\.)?ximalaya\.com/(?:\d+/)?album/(?P[0-9]+)' + _TESTS = [{ + 'url': 'http://www.ximalaya.com/61425525/album/5534601/', + 'info_dict': { + 'title': 'å”诗三百首(å«èµæžï¼‰', + 'id': '5534601', + }, + 'playlist_mincount': 323, + }, { + 'url': 'https://www.ximalaya.com/album/6912905', + 'info_dict': { + 'title': '埃克哈特《修炼当下的力é‡ã€‹', + 'id': '6912905', + }, + 'playlist_mincount': 41, + }] + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + first_page = self._fetch_page(playlist_id, 1) + page_count = math.ceil(first_page['trackTotalCount'] / first_page['pageSize']) + + entries = InAdvancePagedList( + lambda idx: self._get_entries(self._fetch_page(playlist_id, idx + 1) if idx else first_page), + page_count, first_page['pageSize']) + + title = traverse_obj(first_page, ('tracks', 0, 'albumTitle'), expected_type=str) + + return self.playlist_result(entries, playlist_id, title) + + def _fetch_page(self, playlist_id, page_idx): + return self._download_json( + 'https://www.ximalaya.com/revision/album/v1/getTracksList', + playlist_id, note=f'Downloading tracks list page {page_idx}', + query={'albumId': playlist_id, 'pageNum': page_idx})['data'] + + def _get_entries(self, page_data): + for e in page_data['tracks']: + yield self.url_result( + self._proto_relative_url(f'//www.ximalaya.com{e["url"]}'), + XimalayaIE, e.get('trackId'), e.get('title')) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xinpianchang.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xinpianchang.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xinpianchang.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xinpianchang.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xminus.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xminus.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xminus.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xminus.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xnxx.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xnxx.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xnxx.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xnxx.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xstream.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xstream.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xstream.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xstream.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/xtube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xtube.py new file mode 100644 index 0000000..db82925 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/xtube.py @@ -0,0 +1,214 @@ +import itertools +import re + +from .common import InfoExtractor +from ..networking import Request +from ..utils import ( + int_or_none, + js_to_json, + orderedSet, + parse_duration, + str_to_int, + url_or_none, +) + + +class XTubeIE(InfoExtractor): + _VALID_URL = r'''(?x) + (?: + xtube:| + https?://(?:www\.)?xtube\.com/(?:watch\.php\?.*\bv=|video-watch/(?:embedded/)?(?P[^/]+)-) + ) + (?P[^/?&#]+) + ''' + + _TESTS = [{ + # old URL schema + 'url': 'http://www.xtube.com/watch.php?v=kVTUy_G222_', + 'md5': '092fbdd3cbe292c920ef6fc6a8a9cdab', + 'info_dict': { + 'id': 'kVTUy_G222_', + 'ext': 'mp4', + 'title': 'strange erotica', + 'description': 'contains:an ET kind of thing', + 'uploader': 'greenshowers', + 'duration': 450, + 'view_count': int, + 'comment_count': int, + 'age_limit': 18, + } + }, { + # new URL schema + 'url': 'http://www.xtube.com/video-watch/strange-erotica-625837', + 'only_matching': True, + }, { + 'url': 'xtube:625837', + 'only_matching': True, + }, { + 'url': 'xtube:kVTUy_G222_', + 'only_matching': True, + }, { + 'url': 'https://www.xtube.com/video-watch/embedded/milf-tara-and-teen-shared-and-cum-covered-extreme-bukkake-32203482?embedsize=big', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('id') + display_id = mobj.group('display_id') + + if not display_id: + display_id = video_id + + if video_id.isdigit() and len(video_id) < 11: + url_pattern = 'http://www.xtube.com/video-watch/-%s' + else: + url_pattern = 'http://www.xtube.com/watch.php?v=%s' + + webpage = self._download_webpage( + url_pattern % video_id, display_id, headers={ + 'Cookie': 'age_verified=1; cookiesAccepted=1', + }) + + title, thumbnail, duration, sources, media_definition = [None] * 5 + + config = self._parse_json(self._search_regex( + r'playerConf\s*=\s*({.+?})\s*,\s*(?:\n|loaderConf|playerWrapper)', webpage, 'config', + default='{}'), video_id, transform_source=js_to_json, fatal=False) + if config: + config = config.get('mainRoll') + if isinstance(config, dict): + title = config.get('title') + thumbnail = config.get('poster') + duration = int_or_none(config.get('duration')) + sources = config.get('sources') or config.get('format') + media_definition = config.get('mediaDefinition') + + if not isinstance(sources, dict) and not media_definition: + sources = self._parse_json(self._search_regex( + r'(["\'])?sources\1?\s*:\s*(?P{.+?}),', + webpage, 'sources', group='sources'), video_id, + transform_source=js_to_json) + + formats = [] + format_urls = set() + + if isinstance(sources, dict): + for format_id, format_url in sources.items(): + format_url = url_or_none(format_url) + if not format_url: + continue + if format_url in format_urls: + continue + format_urls.add(format_url) + formats.append({ + 'url': format_url, + 'format_id': format_id, + 'height': int_or_none(format_id), + }) + + if isinstance(media_definition, list): + for media in media_definition: + video_url = url_or_none(media.get('videoUrl')) + if not video_url: + continue + if video_url in format_urls: + continue + format_urls.add(video_url) + format_id = media.get('format') + if format_id == 'hls': + formats.extend(self._extract_m3u8_formats( + video_url, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + elif format_id == 'mp4': + height = int_or_none(media.get('quality')) + formats.append({ + 'url': video_url, + 'format_id': '%s-%d' % (format_id, height) if height else format_id, + 'height': height, + }) + + self._remove_duplicate_formats(formats) + + if not title: + title = self._search_regex( + (r'

      \s*(?P[^<]+?)\s*</h1>', r'videoTitle\s*:\s*(["\'])(?P<title>.+?)\1'), + webpage, 'title', group='title') + description = self._og_search_description( + webpage, default=None) or self._html_search_meta( + 'twitter:description', webpage, default=None) or self._search_regex( + r'</h1>\s*<p>([^<]+)', webpage, 'description', fatal=False) + uploader = self._search_regex( + (r'<input[^>]+name="contentOwnerId"[^>]+value="([^"]+)"', + r'<span[^>]+class="nickname"[^>]*>([^<]+)'), + webpage, 'uploader', fatal=False) + if not duration: + duration = parse_duration(self._search_regex( + r'<dt>Runtime:?</dt>\s*<dd>([^<]+)</dd>', + webpage, 'duration', fatal=False)) + view_count = str_to_int(self._search_regex( + (r'["\']viewsCount["\'][^>]*>(\d+)\s+views', + r'<dt>Views:?</dt>\s*<dd>([\d,\.]+)</dd>'), + webpage, 'view count', fatal=False)) + comment_count = str_to_int(self._html_search_regex( + r'>Comments? \(([\d,\.]+)\)<', + webpage, 'comment count', fatal=False)) + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'uploader': uploader, + 'duration': duration, + 'view_count': view_count, + 'comment_count': comment_count, + 'age_limit': 18, + 'formats': formats, + } + + +class XTubeUserIE(InfoExtractor): + IE_DESC = 'XTube user profile' + _VALID_URL = r'https?://(?:www\.)?xtube\.com/profile/(?P<id>[^/]+-\d+)' + _TEST = { + 'url': 'http://www.xtube.com/profile/greenshowers-4056496', + 'info_dict': { + 'id': 'greenshowers-4056496', + 'age_limit': 18, + }, + 'playlist_mincount': 154, + } + + def _real_extract(self, url): + user_id = self._match_id(url) + + entries = [] + for pagenum in itertools.count(1): + request = Request( + 'http://www.xtube.com/profile/%s/videos/%d' % (user_id, pagenum), + headers={ + 'Cookie': 'popunder=4', + 'X-Requested-With': 'XMLHttpRequest', + 'Referer': url, + }) + + page = self._download_json( + request, user_id, 'Downloading videos JSON page %d' % pagenum) + + html = page.get('html') + if not html: + break + + for video_id in orderedSet([video_id for _, video_id in re.findall( + r'data-plid=(["\'])(.+?)\1', html)]): + entries.append(self.url_result('xtube:%s' % video_id, XTubeIE.ie_key())) + + page_count = int_or_none(page.get('pageCount')) + if not page_count or pagenum == page_count: + break + + playlist = self.playlist_result(entries, user_id) + playlist['age_limit'] = 18 + return playlist diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xuite.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xuite.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xuite.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xuite.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xvideos.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xvideos.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xvideos.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xvideos.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/xxxymovies.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/xxxymovies.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/xxxymovies.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/xxxymovies.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/yahoo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yahoo.py new file mode 100644 index 0000000..24148a0 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/yahoo.py @@ -0,0 +1,430 @@ +import hashlib +import itertools +import urllib.parse + +from .common import InfoExtractor, SearchInfoExtractor +from .youtube import YoutubeIE +from ..utils import ( + ExtractorError, + clean_html, + int_or_none, + mimetype2ext, + parse_iso8601, + traverse_obj, + try_get, + url_or_none, +) + + +class YahooIE(InfoExtractor): + IE_DESC = 'Yahoo screen and movies' + _VALID_URL = r'(?P<url>https?://(?:(?P<country>[a-zA-Z]{2}(?:-[a-zA-Z]{2})?|malaysia)\.)?(?:[\da-zA-Z_-]+\.)?yahoo\.com/(?:[^/]+/)*(?P<id>[^?&#]*-[0-9]+(?:-[a-z]+)?)\.html)' + _EMBED_REGEX = [r'<iframe[^>]+?src=(["\'])(?P<url>https?://(?:screen|movies)\.yahoo\.com/.+?\.html\?format=embed)\1'] + + _TESTS = [{ + 'url': 'http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html', + 'info_dict': { + 'id': '2d25e626-2378-391f-ada0-ddaf1417e588', + 'ext': 'mp4', + 'title': 'Julian Smith & Travis Legg Watch Julian Smith', + 'description': 'Julian and Travis watch Julian Smith', + 'duration': 6863, + 'timestamp': 1369812016, + 'upload_date': '20130529', + }, + 'skip': 'No longer exists', + }, { + 'url': 'https://screen.yahoo.com/community/community-sizzle-reel-203225340.html?format=embed', + 'md5': '7993e572fac98e044588d0b5260f4352', + 'info_dict': { + 'id': '4fe78544-8d48-39d8-97cd-13f205d9fcdb', + 'ext': 'mp4', + 'title': "Yahoo Saves 'Community'", + 'description': 'md5:4d4145af2fd3de00cbb6c1d664105053', + 'duration': 170, + 'timestamp': 1406838636, + 'upload_date': '20140731', + }, + 'skip': 'Unfortunately, this video is not available in your region', + }, { + 'url': 'https://uk.screen.yahoo.com/editor-picks/cute-raccoon-freed-drain-using-091756545.html', + 'md5': '71298482f7c64cbb7fa064e4553ff1c1', + 'info_dict': { + 'id': 'b3affa53-2e14-3590-852b-0e0db6cd1a58', + 'ext': 'webm', + 'title': 'Cute Raccoon Freed From Drain\u00a0Using Angle Grinder', + 'description': 'md5:f66c890e1490f4910a9953c941dee944', + 'duration': 97, + 'timestamp': 1414489862, + 'upload_date': '20141028', + }, + 'skip': 'No longer exists', + }, { + 'url': 'http://news.yahoo.com/video/china-moses-crazy-blues-104538833.html', + 'md5': '88e209b417f173d86186bef6e4d1f160', + 'info_dict': { + 'id': 'f885cf7f-43d4-3450-9fac-46ac30ece521', + 'ext': 'mp4', + 'title': 'China Moses Is Crazy About the Blues', + 'description': 'md5:9900ab8cd5808175c7b3fe55b979bed0', + 'duration': 128, + 'timestamp': 1385722202, + 'upload_date': '20131129', + } + }, { + 'url': 'https://www.yahoo.com/movies/v/true-story-trailer-173000497.html', + 'md5': '2a9752f74cb898af5d1083ea9f661b58', + 'info_dict': { + 'id': '071c4013-ce30-3a93-a5b2-e0413cd4a9d1', + 'ext': 'mp4', + 'title': '\'True Story\' Trailer', + 'description': 'True Story', + 'duration': 150, + 'timestamp': 1418919206, + 'upload_date': '20141218', + }, + }, { + 'url': 'https://gma.yahoo.com/pizza-delivery-man-surprised-huge-tip-college-kids-195200785.html', + 'only_matching': True, + }, { + 'note': 'NBC Sports embeds', + 'url': 'http://sports.yahoo.com/blogs/ncaab-the-dagger/tyler-kalinoski-s-buzzer-beater-caps-davidson-s-comeback-win-185609842.html?guid=nbc_cbk_davidsonbuzzerbeater_150313', + 'info_dict': { + 'id': '9CsDKds0kvHI', + 'ext': 'flv', + 'description': 'md5:df390f70a9ba7c95ff1daace988f0d8d', + 'title': 'Tyler Kalinoski hits buzzer-beater to lift Davidson', + 'upload_date': '20150313', + 'uploader': 'NBCU-SPORTS', + 'timestamp': 1426270238, + }, + }, { + 'url': 'https://tw.news.yahoo.com/-100120367.html', + 'only_matching': True, + }, { + # Query result is embedded in webpage, but explicit request to video API fails with geo restriction + 'url': 'https://screen.yahoo.com/community/communitary-community-episode-1-ladders-154501237.html', + 'md5': '4fbafb9c9b6f07aa8f870629f6671b35', + 'info_dict': { + 'id': '1f32853c-a271-3eef-8cb6-f6d6872cb504', + 'ext': 'mp4', + 'title': 'Communitary - Community Episode 1: Ladders', + 'description': 'md5:8fc39608213295748e1e289807838c97', + 'duration': 1646, + 'timestamp': 1440436550, + 'upload_date': '20150824', + 'series': 'Communitary', + 'season_number': 6, + 'episode_number': 1, + }, + 'skip': 'No longer exists', + }, { + # ytwnews://cavideo/ + 'url': 'https://tw.video.yahoo.com/movie-tw/單車天使-中文版é -092316541.html', + 'info_dict': { + 'id': 'ba133ff2-0793-3510-b636-59dfe9ff6cff', + 'ext': 'mp4', + 'title': '單車天使 - 中文版é ', + 'description': '中文版é ', + 'timestamp': 1476696196, + 'upload_date': '20161017', + }, + 'params': { + 'skip_download': True, + }, + }, { + # Contains both a Yahoo hosted video and multiple Youtube embeds + 'url': 'https://www.yahoo.com/entertainment/gwen-stefani-reveals-the-pop-hit-she-passed-on-assigns-it-to-her-voice-contestant-instead-033045672.html', + 'info_dict': { + 'id': '46c5d95a-528f-3d03-b732-732fcadd51de', + 'title': 'Gwen Stefani reveals the pop hit she passed on, assigns it to her \'Voice\' contestant instead', + 'description': 'Gwen decided not to record this hit herself, but she decided it was the perfect fit for Kyndall Inskeep.', + }, + 'playlist': [{ + 'info_dict': { + 'id': '966d4262-4fd1-3aaa-b45b-049ca6e38ba6', + 'ext': 'mp4', + 'title': 'Gwen Stefani reveals she turned down one of Sia\'s best songs', + 'description': 'On "The Voice" Tuesday, Gwen Stefani told Taylor Swift which Sia hit was almost hers.', + 'timestamp': 1572406500, + 'upload_date': '20191030', + }, + }, { + 'info_dict': { + 'id': '352CFDOQrKg', + 'ext': 'mp4', + 'title': 'Kyndal Inskeep "Performs the Hell Out of" Sia\'s "Elastic Heart" - The Voice Knockouts 2019', + 'description': 'md5:7fe8e3d5806f96002e55f190d1d94479', + 'uploader': 'The Voice', + 'uploader_id': 'NBCTheVoice', + 'upload_date': '20191029', + }, + }], + 'params': { + 'playlistend': 2, + }, + 'expected_warnings': ['HTTP Error 404', 'Ignoring subtitle tracks'], + }, { + 'url': 'https://malaysia.news.yahoo.com/video/bystanders-help-ontario-policeman-bust-190932818.html', + 'only_matching': True, + }, { + 'url': 'https://es-us.noticias.yahoo.com/es-la-puerta-irrompible-que-110539379.html', + 'only_matching': True, + }, { + 'url': 'https://www.yahoo.com/entertainment/v/longtime-cbs-news-60-minutes-032036500-cbs.html', + 'only_matching': True, + }] + + def _extract_yahoo_video(self, video_id, country): + video = self._download_json( + 'https://%s.yahoo.com/_td/api/resource/VideoService.videos;view=full;video_ids=["%s"]' % (country, video_id), + video_id, 'Downloading video JSON metadata')[0] + title = video['title'] + + if country == 'malaysia': + country = 'my' + + is_live = video.get('live_state') == 'live' + fmts = ('m3u8',) if is_live else ('webm', 'mp4') + + urls = [] + formats = [] + subtitles = {} + for fmt in fmts: + media_obj = self._download_json( + 'https://video-api.yql.yahoo.com/v1/video/sapi/streams/' + video_id, + video_id, 'Downloading %s JSON metadata' % fmt, + headers=self.geo_verification_headers(), query={ + 'format': fmt, + 'region': country.upper(), + })['query']['results']['mediaObj'][0] + msg = media_obj.get('status', {}).get('msg') + + for s in media_obj.get('streams', []): + host = s.get('host') + path = s.get('path') + if not host or not path: + continue + s_url = host + path + if s.get('format') == 'm3u8': + formats.extend(self._extract_m3u8_formats( + s_url, video_id, 'mp4', m3u8_id='hls', fatal=False)) + continue + tbr = int_or_none(s.get('bitrate')) + formats.append({ + 'url': s_url, + 'format_id': fmt + ('-%d' % tbr if tbr else ''), + 'width': int_or_none(s.get('width')), + 'height': int_or_none(s.get('height')), + 'tbr': tbr, + 'fps': int_or_none(s.get('framerate')), + }) + + for cc in media_obj.get('closedcaptions', []): + cc_url = cc.get('url') + if not cc_url or cc_url in urls: + continue + urls.append(cc_url) + subtitles.setdefault(cc.get('lang') or 'en-US', []).append({ + 'url': cc_url, + 'ext': mimetype2ext(cc.get('content_type')), + }) + + streaming_url = video.get('streaming_url') + if streaming_url and not is_live: + formats.extend(self._extract_m3u8_formats( + streaming_url, video_id, 'mp4', + 'm3u8_native', m3u8_id='hls', fatal=False)) + + if not formats and msg == 'geo restricted': + self.raise_geo_restricted(metadata_available=True) + + thumbnails = [] + for thumb in video.get('thumbnails', []): + thumb_url = thumb.get('url') + if not thumb_url: + continue + thumbnails.append({ + 'id': thumb.get('tag'), + 'url': thumb.get('url'), + 'width': int_or_none(thumb.get('width')), + 'height': int_or_none(thumb.get('height')), + }) + + series_info = video.get('series_info') or {} + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'thumbnails': thumbnails, + 'description': clean_html(video.get('description')), + 'timestamp': parse_iso8601(video.get('publish_time')), + 'subtitles': subtitles, + 'duration': int_or_none(video.get('duration')), + 'view_count': int_or_none(video.get('view_count')), + 'is_live': is_live, + 'series': video.get('show_name'), + 'season_number': int_or_none(series_info.get('season_number')), + 'episode_number': int_or_none(series_info.get('episode_number')), + } + + def _real_extract(self, url): + url, country, display_id = self._match_valid_url(url).groups() + if not country: + country = 'us' + else: + country = country.split('-')[0] + + items = self._download_json( + 'https://%s.yahoo.com/caas/content/article' % country, display_id, + 'Downloading content JSON metadata', query={ + 'url': url + })['items'][0] + + item = items['data']['partnerData'] + if item.get('type') != 'video': + entries = [] + + cover = item.get('cover') or {} + if cover.get('type') == 'yvideo': + cover_url = cover.get('url') + if cover_url: + entries.append(self.url_result( + cover_url, 'Yahoo', cover.get('uuid'))) + + for e in (item.get('body') or []): + if e.get('type') == 'videoIframe': + iframe_url = e.get('url') + if iframe_url: + entries.append(self.url_result(iframe_url)) + + if item.get('type') == 'storywithleadvideo': + iframe_url = try_get(item, lambda x: x['meta']['player']['url']) + if iframe_url: + entries.append(self.url_result(iframe_url)) + else: + self.report_warning("Yahoo didn't provide an iframe url for this storywithleadvideo") + + if items.get('markup'): + entries.extend( + self.url_result(yt_url) for yt_url in YoutubeIE._extract_embed_urls(url, items['markup'])) + + return self.playlist_result( + entries, item.get('uuid'), + item.get('title'), item.get('summary')) + + info = self._extract_yahoo_video(item['uuid'], country) + info['display_id'] = display_id + return info + + +class YahooSearchIE(SearchInfoExtractor): + IE_DESC = 'Yahoo screen search' + _MAX_RESULTS = 1000 + IE_NAME = 'screen.yahoo:search' + _SEARCH_KEY = 'yvsearch' + + def _search_results(self, query): + for pagenum in itertools.count(0): + result_url = 'http://video.search.yahoo.com/search/?p=%s&fr=screen&o=js&gs=0&b=%d' % (urllib.parse.quote_plus(query), pagenum * 30) + info = self._download_json(result_url, query, + note='Downloading results page ' + str(pagenum + 1)) + yield from (self.url_result(result['rurl']) for result in info['results']) + if info['m']['last'] >= info['m']['total'] - 1: + break + + +class YahooJapanNewsIE(InfoExtractor): + IE_NAME = 'yahoo:japannews' + IE_DESC = 'Yahoo! Japan News' + _VALID_URL = r'https?://news\.yahoo\.co\.jp/(?:articles|feature)/(?P<id>[a-zA-Z0-9]+)' + _GEO_COUNTRIES = ['JP'] + _TESTS = [{ + 'url': 'https://news.yahoo.co.jp/articles/a70fe3a064f1cfec937e2252c7fc6c1ba3201c0e', + 'info_dict': { + 'id': 'a70fe3a064f1cfec937e2252c7fc6c1ba3201c0e', + 'ext': 'mp4', + 'title': 'ã€ç‹¬è‡ªã€‘安å€å…ƒç·ç†ã€Œå›½è‘¬ã€ä¸­æ­¢æ±‚ã‚“脅迫メールâ€â€¦ã€Œå­ã©ã‚‚誘æ‹ã€â€œé€ä¿¡è€…â€ã‚’追跡', + 'description': 'md5:1c06974575f930f692d8696fbcfdc546', + 'thumbnail': r're:https://.+', + }, + 'params': { + 'skip_download': True, + }, + }, { + 'url': 'https://news.yahoo.co.jp/feature/1356', + 'only_matching': True + }] + + def _extract_formats(self, json_data, content_id): + formats = [] + + for vid in traverse_obj(json_data, ('ResultSet', 'Result', ..., 'VideoUrlSet', 'VideoUrl', ...)) or []: + delivery = vid.get('delivery') + url = url_or_none(vid.get('Url')) + if not delivery or not url: + continue + elif delivery == 'hls': + formats.extend( + self._extract_m3u8_formats( + url, content_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + else: + formats.append({ + 'url': url, + 'format_id': f'http-{vid.get("bitrate")}', + 'height': int_or_none(vid.get('height')), + 'width': int_or_none(vid.get('width')), + 'tbr': int_or_none(vid.get('bitrate')), + }) + self._remove_duplicate_formats(formats) + + return formats + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + preloaded_state = self._search_json(r'__PRELOADED_STATE__\s*=', webpage, 'preloaded state', video_id) + + content_id = traverse_obj( + preloaded_state, ('articleDetail', 'paragraphs', ..., 'objectItems', ..., 'video', 'vid'), + get_all=False, expected_type=int) + if content_id is None: + raise ExtractorError('This article does not contain a video', expected=True) + + HOST = 'news.yahoo.co.jp' + space_id = traverse_obj(preloaded_state, ('pageData', 'spaceId'), expected_type=str) + json_data = self._download_json( + f'https://feapi-yvpub.yahooapis.jp/v1/content/{content_id}', + video_id, query={ + 'appid': 'dj0zaiZpPVZMTVFJR0FwZWpiMyZzPWNvbnN1bWVyc2VjcmV0Jng9YjU-', + 'output': 'json', + 'domain': HOST, + 'ak': hashlib.md5('_'.join((space_id, HOST)).encode()).hexdigest() if space_id else '', + 'device_type': '1100', + }) + + title = ( + traverse_obj(preloaded_state, + ('articleDetail', 'headline'), ('pageData', 'pageParam', 'title'), + expected_type=str) + or self._html_search_meta(('og:title', 'twitter:title'), webpage, 'title', default=None) + or self._html_extract_title(webpage)) + description = ( + traverse_obj(preloaded_state, ('pageData', 'description'), expected_type=str) + or self._html_search_meta( + ('og:description', 'description', 'twitter:description'), + webpage, 'description', default=None)) + thumbnail = ( + traverse_obj(preloaded_state, ('pageData', 'ogpImage'), expected_type=str) + or self._og_search_thumbnail(webpage, default=None) + or self._html_search_meta('twitter:image', webpage, 'thumbnail', default=None)) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'formats': self._extract_formats(json_data, video_id), + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yandexdisk.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yandexdisk.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yandexdisk.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yandexdisk.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yandexmusic.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yandexmusic.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yandexmusic.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yandexmusic.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yandexvideo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yandexvideo.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yandexvideo.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yandexvideo.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yapfiles.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yapfiles.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yapfiles.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yapfiles.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/yappy.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yappy.py new file mode 100644 index 0000000..7b3d0cb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/yappy.py @@ -0,0 +1,127 @@ +from .common import InfoExtractor +from ..utils import ( + OnDemandPagedList, + int_or_none, + traverse_obj, + unified_timestamp, + url_or_none, +) + + +class YappyIE(InfoExtractor): + _VALID_URL = r'https?://yappy\.media/video/(?P<id>\w+)' + _TESTS = [{ + 'url': 'https://yappy.media/video/47fea6d8586f48d1a0cf96a7342aabd2', + 'info_dict': { + 'id': '47fea6d8586f48d1a0cf96a7342aabd2', + 'ext': 'mp4', + 'title': 'Куда нажимать? Как Ñнимать? Смотри Ð²Ð¸Ð´Ð¾Ñ Ð¸ погнали!🤘ðŸ»', + 'timestamp': 1661893200, + 'description': 'Куда нажимать? Как Ñнимать? Смотри Ð²Ð¸Ð´Ð¾Ñ Ð¸ погнали!🤘ðŸ»', + 'thumbnail': 'https://cdn-st.ritm.media/static/pic/thumbnails/0c7c4d73388f47848acaf540d2e2bb8c-thumbnail.jpg', + 'upload_date': '20220830', + 'view_count': int, + 'like_count': int, + 'uploader_id': '59a0c8c485e5410b9c43474bf4c6a373', + 'categories': ['Образование и наука', 'Лайфхак', 'Технологии', 'Ðрт/иÑкуÑÑтво'], + 'repost_count': int, + 'uploader': 'YAPPY', + } + }, { + 'url': 'https://yappy.media/video/3862451954ad4bd58ae2ccefddb0bd33', + 'info_dict': { + 'id': '3862451954ad4bd58ae2ccefddb0bd33', + 'ext': 'mp4', + 'title': 'Опиши Ñвой характер 3 Ñловами🙃\n#пÑÐ¸Ñ…Ð¾Ð»Ð¾Ð³Ð¸Ñ #дружба #отношениÑ', + 'timestamp': 1674726985, + 'like_count': int, + 'description': 'Опиши Ñвой характер 3 Ñловами🙃\n#пÑÐ¸Ñ…Ð¾Ð»Ð¾Ð³Ð¸Ñ #дружба #отношениÑ', + 'uploader_id': '6793ee3581974a3586fc01e157de6c99', + 'view_count': int, + 'repost_count': int, + 'uploader': 'LENA SHTURMAN', + 'upload_date': '20230126', + 'thumbnail': 'https://cdn-st.ritm.media/static/pic/user_thumbnails/6e76bb4bbad640b6/9ec84c115b2b1967/1674716171.jpg', + } + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + json_ld = self._search_json_ld(webpage, video_id) + nextjs_data = self._search_nextjs_data(webpage, video_id) + + media_data = ( + traverse_obj( + nextjs_data, ('props', 'pageProps', ('data', 'OpenGraphParameters')), get_all=False) + or self._download_json(f'https://yappy.media/api/video/{video_id}', video_id)) + + media_url = traverse_obj(media_data, ('link', {url_or_none})) or '' + has_watermark = media_url.endswith('-wm.mp4') + + formats = [{ + 'url': media_url, + 'ext': 'mp4', + 'format_note': 'Watermarked' if has_watermark else None, + 'preference': -10 if has_watermark else None + }] if media_url else [] + + if has_watermark: + formats.append({ + 'url': media_url.replace('-wm.mp4', '.mp4'), + 'ext': 'mp4' + }) + + audio_link = traverse_obj(media_data, ('audio', 'link')) + if audio_link: + formats.append({ + 'url': audio_link, + 'ext': 'mp3', + 'acodec': 'mp3', + 'vcodec': 'none' + }) + + return { + 'id': video_id, + 'title': (json_ld.get('description') or self._html_search_meta(['og:title'], webpage) + or self._html_extract_title(webpage)), + 'formats': formats, + 'thumbnail': (media_data.get('thumbnail') + or self._html_search_meta(['og:image', 'og:image:secure_url'], webpage)), + 'description': (media_data.get('description') or json_ld.get('description') + or self._html_search_meta(['description', 'og:description'], webpage)), + 'timestamp': unified_timestamp(media_data.get('publishedAt') or json_ld.get('timestamp')), + 'view_count': int_or_none(media_data.get('viewsCount') or json_ld.get('view_count')), + 'like_count': int_or_none(media_data.get('likesCount')), + 'uploader': traverse_obj(media_data, ('creator', 'firstName')), + 'uploader_id': traverse_obj(media_data, ('creator', ('uuid', 'nickname')), get_all=False), + 'categories': traverse_obj(media_data, ('categories', ..., 'name')) or None, + 'repost_count': int_or_none(media_data.get('sharingCount')) + } + + +class YappyProfileIE(InfoExtractor): + _VALID_URL = r'https?://yappy\.media/profile/(?P<id>\w+)' + _TESTS = [{ + 'url': 'https://yappy.media/profile/59a0c8c485e5410b9c43474bf4c6a373', + 'info_dict': { + 'id': '59a0c8c485e5410b9c43474bf4c6a373', + }, + 'playlist_mincount': 527, + }] + + def _real_extract(self, url): + profile_id = self._match_id(url) + + def fetch_page(page_num): + page_num += 1 + videos = self._download_json( + f'https://yappy.media/api/video/list/{profile_id}?page={page_num}', + profile_id, f'Downloading profile page {page_num} JSON') + + for video in traverse_obj(videos, ('results', lambda _, v: v['uuid'])): + yield self.url_result( + f'https://yappy.media/video/{video["uuid"]}', YappyIE, + video['uuid'], video.get('description')) + + return self.playlist_result(OnDemandPagedList(fetch_page, 15), profile_id) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/yesjapan.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yesjapan.py new file mode 100644 index 0000000..94e4166 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/yesjapan.py @@ -0,0 +1,56 @@ +from .common import InfoExtractor +from ..networking import HEADRequest +from ..utils import get_element_by_attribute, parse_iso8601 + + +class YesJapanIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?yesjapan\.com/video/(?P<slug>[A-Za-z0-9\-]*)_(?P<id>[A-Za-z0-9]+)\.html' + _TEST = { + 'url': 'http://www.yesjapan.com/video/japanese-in-5-20-wa-and-ga-particle-usages_726497834.html', + 'md5': 'f0be416314e5be21a12b499b330c21cf', + 'info_dict': { + 'id': '726497834', + 'title': 'Japanese in 5! #20 - WA And GA Particle Usages', + 'description': 'This should clear up some issues most students of Japanese encounter with WA and GA....', + 'ext': 'mp4', + 'timestamp': 1416391590, + 'upload_date': '20141119', + 'thumbnail': r're:^https?://.*\.jpg$', + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id) + title = self._og_search_title(webpage) + video_url = self._og_search_video_url(webpage) + description = self._og_search_description(webpage) + thumbnail = self._og_search_thumbnail(webpage) + + timestamp = None + submit_info = get_element_by_attribute('class', 'pm-submit-data', webpage) + if submit_info: + timestamp = parse_iso8601(self._search_regex( + r'datetime="([^"]+)"', submit_info, 'upload date', fatal=False, default=None)) + + # attempt to resolve the final URL in order to get a proper extension + redirect_req = HEADRequest(video_url) + req = self._request_webpage( + redirect_req, video_id, note='Resolving final URL', errnote='Could not resolve final URL', fatal=False) + if req: + video_url = req.url + + formats = [{ + 'format_id': 'sd', + 'url': video_url, + }] + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'description': description, + 'timestamp': timestamp, + 'thumbnail': thumbnail, + } diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yinyuetai.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yinyuetai.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yinyuetai.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yinyuetai.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yle_areena.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yle_areena.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yle_areena.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yle_areena.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/ynet.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/ynet.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/ynet.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/ynet.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/youjizz.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/youjizz.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/youjizz.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/youjizz.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/youku.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/youku.py new file mode 100644 index 0000000..e351765 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/youku.py @@ -0,0 +1,290 @@ +import random +import re +import string +import time + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + clean_html, + get_element_by_class, + js_to_json, + str_or_none, + strip_jsonp, +) + + +class YoukuIE(InfoExtractor): + IE_NAME = 'youku' + IE_DESC = '优酷' + _VALID_URL = r'''(?x) + (?: + https?://( + (?:v|play(?:er)?)\.(?:youku|tudou)\.com/(?:v_show/id_|player\.php/sid/)| + video\.tudou\.com/v/)| + youku:) + (?P<id>[A-Za-z0-9]+)(?:\.html|/v\.swf|) + ''' + + _TESTS = [{ + 'url': 'http://player.youku.com/player.php/sid/XNDgyMDQ2NTQw/v.swf', + 'only_matching': True, + }, { + 'url': 'http://v.youku.com/v_show/id_XNjA1NzA2Njgw.html', + 'note': 'Video protected with password', + 'info_dict': { + 'id': 'XNjA1NzA2Njgw', + 'ext': 'mp4', + 'title': 'é‚¢ç¾©ç”°å¤æ—¦è®²åº§ä¹‹æƒ³è±¡ä¸­çš„胡人—从“左衽孔å­â€è¯´èµ·', + 'duration': 7264.5, + 'thumbnail': r're:^https?://.*', + 'uploader': 'FoxJin1006', + 'uploader_id': '322014285', + 'uploader_url': 'http://i.youku.com/u/UMTI4ODA1NzE0MA==', + 'tags': list, + 'skip': '404', + }, + 'params': { + 'videopassword': '100600', + }, + }, { + # /play/get.json contains streams with "channel_type":"tail" + 'url': 'http://v.youku.com/v_show/id_XOTUxMzg4NDMy.html', + 'info_dict': { + 'id': 'XOTUxMzg4NDMy', + 'ext': 'mp4', + 'title': '我的世界☆明月庄主☆车震猎æ€â˜†æ€äººè‰ºæœ¯Minecraft', + 'duration': 702.08, + 'thumbnail': r're:^https?://.*', + 'uploader': '明月庄主moon', + 'uploader_id': '38465621', + 'uploader_url': 'https://www.youku.com/profile/index/?uid=UMTUzODYyNDg0', + 'tags': list, + }, + }, { + 'url': 'https://v.youku.com/v_show/id_XNTA2NTA0MjA1Mg==.html', + 'info_dict': { + 'id': 'XNTA2NTA0MjA1Mg', + 'ext': 'mp4', + 'title': 'Minecraft我的世界:建造超大巨型航空飞机,èœé¸Ÿvs高手vs黑客', + 'duration': 542.13, + 'thumbnail': r're:^https?://.*', + 'uploader': '波哥游æˆè§£è¯´', + 'uploader_id': '156688084', + 'uploader_url': 'https://www.youku.com/profile/index/?uid=UNjI2NzUyMzM2', + 'tags': list, + }, + }, { + 'url': 'https://v.youku.com/v_show/id_XNTE1MzczOTg4MA==.html', + 'info_dict': { + 'id': 'XNTE1MzczOTg4MA', + 'ext': 'mp4', + 'title': '国产超A特工片', + 'duration': 362.97, + 'thumbnail': r're:^https?://.*', + 'uploader': '陈晓娟说历å²', + 'uploader_id': '1640913339', + 'uploader_url': 'https://www.youku.com/profile/index/?uid=UNjU2MzY1MzM1Ng==', + 'tags': list, + }, + }, { + 'url': 'https://play.tudou.com/v_show/id_XNjAxNjI2OTU3Ng==.html?', + 'info_dict': { + 'id': 'XNjAxNjI2OTU3Ng', + 'ext': 'mp4', + 'title': '阿斯塔æ„识到哈里æ€äº†äººï¼Œè‡ªå·±è¢«éª—了', + 'thumbnail': 'https://m.ykimg.com/0541010164F732752794D4D7B70331D1', + 'uploader_id': '88758207', + 'tags': [], + 'uploader_url': 'https://www.youku.com/profile/index/?uid=UMzU1MDMyODI4', + 'uploader': '英美剧场', + 'duration': 72.91, + }, + }] + + @staticmethod + def get_ysuid(): + return '%d%s' % (int(time.time()), ''.join( + random.choices(string.ascii_letters, k=3))) + + def get_format_name(self, fm): + _dict = { + '3gp': 'h6', + '3gphd': 'h5', + 'flv': 'h4', + 'flvhd': 'h4', + 'mp4': 'h3', + 'mp4hd': 'h3', + 'mp4hd2': 'h4', + 'mp4hd3': 'h4', + 'hd2': 'h2', + 'hd3': 'h1', + } + return _dict.get(fm) + + def _real_extract(self, url): + video_id = self._match_id(url) + + self._set_cookie('youku.com', '__ysuid', self.get_ysuid()) + self._set_cookie('youku.com', 'xreferrer', 'http://www.youku.com') + + _, urlh = self._download_webpage_handle( + 'https://log.mmstat.com/eg.js', video_id, 'Retrieving cna info') + # The etag header is '"foobar"'; let's remove the double quotes + cna = urlh.headers['etag'][1:-1] + + # request basic data + basic_data_params = { + 'vid': video_id, + 'ccode': '0524', + 'client_ip': '192.168.1.1', + 'utid': cna, + 'client_ts': time.time() / 1000, + } + + video_password = self.get_param('videopassword') + if video_password: + basic_data_params['password'] = video_password + + headers = { + 'Referer': url, + } + headers.update(self.geo_verification_headers()) + data = self._download_json( + 'https://ups.youku.com/ups/get.json', video_id, + 'Downloading JSON metadata', + query=basic_data_params, headers=headers)['data'] + + error = data.get('error') + if error: + error_note = error.get('note') + if error_note is not None and '因版æƒåŽŸå› æ— æ³•è§‚çœ‹æ­¤è§†é¢‘' in error_note: + raise ExtractorError( + 'Youku said: Sorry, this video is available in China only', expected=True) + elif error_note and '该视频被设为ç§å¯†' in error_note: + raise ExtractorError( + 'Youku said: Sorry, this video is private', expected=True) + else: + msg = 'Youku server reported error %i' % error.get('code') + if error_note is not None: + msg += ': ' + clean_html(error_note) + raise ExtractorError(msg) + + # get video title + video_data = data['video'] + title = video_data['title'] + + formats = [{ + 'url': stream['m3u8_url'], + 'format_id': self.get_format_name(stream.get('stream_type')), + 'ext': 'mp4', + 'protocol': 'm3u8_native', + 'filesize': int(stream.get('size')), + 'width': stream.get('width'), + 'height': stream.get('height'), + } for stream in data['stream'] if stream.get('channel_type') != 'tail'] + + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'duration': video_data.get('seconds'), + 'thumbnail': video_data.get('logo'), + 'uploader': video_data.get('username'), + 'uploader_id': str_or_none(video_data.get('userid')), + 'uploader_url': data.get('uploader', {}).get('homepage'), + 'tags': video_data.get('tags'), + } + + +class YoukuShowIE(InfoExtractor): + _VALID_URL = r'https?://list\.youku\.com/show/id_(?P<id>[0-9a-z]+)\.html' + IE_NAME = 'youku:show' + + _TESTS = [{ + 'url': 'http://list.youku.com/show/id_zc7c670be07ff11e48b3f.html', + 'info_dict': { + 'id': 'zc7c670be07ff11e48b3f', + 'title': '花åƒéª¨ DVD版', + 'description': 'md5:a1ae6f5618571bbeb5c9821f9c81b558', + }, + 'playlist_count': 50, + }, { + # Episode number not starting from 1 + 'url': 'http://list.youku.com/show/id_zefbfbd70efbfbd780bef.html', + 'info_dict': { + 'id': 'zefbfbd70efbfbd780bef', + 'title': '超级飞侠3', + 'description': 'md5:275715156abebe5ccc2a1992e9d56b98', + }, + 'playlist_count': 24, + }, { + # Ongoing playlist. The initial page is the last one + 'url': 'http://list.youku.com/show/id_za7c275ecd7b411e1a19e.html', + 'only_matching': True, + }, { + # No data-id value. + 'url': 'http://list.youku.com/show/id_zefbfbd61237fefbfbdef.html', + 'only_matching': True, + }, { + # Wrong number of reload_id. + 'url': 'http://list.youku.com/show/id_z20eb4acaf5c211e3b2ad.html', + 'only_matching': True, + }] + + def _extract_entries(self, playlist_data_url, show_id, note, query): + query['callback'] = 'cb' + playlist_data = self._download_json( + playlist_data_url, show_id, query=query, note=note, + transform_source=lambda s: js_to_json(strip_jsonp(s))).get('html') + if playlist_data is None: + return [None, None] + drama_list = (get_element_by_class('p-drama-grid', playlist_data) + or get_element_by_class('p-drama-half-row', playlist_data)) + if drama_list is None: + raise ExtractorError('No episodes found') + video_urls = re.findall(r'<a[^>]+href="([^"]+)"', drama_list) + return playlist_data, [ + self.url_result(self._proto_relative_url(video_url, 'http:'), YoukuIE.ie_key()) + for video_url in video_urls] + + def _real_extract(self, url): + show_id = self._match_id(url) + webpage = self._download_webpage(url, show_id) + + entries = [] + page_config = self._parse_json(self._search_regex( + r'var\s+PageConfig\s*=\s*({.+});', webpage, 'page config'), + show_id, transform_source=js_to_json) + first_page, initial_entries = self._extract_entries( + 'http://list.youku.com/show/module', show_id, + note='Downloading initial playlist data page', + query={ + 'id': page_config['showid'], + 'tab': 'showInfo', + }) + first_page_reload_id = self._html_search_regex( + r'<div[^>]+id="(reload_\d+)', first_page, 'first page reload id') + # The first reload_id has the same items as first_page + reload_ids = re.findall('<li[^>]+data-id="([^"]+)">', first_page) + entries.extend(initial_entries) + for idx, reload_id in enumerate(reload_ids): + if reload_id == first_page_reload_id: + continue + _, new_entries = self._extract_entries( + 'http://list.youku.com/show/episode', show_id, + note='Downloading playlist data page %d' % (idx + 1), + query={ + 'id': page_config['showid'], + 'stage': reload_id, + }) + if new_entries is not None: + entries.extend(new_entries) + desc = self._html_search_meta('description', webpage, fatal=False) + playlist_title = desc.split(',')[0] if desc else None + detail_li = get_element_by_class('p-intro', webpage) + playlist_description = get_element_by_class( + 'intro-more', detail_li) if detail_li else None + + return self.playlist_result( + entries, show_id, playlist_title, playlist_description) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/younow.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/younow.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/younow.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/younow.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/youporn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/youporn.py new file mode 100644 index 0000000..6ee0abc --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/youporn.py @@ -0,0 +1,198 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + extract_attributes, + int_or_none, + merge_dicts, + str_to_int, + traverse_obj, + unified_strdate, + url_or_none, +) + + +class YouPornIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?youporn\.com/(?:watch|embed)/(?P<id>\d+)(?:/(?P<display_id>[^/?#&]+))?' + _EMBED_REGEX = [r'<iframe[^>]+\bsrc=["\'](?P<url>(?:https?:)?//(?:www\.)?youporn\.com/embed/\d+)'] + _TESTS = [{ + 'url': 'http://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/', + 'md5': '3744d24c50438cf5b6f6d59feb5055c2', + 'info_dict': { + 'id': '505835', + 'display_id': 'sex-ed-is-it-safe-to-masturbate-daily', + 'ext': 'mp4', + 'title': 'Sex Ed: Is It Safe To Masturbate Daily?', + 'description': 'Love & Sex Answers: http://bit.ly/DanAndJenn -- Is It Unhealthy To Masturbate Daily?', + 'thumbnail': r're:^https?://.*\.jpg$', + 'duration': 210, + 'uploader': 'Ask Dan And Jennifer', + 'upload_date': '20101217', + 'average_rating': int, + 'view_count': int, + 'categories': list, + 'tags': list, + 'age_limit': 18, + }, + 'skip': 'This video has been disabled', + }, { + # Unknown uploader + 'url': 'http://www.youporn.com/watch/561726/big-tits-awesome-brunette-on-amazing-webcam-show/?from=related3&al=2&from_id=561726&pos=4', + 'info_dict': { + 'id': '561726', + 'display_id': 'big-tits-awesome-brunette-on-amazing-webcam-show', + 'ext': 'mp4', + 'title': 'Big Tits Awesome Brunette On amazing webcam show', + 'description': 'http://sweetlivegirls.com Big Tits Awesome Brunette On amazing webcam show.mp4', + 'thumbnail': r're:^https?://.*\.jpg$', + 'uploader': 'Unknown', + 'upload_date': '20110418', + 'average_rating': int, + 'view_count': int, + 'categories': list, + 'tags': list, + 'age_limit': 18, + }, + 'params': { + 'skip_download': True, + }, + 'skip': '404', + }, { + 'url': 'https://www.youporn.com/embed/505835/sex-ed-is-it-safe-to-masturbate-daily/', + 'only_matching': True, + }, { + 'url': 'http://www.youporn.com/watch/505835', + 'only_matching': True, + }, { + 'url': 'https://www.youporn.com/watch/13922959/femdom-principal/', + 'only_matching': True, + }, { + 'url': 'https://www.youporn.com/watch/16290308/tinderspecial-trailer1/', + 'info_dict': { + 'id': '16290308', + 'age_limit': 18, + 'categories': [], + 'description': 'md5:00ea70f642f431c379763c17c2f396bc', + 'display_id': 'tinderspecial-trailer1', + 'duration': 298.0, + 'ext': 'mp4', + 'upload_date': '20201123', + 'uploader': 'Ersties', + 'tags': [], + 'thumbnail': 'https://fi1.ypncdn.com/202011/23/16290308/original/8/tinderspecial-trailer1-8(m=eaAaaEPbaaaa).jpg', + 'timestamp': 1606089600, + 'title': 'Tinder In Real Life', + 'view_count': int, + } + }] + + def _real_extract(self, url): + video_id, display_id = self._match_valid_url(url).group('id', 'display_id') + definitions = self._download_json( + f'https://www.youporn.com/api/video/media_definitions/{video_id}/', display_id or video_id) + + def get_format_data(data, f): + return traverse_obj(data, lambda _, v: v['format'] == f and url_or_none(v['videoUrl'])) + + formats = [] + # Try to extract only the actual master m3u8 first, avoiding the duplicate single resolution "master" m3u8s + for hls_url in traverse_obj(get_format_data(definitions, 'hls'), ( + lambda _, v: not isinstance(v['defaultQuality'], bool), 'videoUrl'), (..., 'videoUrl')): + formats.extend(self._extract_m3u8_formats(hls_url, video_id, 'mp4', fatal=False, m3u8_id='hls')) + + for definition in get_format_data(definitions, 'mp4'): + f = traverse_obj(definition, { + 'url': 'videoUrl', + 'filesize': ('videoSize', {int_or_none}) + }) + height = int_or_none(definition.get('quality')) + # Video URL's path looks like this: + # /201012/17/505835/720p_1500k_505835/YouPorn%20-%20Sex%20Ed%20Is%20It%20Safe%20To%20Masturbate%20Daily.mp4 + # /201012/17/505835/vl_240p_240k_505835/YouPorn%20-%20Sex%20Ed%20Is%20It%20Safe%20To%20Masturbate%20Daily.mp4 + # /videos/201703/11/109285532/1080P_4000K_109285532.mp4 + # We will benefit from it by extracting some metadata + mobj = re.search(r'(?P<height>\d{3,4})[pP]_(?P<bitrate>\d+)[kK]_\d+', definition['videoUrl']) + if mobj: + if not height: + height = int(mobj.group('height')) + bitrate = int(mobj.group('bitrate')) + f.update({ + 'format_id': '%dp-%dk' % (height, bitrate), + 'tbr': bitrate, + }) + f['height'] = height + formats.append(f) + + webpage = self._download_webpage( + 'http://www.youporn.com/watch/%s' % video_id, display_id, + headers={'Cookie': 'age_verified=1'}) + + title = self._html_search_regex( + r'(?s)<div[^>]+class=["\']watchVideoTitle[^>]+>(.+?)</div>', + webpage, 'title', default=None) or self._og_search_title( + webpage, default=None) or self._html_search_meta( + 'title', webpage, fatal=True) + + description = self._html_search_regex( + r'(?s)<div[^>]+\bid=["\']description["\'][^>]*>(.+?)</div>', + webpage, 'description', + default=None) or self._og_search_description( + webpage, default=None) + thumbnail = self._search_regex( + r'(?:imageurl\s*=|poster\s*:)\s*(["\'])(?P<thumbnail>.+?)\1', + webpage, 'thumbnail', fatal=False, group='thumbnail') + duration = int_or_none(self._html_search_meta( + 'video:duration', webpage, 'duration', fatal=False)) + + uploader = self._html_search_regex( + r'(?s)<div[^>]+class=["\']submitByLink["\'][^>]*>(.+?)</div>', + webpage, 'uploader', fatal=False) + upload_date = unified_strdate(self._html_search_regex( + (r'UPLOADED:\s*<span>([^<]+)', + r'Date\s+[Aa]dded:\s*<span>([^<]+)', + r'''(?s)<div[^>]+class=["']videoInfo(?:Date|Time)\b[^>]*>(.+?)</div>''', + r'(?s)<label\b[^>]*>Uploaded[^<]*</label>\s*<span\b[^>]*>(.+?)</span>'), + webpage, 'upload date', fatal=False)) + + age_limit = self._rta_search(webpage) + + view_count = None + views = self._search_regex( + r'(<div[^>]+\bclass=["\']js_videoInfoViews["\']>)', webpage, + 'views', default=None) + if views: + view_count = str_to_int(extract_attributes(views).get('data-value')) + comment_count = str_to_int(self._search_regex( + r'>All [Cc]omments? \(([\d,.]+)\)', + webpage, 'comment count', default=None)) + + def extract_tag_box(regex, title): + tag_box = self._search_regex(regex, webpage, title, default=None) + if not tag_box: + return [] + return re.findall(r'<a[^>]+href=[^>]+>([^<]+)', tag_box) + + categories = extract_tag_box( + r'(?s)Categories:.*?</[^>]+>(.+?)</div>', 'categories') + tags = extract_tag_box( + r'(?s)Tags:.*?</div>\s*<div[^>]+class=["\']tagBoxContent["\'][^>]*>(.+?)</div>', + 'tags') + + data = self._search_json_ld(webpage, video_id, expected_type='VideoObject', fatal=False) + data.pop('url', None) + return merge_dicts(data, { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'duration': duration, + 'uploader': uploader, + 'upload_date': upload_date, + 'view_count': view_count, + 'comment_count': comment_count, + 'categories': categories, + 'tags': tags, + 'age_limit': age_limit, + 'formats': formats, + }) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yourporn.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yourporn.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yourporn.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yourporn.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/yourupload.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/yourupload.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/yourupload.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/yourupload.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/youtube.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/youtube.py new file mode 100644 index 0000000..ac28ed7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/youtube.py @@ -0,0 +1,7346 @@ +import base64 +import calendar +import collections +import copy +import datetime +import enum +import hashlib +import itertools +import json +import math +import os.path +import random +import re +import sys +import threading +import time +import traceback +import urllib.parse + +from .common import InfoExtractor, SearchInfoExtractor +from .openload import PhantomJSwrapper +from ..compat import functools +from ..jsinterp import JSInterpreter +from ..networking.exceptions import HTTPError, network_exceptions +from ..utils import ( + NO_DEFAULT, + ExtractorError, + LazyList, + UserNotLive, + bug_reports_message, + classproperty, + clean_html, + datetime_from_str, + dict_get, + filter_dict, + float_or_none, + format_field, + get_first, + int_or_none, + is_html, + join_nonempty, + js_to_json, + mimetype2ext, + orderedSet, + parse_codecs, + parse_count, + parse_duration, + parse_iso8601, + parse_qs, + qualities, + remove_start, + smuggle_url, + str_or_none, + str_to_int, + strftime_or_none, + traverse_obj, + try_get, + unescapeHTML, + unified_strdate, + unified_timestamp, + unsmuggle_url, + update_url_query, + url_or_none, + urljoin, + variadic, +) + +STREAMING_DATA_CLIENT_NAME = '__yt_dlp_client' +# any clients starting with _ cannot be explicitly requested by the user +INNERTUBE_CLIENTS = { + 'web': { + 'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'WEB', + 'clientVersion': '2.20220801.00.00', + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 1 + }, + 'web_embedded': { + 'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'WEB_EMBEDDED_PLAYER', + 'clientVersion': '1.20220731.00.00', + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 56 + }, + 'web_music': { + 'INNERTUBE_API_KEY': 'AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30', + 'INNERTUBE_HOST': 'music.youtube.com', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'WEB_REMIX', + 'clientVersion': '1.20220727.01.00', + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 67, + }, + 'web_creator': { + 'INNERTUBE_API_KEY': 'AIzaSyBUPetSUmoZL-OhlxA7wSac5XinrygCqMo', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'WEB_CREATOR', + 'clientVersion': '1.20220726.00.00', + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 62, + }, + 'android': { + 'INNERTUBE_API_KEY': 'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'ANDROID', + 'clientVersion': '17.31.35', + 'androidSdkVersion': 30, + 'userAgent': 'com.google.android.youtube/17.31.35 (Linux; U; Android 11) gzip' + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 3, + 'REQUIRE_JS_PLAYER': False + }, + 'android_embedded': { + 'INNERTUBE_API_KEY': 'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxw', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'ANDROID_EMBEDDED_PLAYER', + 'clientVersion': '17.31.35', + 'androidSdkVersion': 30, + 'userAgent': 'com.google.android.youtube/17.31.35 (Linux; U; Android 11) gzip' + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 55, + 'REQUIRE_JS_PLAYER': False + }, + 'android_music': { + 'INNERTUBE_API_KEY': 'AIzaSyAOghZGza2MQSZkY_zfZ370N-PUdXEo8AI', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'ANDROID_MUSIC', + 'clientVersion': '5.16.51', + 'androidSdkVersion': 30, + 'userAgent': 'com.google.android.apps.youtube.music/5.16.51 (Linux; U; Android 11) gzip' + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 21, + 'REQUIRE_JS_PLAYER': False + }, + 'android_creator': { + 'INNERTUBE_API_KEY': 'AIzaSyD_qjV8zaaUMehtLkrKFgVeSX_Iqbtyws8', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'ANDROID_CREATOR', + 'clientVersion': '22.30.100', + 'androidSdkVersion': 30, + 'userAgent': 'com.google.android.apps.youtube.creator/22.30.100 (Linux; U; Android 11) gzip' + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 14, + 'REQUIRE_JS_PLAYER': False + }, + # iOS clients have HLS live streams. Setting device model to get 60fps formats. + # See: https://github.com/TeamNewPipe/NewPipeExtractor/issues/680#issuecomment-1002724558 + 'ios': { + 'INNERTUBE_API_KEY': 'AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'IOS', + 'clientVersion': '17.33.2', + 'deviceModel': 'iPhone14,3', + 'userAgent': 'com.google.ios.youtube/17.33.2 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)' + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 5, + 'REQUIRE_JS_PLAYER': False + }, + 'ios_embedded': { + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'IOS_MESSAGES_EXTENSION', + 'clientVersion': '17.33.2', + 'deviceModel': 'iPhone14,3', + 'userAgent': 'com.google.ios.youtube/17.33.2 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)' + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 66, + 'REQUIRE_JS_PLAYER': False + }, + 'ios_music': { + 'INNERTUBE_API_KEY': 'AIzaSyBAETezhkwP0ZWA02RsqT1zu78Fpt0bC_s', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'IOS_MUSIC', + 'clientVersion': '5.21', + 'deviceModel': 'iPhone14,3', + 'userAgent': 'com.google.ios.youtubemusic/5.21 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)' + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 26, + 'REQUIRE_JS_PLAYER': False + }, + 'ios_creator': { + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'IOS_CREATOR', + 'clientVersion': '22.33.101', + 'deviceModel': 'iPhone14,3', + 'userAgent': 'com.google.ios.ytcreator/22.33.101 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)' + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 15, + 'REQUIRE_JS_PLAYER': False + }, + # mweb has 'ultralow' formats + # See: https://github.com/yt-dlp/yt-dlp/pull/557 + 'mweb': { + 'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'MWEB', + 'clientVersion': '2.20220801.00.00', + } + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 2 + }, + # This client can access age restricted videos (unless the uploader has disabled the 'allow embedding' option) + # See: https://github.com/zerodytrash/YouTube-Internal-Clients + 'tv_embedded': { + 'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8', + 'INNERTUBE_CONTEXT': { + 'client': { + 'clientName': 'TVHTML5_SIMPLY_EMBEDDED_PLAYER', + 'clientVersion': '2.0', + }, + }, + 'INNERTUBE_CONTEXT_CLIENT_NAME': 85 + }, +} + + +def _split_innertube_client(client_name): + variant, *base = client_name.rsplit('.', 1) + if base: + return variant, base[0], variant + base, *variant = client_name.split('_', 1) + return client_name, base, variant[0] if variant else None + + +def short_client_name(client_name): + main, *parts = _split_innertube_client(client_name)[0].replace('embedscreen', 'e_s').split('_') + return join_nonempty(main[:4], ''.join(x[0] for x in parts)).upper() + + +def build_innertube_clients(): + THIRD_PARTY = { + 'embedUrl': 'https://www.youtube.com/', # Can be any valid URL + } + BASE_CLIENTS = ('ios', 'android', 'web', 'tv', 'mweb') + priority = qualities(BASE_CLIENTS[::-1]) + + for client, ytcfg in tuple(INNERTUBE_CLIENTS.items()): + ytcfg.setdefault('INNERTUBE_API_KEY', 'AIzaSyDCU8hByM-4DrUqRUYnGn-3llEO78bcxq8') + ytcfg.setdefault('INNERTUBE_HOST', 'www.youtube.com') + ytcfg.setdefault('REQUIRE_JS_PLAYER', True) + ytcfg['INNERTUBE_CONTEXT']['client'].setdefault('hl', 'en') + + _, base_client, variant = _split_innertube_client(client) + ytcfg['priority'] = 10 * priority(base_client) + + if not variant: + INNERTUBE_CLIENTS[f'{client}_embedscreen'] = embedscreen = copy.deepcopy(ytcfg) + embedscreen['INNERTUBE_CONTEXT']['client']['clientScreen'] = 'EMBED' + embedscreen['INNERTUBE_CONTEXT']['thirdParty'] = THIRD_PARTY + embedscreen['priority'] -= 3 + elif variant == 'embedded': + ytcfg['INNERTUBE_CONTEXT']['thirdParty'] = THIRD_PARTY + ytcfg['priority'] -= 2 + else: + ytcfg['priority'] -= 3 + + +build_innertube_clients() + + +class BadgeType(enum.Enum): + AVAILABILITY_UNLISTED = enum.auto() + AVAILABILITY_PRIVATE = enum.auto() + AVAILABILITY_PUBLIC = enum.auto() + AVAILABILITY_PREMIUM = enum.auto() + AVAILABILITY_SUBSCRIPTION = enum.auto() + LIVE_NOW = enum.auto() + VERIFIED = enum.auto() + + +class YoutubeBaseInfoExtractor(InfoExtractor): + """Provide base functions for Youtube extractors""" + + _RESERVED_NAMES = ( + r'channel|c|user|playlist|watch|w|v|embed|e|live|watch_popup|clip|' + r'shorts|movies|results|search|shared|hashtag|trending|explore|feed|feeds|' + r'browse|oembed|get_video_info|iframe_api|s/player|source|' + r'storefront|oops|index|account|t/terms|about|upload|signin|logout') + + _PLAYLIST_ID_RE = r'(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM|WL|LL|LM)' + + # _NETRC_MACHINE = 'youtube' + + # If True it will raise an error if no login info is provided + _LOGIN_REQUIRED = False + + _INVIDIOUS_SITES = ( + # invidious-redirect websites + r'(?:www\.)?redirect\.invidious\.io', + r'(?:(?:www|dev)\.)?invidio\.us', + # Invidious instances taken from https://github.com/iv-org/documentation/blob/master/docs/instances.md + r'(?:www\.)?invidious\.pussthecat\.org', + r'(?:www\.)?invidious\.zee\.li', + r'(?:www\.)?invidious\.ethibox\.fr', + r'(?:www\.)?iv\.ggtyler\.dev', + r'(?:www\.)?inv\.vern\.i2p', + r'(?:www\.)?am74vkcrjp2d5v36lcdqgsj2m6x36tbrkhsruoegwfcizzabnfgf5zyd\.onion', + r'(?:www\.)?inv\.riverside\.rocks', + r'(?:www\.)?invidious\.silur\.me', + r'(?:www\.)?inv\.bp\.projectsegfau\.lt', + r'(?:www\.)?invidious\.g4c3eya4clenolymqbpgwz3q3tawoxw56yhzk4vugqrl6dtu3ejvhjid\.onion', + r'(?:www\.)?invidious\.slipfox\.xyz', + r'(?:www\.)?invidious\.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd\.onion', + r'(?:www\.)?inv\.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad\.onion', + r'(?:www\.)?invidious\.tiekoetter\.com', + r'(?:www\.)?iv\.odysfvr23q5wgt7i456o5t3trw2cw5dgn56vbjfbq2m7xsc5vqbqpcyd\.onion', + r'(?:www\.)?invidious\.nerdvpn\.de', + r'(?:www\.)?invidious\.weblibre\.org', + r'(?:www\.)?inv\.odyssey346\.dev', + r'(?:www\.)?invidious\.dhusch\.de', + r'(?:www\.)?iv\.melmac\.space', + r'(?:www\.)?watch\.thekitty\.zone', + r'(?:www\.)?invidious\.privacydev\.net', + r'(?:www\.)?ng27owmagn5amdm7l5s3rsqxwscl5ynppnis5dqcasogkyxcfqn7psid\.onion', + r'(?:www\.)?invidious\.drivet\.xyz', + r'(?:www\.)?vid\.priv\.au', + r'(?:www\.)?euxxcnhsynwmfidvhjf6uzptsmh4dipkmgdmcmxxuo7tunp3ad2jrwyd\.onion', + r'(?:www\.)?inv\.vern\.cc', + r'(?:www\.)?invidious\.esmailelbob\.xyz', + r'(?:www\.)?invidious\.sethforprivacy\.com', + r'(?:www\.)?yt\.oelrichsgarcia\.de', + r'(?:www\.)?yt\.artemislena\.eu', + r'(?:www\.)?invidious\.flokinet\.to', + r'(?:www\.)?invidious\.baczek\.me', + r'(?:www\.)?y\.com\.sb', + r'(?:www\.)?invidious\.epicsite\.xyz', + r'(?:www\.)?invidious\.lidarshield\.cloud', + r'(?:www\.)?yt\.funami\.tech', + r'(?:www\.)?invidious\.3o7z6yfxhbw7n3za4rss6l434kmv55cgw2vuziwuigpwegswvwzqipyd\.onion', + r'(?:www\.)?osbivz6guyeahrwp2lnwyjk2xos342h4ocsxyqrlaopqjuhwn2djiiyd\.onion', + r'(?:www\.)?u2cvlit75owumwpy4dj2hsmvkq7nvrclkpht7xgyye2pyoxhpmclkrad\.onion', + # youtube-dl invidious instances list + r'(?:(?:www|no)\.)?invidiou\.sh', + r'(?:(?:www|fi)\.)?invidious\.snopyta\.org', + r'(?:www\.)?invidious\.kabi\.tk', + r'(?:www\.)?invidious\.mastodon\.host', + r'(?:www\.)?invidious\.zapashcanon\.fr', + r'(?:www\.)?(?:invidious(?:-us)?|piped)\.kavin\.rocks', + r'(?:www\.)?invidious\.tinfoil-hat\.net', + r'(?:www\.)?invidious\.himiko\.cloud', + r'(?:www\.)?invidious\.reallyancient\.tech', + r'(?:www\.)?invidious\.tube', + r'(?:www\.)?invidiou\.site', + r'(?:www\.)?invidious\.site', + r'(?:www\.)?invidious\.xyz', + r'(?:www\.)?invidious\.nixnet\.xyz', + r'(?:www\.)?invidious\.048596\.xyz', + r'(?:www\.)?invidious\.drycat\.fr', + r'(?:www\.)?inv\.skyn3t\.in', + r'(?:www\.)?tube\.poal\.co', + r'(?:www\.)?tube\.connect\.cafe', + r'(?:www\.)?vid\.wxzm\.sx', + r'(?:www\.)?vid\.mint\.lgbt', + r'(?:www\.)?vid\.puffyan\.us', + r'(?:www\.)?yewtu\.be', + r'(?:www\.)?yt\.elukerio\.org', + r'(?:www\.)?yt\.lelux\.fi', + r'(?:www\.)?invidious\.ggc-project\.de', + r'(?:www\.)?yt\.maisputain\.ovh', + r'(?:www\.)?ytprivate\.com', + r'(?:www\.)?invidious\.13ad\.de', + r'(?:www\.)?invidious\.toot\.koeln', + r'(?:www\.)?invidious\.fdn\.fr', + r'(?:www\.)?watch\.nettohikari\.com', + r'(?:www\.)?invidious\.namazso\.eu', + r'(?:www\.)?invidious\.silkky\.cloud', + r'(?:www\.)?invidious\.exonip\.de', + r'(?:www\.)?invidious\.riverside\.rocks', + r'(?:www\.)?invidious\.blamefran\.net', + r'(?:www\.)?invidious\.moomoo\.de', + r'(?:www\.)?ytb\.trom\.tf', + r'(?:www\.)?yt\.cyberhost\.uk', + r'(?:www\.)?kgg2m7yk5aybusll\.onion', + r'(?:www\.)?qklhadlycap4cnod\.onion', + r'(?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onion', + r'(?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onion', + r'(?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onion', + r'(?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onion', + r'(?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2p', + r'(?:www\.)?4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd\.onion', + r'(?:www\.)?w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd\.onion', + r'(?:www\.)?kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad\.onion', + r'(?:www\.)?grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad\.onion', + r'(?:www\.)?hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid\.onion', + # piped instances from https://github.com/TeamPiped/Piped/wiki/Instances + r'(?:www\.)?piped\.kavin\.rocks', + r'(?:www\.)?piped\.tokhmi\.xyz', + r'(?:www\.)?piped\.syncpundit\.io', + r'(?:www\.)?piped\.mha\.fi', + r'(?:www\.)?watch\.whatever\.social', + r'(?:www\.)?piped\.garudalinux\.org', + r'(?:www\.)?piped\.rivo\.lol', + r'(?:www\.)?piped-libre\.kavin\.rocks', + r'(?:www\.)?yt\.jae\.fi', + r'(?:www\.)?piped\.mint\.lgbt', + r'(?:www\.)?il\.ax', + r'(?:www\.)?piped\.esmailelbob\.xyz', + r'(?:www\.)?piped\.projectsegfau\.lt', + r'(?:www\.)?piped\.privacydev\.net', + r'(?:www\.)?piped\.palveluntarjoaja\.eu', + r'(?:www\.)?piped\.smnz\.de', + r'(?:www\.)?piped\.adminforge\.de', + r'(?:www\.)?watch\.whatevertinfoil\.de', + r'(?:www\.)?piped\.qdi\.fi', + r'(?:www\.)?piped\.video', + r'(?:www\.)?piped\.aeong\.one', + r'(?:www\.)?piped\.moomoo\.me', + r'(?:www\.)?piped\.chauvet\.pro', + r'(?:www\.)?watch\.leptons\.xyz', + r'(?:www\.)?pd\.vern\.cc', + r'(?:www\.)?piped\.hostux\.net', + r'(?:www\.)?piped\.lunar\.icu', + # Hyperpipe instances from https://hyperpipe.codeberg.page/ + r'(?:www\.)?hyperpipe\.surge\.sh', + r'(?:www\.)?hyperpipe\.esmailelbob\.xyz', + r'(?:www\.)?listen\.whatever\.social', + r'(?:www\.)?music\.adminforge\.de', + ) + + # extracted from account/account_menu ep + # XXX: These are the supported YouTube UI and API languages, + # which is slightly different from languages supported for translation in YouTube studio + _SUPPORTED_LANG_CODES = [ + 'af', 'az', 'id', 'ms', 'bs', 'ca', 'cs', 'da', 'de', 'et', 'en-IN', 'en-GB', 'en', 'es', + 'es-419', 'es-US', 'eu', 'fil', 'fr', 'fr-CA', 'gl', 'hr', 'zu', 'is', 'it', 'sw', 'lv', + 'lt', 'hu', 'nl', 'no', 'uz', 'pl', 'pt-PT', 'pt', 'ro', 'sq', 'sk', 'sl', 'sr-Latn', 'fi', + 'sv', 'vi', 'tr', 'be', 'bg', 'ky', 'kk', 'mk', 'mn', 'ru', 'sr', 'uk', 'el', 'hy', 'iw', + 'ur', 'ar', 'fa', 'ne', 'mr', 'hi', 'as', 'bn', 'pa', 'gu', 'or', 'ta', 'te', 'kn', 'ml', + 'si', 'th', 'lo', 'my', 'ka', 'am', 'km', 'zh-CN', 'zh-TW', 'zh-HK', 'ja', 'ko' + ] + + _IGNORED_WARNINGS = {'Unavailable videos will be hidden during playback'} + + _YT_HANDLE_RE = r'@[\w.-]{3,30}' # https://support.google.com/youtube/answer/11585688?hl=en + _YT_CHANNEL_UCID_RE = r'UC[\w-]{22}' + + def ucid_or_none(self, ucid): + return self._search_regex(rf'^({self._YT_CHANNEL_UCID_RE})$', ucid, 'UC-id', default=None) + + def handle_or_none(self, handle): + return self._search_regex(rf'^({self._YT_HANDLE_RE})$', handle, '@-handle', default=None) + + def handle_from_url(self, url): + return self._search_regex(rf'^(?:https?://(?:www\.)?youtube\.com)?/({self._YT_HANDLE_RE})', + url, 'channel handle', default=None) + + def ucid_from_url(self, url): + return self._search_regex(rf'^(?:https?://(?:www\.)?youtube\.com)?/({self._YT_CHANNEL_UCID_RE})', + url, 'channel id', default=None) + + @functools.cached_property + def _preferred_lang(self): + """ + Returns a language code supported by YouTube for the user preferred language. + Returns None if no preferred language set. + """ + preferred_lang = self._configuration_arg('lang', ie_key='Youtube', casesense=True, default=[''])[0] + if not preferred_lang: + return + if preferred_lang not in self._SUPPORTED_LANG_CODES: + raise ExtractorError( + f'Unsupported language code: {preferred_lang}. Supported language codes (case-sensitive): {join_nonempty(*self._SUPPORTED_LANG_CODES, delim=", ")}.', + expected=True) + elif preferred_lang != 'en': + self.report_warning( + f'Preferring "{preferred_lang}" translated fields. Note that some metadata extraction may fail or be incorrect.') + return preferred_lang + + def _initialize_consent(self): + cookies = self._get_cookies('https://www.youtube.com/') + if cookies.get('__Secure-3PSID'): + return + socs = cookies.get('SOCS') + if socs and not socs.value.startswith('CAA'): # not consented + return + self._set_cookie('.youtube.com', 'SOCS', 'CAI', secure=True) # accept all (required for mixes) + + def _initialize_pref(self): + cookies = self._get_cookies('https://www.youtube.com/') + pref_cookie = cookies.get('PREF') + pref = {} + if pref_cookie: + try: + pref = dict(urllib.parse.parse_qsl(pref_cookie.value)) + except ValueError: + self.report_warning('Failed to parse user PREF cookie' + bug_reports_message()) + pref.update({'hl': self._preferred_lang or 'en', 'tz': 'UTC'}) + self._set_cookie('.youtube.com', name='PREF', value=urllib.parse.urlencode(pref)) + + def _real_initialize(self): + self._initialize_pref() + self._initialize_consent() + self._check_login_required() + + def _check_login_required(self): + if self._LOGIN_REQUIRED and not self._cookies_passed: + self.raise_login_required('Login details are needed to download this content', method='cookies') + + _YT_INITIAL_DATA_RE = r'(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=' + _YT_INITIAL_PLAYER_RESPONSE_RE = r'ytInitialPlayerResponse\s*=' + + def _get_default_ytcfg(self, client='web'): + return copy.deepcopy(INNERTUBE_CLIENTS[client]) + + def _get_innertube_host(self, client='web'): + return INNERTUBE_CLIENTS[client]['INNERTUBE_HOST'] + + def _ytcfg_get_safe(self, ytcfg, getter, expected_type=None, default_client='web'): + # try_get but with fallback to default ytcfg client values when present + _func = lambda y: try_get(y, getter, expected_type) + return _func(ytcfg) or _func(self._get_default_ytcfg(default_client)) + + def _extract_client_name(self, ytcfg, default_client='web'): + return self._ytcfg_get_safe( + ytcfg, (lambda x: x['INNERTUBE_CLIENT_NAME'], + lambda x: x['INNERTUBE_CONTEXT']['client']['clientName']), str, default_client) + + def _extract_client_version(self, ytcfg, default_client='web'): + return self._ytcfg_get_safe( + ytcfg, (lambda x: x['INNERTUBE_CLIENT_VERSION'], + lambda x: x['INNERTUBE_CONTEXT']['client']['clientVersion']), str, default_client) + + def _select_api_hostname(self, req_api_hostname, default_client=None): + return (self._configuration_arg('innertube_host', [''], ie_key=YoutubeIE.ie_key())[0] + or req_api_hostname or self._get_innertube_host(default_client or 'web')) + + def _extract_api_key(self, ytcfg=None, default_client='web'): + return self._ytcfg_get_safe(ytcfg, lambda x: x['INNERTUBE_API_KEY'], str, default_client) + + def _extract_context(self, ytcfg=None, default_client='web'): + context = get_first( + (ytcfg, self._get_default_ytcfg(default_client)), 'INNERTUBE_CONTEXT', expected_type=dict) + # Enforce language and tz for extraction + client_context = traverse_obj(context, 'client', expected_type=dict, default={}) + client_context.update({'hl': self._preferred_lang or 'en', 'timeZone': 'UTC', 'utcOffsetMinutes': 0}) + return context + + _SAPISID = None + + def _generate_sapisidhash_header(self, origin='https://www.youtube.com'): + time_now = round(time.time()) + if self._SAPISID is None: + yt_cookies = self._get_cookies('https://www.youtube.com') + # Sometimes SAPISID cookie isn't present but __Secure-3PAPISID is. + # See: https://github.com/yt-dlp/yt-dlp/issues/393 + sapisid_cookie = dict_get( + yt_cookies, ('__Secure-3PAPISID', 'SAPISID')) + if sapisid_cookie and sapisid_cookie.value: + self._SAPISID = sapisid_cookie.value + self.write_debug('Extracted SAPISID cookie') + # SAPISID cookie is required if not already present + if not yt_cookies.get('SAPISID'): + self.write_debug('Copying __Secure-3PAPISID cookie to SAPISID cookie') + self._set_cookie( + '.youtube.com', 'SAPISID', self._SAPISID, secure=True, expire_time=time_now + 3600) + else: + self._SAPISID = False + if not self._SAPISID: + return None + # SAPISIDHASH algorithm from https://stackoverflow.com/a/32065323 + sapisidhash = hashlib.sha1( + f'{time_now} {self._SAPISID} {origin}'.encode()).hexdigest() + return f'SAPISIDHASH {time_now}_{sapisidhash}' + + def _call_api(self, ep, query, video_id, fatal=True, headers=None, + note='Downloading API JSON', errnote='Unable to download API page', + context=None, api_key=None, api_hostname=None, default_client='web'): + + data = {'context': context} if context else {'context': self._extract_context(default_client=default_client)} + data.update(query) + real_headers = self.generate_api_headers(default_client=default_client) + real_headers.update({'content-type': 'application/json'}) + if headers: + real_headers.update(headers) + api_key = (self._configuration_arg('innertube_key', [''], ie_key=YoutubeIE.ie_key(), casesense=True)[0] + or api_key or self._extract_api_key(default_client=default_client)) + return self._download_json( + f'https://{self._select_api_hostname(api_hostname, default_client)}/youtubei/v1/{ep}', + video_id=video_id, fatal=fatal, note=note, errnote=errnote, + data=json.dumps(data).encode('utf8'), headers=real_headers, + query={'key': api_key, 'prettyPrint': 'false'}) + + def extract_yt_initial_data(self, item_id, webpage, fatal=True): + return self._search_json(self._YT_INITIAL_DATA_RE, webpage, 'yt initial data', item_id, fatal=fatal) + + @staticmethod + def _extract_session_index(*data): + """ + Index of current account in account list. + See: https://github.com/yt-dlp/yt-dlp/pull/519 + """ + for ytcfg in data: + session_index = int_or_none(try_get(ytcfg, lambda x: x['SESSION_INDEX'])) + if session_index is not None: + return session_index + + # Deprecated? + def _extract_identity_token(self, ytcfg=None, webpage=None): + if ytcfg: + token = try_get(ytcfg, lambda x: x['ID_TOKEN'], str) + if token: + return token + if webpage: + return self._search_regex( + r'\bID_TOKEN["\']\s*:\s*["\'](.+?)["\']', webpage, + 'identity token', default=None, fatal=False) + + @staticmethod + def _extract_account_syncid(*args): + """ + Extract syncId required to download private playlists of secondary channels + @params response and/or ytcfg + """ + for data in args: + # ytcfg includes channel_syncid if on secondary channel + delegated_sid = try_get(data, lambda x: x['DELEGATED_SESSION_ID'], str) + if delegated_sid: + return delegated_sid + sync_ids = (try_get( + data, (lambda x: x['responseContext']['mainAppWebResponseContext']['datasyncId'], + lambda x: x['DATASYNC_ID']), str) or '').split('||') + if len(sync_ids) >= 2 and sync_ids[1]: + # datasyncid is of the form "channel_syncid||user_syncid" for secondary channel + # and just "user_syncid||" for primary channel. We only want the channel_syncid + return sync_ids[0] + + @staticmethod + def _extract_visitor_data(*args): + """ + Extracts visitorData from an API response or ytcfg + Appears to be used to track session state + """ + return get_first( + args, [('VISITOR_DATA', ('INNERTUBE_CONTEXT', 'client', 'visitorData'), ('responseContext', 'visitorData'))], + expected_type=str) + + @functools.cached_property + def is_authenticated(self): + return bool(self._generate_sapisidhash_header()) + + def extract_ytcfg(self, video_id, webpage): + if not webpage: + return {} + return self._parse_json( + self._search_regex( + r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', webpage, 'ytcfg', + default='{}'), video_id, fatal=False) or {} + + def generate_api_headers( + self, *, ytcfg=None, account_syncid=None, session_index=None, + visitor_data=None, identity_token=None, api_hostname=None, default_client='web'): + + origin = 'https://' + (self._select_api_hostname(api_hostname, default_client)) + headers = { + 'X-YouTube-Client-Name': str( + self._ytcfg_get_safe(ytcfg, lambda x: x['INNERTUBE_CONTEXT_CLIENT_NAME'], default_client=default_client)), + 'X-YouTube-Client-Version': self._extract_client_version(ytcfg, default_client), + 'Origin': origin, + 'X-Youtube-Identity-Token': identity_token or self._extract_identity_token(ytcfg), + 'X-Goog-PageId': account_syncid or self._extract_account_syncid(ytcfg), + 'X-Goog-Visitor-Id': visitor_data or self._extract_visitor_data(ytcfg), + 'User-Agent': self._ytcfg_get_safe(ytcfg, lambda x: x['INNERTUBE_CONTEXT']['client']['userAgent'], default_client=default_client) + } + if session_index is None: + session_index = self._extract_session_index(ytcfg) + if account_syncid or session_index is not None: + headers['X-Goog-AuthUser'] = session_index if session_index is not None else 0 + + auth = self._generate_sapisidhash_header(origin) + if auth is not None: + headers['Authorization'] = auth + headers['X-Origin'] = origin + return filter_dict(headers) + + def _download_ytcfg(self, client, video_id): + url = { + 'web': 'https://www.youtube.com', + 'web_music': 'https://music.youtube.com', + 'web_embedded': f'https://www.youtube.com/embed/{video_id}?html5=1' + }.get(client) + if not url: + return {} + webpage = self._download_webpage( + url, video_id, fatal=False, note=f'Downloading {client.replace("_", " ").strip()} client config') + return self.extract_ytcfg(video_id, webpage) or {} + + @staticmethod + def _build_api_continuation_query(continuation, ctp=None): + query = { + 'continuation': continuation + } + # TODO: Inconsistency with clickTrackingParams. + # Currently we have a fixed ctp contained within context (from ytcfg) + # and a ctp in root query for continuation. + if ctp: + query['clickTracking'] = {'clickTrackingParams': ctp} + return query + + @classmethod + def _extract_next_continuation_data(cls, renderer): + next_continuation = try_get( + renderer, (lambda x: x['continuations'][0]['nextContinuationData'], + lambda x: x['continuation']['reloadContinuationData']), dict) + if not next_continuation: + return + continuation = next_continuation.get('continuation') + if not continuation: + return + ctp = next_continuation.get('clickTrackingParams') + return cls._build_api_continuation_query(continuation, ctp) + + @classmethod + def _extract_continuation_ep_data(cls, continuation_ep: dict): + if isinstance(continuation_ep, dict): + continuation = try_get( + continuation_ep, lambda x: x['continuationCommand']['token'], str) + if not continuation: + return + ctp = continuation_ep.get('clickTrackingParams') + return cls._build_api_continuation_query(continuation, ctp) + + @classmethod + def _extract_continuation(cls, renderer): + next_continuation = cls._extract_next_continuation_data(renderer) + if next_continuation: + return next_continuation + + return traverse_obj(renderer, ( + ('contents', 'items', 'rows'), ..., 'continuationItemRenderer', + ('continuationEndpoint', ('button', 'buttonRenderer', 'command')) + ), get_all=False, expected_type=cls._extract_continuation_ep_data) + + @classmethod + def _extract_alerts(cls, data): + for alert_dict in try_get(data, lambda x: x['alerts'], list) or []: + if not isinstance(alert_dict, dict): + continue + for alert in alert_dict.values(): + alert_type = alert.get('type') + if not alert_type: + continue + message = cls._get_text(alert, 'text') + if message: + yield alert_type, message + + def _report_alerts(self, alerts, expected=True, fatal=True, only_once=False): + errors, warnings = [], [] + for alert_type, alert_message in alerts: + if alert_type.lower() == 'error' and fatal: + errors.append([alert_type, alert_message]) + elif alert_message not in self._IGNORED_WARNINGS: + warnings.append([alert_type, alert_message]) + + for alert_type, alert_message in (warnings + errors[:-1]): + self.report_warning(f'YouTube said: {alert_type} - {alert_message}', only_once=only_once) + if errors: + raise ExtractorError('YouTube said: %s' % errors[-1][1], expected=expected) + + def _extract_and_report_alerts(self, data, *args, **kwargs): + return self._report_alerts(self._extract_alerts(data), *args, **kwargs) + + def _extract_badges(self, badge_list: list): + """ + Extract known BadgeType's from a list of badge renderers. + @returns [{'type': BadgeType}] + """ + icon_type_map = { + 'PRIVACY_UNLISTED': BadgeType.AVAILABILITY_UNLISTED, + 'PRIVACY_PRIVATE': BadgeType.AVAILABILITY_PRIVATE, + 'PRIVACY_PUBLIC': BadgeType.AVAILABILITY_PUBLIC, + 'CHECK_CIRCLE_THICK': BadgeType.VERIFIED, + 'OFFICIAL_ARTIST_BADGE': BadgeType.VERIFIED, + 'CHECK': BadgeType.VERIFIED, + } + + badge_style_map = { + 'BADGE_STYLE_TYPE_MEMBERS_ONLY': BadgeType.AVAILABILITY_SUBSCRIPTION, + 'BADGE_STYLE_TYPE_PREMIUM': BadgeType.AVAILABILITY_PREMIUM, + 'BADGE_STYLE_TYPE_LIVE_NOW': BadgeType.LIVE_NOW, + 'BADGE_STYLE_TYPE_VERIFIED': BadgeType.VERIFIED, + 'BADGE_STYLE_TYPE_VERIFIED_ARTIST': BadgeType.VERIFIED, + } + + label_map = { + 'unlisted': BadgeType.AVAILABILITY_UNLISTED, + 'private': BadgeType.AVAILABILITY_PRIVATE, + 'members only': BadgeType.AVAILABILITY_SUBSCRIPTION, + 'live': BadgeType.LIVE_NOW, + 'premium': BadgeType.AVAILABILITY_PREMIUM, + 'verified': BadgeType.VERIFIED, + 'official artist channel': BadgeType.VERIFIED, + } + + badges = [] + for badge in traverse_obj(badge_list, (..., lambda key, _: re.search(r'[bB]adgeRenderer$', key))): + badge_type = ( + icon_type_map.get(traverse_obj(badge, ('icon', 'iconType'), expected_type=str)) + or badge_style_map.get(traverse_obj(badge, 'style')) + ) + if badge_type: + badges.append({'type': badge_type}) + continue + + # fallback, won't work in some languages + label = traverse_obj( + badge, 'label', ('accessibilityData', 'label'), 'tooltip', 'iconTooltip', get_all=False, expected_type=str, default='') + for match, label_badge_type in label_map.items(): + if match in label.lower(): + badges.append({'type': label_badge_type}) + break + + return badges + + @staticmethod + def _has_badge(badges, badge_type): + return bool(traverse_obj(badges, lambda _, v: v['type'] == badge_type)) + + @staticmethod + def _get_text(data, *path_list, max_runs=None): + for path in path_list or [None]: + if path is None: + obj = [data] + else: + obj = traverse_obj(data, path, default=[]) + if not any(key is ... or isinstance(key, (list, tuple)) for key in variadic(path)): + obj = [obj] + for item in obj: + text = try_get(item, lambda x: x['simpleText'], str) + if text: + return text + runs = try_get(item, lambda x: x['runs'], list) or [] + if not runs and isinstance(item, list): + runs = item + + runs = runs[:min(len(runs), max_runs or len(runs))] + text = ''.join(traverse_obj(runs, (..., 'text'), expected_type=str)) + if text: + return text + + def _get_count(self, data, *path_list): + count_text = self._get_text(data, *path_list) or '' + count = parse_count(count_text) + if count is None: + count = str_to_int( + self._search_regex(r'^([\d,]+)', re.sub(r'\s', '', count_text), 'count', default=None)) + return count + + @staticmethod + def _extract_thumbnails(data, *path_list): + """ + Extract thumbnails from thumbnails dict + @param path_list: path list to level that contains 'thumbnails' key + """ + thumbnails = [] + for path in path_list or [()]: + for thumbnail in traverse_obj(data, (*variadic(path), 'thumbnails', ...)): + thumbnail_url = url_or_none(thumbnail.get('url')) + if not thumbnail_url: + continue + # Sometimes youtube gives a wrong thumbnail URL. See: + # https://github.com/yt-dlp/yt-dlp/issues/233 + # https://github.com/ytdl-org/youtube-dl/issues/28023 + if 'maxresdefault' in thumbnail_url: + thumbnail_url = thumbnail_url.split('?')[0] + thumbnails.append({ + 'url': thumbnail_url, + 'height': int_or_none(thumbnail.get('height')), + 'width': int_or_none(thumbnail.get('width')), + }) + return thumbnails + + @staticmethod + def extract_relative_time(relative_time_text): + """ + Extracts a relative time from string and converts to dt object + e.g. 'streamed 6 days ago', '5 seconds ago (edited)', 'updated today', '8 yr ago' + """ + + # XXX: this could be moved to a general function in utils/_utils.py + # The relative time text strings are roughly the same as what + # Javascript's Intl.RelativeTimeFormat function generates. + # See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat + mobj = re.search( + r'(?P<start>today|yesterday|now)|(?P<time>\d+)\s*(?P<unit>sec(?:ond)?|s|min(?:ute)?|h(?:our|r)?|d(?:ay)?|w(?:eek|k)?|mo(?:nth)?|y(?:ear|r)?)s?\s*ago', + relative_time_text) + if mobj: + start = mobj.group('start') + if start: + return datetime_from_str(start) + try: + return datetime_from_str('now-%s%s' % (mobj.group('time'), mobj.group('unit'))) + except ValueError: + return None + + def _parse_time_text(self, text): + if not text: + return + dt = self.extract_relative_time(text) + timestamp = None + if isinstance(dt, datetime.datetime): + timestamp = calendar.timegm(dt.timetuple()) + + if timestamp is None: + timestamp = ( + unified_timestamp(text) or unified_timestamp( + self._search_regex( + (r'([a-z]+\s*\d{1,2},?\s*20\d{2})', r'(?:.+|^)(?:live|premieres|ed|ing)(?:\s*(?:on|for))?\s*(.+\d)'), + text.lower(), 'time text', default=None))) + + if text and timestamp is None and self._preferred_lang in (None, 'en'): + self.report_warning( + f'Cannot parse localized time text "{text}"', only_once=True) + return timestamp + + def _extract_response(self, item_id, query, note='Downloading API JSON', headers=None, + ytcfg=None, check_get_keys=None, ep='browse', fatal=True, api_hostname=None, + default_client='web'): + raise_for_incomplete = bool(self._configuration_arg('raise_incomplete_data', ie_key=YoutubeIE)) + # Incomplete Data should be a warning by default when retries are exhausted, while other errors should be fatal. + icd_retries = iter(self.RetryManager(fatal=raise_for_incomplete)) + icd_rm = next(icd_retries) + main_retries = iter(self.RetryManager()) + main_rm = next(main_retries) + # Manual retry loop for multiple RetryManagers + # The proper RetryManager MUST be advanced after an error + # and its result MUST be checked if the manager is non fatal + while True: + try: + response = self._call_api( + ep=ep, fatal=True, headers=headers, + video_id=item_id, query=query, note=note, + context=self._extract_context(ytcfg, default_client), + api_key=self._extract_api_key(ytcfg, default_client), + api_hostname=api_hostname, default_client=default_client) + except ExtractorError as e: + if not isinstance(e.cause, network_exceptions): + return self._error_or_warning(e, fatal=fatal) + elif not isinstance(e.cause, HTTPError): + main_rm.error = e + next(main_retries) + continue + + first_bytes = e.cause.response.read(512) + if not is_html(first_bytes): + yt_error = try_get( + self._parse_json( + self._webpage_read_content(e.cause.response, None, item_id, prefix=first_bytes) or '{}', item_id, fatal=False), + lambda x: x['error']['message'], str) + if yt_error: + self._report_alerts([('ERROR', yt_error)], fatal=False) + # Downloading page may result in intermittent 5xx HTTP error + # Sometimes a 404 is also received. See: https://github.com/ytdl-org/youtube-dl/issues/28289 + # We also want to catch all other network exceptions since errors in later pages can be troublesome + # See https://github.com/yt-dlp/yt-dlp/issues/507#issuecomment-880188210 + if e.cause.status not in (403, 429): + main_rm.error = e + next(main_retries) + continue + return self._error_or_warning(e, fatal=fatal) + + try: + self._extract_and_report_alerts(response, only_once=True) + except ExtractorError as e: + # YouTube's servers may return errors we want to retry on in a 200 OK response + # See: https://github.com/yt-dlp/yt-dlp/issues/839 + if 'unknown error' in e.msg.lower(): + main_rm.error = e + next(main_retries) + continue + return self._error_or_warning(e, fatal=fatal) + # Youtube sometimes sends incomplete data + # See: https://github.com/ytdl-org/youtube-dl/issues/28194 + if not traverse_obj(response, *variadic(check_get_keys)): + icd_rm.error = ExtractorError('Incomplete data received', expected=True) + should_retry = next(icd_retries, None) + if not should_retry: + return None + continue + + return response + + @staticmethod + def is_music_url(url): + return re.match(r'(https?://)?music\.youtube\.com/', url) is not None + + def _extract_video(self, renderer): + video_id = renderer.get('videoId') + + reel_header_renderer = traverse_obj(renderer, ( + 'navigationEndpoint', 'reelWatchEndpoint', 'overlay', 'reelPlayerOverlayRenderer', + 'reelPlayerHeaderSupportedRenderers', 'reelPlayerHeaderRenderer')) + + title = self._get_text(renderer, 'title', 'headline') or self._get_text(reel_header_renderer, 'reelTitleText') + description = self._get_text(renderer, 'descriptionSnippet') + + duration = int_or_none(renderer.get('lengthSeconds')) + if duration is None: + duration = parse_duration(self._get_text( + renderer, 'lengthText', ('thumbnailOverlays', ..., 'thumbnailOverlayTimeStatusRenderer', 'text'))) + if duration is None: + # XXX: should write a parser to be more general to support more cases (e.g. shorts in shorts tab) + duration = parse_duration(self._search_regex( + r'(?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$', + traverse_obj(renderer, ('title', 'accessibility', 'accessibilityData', 'label'), default='', expected_type=str), + video_id, default=None, group='duration')) + + channel_id = traverse_obj( + renderer, ('shortBylineText', 'runs', ..., 'navigationEndpoint', 'browseEndpoint', 'browseId'), + expected_type=str, get_all=False) + if not channel_id: + channel_id = traverse_obj(reel_header_renderer, ('channelNavigationEndpoint', 'browseEndpoint', 'browseId')) + + channel_id = self.ucid_or_none(channel_id) + + overlay_style = traverse_obj( + renderer, ('thumbnailOverlays', ..., 'thumbnailOverlayTimeStatusRenderer', 'style'), + get_all=False, expected_type=str) + badges = self._extract_badges(traverse_obj(renderer, 'badges')) + owner_badges = self._extract_badges(traverse_obj(renderer, 'ownerBadges')) + navigation_url = urljoin('https://www.youtube.com/', traverse_obj( + renderer, ('navigationEndpoint', 'commandMetadata', 'webCommandMetadata', 'url'), + expected_type=str)) or '' + url = f'https://www.youtube.com/watch?v={video_id}' + if overlay_style == 'SHORTS' or '/shorts/' in navigation_url: + url = f'https://www.youtube.com/shorts/{video_id}' + + time_text = (self._get_text(renderer, 'publishedTimeText', 'videoInfo') + or self._get_text(reel_header_renderer, 'timestampText') or '') + scheduled_timestamp = str_to_int(traverse_obj(renderer, ('upcomingEventData', 'startTime'), get_all=False)) + + live_status = ( + 'is_upcoming' if scheduled_timestamp is not None + else 'was_live' if 'streamed' in time_text.lower() + else 'is_live' if overlay_style == 'LIVE' or self._has_badge(badges, BadgeType.LIVE_NOW) + else None) + + # videoInfo is a string like '50K views • 10 years ago'. + view_count_text = self._get_text(renderer, 'viewCountText', 'shortViewCountText', 'videoInfo') or '' + view_count = (0 if 'no views' in view_count_text.lower() + else self._get_count({'simpleText': view_count_text})) + view_count_field = 'concurrent_view_count' if live_status in ('is_live', 'is_upcoming') else 'view_count' + + channel = (self._get_text(renderer, 'ownerText', 'shortBylineText') + or self._get_text(reel_header_renderer, 'channelTitleText')) + + channel_handle = traverse_obj(renderer, ( + 'shortBylineText', 'runs', ..., 'navigationEndpoint', + (('commandMetadata', 'webCommandMetadata', 'url'), ('browseEndpoint', 'canonicalBaseUrl'))), + expected_type=self.handle_from_url, get_all=False) + return { + '_type': 'url', + 'ie_key': YoutubeIE.ie_key(), + 'id': video_id, + 'url': url, + 'title': title, + 'description': description, + 'duration': duration, + 'channel_id': channel_id, + 'channel': channel, + 'channel_url': f'https://www.youtube.com/channel/{channel_id}' if channel_id else None, + 'uploader': channel, + 'uploader_id': channel_handle, + 'uploader_url': format_field(channel_handle, None, 'https://www.youtube.com/%s', default=None), + 'thumbnails': self._extract_thumbnails(renderer, 'thumbnail'), + 'timestamp': (self._parse_time_text(time_text) + if self._configuration_arg('approximate_date', ie_key=YoutubeTabIE) + else None), + 'release_timestamp': scheduled_timestamp, + 'availability': + 'public' if self._has_badge(badges, BadgeType.AVAILABILITY_PUBLIC) + else self._availability( + is_private=self._has_badge(badges, BadgeType.AVAILABILITY_PRIVATE) or None, + needs_premium=self._has_badge(badges, BadgeType.AVAILABILITY_PREMIUM) or None, + needs_subscription=self._has_badge(badges, BadgeType.AVAILABILITY_SUBSCRIPTION) or None, + is_unlisted=self._has_badge(badges, BadgeType.AVAILABILITY_UNLISTED) or None), + view_count_field: view_count, + 'live_status': live_status, + 'channel_is_verified': True if self._has_badge(owner_badges, BadgeType.VERIFIED) else None + } + + +class YoutubeIE(YoutubeBaseInfoExtractor): + IE_DESC = 'YouTube' + _VALID_URL = r"""(?x)^ + ( + (?:https?://|//) # http(s):// or protocol-independent URL + (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie|kids)?\.com| + (?:www\.)?deturl\.com/www\.youtube\.com| + (?:www\.)?pwnyoutube\.com| + (?:www\.)?hooktube\.com| + (?:www\.)?yourepeat\.com| + tube\.majestyc\.net| + %(invidious)s| + youtube\.googleapis\.com)/ # the various hostnames, with wildcard subdomains + (?:.*?\#/)? # handle anchor (#/) redirect urls + (?: # the various things that can precede the ID: + (?:(?:v|embed|e|shorts|live)/(?!videoseries|live_stream)) # v/ or embed/ or e/ or shorts/ + |(?: # or the v= param in all its forms + (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)? # preceding watch(_popup|.php) or nothing (like /?v=xxxx) + (?:\?|\#!?) # the params delimiter ? or # or #! + (?:.*?[&;])?? # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&v=V36LpHqtcDY) + v= + ) + )) + |(?: + youtu\.be| # just youtu.be/xxxx + vid\.plus| # or vid.plus/xxxx + zwearz\.com/watch| # or zwearz.com/watch/xxxx + %(invidious)s + )/ + |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId= + ) + )? # all until now is optional -> you can pass the naked ID + (?P<id>[0-9A-Za-z_-]{11}) # here is it! the YouTube video ID + (?(1).+)? # if we found the ID, everything can follow + (?:\#|$)""" % { + 'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES), + } + _EMBED_REGEX = [ + r'''(?x) + (?: + <(?:[0-9A-Za-z-]+?)?iframe[^>]+?src=| + data-video-url=| + <embed[^>]+?src=| + embedSWF\(?:\s*| + <object[^>]+data=| + new\s+SWFObject\( + ) + (["\']) + (?P<url>(?:https?:)?//(?:www\.)?youtube(?:-nocookie)?\.com/ + (?:embed|v|p)/[0-9A-Za-z_-]{11}.*?) + \1''', + # https://wordpress.org/plugins/lazy-load-for-videos/ + r'''(?xs) + <a\s[^>]*\bhref="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})" + \s[^>]*\bclass="[^"]*\blazy-load-youtube''', + ] + _RETURN_TYPE = 'video' # XXX: How to handle multifeed? + + _PLAYER_INFO_RE = ( + r'/s/player/(?P<id>[a-zA-Z0-9_-]{8,})/player', + r'/(?P<id>[a-zA-Z0-9_-]{8,})/player(?:_ias\.vflset(?:/[a-zA-Z]{2,3}_[a-zA-Z]{2,3})?|-plasma-ias-(?:phone|tablet)-[a-z]{2}_[A-Z]{2}\.vflset)/base\.js$', + r'\b(?P<id>vfl[a-zA-Z0-9_-]+)\b.*?\.js$', + ) + _formats = { + '5': {'ext': 'flv', 'width': 400, 'height': 240, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263'}, + '6': {'ext': 'flv', 'width': 450, 'height': 270, 'acodec': 'mp3', 'abr': 64, 'vcodec': 'h263'}, + '13': {'ext': '3gp', 'acodec': 'aac', 'vcodec': 'mp4v'}, + '17': {'ext': '3gp', 'width': 176, 'height': 144, 'acodec': 'aac', 'abr': 24, 'vcodec': 'mp4v'}, + '18': {'ext': 'mp4', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 96, 'vcodec': 'h264'}, + '22': {'ext': 'mp4', 'width': 1280, 'height': 720, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264'}, + '34': {'ext': 'flv', 'width': 640, 'height': 360, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264'}, + '35': {'ext': 'flv', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264'}, + # itag 36 videos are either 320x180 (BaW_jenozKc) or 320x240 (__2ABJjxzNo), abr varies as well + '36': {'ext': '3gp', 'width': 320, 'acodec': 'aac', 'vcodec': 'mp4v'}, + '37': {'ext': 'mp4', 'width': 1920, 'height': 1080, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264'}, + '38': {'ext': 'mp4', 'width': 4096, 'height': 3072, 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264'}, + '43': {'ext': 'webm', 'width': 640, 'height': 360, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8'}, + '44': {'ext': 'webm', 'width': 854, 'height': 480, 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8'}, + '45': {'ext': 'webm', 'width': 1280, 'height': 720, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8'}, + '46': {'ext': 'webm', 'width': 1920, 'height': 1080, 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8'}, + '59': {'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264'}, + '78': {'ext': 'mp4', 'width': 854, 'height': 480, 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264'}, + + + # 3D videos + '82': {'ext': 'mp4', 'height': 360, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20}, + '83': {'ext': 'mp4', 'height': 480, 'format_note': '3D', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -20}, + '84': {'ext': 'mp4', 'height': 720, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20}, + '85': {'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'acodec': 'aac', 'abr': 192, 'vcodec': 'h264', 'preference': -20}, + '100': {'ext': 'webm', 'height': 360, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 128, 'vcodec': 'vp8', 'preference': -20}, + '101': {'ext': 'webm', 'height': 480, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20}, + '102': {'ext': 'webm', 'height': 720, 'format_note': '3D', 'acodec': 'vorbis', 'abr': 192, 'vcodec': 'vp8', 'preference': -20}, + + # Apple HTTP Live Streaming + '91': {'ext': 'mp4', 'height': 144, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10}, + '92': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10}, + '93': {'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10}, + '94': {'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 128, 'vcodec': 'h264', 'preference': -10}, + '95': {'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10}, + '96': {'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 256, 'vcodec': 'h264', 'preference': -10}, + '132': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 48, 'vcodec': 'h264', 'preference': -10}, + '151': {'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'acodec': 'aac', 'abr': 24, 'vcodec': 'h264', 'preference': -10}, + + # DASH mp4 video + '133': {'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '134': {'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '135': {'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '136': {'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '137': {'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '138': {'ext': 'mp4', 'format_note': 'DASH video', 'vcodec': 'h264'}, # Height can vary (https://github.com/ytdl-org/youtube-dl/issues/4559) + '160': {'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '212': {'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '264': {'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'h264'}, + '298': {'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60}, + '299': {'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'h264', 'fps': 60}, + '266': {'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'h264'}, + + # Dash mp4 audio + '139': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 48, 'container': 'm4a_dash'}, + '140': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 128, 'container': 'm4a_dash'}, + '141': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'abr': 256, 'container': 'm4a_dash'}, + '256': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash'}, + '258': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'container': 'm4a_dash'}, + '325': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'dtse', 'container': 'm4a_dash'}, + '328': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'ec-3', 'container': 'm4a_dash'}, + + # Dash webm + '167': {'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '168': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '169': {'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '170': {'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '218': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '219': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp8'}, + '278': {'ext': 'webm', 'height': 144, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'vp9'}, + '242': {'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '243': {'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '244': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '245': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '246': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '247': {'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '248': {'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '271': {'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + # itag 272 videos are either 3840x2160 (e.g. RtoitU2A-3E) or 7680x4320 (sLprVF6d7Ug) + '272': {'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '302': {'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60}, + '303': {'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60}, + '308': {'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60}, + '313': {'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9'}, + '315': {'ext': 'webm', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'vp9', 'fps': 60}, + + # Dash webm audio + '171': {'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 128}, + '172': {'ext': 'webm', 'acodec': 'vorbis', 'format_note': 'DASH audio', 'abr': 256}, + + # Dash webm audio with opus inside + '249': {'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 50}, + '250': {'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 70}, + '251': {'ext': 'webm', 'format_note': 'DASH audio', 'acodec': 'opus', 'abr': 160}, + + # RTMP (unnamed) + '_rtmp': {'protocol': 'rtmp'}, + + # av01 video only formats sometimes served with "unknown" codecs + '394': {'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08'}, + '395': {'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'vcodec': 'av01.0.00M.08'}, + '396': {'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'vcodec': 'av01.0.01M.08'}, + '397': {'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'vcodec': 'av01.0.04M.08'}, + '398': {'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'vcodec': 'av01.0.05M.08'}, + '399': {'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'vcodec': 'av01.0.08M.08'}, + '400': {'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08'}, + '401': {'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'vcodec': 'av01.0.12M.08'}, + } + _SUBTITLE_FORMATS = ('json3', 'srv1', 'srv2', 'srv3', 'ttml', 'vtt') + + _GEO_BYPASS = False + + IE_NAME = 'youtube' + _TESTS = [ + { + 'url': 'https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9', + 'info_dict': { + 'id': 'BaW_jenozKc', + 'ext': 'mp4', + 'title': 'youtube-dl test video "\'/\\ä↭ð•', + 'channel': 'Philipp Hagemeister', + 'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q', + 'channel_url': r're:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3Q', + 'upload_date': '20121002', + 'description': 'md5:8fb536f4877b8a7455c2ec23794dbc22', + 'categories': ['Science & Technology'], + 'tags': ['youtube-dl'], + 'duration': 10, + 'view_count': int, + 'like_count': int, + 'availability': 'public', + 'playable_in_embed': True, + 'thumbnail': 'https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpg', + 'live_status': 'not_live', + 'age_limit': 0, + 'start_time': 1, + 'end_time': 9, + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'Philipp Hagemeister', + 'uploader_url': 'https://www.youtube.com/@PhilippHagemeister', + 'uploader_id': '@PhilippHagemeister', + 'heatmap': 'count:100', + } + }, + { + 'url': '//www.YouTube.com/watch?v=yZIXLfi8CZQ', + 'note': 'Embed-only video (#1746)', + 'info_dict': { + 'id': 'yZIXLfi8CZQ', + 'ext': 'mp4', + 'upload_date': '20120608', + 'title': 'Principal Sexually Assaults A Teacher - Episode 117 - 8th June 2012', + 'description': 'md5:09b78bd971f1e3e289601dfba15ca4f7', + 'age_limit': 18, + }, + 'skip': 'Private video', + }, + { + 'url': 'https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQ', + 'note': 'Use the first video ID in the URL', + 'info_dict': { + 'id': 'BaW_jenozKc', + 'ext': 'mp4', + 'title': 'youtube-dl test video "\'/\\ä↭ð•', + 'channel': 'Philipp Hagemeister', + 'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q', + 'channel_url': r're:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3Q', + 'upload_date': '20121002', + 'description': 'md5:8fb536f4877b8a7455c2ec23794dbc22', + 'categories': ['Science & Technology'], + 'tags': ['youtube-dl'], + 'duration': 10, + 'view_count': int, + 'like_count': int, + 'availability': 'public', + 'playable_in_embed': True, + 'thumbnail': 'https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpg', + 'live_status': 'not_live', + 'age_limit': 0, + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'Philipp Hagemeister', + 'uploader_url': 'https://www.youtube.com/@PhilippHagemeister', + 'uploader_id': '@PhilippHagemeister', + 'heatmap': 'count:100', + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'https://www.youtube.com/watch?v=a9LDPn-MO4I', + 'note': '256k DASH audio (format 141) via DASH manifest', + 'info_dict': { + 'id': 'a9LDPn-MO4I', + 'ext': 'm4a', + 'upload_date': '20121002', + 'description': '', + 'title': 'UHDTV TEST 8K VIDEO.mp4' + }, + 'params': { + 'youtube_include_dash_manifest': True, + 'format': '141', + }, + 'skip': 'format 141 not served anymore', + }, + # DASH manifest with encrypted signature + { + 'url': 'https://www.youtube.com/watch?v=IB3lcPjvWLA', + 'info_dict': { + 'id': 'IB3lcPjvWLA', + 'ext': 'm4a', + 'title': 'Afrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilson', + 'description': 'md5:8f5e2b82460520b619ccac1f509d43bf', + 'duration': 244, + 'upload_date': '20131011', + 'abr': 129.495, + 'like_count': int, + 'channel_id': 'UChuZAo1RKL85gev3Eal9_zg', + 'playable_in_embed': True, + 'channel_url': 'https://www.youtube.com/channel/UChuZAo1RKL85gev3Eal9_zg', + 'view_count': int, + 'track': 'The Spark', + 'live_status': 'not_live', + 'thumbnail': 'https://i.ytimg.com/vi_webp/IB3lcPjvWLA/maxresdefault.webp', + 'channel': 'Afrojack', + 'tags': 'count:19', + 'availability': 'public', + 'categories': ['Music'], + 'age_limit': 0, + 'alt_title': 'The Spark', + 'channel_follower_count': int, + 'uploader': 'Afrojack', + 'uploader_url': 'https://www.youtube.com/@Afrojack', + 'uploader_id': '@Afrojack', + }, + 'params': { + 'youtube_include_dash_manifest': True, + 'format': '141/bestaudio[ext=m4a]', + }, + }, + # Age-gate videos. See https://github.com/yt-dlp/yt-dlp/pull/575#issuecomment-888837000 + { + 'note': 'Embed allowed age-gate video', + 'url': 'https://youtube.com/watch?v=HtVdAasjOgU', + 'info_dict': { + 'id': 'HtVdAasjOgU', + 'ext': 'mp4', + 'title': 'The Witcher 3: Wild Hunt - The Sword Of Destiny Trailer', + 'description': r're:(?s).{100,}About the Game\n.*?The Witcher 3: Wild Hunt.{100,}', + 'duration': 142, + 'upload_date': '20140605', + 'age_limit': 18, + 'categories': ['Gaming'], + 'thumbnail': 'https://i.ytimg.com/vi_webp/HtVdAasjOgU/maxresdefault.webp', + 'availability': 'needs_auth', + 'channel_url': 'https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEg', + 'like_count': int, + 'channel': 'The Witcher', + 'live_status': 'not_live', + 'tags': 'count:17', + 'channel_id': 'UCzybXLxv08IApdjdN0mJhEg', + 'playable_in_embed': True, + 'view_count': int, + 'channel_follower_count': int, + 'uploader': 'The Witcher', + 'uploader_url': 'https://www.youtube.com/@thewitcher', + 'uploader_id': '@thewitcher', + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + }, + { + 'note': 'Age-gate video with embed allowed in public site', + 'url': 'https://youtube.com/watch?v=HsUATh_Nc2U', + 'info_dict': { + 'id': 'HsUATh_Nc2U', + 'ext': 'mp4', + 'title': 'Godzilla 2 (Official Video)', + 'description': 'md5:bf77e03fcae5529475e500129b05668a', + 'upload_date': '20200408', + 'age_limit': 18, + 'availability': 'needs_auth', + 'channel_id': 'UCYQT13AtrJC0gsM1far_zJg', + 'channel': 'FlyingKitty', + 'channel_url': 'https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJg', + 'view_count': int, + 'categories': ['Entertainment'], + 'live_status': 'not_live', + 'tags': ['Flyingkitty', 'godzilla 2'], + 'thumbnail': 'https://i.ytimg.com/vi/HsUATh_Nc2U/maxresdefault.jpg', + 'like_count': int, + 'duration': 177, + 'playable_in_embed': True, + 'channel_follower_count': int, + 'uploader': 'FlyingKitty', + 'uploader_url': 'https://www.youtube.com/@FlyingKitty900', + 'uploader_id': '@FlyingKitty900', + 'comment_count': int, + 'channel_is_verified': True, + }, + }, + { + 'note': 'Age-gate video embedable only with clientScreen=EMBED', + 'url': 'https://youtube.com/watch?v=Tq92D6wQ1mg', + 'info_dict': { + 'id': 'Tq92D6wQ1mg', + 'title': '[MMD] Adios - EVERGLOW [+Motion DL]', + 'ext': 'mp4', + 'upload_date': '20191228', + 'description': 'md5:17eccca93a786d51bc67646756894066', + 'age_limit': 18, + 'like_count': int, + 'availability': 'needs_auth', + 'channel_id': 'UC1yoRdFoFJaCY-AGfD9W0wQ', + 'view_count': int, + 'thumbnail': 'https://i.ytimg.com/vi_webp/Tq92D6wQ1mg/sddefault.webp', + 'channel': 'Projekt Melody', + 'live_status': 'not_live', + 'tags': ['mmd', 'dance', 'mikumikudance', 'kpop', 'vtuber'], + 'playable_in_embed': True, + 'categories': ['Entertainment'], + 'duration': 106, + 'channel_url': 'https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQ', + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'Projekt Melody', + 'uploader_url': 'https://www.youtube.com/@ProjektMelody', + 'uploader_id': '@ProjektMelody', + }, + }, + { + 'note': 'Non-Agegated non-embeddable video', + 'url': 'https://youtube.com/watch?v=MeJVWBSsPAY', + 'info_dict': { + 'id': 'MeJVWBSsPAY', + 'ext': 'mp4', + 'title': 'OOMPH! - Such Mich Find Mich (Lyrics)', + 'description': 'Fan Video. Music & Lyrics by OOMPH!.', + 'upload_date': '20130730', + 'track': 'Such mich find mich', + 'age_limit': 0, + 'tags': ['oomph', 'such mich find mich', 'lyrics', 'german industrial', 'musica industrial'], + 'like_count': int, + 'playable_in_embed': False, + 'creator': 'OOMPH!', + 'thumbnail': 'https://i.ytimg.com/vi/MeJVWBSsPAY/sddefault.jpg', + 'view_count': int, + 'alt_title': 'Such mich find mich', + 'duration': 210, + 'channel': 'Herr Lurik', + 'channel_id': 'UCdR3RSDPqub28LjZx0v9-aA', + 'categories': ['Music'], + 'availability': 'public', + 'channel_url': 'https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aA', + 'live_status': 'not_live', + 'artist': 'OOMPH!', + 'channel_follower_count': int, + 'uploader': 'Herr Lurik', + 'uploader_url': 'https://www.youtube.com/@HerrLurik', + 'uploader_id': '@HerrLurik', + }, + }, + { + 'note': 'Non-bypassable age-gated video', + 'url': 'https://youtube.com/watch?v=Cr381pDsSsA', + 'only_matching': True, + }, + # video_info is None (https://github.com/ytdl-org/youtube-dl/issues/4421) + # YouTube Red ad is not captured for creator + { + 'url': '__2ABJjxzNo', + 'info_dict': { + 'id': '__2ABJjxzNo', + 'ext': 'mp4', + 'duration': 266, + 'upload_date': '20100430', + 'creator': 'deadmau5', + 'description': 'md5:6cbcd3a92ce1bc676fc4d6ab4ace2336', + 'title': 'Deadmau5 - Some Chords (HD)', + 'alt_title': 'Some Chords', + 'availability': 'public', + 'tags': 'count:14', + 'channel_id': 'UCYEK6xds6eo-3tr4xRdflmQ', + 'view_count': int, + 'live_status': 'not_live', + 'channel': 'deadmau5', + 'thumbnail': 'https://i.ytimg.com/vi_webp/__2ABJjxzNo/maxresdefault.webp', + 'like_count': int, + 'track': 'Some Chords', + 'artist': 'deadmau5', + 'playable_in_embed': True, + 'age_limit': 0, + 'channel_url': 'https://www.youtube.com/channel/UCYEK6xds6eo-3tr4xRdflmQ', + 'categories': ['Music'], + 'album': 'Some Chords', + 'channel_follower_count': int, + 'uploader': 'deadmau5', + 'uploader_url': 'https://www.youtube.com/@deadmau5', + 'uploader_id': '@deadmau5', + }, + 'expected_warnings': [ + 'DASH manifest missing', + ] + }, + # Olympics (https://github.com/ytdl-org/youtube-dl/issues/4431) + { + 'url': 'lqQg6PlCWgI', + 'info_dict': { + 'id': 'lqQg6PlCWgI', + 'ext': 'mp4', + 'duration': 6085, + 'upload_date': '20150827', + 'description': 'md5:04bbbf3ccceb6795947572ca36f45904', + 'title': 'Hockey - Women - GER-AUS - London 2012 Olympic Games', + 'like_count': int, + 'release_timestamp': 1343767800, + 'playable_in_embed': True, + 'categories': ['Sports'], + 'release_date': '20120731', + 'channel': 'Olympics', + 'tags': ['Hockey', '2012-07-31', '31 July 2012', 'Riverbank Arena', 'Session', 'Olympics', 'Olympic Games', 'London 2012', '2012 Summer Olympics', 'Summer Games'], + 'channel_id': 'UCTl3QQTvqHFjurroKxexy2Q', + 'thumbnail': 'https://i.ytimg.com/vi/lqQg6PlCWgI/maxresdefault.jpg', + 'age_limit': 0, + 'availability': 'public', + 'live_status': 'was_live', + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2Q', + 'channel_follower_count': int, + 'uploader': 'Olympics', + 'uploader_url': 'https://www.youtube.com/@Olympics', + 'uploader_id': '@Olympics', + 'channel_is_verified': True, + }, + 'params': { + 'skip_download': 'requires avconv', + } + }, + # Non-square pixels + { + 'url': 'https://www.youtube.com/watch?v=_b-2C3KPAM0', + 'info_dict': { + 'id': '_b-2C3KPAM0', + 'ext': 'mp4', + 'stretched_ratio': 16 / 9., + 'duration': 85, + 'upload_date': '20110310', + 'description': 'made by Wacom from Korea | 字幕&加油添醋 by TY\'s Allen | 感è¬heylisa00cavey1001åŒå­¸ç†±æƒ…æä¾›æ¢—åŠç¿»è­¯', + 'title': '[A-made] 變態å¦å­—幕版 å¤ªå¦ æˆ‘å°±æ˜¯é€™æ¨£çš„äºº', + 'playable_in_embed': True, + 'channel': 'å­«á„‹á„…', + 'age_limit': 0, + 'tags': 'count:11', + 'channel_url': 'https://www.youtube.com/channel/UCS-xxCmRaA6BFdmgDPA_BIw', + 'channel_id': 'UCS-xxCmRaA6BFdmgDPA_BIw', + 'thumbnail': 'https://i.ytimg.com/vi/_b-2C3KPAM0/maxresdefault.jpg', + 'view_count': int, + 'categories': ['People & Blogs'], + 'like_count': int, + 'live_status': 'not_live', + 'availability': 'unlisted', + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'å­«á„‹á„…', + 'uploader_url': 'https://www.youtube.com/@AllenMeow', + 'uploader_id': '@AllenMeow', + }, + }, + # url_encoded_fmt_stream_map is empty string + { + 'url': 'qEJwOuvDf7I', + 'info_dict': { + 'id': 'qEJwOuvDf7I', + 'ext': 'webm', + 'title': 'ОбÑуждение Ñудебной практики по выборам 14 ÑентÑÐ±Ñ€Ñ 2014 года в Санкт-Петербурге', + 'description': '', + 'upload_date': '20150404', + }, + 'params': { + 'skip_download': 'requires avconv', + }, + 'skip': 'This live event has ended.', + }, + # Extraction from multiple DASH manifests (https://github.com/ytdl-org/youtube-dl/pull/6097) + { + 'url': 'https://www.youtube.com/watch?v=FIl7x6_3R5Y', + 'info_dict': { + 'id': 'FIl7x6_3R5Y', + 'ext': 'webm', + 'title': 'md5:7b81415841e02ecd4313668cde88737a', + 'description': 'md5:116377fd2963b81ec4ce64b542173306', + 'duration': 220, + 'upload_date': '20150625', + 'formats': 'mincount:31', + }, + 'skip': 'not actual anymore', + }, + # DASH manifest with segment_list + { + 'url': 'https://www.youtube.com/embed/CsmdDsKjzN8', + 'md5': '8ce563a1d667b599d21064e982ab9e31', + 'info_dict': { + 'id': 'CsmdDsKjzN8', + 'ext': 'mp4', + 'upload_date': '20150501', # According to '<meta itemprop="datePublished"', but in other places it's 20150510 + 'description': 'Retransmisión en directo de la XVIII media maratón de Zaragoza.', + 'title': 'Retransmisión XVIII Media maratón Zaragoza 2015', + }, + 'params': { + 'youtube_include_dash_manifest': True, + 'format': '135', # bestvideo + }, + 'skip': 'This live event has ended.', + }, + { + # Multifeed videos (multiple cameras), URL can be of any Camera + # TODO: fix multifeed titles + 'url': 'https://www.youtube.com/watch?v=zaPI8MvL8pg', + 'info_dict': { + 'id': 'zaPI8MvL8pg', + 'title': 'Terraria 1.2 Live Stream | Let\'s Play - Part 04', + 'description': 'md5:563ccbc698b39298481ca3c571169519', + }, + 'playlist': [{ + 'info_dict': { + 'id': 'j5yGuxZ8lLU', + 'ext': 'mp4', + 'title': 'Terraria 1.2 Live Stream | Let\'s Play - Part 04 (Chris)', + 'description': 'md5:563ccbc698b39298481ca3c571169519', + 'duration': 10120, + 'channel_follower_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCN2XePorRokPB9TEgRZpddg', + 'availability': 'public', + 'playable_in_embed': True, + 'upload_date': '20131105', + 'categories': ['Gaming'], + 'live_status': 'was_live', + 'tags': 'count:24', + 'release_timestamp': 1383701910, + 'thumbnail': 'https://i.ytimg.com/vi/j5yGuxZ8lLU/maxresdefault.jpg', + 'comment_count': int, + 'age_limit': 0, + 'like_count': int, + 'channel_id': 'UCN2XePorRokPB9TEgRZpddg', + 'channel': 'WiiLikeToPlay', + 'view_count': int, + 'release_date': '20131106', + 'uploader': 'WiiLikeToPlay', + 'uploader_id': '@WLTP', + 'uploader_url': 'https://www.youtube.com/@WLTP', + }, + }, { + 'info_dict': { + 'id': 'zaPI8MvL8pg', + 'ext': 'mp4', + 'title': 'Terraria 1.2 Live Stream | Let\'s Play - Part 04 (Tyson)', + 'availability': 'public', + 'channel_url': 'https://www.youtube.com/channel/UCN2XePorRokPB9TEgRZpddg', + 'channel': 'WiiLikeToPlay', + 'channel_follower_count': int, + 'description': 'md5:563ccbc698b39298481ca3c571169519', + 'duration': 10108, + 'age_limit': 0, + 'like_count': int, + 'tags': 'count:24', + 'channel_id': 'UCN2XePorRokPB9TEgRZpddg', + 'release_timestamp': 1383701915, + 'comment_count': int, + 'upload_date': '20131105', + 'thumbnail': 'https://i.ytimg.com/vi/zaPI8MvL8pg/maxresdefault.jpg', + 'release_date': '20131106', + 'playable_in_embed': True, + 'live_status': 'was_live', + 'categories': ['Gaming'], + 'view_count': int, + 'uploader': 'WiiLikeToPlay', + 'uploader_id': '@WLTP', + 'uploader_url': 'https://www.youtube.com/@WLTP', + }, + }, { + 'info_dict': { + 'id': 'R7r3vfO7Hao', + 'ext': 'mp4', + 'title': 'Terraria 1.2 Live Stream | Let\'s Play - Part 04 (Spencer)', + 'thumbnail': 'https://i.ytimg.com/vi/R7r3vfO7Hao/maxresdefault.jpg', + 'channel_id': 'UCN2XePorRokPB9TEgRZpddg', + 'like_count': int, + 'availability': 'public', + 'playable_in_embed': True, + 'upload_date': '20131105', + 'description': 'md5:563ccbc698b39298481ca3c571169519', + 'channel_follower_count': int, + 'tags': 'count:24', + 'release_date': '20131106', + 'comment_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCN2XePorRokPB9TEgRZpddg', + 'channel': 'WiiLikeToPlay', + 'categories': ['Gaming'], + 'release_timestamp': 1383701914, + 'live_status': 'was_live', + 'age_limit': 0, + 'duration': 10128, + 'view_count': int, + 'uploader': 'WiiLikeToPlay', + 'uploader_id': '@WLTP', + 'uploader_url': 'https://www.youtube.com/@WLTP', + }, + }], + 'params': {'skip_download': True}, + }, + { + # Multifeed video with comma in title (see https://github.com/ytdl-org/youtube-dl/issues/8536) + 'url': 'https://www.youtube.com/watch?v=gVfLd0zydlo', + 'info_dict': { + 'id': 'gVfLd0zydlo', + 'title': 'DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30', + }, + 'playlist_count': 2, + 'skip': 'Not multifeed anymore', + }, + { + 'url': 'https://vid.plus/FlRa-iH7PGw', + 'only_matching': True, + }, + { + 'url': 'https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.html', + 'only_matching': True, + }, + { + # Title with JS-like syntax "};" (see https://github.com/ytdl-org/youtube-dl/issues/7468) + # Also tests cut-off URL expansion in video description (see + # https://github.com/ytdl-org/youtube-dl/issues/1892, + # https://github.com/ytdl-org/youtube-dl/issues/8164) + 'url': 'https://www.youtube.com/watch?v=lsguqyKfVQg', + 'info_dict': { + 'id': 'lsguqyKfVQg', + 'ext': 'mp4', + 'title': '{dark walk}; Loki/AC/Dishonored; collab w/Elflover21', + 'alt_title': 'Dark Walk', + 'description': 'md5:8085699c11dc3f597ce0410b0dcbb34a', + 'duration': 133, + 'upload_date': '20151119', + 'creator': 'Todd Haberman;\nDaniel Law Heath and Aaron Kaplan', + 'track': 'Dark Walk', + 'artist': 'Todd Haberman;\nDaniel Law Heath and Aaron Kaplan', + 'album': 'Position Music - Production Music Vol. 143 - Dark Walk', + 'thumbnail': 'https://i.ytimg.com/vi_webp/lsguqyKfVQg/maxresdefault.webp', + 'categories': ['Film & Animation'], + 'view_count': int, + 'live_status': 'not_live', + 'channel_url': 'https://www.youtube.com/channel/UCTSRgz5jylBvFt_S7wnsqLQ', + 'channel_id': 'UCTSRgz5jylBvFt_S7wnsqLQ', + 'tags': 'count:13', + 'availability': 'public', + 'channel': 'IronSoulElf', + 'playable_in_embed': True, + 'like_count': int, + 'age_limit': 0, + 'channel_follower_count': int + }, + 'params': { + 'skip_download': True, + }, + }, + { + # Tags with '};' (see https://github.com/ytdl-org/youtube-dl/issues/7468) + 'url': 'https://www.youtube.com/watch?v=Ms7iBXnlUO8', + 'only_matching': True, + }, + { + # Video with yt:stretch=17:0 + 'url': 'https://www.youtube.com/watch?v=Q39EVAstoRM', + 'info_dict': { + 'id': 'Q39EVAstoRM', + 'ext': 'mp4', + 'title': 'Clash Of Clans#14 Dicas De Ataque Para CV 4', + 'description': 'md5:ee18a25c350637c8faff806845bddee9', + 'upload_date': '20151107', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This video does not exist.', + }, + { + # Video with incomplete 'yt:stretch=16:' + 'url': 'https://www.youtube.com/watch?v=FRhJzUSJbGI', + 'only_matching': True, + }, + { + # Video licensed under Creative Commons + 'url': 'https://www.youtube.com/watch?v=M4gD1WSo5mA', + 'info_dict': { + 'id': 'M4gD1WSo5mA', + 'ext': 'mp4', + 'title': 'md5:e41008789470fc2533a3252216f1c1d1', + 'description': 'md5:a677553cf0840649b731a3024aeff4cc', + 'duration': 721, + 'upload_date': '20150128', + 'license': 'Creative Commons Attribution license (reuse allowed)', + 'channel_id': 'UCuLGmD72gJDBwmLw06X58SA', + 'channel_url': 'https://www.youtube.com/channel/UCuLGmD72gJDBwmLw06X58SA', + 'like_count': int, + 'age_limit': 0, + 'tags': ['Copyright (Legal Subject)', 'Law (Industry)', 'William W. Fisher (Author)'], + 'channel': 'The Berkman Klein Center for Internet & Society', + 'availability': 'public', + 'view_count': int, + 'categories': ['Education'], + 'thumbnail': 'https://i.ytimg.com/vi_webp/M4gD1WSo5mA/maxresdefault.webp', + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel_follower_count': int, + 'chapters': list, + 'uploader': 'The Berkman Klein Center for Internet & Society', + 'uploader_id': '@BKCHarvard', + 'uploader_url': 'https://www.youtube.com/@BKCHarvard', + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'https://www.youtube.com/watch?v=eQcmzGIKrzg', + 'info_dict': { + 'id': 'eQcmzGIKrzg', + 'ext': 'mp4', + 'title': 'Democratic Socialism and Foreign Policy | Bernie Sanders', + 'description': 'md5:13a2503d7b5904ef4b223aa101628f39', + 'duration': 4060, + 'upload_date': '20151120', + 'license': 'Creative Commons Attribution license (reuse allowed)', + 'playable_in_embed': True, + 'tags': 'count:12', + 'like_count': int, + 'channel_id': 'UCH1dpzjCEiGAt8CXkryhkZg', + 'age_limit': 0, + 'availability': 'public', + 'categories': ['News & Politics'], + 'channel': 'Bernie Sanders', + 'thumbnail': 'https://i.ytimg.com/vi_webp/eQcmzGIKrzg/maxresdefault.webp', + 'view_count': int, + 'live_status': 'not_live', + 'channel_url': 'https://www.youtube.com/channel/UCH1dpzjCEiGAt8CXkryhkZg', + 'comment_count': int, + 'channel_follower_count': int, + 'chapters': list, + 'uploader': 'Bernie Sanders', + 'uploader_url': 'https://www.youtube.com/@BernieSanders', + 'uploader_id': '@BernieSanders', + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'https://www.youtube.com/watch?feature=player_embedded&amp;v=V36LpHqtcDY', + 'only_matching': True, + }, + { + # YouTube Red paid video (https://github.com/ytdl-org/youtube-dl/issues/10059) + 'url': 'https://www.youtube.com/watch?v=i1Ko8UG-Tdo', + 'only_matching': True, + }, + { + # Rental video preview + 'url': 'https://www.youtube.com/watch?v=yYr8q0y5Jfg', + 'info_dict': { + 'id': 'uGpuVWrhIzE', + 'ext': 'mp4', + 'title': 'Piku - Trailer', + 'description': 'md5:c36bd60c3fd6f1954086c083c72092eb', + 'upload_date': '20150811', + 'license': 'Standard YouTube License', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This video is not available.', + }, + { + # YouTube Red video with episode data + 'url': 'https://www.youtube.com/watch?v=iqKdEhx-dD4', + 'info_dict': { + 'id': 'iqKdEhx-dD4', + 'ext': 'mp4', + 'title': 'Isolation - Mind Field (Ep 1)', + 'description': 'md5:f540112edec5d09fc8cc752d3d4ba3cd', + 'duration': 2085, + 'upload_date': '20170118', + 'series': 'Mind Field', + 'season_number': 1, + 'episode_number': 1, + 'thumbnail': 'https://i.ytimg.com/vi_webp/iqKdEhx-dD4/maxresdefault.webp', + 'tags': 'count:12', + 'view_count': int, + 'availability': 'public', + 'age_limit': 0, + 'channel': 'Vsauce', + 'episode': 'Episode 1', + 'categories': ['Entertainment'], + 'season': 'Season 1', + 'channel_id': 'UC6nSFpj9HTCZ5t-N3Rm3-HA', + 'channel_url': 'https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HA', + 'like_count': int, + 'playable_in_embed': True, + 'live_status': 'not_live', + 'channel_follower_count': int, + 'uploader': 'Vsauce', + 'uploader_url': 'https://www.youtube.com/@Vsauce', + 'uploader_id': '@Vsauce', + 'comment_count': int, + 'channel_is_verified': True, + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': [ + 'Skipping DASH manifest', + ], + }, + { + # The following content has been identified by the YouTube community + # as inappropriate or offensive to some audiences. + 'url': 'https://www.youtube.com/watch?v=6SJNVb0GnPI', + 'info_dict': { + 'id': '6SJNVb0GnPI', + 'ext': 'mp4', + 'title': 'Race Differences in Intelligence', + 'description': 'md5:5d161533167390427a1f8ee89a1fc6f1', + 'duration': 965, + 'upload_date': '20140124', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This video has been removed for violating YouTube\'s policy on hate speech.', + }, + { + # itag 212 + 'url': '1t24XAntNCY', + 'only_matching': True, + }, + { + # geo restricted to JP + 'url': 'sJL6WA-aGkQ', + 'only_matching': True, + }, + { + 'url': 'https://invidio.us/watch?v=BaW_jenozKc', + 'only_matching': True, + }, + { + 'url': 'https://redirect.invidious.io/watch?v=BaW_jenozKc', + 'only_matching': True, + }, + { + # from https://nitter.pussthecat.org/YouTube/status/1360363141947944964#m + 'url': 'https://redirect.invidious.io/Yh0AhrY9GjA', + 'only_matching': True, + }, + { + # DRM protected + 'url': 'https://www.youtube.com/watch?v=s7_qI6_mIXc', + 'only_matching': True, + }, + { + # Video with unsupported adaptive stream type formats + 'url': 'https://www.youtube.com/watch?v=Z4Vy8R84T1U', + 'info_dict': { + 'id': 'Z4Vy8R84T1U', + 'ext': 'mp4', + 'title': 'saman SMAN 53 Jakarta(Sancety) opening COFFEE4th at SMAN 53 Jakarta', + 'description': 'md5:d41d8cd98f00b204e9800998ecf8427e', + 'duration': 433, + 'upload_date': '20130923', + 'formats': 'maxcount:10', + }, + 'params': { + 'skip_download': True, + 'youtube_include_dash_manifest': False, + }, + 'skip': 'not actual anymore', + }, + { + # Youtube Music Auto-generated description + # TODO: fix metadata extraction + 'url': 'https://music.youtube.com/watch?v=MgNrAu2pzNs', + 'info_dict': { + 'id': 'MgNrAu2pzNs', + 'ext': 'mp4', + 'title': 'Voyeur Girl', + 'description': 'md5:7ae382a65843d6df2685993e90a8628f', + 'upload_date': '20190312', + 'artist': 'Stephen', + 'track': 'Voyeur Girl', + 'album': 'it\'s too much love to know my dear', + 'release_date': '20190313', + 'release_year': 2019, + 'alt_title': 'Voyeur Girl', + 'view_count': int, + 'playable_in_embed': True, + 'like_count': int, + 'categories': ['Music'], + 'channel_url': 'https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAA', + 'channel': 'Stephen', # TODO: should be "Stephen - Topic" + 'uploader': 'Stephen', + 'availability': 'public', + 'creator': 'Stephen', + 'duration': 169, + 'thumbnail': 'https://i.ytimg.com/vi_webp/MgNrAu2pzNs/maxresdefault.webp', + 'age_limit': 0, + 'channel_id': 'UC-pWHpBjdGG69N9mM2auIAA', + 'tags': 'count:11', + 'live_status': 'not_live', + 'channel_follower_count': int + }, + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'https://www.youtubekids.com/watch?v=3b8nCWDgZ6Q', + 'only_matching': True, + }, + { + # invalid -> valid video id redirection + 'url': 'DJztXj2GPfl', + 'info_dict': { + 'id': 'DJztXj2GPfk', + 'ext': 'mp4', + 'title': 'Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)', + 'description': 'md5:bf577a41da97918e94fa9798d9228825', + 'upload_date': '20090125', + 'artist': 'Panjabi MC', + 'track': 'Beware of the Boys (Mundian to Bach Ke) - Motivo Hi-Lectro Remix', + 'album': 'Beware of the Boys (Mundian To Bach Ke)', + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'Video unavailable', + }, + { + # empty description results in an empty string + 'url': 'https://www.youtube.com/watch?v=x41yOUIvK2k', + 'info_dict': { + 'id': 'x41yOUIvK2k', + 'ext': 'mp4', + 'title': 'IMG 3456', + 'description': '', + 'upload_date': '20170613', + 'view_count': int, + 'thumbnail': 'https://i.ytimg.com/vi_webp/x41yOUIvK2k/maxresdefault.webp', + 'like_count': int, + 'channel_id': 'UCo03ZQPBW5U4UC3regpt1nw', + 'tags': [], + 'channel_url': 'https://www.youtube.com/channel/UCo03ZQPBW5U4UC3regpt1nw', + 'availability': 'public', + 'age_limit': 0, + 'categories': ['Pets & Animals'], + 'duration': 7, + 'playable_in_embed': True, + 'live_status': 'not_live', + 'channel': 'l\'Or Vert asbl', + 'channel_follower_count': int, + 'uploader': 'l\'Or Vert asbl', + 'uploader_url': 'https://www.youtube.com/@ElevageOrVert', + 'uploader_id': '@ElevageOrVert', + }, + 'params': { + 'skip_download': True, + }, + }, + { + # with '};' inside yt initial data (see [1]) + # see [2] for an example with '};' inside ytInitialPlayerResponse + # 1. https://github.com/ytdl-org/youtube-dl/issues/27093 + # 2. https://github.com/ytdl-org/youtube-dl/issues/27216 + 'url': 'https://www.youtube.com/watch?v=CHqg6qOn4no', + 'info_dict': { + 'id': 'CHqg6qOn4no', + 'ext': 'mp4', + 'title': 'Part 77 Sort a list of simple types in c#', + 'description': 'md5:b8746fa52e10cdbf47997903f13b20dc', + 'upload_date': '20130831', + 'channel_id': 'UCCTVrRB5KpIiK6V2GGVsR1Q', + 'like_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCCTVrRB5KpIiK6V2GGVsR1Q', + 'live_status': 'not_live', + 'categories': ['Education'], + 'availability': 'public', + 'thumbnail': 'https://i.ytimg.com/vi/CHqg6qOn4no/sddefault.jpg', + 'tags': 'count:12', + 'playable_in_embed': True, + 'age_limit': 0, + 'view_count': int, + 'duration': 522, + 'channel': 'kudvenkat', + 'comment_count': int, + 'channel_follower_count': int, + 'chapters': list, + 'uploader': 'kudvenkat', + 'uploader_url': 'https://www.youtube.com/@Csharp-video-tutorialsBlogspot', + 'uploader_id': '@Csharp-video-tutorialsBlogspot', + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'params': { + 'skip_download': True, + }, + }, + { + # another example of '};' in ytInitialData + 'url': 'https://www.youtube.com/watch?v=gVfgbahppCY', + 'only_matching': True, + }, + { + 'url': 'https://www.youtube.com/watch_popup?v=63RmMXCd_bQ', + 'only_matching': True, + }, + { + # https://github.com/ytdl-org/youtube-dl/pull/28094 + 'url': 'OtqTfy26tG0', + 'info_dict': { + 'id': 'OtqTfy26tG0', + 'ext': 'mp4', + 'title': 'Burn Out', + 'description': 'md5:8d07b84dcbcbfb34bc12a56d968b6131', + 'upload_date': '20141120', + 'artist': 'The Cinematic Orchestra', + 'track': 'Burn Out', + 'album': 'Every Day', + 'like_count': int, + 'live_status': 'not_live', + 'alt_title': 'Burn Out', + 'duration': 614, + 'age_limit': 0, + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCIzsJBIyo8hhpFm1NK0uLgw', + 'creator': 'The Cinematic Orchestra', + 'channel': 'The Cinematic Orchestra', + 'tags': ['The Cinematic Orchestra', 'Every Day', 'Burn Out'], + 'channel_id': 'UCIzsJBIyo8hhpFm1NK0uLgw', + 'availability': 'public', + 'thumbnail': 'https://i.ytimg.com/vi/OtqTfy26tG0/maxresdefault.jpg', + 'categories': ['Music'], + 'playable_in_embed': True, + 'channel_follower_count': int, + 'uploader': 'The Cinematic Orchestra', + 'comment_count': int, + }, + 'params': { + 'skip_download': True, + }, + }, + { + # controversial video, only works with bpctr when authenticated with cookies + 'url': 'https://www.youtube.com/watch?v=nGC3D_FkCmg', + 'only_matching': True, + }, + { + # controversial video, requires bpctr/contentCheckOk + 'url': 'https://www.youtube.com/watch?v=SZJvDhaSDnc', + 'info_dict': { + 'id': 'SZJvDhaSDnc', + 'ext': 'mp4', + 'title': 'San Diego teen commits suicide after bullying over embarrassing video', + 'channel_id': 'UC-SJ6nODDmufqBzPBwCvYvQ', + 'upload_date': '20140716', + 'description': 'md5:acde3a73d3f133fc97e837a9f76b53b7', + 'duration': 170, + 'categories': ['News & Politics'], + 'view_count': int, + 'channel': 'CBS Mornings', + 'tags': ['suicide', 'bullying', 'video', 'cbs', 'news'], + 'thumbnail': 'https://i.ytimg.com/vi/SZJvDhaSDnc/hqdefault.jpg', + 'age_limit': 18, + 'availability': 'needs_auth', + 'channel_url': 'https://www.youtube.com/channel/UC-SJ6nODDmufqBzPBwCvYvQ', + 'like_count': int, + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel_follower_count': int, + 'uploader': 'CBS Mornings', + 'uploader_url': 'https://www.youtube.com/@CBSMornings', + 'uploader_id': '@CBSMornings', + 'comment_count': int, + 'channel_is_verified': True, + } + }, + { + # restricted location, https://github.com/ytdl-org/youtube-dl/issues/28685 + 'url': 'cBvYw8_A0vQ', + 'info_dict': { + 'id': 'cBvYw8_A0vQ', + 'ext': 'mp4', + 'title': '4K Ueno Okachimachi Street Scenes 上野御徒町歩ã', + 'description': 'md5:ea770e474b7cd6722b4c95b833c03630', + 'upload_date': '20201120', + 'duration': 1456, + 'categories': ['Travel & Events'], + 'channel_id': 'UC3o_t8PzBmXf5S9b7GLx1Mw', + 'view_count': int, + 'channel': 'Walk around Japan', + 'tags': ['Ueno Tokyo', 'Okachimachi Tokyo', 'Ameyoko Street', 'Tokyo attraction', 'Travel in Tokyo'], + 'thumbnail': 'https://i.ytimg.com/vi_webp/cBvYw8_A0vQ/hqdefault.webp', + 'age_limit': 0, + 'availability': 'public', + 'channel_url': 'https://www.youtube.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mw', + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel_follower_count': int, + 'uploader': 'Walk around Japan', + 'uploader_url': 'https://www.youtube.com/@walkaroundjapan7124', + 'uploader_id': '@walkaroundjapan7124', + }, + 'params': { + 'skip_download': True, + }, + }, { + # Has multiple audio streams + 'url': 'WaOKSUlf4TM', + 'only_matching': True + }, { + # Requires Premium: has format 141 when requested using YTM url + 'url': 'https://music.youtube.com/watch?v=XclachpHxis', + 'only_matching': True + }, { + # multiple subtitles with same lang_code + 'url': 'https://www.youtube.com/watch?v=wsQiKKfKxug', + 'only_matching': True, + }, { + # Force use android client fallback + 'url': 'https://www.youtube.com/watch?v=YOelRv7fMxY', + 'info_dict': { + 'id': 'YOelRv7fMxY', + 'title': 'DIGGING A SECRET TUNNEL Part 1', + 'ext': '3gp', + 'upload_date': '20210624', + 'channel_id': 'UCp68_FLety0O-n9QU6phsgw', + 'channel_url': r're:https?://(?:www\.)?youtube\.com/channel/UCp68_FLety0O-n9QU6phsgw', + 'description': 'md5:5d5991195d599b56cd0c4148907eec50', + 'duration': 596, + 'categories': ['Entertainment'], + 'view_count': int, + 'channel': 'colinfurze', + 'tags': ['Colin', 'furze', 'Terry', 'tunnel', 'underground', 'bunker'], + 'thumbnail': 'https://i.ytimg.com/vi/YOelRv7fMxY/maxresdefault.jpg', + 'age_limit': 0, + 'availability': 'public', + 'like_count': int, + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel_follower_count': int, + 'chapters': list, + 'uploader': 'colinfurze', + 'uploader_url': 'https://www.youtube.com/@colinfurze', + 'uploader_id': '@colinfurze', + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'params': { + 'format': '17', # 3gp format available on android + 'extractor_args': {'youtube': {'player_client': ['android']}}, + }, + }, + { + # Skip download of additional client configs (remix client config in this case) + 'url': 'https://music.youtube.com/watch?v=MgNrAu2pzNs', + 'only_matching': True, + 'params': { + 'extractor_args': {'youtube': {'player_skip': ['configs']}}, + }, + }, { + # shorts + 'url': 'https://www.youtube.com/shorts/BGQWPY4IigY', + 'only_matching': True, + }, { + 'note': 'Storyboards', + 'url': 'https://www.youtube.com/watch?v=5KLPxDtMqe8', + 'info_dict': { + 'id': '5KLPxDtMqe8', + 'ext': 'mhtml', + 'format_id': 'sb0', + 'title': 'Your Brain is Plastic', + 'description': 'md5:89cd86034bdb5466cd87c6ba206cd2bc', + 'upload_date': '20140324', + 'like_count': int, + 'channel_id': 'UCZYTClx2T1of7BRZ86-8fow', + 'channel_url': 'https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fow', + 'view_count': int, + 'thumbnail': 'https://i.ytimg.com/vi/5KLPxDtMqe8/maxresdefault.jpg', + 'playable_in_embed': True, + 'tags': 'count:12', + 'availability': 'public', + 'channel': 'SciShow', + 'live_status': 'not_live', + 'duration': 248, + 'categories': ['Education'], + 'age_limit': 0, + 'channel_follower_count': int, + 'chapters': list, + 'uploader': 'SciShow', + 'uploader_url': 'https://www.youtube.com/@SciShow', + 'uploader_id': '@SciShow', + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, 'params': {'format': 'mhtml', 'skip_download': True} + }, { + # Ensure video upload_date is in UTC timezone (video was uploaded 1641170939) + 'url': 'https://www.youtube.com/watch?v=2NUZ8W2llS4', + 'info_dict': { + 'id': '2NUZ8W2llS4', + 'ext': 'mp4', + 'title': 'The NP that test your phone performance 🙂', + 'description': 'md5:144494b24d4f9dfacb97c1bbef5de84d', + 'channel_id': 'UCRqNBSOHgilHfAczlUmlWHA', + 'channel_url': 'https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHA', + 'duration': 21, + 'view_count': int, + 'age_limit': 0, + 'categories': ['Gaming'], + 'tags': 'count:23', + 'playable_in_embed': True, + 'live_status': 'not_live', + 'upload_date': '20220103', + 'like_count': int, + 'availability': 'public', + 'channel': 'Leon Nguyen', + 'thumbnail': 'https://i.ytimg.com/vi_webp/2NUZ8W2llS4/maxresdefault.webp', + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'Leon Nguyen', + 'uploader_url': 'https://www.youtube.com/@LeonNguyen', + 'uploader_id': '@LeonNguyen', + 'heatmap': 'count:100', + } + }, { + # Same video as above, but with --compat-opt no-youtube-prefer-utc-upload-date + 'url': 'https://www.youtube.com/watch?v=2NUZ8W2llS4', + 'info_dict': { + 'id': '2NUZ8W2llS4', + 'ext': 'mp4', + 'title': 'The NP that test your phone performance 🙂', + 'description': 'md5:144494b24d4f9dfacb97c1bbef5de84d', + 'channel_id': 'UCRqNBSOHgilHfAczlUmlWHA', + 'channel_url': 'https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHA', + 'duration': 21, + 'view_count': int, + 'age_limit': 0, + 'categories': ['Gaming'], + 'tags': 'count:23', + 'playable_in_embed': True, + 'live_status': 'not_live', + 'upload_date': '20220102', + 'like_count': int, + 'availability': 'public', + 'channel': 'Leon Nguyen', + 'thumbnail': 'https://i.ytimg.com/vi_webp/2NUZ8W2llS4/maxresdefault.webp', + 'comment_count': int, + 'channel_follower_count': int, + 'uploader': 'Leon Nguyen', + 'uploader_url': 'https://www.youtube.com/@LeonNguyen', + 'uploader_id': '@LeonNguyen', + 'heatmap': 'count:100', + }, + 'params': {'compat_opts': ['no-youtube-prefer-utc-upload-date']} + }, { + # date text is premiered video, ensure upload date in UTC (published 1641172509) + 'url': 'https://www.youtube.com/watch?v=mzZzzBU6lrM', + 'info_dict': { + 'id': 'mzZzzBU6lrM', + 'ext': 'mp4', + 'title': 'I Met GeorgeNotFound In Real Life...', + 'description': 'md5:978296ec9783a031738b684d4ebf302d', + 'channel_id': 'UC_8NknAFiyhOUaZqHR3lq3Q', + 'channel_url': 'https://www.youtube.com/channel/UC_8NknAFiyhOUaZqHR3lq3Q', + 'duration': 955, + 'view_count': int, + 'age_limit': 0, + 'categories': ['Entertainment'], + 'tags': 'count:26', + 'playable_in_embed': True, + 'live_status': 'not_live', + 'release_timestamp': 1641172509, + 'release_date': '20220103', + 'upload_date': '20220103', + 'like_count': int, + 'availability': 'public', + 'channel': 'Quackity', + 'thumbnail': 'https://i.ytimg.com/vi/mzZzzBU6lrM/maxresdefault.jpg', + 'channel_follower_count': int, + 'uploader': 'Quackity', + 'uploader_id': '@Quackity', + 'uploader_url': 'https://www.youtube.com/@Quackity', + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + } + }, + { # continuous livestream. Microformat upload date should be preferred. + # Upload date was 2021-06-19 (not UTC), while stream start is 2021-11-27 + 'url': 'https://www.youtube.com/watch?v=kgx4WGK0oNU', + 'info_dict': { + 'id': 'kgx4WGK0oNU', + 'title': r're:jazz\/lofi hip hop radio🌱chill beats to relax\/study to \[LIVE 24\/7\] \d{4}-\d{2}-\d{2} \d{2}:\d{2}', + 'ext': 'mp4', + 'channel_id': 'UC84whx2xxsiA1gXHXXqKGOA', + 'availability': 'public', + 'age_limit': 0, + 'release_timestamp': 1637975704, + 'upload_date': '20210619', + 'channel_url': 'https://www.youtube.com/channel/UC84whx2xxsiA1gXHXXqKGOA', + 'live_status': 'is_live', + 'thumbnail': 'https://i.ytimg.com/vi/kgx4WGK0oNU/maxresdefault.jpg', + 'channel': 'Abao in Tokyo', + 'channel_follower_count': int, + 'release_date': '20211127', + 'tags': 'count:39', + 'categories': ['People & Blogs'], + 'like_count': int, + 'view_count': int, + 'playable_in_embed': True, + 'description': 'md5:2ef1d002cad520f65825346e2084e49d', + 'concurrent_view_count': int, + 'uploader': 'Abao in Tokyo', + 'uploader_url': 'https://www.youtube.com/@abaointokyo', + 'uploader_id': '@abaointokyo', + }, + 'params': {'skip_download': True} + }, { + 'url': 'https://www.youtube.com/watch?v=tjjjtzRLHvA', + 'info_dict': { + 'id': 'tjjjtzRLHvA', + 'ext': 'mp4', + 'title': 'ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚°ç„¡ã— };if window.ytcsi', + 'upload_date': '20220323', + 'like_count': int, + 'availability': 'unlisted', + 'channel': 'Lesmiscore', + 'thumbnail': r're:^https?://.*\.jpg', + 'age_limit': 0, + 'categories': ['Music'], + 'view_count': int, + 'description': '', + 'channel_url': 'https://www.youtube.com/channel/UCdqltm_7iv1Vs6kp6Syke5A', + 'channel_id': 'UCdqltm_7iv1Vs6kp6Syke5A', + 'live_status': 'not_live', + 'playable_in_embed': True, + 'channel_follower_count': int, + 'duration': 6, + 'tags': [], + 'uploader_id': '@lesmiscore', + 'uploader': 'Lesmiscore', + 'uploader_url': 'https://www.youtube.com/@lesmiscore', + } + }, { + # Prefer primary title+description language metadata by default + # Do not prefer translated description if primary is empty + 'url': 'https://www.youtube.com/watch?v=el3E4MbxRqQ', + 'info_dict': { + 'id': 'el3E4MbxRqQ', + 'ext': 'mp4', + 'title': 'dlp test video 2 - primary sv no desc', + 'description': '', + 'channel': 'cole-dlp-test-acc', + 'tags': [], + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'like_count': int, + 'playable_in_embed': True, + 'availability': 'unlisted', + 'thumbnail': r're:^https?://.*\.jpg', + 'age_limit': 0, + 'duration': 5, + 'live_status': 'not_live', + 'upload_date': '20220908', + 'categories': ['People & Blogs'], + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'params': {'skip_download': True} + }, { + # Extractor argument: prefer translated title+description + 'url': 'https://www.youtube.com/watch?v=gHKT4uU8Zng', + 'info_dict': { + 'id': 'gHKT4uU8Zng', + 'ext': 'mp4', + 'channel': 'cole-dlp-test-acc', + 'tags': [], + 'duration': 5, + 'live_status': 'not_live', + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'upload_date': '20220728', + 'view_count': int, + 'categories': ['People & Blogs'], + 'thumbnail': r're:^https?://.*\.jpg', + 'title': 'dlp test video title translated (fr)', + 'availability': 'public', + 'age_limit': 0, + 'description': 'dlp test video description translated (fr)', + 'playable_in_embed': True, + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'params': {'skip_download': True, 'extractor_args': {'youtube': {'lang': ['fr']}}}, + 'expected_warnings': [r'Preferring "fr" translated fields'], + }, { + 'note': '6 channel audio', + 'url': 'https://www.youtube.com/watch?v=zgdo7-RRjgo', + 'only_matching': True, + }, { + 'note': 'Multiple HLS formats with same itag', + 'url': 'https://www.youtube.com/watch?v=kX3nB4PpJko', + 'info_dict': { + 'id': 'kX3nB4PpJko', + 'ext': 'mp4', + 'categories': ['Entertainment'], + 'description': 'md5:e8031ff6e426cdb6a77670c9b81f6fa6', + 'live_status': 'not_live', + 'duration': 937, + 'channel_follower_count': int, + 'thumbnail': 'https://i.ytimg.com/vi_webp/kX3nB4PpJko/maxresdefault.webp', + 'title': 'Last To Take Hand Off Jet, Keeps It!', + 'channel': 'MrBeast', + 'playable_in_embed': True, + 'view_count': int, + 'upload_date': '20221112', + 'channel_url': 'https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA', + 'age_limit': 0, + 'availability': 'public', + 'channel_id': 'UCX6OQ3DkcsbYNE6H8uQQuVA', + 'like_count': int, + 'tags': [], + 'uploader': 'MrBeast', + 'uploader_url': 'https://www.youtube.com/@MrBeast', + 'uploader_id': '@MrBeast', + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'params': {'extractor_args': {'youtube': {'player_client': ['ios']}}, 'format': '233-1'}, + }, { + 'note': 'Audio formats with Dynamic Range Compression', + 'url': 'https://www.youtube.com/watch?v=Tq92D6wQ1mg', + 'info_dict': { + 'id': 'Tq92D6wQ1mg', + 'ext': 'webm', + 'title': '[MMD] Adios - EVERGLOW [+Motion DL]', + 'channel_url': 'https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQ', + 'channel_id': 'UC1yoRdFoFJaCY-AGfD9W0wQ', + 'channel_follower_count': int, + 'description': 'md5:17eccca93a786d51bc67646756894066', + 'upload_date': '20191228', + 'tags': ['mmd', 'dance', 'mikumikudance', 'kpop', 'vtuber'], + 'playable_in_embed': True, + 'like_count': int, + 'categories': ['Entertainment'], + 'thumbnail': 'https://i.ytimg.com/vi/Tq92D6wQ1mg/sddefault.jpg', + 'age_limit': 18, + 'channel': 'Projekt Melody', + 'view_count': int, + 'availability': 'needs_auth', + 'comment_count': int, + 'live_status': 'not_live', + 'duration': 106, + 'uploader': 'Projekt Melody', + 'uploader_id': '@ProjektMelody', + 'uploader_url': 'https://www.youtube.com/@ProjektMelody', + }, + 'params': {'extractor_args': {'youtube': {'player_client': ['tv_embedded']}}, 'format': '251-drc'}, + }, + { + 'url': 'https://www.youtube.com/live/qVv6vCqciTM', + 'info_dict': { + 'id': 'qVv6vCqciTM', + 'ext': 'mp4', + 'age_limit': 0, + 'comment_count': int, + 'chapters': 'count:13', + 'upload_date': '20221223', + 'thumbnail': 'https://i.ytimg.com/vi/qVv6vCqciTM/maxresdefault.jpg', + 'channel_url': 'https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtA', + 'like_count': int, + 'release_date': '20221223', + 'tags': ['Vtuber', '月ノ美兎', 'åå–ã•ãª', 'ã«ã˜ã•ã‚“ã˜', 'クリスマス', '3Dé…ä¿¡'], + 'title': '〠#インターãƒãƒƒãƒˆå¥³ã‚¯ãƒªã‚¹ãƒžã‚¹ 】3Dã§æ­Œã£ã¦ã¯ã—ゃãインターãƒãƒƒãƒˆã®å¥³ãŸã¡ã€æœˆãƒŽç¾Žå…Ž/åå–ã•ãªã€‘', + 'view_count': int, + 'playable_in_embed': True, + 'duration': 4438, + 'availability': 'public', + 'channel_follower_count': int, + 'channel_id': 'UCIdEIHpS0TdkqRkHL5OkLtA', + 'categories': ['Entertainment'], + 'live_status': 'was_live', + 'release_timestamp': 1671793345, + 'channel': 'ã•ãªã¡ã‚ƒã‚“ã­ã‚‹', + 'description': 'md5:6aebf95cc4a1d731aebc01ad6cc9806d', + 'uploader': 'ã•ãªã¡ã‚ƒã‚“ã­ã‚‹', + 'uploader_url': 'https://www.youtube.com/@sana_natori', + 'uploader_id': '@sana_natori', + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + }, + { + # Fallbacks when webpage and web client is unavailable + 'url': 'https://www.youtube.com/watch?v=wSSmNUl9Snw', + 'info_dict': { + 'id': 'wSSmNUl9Snw', + 'ext': 'mp4', + # 'categories': ['Science & Technology'], + 'view_count': int, + 'chapters': 'count:2', + 'channel': 'Scott Manley', + 'like_count': int, + 'age_limit': 0, + # 'availability': 'public', + 'channel_follower_count': int, + 'live_status': 'not_live', + 'upload_date': '20170831', + 'duration': 682, + 'tags': 'count:8', + 'uploader_url': 'https://www.youtube.com/@scottmanley', + 'description': 'md5:f4bed7b200404b72a394c2f97b782c02', + 'uploader': 'Scott Manley', + 'uploader_id': '@scottmanley', + 'title': 'The Computer Hack That Saved Apollo 14', + 'channel_id': 'UCxzC4EngIsMrPmbm6Nxvb-A', + 'thumbnail': r're:^https?://.*\.webp', + 'channel_url': 'https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-A', + 'playable_in_embed': True, + 'comment_count': int, + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'params': { + 'extractor_args': {'youtube': {'player_client': ['android'], 'player_skip': ['webpage']}}, + }, + }, + ] + + _WEBPAGE_TESTS = [ + # YouTube <object> embed + { + 'url': 'http://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/', + 'md5': '873c81d308b979f0e23ee7e620b312a3', + 'info_dict': { + 'id': 'msN87y-iEx0', + 'ext': 'mp4', + 'title': 'Feynman: Mirrors FUN TO IMAGINE 6', + 'upload_date': '20080526', + 'description': 'md5:873c81d308b979f0e23ee7e620b312a3', + 'age_limit': 0, + 'tags': ['feynman', 'mirror', 'science', 'physics', 'imagination', 'fun', 'cool', 'puzzle'], + 'channel_id': 'UCCeo--lls1vna5YJABWAcVA', + 'playable_in_embed': True, + 'thumbnail': 'https://i.ytimg.com/vi/msN87y-iEx0/hqdefault.jpg', + 'like_count': int, + 'comment_count': int, + 'channel': 'Christopher Sykes', + 'live_status': 'not_live', + 'channel_url': 'https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA', + 'availability': 'public', + 'duration': 195, + 'view_count': int, + 'categories': ['Science & Technology'], + 'channel_follower_count': int, + 'uploader': 'Christopher Sykes', + 'uploader_url': 'https://www.youtube.com/@ChristopherSykesDocumentaries', + 'uploader_id': '@ChristopherSykesDocumentaries', + 'heatmap': 'count:100', + }, + 'params': { + 'skip_download': True, + } + }, + ] + + @classmethod + def suitable(cls, url): + from ..utils import parse_qs + + qs = parse_qs(url) + if qs.get('list', [None])[0]: + return False + return super().suitable(url) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._code_cache = {} + self._player_cache = {} + + def _prepare_live_from_start_formats(self, formats, video_id, live_start_time, url, webpage_url, smuggled_data, is_live): + lock = threading.Lock() + start_time = time.time() + formats = [f for f in formats if f.get('is_from_start')] + + def refetch_manifest(format_id, delay): + nonlocal formats, start_time, is_live + if time.time() <= start_time + delay: + return + + _, _, prs, player_url = self._download_player_responses(url, smuggled_data, video_id, webpage_url) + video_details = traverse_obj(prs, (..., 'videoDetails'), expected_type=dict) + microformats = traverse_obj( + prs, (..., 'microformat', 'playerMicroformatRenderer'), + expected_type=dict) + _, live_status, _, formats, _ = self._list_formats(video_id, microformats, video_details, prs, player_url) + is_live = live_status == 'is_live' + start_time = time.time() + + def mpd_feed(format_id, delay): + """ + @returns (manifest_url, manifest_stream_number, is_live) or None + """ + for retry in self.RetryManager(fatal=False): + with lock: + refetch_manifest(format_id, delay) + + f = next((f for f in formats if f['format_id'] == format_id), None) + if not f: + if not is_live: + retry.error = f'{video_id}: Video is no longer live' + else: + retry.error = f'Cannot find refreshed manifest for format {format_id}{bug_reports_message()}' + continue + return f['manifest_url'], f['manifest_stream_number'], is_live + return None + + for f in formats: + f['is_live'] = is_live + gen = functools.partial(self._live_dash_fragments, video_id, f['format_id'], + live_start_time, mpd_feed, not is_live and f.copy()) + if is_live: + f['fragments'] = gen + f['protocol'] = 'http_dash_segments_generator' + else: + f['fragments'] = LazyList(gen({})) + del f['is_from_start'] + + def _live_dash_fragments(self, video_id, format_id, live_start_time, mpd_feed, manifestless_orig_fmt, ctx): + FETCH_SPAN, MAX_DURATION = 5, 432000 + + mpd_url, stream_number, is_live = None, None, True + + begin_index = 0 + download_start_time = ctx.get('start') or time.time() + + lack_early_segments = download_start_time - (live_start_time or download_start_time) > MAX_DURATION + if lack_early_segments: + self.report_warning(bug_reports_message( + 'Starting download from the last 120 hours of the live stream since ' + 'YouTube does not have data before that. If you think this is wrong,'), only_once=True) + lack_early_segments = True + + known_idx, no_fragment_score, last_segment_url = begin_index, 0, None + fragments, fragment_base_url = None, None + + def _extract_sequence_from_mpd(refresh_sequence, immediate): + nonlocal mpd_url, stream_number, is_live, no_fragment_score, fragments, fragment_base_url + # Obtain from MPD's maximum seq value + old_mpd_url = mpd_url + last_error = ctx.pop('last_error', None) + expire_fast = immediate or last_error and isinstance(last_error, HTTPError) and last_error.status == 403 + mpd_url, stream_number, is_live = (mpd_feed(format_id, 5 if expire_fast else 18000) + or (mpd_url, stream_number, False)) + if not refresh_sequence: + if expire_fast and not is_live: + return False, last_seq + elif old_mpd_url == mpd_url: + return True, last_seq + if manifestless_orig_fmt: + fmt_info = manifestless_orig_fmt + else: + try: + fmts, _ = self._extract_mpd_formats_and_subtitles( + mpd_url, None, note=False, errnote=False, fatal=False) + except ExtractorError: + fmts = None + if not fmts: + no_fragment_score += 2 + return False, last_seq + fmt_info = next(x for x in fmts if x['manifest_stream_number'] == stream_number) + fragments = fmt_info['fragments'] + fragment_base_url = fmt_info['fragment_base_url'] + assert fragment_base_url + + _last_seq = int(re.search(r'(?:/|^)sq/(\d+)', fragments[-1]['path']).group(1)) + return True, _last_seq + + self.write_debug(f'[{video_id}] Generating fragments for format {format_id}') + while is_live: + fetch_time = time.time() + if no_fragment_score > 30: + return + if last_segment_url: + # Obtain from "X-Head-Seqnum" header value from each segment + try: + urlh = self._request_webpage( + last_segment_url, None, note=False, errnote=False, fatal=False) + except ExtractorError: + urlh = None + last_seq = try_get(urlh, lambda x: int_or_none(x.headers['X-Head-Seqnum'])) + if last_seq is None: + no_fragment_score += 2 + last_segment_url = None + continue + else: + should_continue, last_seq = _extract_sequence_from_mpd(True, no_fragment_score > 15) + no_fragment_score += 2 + if not should_continue: + continue + + if known_idx > last_seq: + last_segment_url = None + continue + + last_seq += 1 + + if begin_index < 0 and known_idx < 0: + # skip from the start when it's negative value + known_idx = last_seq + begin_index + if lack_early_segments: + known_idx = max(known_idx, last_seq - int(MAX_DURATION // fragments[-1]['duration'])) + try: + for idx in range(known_idx, last_seq): + # do not update sequence here or you'll get skipped some part of it + should_continue, _ = _extract_sequence_from_mpd(False, False) + if not should_continue: + known_idx = idx - 1 + raise ExtractorError('breaking out of outer loop') + last_segment_url = urljoin(fragment_base_url, 'sq/%d' % idx) + yield { + 'url': last_segment_url, + 'fragment_count': last_seq, + } + if known_idx == last_seq: + no_fragment_score += 5 + else: + no_fragment_score = 0 + known_idx = last_seq + except ExtractorError: + continue + + if manifestless_orig_fmt: + # Stop at the first iteration if running for post-live manifestless; + # fragment count no longer increase since it starts + break + + time.sleep(max(0, FETCH_SPAN + fetch_time - time.time())) + + def _extract_player_url(self, *ytcfgs, webpage=None): + player_url = traverse_obj( + ytcfgs, (..., 'PLAYER_JS_URL'), (..., 'WEB_PLAYER_CONTEXT_CONFIGS', ..., 'jsUrl'), + get_all=False, expected_type=str) + if not player_url: + return + return urljoin('https://www.youtube.com', player_url) + + def _download_player_url(self, video_id, fatal=False): + res = self._download_webpage( + 'https://www.youtube.com/iframe_api', + note='Downloading iframe API JS', video_id=video_id, fatal=fatal) + if res: + player_version = self._search_regex( + r'player\\?/([0-9a-fA-F]{8})\\?/', res, 'player version', fatal=fatal) + if player_version: + return f'https://www.youtube.com/s/player/{player_version}/player_ias.vflset/en_US/base.js' + + def _signature_cache_id(self, example_sig): + """ Return a string representation of a signature """ + return '.'.join(str(len(part)) for part in example_sig.split('.')) + + @classmethod + def _extract_player_info(cls, player_url): + for player_re in cls._PLAYER_INFO_RE: + id_m = re.search(player_re, player_url) + if id_m: + break + else: + raise ExtractorError('Cannot identify player %r' % player_url) + return id_m.group('id') + + def _load_player(self, video_id, player_url, fatal=True): + player_id = self._extract_player_info(player_url) + if player_id not in self._code_cache: + code = self._download_webpage( + player_url, video_id, fatal=fatal, + note='Downloading player ' + player_id, + errnote='Download of %s failed' % player_url) + if code: + self._code_cache[player_id] = code + return self._code_cache.get(player_id) + + def _extract_signature_function(self, video_id, player_url, example_sig): + player_id = self._extract_player_info(player_url) + + # Read from filesystem cache + func_id = f'js_{player_id}_{self._signature_cache_id(example_sig)}' + assert os.path.basename(func_id) == func_id + + self.write_debug(f'Extracting signature function {func_id}') + cache_spec, code = self.cache.load('youtube-sigfuncs', func_id), None + + if not cache_spec: + code = self._load_player(video_id, player_url) + if code: + res = self._parse_sig_js(code) + test_string = ''.join(map(chr, range(len(example_sig)))) + cache_spec = [ord(c) for c in res(test_string)] + self.cache.store('youtube-sigfuncs', func_id, cache_spec) + + return lambda s: ''.join(s[i] for i in cache_spec) + + def _print_sig_code(self, func, example_sig): + if not self.get_param('youtube_print_sig_code'): + return + + def gen_sig_code(idxs): + def _genslice(start, end, step): + starts = '' if start == 0 else str(start) + ends = (':%d' % (end + step)) if end + step >= 0 else ':' + steps = '' if step == 1 else (':%d' % step) + return f's[{starts}{ends}{steps}]' + + step = None + # Quelch pyflakes warnings - start will be set when step is set + start = '(Never used)' + for i, prev in zip(idxs[1:], idxs[:-1]): + if step is not None: + if i - prev == step: + continue + yield _genslice(start, prev, step) + step = None + continue + if i - prev in [-1, 1]: + step = i - prev + start = prev + continue + else: + yield 's[%d]' % prev + if step is None: + yield 's[%d]' % i + else: + yield _genslice(start, i, step) + + test_string = ''.join(map(chr, range(len(example_sig)))) + cache_res = func(test_string) + cache_spec = [ord(c) for c in cache_res] + expr_code = ' + '.join(gen_sig_code(cache_spec)) + signature_id_tuple = '(%s)' % ( + ', '.join(str(len(p)) for p in example_sig.split('.'))) + code = ('if tuple(len(p) for p in s.split(\'.\')) == %s:\n' + ' return %s\n') % (signature_id_tuple, expr_code) + self.to_screen('Extracted signature function:\n' + code) + + def _parse_sig_js(self, jscode): + funcname = self._search_regex( + (r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\bm=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)', + r'\bc&&\(c=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)', + r'(?:\b|[^a-zA-Z0-9$])(?P<sig>[a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)(?:;[a-zA-Z0-9$]{2}\.[a-zA-Z0-9$]{2}\(a,\d+\))?', + r'(?P<sig>[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)', + # Obsolete patterns + r'("|\')signature\1\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(', + r'yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(', + r'\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\('), + jscode, 'Initial JS player signature function name', group='sig') + + jsi = JSInterpreter(jscode) + initial_function = jsi.extract_function(funcname) + return lambda s: initial_function([s]) + + def _cached(self, func, *cache_id): + def inner(*args, **kwargs): + if cache_id not in self._player_cache: + try: + self._player_cache[cache_id] = func(*args, **kwargs) + except ExtractorError as e: + self._player_cache[cache_id] = e + except Exception as e: + self._player_cache[cache_id] = ExtractorError(traceback.format_exc(), cause=e) + + ret = self._player_cache[cache_id] + if isinstance(ret, Exception): + raise ret + return ret + return inner + + def _decrypt_signature(self, s, video_id, player_url): + """Turn the encrypted s field into a working signature""" + extract_sig = self._cached( + self._extract_signature_function, 'sig', player_url, self._signature_cache_id(s)) + func = extract_sig(video_id, player_url, s) + self._print_sig_code(func, s) + return func(s) + + def _decrypt_nsig(self, s, video_id, player_url): + """Turn the encrypted n field into a working signature""" + if player_url is None: + raise ExtractorError('Cannot decrypt nsig without player_url') + player_url = urljoin('https://www.youtube.com', player_url) + + try: + jsi, player_id, func_code = self._extract_n_function_code(video_id, player_url) + except ExtractorError as e: + raise ExtractorError('Unable to extract nsig function code', cause=e) + if self.get_param('youtube_print_sig_code'): + self.to_screen(f'Extracted nsig function from {player_id}:\n{func_code[1]}\n') + + try: + extract_nsig = self._cached(self._extract_n_function_from_code, 'nsig func', player_url) + ret = extract_nsig(jsi, func_code)(s) + except JSInterpreter.Exception as e: + try: + jsi = PhantomJSwrapper(self, timeout=5000) + except ExtractorError: + raise e + self.report_warning( + f'Native nsig extraction failed: Trying with PhantomJS\n' + f' n = {s} ; player = {player_url}', video_id) + self.write_debug(e, only_once=True) + + args, func_body = func_code + ret = jsi.execute( + f'console.log(function({", ".join(args)}) {{ {func_body} }}({s!r}));', + video_id=video_id, note='Executing signature code').strip() + + self.write_debug(f'Decrypted nsig {s} => {ret}') + return ret + + def _extract_n_function_name(self, jscode): + funcname, idx = self._search_regex( + r'\.get\("n"\)\)&&\(b=(?P<nfunc>[a-zA-Z0-9$]+)(?:\[(?P<idx>\d+)\])?\([a-zA-Z0-9]\)', + jscode, 'Initial JS player n function name', group=('nfunc', 'idx')) + if not idx: + return funcname + + return json.loads(js_to_json(self._search_regex( + rf'var {re.escape(funcname)}\s*=\s*(\[.+?\])\s*[,;]', jscode, + f'Initial JS player n function list ({funcname}.{idx})')))[int(idx)] + + def _extract_n_function_code(self, video_id, player_url): + player_id = self._extract_player_info(player_url) + func_code = self.cache.load('youtube-nsig', player_id, min_ver='2022.09.1') + jscode = func_code or self._load_player(video_id, player_url) + jsi = JSInterpreter(jscode) + + if func_code: + return jsi, player_id, func_code + + func_name = self._extract_n_function_name(jscode) + + # For redundancy + func_code = self._search_regex( + r'''(?xs)%s\s*=\s*function\s*\((?P<var>[\w$]+)\)\s* + # NB: The end of the regex is intentionally kept strict + {(?P<code>.+?}\s*return\ [\w$]+.join\(""\))};''' % func_name, + jscode, 'nsig function', group=('var', 'code'), default=None) + if func_code: + func_code = ([func_code[0]], func_code[1]) + else: + self.write_debug('Extracting nsig function with jsinterp') + func_code = jsi.extract_function_code(func_name) + + self.cache.store('youtube-nsig', player_id, func_code) + return jsi, player_id, func_code + + def _extract_n_function_from_code(self, jsi, func_code): + func = jsi.extract_function_from_code(*func_code) + + def extract_nsig(s): + try: + ret = func([s]) + except JSInterpreter.Exception: + raise + except Exception as e: + raise JSInterpreter.Exception(traceback.format_exc(), cause=e) + + if ret.startswith('enhanced_except_'): + raise JSInterpreter.Exception('Signature function returned an exception') + return ret + + return extract_nsig + + def _extract_signature_timestamp(self, video_id, player_url, ytcfg=None, fatal=False): + """ + Extract signatureTimestamp (sts) + Required to tell API what sig/player version is in use. + """ + sts = None + if isinstance(ytcfg, dict): + sts = int_or_none(ytcfg.get('STS')) + + if not sts: + # Attempt to extract from player + if player_url is None: + error_msg = 'Cannot extract signature timestamp without player_url.' + if fatal: + raise ExtractorError(error_msg) + self.report_warning(error_msg) + return + code = self._load_player(video_id, player_url, fatal=fatal) + if code: + sts = int_or_none(self._search_regex( + r'(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})', code, + 'JS player signature timestamp', group='sts', fatal=fatal)) + return sts + + def _mark_watched(self, video_id, player_responses): + for is_full, key in enumerate(('videostatsPlaybackUrl', 'videostatsWatchtimeUrl')): + label = 'fully ' if is_full else '' + url = get_first(player_responses, ('playbackTracking', key, 'baseUrl'), + expected_type=url_or_none) + if not url: + self.report_warning(f'Unable to mark {label}watched') + return + parsed_url = urllib.parse.urlparse(url) + qs = urllib.parse.parse_qs(parsed_url.query) + + # cpn generation algorithm is reverse engineered from base.js. + # In fact it works even with dummy cpn. + CPN_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_' + cpn = ''.join(CPN_ALPHABET[random.randint(0, 256) & 63] for _ in range(0, 16)) + + # # more consistent results setting it to right before the end + video_length = [str(float((qs.get('len') or ['1.5'])[0]) - 1)] + + qs.update({ + 'ver': ['2'], + 'cpn': [cpn], + 'cmt': video_length, + 'el': 'detailpage', # otherwise defaults to "shorts" + }) + + if is_full: + # these seem to mark watchtime "history" in the real world + # they're required, so send in a single value + qs.update({ + 'st': 0, + 'et': video_length, + }) + + url = urllib.parse.urlunparse( + parsed_url._replace(query=urllib.parse.urlencode(qs, True))) + + self._download_webpage( + url, video_id, f'Marking {label}watched', + 'Unable to mark watched', fatal=False) + + @classmethod + def _extract_from_webpage(cls, url, webpage): + # Invidious Instances + # https://github.com/yt-dlp/yt-dlp/issues/195 + # https://github.com/iv-org/invidious/pull/1730 + mobj = re.search( + r'<link rel="alternate" href="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"', + webpage) + if mobj: + yield cls.url_result(mobj.group('url'), cls) + raise cls.StopExtraction() + + yield from super()._extract_from_webpage(url, webpage) + + # lazyYT YouTube embed + for id_ in re.findall(r'class="lazyYT" data-youtube-id="([^"]+)"', webpage): + yield cls.url_result(unescapeHTML(id_), cls, id_) + + # Wordpress "YouTube Video Importer" plugin + for m in re.findall(r'''(?x)<div[^>]+ + class=(?P<q1>[\'"])[^\'"]*\byvii_single_video_player\b[^\'"]*(?P=q1)[^>]+ + data-video_id=(?P<q2>[\'"])([^\'"]+)(?P=q2)''', webpage): + yield cls.url_result(m[-1], cls, m[-1]) + + @classmethod + def extract_id(cls, url): + video_id = cls.get_temp_id(url) + if not video_id: + raise ExtractorError(f'Invalid URL: {url}') + return video_id + + def _extract_chapters_from_json(self, data, duration): + chapter_list = traverse_obj( + data, ( + 'playerOverlays', 'playerOverlayRenderer', 'decoratedPlayerBarRenderer', + 'decoratedPlayerBarRenderer', 'playerBar', 'chapteredPlayerBarRenderer', 'chapters' + ), expected_type=list) + + return self._extract_chapters_helper( + chapter_list, + start_function=lambda chapter: float_or_none( + traverse_obj(chapter, ('chapterRenderer', 'timeRangeStartMillis')), scale=1000), + title_function=lambda chapter: traverse_obj( + chapter, ('chapterRenderer', 'title', 'simpleText'), expected_type=str), + duration=duration) + + def _extract_chapters_from_engagement_panel(self, data, duration): + content_list = traverse_obj( + data, + ('engagementPanels', ..., 'engagementPanelSectionListRenderer', 'content', 'macroMarkersListRenderer', 'contents'), + expected_type=list) + chapter_time = lambda chapter: parse_duration(self._get_text(chapter, 'timeDescription')) + chapter_title = lambda chapter: self._get_text(chapter, 'title') + + return next(filter(None, ( + self._extract_chapters_helper(traverse_obj(contents, (..., 'macroMarkersListItemRenderer')), + chapter_time, chapter_title, duration) + for contents in content_list)), []) + + def _extract_heatmap(self, data): + return traverse_obj(data, ( + 'frameworkUpdates', 'entityBatchUpdate', 'mutations', + lambda _, v: v['payload']['macroMarkersListEntity']['markersList']['markerType'] == 'MARKER_TYPE_HEATMAP', + 'payload', 'macroMarkersListEntity', 'markersList', 'markers', ..., { + 'start_time': ('startMillis', {functools.partial(float_or_none, scale=1000)}), + 'end_time': {lambda x: (int(x['startMillis']) + int(x['durationMillis'])) / 1000}, + 'value': ('intensityScoreNormalized', {float_or_none}), + })) or None + + def _extract_comment(self, comment_renderer, parent=None): + comment_id = comment_renderer.get('commentId') + if not comment_id: + return + + info = { + 'id': comment_id, + 'text': self._get_text(comment_renderer, 'contentText'), + 'like_count': self._get_count(comment_renderer, 'voteCount'), + 'author_id': traverse_obj(comment_renderer, ('authorEndpoint', 'browseEndpoint', 'browseId', {self.ucid_or_none})), + 'author': self._get_text(comment_renderer, 'authorText'), + 'author_thumbnail': traverse_obj(comment_renderer, ('authorThumbnail', 'thumbnails', -1, 'url', {url_or_none})), + 'parent': parent or 'root', + } + + # Timestamp is an estimate calculated from the current time and time_text + time_text = self._get_text(comment_renderer, 'publishedTimeText') or '' + timestamp = self._parse_time_text(time_text) + + info.update({ + # FIXME: non-standard, but we need a way of showing that it is an estimate. + '_time_text': time_text, + 'timestamp': timestamp, + }) + + info['author_url'] = urljoin( + 'https://www.youtube.com', traverse_obj(comment_renderer, ('authorEndpoint', ( + ('browseEndpoint', 'canonicalBaseUrl'), ('commandMetadata', 'webCommandMetadata', 'url'))), + expected_type=str, get_all=False)) + + author_is_uploader = traverse_obj(comment_renderer, 'authorIsChannelOwner') + if author_is_uploader is not None: + info['author_is_uploader'] = author_is_uploader + + comment_abr = traverse_obj( + comment_renderer, ('actionButtons', 'commentActionButtonsRenderer'), expected_type=dict) + if comment_abr is not None: + info['is_favorited'] = 'creatorHeart' in comment_abr + + badges = self._extract_badges([traverse_obj(comment_renderer, 'authorCommentBadge')]) + if self._has_badge(badges, BadgeType.VERIFIED): + info['author_is_verified'] = True + + is_pinned = traverse_obj(comment_renderer, 'pinnedCommentBadge') + if is_pinned: + info['is_pinned'] = True + + return info + + def _comment_entries(self, root_continuation_data, ytcfg, video_id, parent=None, tracker=None): + + get_single_config_arg = lambda c: self._configuration_arg(c, [''])[0] + + def extract_header(contents): + _continuation = None + for content in contents: + comments_header_renderer = traverse_obj(content, 'commentsHeaderRenderer') + expected_comment_count = self._get_count( + comments_header_renderer, 'countText', 'commentsCount') + + if expected_comment_count is not None: + tracker['est_total'] = expected_comment_count + self.to_screen(f'Downloading ~{expected_comment_count} comments') + comment_sort_index = int(get_single_config_arg('comment_sort') != 'top') # 1 = new, 0 = top + + sort_menu_item = try_get( + comments_header_renderer, + lambda x: x['sortMenu']['sortFilterSubMenuRenderer']['subMenuItems'][comment_sort_index], dict) or {} + sort_continuation_ep = sort_menu_item.get('serviceEndpoint') or {} + + _continuation = self._extract_continuation_ep_data(sort_continuation_ep) or self._extract_continuation(sort_menu_item) + if not _continuation: + continue + + sort_text = str_or_none(sort_menu_item.get('title')) + if not sort_text: + sort_text = 'top comments' if comment_sort_index == 0 else 'newest first' + self.to_screen('Sorting comments by %s' % sort_text.lower()) + break + return _continuation + + def extract_thread(contents): + if not parent: + tracker['current_page_thread'] = 0 + for content in contents: + if not parent and tracker['total_parent_comments'] >= max_parents: + yield + comment_thread_renderer = try_get(content, lambda x: x['commentThreadRenderer']) + comment_renderer = get_first( + (comment_thread_renderer, content), [['commentRenderer', ('comment', 'commentRenderer')]], + expected_type=dict, default={}) + + comment = self._extract_comment(comment_renderer, parent) + if not comment: + continue + comment_id = comment['id'] + if comment.get('is_pinned'): + tracker['pinned_comment_ids'].add(comment_id) + # Sometimes YouTube may break and give us infinite looping comments. + # See: https://github.com/yt-dlp/yt-dlp/issues/6290 + if comment_id in tracker['seen_comment_ids']: + if comment_id in tracker['pinned_comment_ids'] and not comment.get('is_pinned'): + # Pinned comments may appear a second time in newest first sort + # See: https://github.com/yt-dlp/yt-dlp/issues/6712 + continue + self.report_warning( + 'Detected YouTube comments looping. Stopping comment extraction ' + f'{"for this thread" if parent else ""} as we probably cannot get any more.') + yield + else: + tracker['seen_comment_ids'].add(comment['id']) + + tracker['running_total'] += 1 + tracker['total_reply_comments' if parent else 'total_parent_comments'] += 1 + yield comment + + # Attempt to get the replies + comment_replies_renderer = try_get( + comment_thread_renderer, lambda x: x['replies']['commentRepliesRenderer'], dict) + + if comment_replies_renderer: + tracker['current_page_thread'] += 1 + comment_entries_iter = self._comment_entries( + comment_replies_renderer, ytcfg, video_id, + parent=comment.get('id'), tracker=tracker) + yield from itertools.islice(comment_entries_iter, min( + max_replies_per_thread, max(0, max_replies - tracker['total_reply_comments']))) + + # Keeps track of counts across recursive calls + if not tracker: + tracker = dict( + running_total=0, + est_total=None, + current_page_thread=0, + total_parent_comments=0, + total_reply_comments=0, + seen_comment_ids=set(), + pinned_comment_ids=set() + ) + + # TODO: Deprecated + # YouTube comments have a max depth of 2 + max_depth = int_or_none(get_single_config_arg('max_comment_depth')) + if max_depth: + self._downloader.deprecated_feature('[youtube] max_comment_depth extractor argument is deprecated. ' + 'Set max replies in the max-comments extractor argument instead') + if max_depth == 1 and parent: + return + + max_comments, max_parents, max_replies, max_replies_per_thread, *_ = map( + lambda p: int_or_none(p, default=sys.maxsize), self._configuration_arg('max_comments', ) + [''] * 4) + + continuation = self._extract_continuation(root_continuation_data) + + response = None + is_forced_continuation = False + is_first_continuation = parent is None + if is_first_continuation and not continuation: + # Sometimes you can get comments by generating the continuation yourself, + # even if YouTube initially reports them being disabled - e.g. stories comments. + # Note: if the comment section is actually disabled, YouTube may return a response with + # required check_get_keys missing. So we will disable that check initially in this case. + continuation = self._build_api_continuation_query(self._generate_comment_continuation(video_id)) + is_forced_continuation = True + + continuation_items_path = ( + 'onResponseReceivedEndpoints', ..., ('reloadContinuationItemsCommand', 'appendContinuationItemsAction'), 'continuationItems') + for page_num in itertools.count(0): + if not continuation: + break + headers = self.generate_api_headers(ytcfg=ytcfg, visitor_data=self._extract_visitor_data(response)) + comment_prog_str = f"({tracker['running_total']}/~{tracker['est_total']})" + if page_num == 0: + if is_first_continuation: + note_prefix = 'Downloading comment section API JSON' + else: + note_prefix = ' Downloading comment API JSON reply thread %d %s' % ( + tracker['current_page_thread'], comment_prog_str) + else: + note_prefix = '%sDownloading comment%s API JSON page %d %s' % ( + ' ' if parent else '', ' replies' if parent else '', + page_num, comment_prog_str) + + # Do a deep check for incomplete data as sometimes YouTube may return no comments for a continuation + # Ignore check if YouTube says the comment count is 0. + check_get_keys = None + if not is_forced_continuation and not (tracker['est_total'] == 0 and tracker['running_total'] == 0): + check_get_keys = [[*continuation_items_path, ..., ( + 'commentsHeaderRenderer' if is_first_continuation else ('commentThreadRenderer', 'commentRenderer'))]] + try: + response = self._extract_response( + item_id=None, query=continuation, + ep='next', ytcfg=ytcfg, headers=headers, note=note_prefix, + check_get_keys=check_get_keys) + except ExtractorError as e: + # Ignore incomplete data error for replies if retries didn't work. + # This is to allow any other parent comments and comment threads to be downloaded. + # See: https://github.com/yt-dlp/yt-dlp/issues/4669 + if 'incomplete data' in str(e).lower() and parent: + if self.get_param('ignoreerrors') in (True, 'only_download'): + self.report_warning( + 'Received incomplete data for a comment reply thread and retrying did not help. ' + 'Ignoring to let other comments be downloaded. Pass --no-ignore-errors to not ignore.') + return + else: + raise ExtractorError( + 'Incomplete data received for comment reply thread. ' + 'Pass --ignore-errors to ignore and allow rest of comments to download.', + expected=True) + raise + is_forced_continuation = False + continuation = None + for continuation_items in traverse_obj(response, continuation_items_path, expected_type=list, default=[]): + if is_first_continuation: + continuation = extract_header(continuation_items) + is_first_continuation = False + if continuation: + break + continue + + for entry in extract_thread(continuation_items): + if not entry: + return + yield entry + continuation = self._extract_continuation({'contents': continuation_items}) + if continuation: + break + + message = self._get_text(root_continuation_data, ('contents', ..., 'messageRenderer', 'text'), max_runs=1) + if message and not parent and tracker['running_total'] == 0: + self.report_warning(f'Youtube said: {message}', video_id=video_id, only_once=True) + raise self.CommentsDisabled + + @staticmethod + def _generate_comment_continuation(video_id): + """ + Generates initial comment section continuation token from given video id + """ + token = f'\x12\r\x12\x0b{video_id}\x18\x062\'"\x11"\x0b{video_id}0\x00x\x020\x00B\x10comments-section' + return base64.b64encode(token.encode()).decode() + + def _get_comments(self, ytcfg, video_id, contents, webpage): + """Entry for comment extraction""" + def _real_comment_extract(contents): + renderer = next(( + item for item in traverse_obj(contents, (..., 'itemSectionRenderer'), default={}) + if item.get('sectionIdentifier') == 'comment-item-section'), None) + yield from self._comment_entries(renderer, ytcfg, video_id) + + max_comments = int_or_none(self._configuration_arg('max_comments', [''])[0]) + return itertools.islice(_real_comment_extract(contents), 0, max_comments) + + @staticmethod + def _get_checkok_params(): + return {'contentCheckOk': True, 'racyCheckOk': True} + + @classmethod + def _generate_player_context(cls, sts=None): + context = { + 'html5Preference': 'HTML5_PREF_WANTS', + } + if sts is not None: + context['signatureTimestamp'] = sts + return { + 'playbackContext': { + 'contentPlaybackContext': context + }, + **cls._get_checkok_params() + } + + @staticmethod + def _is_agegated(player_response): + if traverse_obj(player_response, ('playabilityStatus', 'desktopLegacyAgeGateReason')): + return True + + reasons = traverse_obj(player_response, ('playabilityStatus', ('status', 'reason'))) + AGE_GATE_REASONS = ( + 'confirm your age', 'age-restricted', 'inappropriate', # reason + 'age_verification_required', 'age_check_required', # status + ) + return any(expected in reason for expected in AGE_GATE_REASONS for reason in reasons) + + @staticmethod + def _is_unplayable(player_response): + return traverse_obj(player_response, ('playabilityStatus', 'status')) == 'UNPLAYABLE' + + def _extract_player_response(self, client, video_id, master_ytcfg, player_ytcfg, player_url, initial_pr, smuggled_data): + + session_index = self._extract_session_index(player_ytcfg, master_ytcfg) + syncid = self._extract_account_syncid(player_ytcfg, master_ytcfg, initial_pr) + sts = self._extract_signature_timestamp(video_id, player_url, master_ytcfg, fatal=False) if player_url else None + headers = self.generate_api_headers( + ytcfg=player_ytcfg, account_syncid=syncid, session_index=session_index, default_client=client) + + yt_query = { + 'videoId': video_id, + } + if _split_innertube_client(client)[0] == 'android': + yt_query['params'] = 'CgIQBg==' + + pp_arg = self._configuration_arg('player_params', [None], casesense=True)[0] + if pp_arg: + yt_query['params'] = pp_arg + + yt_query.update(self._generate_player_context(sts)) + return self._extract_response( + item_id=video_id, ep='player', query=yt_query, + ytcfg=player_ytcfg, headers=headers, fatal=True, + default_client=client, + note='Downloading %s player API JSON' % client.replace('_', ' ').strip() + ) or None + + def _get_requested_clients(self, url, smuggled_data): + requested_clients = [] + default = ['ios', 'android', 'web'] + allowed_clients = sorted( + (client for client in INNERTUBE_CLIENTS.keys() if client[:1] != '_'), + key=lambda client: INNERTUBE_CLIENTS[client]['priority'], reverse=True) + for client in self._configuration_arg('player_client'): + if client in allowed_clients: + requested_clients.append(client) + elif client == 'default': + requested_clients.extend(default) + elif client == 'all': + requested_clients.extend(allowed_clients) + else: + self.report_warning(f'Skipping unsupported client {client}') + if not requested_clients: + requested_clients = default + + if smuggled_data.get('is_music_url') or self.is_music_url(url): + requested_clients.extend( + f'{client}_music' for client in requested_clients if f'{client}_music' in INNERTUBE_CLIENTS) + + return orderedSet(requested_clients) + + def _extract_player_responses(self, clients, video_id, webpage, master_ytcfg, smuggled_data): + initial_pr = None + if webpage: + initial_pr = self._search_json( + self._YT_INITIAL_PLAYER_RESPONSE_RE, webpage, 'initial player response', video_id, fatal=False) + + all_clients = set(clients) + clients = clients[::-1] + prs = [] + + def append_client(*client_names): + """ Append the first client name that exists but not already used """ + for client_name in client_names: + actual_client = _split_innertube_client(client_name)[0] + if actual_client in INNERTUBE_CLIENTS: + if actual_client not in all_clients: + clients.append(client_name) + all_clients.add(actual_client) + return + + # Android player_response does not have microFormats which are needed for + # extraction of some data. So we return the initial_pr with formats + # stripped out even if not requested by the user + # See: https://github.com/yt-dlp/yt-dlp/issues/501 + if initial_pr: + pr = dict(initial_pr) + pr['streamingData'] = None + prs.append(pr) + + last_error = None + tried_iframe_fallback = False + player_url = None + while clients: + client, base_client, variant = _split_innertube_client(clients.pop()) + player_ytcfg = master_ytcfg if client == 'web' else {} + if 'configs' not in self._configuration_arg('player_skip') and client != 'web': + player_ytcfg = self._download_ytcfg(client, video_id) or player_ytcfg + + player_url = player_url or self._extract_player_url(master_ytcfg, player_ytcfg, webpage=webpage) + require_js_player = self._get_default_ytcfg(client).get('REQUIRE_JS_PLAYER') + if 'js' in self._configuration_arg('player_skip'): + require_js_player = False + player_url = None + + if not player_url and not tried_iframe_fallback and require_js_player: + player_url = self._download_player_url(video_id) + tried_iframe_fallback = True + + try: + pr = initial_pr if client == 'web' and initial_pr else self._extract_player_response( + client, video_id, player_ytcfg or master_ytcfg, player_ytcfg, player_url if require_js_player else None, initial_pr, smuggled_data) + except ExtractorError as e: + if last_error: + self.report_warning(last_error) + last_error = e + continue + + if pr: + # YouTube may return a different video player response than expected. + # See: https://github.com/TeamNewPipe/NewPipe/issues/8713 + pr_video_id = traverse_obj(pr, ('videoDetails', 'videoId')) + if pr_video_id and pr_video_id != video_id: + self.report_warning( + f'Skipping player response from {client} client (got player response for video "{pr_video_id}" instead of "{video_id}")' + bug_reports_message()) + else: + # Save client name for introspection later + name = short_client_name(client) + sd = traverse_obj(pr, ('streamingData', {dict})) or {} + sd[STREAMING_DATA_CLIENT_NAME] = name + for f in traverse_obj(sd, (('formats', 'adaptiveFormats'), ..., {dict})): + f[STREAMING_DATA_CLIENT_NAME] = name + prs.append(pr) + + # creator clients can bypass AGE_VERIFICATION_REQUIRED if logged in + if variant == 'embedded' and self._is_unplayable(pr) and self.is_authenticated: + append_client(f'{base_client}_creator') + elif self._is_agegated(pr): + if variant == 'tv_embedded': + append_client(f'{base_client}_embedded') + elif not variant: + append_client(f'tv_embedded.{base_client}', f'{base_client}_embedded') + + if last_error: + if not len(prs): + raise last_error + self.report_warning(last_error) + return prs, player_url + + def _needs_live_processing(self, live_status, duration): + if (live_status == 'is_live' and self.get_param('live_from_start') + or live_status == 'post_live' and (duration or 0) > 2 * 3600): + return live_status + + def _extract_formats_and_subtitles(self, streaming_data, video_id, player_url, live_status, duration): + CHUNK_SIZE = 10 << 20 + itags, stream_ids = collections.defaultdict(set), [] + itag_qualities, res_qualities = {}, {0: None} + q = qualities([ + # Normally tiny is the smallest video-only formats. But + # audio-only formats with unknown quality may get tagged as tiny + 'tiny', + 'audio_quality_ultralow', 'audio_quality_low', 'audio_quality_medium', 'audio_quality_high', # Audio only formats + 'small', 'medium', 'large', 'hd720', 'hd1080', 'hd1440', 'hd2160', 'hd2880', 'highres' + ]) + streaming_formats = traverse_obj(streaming_data, (..., ('formats', 'adaptiveFormats'), ...)) + format_types = self._configuration_arg('formats') + all_formats = 'duplicate' in format_types + if self._configuration_arg('include_duplicate_formats'): + all_formats = True + self._downloader.deprecated_feature('[youtube] include_duplicate_formats extractor argument is deprecated. ' + 'Use formats=duplicate extractor argument instead') + + def build_fragments(f): + return LazyList({ + 'url': update_url_query(f['url'], { + 'range': f'{range_start}-{min(range_start + CHUNK_SIZE - 1, f["filesize"])}' + }) + } for range_start in range(0, f['filesize'], CHUNK_SIZE)) + + for fmt in streaming_formats: + if fmt.get('targetDurationSec'): + continue + + itag = str_or_none(fmt.get('itag')) + audio_track = fmt.get('audioTrack') or {} + stream_id = (itag, audio_track.get('id'), fmt.get('isDrc')) + if not all_formats: + if stream_id in stream_ids: + continue + + quality = fmt.get('quality') + height = int_or_none(fmt.get('height')) + if quality == 'tiny' or not quality: + quality = fmt.get('audioQuality', '').lower() or quality + # The 3gp format (17) in android client has a quality of "small", + # but is actually worse than other formats + if itag == '17': + quality = 'tiny' + if quality: + if itag: + itag_qualities[itag] = quality + if height: + res_qualities[height] = quality + # FORMAT_STREAM_TYPE_OTF(otf=1) requires downloading the init fragment + # (adding `&sq=0` to the URL) and parsing emsg box to determine the + # number of fragment that would subsequently requested with (`&sq=N`) + if fmt.get('type') == 'FORMAT_STREAM_TYPE_OTF': + continue + + fmt_url = fmt.get('url') + if not fmt_url: + sc = urllib.parse.parse_qs(fmt.get('signatureCipher')) + fmt_url = url_or_none(try_get(sc, lambda x: x['url'][0])) + encrypted_sig = try_get(sc, lambda x: x['s'][0]) + if not all((sc, fmt_url, player_url, encrypted_sig)): + continue + try: + fmt_url += '&%s=%s' % ( + traverse_obj(sc, ('sp', -1)) or 'signature', + self._decrypt_signature(encrypted_sig, video_id, player_url) + ) + except ExtractorError as e: + self.report_warning('Signature extraction failed: Some formats may be missing', + video_id=video_id, only_once=True) + self.write_debug(e, only_once=True) + continue + + query = parse_qs(fmt_url) + throttled = False + if query.get('n'): + try: + decrypt_nsig = self._cached(self._decrypt_nsig, 'nsig', query['n'][0]) + fmt_url = update_url_query(fmt_url, { + 'n': decrypt_nsig(query['n'][0], video_id, player_url) + }) + except ExtractorError as e: + phantomjs_hint = '' + if isinstance(e, JSInterpreter.Exception): + phantomjs_hint = (f' Install {self._downloader._format_err("PhantomJS", self._downloader.Styles.EMPHASIS)} ' + f'to workaround the issue. {PhantomJSwrapper.INSTALL_HINT}\n') + if player_url: + self.report_warning( + f'nsig extraction failed: You may experience throttling for some formats\n{phantomjs_hint}' + f' n = {query["n"][0]} ; player = {player_url}', video_id=video_id, only_once=True) + self.write_debug(e, only_once=True) + else: + self.report_warning( + 'Cannot decrypt nsig without player_url: You may experience throttling for some formats', + video_id=video_id, only_once=True) + throttled = True + + tbr = float_or_none(fmt.get('averageBitrate') or fmt.get('bitrate'), 1000) + language_preference = ( + 10 if audio_track.get('audioIsDefault') and 10 + else -10 if 'descriptive' in (audio_track.get('displayName') or '').lower() and -10 + else -1) + # Some formats may have much smaller duration than others (possibly damaged during encoding) + # E.g. 2-nOtRESiUc Ref: https://github.com/yt-dlp/yt-dlp/issues/2823 + # Make sure to avoid false positives with small duration differences. + # E.g. __2ABJjxzNo, ySuUZEjARPY + is_damaged = try_get(fmt, lambda x: float(x['approxDurationMs']) / duration < 500) + if is_damaged: + self.report_warning( + f'{video_id}: Some formats are possibly damaged. They will be deprioritized', only_once=True) + + client_name = fmt.get(STREAMING_DATA_CLIENT_NAME) + name = fmt.get('qualityLabel') or quality.replace('audio_quality_', '') or '' + fps = int_or_none(fmt.get('fps')) or 0 + dct = { + 'asr': int_or_none(fmt.get('audioSampleRate')), + 'filesize': int_or_none(fmt.get('contentLength')), + 'format_id': f'{itag}{"-drc" if fmt.get("isDrc") else ""}', + 'format_note': join_nonempty( + join_nonempty(audio_track.get('displayName'), + language_preference > 0 and ' (default)', delim=''), + name, fmt.get('isDrc') and 'DRC', + try_get(fmt, lambda x: x['projectionType'].replace('RECTANGULAR', '').lower()), + try_get(fmt, lambda x: x['spatialAudioType'].replace('SPATIAL_AUDIO_TYPE_', '').lower()), + throttled and 'THROTTLED', is_damaged and 'DAMAGED', + (self.get_param('verbose') or all_formats) and client_name, + delim=', '), + # Format 22 is likely to be damaged. See https://github.com/yt-dlp/yt-dlp/issues/3372 + 'source_preference': ((-10 if throttled else -5 if itag == '22' else -1) + + (100 if 'Premium' in name else 0)), + 'fps': fps if fps > 1 else None, # For some formats, fps is wrongly returned as 1 + 'audio_channels': fmt.get('audioChannels'), + 'height': height, + 'quality': q(quality) - bool(fmt.get('isDrc')) / 2, + 'has_drm': bool(fmt.get('drmFamilies')), + 'tbr': tbr, + 'url': fmt_url, + 'width': int_or_none(fmt.get('width')), + 'language': join_nonempty(audio_track.get('id', '').split('.')[0], + 'desc' if language_preference < -1 else '') or None, + 'language_preference': language_preference, + # Strictly de-prioritize damaged and 3gp formats + 'preference': -10 if is_damaged else -2 if itag == '17' else None, + } + mime_mobj = re.match( + r'((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?', fmt.get('mimeType') or '') + if mime_mobj: + dct['ext'] = mimetype2ext(mime_mobj.group(1)) + dct.update(parse_codecs(mime_mobj.group(2))) + if itag: + itags[itag].add(('https', dct.get('language'))) + stream_ids.append(stream_id) + single_stream = 'none' in (dct.get('acodec'), dct.get('vcodec')) + if single_stream and dct.get('ext'): + dct['container'] = dct['ext'] + '_dash' + + if (all_formats or 'dashy' in format_types) and dct['filesize']: + yield { + **dct, + 'format_id': f'{dct["format_id"]}-dashy' if all_formats else dct['format_id'], + 'protocol': 'http_dash_segments', + 'fragments': build_fragments(dct), + } + if all_formats or 'dashy' not in format_types: + dct['downloader_options'] = {'http_chunk_size': CHUNK_SIZE} + yield dct + + needs_live_processing = self._needs_live_processing(live_status, duration) + skip_bad_formats = 'incomplete' not in format_types + if self._configuration_arg('include_incomplete_formats'): + skip_bad_formats = False + self._downloader.deprecated_feature('[youtube] include_incomplete_formats extractor argument is deprecated. ' + 'Use formats=incomplete extractor argument instead') + + skip_manifests = set(self._configuration_arg('skip')) + if (not self.get_param('youtube_include_hls_manifest', True) + or needs_live_processing == 'is_live' # These will be filtered out by YoutubeDL anyway + or needs_live_processing and skip_bad_formats): + skip_manifests.add('hls') + + if not self.get_param('youtube_include_dash_manifest', True): + skip_manifests.add('dash') + if self._configuration_arg('include_live_dash'): + self._downloader.deprecated_feature('[youtube] include_live_dash extractor argument is deprecated. ' + 'Use formats=incomplete extractor argument instead') + elif skip_bad_formats and live_status == 'is_live' and needs_live_processing != 'is_live': + skip_manifests.add('dash') + + def process_manifest_format(f, proto, client_name, itag): + key = (proto, f.get('language')) + if not all_formats and key in itags[itag]: + return False + itags[itag].add(key) + + if itag and all_formats: + f['format_id'] = f'{itag}-{proto}' + elif any(p != proto for p, _ in itags[itag]): + f['format_id'] = f'{itag}-{proto}' + elif itag: + f['format_id'] = itag + + if f.get('source_preference') is None: + f['source_preference'] = -1 + + if itag in ('616', '235'): + f['format_note'] = join_nonempty(f.get('format_note'), 'Premium', delim=' ') + f['source_preference'] += 100 + + f['quality'] = q(itag_qualities.get(try_get(f, lambda f: f['format_id'].split('-')[0]), -1)) + if f['quality'] == -1 and f.get('height'): + f['quality'] = q(res_qualities[min(res_qualities, key=lambda x: abs(x - f['height']))]) + if self.get_param('verbose') or all_formats: + f['format_note'] = join_nonempty(f.get('format_note'), client_name, delim=', ') + if f.get('fps') and f['fps'] <= 1: + del f['fps'] + + if proto == 'hls' and f.get('has_drm'): + f['has_drm'] = 'maybe' + f['source_preference'] -= 5 + return True + + subtitles = {} + for sd in streaming_data: + client_name = sd.get(STREAMING_DATA_CLIENT_NAME) + + hls_manifest_url = 'hls' not in skip_manifests and sd.get('hlsManifestUrl') + if hls_manifest_url: + fmts, subs = self._extract_m3u8_formats_and_subtitles( + hls_manifest_url, video_id, 'mp4', fatal=False, live=live_status == 'is_live') + subtitles = self._merge_subtitles(subs, subtitles) + for f in fmts: + if process_manifest_format(f, 'hls', client_name, self._search_regex( + r'/itag/(\d+)', f['url'], 'itag', default=None)): + yield f + + dash_manifest_url = 'dash' not in skip_manifests and sd.get('dashManifestUrl') + if dash_manifest_url: + formats, subs = self._extract_mpd_formats_and_subtitles(dash_manifest_url, video_id, fatal=False) + subtitles = self._merge_subtitles(subs, subtitles) # Prioritize HLS subs over DASH + for f in formats: + if process_manifest_format(f, 'dash', client_name, f['format_id']): + f['filesize'] = int_or_none(self._search_regex( + r'/clen/(\d+)', f.get('fragment_base_url') or f['url'], 'file size', default=None)) + if needs_live_processing: + f['is_from_start'] = True + + yield f + yield subtitles + + def _extract_storyboard(self, player_responses, duration): + spec = get_first( + player_responses, ('storyboards', 'playerStoryboardSpecRenderer', 'spec'), default='').split('|')[::-1] + base_url = url_or_none(urljoin('https://i.ytimg.com/', spec.pop() or None)) + if not base_url: + return + L = len(spec) - 1 + for i, args in enumerate(spec): + args = args.split('#') + counts = list(map(int_or_none, args[:5])) + if len(args) != 8 or not all(counts): + self.report_warning(f'Malformed storyboard {i}: {"#".join(args)}{bug_reports_message()}') + continue + width, height, frame_count, cols, rows = counts + N, sigh = args[6:] + + url = base_url.replace('$L', str(L - i)).replace('$N', N) + f'&sigh={sigh}' + fragment_count = frame_count / (cols * rows) + fragment_duration = duration / fragment_count + yield { + 'format_id': f'sb{i}', + 'format_note': 'storyboard', + 'ext': 'mhtml', + 'protocol': 'mhtml', + 'acodec': 'none', + 'vcodec': 'none', + 'url': url, + 'width': width, + 'height': height, + 'fps': frame_count / duration, + 'rows': rows, + 'columns': cols, + 'fragments': [{ + 'url': url.replace('$M', str(j)), + 'duration': min(fragment_duration, duration - (j * fragment_duration)), + } for j in range(math.ceil(fragment_count))], + } + + def _download_player_responses(self, url, smuggled_data, video_id, webpage_url): + webpage = None + if 'webpage' not in self._configuration_arg('player_skip'): + query = {'bpctr': '9999999999', 'has_verified': '1'} + pp = self._configuration_arg('player_params', [None], casesense=True)[0] + if pp: + query['pp'] = pp + webpage = self._download_webpage( + webpage_url, video_id, fatal=False, query=query) + + master_ytcfg = self.extract_ytcfg(video_id, webpage) or self._get_default_ytcfg() + + player_responses, player_url = self._extract_player_responses( + self._get_requested_clients(url, smuggled_data), + video_id, webpage, master_ytcfg, smuggled_data) + + return webpage, master_ytcfg, player_responses, player_url + + def _list_formats(self, video_id, microformats, video_details, player_responses, player_url, duration=None): + live_broadcast_details = traverse_obj(microformats, (..., 'liveBroadcastDetails')) + is_live = get_first(video_details, 'isLive') + if is_live is None: + is_live = get_first(live_broadcast_details, 'isLiveNow') + live_content = get_first(video_details, 'isLiveContent') + is_upcoming = get_first(video_details, 'isUpcoming') + post_live = get_first(video_details, 'isPostLiveDvr') + live_status = ('post_live' if post_live + else 'is_live' if is_live + else 'is_upcoming' if is_upcoming + else 'was_live' if live_content + else 'not_live' if False in (is_live, live_content) + else None) + streaming_data = traverse_obj(player_responses, (..., 'streamingData')) + *formats, subtitles = self._extract_formats_and_subtitles(streaming_data, video_id, player_url, live_status, duration) + if all(f.get('has_drm') for f in formats): + # If there are no formats that definitely don't have DRM, all have DRM + for f in formats: + f['has_drm'] = True + + return live_broadcast_details, live_status, streaming_data, formats, subtitles + + def _real_extract(self, url): + url, smuggled_data = unsmuggle_url(url, {}) + video_id = self._match_id(url) + + base_url = self.http_scheme() + '//www.youtube.com/' + webpage_url = base_url + 'watch?v=' + video_id + + webpage, master_ytcfg, player_responses, player_url = self._download_player_responses(url, smuggled_data, video_id, webpage_url) + + playability_statuses = traverse_obj( + player_responses, (..., 'playabilityStatus'), expected_type=dict) + + trailer_video_id = get_first( + playability_statuses, + ('errorScreen', 'playerLegacyDesktopYpcTrailerRenderer', 'trailerVideoId'), + expected_type=str) + if trailer_video_id: + return self.url_result( + trailer_video_id, self.ie_key(), trailer_video_id) + + search_meta = ((lambda x: self._html_search_meta(x, webpage, default=None)) + if webpage else (lambda x: None)) + + video_details = traverse_obj(player_responses, (..., 'videoDetails'), expected_type=dict) + microformats = traverse_obj( + player_responses, (..., 'microformat', 'playerMicroformatRenderer'), + expected_type=dict) + + translated_title = self._get_text(microformats, (..., 'title')) + video_title = (self._preferred_lang and translated_title + or get_first(video_details, 'title') # primary + or translated_title + or search_meta(['og:title', 'twitter:title', 'title'])) + translated_description = self._get_text(microformats, (..., 'description')) + original_description = get_first(video_details, 'shortDescription') + video_description = ( + self._preferred_lang and translated_description + # If original description is blank, it will be an empty string. + # Do not prefer translated description in this case. + or original_description if original_description is not None else translated_description) + + multifeed_metadata_list = get_first( + player_responses, + ('multicamera', 'playerLegacyMulticameraRenderer', 'metadataList'), + expected_type=str) + if multifeed_metadata_list and not smuggled_data.get('force_singlefeed'): + if self.get_param('noplaylist'): + self.to_screen('Downloading just video %s because of --no-playlist' % video_id) + else: + entries = [] + feed_ids = [] + for feed in multifeed_metadata_list.split(','): + # Unquote should take place before split on comma (,) since textual + # fields may contain comma as well (see + # https://github.com/ytdl-org/youtube-dl/issues/8536) + feed_data = urllib.parse.parse_qs( + urllib.parse.unquote_plus(feed)) + + def feed_entry(name): + return try_get( + feed_data, lambda x: x[name][0], str) + + feed_id = feed_entry('id') + if not feed_id: + continue + feed_title = feed_entry('title') + title = video_title + if feed_title: + title += ' (%s)' % feed_title + entries.append({ + '_type': 'url_transparent', + 'ie_key': 'Youtube', + 'url': smuggle_url( + '%swatch?v=%s' % (base_url, feed_data['id'][0]), + {'force_singlefeed': True}), + 'title': title, + }) + feed_ids.append(feed_id) + self.to_screen( + 'Downloading multifeed video (%s) - add --no-playlist to just download video %s' + % (', '.join(feed_ids), video_id)) + return self.playlist_result( + entries, video_id, video_title, video_description) + + duration = (int_or_none(get_first(video_details, 'lengthSeconds')) + or int_or_none(get_first(microformats, 'lengthSeconds')) + or parse_duration(search_meta('duration')) or None) + + live_broadcast_details, live_status, streaming_data, formats, automatic_captions = \ + self._list_formats(video_id, microformats, video_details, player_responses, player_url, duration) + if live_status == 'post_live': + self.write_debug(f'{video_id}: Video is in Post-Live Manifestless mode') + + if not formats: + if not self.get_param('allow_unplayable_formats') and traverse_obj(streaming_data, (..., 'licenseInfos')): + self.report_drm(video_id) + pemr = get_first( + playability_statuses, + ('errorScreen', 'playerErrorMessageRenderer'), expected_type=dict) or {} + reason = self._get_text(pemr, 'reason') or get_first(playability_statuses, 'reason') + subreason = clean_html(self._get_text(pemr, 'subreason') or '') + if subreason: + if subreason == 'The uploader has not made this video available in your country.': + countries = get_first(microformats, 'availableCountries') + if not countries: + regions_allowed = search_meta('regionsAllowed') + countries = regions_allowed.split(',') if regions_allowed else None + self.raise_geo_restricted(subreason, countries, metadata_available=True) + reason += f'. {subreason}' + if reason: + self.raise_no_formats(reason, expected=True) + + keywords = get_first(video_details, 'keywords', expected_type=list) or [] + if not keywords and webpage: + keywords = [ + unescapeHTML(m.group('content')) + for m in re.finditer(self._meta_regex('og:video:tag'), webpage)] + for keyword in keywords: + if keyword.startswith('yt:stretch='): + mobj = re.search(r'(\d+)\s*:\s*(\d+)', keyword) + if mobj: + # NB: float is intentional for forcing float division + w, h = (float(v) for v in mobj.groups()) + if w > 0 and h > 0: + ratio = w / h + for f in formats: + if f.get('vcodec') != 'none': + f['stretched_ratio'] = ratio + break + thumbnails = self._extract_thumbnails((video_details, microformats), (..., ..., 'thumbnail')) + thumbnail_url = search_meta(['og:image', 'twitter:image']) + if thumbnail_url: + thumbnails.append({ + 'url': thumbnail_url, + }) + original_thumbnails = thumbnails.copy() + + # The best resolution thumbnails sometimes does not appear in the webpage + # See: https://github.com/yt-dlp/yt-dlp/issues/340 + # List of possible thumbnails - Ref: <https://stackoverflow.com/a/20542029> + thumbnail_names = [ + # While the *1,*2,*3 thumbnails are just below their corresponding "*default" variants + # in resolution, these are not the custom thumbnail. So de-prioritize them + 'maxresdefault', 'hq720', 'sddefault', 'hqdefault', '0', 'mqdefault', 'default', + 'sd1', 'sd2', 'sd3', 'hq1', 'hq2', 'hq3', 'mq1', 'mq2', 'mq3', '1', '2', '3' + ] + n_thumbnail_names = len(thumbnail_names) + thumbnails.extend({ + 'url': 'https://i.ytimg.com/vi{webp}/{video_id}/{name}{live}.{ext}'.format( + video_id=video_id, name=name, ext=ext, + webp='_webp' if ext == 'webp' else '', live='_live' if live_status == 'is_live' else ''), + } for name in thumbnail_names for ext in ('webp', 'jpg')) + for thumb in thumbnails: + i = next((i for i, t in enumerate(thumbnail_names) if f'/{video_id}/{t}' in thumb['url']), n_thumbnail_names) + thumb['preference'] = (0 if '.webp' in thumb['url'] else -1) - (2 * i) + self._remove_duplicate_formats(thumbnails) + self._downloader._sort_thumbnails(original_thumbnails) + + category = get_first(microformats, 'category') or search_meta('genre') + channel_id = self.ucid_or_none(str_or_none( + get_first(video_details, 'channelId') + or get_first(microformats, 'externalChannelId') + or search_meta('channelId'))) + owner_profile_url = get_first(microformats, 'ownerProfileUrl') + + live_start_time = parse_iso8601(get_first(live_broadcast_details, 'startTimestamp')) + live_end_time = parse_iso8601(get_first(live_broadcast_details, 'endTimestamp')) + if not duration and live_end_time and live_start_time: + duration = live_end_time - live_start_time + + needs_live_processing = self._needs_live_processing(live_status, duration) + + def is_bad_format(fmt): + if needs_live_processing and not fmt.get('is_from_start'): + return True + elif (live_status == 'is_live' and needs_live_processing != 'is_live' + and fmt.get('protocol') == 'http_dash_segments'): + return True + + for fmt in filter(is_bad_format, formats): + fmt['preference'] = (fmt.get('preference') or -1) - 10 + fmt['format_note'] = join_nonempty(fmt.get('format_note'), '(Last 2 hours)', delim=' ') + + if needs_live_processing: + self._prepare_live_from_start_formats( + formats, video_id, live_start_time, url, webpage_url, smuggled_data, live_status == 'is_live') + + formats.extend(self._extract_storyboard(player_responses, duration)) + + channel_handle = self.handle_from_url(owner_profile_url) + + info = { + 'id': video_id, + 'title': video_title, + 'formats': formats, + 'thumbnails': thumbnails, + # The best thumbnail that we are sure exists. Prevents unnecessary + # URL checking if user don't care about getting the best possible thumbnail + 'thumbnail': traverse_obj(original_thumbnails, (-1, 'url')), + 'description': video_description, + 'channel_id': channel_id, + 'channel_url': format_field(channel_id, None, 'https://www.youtube.com/channel/%s', default=None), + 'duration': duration, + 'view_count': int_or_none( + get_first((video_details, microformats), (..., 'viewCount')) + or search_meta('interactionCount')), + 'average_rating': float_or_none(get_first(video_details, 'averageRating')), + 'age_limit': 18 if ( + get_first(microformats, 'isFamilySafe') is False + or search_meta('isFamilyFriendly') == 'false' + or search_meta('og:restrictions:age') == '18+') else 0, + 'webpage_url': webpage_url, + 'categories': [category] if category else None, + 'tags': keywords, + 'playable_in_embed': get_first(playability_statuses, 'playableInEmbed'), + 'live_status': live_status, + 'release_timestamp': live_start_time, + '_format_sort_fields': ( # source_preference is lower for throttled/potentially damaged formats + 'quality', 'res', 'fps', 'hdr:12', 'source', 'vcodec:vp9.2', 'channels', 'acodec', 'lang', 'proto') + } + + subtitles = {} + pctr = traverse_obj(player_responses, (..., 'captions', 'playerCaptionsTracklistRenderer'), expected_type=dict) + if pctr: + def get_lang_code(track): + return (remove_start(track.get('vssId') or '', '.').replace('.', '-') + or track.get('languageCode')) + + # Converted into dicts to remove duplicates + captions = { + get_lang_code(sub): sub + for sub in traverse_obj(pctr, (..., 'captionTracks', ...))} + translation_languages = { + lang.get('languageCode'): self._get_text(lang.get('languageName'), max_runs=1) + for lang in traverse_obj(pctr, (..., 'translationLanguages', ...))} + + def process_language(container, base_url, lang_code, sub_name, query): + lang_subs = container.setdefault(lang_code, []) + for fmt in self._SUBTITLE_FORMATS: + query.update({ + 'fmt': fmt, + }) + lang_subs.append({ + 'ext': fmt, + 'url': urljoin('https://www.youtube.com', update_url_query(base_url, query)), + 'name': sub_name, + }) + + # NB: Constructing the full subtitle dictionary is slow + get_translated_subs = 'translated_subs' not in self._configuration_arg('skip') and ( + self.get_param('writeautomaticsub', False) or self.get_param('listsubtitles')) + for lang_code, caption_track in captions.items(): + base_url = caption_track.get('baseUrl') + orig_lang = parse_qs(base_url).get('lang', [None])[-1] + if not base_url: + continue + lang_name = self._get_text(caption_track, 'name', max_runs=1) + if caption_track.get('kind') != 'asr': + if not lang_code: + continue + process_language( + subtitles, base_url, lang_code, lang_name, {}) + if not caption_track.get('isTranslatable'): + continue + for trans_code, trans_name in translation_languages.items(): + if not trans_code: + continue + orig_trans_code = trans_code + if caption_track.get('kind') != 'asr' and trans_code != 'und': + if not get_translated_subs: + continue + trans_code += f'-{lang_code}' + trans_name += format_field(lang_name, None, ' from %s') + if lang_code == f'a-{orig_trans_code}': + # Set audio language based on original subtitles + for f in formats: + if f.get('acodec') != 'none' and not f.get('language'): + f['language'] = orig_trans_code + # Add an "-orig" label to the original language so that it can be distinguished. + # The subs are returned without "-orig" as well for compatibility + process_language( + automatic_captions, base_url, f'{trans_code}-orig', f'{trans_name} (Original)', {}) + # Setting tlang=lang returns damaged subtitles. + process_language(automatic_captions, base_url, trans_code, trans_name, + {} if orig_lang == orig_trans_code else {'tlang': trans_code}) + + info['automatic_captions'] = automatic_captions + info['subtitles'] = subtitles + + parsed_url = urllib.parse.urlparse(url) + for component in [parsed_url.fragment, parsed_url.query]: + query = urllib.parse.parse_qs(component) + for k, v in query.items(): + for d_k, s_ks in [('start', ('start', 't')), ('end', ('end',))]: + d_k += '_time' + if d_k not in info and k in s_ks: + info[d_k] = parse_duration(query[k][0]) + + # Youtube Music Auto-generated description + if (video_description or '').strip().endswith('\nAuto-generated by YouTube.'): + # XXX: Causes catastrophic backtracking if description has "·" + # E.g. https://www.youtube.com/watch?v=DoPaAxMQoiI + # Simulating atomic groups: (?P<a>[^xy]+)x => (?=(?P<a>[^xy]+))(?P=a)x + # reduces it, but does not fully fix it. https://regex101.com/r/8Ssf2h/2 + mobj = re.search( + r'''(?xs) + (?=(?P<track>[^\n·]+))(?P=track)· + (?=(?P<artist>[^\n]+))(?P=artist)\n+ + (?=(?P<album>[^\n]+))(?P=album)\n + (?:.+?â„—\s*(?P<release_year>\d{4})(?!\d))? + (?:.+?Released on\s*:\s*(?P<release_date>\d{4}-\d{2}-\d{2}))? + (.+?\nArtist\s*:\s* + (?=(?P<clean_artist>[^\n]+))(?P=clean_artist)\n + )?.+\nAuto-generated\ by\ YouTube\.\s*$ + ''', video_description) + if mobj: + release_year = mobj.group('release_year') + release_date = mobj.group('release_date') + if release_date: + release_date = release_date.replace('-', '') + if not release_year: + release_year = release_date[:4] + info.update({ + 'album': mobj.group('album'.strip()), + 'artist': mobj.group('clean_artist') or ', '.join(a.strip() for a in mobj.group('artist').split('·')), + 'track': mobj.group('track').strip(), + 'release_date': release_date, + 'release_year': int_or_none(release_year), + }) + + initial_data = None + if webpage: + initial_data = self.extract_yt_initial_data(video_id, webpage, fatal=False) + if not traverse_obj(initial_data, 'contents'): + self.report_warning('Incomplete data received in embedded initial data; re-fetching using API.') + initial_data = None + if not initial_data: + query = {'videoId': video_id} + query.update(self._get_checkok_params()) + initial_data = self._extract_response( + item_id=video_id, ep='next', fatal=False, + ytcfg=master_ytcfg, query=query, check_get_keys='contents', + headers=self.generate_api_headers(ytcfg=master_ytcfg), + note='Downloading initial data API JSON') + + info['comment_count'] = traverse_obj(initial_data, ( + 'contents', 'twoColumnWatchNextResults', 'results', 'results', 'contents', ..., 'itemSectionRenderer', + 'contents', ..., 'commentsEntryPointHeaderRenderer', 'commentCount' + ), ( + 'engagementPanels', lambda _, v: v['engagementPanelSectionListRenderer']['panelIdentifier'] == 'comment-item-section', + 'engagementPanelSectionListRenderer', 'header', 'engagementPanelTitleHeaderRenderer', 'contextualInfo' + ), expected_type=self._get_count, get_all=False) + + try: # This will error if there is no livechat + initial_data['contents']['twoColumnWatchNextResults']['conversationBar']['liveChatRenderer']['continuations'][0]['reloadContinuationData']['continuation'] + except (KeyError, IndexError, TypeError): + pass + else: + info.setdefault('subtitles', {})['live_chat'] = [{ + # url is needed to set cookies + 'url': f'https://www.youtube.com/watch?v={video_id}&bpctr=9999999999&has_verified=1', + 'video_id': video_id, + 'ext': 'json', + 'protocol': ('youtube_live_chat' if live_status in ('is_live', 'is_upcoming') + else 'youtube_live_chat_replay'), + }] + + if initial_data: + info['chapters'] = ( + self._extract_chapters_from_json(initial_data, duration) + or self._extract_chapters_from_engagement_panel(initial_data, duration) + or self._extract_chapters_from_description(video_description, duration) + or None) + + info['heatmap'] = self._extract_heatmap(initial_data) + + contents = traverse_obj( + initial_data, ('contents', 'twoColumnWatchNextResults', 'results', 'results', 'contents'), + expected_type=list, default=[]) + + vpir = get_first(contents, 'videoPrimaryInfoRenderer') + if vpir: + stl = vpir.get('superTitleLink') + if stl: + stl = self._get_text(stl) + if try_get( + vpir, + lambda x: x['superTitleIcon']['iconType']) == 'LOCATION_PIN': + info['location'] = stl + else: + mobj = re.search(r'(.+?)\s*S(\d+)\s*•?\s*E(\d+)', stl) + if mobj: + info.update({ + 'series': mobj.group(1), + 'season_number': int(mobj.group(2)), + 'episode_number': int(mobj.group(3)), + }) + for tlb in (try_get( + vpir, + lambda x: x['videoActions']['menuRenderer']['topLevelButtons'], + list) or []): + tbrs = variadic( + traverse_obj( + tlb, ('toggleButtonRenderer', ...), + ('segmentedLikeDislikeButtonRenderer', ..., 'toggleButtonRenderer'))) + for tbr in tbrs: + for getter, regex in [( + lambda x: x['defaultText']['accessibility']['accessibilityData'], + r'(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)'), ([ + lambda x: x['accessibility'], + lambda x: x['accessibilityData']['accessibilityData'], + ], r'(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other people')]: + label = (try_get(tbr, getter, dict) or {}).get('label') + if label: + mobj = re.match(regex, label) + if mobj: + info[mobj.group('type') + '_count'] = str_to_int(mobj.group('count')) + break + sbr_tooltip = try_get( + vpir, lambda x: x['sentimentBar']['sentimentBarRenderer']['tooltip']) + if sbr_tooltip: + like_count, dislike_count = sbr_tooltip.split(' / ') + info.update({ + 'like_count': str_to_int(like_count), + 'dislike_count': str_to_int(dislike_count), + }) + vcr = traverse_obj(vpir, ('viewCount', 'videoViewCountRenderer')) + if vcr: + vc = self._get_count(vcr, 'viewCount') + # Upcoming premieres with waiting count are treated as live here + if vcr.get('isLive'): + info['concurrent_view_count'] = vc + elif info.get('view_count') is None: + info['view_count'] = vc + + vsir = get_first(contents, 'videoSecondaryInfoRenderer') + if vsir: + vor = traverse_obj(vsir, ('owner', 'videoOwnerRenderer')) + info.update({ + 'channel': self._get_text(vor, 'title'), + 'channel_follower_count': self._get_count(vor, 'subscriberCountText')}) + + if not channel_handle: + channel_handle = self.handle_from_url( + traverse_obj(vor, ( + ('navigationEndpoint', ('title', 'runs', ..., 'navigationEndpoint')), + (('commandMetadata', 'webCommandMetadata', 'url'), ('browseEndpoint', 'canonicalBaseUrl')), + {str}), get_all=False)) + + rows = try_get( + vsir, + lambda x: x['metadataRowContainer']['metadataRowContainerRenderer']['rows'], + list) or [] + multiple_songs = False + for row in rows: + if try_get(row, lambda x: x['metadataRowRenderer']['hasDividerLine']) is True: + multiple_songs = True + break + for row in rows: + mrr = row.get('metadataRowRenderer') or {} + mrr_title = mrr.get('title') + if not mrr_title: + continue + mrr_title = self._get_text(mrr, 'title') + mrr_contents_text = self._get_text(mrr, ('contents', 0)) + if mrr_title == 'License': + info['license'] = mrr_contents_text + elif not multiple_songs: + if mrr_title == 'Album': + info['album'] = mrr_contents_text + elif mrr_title == 'Artist': + info['artist'] = mrr_contents_text + elif mrr_title == 'Song': + info['track'] = mrr_contents_text + owner_badges = self._extract_badges(traverse_obj(vsir, ('owner', 'videoOwnerRenderer', 'badges'))) + if self._has_badge(owner_badges, BadgeType.VERIFIED): + info['channel_is_verified'] = True + + info.update({ + 'uploader': info.get('channel'), + 'uploader_id': channel_handle, + 'uploader_url': format_field(channel_handle, None, 'https://www.youtube.com/%s', default=None), + }) + # The upload date for scheduled, live and past live streams / premieres in microformats + # may be different from the stream date. Although not in UTC, we will prefer it in this case. + # See: https://github.com/yt-dlp/yt-dlp/pull/2223#issuecomment-1008485139 + upload_date = ( + unified_strdate(get_first(microformats, 'uploadDate')) + or unified_strdate(search_meta('uploadDate'))) + if not upload_date or ( + live_status in ('not_live', None) + and 'no-youtube-prefer-utc-upload-date' not in self.get_param('compat_opts', []) + ): + upload_date = strftime_or_none( + self._parse_time_text(self._get_text(vpir, 'dateText'))) or upload_date + info['upload_date'] = upload_date + + for s_k, d_k in [('artist', 'creator'), ('track', 'alt_title')]: + v = info.get(s_k) + if v: + info[d_k] = v + + badges = self._extract_badges(traverse_obj(vpir, 'badges')) + + is_private = (self._has_badge(badges, BadgeType.AVAILABILITY_PRIVATE) + or get_first(video_details, 'isPrivate', expected_type=bool)) + + info['availability'] = ( + 'public' if self._has_badge(badges, BadgeType.AVAILABILITY_PUBLIC) + else self._availability( + is_private=is_private, + needs_premium=( + self._has_badge(badges, BadgeType.AVAILABILITY_PREMIUM) + or False if initial_data and is_private is not None else None), + needs_subscription=( + self._has_badge(badges, BadgeType.AVAILABILITY_SUBSCRIPTION) + or False if initial_data and is_private is not None else None), + needs_auth=info['age_limit'] >= 18, + is_unlisted=None if is_private is None else ( + self._has_badge(badges, BadgeType.AVAILABILITY_UNLISTED) + or get_first(microformats, 'isUnlisted', expected_type=bool)))) + + info['__post_extractor'] = self.extract_comments(master_ytcfg, video_id, contents, webpage) + + self.mark_watched(video_id, player_responses) + + return info + + +class YoutubeTabBaseInfoExtractor(YoutubeBaseInfoExtractor): + @staticmethod + def passthrough_smuggled_data(func): + def _smuggle(info, smuggled_data): + if info.get('_type') not in ('url', 'url_transparent'): + return info + if smuggled_data.get('is_music_url'): + parsed_url = urllib.parse.urlparse(info['url']) + if parsed_url.netloc in ('www.youtube.com', 'music.youtube.com'): + smuggled_data.pop('is_music_url') + info['url'] = urllib.parse.urlunparse(parsed_url._replace(netloc='music.youtube.com')) + if smuggled_data: + info['url'] = smuggle_url(info['url'], smuggled_data) + return info + + @functools.wraps(func) + def wrapper(self, url): + url, smuggled_data = unsmuggle_url(url, {}) + if self.is_music_url(url): + smuggled_data['is_music_url'] = True + info_dict = func(self, url, smuggled_data) + if smuggled_data: + _smuggle(info_dict, smuggled_data) + if info_dict.get('entries'): + info_dict['entries'] = (_smuggle(i, smuggled_data.copy()) for i in info_dict['entries']) + return info_dict + return wrapper + + @staticmethod + def _extract_basic_item_renderer(item): + # Modified from _extract_grid_item_renderer + known_basic_renderers = ( + 'playlistRenderer', 'videoRenderer', 'channelRenderer', 'showRenderer', 'reelItemRenderer' + ) + for key, renderer in item.items(): + if not isinstance(renderer, dict): + continue + elif key in known_basic_renderers: + return renderer + elif key.startswith('grid') and key.endswith('Renderer'): + return renderer + + def _extract_channel_renderer(self, renderer): + channel_id = self.ucid_or_none(renderer['channelId']) + title = self._get_text(renderer, 'title') + channel_url = format_field(channel_id, None, 'https://www.youtube.com/channel/%s', default=None) + channel_handle = self.handle_from_url( + traverse_obj(renderer, ( + 'navigationEndpoint', (('commandMetadata', 'webCommandMetadata', 'url'), + ('browseEndpoint', 'canonicalBaseUrl')), + {str}), get_all=False)) + if not channel_handle: + # As of 2023-06-01, YouTube sets subscriberCountText to the handle in search + channel_handle = self.handle_or_none(self._get_text(renderer, 'subscriberCountText')) + return { + '_type': 'url', + 'url': channel_url, + 'id': channel_id, + 'ie_key': YoutubeTabIE.ie_key(), + 'channel': title, + 'uploader': title, + 'channel_id': channel_id, + 'channel_url': channel_url, + 'title': title, + 'uploader_id': channel_handle, + 'uploader_url': format_field(channel_handle, None, 'https://www.youtube.com/%s', default=None), + # See above. YouTube sets videoCountText to the subscriber text in search channel renderers. + # However, in feed/channels this is set correctly to the subscriber count + 'channel_follower_count': traverse_obj( + renderer, 'subscriberCountText', 'videoCountText', expected_type=self._get_count), + 'thumbnails': self._extract_thumbnails(renderer, 'thumbnail'), + 'playlist_count': ( + # videoCountText may be the subscriber count + self._get_count(renderer, 'videoCountText') + if self._get_count(renderer, 'subscriberCountText') is not None else None), + 'description': self._get_text(renderer, 'descriptionSnippet'), + 'channel_is_verified': True if self._has_badge( + self._extract_badges(traverse_obj(renderer, 'ownerBadges')), BadgeType.VERIFIED) else None, + } + + def _grid_entries(self, grid_renderer): + for item in grid_renderer['items']: + if not isinstance(item, dict): + continue + renderer = self._extract_basic_item_renderer(item) + if not isinstance(renderer, dict): + continue + title = self._get_text(renderer, 'title') + + # playlist + playlist_id = renderer.get('playlistId') + if playlist_id: + yield self.url_result( + 'https://www.youtube.com/playlist?list=%s' % playlist_id, + ie=YoutubeTabIE.ie_key(), video_id=playlist_id, + video_title=title) + continue + # video + video_id = renderer.get('videoId') + if video_id: + yield self._extract_video(renderer) + continue + # channel + channel_id = renderer.get('channelId') + if channel_id: + yield self._extract_channel_renderer(renderer) + continue + # generic endpoint URL support + ep_url = urljoin('https://www.youtube.com/', try_get( + renderer, lambda x: x['navigationEndpoint']['commandMetadata']['webCommandMetadata']['url'], + str)) + if ep_url: + for ie in (YoutubeTabIE, YoutubePlaylistIE, YoutubeIE): + if ie.suitable(ep_url): + yield self.url_result( + ep_url, ie=ie.ie_key(), video_id=ie._match_id(ep_url), video_title=title) + break + + def _music_reponsive_list_entry(self, renderer): + video_id = traverse_obj(renderer, ('playlistItemData', 'videoId')) + if video_id: + title = traverse_obj(renderer, ( + 'flexColumns', 0, 'musicResponsiveListItemFlexColumnRenderer', + 'text', 'runs', 0, 'text')) + return self.url_result(f'https://music.youtube.com/watch?v={video_id}', + ie=YoutubeIE.ie_key(), video_id=video_id, title=title) + playlist_id = traverse_obj(renderer, ('navigationEndpoint', 'watchEndpoint', 'playlistId')) + if playlist_id: + video_id = traverse_obj(renderer, ('navigationEndpoint', 'watchEndpoint', 'videoId')) + if video_id: + return self.url_result(f'https://music.youtube.com/watch?v={video_id}&list={playlist_id}', + ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + return self.url_result(f'https://music.youtube.com/playlist?list={playlist_id}', + ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + browse_id = traverse_obj(renderer, ('navigationEndpoint', 'browseEndpoint', 'browseId')) + if browse_id: + return self.url_result(f'https://music.youtube.com/browse/{browse_id}', + ie=YoutubeTabIE.ie_key(), video_id=browse_id) + + def _shelf_entries_from_content(self, shelf_renderer): + content = shelf_renderer.get('content') + if not isinstance(content, dict): + return + renderer = content.get('gridRenderer') or content.get('expandedShelfContentsRenderer') + if renderer: + # TODO: add support for nested playlists so each shelf is processed + # as separate playlist + # TODO: this includes only first N items + yield from self._grid_entries(renderer) + renderer = content.get('horizontalListRenderer') + if renderer: + # TODO + pass + + def _shelf_entries(self, shelf_renderer, skip_channels=False): + ep = try_get( + shelf_renderer, lambda x: x['endpoint']['commandMetadata']['webCommandMetadata']['url'], + str) + shelf_url = urljoin('https://www.youtube.com', ep) + if shelf_url: + # Skipping links to another channels, note that checking for + # endpoint.commandMetadata.webCommandMetadata.webPageTypwebPageType == WEB_PAGE_TYPE_CHANNEL + # will not work + if skip_channels and '/channels?' in shelf_url: + return + title = self._get_text(shelf_renderer, 'title') + yield self.url_result(shelf_url, video_title=title) + # Shelf may not contain shelf URL, fallback to extraction from content + yield from self._shelf_entries_from_content(shelf_renderer) + + def _playlist_entries(self, video_list_renderer): + for content in video_list_renderer['contents']: + if not isinstance(content, dict): + continue + renderer = content.get('playlistVideoRenderer') or content.get('playlistPanelVideoRenderer') + if not isinstance(renderer, dict): + continue + video_id = renderer.get('videoId') + if not video_id: + continue + yield self._extract_video(renderer) + + def _rich_entries(self, rich_grid_renderer): + renderer = traverse_obj( + rich_grid_renderer, + ('content', ('videoRenderer', 'reelItemRenderer', 'playlistRenderer')), get_all=False) or {} + video_id = renderer.get('videoId') + if video_id: + yield self._extract_video(renderer) + return + playlist_id = renderer.get('playlistId') + if playlist_id: + yield self.url_result( + f'https://www.youtube.com/playlist?list={playlist_id}', + ie=YoutubeTabIE.ie_key(), video_id=playlist_id, + video_title=self._get_text(renderer, 'title')) + return + + def _video_entry(self, video_renderer): + video_id = video_renderer.get('videoId') + if video_id: + return self._extract_video(video_renderer) + + def _hashtag_tile_entry(self, hashtag_tile_renderer): + url = urljoin('https://youtube.com', traverse_obj( + hashtag_tile_renderer, ('onTapCommand', 'commandMetadata', 'webCommandMetadata', 'url'))) + if url: + return self.url_result( + url, ie=YoutubeTabIE.ie_key(), title=self._get_text(hashtag_tile_renderer, 'hashtag')) + + def _post_thread_entries(self, post_thread_renderer): + post_renderer = try_get( + post_thread_renderer, lambda x: x['post']['backstagePostRenderer'], dict) + if not post_renderer: + return + # video attachment + video_renderer = try_get( + post_renderer, lambda x: x['backstageAttachment']['videoRenderer'], dict) or {} + video_id = video_renderer.get('videoId') + if video_id: + entry = self._extract_video(video_renderer) + if entry: + yield entry + # playlist attachment + playlist_id = try_get( + post_renderer, lambda x: x['backstageAttachment']['playlistRenderer']['playlistId'], str) + if playlist_id: + yield self.url_result( + 'https://www.youtube.com/playlist?list=%s' % playlist_id, + ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + # inline video links + runs = try_get(post_renderer, lambda x: x['contentText']['runs'], list) or [] + for run in runs: + if not isinstance(run, dict): + continue + ep_url = try_get( + run, lambda x: x['navigationEndpoint']['urlEndpoint']['url'], str) + if not ep_url: + continue + if not YoutubeIE.suitable(ep_url): + continue + ep_video_id = YoutubeIE._match_id(ep_url) + if video_id == ep_video_id: + continue + yield self.url_result(ep_url, ie=YoutubeIE.ie_key(), video_id=ep_video_id) + + def _post_thread_continuation_entries(self, post_thread_continuation): + contents = post_thread_continuation.get('contents') + if not isinstance(contents, list): + return + for content in contents: + renderer = content.get('backstagePostThreadRenderer') + if isinstance(renderer, dict): + yield from self._post_thread_entries(renderer) + continue + renderer = content.get('videoRenderer') + if isinstance(renderer, dict): + yield self._video_entry(renderer) + + r''' # unused + def _rich_grid_entries(self, contents): + for content in contents: + video_renderer = try_get(content, lambda x: x['richItemRenderer']['content']['videoRenderer'], dict) + if video_renderer: + entry = self._video_entry(video_renderer) + if entry: + yield entry + ''' + + def _report_history_entries(self, renderer): + for url in traverse_obj(renderer, ( + 'rows', ..., 'reportHistoryTableRowRenderer', 'cells', ..., + 'reportHistoryTableCellRenderer', 'cell', 'reportHistoryTableTextCellRenderer', 'text', 'runs', ..., + 'navigationEndpoint', 'commandMetadata', 'webCommandMetadata', 'url')): + yield self.url_result(urljoin('https://www.youtube.com', url), YoutubeIE) + + def _extract_entries(self, parent_renderer, continuation_list): + # continuation_list is modified in-place with continuation_list = [continuation_token] + continuation_list[:] = [None] + contents = try_get(parent_renderer, lambda x: x['contents'], list) or [] + for content in contents: + if not isinstance(content, dict): + continue + is_renderer = traverse_obj( + content, 'itemSectionRenderer', 'musicShelfRenderer', 'musicShelfContinuation', + expected_type=dict) + if not is_renderer: + if content.get('richItemRenderer'): + for entry in self._rich_entries(content['richItemRenderer']): + yield entry + continuation_list[0] = self._extract_continuation(parent_renderer) + elif content.get('reportHistorySectionRenderer'): # https://www.youtube.com/reporthistory + table = traverse_obj(content, ('reportHistorySectionRenderer', 'table', 'tableRenderer')) + yield from self._report_history_entries(table) + continuation_list[0] = self._extract_continuation(table) + continue + + isr_contents = try_get(is_renderer, lambda x: x['contents'], list) or [] + for isr_content in isr_contents: + if not isinstance(isr_content, dict): + continue + + known_renderers = { + 'playlistVideoListRenderer': self._playlist_entries, + 'gridRenderer': self._grid_entries, + 'reelShelfRenderer': self._grid_entries, + 'shelfRenderer': self._shelf_entries, + 'musicResponsiveListItemRenderer': lambda x: [self._music_reponsive_list_entry(x)], + 'backstagePostThreadRenderer': self._post_thread_entries, + 'videoRenderer': lambda x: [self._video_entry(x)], + 'playlistRenderer': lambda x: self._grid_entries({'items': [{'playlistRenderer': x}]}), + 'channelRenderer': lambda x: self._grid_entries({'items': [{'channelRenderer': x}]}), + 'hashtagTileRenderer': lambda x: [self._hashtag_tile_entry(x)], + 'richGridRenderer': lambda x: self._extract_entries(x, continuation_list), + } + for key, renderer in isr_content.items(): + if key not in known_renderers: + continue + for entry in known_renderers[key](renderer): + if entry: + yield entry + continuation_list[0] = self._extract_continuation(renderer) + break + + if not continuation_list[0]: + continuation_list[0] = self._extract_continuation(is_renderer) + + if not continuation_list[0]: + continuation_list[0] = self._extract_continuation(parent_renderer) + + def _entries(self, tab, item_id, ytcfg, account_syncid, visitor_data): + continuation_list = [None] + extract_entries = lambda x: self._extract_entries(x, continuation_list) + tab_content = try_get(tab, lambda x: x['content'], dict) + if not tab_content: + return + parent_renderer = ( + try_get(tab_content, lambda x: x['sectionListRenderer'], dict) + or try_get(tab_content, lambda x: x['richGridRenderer'], dict) or {}) + yield from extract_entries(parent_renderer) + continuation = continuation_list[0] + seen_continuations = set() + for page_num in itertools.count(1): + if not continuation: + break + continuation_token = continuation.get('continuation') + if continuation_token is not None and continuation_token in seen_continuations: + self.write_debug('Detected YouTube feed looping - assuming end of feed.') + break + seen_continuations.add(continuation_token) + headers = self.generate_api_headers( + ytcfg=ytcfg, account_syncid=account_syncid, visitor_data=visitor_data) + response = self._extract_response( + item_id=f'{item_id} page {page_num}', + query=continuation, headers=headers, ytcfg=ytcfg, + check_get_keys=('continuationContents', 'onResponseReceivedActions', 'onResponseReceivedEndpoints')) + + if not response: + break + # Extracting updated visitor data is required to prevent an infinite extraction loop in some cases + # See: https://github.com/ytdl-org/youtube-dl/issues/28702 + visitor_data = self._extract_visitor_data(response) or visitor_data + + known_renderers = { + 'videoRenderer': (self._grid_entries, 'items'), # for membership tab + 'gridPlaylistRenderer': (self._grid_entries, 'items'), + 'gridVideoRenderer': (self._grid_entries, 'items'), + 'gridChannelRenderer': (self._grid_entries, 'items'), + 'playlistVideoRenderer': (self._playlist_entries, 'contents'), + 'itemSectionRenderer': (extract_entries, 'contents'), # for feeds + 'richItemRenderer': (extract_entries, 'contents'), # for hashtag + 'backstagePostThreadRenderer': (self._post_thread_continuation_entries, 'contents'), + 'reportHistoryTableRowRenderer': (self._report_history_entries, 'rows'), + 'playlistVideoListContinuation': (self._playlist_entries, None), + 'gridContinuation': (self._grid_entries, None), + 'itemSectionContinuation': (self._post_thread_continuation_entries, None), + 'sectionListContinuation': (extract_entries, None), # for feeds + } + + continuation_items = traverse_obj(response, ( + ('onResponseReceivedActions', 'onResponseReceivedEndpoints'), ..., + 'appendContinuationItemsAction', 'continuationItems' + ), 'continuationContents', get_all=False) + continuation_item = traverse_obj(continuation_items, 0, None, expected_type=dict, default={}) + + video_items_renderer = None + for key in continuation_item.keys(): + if key not in known_renderers: + continue + func, parent_key = known_renderers[key] + video_items_renderer = {parent_key: continuation_items} if parent_key else continuation_items + continuation_list = [None] + yield from func(video_items_renderer) + continuation = continuation_list[0] or self._extract_continuation(video_items_renderer) + + if not video_items_renderer: + break + + @staticmethod + def _extract_selected_tab(tabs, fatal=True): + for tab_renderer in tabs: + if tab_renderer.get('selected'): + return tab_renderer + if fatal: + raise ExtractorError('Unable to find selected tab') + + @staticmethod + def _extract_tab_renderers(response): + return traverse_obj( + response, ('contents', 'twoColumnBrowseResultsRenderer', 'tabs', ..., ('tabRenderer', 'expandableTabRenderer')), expected_type=dict) + + def _extract_from_tabs(self, item_id, ytcfg, data, tabs): + metadata = self._extract_metadata_from_tabs(item_id, data) + + selected_tab = self._extract_selected_tab(tabs) + metadata['title'] += format_field(selected_tab, 'title', ' - %s') + metadata['title'] += format_field(selected_tab, 'expandedText', ' - %s') + + return self.playlist_result( + self._entries( + selected_tab, metadata['id'], ytcfg, + self._extract_account_syncid(ytcfg, data), + self._extract_visitor_data(data, ytcfg)), + **metadata) + + def _extract_metadata_from_tabs(self, item_id, data): + info = {'id': item_id} + + metadata_renderer = traverse_obj(data, ('metadata', 'channelMetadataRenderer'), expected_type=dict) + if metadata_renderer: + channel_id = traverse_obj(metadata_renderer, ('externalId', {self.ucid_or_none}), + ('channelUrl', {self.ucid_from_url})) + info.update({ + 'channel': metadata_renderer.get('title'), + 'channel_id': channel_id, + }) + if info['channel_id']: + info['id'] = info['channel_id'] + else: + metadata_renderer = traverse_obj(data, ('metadata', 'playlistMetadataRenderer'), expected_type=dict) + + # We can get the uncropped banner/avatar by replacing the crop params with '=s0' + # See: https://github.com/yt-dlp/yt-dlp/issues/2237#issuecomment-1013694714 + def _get_uncropped(url): + return url_or_none((url or '').split('=')[0] + '=s0') + + avatar_thumbnails = self._extract_thumbnails(metadata_renderer, 'avatar') + if avatar_thumbnails: + uncropped_avatar = _get_uncropped(avatar_thumbnails[0]['url']) + if uncropped_avatar: + avatar_thumbnails.append({ + 'url': uncropped_avatar, + 'id': 'avatar_uncropped', + 'preference': 1 + }) + + channel_banners = self._extract_thumbnails( + data, ('header', ..., ('banner', 'mobileBanner', 'tvBanner'))) + for banner in channel_banners: + banner['preference'] = -10 + + if channel_banners: + uncropped_banner = _get_uncropped(channel_banners[0]['url']) + if uncropped_banner: + channel_banners.append({ + 'url': uncropped_banner, + 'id': 'banner_uncropped', + 'preference': -5 + }) + + # Deprecated - remove primary_sidebar_renderer when layout discontinued + primary_sidebar_renderer = self._extract_sidebar_info_renderer(data, 'playlistSidebarPrimaryInfoRenderer') + playlist_header_renderer = traverse_obj(data, ('header', 'playlistHeaderRenderer'), expected_type=dict) + + primary_thumbnails = self._extract_thumbnails( + primary_sidebar_renderer, ('thumbnailRenderer', ('playlistVideoThumbnailRenderer', 'playlistCustomThumbnailRenderer'), 'thumbnail')) + playlist_thumbnails = self._extract_thumbnails( + playlist_header_renderer, ('playlistHeaderBanner', 'heroPlaylistThumbnailRenderer', 'thumbnail')) + + info.update({ + 'title': (traverse_obj(metadata_renderer, 'title') + or self._get_text(data, ('header', 'hashtagHeaderRenderer', 'hashtag')) + or info['id']), + 'availability': self._extract_availability(data), + 'channel_follower_count': self._get_count(data, ('header', ..., 'subscriberCountText')), + 'description': try_get(metadata_renderer, lambda x: x.get('description', '')), + 'tags': try_get(metadata_renderer or {}, lambda x: x.get('keywords', '').split()), + 'thumbnails': (primary_thumbnails or playlist_thumbnails) + avatar_thumbnails + channel_banners, + }) + + channel_handle = ( + traverse_obj(metadata_renderer, (('vanityChannelUrl', ('ownerUrls', ...)), {self.handle_from_url}), get_all=False) + or traverse_obj(data, ('header', ..., 'channelHandleText', {self.handle_or_none}), get_all=False)) + + if channel_handle: + info.update({ + 'uploader_id': channel_handle, + 'uploader_url': format_field(channel_handle, None, 'https://www.youtube.com/%s', default=None), + }) + + channel_badges = self._extract_badges(traverse_obj(data, ('header', ..., 'badges'), get_all=False)) + if self._has_badge(channel_badges, BadgeType.VERIFIED): + info['channel_is_verified'] = True + # Playlist stats is a text runs array containing [video count, view count, last updated]. + # last updated or (view count and last updated) may be missing. + playlist_stats = get_first( + (primary_sidebar_renderer, playlist_header_renderer), (('stats', 'briefStats', 'numVideosText'), )) + + last_updated_unix = self._parse_time_text( + self._get_text(playlist_stats, 2) # deprecated, remove when old layout discontinued + or self._get_text(playlist_header_renderer, ('byline', 1, 'playlistBylineRenderer', 'text'))) + info['modified_date'] = strftime_or_none(last_updated_unix) + + info['view_count'] = self._get_count(playlist_stats, 1) + if info['view_count'] is None: # 0 is allowed + info['view_count'] = self._get_count(playlist_header_renderer, 'viewCountText') + if info['view_count'] is None: + info['view_count'] = self._get_count(data, ( + 'contents', 'twoColumnBrowseResultsRenderer', 'tabs', ..., 'tabRenderer', 'content', 'sectionListRenderer', + 'contents', ..., 'itemSectionRenderer', 'contents', ..., 'channelAboutFullMetadataRenderer', 'viewCountText')) + + info['playlist_count'] = self._get_count(playlist_stats, 0) + if info['playlist_count'] is None: # 0 is allowed + info['playlist_count'] = self._get_count(playlist_header_renderer, ('byline', 0, 'playlistBylineRenderer', 'text')) + + if not info.get('channel_id'): + owner = traverse_obj(playlist_header_renderer, 'ownerText') + if not owner: # Deprecated + owner = traverse_obj( + self._extract_sidebar_info_renderer(data, 'playlistSidebarSecondaryInfoRenderer'), + ('videoOwner', 'videoOwnerRenderer', 'title')) + owner_text = self._get_text(owner) + browse_ep = traverse_obj(owner, ('runs', 0, 'navigationEndpoint', 'browseEndpoint')) or {} + info.update({ + 'channel': self._search_regex(r'^by (.+) and \d+ others?$', owner_text, 'uploader', default=owner_text), + 'channel_id': self.ucid_or_none(browse_ep.get('browseId')), + 'uploader_id': self.handle_from_url(urljoin('https://www.youtube.com', browse_ep.get('canonicalBaseUrl'))) + }) + + info.update({ + 'uploader': info['channel'], + 'channel_url': format_field(info.get('channel_id'), None, 'https://www.youtube.com/channel/%s', default=None), + 'uploader_url': format_field(info.get('uploader_id'), None, 'https://www.youtube.com/%s', default=None), + }) + + return info + + def _extract_inline_playlist(self, playlist, playlist_id, data, ytcfg): + first_id = last_id = response = None + for page_num in itertools.count(1): + videos = list(self._playlist_entries(playlist)) + if not videos: + return + start = next((i for i, v in enumerate(videos) if v['id'] == last_id), -1) + 1 + if start >= len(videos): + return + yield from videos[start:] + first_id = first_id or videos[0]['id'] + last_id = videos[-1]['id'] + watch_endpoint = try_get( + playlist, lambda x: x['contents'][-1]['playlistPanelVideoRenderer']['navigationEndpoint']['watchEndpoint']) + headers = self.generate_api_headers( + ytcfg=ytcfg, account_syncid=self._extract_account_syncid(ytcfg, data), + visitor_data=self._extract_visitor_data(response, data, ytcfg)) + query = { + 'playlistId': playlist_id, + 'videoId': watch_endpoint.get('videoId') or last_id, + 'index': watch_endpoint.get('index') or len(videos), + 'params': watch_endpoint.get('params') or 'OAE%3D' + } + response = self._extract_response( + item_id='%s page %d' % (playlist_id, page_num), + query=query, ep='next', headers=headers, ytcfg=ytcfg, + check_get_keys='contents' + ) + playlist = try_get( + response, lambda x: x['contents']['twoColumnWatchNextResults']['playlist']['playlist'], dict) + + def _extract_from_playlist(self, item_id, url, data, playlist, ytcfg): + title = playlist.get('title') or try_get( + data, lambda x: x['titleText']['simpleText'], str) + playlist_id = playlist.get('playlistId') or item_id + + # Delegating everything except mix playlists to regular tab-based playlist URL + playlist_url = urljoin(url, try_get( + playlist, lambda x: x['endpoint']['commandMetadata']['webCommandMetadata']['url'], + str)) + + # Some playlists are unviewable but YouTube still provides a link to the (broken) playlist page [1] + # [1] MLCT, RLTDwFCb4jeqaKWnciAYM-ZVHg + is_known_unviewable = re.fullmatch(r'MLCT|RLTD[\w-]{22}', playlist_id) + + if playlist_url and playlist_url != url and not is_known_unviewable: + return self.url_result( + playlist_url, ie=YoutubeTabIE.ie_key(), video_id=playlist_id, + video_title=title) + + return self.playlist_result( + self._extract_inline_playlist(playlist, playlist_id, data, ytcfg), + playlist_id=playlist_id, playlist_title=title) + + def _extract_availability(self, data): + """ + Gets the availability of a given playlist/tab. + Note: Unless YouTube tells us explicitly, we do not assume it is public + @param data: response + """ + sidebar_renderer = self._extract_sidebar_info_renderer(data, 'playlistSidebarPrimaryInfoRenderer') or {} + playlist_header_renderer = traverse_obj(data, ('header', 'playlistHeaderRenderer')) or {} + player_header_privacy = playlist_header_renderer.get('privacy') + + badges = self._extract_badges(traverse_obj(sidebar_renderer, 'badges')) + + # Personal playlists, when authenticated, have a dropdown visibility selector instead of a badge + privacy_setting_icon = get_first( + (playlist_header_renderer, sidebar_renderer), + ('privacyForm', 'dropdownFormFieldRenderer', 'dropdown', 'dropdownRenderer', 'entries', + lambda _, v: v['privacyDropdownItemRenderer']['isSelected'], 'privacyDropdownItemRenderer', 'icon', 'iconType'), + expected_type=str) + + microformats_is_unlisted = traverse_obj( + data, ('microformat', 'microformatDataRenderer', 'unlisted'), expected_type=bool) + + return ( + 'public' if ( + self._has_badge(badges, BadgeType.AVAILABILITY_PUBLIC) + or player_header_privacy == 'PUBLIC' + or privacy_setting_icon == 'PRIVACY_PUBLIC') + else self._availability( + is_private=( + self._has_badge(badges, BadgeType.AVAILABILITY_PRIVATE) + or player_header_privacy == 'PRIVATE' if player_header_privacy is not None + else privacy_setting_icon == 'PRIVACY_PRIVATE' if privacy_setting_icon is not None else None), + is_unlisted=( + self._has_badge(badges, BadgeType.AVAILABILITY_UNLISTED) + or player_header_privacy == 'UNLISTED' if player_header_privacy is not None + else privacy_setting_icon == 'PRIVACY_UNLISTED' if privacy_setting_icon is not None + else microformats_is_unlisted if microformats_is_unlisted is not None else None), + needs_subscription=self._has_badge(badges, BadgeType.AVAILABILITY_SUBSCRIPTION) or None, + needs_premium=self._has_badge(badges, BadgeType.AVAILABILITY_PREMIUM) or None, + needs_auth=False)) + + @staticmethod + def _extract_sidebar_info_renderer(data, info_renderer, expected_type=dict): + sidebar_renderer = try_get( + data, lambda x: x['sidebar']['playlistSidebarRenderer']['items'], list) or [] + for item in sidebar_renderer: + renderer = try_get(item, lambda x: x[info_renderer], expected_type) + if renderer: + return renderer + + def _reload_with_unavailable_videos(self, item_id, data, ytcfg): + """ + Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.) + """ + is_playlist = bool(traverse_obj( + data, ('metadata', 'playlistMetadataRenderer'), ('header', 'playlistHeaderRenderer'))) + if not is_playlist: + return + headers = self.generate_api_headers( + ytcfg=ytcfg, account_syncid=self._extract_account_syncid(ytcfg, data), + visitor_data=self._extract_visitor_data(data, ytcfg)) + query = { + 'params': 'wgYCCAA=', + 'browseId': f'VL{item_id}' + } + return self._extract_response( + item_id=item_id, headers=headers, query=query, + check_get_keys='contents', fatal=False, ytcfg=ytcfg, + note='Redownloading playlist API JSON with unavailable videos') + + @functools.cached_property + def skip_webpage(self): + return 'webpage' in self._configuration_arg('skip', ie_key=YoutubeTabIE.ie_key()) + + def _extract_webpage(self, url, item_id, fatal=True): + webpage, data = None, None + for retry in self.RetryManager(fatal=fatal): + try: + webpage = self._download_webpage(url, item_id, note='Downloading webpage') + data = self.extract_yt_initial_data(item_id, webpage or '', fatal=fatal) or {} + except ExtractorError as e: + if isinstance(e.cause, network_exceptions): + if not isinstance(e.cause, HTTPError) or e.cause.status not in (403, 429): + retry.error = e + continue + self._error_or_warning(e, fatal=fatal) + break + + try: + self._extract_and_report_alerts(data) + except ExtractorError as e: + self._error_or_warning(e, fatal=fatal) + break + + # Sometimes youtube returns a webpage with incomplete ytInitialData + # See: https://github.com/yt-dlp/yt-dlp/issues/116 + if not traverse_obj(data, 'contents', 'currentVideoEndpoint', 'onResponseReceivedActions'): + retry.error = ExtractorError('Incomplete yt initial data received') + continue + + return webpage, data + + def _report_playlist_authcheck(self, ytcfg, fatal=True): + """Use if failed to extract ytcfg (and data) from initial webpage""" + if not ytcfg and self.is_authenticated: + msg = 'Playlists that require authentication may not extract correctly without a successful webpage download' + if 'authcheck' not in self._configuration_arg('skip', ie_key=YoutubeTabIE.ie_key()) and fatal: + raise ExtractorError( + f'{msg}. If you are not downloading private content, or ' + 'your cookies are only for the first account and channel,' + ' pass "--extractor-args youtubetab:skip=authcheck" to skip this check', + expected=True) + self.report_warning(msg, only_once=True) + + def _extract_data(self, url, item_id, ytcfg=None, fatal=True, webpage_fatal=False, default_client='web'): + data = None + if not self.skip_webpage: + webpage, data = self._extract_webpage(url, item_id, fatal=webpage_fatal) + ytcfg = ytcfg or self.extract_ytcfg(item_id, webpage) + # Reject webpage data if redirected to home page without explicitly requesting + selected_tab = self._extract_selected_tab(self._extract_tab_renderers(data), fatal=False) or {} + if (url != 'https://www.youtube.com/feed/recommended' + and selected_tab.get('tabIdentifier') == 'FEwhat_to_watch' # Home page + and 'no-youtube-channel-redirect' not in self.get_param('compat_opts', [])): + msg = 'The channel/playlist does not exist and the URL redirected to youtube.com home page' + if fatal: + raise ExtractorError(msg, expected=True) + self.report_warning(msg, only_once=True) + if not data: + self._report_playlist_authcheck(ytcfg, fatal=fatal) + data = self._extract_tab_endpoint(url, item_id, ytcfg, fatal=fatal, default_client=default_client) + return data, ytcfg + + def _extract_tab_endpoint(self, url, item_id, ytcfg=None, fatal=True, default_client='web'): + headers = self.generate_api_headers(ytcfg=ytcfg, default_client=default_client) + resolve_response = self._extract_response( + item_id=item_id, query={'url': url}, check_get_keys='endpoint', headers=headers, ytcfg=ytcfg, fatal=fatal, + ep='navigation/resolve_url', note='Downloading API parameters API JSON', default_client=default_client) + endpoints = {'browseEndpoint': 'browse', 'watchEndpoint': 'next'} + for ep_key, ep in endpoints.items(): + params = try_get(resolve_response, lambda x: x['endpoint'][ep_key], dict) + if params: + return self._extract_response( + item_id=item_id, query=params, ep=ep, headers=headers, + ytcfg=ytcfg, fatal=fatal, default_client=default_client, + check_get_keys=('contents', 'currentVideoEndpoint', 'onResponseReceivedActions')) + err_note = 'Failed to resolve url (does the playlist exist?)' + if fatal: + raise ExtractorError(err_note, expected=True) + self.report_warning(err_note, item_id) + + _SEARCH_PARAMS = None + + def _search_results(self, query, params=NO_DEFAULT, default_client='web'): + data = {'query': query} + if params is NO_DEFAULT: + params = self._SEARCH_PARAMS + if params: + data['params'] = params + + content_keys = ( + ('contents', 'twoColumnSearchResultsRenderer', 'primaryContents', 'sectionListRenderer', 'contents'), + ('onResponseReceivedCommands', 0, 'appendContinuationItemsAction', 'continuationItems'), + # ytmusic search + ('contents', 'tabbedSearchResultsRenderer', 'tabs', 0, 'tabRenderer', 'content', 'sectionListRenderer', 'contents'), + ('continuationContents', ), + ) + display_id = f'query "{query}"' + check_get_keys = tuple({keys[0] for keys in content_keys}) + ytcfg = self._download_ytcfg(default_client, display_id) if not self.skip_webpage else {} + self._report_playlist_authcheck(ytcfg, fatal=False) + + continuation_list = [None] + search = None + for page_num in itertools.count(1): + data.update(continuation_list[0] or {}) + headers = self.generate_api_headers( + ytcfg=ytcfg, visitor_data=self._extract_visitor_data(search), default_client=default_client) + search = self._extract_response( + item_id=f'{display_id} page {page_num}', ep='search', query=data, + default_client=default_client, check_get_keys=check_get_keys, ytcfg=ytcfg, headers=headers) + slr_contents = traverse_obj(search, *content_keys) + yield from self._extract_entries({'contents': list(variadic(slr_contents))}, continuation_list) + if not continuation_list[0]: + break + + +class YoutubeTabIE(YoutubeTabBaseInfoExtractor): + IE_DESC = 'YouTube Tabs' + _VALID_URL = r'''(?x: + https?:// + (?!consent\.)(?:\w+\.)? + (?: + youtube(?:kids)?\.com| + %(invidious)s + )/ + (?: + (?P<channel_type>channel|c|user|browse)/| + (?P<not_channel> + feed/|hashtag/| + (?:playlist|watch)\?.*?\blist= + )| + (?!(?:%(reserved_names)s)\b) # Direct URLs + ) + (?P<id>[^/?\#&]+) + )''' % { + 'reserved_names': YoutubeBaseInfoExtractor._RESERVED_NAMES, + 'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES), + } + IE_NAME = 'youtube:tab' + + _TESTS = [{ + 'note': 'playlists, multipage', + 'url': 'https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid', + 'playlist_mincount': 94, + 'info_dict': { + 'id': 'UCqj7Cz7revf5maW9g5pgNcg', + 'title': 'Igor Kleiner - Playlists', + 'description': 'md5:be97ee0f14ee314f1f002cf187166ee2', + 'uploader': 'Igor Kleiner', + 'uploader_id': '@IgorDataScience', + 'uploader_url': 'https://www.youtube.com/@IgorDataScience', + 'channel': 'Igor Kleiner', + 'channel_id': 'UCqj7Cz7revf5maW9g5pgNcg', + 'tags': ['"критичеÑкое', 'мышление"', '"наука', 'проÑто"', 'математика', '"анализ', 'данных"'], + 'channel_url': 'https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcg', + 'channel_follower_count': int + }, + }, { + 'note': 'playlists, multipage, different order', + 'url': 'https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd', + 'playlist_mincount': 94, + 'info_dict': { + 'id': 'UCqj7Cz7revf5maW9g5pgNcg', + 'title': 'Igor Kleiner - Playlists', + 'description': 'md5:be97ee0f14ee314f1f002cf187166ee2', + 'uploader': 'Igor Kleiner', + 'uploader_id': '@IgorDataScience', + 'uploader_url': 'https://www.youtube.com/@IgorDataScience', + 'tags': ['"критичеÑкое', 'мышление"', '"наука', 'проÑто"', 'математика', '"анализ', 'данных"'], + 'channel_id': 'UCqj7Cz7revf5maW9g5pgNcg', + 'channel': 'Igor Kleiner', + 'channel_url': 'https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcg', + 'channel_follower_count': int + }, + }, { + 'note': 'playlists, series', + 'url': 'https://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3', + 'playlist_mincount': 5, + 'info_dict': { + 'id': 'UCYO_jab_esuFRV4b17AJtAw', + 'title': '3Blue1Brown - Playlists', + 'description': 'md5:e1384e8a133307dd10edee76e875d62f', + 'channel_url': 'https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw', + 'channel': '3Blue1Brown', + 'channel_id': 'UCYO_jab_esuFRV4b17AJtAw', + 'uploader_id': '@3blue1brown', + 'uploader_url': 'https://www.youtube.com/@3blue1brown', + 'uploader': '3Blue1Brown', + 'tags': ['Mathematics'], + 'channel_follower_count': int, + 'channel_is_verified': True, + }, + }, { + 'note': 'playlists, singlepage', + 'url': 'https://www.youtube.com/user/ThirstForScience/playlists', + 'playlist_mincount': 4, + 'info_dict': { + 'id': 'UCAEtajcuhQ6an9WEzY9LEMQ', + 'title': 'ThirstForScience - Playlists', + 'description': 'md5:609399d937ea957b0f53cbffb747a14c', + 'uploader': 'ThirstForScience', + 'uploader_url': 'https://www.youtube.com/@ThirstForScience', + 'uploader_id': '@ThirstForScience', + 'channel_id': 'UCAEtajcuhQ6an9WEzY9LEMQ', + 'channel_url': 'https://www.youtube.com/channel/UCAEtajcuhQ6an9WEzY9LEMQ', + 'tags': 'count:13', + 'channel': 'ThirstForScience', + 'channel_follower_count': int + } + }, { + 'url': 'https://www.youtube.com/c/ChristophLaimer/playlists', + 'only_matching': True, + }, { + 'note': 'basic, single video playlist', + 'url': 'https://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc', + 'info_dict': { + 'id': 'PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc', + 'title': 'youtube-dl public playlist', + 'description': '', + 'tags': [], + 'view_count': int, + 'modified_date': '20201130', + 'channel': 'Sergey M.', + 'channel_id': 'UCmlqkdCBesrv2Lak1mF_MxA', + 'channel_url': 'https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxA', + 'availability': 'public', + 'uploader': 'Sergey M.', + 'uploader_url': 'https://www.youtube.com/@sergeym.6173', + 'uploader_id': '@sergeym.6173', + }, + 'playlist_count': 1, + }, { + 'note': 'empty playlist', + 'url': 'https://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xf', + 'info_dict': { + 'id': 'PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xf', + 'title': 'youtube-dl empty playlist', + 'tags': [], + 'channel': 'Sergey M.', + 'description': '', + 'modified_date': '20160902', + 'channel_id': 'UCmlqkdCBesrv2Lak1mF_MxA', + 'channel_url': 'https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxA', + 'availability': 'public', + 'uploader_url': 'https://www.youtube.com/@sergeym.6173', + 'uploader_id': '@sergeym.6173', + 'uploader': 'Sergey M.', + }, + 'playlist_count': 0, + }, { + 'note': 'Home tab', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/featured', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Home', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'uploader': 'lex will', + 'uploader_id': '@lexwill718', + 'channel': 'lex will', + 'tags': ['bible', 'history', 'prophesy'], + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_follower_count': int + }, + 'playlist_mincount': 2, + }, { + 'note': 'Videos tab', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Videos', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'uploader': 'lex will', + 'uploader_id': '@lexwill718', + 'tags': ['bible', 'history', 'prophesy'], + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'channel': 'lex will', + 'channel_follower_count': int + }, + 'playlist_mincount': 975, + }, { + 'note': 'Videos tab, sorted by popular', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos?view=0&sort=p&flow=grid', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Videos', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'uploader': 'lex will', + 'uploader_id': '@lexwill718', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'channel': 'lex will', + 'tags': ['bible', 'history', 'prophesy'], + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_follower_count': int + }, + 'playlist_mincount': 199, + }, { + 'note': 'Playlists tab', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlists', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Playlists', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'uploader': 'lex will', + 'uploader_id': '@lexwill718', + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'channel': 'lex will', + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'tags': ['bible', 'history', 'prophesy'], + 'channel_follower_count': int + }, + 'playlist_mincount': 17, + }, { + 'note': 'Community tab', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/community', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Community', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'channel': 'lex will', + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'tags': ['bible', 'history', 'prophesy'], + 'channel_follower_count': int, + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'uploader_id': '@lexwill718', + 'uploader': 'lex will', + }, + 'playlist_mincount': 18, + }, { + 'note': 'Channels tab', + 'url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/channels', + 'info_dict': { + 'id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'title': 'lex will - Channels', + 'description': 'md5:2163c5d0ff54ed5f598d6a7e6211e488', + 'channel': 'lex will', + 'channel_url': 'https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w', + 'channel_id': 'UCKfVa3S1e4PHvxWcwyMMg8w', + 'tags': ['bible', 'history', 'prophesy'], + 'channel_follower_count': int, + 'uploader_url': 'https://www.youtube.com/@lexwill718', + 'uploader_id': '@lexwill718', + 'uploader': 'lex will', + }, + 'playlist_mincount': 12, + }, { + 'note': 'Search tab', + 'url': 'https://www.youtube.com/c/3blue1brown/search?query=linear%20algebra', + 'playlist_mincount': 40, + 'info_dict': { + 'id': 'UCYO_jab_esuFRV4b17AJtAw', + 'title': '3Blue1Brown - Search - linear algebra', + 'description': 'md5:e1384e8a133307dd10edee76e875d62f', + 'channel_url': 'https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw', + 'tags': ['Mathematics'], + 'channel': '3Blue1Brown', + 'channel_id': 'UCYO_jab_esuFRV4b17AJtAw', + 'channel_follower_count': int, + 'uploader_url': 'https://www.youtube.com/@3blue1brown', + 'uploader_id': '@3blue1brown', + 'uploader': '3Blue1Brown', + 'channel_is_verified': True, + }, + }, { + 'url': 'https://invidio.us/channel/UCmlqkdCBesrv2Lak1mF_MxA', + 'only_matching': True, + }, { + 'url': 'https://www.youtubekids.com/channel/UCmlqkdCBesrv2Lak1mF_MxA', + 'only_matching': True, + }, { + 'url': 'https://music.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxA', + 'only_matching': True, + }, { + 'note': 'Playlist with deleted videos (#651). As a bonus, the video #51 is also twice in this list.', + 'url': 'https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC', + 'info_dict': { + 'title': '29C3: Not my department', + 'id': 'PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC', + 'description': 'md5:a14dc1a8ef8307a9807fe136a0660268', + 'tags': [], + 'view_count': int, + 'modified_date': '20150605', + 'channel_id': 'UCEPzS1rYsrkqzSLNp76nrcg', + 'channel_url': 'https://www.youtube.com/channel/UCEPzS1rYsrkqzSLNp76nrcg', + 'channel': 'Christiaan008', + 'availability': 'public', + 'uploader_id': '@ChRiStIaAn008', + 'uploader': 'Christiaan008', + 'uploader_url': 'https://www.youtube.com/@ChRiStIaAn008', + }, + 'playlist_count': 96, + }, { + 'note': 'Large playlist', + 'url': 'https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0Q', + 'info_dict': { + 'title': 'Uploads from Cauchemar', + 'id': 'UUBABnxM4Ar9ten8Mdjj1j0Q', + 'channel_url': 'https://www.youtube.com/channel/UCBABnxM4Ar9ten8Mdjj1j0Q', + 'tags': [], + 'modified_date': r're:\d{8}', + 'channel': 'Cauchemar', + 'view_count': int, + 'description': '', + 'channel_id': 'UCBABnxM4Ar9ten8Mdjj1j0Q', + 'availability': 'public', + 'uploader_id': '@Cauchemar89', + 'uploader': 'Cauchemar', + 'uploader_url': 'https://www.youtube.com/@Cauchemar89', + }, + 'playlist_mincount': 1123, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden'], + }, { + 'note': 'even larger playlist, 8832 videos', + 'url': 'http://www.youtube.com/user/NASAgovVideo/videos', + 'only_matching': True, + }, { + 'note': 'Buggy playlist: the webpage has a "Load more" button but it doesn\'t have more videos', + 'url': 'https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aA', + 'info_dict': { + 'title': 'Uploads from Interstellar Movie', + 'id': 'UUXw-G3eDE9trcvY2sBMM_aA', + 'tags': [], + 'view_count': int, + 'channel_id': 'UCXw-G3eDE9trcvY2sBMM_aA', + 'channel_url': 'https://www.youtube.com/channel/UCXw-G3eDE9trcvY2sBMM_aA', + 'channel': 'Interstellar Movie', + 'description': '', + 'modified_date': r're:\d{8}', + 'availability': 'public', + 'uploader_id': '@InterstellarMovie', + 'uploader': 'Interstellar Movie', + 'uploader_url': 'https://www.youtube.com/@InterstellarMovie', + }, + 'playlist_mincount': 21, + }, { + 'note': 'Playlist with "show unavailable videos" button', + 'url': 'https://www.youtube.com/playlist?list=UUTYLiWFZy8xtPwxFwX9rV7Q', + 'info_dict': { + 'title': 'Uploads from Phim Siêu Nhân Nhật Bản', + 'id': 'UUTYLiWFZy8xtPwxFwX9rV7Q', + 'view_count': int, + 'channel': 'Phim Siêu Nhân Nhật Bản', + 'tags': [], + 'description': '', + 'channel_url': 'https://www.youtube.com/channel/UCTYLiWFZy8xtPwxFwX9rV7Q', + 'channel_id': 'UCTYLiWFZy8xtPwxFwX9rV7Q', + 'modified_date': r're:\d{8}', + 'availability': 'public', + 'uploader_url': 'https://www.youtube.com/@phimsieunhannhatban', + 'uploader_id': '@phimsieunhannhatban', + 'uploader': 'Phim Siêu Nhân Nhật Bản', + }, + 'playlist_mincount': 200, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden'], + }, { + 'note': 'Playlist with unavailable videos in page 7', + 'url': 'https://www.youtube.com/playlist?list=UU8l9frL61Yl5KFOl87nIm2w', + 'info_dict': { + 'title': 'Uploads from BlankTV', + 'id': 'UU8l9frL61Yl5KFOl87nIm2w', + 'channel': 'BlankTV', + 'channel_url': 'https://www.youtube.com/channel/UC8l9frL61Yl5KFOl87nIm2w', + 'channel_id': 'UC8l9frL61Yl5KFOl87nIm2w', + 'view_count': int, + 'tags': [], + 'modified_date': r're:\d{8}', + 'description': '', + 'availability': 'public', + 'uploader_id': '@blanktv', + 'uploader': 'BlankTV', + 'uploader_url': 'https://www.youtube.com/@blanktv', + }, + 'playlist_mincount': 1000, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden'], + }, { + 'note': 'https://github.com/ytdl-org/youtube-dl/issues/21844', + 'url': 'https://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5ba', + 'info_dict': { + 'title': 'Data Analysis with Dr Mike Pound', + 'id': 'PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5ba', + 'description': 'md5:7f567c574d13d3f8c0954d9ffee4e487', + 'tags': [], + 'view_count': int, + 'channel_id': 'UC9-y-6csu5WGm29I7JiwpnA', + 'channel_url': 'https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnA', + 'channel': 'Computerphile', + 'availability': 'public', + 'modified_date': '20190712', + 'uploader_id': '@Computerphile', + 'uploader': 'Computerphile', + 'uploader_url': 'https://www.youtube.com/@Computerphile', + }, + 'playlist_mincount': 11, + }, { + 'url': 'https://invidio.us/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc', + 'only_matching': True, + }, { + 'note': 'Playlist URL that does not actually serve a playlist', + 'url': 'https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4', + 'info_dict': { + 'id': 'FqZTN594JQw', + 'ext': 'webm', + 'title': "Smiley's People 01 detective, Adventure Series, Action", + 'upload_date': '20150526', + 'license': 'Standard YouTube License', + 'description': 'md5:507cdcb5a49ac0da37a920ece610be80', + 'categories': ['People & Blogs'], + 'tags': list, + 'view_count': int, + 'like_count': int, + }, + 'params': { + 'skip_download': True, + }, + 'skip': 'This video is not available.', + 'add_ie': [YoutubeIE.ie_key()], + }, { + 'url': 'https://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0g', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMM', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ/live', + 'info_dict': { + 'id': 'hGkQjiJLjWQ', # This will keep changing + 'ext': 'mp4', + 'title': str, + 'upload_date': r're:\d{8}', + 'description': str, + 'categories': ['News & Politics'], + 'tags': list, + 'like_count': int, + 'release_timestamp': int, + 'channel': 'Sky News', + 'channel_id': 'UCoMdktPbSTixAyNGwb-UYkQ', + 'age_limit': 0, + 'view_count': int, + 'thumbnail': r're:https?://i\.ytimg\.com/vi/[^/]+/maxresdefault(?:_live)?\.jpg', + 'playable_in_embed': True, + 'release_date': r're:\d+', + 'availability': 'public', + 'live_status': 'is_live', + 'channel_url': 'https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ', + 'channel_follower_count': int, + 'concurrent_view_count': int, + 'uploader_url': 'https://www.youtube.com/@SkyNews', + 'uploader_id': '@SkyNews', + 'uploader': 'Sky News', + 'channel_is_verified': True, + }, + 'params': { + 'skip_download': True, + }, + 'expected_warnings': ['Ignoring subtitle tracks found in '], + }, { + 'url': 'https://www.youtube.com/user/TheYoungTurks/live', + 'info_dict': { + 'id': 'a48o2S1cPoo', + 'ext': 'mp4', + 'title': 'The Young Turks - Live Main Show', + 'upload_date': '20150715', + 'license': 'Standard YouTube License', + 'description': 'md5:438179573adcdff3c97ebb1ee632b891', + 'categories': ['News & Politics'], + 'tags': ['Cenk Uygur (TV Program Creator)', 'The Young Turks (Award-Winning Work)', 'Talk Show (TV Genre)'], + 'like_count': int, + }, + 'params': { + 'skip_download': True, + }, + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/live', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/c/CommanderVideoHq/live', + 'only_matching': True, + }, { + 'note': 'A channel that is not live. Should raise error', + 'url': 'https://www.youtube.com/user/numberphile/live', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/feed/trending', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/feed/library', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/feed/history', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/feed/subscriptions', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/feed/watch_later', + 'only_matching': True, + }, { + 'note': 'Recommended - redirects to home page.', + 'url': 'https://www.youtube.com/feed/recommended', + 'only_matching': True, + }, { + 'note': 'inline playlist with not always working continuations', + 'url': 'https://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7C', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/course', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/zsecurity', + 'only_matching': True, + }, { + 'url': 'http://www.youtube.com/NASAgovVideo/videos', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/TheYoungTurks/live', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/hashtag/cctv9', + 'info_dict': { + 'id': 'cctv9', + 'title': '#cctv9', + 'tags': [], + }, + 'playlist_mincount': 300, # not consistent but should be over 300 + }, { + 'url': 'https://www.youtube.com/watch?list=PLW4dVinRY435CBE_JD3t-0SRXKfnZHS1P&feature=youtu.be&v=M9cJMXmQ_ZU', + 'only_matching': True, + }, { + 'note': 'Requires Premium: should request additional YTM-info webpage (and have format 141) for videos in playlist', + 'url': 'https://music.youtube.com/playlist?list=PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq', + 'only_matching': True + }, { + 'note': '/browse/ should redirect to /channel/', + 'url': 'https://music.youtube.com/browse/UC1a8OFewdjuLq6KlF8M_8Ng', + 'only_matching': True + }, { + 'note': 'VLPL, should redirect to playlist?list=PL...', + 'url': 'https://music.youtube.com/browse/VLPLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq', + 'info_dict': { + 'id': 'PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq', + 'description': 'Providing you with copyright free / safe music for gaming, live streaming, studying and more!', + 'title': 'NCS : All Releases 💿', + 'channel_url': 'https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNg', + 'modified_date': r're:\d{8}', + 'view_count': int, + 'channel_id': 'UC_aEa8K-EOJ3D6gOs7HcyNg', + 'tags': [], + 'channel': 'NoCopyrightSounds', + 'availability': 'public', + 'uploader_url': 'https://www.youtube.com/@NoCopyrightSounds', + 'uploader': 'NoCopyrightSounds', + 'uploader_id': '@NoCopyrightSounds', + }, + 'playlist_mincount': 166, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden', 'YouTube Music is not directly supported'], + }, { + # TODO: fix 'unviewable' issue with this playlist when reloading with unavailable videos + 'note': 'Topic, should redirect to playlist?list=UU...', + 'url': 'https://music.youtube.com/browse/UC9ALqqC4aIeG5iDs7i90Bfw', + 'info_dict': { + 'id': 'UU9ALqqC4aIeG5iDs7i90Bfw', + 'title': 'Uploads from Royalty Free Music - Topic', + 'tags': [], + 'channel_id': 'UC9ALqqC4aIeG5iDs7i90Bfw', + 'channel': 'Royalty Free Music - Topic', + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UC9ALqqC4aIeG5iDs7i90Bfw', + 'modified_date': r're:\d{8}', + 'description': '', + 'availability': 'public', + 'uploader': 'Royalty Free Music - Topic', + }, + 'playlist_mincount': 101, + 'expected_warnings': ['YouTube Music is not directly supported', r'[Uu]navailable videos (are|will be) hidden'], + }, { + # Destination channel with only a hidden self tab (tab id is UCtFRv9O2AHqOZjjynzrv-xg) + # Treat as a general feed + 'url': 'https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xg', + 'info_dict': { + 'id': 'UCtFRv9O2AHqOZjjynzrv-xg', + 'title': 'UCtFRv9O2AHqOZjjynzrv-xg', + 'tags': [], + }, + 'playlist_mincount': 9, + }, { + 'note': 'Youtube music Album', + 'url': 'https://music.youtube.com/browse/MPREb_gTAcphH99wE', + 'info_dict': { + 'id': 'OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0', + 'title': 'Album - Royalty Free Music Library V2 (50 Songs)', + 'tags': [], + 'view_count': int, + 'description': '', + 'availability': 'unlisted', + 'modified_date': r're:\d{8}', + }, + 'playlist_count': 50, + 'expected_warnings': ['YouTube Music is not directly supported'], + }, { + 'note': 'unlisted single video playlist', + 'url': 'https://www.youtube.com/playlist?list=PLwL24UFy54GrB3s2KMMfjZscDi1x5Dajf', + 'info_dict': { + 'id': 'PLwL24UFy54GrB3s2KMMfjZscDi1x5Dajf', + 'title': 'yt-dlp unlisted playlist test', + 'availability': 'unlisted', + 'tags': [], + 'modified_date': '20220418', + 'channel': 'colethedj', + 'view_count': int, + 'description': '', + 'channel_id': 'UC9zHu_mHU96r19o-wV5Qs1Q', + 'channel_url': 'https://www.youtube.com/channel/UC9zHu_mHU96r19o-wV5Qs1Q', + 'uploader_url': 'https://www.youtube.com/@colethedj1894', + 'uploader_id': '@colethedj1894', + 'uploader': 'colethedj', + }, + 'playlist': [{ + 'info_dict': { + 'title': 'youtube-dl test video "\'/\\ä↭ð•', + 'id': 'BaW_jenozKc', + '_type': 'url', + 'ie_key': 'Youtube', + 'duration': 10, + 'channel_id': 'UCLqxVugv74EIW3VWh2NOa3Q', + 'channel_url': 'https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Q', + 'view_count': int, + 'url': 'https://www.youtube.com/watch?v=BaW_jenozKc', + 'channel': 'Philipp Hagemeister', + 'uploader_id': '@PhilippHagemeister', + 'uploader_url': 'https://www.youtube.com/@PhilippHagemeister', + 'uploader': 'Philipp Hagemeister', + } + }], + 'playlist_count': 1, + 'params': {'extract_flat': True}, + }, { + 'note': 'API Fallback: Recommended - redirects to home page. Requires visitorData', + 'url': 'https://www.youtube.com/feed/recommended', + 'info_dict': { + 'id': 'recommended', + 'title': 'recommended', + 'tags': [], + }, + 'playlist_mincount': 50, + 'params': { + 'skip_download': True, + 'extractor_args': {'youtubetab': {'skip': ['webpage']}} + }, + }, { + 'note': 'API Fallback: /videos tab, sorted by oldest first', + 'url': 'https://www.youtube.com/user/theCodyReeder/videos?view=0&sort=da&flow=grid', + 'info_dict': { + 'id': 'UCu6mSoMNzHQiBIOCkHUa2Aw', + 'title': 'Cody\'sLab - Videos', + 'description': 'md5:d083b7c2f0c67ee7a6c74c3e9b4243fa', + 'channel': 'Cody\'sLab', + 'channel_id': 'UCu6mSoMNzHQiBIOCkHUa2Aw', + 'tags': [], + 'channel_url': 'https://www.youtube.com/channel/UCu6mSoMNzHQiBIOCkHUa2Aw', + 'channel_follower_count': int + }, + 'playlist_mincount': 650, + 'params': { + 'skip_download': True, + 'extractor_args': {'youtubetab': {'skip': ['webpage']}} + }, + 'skip': 'Query for sorting no longer works', + }, { + 'note': 'API Fallback: Topic, should redirect to playlist?list=UU...', + 'url': 'https://music.youtube.com/browse/UC9ALqqC4aIeG5iDs7i90Bfw', + 'info_dict': { + 'id': 'UU9ALqqC4aIeG5iDs7i90Bfw', + 'title': 'Uploads from Royalty Free Music - Topic', + 'modified_date': r're:\d{8}', + 'channel_id': 'UC9ALqqC4aIeG5iDs7i90Bfw', + 'description': '', + 'channel_url': 'https://www.youtube.com/channel/UC9ALqqC4aIeG5iDs7i90Bfw', + 'tags': [], + 'channel': 'Royalty Free Music - Topic', + 'view_count': int, + 'availability': 'public', + 'uploader': 'Royalty Free Music - Topic', + }, + 'playlist_mincount': 101, + 'params': { + 'skip_download': True, + 'extractor_args': {'youtubetab': {'skip': ['webpage']}} + }, + 'expected_warnings': ['YouTube Music is not directly supported', r'[Uu]navailable videos (are|will be) hidden'], + }, { + 'note': 'non-standard redirect to regional channel', + 'url': 'https://www.youtube.com/channel/UCwVVpHQ2Cs9iGJfpdFngePQ', + 'only_matching': True + }, { + 'note': 'collaborative playlist (uploader name in the form "by <uploader> and x other(s)")', + 'url': 'https://www.youtube.com/playlist?list=PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6', + 'info_dict': { + 'id': 'PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6', + 'modified_date': '20220407', + 'channel_url': 'https://www.youtube.com/channel/UCKcqXmCcyqnhgpA5P0oHH_Q', + 'tags': [], + 'availability': 'unlisted', + 'channel_id': 'UCKcqXmCcyqnhgpA5P0oHH_Q', + 'channel': 'pukkandan', + 'description': 'Test for collaborative playlist', + 'title': 'yt-dlp test - collaborative playlist', + 'view_count': int, + 'uploader_url': 'https://www.youtube.com/@pukkandan', + 'uploader_id': '@pukkandan', + 'uploader': 'pukkandan', + }, + 'playlist_mincount': 2 + }, { + 'note': 'translated tab name', + 'url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlists', + 'info_dict': { + 'id': 'UCiu-3thuViMebBjw_5nWYrA', + 'tags': [], + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'description': 'test description', + 'title': 'cole-dlp-test-acc - å†ç”Ÿãƒªã‚¹ãƒˆ', + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'channel': 'cole-dlp-test-acc', + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'playlist_mincount': 1, + 'params': {'extractor_args': {'youtube': {'lang': ['ja']}}}, + 'expected_warnings': ['Preferring "ja"'], + }, { + # XXX: this should really check flat playlist entries, but the test suite doesn't support that + 'note': 'preferred lang set with playlist with translated video titles', + 'url': 'https://www.youtube.com/playlist?list=PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0', + 'info_dict': { + 'id': 'PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0', + 'tags': [], + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'channel': 'cole-dlp-test-acc', + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'description': 'test', + 'title': 'dlp test playlist', + 'availability': 'public', + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'playlist_mincount': 1, + 'params': {'extractor_args': {'youtube': {'lang': ['ja']}}}, + 'expected_warnings': ['Preferring "ja"'], + }, { + # shorts audio pivot for 2GtVksBMYFM. + 'url': 'https://www.youtube.com/feed/sfv_audio_pivot?bp=8gUrCikSJwoLMkd0VmtzQk1ZRk0SCzJHdFZrc0JNWUZNGgsyR3RWa3NCTVlGTQ==', + 'info_dict': { + 'id': 'sfv_audio_pivot', + 'title': 'sfv_audio_pivot', + 'tags': [], + }, + 'playlist_mincount': 50, + + }, { + # Channel with a real live tab (not to be mistaken with streams tab) + # Do not treat like it should redirect to live stream + 'url': 'https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/live', + 'info_dict': { + 'id': 'UCEH7P7kyJIkS_gJf93VYbmg', + 'title': 'UCEH7P7kyJIkS_gJf93VYbmg - Live', + 'tags': [], + }, + 'playlist_mincount': 20, + }, { + # Tab name is not the same as tab id + 'url': 'https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/letsplay', + 'info_dict': { + 'id': 'UCQvWX73GQygcwXOTSf_VDVg', + 'title': 'UCQvWX73GQygcwXOTSf_VDVg - Let\'s play', + 'tags': [], + }, + 'playlist_mincount': 8, + }, { + # Home tab id is literally home. Not to get mistaken with featured + 'url': 'https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/home', + 'info_dict': { + 'id': 'UCQvWX73GQygcwXOTSf_VDVg', + 'title': 'UCQvWX73GQygcwXOTSf_VDVg - Home', + 'tags': [], + }, + 'playlist_mincount': 8, + }, { + # Should get three playlists for videos, shorts and streams tabs + 'url': 'https://www.youtube.com/channel/UCK9V2B22uJYu3N7eR_BT9QA', + 'info_dict': { + 'id': 'UCK9V2B22uJYu3N7eR_BT9QA', + 'title': 'Polka Ch. 尾丸ãƒãƒ«ã‚«', + 'channel_follower_count': int, + 'channel_id': 'UCK9V2B22uJYu3N7eR_BT9QA', + 'channel_url': 'https://www.youtube.com/channel/UCK9V2B22uJYu3N7eR_BT9QA', + 'description': 'md5:e56b74b5bb7e9c701522162e9abfb822', + 'channel': 'Polka Ch. 尾丸ãƒãƒ«ã‚«', + 'tags': 'count:35', + 'uploader_url': 'https://www.youtube.com/@OmaruPolka', + 'uploader': 'Polka Ch. 尾丸ãƒãƒ«ã‚«', + 'uploader_id': '@OmaruPolka', + }, + 'playlist_count': 3, + }, { + # Shorts tab with channel with handle + # TODO: fix channel description + 'url': 'https://www.youtube.com/@NotJustBikes/shorts', + 'info_dict': { + 'id': 'UC0intLFzLaudFG-xAvUEO-A', + 'title': 'Not Just Bikes - Shorts', + 'tags': 'count:12', + 'channel_url': 'https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-A', + 'description': 'md5:26bc55af26855a608a5cf89dfa595c8d', + 'channel_follower_count': int, + 'channel_id': 'UC0intLFzLaudFG-xAvUEO-A', + 'channel': 'Not Just Bikes', + 'uploader_url': 'https://www.youtube.com/@NotJustBikes', + 'uploader': 'Not Just Bikes', + 'uploader_id': '@NotJustBikes', + }, + 'playlist_mincount': 10, + }, { + # Streams tab + 'url': 'https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sig/streams', + 'info_dict': { + 'id': 'UC3eYAvjCVwNHgkaGbXX3sig', + 'title': 'ä¸­æ‘æ‚ ä¸€ - Live', + 'tags': 'count:7', + 'channel_id': 'UC3eYAvjCVwNHgkaGbXX3sig', + 'channel_url': 'https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sig', + 'channel': 'ä¸­æ‘æ‚ ä¸€', + 'channel_follower_count': int, + 'description': 'md5:e744f6c93dafa7a03c0c6deecb157300', + 'uploader_url': 'https://www.youtube.com/@Yuichi-Nakamura', + 'uploader_id': '@Yuichi-Nakamura', + 'uploader': 'ä¸­æ‘æ‚ ä¸€', + }, + 'playlist_mincount': 60, + }, { + # Channel with no uploads and hence no videos, streams, shorts tabs or uploads playlist. This should fail. + # See test_youtube_lists + 'url': 'https://www.youtube.com/channel/UC2yXPzFejc422buOIzn_0CA', + 'only_matching': True, + }, { + # No uploads and no UCID given. Should fail with no uploads error + # See test_youtube_lists + 'url': 'https://www.youtube.com/news', + 'only_matching': True + }, { + # No videos tab but has a shorts tab + 'url': 'https://www.youtube.com/c/TKFShorts', + 'info_dict': { + 'id': 'UCgJ5_1F6yJhYLnyMszUdmUg', + 'title': 'Shorts Break - Shorts', + 'tags': 'count:48', + 'channel_id': 'UCgJ5_1F6yJhYLnyMszUdmUg', + 'channel': 'Shorts Break', + 'description': 'md5:6de33c5e7ba686e5f3efd4e19c7ef499', + 'channel_follower_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCgJ5_1F6yJhYLnyMszUdmUg', + 'uploader_url': 'https://www.youtube.com/@ShortsBreak_Official', + 'uploader': 'Shorts Break', + 'uploader_id': '@ShortsBreak_Official', + }, + 'playlist_mincount': 30, + }, { + # Trending Now Tab. tab id is empty + 'url': 'https://www.youtube.com/feed/trending', + 'info_dict': { + 'id': 'trending', + 'title': 'trending - Now', + 'tags': [], + }, + 'playlist_mincount': 30, + }, { + # Trending Gaming Tab. tab id is empty + 'url': 'https://www.youtube.com/feed/trending?bp=4gIcGhpnYW1pbmdfY29ycHVzX21vc3RfcG9wdWxhcg%3D%3D', + 'info_dict': { + 'id': 'trending', + 'title': 'trending - Gaming', + 'tags': [], + }, + 'playlist_mincount': 30, + }, { + # Shorts url result in shorts tab + # TODO: Fix channel id extraction + 'url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/shorts', + 'info_dict': { + 'id': 'UCiu-3thuViMebBjw_5nWYrA', + 'title': 'cole-dlp-test-acc - Shorts', + 'channel': 'cole-dlp-test-acc', + 'description': 'test description', + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'tags': [], + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'playlist': [{ + 'info_dict': { + # Channel data is not currently available for short renderers (as of 2023-03-01) + '_type': 'url', + 'ie_key': 'Youtube', + 'url': 'https://www.youtube.com/shorts/sSM9J5YH_60', + 'id': 'sSM9J5YH_60', + 'title': 'SHORT short', + 'view_count': int, + 'thumbnails': list, + } + }], + 'params': {'extract_flat': True}, + }, { + # Live video status should be extracted + 'url': 'https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/live', + 'info_dict': { + 'id': 'UCQvWX73GQygcwXOTSf_VDVg', + 'title': 'UCQvWX73GQygcwXOTSf_VDVg - Live', # TODO, should be Minecraft - Live or Minecraft - Topic - Live + 'tags': [] + }, + 'playlist': [{ + 'info_dict': { + '_type': 'url', + 'ie_key': 'Youtube', + 'url': 'startswith:https://www.youtube.com/watch?v=', + 'id': str, + 'title': str, + 'live_status': 'is_live', + 'channel_id': str, + 'channel_url': str, + 'concurrent_view_count': int, + 'channel': str, + 'uploader': str, + 'uploader_url': str, + 'uploader_id': str, + 'channel_is_verified': bool, # this will keep changing + } + }], + 'params': {'extract_flat': True, 'playlist_items': '1'}, + 'playlist_mincount': 1 + }, { + # Channel renderer metadata. Contains number of videos on the channel + 'url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/channels', + 'info_dict': { + 'id': 'UCiu-3thuViMebBjw_5nWYrA', + 'title': 'cole-dlp-test-acc - Channels', + 'channel': 'cole-dlp-test-acc', + 'description': 'test description', + 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA', + 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA', + 'tags': [], + 'uploader_url': 'https://www.youtube.com/@coletdjnz', + 'uploader_id': '@coletdjnz', + 'uploader': 'cole-dlp-test-acc', + }, + 'playlist': [{ + 'info_dict': { + '_type': 'url', + 'ie_key': 'YoutubeTab', + 'url': 'https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5Yw', + 'id': 'UC-lHJZR3Gqxm24_Vd_AJ5Yw', + 'channel_id': 'UC-lHJZR3Gqxm24_Vd_AJ5Yw', + 'title': 'PewDiePie', + 'channel': 'PewDiePie', + 'channel_url': 'https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5Yw', + 'thumbnails': list, + 'channel_follower_count': int, + 'playlist_count': int, + 'uploader': 'PewDiePie', + 'uploader_url': 'https://www.youtube.com/@PewDiePie', + 'uploader_id': '@PewDiePie', + 'channel_is_verified': True, + } + }], + 'params': {'extract_flat': True}, + }, { + 'url': 'https://www.youtube.com/@3blue1brown/about', + 'info_dict': { + 'id': 'UCYO_jab_esuFRV4b17AJtAw', + 'tags': ['Mathematics'], + 'title': '3Blue1Brown - About', + 'channel_follower_count': int, + 'channel_id': 'UCYO_jab_esuFRV4b17AJtAw', + 'channel': '3Blue1Brown', + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw', + 'description': 'md5:e1384e8a133307dd10edee76e875d62f', + 'uploader_url': 'https://www.youtube.com/@3blue1brown', + 'uploader_id': '@3blue1brown', + 'uploader': '3Blue1Brown', + 'channel_is_verified': True, + }, + 'playlist_count': 0, + }, { + # Podcasts tab, with rich entry playlistRenderers + 'url': 'https://www.youtube.com/@99percentinvisiblepodcast/podcasts', + 'info_dict': { + 'id': 'UCVMF2HD4ZgC0QHpU9Yq5Xrw', + 'channel_id': 'UCVMF2HD4ZgC0QHpU9Yq5Xrw', + 'uploader_url': 'https://www.youtube.com/@99percentinvisiblepodcast', + 'description': 'md5:3a0ed38f1ad42a68ef0428c04a15695c', + 'title': '99 Percent Invisible - Podcasts', + 'uploader': '99 Percent Invisible', + 'channel_follower_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCVMF2HD4ZgC0QHpU9Yq5Xrw', + 'tags': [], + 'channel': '99 Percent Invisible', + 'uploader_id': '@99percentinvisiblepodcast', + }, + 'playlist_count': 1, + }, { + # Releases tab, with rich entry playlistRenderers (same as Podcasts tab) + 'url': 'https://www.youtube.com/@AHimitsu/releases', + 'info_dict': { + 'id': 'UCgFwu-j5-xNJml2FtTrrB3A', + 'channel': 'A Himitsu', + 'uploader_url': 'https://www.youtube.com/@AHimitsu', + 'title': 'A Himitsu - Releases', + 'uploader_id': '@AHimitsu', + 'uploader': 'A Himitsu', + 'channel_id': 'UCgFwu-j5-xNJml2FtTrrB3A', + 'tags': 'count:16', + 'description': 'I make music', + 'channel_url': 'https://www.youtube.com/channel/UCgFwu-j5-xNJml2FtTrrB3A', + 'channel_follower_count': int, + 'channel_is_verified': True, + }, + 'playlist_mincount': 10, + }, { + # Playlist with only shorts, shown as reel renderers + # FIXME: future: YouTube currently doesn't give continuation for this, + # may do in future. + 'url': 'https://www.youtube.com/playlist?list=UUxqPAgubo4coVn9Lx1FuKcg', + 'info_dict': { + 'id': 'UUxqPAgubo4coVn9Lx1FuKcg', + 'channel_url': 'https://www.youtube.com/channel/UCxqPAgubo4coVn9Lx1FuKcg', + 'view_count': int, + 'uploader_id': '@BangyShorts', + 'description': '', + 'uploader_url': 'https://www.youtube.com/@BangyShorts', + 'channel_id': 'UCxqPAgubo4coVn9Lx1FuKcg', + 'channel': 'Bangy Shorts', + 'uploader': 'Bangy Shorts', + 'tags': [], + 'availability': 'public', + 'modified_date': '20230626', + 'title': 'Uploads from Bangy Shorts', + }, + 'playlist_mincount': 100, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden'], + }] + + @classmethod + def suitable(cls, url): + return False if YoutubeIE.suitable(url) else super().suitable(url) + + _URL_RE = re.compile(rf'(?P<pre>{_VALID_URL})(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$') + + def _get_url_mobj(self, url): + mobj = self._URL_RE.match(url).groupdict() + mobj.update((k, '') for k, v in mobj.items() if v is None) + return mobj + + def _extract_tab_id_and_name(self, tab, base_url='https://www.youtube.com'): + tab_name = (tab.get('title') or '').lower() + tab_url = urljoin(base_url, traverse_obj( + tab, ('endpoint', 'commandMetadata', 'webCommandMetadata', 'url'))) + + tab_id = (tab_url and self._get_url_mobj(tab_url)['tab'][1:] + or traverse_obj(tab, 'tabIdentifier', expected_type=str)) + if tab_id: + return { + 'TAB_ID_SPONSORSHIPS': 'membership', + }.get(tab_id, tab_id), tab_name + + # Fallback to tab name if we cannot get the tab id. + # XXX: should we strip non-ascii letters? e.g. in case of 'let's play' tab example on special gaming channel + # Note that in the case of translated tab name this may result in an empty string, which we don't want. + if tab_name: + self.write_debug(f'Falling back to selected tab name: {tab_name}') + return { + 'home': 'featured', + 'live': 'streams', + }.get(tab_name, tab_name), tab_name + + def _has_tab(self, tabs, tab_id): + return any(self._extract_tab_id_and_name(tab)[0] == tab_id for tab in tabs) + + @YoutubeTabBaseInfoExtractor.passthrough_smuggled_data + def _real_extract(self, url, smuggled_data): + item_id = self._match_id(url) + url = urllib.parse.urlunparse( + urllib.parse.urlparse(url)._replace(netloc='www.youtube.com')) + compat_opts = self.get_param('compat_opts', []) + + mobj = self._get_url_mobj(url) + pre, tab, post, is_channel = mobj['pre'], mobj['tab'], mobj['post'], not mobj['not_channel'] + if is_channel and smuggled_data.get('is_music_url'): + if item_id[:2] == 'VL': # Youtube music VL channels have an equivalent playlist + return self.url_result( + f'https://music.youtube.com/playlist?list={item_id[2:]}', YoutubeTabIE, item_id[2:]) + elif item_id[:2] == 'MP': # Resolve albums (/[channel/browse]/MP...) to their equivalent playlist + mdata = self._extract_tab_endpoint( + f'https://music.youtube.com/channel/{item_id}', item_id, default_client='web_music') + murl = traverse_obj(mdata, ('microformat', 'microformatDataRenderer', 'urlCanonical'), + get_all=False, expected_type=str) + if not murl: + raise ExtractorError('Failed to resolve album to playlist') + return self.url_result(murl, YoutubeTabIE) + elif mobj['channel_type'] == 'browse': # Youtube music /browse/ should be changed to /channel/ + return self.url_result( + f'https://music.youtube.com/channel/{item_id}{tab}{post}', YoutubeTabIE, item_id) + + original_tab_id, display_id = tab[1:], f'{item_id}{tab}' + if is_channel and not tab and 'no-youtube-channel-redirect' not in compat_opts: + url = f'{pre}/videos{post}' + if smuggled_data.get('is_music_url'): + self.report_warning(f'YouTube Music is not directly supported. Redirecting to {url}') + + # Handle both video/playlist URLs + qs = parse_qs(url) + video_id, playlist_id = [traverse_obj(qs, (key, 0)) for key in ('v', 'list')] + if not video_id and mobj['not_channel'].startswith('watch'): + if not playlist_id: + # If there is neither video or playlist ids, youtube redirects to home page, which is undesirable + raise ExtractorError('A video URL was given without video ID', expected=True) + # Common mistake: https://www.youtube.com/watch?list=playlist_id + self.report_warning(f'A video URL was given without video ID. Trying to download playlist {playlist_id}') + return self.url_result( + f'https://www.youtube.com/playlist?list={playlist_id}', YoutubeTabIE, playlist_id) + + if not self._yes_playlist(playlist_id, video_id): + return self.url_result( + f'https://www.youtube.com/watch?v={video_id}', YoutubeIE, video_id) + + data, ytcfg = self._extract_data(url, display_id) + + # YouTube may provide a non-standard redirect to the regional channel + # See: https://github.com/yt-dlp/yt-dlp/issues/2694 + # https://support.google.com/youtube/answer/2976814#zippy=,conditional-redirects + redirect_url = traverse_obj( + data, ('onResponseReceivedActions', ..., 'navigateAction', 'endpoint', 'commandMetadata', 'webCommandMetadata', 'url'), get_all=False) + if redirect_url and 'no-youtube-channel-redirect' not in compat_opts: + redirect_url = ''.join((urljoin('https://www.youtube.com', redirect_url), tab, post)) + self.to_screen(f'This playlist is likely not available in your region. Following conditional redirect to {redirect_url}') + return self.url_result(redirect_url, YoutubeTabIE) + + tabs, extra_tabs = self._extract_tab_renderers(data), [] + if is_channel and tabs and 'no-youtube-channel-redirect' not in compat_opts: + selected_tab = self._extract_selected_tab(tabs) + selected_tab_id, selected_tab_name = self._extract_tab_id_and_name(selected_tab, url) # NB: Name may be translated + self.write_debug(f'Selected tab: {selected_tab_id!r} ({selected_tab_name}), Requested tab: {original_tab_id!r}') + + if not original_tab_id and selected_tab_name: + self.to_screen('Downloading all uploads of the channel. ' + 'To download only the videos in a specific tab, pass the tab\'s URL') + if self._has_tab(tabs, 'streams'): + extra_tabs.append(''.join((pre, '/streams', post))) + if self._has_tab(tabs, 'shorts'): + extra_tabs.append(''.join((pre, '/shorts', post))) + # XXX: Members-only tab should also be extracted + + if not extra_tabs and selected_tab_id != 'videos': + # Channel does not have streams, shorts or videos tabs + if item_id[:2] != 'UC': + raise ExtractorError('This channel has no uploads', expected=True) + + # Topic channels don't have /videos. Use the equivalent playlist instead + pl_id = f'UU{item_id[2:]}' + pl_url = f'https://www.youtube.com/playlist?list={pl_id}' + try: + data, ytcfg = self._extract_data(pl_url, pl_id, ytcfg=ytcfg, fatal=True, webpage_fatal=True) + except ExtractorError: + raise ExtractorError('This channel has no uploads', expected=True) + else: + item_id, url = pl_id, pl_url + self.to_screen( + f'The channel does not have a videos, shorts, or live tab. Redirecting to playlist {pl_id} instead') + + elif extra_tabs and selected_tab_id != 'videos': + # When there are shorts/live tabs but not videos tab + url, data = f'{pre}{post}', None + + elif (original_tab_id or 'videos') != selected_tab_id: + if original_tab_id == 'live': + # Live tab should have redirected to the video + # Except in the case the channel has an actual live tab + # Example: https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/live + raise UserNotLive(video_id=item_id) + elif selected_tab_name: + raise ExtractorError(f'This channel does not have a {original_tab_id} tab', expected=True) + + # For channels such as https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xg + url = f'{pre}{post}' + + # YouTube sometimes provides a button to reload playlist with unavailable videos. + if 'no-youtube-unavailable-videos' not in compat_opts: + data = self._reload_with_unavailable_videos(display_id, data, ytcfg) or data + self._extract_and_report_alerts(data, only_once=True) + + tabs, entries = self._extract_tab_renderers(data), [] + if tabs: + entries = [self._extract_from_tabs(item_id, ytcfg, data, tabs)] + entries[0].update({ + 'extractor_key': YoutubeTabIE.ie_key(), + 'extractor': YoutubeTabIE.IE_NAME, + 'webpage_url': url, + }) + if self.get_param('playlist_items') == '0': + entries.extend(self.url_result(u, YoutubeTabIE) for u in extra_tabs) + else: # Users expect to get all `video_id`s even with `--flat-playlist`. So don't return `url_result` + entries.extend(map(self._real_extract, extra_tabs)) + + if len(entries) == 1: + return entries[0] + elif entries: + metadata = self._extract_metadata_from_tabs(item_id, data) + uploads_url = 'the Uploads (UU) playlist URL' + if try_get(metadata, lambda x: x['channel_id'].startswith('UC')): + uploads_url = f'https://www.youtube.com/playlist?list=UU{metadata["channel_id"][2:]}' + self.to_screen( + 'Downloading as multiple playlists, separated by tabs. ' + f'To download as a single playlist instead, pass {uploads_url}') + return self.playlist_result(entries, item_id, **metadata) + + # Inline playlist + playlist = traverse_obj( + data, ('contents', 'twoColumnWatchNextResults', 'playlist', 'playlist'), expected_type=dict) + if playlist: + return self._extract_from_playlist(item_id, url, data, playlist, ytcfg) + + video_id = traverse_obj( + data, ('currentVideoEndpoint', 'watchEndpoint', 'videoId'), expected_type=str) or video_id + if video_id: + if tab != '/live': # live tab is expected to redirect to video + self.report_warning(f'Unable to recognize playlist. Downloading just video {video_id}') + return self.url_result(f'https://www.youtube.com/watch?v={video_id}', YoutubeIE, video_id) + + raise ExtractorError('Unable to recognize tab page') + + +class YoutubePlaylistIE(InfoExtractor): + IE_DESC = 'YouTube playlists' + _VALID_URL = r'''(?x)(?: + (?:https?://)? + (?:\w+\.)? + (?: + (?: + youtube(?:kids)?\.com| + %(invidious)s + ) + /.*?\?.*?\blist= + )? + (?P<id>%(playlist_id)s) + )''' % { + 'playlist_id': YoutubeBaseInfoExtractor._PLAYLIST_ID_RE, + 'invidious': '|'.join(YoutubeBaseInfoExtractor._INVIDIOUS_SITES), + } + IE_NAME = 'youtube:playlist' + _TESTS = [{ + 'note': 'issue #673', + 'url': 'PLBB231211A4F62143', + 'info_dict': { + 'title': '[OLD]Team Fortress 2 (Class-based LP)', + 'id': 'PLBB231211A4F62143', + 'uploader': 'Wickman', + 'uploader_id': '@WickmanVT', + 'description': 'md5:8fa6f52abb47a9552002fa3ddfc57fc2', + 'view_count': int, + 'uploader_url': 'https://www.youtube.com/@WickmanVT', + 'modified_date': r're:\d{8}', + 'channel_id': 'UCKSpbfbl5kRQpTdL7kMc-1Q', + 'channel': 'Wickman', + 'tags': [], + 'channel_url': 'https://www.youtube.com/channel/UCKSpbfbl5kRQpTdL7kMc-1Q', + 'availability': 'public', + }, + 'playlist_mincount': 29, + }, { + 'url': 'PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKl', + 'info_dict': { + 'title': 'YDL_safe_search', + 'id': 'PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKl', + }, + 'playlist_count': 2, + 'skip': 'This playlist is private', + }, { + 'note': 'embedded', + 'url': 'https://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEu', + 'playlist_count': 4, + 'info_dict': { + 'title': 'JODA15', + 'id': 'PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEu', + 'uploader': 'milan', + 'uploader_id': '@milan5503', + 'description': '', + 'channel_url': 'https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw', + 'tags': [], + 'modified_date': '20140919', + 'view_count': int, + 'channel': 'milan', + 'channel_id': 'UCEI1-PVPcYXjB73Hfelbmaw', + 'uploader_url': 'https://www.youtube.com/@milan5503', + 'availability': 'public', + }, + 'expected_warnings': [r'[Uu]navailable videos? (is|are|will be) hidden'], + }, { + 'url': 'http://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIl', + 'playlist_mincount': 455, + 'info_dict': { + 'title': '2018 Chinese New Singles (11/6 updated)', + 'id': 'PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIl', + 'uploader': 'LBK', + 'uploader_id': '@music_king', + 'description': 'md5:da521864744d60a198e3a88af4db0d9d', + 'channel': 'LBK', + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UC21nz3_MesPLqtDqwdvnoxA', + 'tags': [], + 'uploader_url': 'https://www.youtube.com/@music_king', + 'channel_id': 'UC21nz3_MesPLqtDqwdvnoxA', + 'modified_date': r're:\d{8}', + 'availability': 'public', + }, + 'expected_warnings': [r'[Uu]navailable videos (are|will be) hidden'], + }, { + 'url': 'TLGGrESM50VT6acwMjAyMjAxNw', + 'only_matching': True, + }, { + # music album playlist + 'url': 'OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhM', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + if YoutubeTabIE.suitable(url): + return False + from ..utils import parse_qs + qs = parse_qs(url) + if qs.get('v', [None])[0]: + return False + return super().suitable(url) + + def _real_extract(self, url): + playlist_id = self._match_id(url) + is_music_url = YoutubeBaseInfoExtractor.is_music_url(url) + url = update_url_query( + 'https://www.youtube.com/playlist', + parse_qs(url) or {'list': playlist_id}) + if is_music_url: + url = smuggle_url(url, {'is_music_url': True}) + return self.url_result(url, ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + + +class YoutubeYtBeIE(InfoExtractor): + IE_DESC = 'youtu.be' + _VALID_URL = r'https?://youtu\.be/(?P<id>[0-9A-Za-z_-]{11})/*?.*?\blist=(?P<playlist_id>%(playlist_id)s)' % {'playlist_id': YoutubeBaseInfoExtractor._PLAYLIST_ID_RE} + _TESTS = [{ + 'url': 'https://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5', + 'info_dict': { + 'id': 'yeWKywCrFtk', + 'ext': 'mp4', + 'title': 'Small Scale Baler and Braiding Rugs', + 'uploader': 'Backus-Page House Museum', + 'uploader_id': '@backuspagemuseum', + 'uploader_url': r're:https?://(?:www\.)?youtube\.com/@backuspagemuseum', + 'upload_date': '20161008', + 'description': 'md5:800c0c78d5eb128500bffd4f0b4f2e8a', + 'categories': ['Nonprofits & Activism'], + 'tags': list, + 'like_count': int, + 'age_limit': 0, + 'playable_in_embed': True, + 'thumbnail': r're:^https?://.*\.webp', + 'channel': 'Backus-Page House Museum', + 'channel_id': 'UCEfMCQ9bs3tjvjy1s451zaw', + 'live_status': 'not_live', + 'view_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCEfMCQ9bs3tjvjy1s451zaw', + 'availability': 'public', + 'duration': 59, + 'comment_count': int, + 'channel_follower_count': int + }, + 'params': { + 'noplaylist': True, + 'skip_download': True, + }, + }, { + 'url': 'https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21', + 'only_matching': True, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + video_id = mobj.group('id') + playlist_id = mobj.group('playlist_id') + return self.url_result( + update_url_query('https://www.youtube.com/watch', { + 'v': video_id, + 'list': playlist_id, + 'feature': 'youtu.be', + }), ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + + +class YoutubeLivestreamEmbedIE(InfoExtractor): + IE_DESC = 'YouTube livestream embeds' + _VALID_URL = r'https?://(?:\w+\.)?youtube\.com/embed/live_stream/?\?(?:[^#]+&)?channel=(?P<id>[^&#]+)' + _TESTS = [{ + 'url': 'https://www.youtube.com/embed/live_stream?channel=UC2_KI6RB__jGdlnK6dvFEZA', + 'only_matching': True, + }] + + def _real_extract(self, url): + channel_id = self._match_id(url) + return self.url_result( + f'https://www.youtube.com/channel/{channel_id}/live', + ie=YoutubeTabIE.ie_key(), video_id=channel_id) + + +class YoutubeYtUserIE(InfoExtractor): + IE_DESC = 'YouTube user videos; "ytuser:" prefix' + IE_NAME = 'youtube:user' + _VALID_URL = r'ytuser:(?P<id>.+)' + _TESTS = [{ + 'url': 'ytuser:phihag', + 'only_matching': True, + }] + + def _real_extract(self, url): + user_id = self._match_id(url) + return self.url_result(f'https://www.youtube.com/user/{user_id}', YoutubeTabIE, user_id) + + +class YoutubeFavouritesIE(YoutubeBaseInfoExtractor): + IE_NAME = 'youtube:favorites' + IE_DESC = 'YouTube liked videos; ":ytfav" keyword (requires cookies)' + _VALID_URL = r':ytfav(?:ou?rite)?s?' + _LOGIN_REQUIRED = True + _TESTS = [{ + 'url': ':ytfav', + 'only_matching': True, + }, { + 'url': ':ytfavorites', + 'only_matching': True, + }] + + def _real_extract(self, url): + return self.url_result( + 'https://www.youtube.com/playlist?list=LL', + ie=YoutubeTabIE.ie_key()) + + +class YoutubeNotificationsIE(YoutubeTabBaseInfoExtractor): + IE_NAME = 'youtube:notif' + IE_DESC = 'YouTube notifications; ":ytnotif" keyword (requires cookies)' + _VALID_URL = r':ytnotif(?:ication)?s?' + _LOGIN_REQUIRED = True + _TESTS = [{ + 'url': ':ytnotif', + 'only_matching': True, + }, { + 'url': ':ytnotifications', + 'only_matching': True, + }] + + def _extract_notification_menu(self, response, continuation_list): + notification_list = traverse_obj( + response, + ('actions', 0, 'openPopupAction', 'popup', 'multiPageMenuRenderer', 'sections', 0, 'multiPageMenuNotificationSectionRenderer', 'items'), + ('actions', 0, 'appendContinuationItemsAction', 'continuationItems'), + expected_type=list) or [] + continuation_list[0] = None + for item in notification_list: + entry = self._extract_notification_renderer(item.get('notificationRenderer')) + if entry: + yield entry + continuation = item.get('continuationItemRenderer') + if continuation: + continuation_list[0] = continuation + + def _extract_notification_renderer(self, notification): + video_id = traverse_obj( + notification, ('navigationEndpoint', 'watchEndpoint', 'videoId'), expected_type=str) + url = f'https://www.youtube.com/watch?v={video_id}' + channel_id = None + if not video_id: + browse_ep = traverse_obj( + notification, ('navigationEndpoint', 'browseEndpoint'), expected_type=dict) + channel_id = self.ucid_or_none(traverse_obj(browse_ep, 'browseId', expected_type=str)) + post_id = self._search_regex( + r'/post/(.+)', traverse_obj(browse_ep, 'canonicalBaseUrl', expected_type=str), + 'post id', default=None) + if not channel_id or not post_id: + return + # The direct /post url redirects to this in the browser + url = f'https://www.youtube.com/channel/{channel_id}/community?lb={post_id}' + + channel = traverse_obj( + notification, ('contextualMenu', 'menuRenderer', 'items', 1, 'menuServiceItemRenderer', 'text', 'runs', 1, 'text'), + expected_type=str) + notification_title = self._get_text(notification, 'shortMessage') + if notification_title: + notification_title = notification_title.replace('\xad', '') # remove soft hyphens + # TODO: handle recommended videos + title = self._search_regex( + rf'{re.escape(channel or "")}[^:]+: (.+)', notification_title, + 'video title', default=None) + timestamp = (self._parse_time_text(self._get_text(notification, 'sentTimeText')) + if self._configuration_arg('approximate_date', ie_key=YoutubeTabIE) + else None) + return { + '_type': 'url', + 'url': url, + 'ie_key': (YoutubeIE if video_id else YoutubeTabIE).ie_key(), + 'video_id': video_id, + 'title': title, + 'channel_id': channel_id, + 'channel': channel, + 'uploader': channel, + 'thumbnails': self._extract_thumbnails(notification, 'videoThumbnail'), + 'timestamp': timestamp, + } + + def _notification_menu_entries(self, ytcfg): + continuation_list = [None] + response = None + for page in itertools.count(1): + ctoken = traverse_obj( + continuation_list, (0, 'continuationEndpoint', 'getNotificationMenuEndpoint', 'ctoken'), expected_type=str) + response = self._extract_response( + item_id=f'page {page}', query={'ctoken': ctoken} if ctoken else {}, ytcfg=ytcfg, + ep='notification/get_notification_menu', check_get_keys='actions', + headers=self.generate_api_headers(ytcfg=ytcfg, visitor_data=self._extract_visitor_data(response))) + yield from self._extract_notification_menu(response, continuation_list) + if not continuation_list[0]: + break + + def _real_extract(self, url): + display_id = 'notifications' + ytcfg = self._download_ytcfg('web', display_id) if not self.skip_webpage else {} + self._report_playlist_authcheck(ytcfg) + return self.playlist_result(self._notification_menu_entries(ytcfg), display_id, display_id) + + +class YoutubeSearchIE(YoutubeTabBaseInfoExtractor, SearchInfoExtractor): + IE_DESC = 'YouTube search' + IE_NAME = 'youtube:search' + _SEARCH_KEY = 'ytsearch' + _SEARCH_PARAMS = 'EgIQAQ%3D%3D' # Videos only + _TESTS = [{ + 'url': 'ytsearch5:youtube-dl test video', + 'playlist_count': 5, + 'info_dict': { + 'id': 'youtube-dl test video', + 'title': 'youtube-dl test video', + } + }] + + +class YoutubeSearchDateIE(YoutubeTabBaseInfoExtractor, SearchInfoExtractor): + IE_NAME = YoutubeSearchIE.IE_NAME + ':date' + _SEARCH_KEY = 'ytsearchdate' + IE_DESC = 'YouTube search, newest videos first' + _SEARCH_PARAMS = 'CAISAhAB' # Videos only, sorted by date + _TESTS = [{ + 'url': 'ytsearchdate5:youtube-dl test video', + 'playlist_count': 5, + 'info_dict': { + 'id': 'youtube-dl test video', + 'title': 'youtube-dl test video', + } + }] + + +class YoutubeSearchURLIE(YoutubeTabBaseInfoExtractor): + IE_DESC = 'YouTube search URLs with sorting and filter support' + IE_NAME = YoutubeSearchIE.IE_NAME + '_url' + _VALID_URL = r'https?://(?:www\.)?youtube\.com/(?:results|search)\?([^#]+&)?(?:search_query|q)=(?:[^&]+)(?:[&#]|$)' + _TESTS = [{ + 'url': 'https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video', + 'playlist_mincount': 5, + 'info_dict': { + 'id': 'youtube-dl test video', + 'title': 'youtube-dl test video', + } + }, { + 'url': 'https://www.youtube.com/results?search_query=python&sp=EgIQAg%253D%253D', + 'playlist_mincount': 5, + 'info_dict': { + 'id': 'python', + 'title': 'python', + } + }, { + 'url': 'https://www.youtube.com/results?search_query=%23cats', + 'playlist_mincount': 1, + 'info_dict': { + 'id': '#cats', + 'title': '#cats', + # The test suite does not have support for nested playlists + # 'entries': [{ + # 'url': r're:https://(www\.)?youtube\.com/hashtag/cats', + # 'title': '#cats', + # }], + }, + }, { + # Channel results + 'url': 'https://www.youtube.com/results?search_query=kurzgesagt&sp=EgIQAg%253D%253D', + 'info_dict': { + 'id': 'kurzgesagt', + 'title': 'kurzgesagt', + }, + 'playlist': [{ + 'info_dict': { + '_type': 'url', + 'id': 'UCsXVk37bltHxD1rDPwtNM8Q', + 'url': 'https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q', + 'ie_key': 'YoutubeTab', + 'channel': 'Kurzgesagt – In a Nutshell', + 'description': 'md5:4ae48dfa9505ffc307dad26342d06bfc', + 'title': 'Kurzgesagt – In a Nutshell', + 'channel_id': 'UCsXVk37bltHxD1rDPwtNM8Q', + # No longer available for search as it is set to the handle. + # 'playlist_count': int, + 'channel_url': 'https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q', + 'thumbnails': list, + 'uploader_id': '@kurzgesagt', + 'uploader_url': 'https://www.youtube.com/@kurzgesagt', + 'uploader': 'Kurzgesagt – In a Nutshell', + 'channel_is_verified': True, + 'channel_follower_count': int, + } + }], + 'params': {'extract_flat': True, 'playlist_items': '1'}, + 'playlist_mincount': 1, + }, { + 'url': 'https://www.youtube.com/results?q=test&sp=EgQIBBgB', + 'only_matching': True, + }] + + def _real_extract(self, url): + qs = parse_qs(url) + query = (qs.get('search_query') or qs.get('q'))[0] + return self.playlist_result(self._search_results(query, qs.get('sp', (None,))[0]), query, query) + + +class YoutubeMusicSearchURLIE(YoutubeTabBaseInfoExtractor): + IE_DESC = 'YouTube music search URLs with selectable sections, e.g. #songs' + IE_NAME = 'youtube:music:search_url' + _VALID_URL = r'https?://music\.youtube\.com/search\?([^#]+&)?(?:search_query|q)=(?:[^&]+)(?:[&#]|$)' + _TESTS = [{ + 'url': 'https://music.youtube.com/search?q=royalty+free+music', + 'playlist_count': 16, + 'info_dict': { + 'id': 'royalty free music', + 'title': 'royalty free music', + } + }, { + 'url': 'https://music.youtube.com/search?q=royalty+free+music&sp=EgWKAQIIAWoKEAoQAxAEEAkQBQ%3D%3D', + 'playlist_mincount': 30, + 'info_dict': { + 'id': 'royalty free music - songs', + 'title': 'royalty free music - songs', + }, + 'params': {'extract_flat': 'in_playlist'} + }, { + 'url': 'https://music.youtube.com/search?q=royalty+free+music#community+playlists', + 'playlist_mincount': 30, + 'info_dict': { + 'id': 'royalty free music - community playlists', + 'title': 'royalty free music - community playlists', + }, + 'params': {'extract_flat': 'in_playlist'} + }] + + _SECTIONS = { + 'albums': 'EgWKAQIYAWoKEAoQAxAEEAkQBQ==', + 'artists': 'EgWKAQIgAWoKEAoQAxAEEAkQBQ==', + 'community playlists': 'EgeKAQQoAEABagoQChADEAQQCRAF', + 'featured playlists': 'EgeKAQQoADgBagwQAxAJEAQQDhAKEAU==', + 'songs': 'EgWKAQIIAWoKEAoQAxAEEAkQBQ==', + 'videos': 'EgWKAQIQAWoKEAoQAxAEEAkQBQ==', + } + + def _real_extract(self, url): + qs = parse_qs(url) + query = (qs.get('search_query') or qs.get('q'))[0] + params = qs.get('sp', (None,))[0] + if params: + section = next((k for k, v in self._SECTIONS.items() if v == params), params) + else: + section = urllib.parse.unquote_plus((url.split('#') + [''])[1]).lower() + params = self._SECTIONS.get(section) + if not params: + section = None + title = join_nonempty(query, section, delim=' - ') + return self.playlist_result(self._search_results(query, params, default_client='web_music'), title, title) + + +class YoutubeFeedsInfoExtractor(InfoExtractor): + """ + Base class for feed extractors + Subclasses must re-define the _FEED_NAME property. + """ + _LOGIN_REQUIRED = True + _FEED_NAME = 'feeds' + + def _real_initialize(self): + YoutubeBaseInfoExtractor._check_login_required(self) + + @classproperty + def IE_NAME(self): + return f'youtube:{self._FEED_NAME}' + + def _real_extract(self, url): + return self.url_result( + f'https://www.youtube.com/feed/{self._FEED_NAME}', ie=YoutubeTabIE.ie_key()) + + +class YoutubeWatchLaterIE(InfoExtractor): + IE_NAME = 'youtube:watchlater' + IE_DESC = 'Youtube watch later list; ":ytwatchlater" keyword (requires cookies)' + _VALID_URL = r':ytwatchlater' + _TESTS = [{ + 'url': ':ytwatchlater', + 'only_matching': True, + }] + + def _real_extract(self, url): + return self.url_result( + 'https://www.youtube.com/playlist?list=WL', ie=YoutubeTabIE.ie_key()) + + +class YoutubeRecommendedIE(YoutubeFeedsInfoExtractor): + IE_DESC = 'YouTube recommended videos; ":ytrec" keyword' + _VALID_URL = r'https?://(?:www\.)?youtube\.com/?(?:[?#]|$)|:ytrec(?:ommended)?' + _FEED_NAME = 'recommended' + _LOGIN_REQUIRED = False + _TESTS = [{ + 'url': ':ytrec', + 'only_matching': True, + }, { + 'url': ':ytrecommended', + 'only_matching': True, + }, { + 'url': 'https://youtube.com', + 'only_matching': True, + }] + + +class YoutubeSubscriptionsIE(YoutubeFeedsInfoExtractor): + IE_DESC = 'YouTube subscriptions feed; ":ytsubs" keyword (requires cookies)' + _VALID_URL = r':ytsub(?:scription)?s?' + _FEED_NAME = 'subscriptions' + _TESTS = [{ + 'url': ':ytsubs', + 'only_matching': True, + }, { + 'url': ':ytsubscriptions', + 'only_matching': True, + }] + + +class YoutubeHistoryIE(YoutubeFeedsInfoExtractor): + IE_DESC = 'Youtube watch history; ":ythis" keyword (requires cookies)' + _VALID_URL = r':ythis(?:tory)?' + _FEED_NAME = 'history' + _TESTS = [{ + 'url': ':ythistory', + 'only_matching': True, + }] + + +class YoutubeShortsAudioPivotIE(InfoExtractor): + IE_DESC = 'YouTube Shorts audio pivot (Shorts using audio of a given video)' + IE_NAME = 'youtube:shorts:pivot:audio' + _VALID_URL = r'https?://(?:www\.)?youtube\.com/source/(?P<id>[\w-]{11})/shorts' + _TESTS = [{ + 'url': 'https://www.youtube.com/source/Lyj-MZSAA9o/shorts', + 'only_matching': True, + }] + + @staticmethod + def _generate_audio_pivot_params(video_id): + """ + Generates sfv_audio_pivot browse params for this video id + """ + pb_params = b'\xf2\x05+\n)\x12\'\n\x0b%b\x12\x0b%b\x1a\x0b%b' % ((video_id.encode(),) * 3) + return urllib.parse.quote(base64.b64encode(pb_params).decode()) + + def _real_extract(self, url): + video_id = self._match_id(url) + return self.url_result( + f'https://www.youtube.com/feed/sfv_audio_pivot?bp={self._generate_audio_pivot_params(video_id)}', + ie=YoutubeTabIE) + + +class YoutubeTruncatedURLIE(InfoExtractor): + IE_NAME = 'youtube:truncated_url' + IE_DESC = False # Do not list + _VALID_URL = r'''(?x) + (?:https?://)? + (?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/ + (?:watch\?(?: + feature=[a-z_]+| + annotation_id=annotation_[^&]+| + x-yt-cl=[0-9]+| + hl=[^&]*| + t=[0-9]+ + )? + | + attribution_link\?a=[^&]+ + ) + $ + ''' + + _TESTS = [{ + 'url': 'https://www.youtube.com/watch?annotation_id=annotation_3951667041', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?x-yt-cl=84503534', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?feature=foo', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?hl=en-GB', + 'only_matching': True, + }, { + 'url': 'https://www.youtube.com/watch?t=2372', + 'only_matching': True, + }] + + def _real_extract(self, url): + raise ExtractorError( + 'Did you forget to quote the URL? Remember that & is a meta ' + 'character in most shells, so you want to put the URL in quotes, ' + 'like youtube-dl ' + '"https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc" ' + ' or simply youtube-dl BaW_jenozKc .', + expected=True) + + +class YoutubeClipIE(YoutubeTabBaseInfoExtractor): + IE_NAME = 'youtube:clip' + _VALID_URL = r'https?://(?:www\.)?youtube\.com/clip/(?P<id>[^/?#]+)' + _TESTS = [{ + # FIXME: Other metadata should be extracted from the clip, not from the base video + 'url': 'https://www.youtube.com/clip/UgytZKpehg-hEMBSn3F4AaABCQ', + 'info_dict': { + 'id': 'UgytZKpehg-hEMBSn3F4AaABCQ', + 'ext': 'mp4', + 'section_start': 29.0, + 'section_end': 39.7, + 'duration': 10.7, + 'age_limit': 0, + 'availability': 'public', + 'categories': ['Gaming'], + 'channel': 'Scott The Woz', + 'channel_id': 'UC4rqhyiTs7XyuODcECvuiiQ', + 'channel_url': 'https://www.youtube.com/channel/UC4rqhyiTs7XyuODcECvuiiQ', + 'description': 'md5:7a4517a17ea9b4bd98996399d8bb36e7', + 'like_count': int, + 'playable_in_embed': True, + 'tags': 'count:17', + 'thumbnail': 'https://i.ytimg.com/vi_webp/ScPX26pdQik/maxresdefault.webp', + 'title': 'Mobile Games on Console - Scott The Woz', + 'upload_date': '20210920', + 'uploader': 'Scott The Woz', + 'uploader_id': '@ScottTheWoz', + 'uploader_url': 'https://www.youtube.com/@ScottTheWoz', + 'view_count': int, + 'live_status': 'not_live', + 'channel_follower_count': int, + 'chapters': 'count:20', + 'comment_count': int, + 'heatmap': 'count:100', + } + }] + + def _real_extract(self, url): + clip_id = self._match_id(url) + _, data = self._extract_webpage(url, clip_id) + + video_id = traverse_obj(data, ('currentVideoEndpoint', 'watchEndpoint', 'videoId')) + if not video_id: + raise ExtractorError('Unable to find video ID') + + clip_data = traverse_obj(data, ( + 'engagementPanels', ..., 'engagementPanelSectionListRenderer', 'content', 'clipSectionRenderer', + 'contents', ..., 'clipAttributionRenderer', 'onScrubExit', 'commandExecutorCommand', 'commands', ..., + 'openPopupAction', 'popup', 'notificationActionRenderer', 'actionButton', 'buttonRenderer', 'command', + 'commandExecutorCommand', 'commands', ..., 'loopCommand'), get_all=False) + + return { + '_type': 'url_transparent', + 'url': f'https://www.youtube.com/watch?v={video_id}', + 'ie_key': YoutubeIE.ie_key(), + 'id': clip_id, + 'section_start': int(clip_data['startTimeMs']) / 1000, + 'section_end': int(clip_data['endTimeMs']) / 1000, + } + + +class YoutubeConsentRedirectIE(YoutubeBaseInfoExtractor): + IE_NAME = 'youtube:consent' + IE_DESC = False # Do not list + _VALID_URL = r'https?://consent\.youtube\.com/m\?' + _TESTS = [{ + 'url': 'https://consent.youtube.com/m?continue=https%3A%2F%2Fwww.youtube.com%2Flive%2FqVv6vCqciTM%3Fcbrd%3D1&gl=NL&m=0&pc=yt&hl=en&src=1', + 'info_dict': { + 'id': 'qVv6vCqciTM', + 'ext': 'mp4', + 'age_limit': 0, + 'uploader_id': '@sana_natori', + 'comment_count': int, + 'chapters': 'count:13', + 'upload_date': '20221223', + 'thumbnail': 'https://i.ytimg.com/vi/qVv6vCqciTM/maxresdefault.jpg', + 'channel_url': 'https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtA', + 'uploader_url': 'https://www.youtube.com/@sana_natori', + 'like_count': int, + 'release_date': '20221223', + 'tags': ['Vtuber', '月ノ美兎', 'åå–ã•ãª', 'ã«ã˜ã•ã‚“ã˜', 'クリスマス', '3Dé…ä¿¡'], + 'title': '〠#インターãƒãƒƒãƒˆå¥³ã‚¯ãƒªã‚¹ãƒžã‚¹ 】3Dã§æ­Œã£ã¦ã¯ã—ゃãインターãƒãƒƒãƒˆã®å¥³ãŸã¡ã€æœˆãƒŽç¾Žå…Ž/åå–ã•ãªã€‘', + 'view_count': int, + 'playable_in_embed': True, + 'duration': 4438, + 'availability': 'public', + 'channel_follower_count': int, + 'channel_id': 'UCIdEIHpS0TdkqRkHL5OkLtA', + 'categories': ['Entertainment'], + 'live_status': 'was_live', + 'release_timestamp': 1671793345, + 'channel': 'ã•ãªã¡ã‚ƒã‚“ã­ã‚‹', + 'description': 'md5:6aebf95cc4a1d731aebc01ad6cc9806d', + 'uploader': 'ã•ãªã¡ã‚ƒã‚“ã­ã‚‹', + 'channel_is_verified': True, + 'heatmap': 'count:100', + }, + 'add_ie': ['Youtube'], + 'params': {'skip_download': 'Youtube'}, + }] + + def _real_extract(self, url): + redirect_url = url_or_none(parse_qs(url).get('continue', [None])[-1]) + if not redirect_url: + raise ExtractorError('Invalid cookie consent redirect URL', expected=True) + return self.url_result(redirect_url) + + +class YoutubeTruncatedIDIE(InfoExtractor): + IE_NAME = 'youtube:truncated_id' + IE_DESC = False # Do not list + _VALID_URL = r'https?://(?:www\.)?youtube\.com/watch\?v=(?P<id>[0-9A-Za-z_-]{1,10})$' + + _TESTS = [{ + 'url': 'https://www.youtube.com/watch?v=N_708QY7Ob', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + raise ExtractorError( + f'Incomplete YouTube ID {video_id}. URL {url} looks truncated.', + expected=True) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zaiko.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zaiko.py new file mode 100644 index 0000000..2b6221d --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zaiko.py @@ -0,0 +1,139 @@ +import base64 + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + extract_attributes, + int_or_none, + str_or_none, + traverse_obj, + try_call, + unescapeHTML, + url_basename, + url_or_none, +) + + +class ZaikoBaseIE(InfoExtractor): + def _download_real_webpage(self, url, video_id): + webpage, urlh = self._download_webpage_handle(url, video_id) + final_url = urlh.url + if 'zaiko.io/login' in final_url: + self.raise_login_required() + elif '/_buy/' in final_url: + raise ExtractorError('Your account does not have tickets to this event', expected=True) + return webpage + + def _parse_vue_element_attr(self, name, string, video_id): + page_elem = self._search_regex(rf'(<{name}[^>]+>)', string, name) + attrs = {} + for key, value in extract_attributes(page_elem).items(): + if key.startswith(':'): + attrs[key[1:]] = self._parse_json( + value, video_id, transform_source=unescapeHTML, fatal=False) + return attrs + + +class ZaikoIE(ZaikoBaseIE): + _VALID_URL = r'https?://(?:[\w-]+\.)?zaiko\.io/event/(?P<id>\d+)/stream(?:/\d+)+' + _TESTS = [{ + 'url': 'https://zaiko.io/event/324868/stream/20571/20571', + 'info_dict': { + 'id': '324868', + 'ext': 'mp4', + 'title': 'ZAIKO STREAMING TEST', + 'alt_title': '[VOD] ZAIKO STREAMING TEST_20210603(Do Not Delete)', + 'uploader_id': '454', + 'uploader': 'ZAIKO ZERO', + 'release_timestamp': 1583809200, + 'thumbnail': r're:^https://[\w.-]+/\w+/\w+', + 'thumbnails': 'maxcount:2', + 'release_date': '20200310', + 'categories': ['Tech House'], + 'live_status': 'was_live', + }, + 'params': {'skip_download': 'm3u8'}, + 'skip': 'Your account does not have tickets to this event', + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_real_webpage(url, video_id) + stream_meta = self._parse_vue_element_attr('stream-page', webpage, video_id) + + player_page = self._download_webpage( + stream_meta['stream-access']['video_source'], video_id, + 'Downloading player page', headers={'referer': 'https://zaiko.io/'}) + player_meta = self._parse_vue_element_attr('player', player_page, video_id) + status = traverse_obj(player_meta, ('initial_event_info', 'status', {str})) + live_status, msg, expected = { + 'vod': ('was_live', 'No VOD stream URL was found', False), + 'archiving': ('post_live', 'Event VOD is still being processed', True), + 'deleting': ('post_live', 'This event has ended', True), + 'deleted': ('post_live', 'This event has ended', True), + 'error': ('post_live', 'This event has ended', True), + 'disconnected': ('post_live', 'Stream has been disconnected', True), + 'live_to_disconnected': ('post_live', 'Stream has been disconnected', True), + 'live': ('is_live', 'No livestream URL found was found', False), + 'waiting': ('is_upcoming', 'Live event has not yet started', True), + 'cancelled': ('not_live', 'Event has been cancelled', True), + }.get(status) or ('not_live', f'Unknown event status "{status}"', False) + + stream_url = traverse_obj(player_meta, ('initial_event_info', 'endpoint', {url_or_none})) + formats = self._extract_m3u8_formats( + stream_url, video_id, live=True, fatal=False) if stream_url else [] + if not formats: + self.raise_no_formats(msg, expected=expected) + + thumbnail_urls = [ + traverse_obj(player_meta, ('initial_event_info', 'poster_url')), + self._og_search_thumbnail(self._download_webpage( + f'https://zaiko.io/event/{video_id}', video_id, 'Downloading event page', fatal=False) or ''), + ] + + return { + 'id': video_id, + 'formats': formats, + 'live_status': live_status, + **traverse_obj(stream_meta, { + 'title': ('event', 'name', {str}), + 'uploader': ('profile', 'name', {str}), + 'uploader_id': ('profile', 'id', {str_or_none}), + 'release_timestamp': ('stream', 'start', 'timestamp', {int_or_none}), + 'categories': ('event', 'genres', ..., {lambda x: x or None}), + }), + **traverse_obj(player_meta, ('initial_event_info', { + 'alt_title': ('title', {str}), + })), + 'thumbnails': [{'url': url, 'id': url_basename(url)} for url in thumbnail_urls if url_or_none(url)] + } + + +class ZaikoETicketIE(ZaikoBaseIE): + _VALID_URL = r'https?://(?:www.)?zaiko\.io/account/eticket/(?P<id>[\w=-]{49})' + _TESTS = [{ + 'url': 'https://zaiko.io/account/eticket/TZjMwMzQ2Y2EzMXwyMDIzMDYwNzEyMTMyNXw1MDViOWU2Mw==', + 'playlist_count': 1, + 'info_dict': { + 'id': 'f30346ca31-20230607121325-505b9e63', + 'title': 'ZAIKO STREAMING TEST', + 'thumbnail': 'https://media.zkocdn.net/pf_1/1_3wdyjcjyupseatkwid34u', + }, + 'skip': 'Only available with the ticketholding account', + }] + + def _real_extract(self, url): + ticket_id = self._match_id(url) + ticket_id = try_call( + lambda: base64.urlsafe_b64decode(ticket_id[1:]).decode().replace('|', '-')) or ticket_id + + webpage = self._download_real_webpage(url, ticket_id) + eticket = self._parse_vue_element_attr('eticket', webpage, ticket_id) + + return self.playlist_result( + [self.url_result(stream, ZaikoIE) for stream in traverse_obj(eticket, ('streams', ..., 'url'))], + ticket_id, **traverse_obj(eticket, ('ticket-details', { + 'title': 'event_name', + 'thumbnail': 'event_img_url', + }))) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/zapiks.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zapiks.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/zapiks.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/zapiks.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zattoo.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zattoo.py new file mode 100644 index 0000000..6bd9ea0 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zattoo.py @@ -0,0 +1,865 @@ +import re +from uuid import uuid4 + +from .common import InfoExtractor +from ..compat import compat_str +from ..networking.exceptions import HTTPError +from ..utils import ( + ExtractorError, + int_or_none, + join_nonempty, + try_get, + url_or_none, + urlencode_postdata, +) + + +class ZattooPlatformBaseIE(InfoExtractor): + _power_guide_hash = None + + def _host_url(self): + return 'https://%s' % (self._API_HOST if hasattr(self, '_API_HOST') else self._HOST) + + def _real_initialize(self): + if not self._power_guide_hash: + self.raise_login_required('An account is needed to access this media', method='password') + + def _perform_login(self, username, password): + try: + data = self._download_json( + '%s/zapi/v2/account/login' % self._host_url(), None, 'Logging in', + data=urlencode_postdata({ + 'login': username, + 'password': password, + 'remember': 'true', + }), headers={ + 'Referer': '%s/login' % self._host_url(), + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + }) + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status == 400: + raise ExtractorError( + 'Unable to login: incorrect username and/or password', + expected=True) + raise + + self._power_guide_hash = data['session']['power_guide_hash'] + + def _initialize_pre_login(self): + session_token = self._download_json( + f'{self._host_url()}/token.json', None, 'Downloading session token')['session_token'] + + # Will setup appropriate cookies + self._request_webpage( + '%s/zapi/v3/session/hello' % self._host_url(), None, + 'Opening session', data=urlencode_postdata({ + 'uuid': compat_str(uuid4()), + 'lang': 'en', + 'app_version': '1.8.2', + 'format': 'json', + 'client_app_token': session_token, + })) + + def _extract_video_id_from_recording(self, recid): + playlist = self._download_json( + f'{self._host_url()}/zapi/v2/playlist', recid, 'Downloading playlist') + try: + return next( + str(item['program_id']) for item in playlist['recordings'] + if item.get('program_id') and str(item.get('id')) == recid) + except (StopIteration, KeyError): + raise ExtractorError('Could not extract video id from recording') + + def _extract_cid(self, video_id, channel_name): + channel_groups = self._download_json( + '%s/zapi/v2/cached/channels/%s' % (self._host_url(), + self._power_guide_hash), + video_id, 'Downloading channel list', + query={'details': False})['channel_groups'] + channel_list = [] + for chgrp in channel_groups: + channel_list.extend(chgrp['channels']) + try: + return next( + chan['cid'] for chan in channel_list + if chan.get('cid') and ( + chan.get('display_alias') == channel_name + or chan.get('cid') == channel_name)) + except StopIteration: + raise ExtractorError('Could not extract channel id') + + def _extract_cid_and_video_info(self, video_id): + data = self._download_json( + '%s/zapi/v2/cached/program/power_details/%s' % ( + self._host_url(), self._power_guide_hash), + video_id, + 'Downloading video information', + query={ + 'program_ids': video_id, + 'complete': True, + }) + + p = data['programs'][0] + cid = p['cid'] + + info_dict = { + 'id': video_id, + 'title': p.get('t') or p['et'], + 'description': p.get('d'), + 'thumbnail': p.get('i_url'), + 'creator': p.get('channel_name'), + 'episode': p.get('et'), + 'episode_number': int_or_none(p.get('e_no')), + 'season_number': int_or_none(p.get('s_no')), + 'release_year': int_or_none(p.get('year')), + 'categories': try_get(p, lambda x: x['c'], list), + 'tags': try_get(p, lambda x: x['g'], list) + } + + return cid, info_dict + + def _extract_ondemand_info(self, ondemand_id): + """ + @returns (ondemand_token, ondemand_type, info_dict) + """ + data = self._download_json( + '%s/zapi/vod/movies/%s' % (self._host_url(), ondemand_id), + ondemand_id, 'Downloading ondemand information') + info_dict = { + 'id': ondemand_id, + 'title': data.get('title'), + 'description': data.get('description'), + 'duration': int_or_none(data.get('duration')), + 'release_year': int_or_none(data.get('year')), + 'episode_number': int_or_none(data.get('episode_number')), + 'season_number': int_or_none(data.get('season_number')), + 'categories': try_get(data, lambda x: x['categories'], list), + } + return data['terms_catalog'][0]['terms'][0]['token'], data['type'], info_dict + + def _extract_formats(self, cid, video_id, record_id=None, ondemand_id=None, ondemand_termtoken=None, ondemand_type=None, is_live=False): + postdata_common = { + 'https_watch_urls': True, + } + + if is_live: + postdata_common.update({'timeshift': 10800}) + url = '%s/zapi/watch/live/%s' % (self._host_url(), cid) + elif record_id: + url = '%s/zapi/watch/recording/%s' % (self._host_url(), record_id) + elif ondemand_id: + postdata_common.update({ + 'teasable_id': ondemand_id, + 'term_token': ondemand_termtoken, + 'teasable_type': ondemand_type + }) + url = '%s/zapi/watch/vod/video' % self._host_url() + else: + url = '%s/zapi/v3/watch/replay/%s/%s' % (self._host_url(), cid, video_id) + formats = [] + subtitles = {} + for stream_type in ('dash', 'hls7'): + postdata = postdata_common.copy() + postdata['stream_type'] = stream_type + + data = self._download_json( + url, video_id, 'Downloading %s formats' % stream_type.upper(), + data=urlencode_postdata(postdata), fatal=False) + if not data: + continue + + watch_urls = try_get( + data, lambda x: x['stream']['watch_urls'], list) + if not watch_urls: + continue + + for watch in watch_urls: + if not isinstance(watch, dict): + continue + watch_url = url_or_none(watch.get('url')) + if not watch_url: + continue + audio_channel = watch.get('audio_channel') + preference = 1 if audio_channel == 'A' else None + format_id = join_nonempty(stream_type, watch.get('maxrate'), audio_channel) + if stream_type.startswith('dash'): + this_formats, subs = self._extract_mpd_formats_and_subtitles( + watch_url, video_id, mpd_id=format_id, fatal=False) + self._merge_subtitles(subs, target=subtitles) + elif stream_type.startswith('hls'): + this_formats, subs = self._extract_m3u8_formats_and_subtitles( + watch_url, video_id, 'mp4', + entry_protocol='m3u8_native', m3u8_id=format_id, + fatal=False) + self._merge_subtitles(subs, target=subtitles) + elif stream_type == 'hds': + this_formats = self._extract_f4m_formats( + watch_url, video_id, f4m_id=format_id, fatal=False) + elif stream_type == 'smooth_playready': + this_formats = self._extract_ism_formats( + watch_url, video_id, ism_id=format_id, fatal=False) + else: + assert False + for this_format in this_formats: + this_format['quality'] = preference + formats.extend(this_formats) + return formats, subtitles + + def _extract_video(self, video_id, record_id=None): + cid, info_dict = self._extract_cid_and_video_info(video_id) + info_dict['formats'], info_dict['subtitles'] = self._extract_formats(cid, video_id, record_id=record_id) + return info_dict + + def _extract_live(self, channel_name): + cid = self._extract_cid(channel_name, channel_name) + formats, subtitles = self._extract_formats(cid, cid, is_live=True) + return { + 'id': channel_name, + 'title': channel_name, + 'is_live': True, + 'formats': formats, + 'subtitles': subtitles + } + + def _extract_record(self, record_id): + video_id = self._extract_video_id_from_recording(record_id) + cid, info_dict = self._extract_cid_and_video_info(video_id) + info_dict['formats'], info_dict['subtitles'] = self._extract_formats(cid, video_id, record_id=record_id) + return info_dict + + def _extract_ondemand(self, ondemand_id): + ondemand_termtoken, ondemand_type, info_dict = self._extract_ondemand_info(ondemand_id) + info_dict['formats'], info_dict['subtitles'] = self._extract_formats( + None, ondemand_id, ondemand_id=ondemand_id, + ondemand_termtoken=ondemand_termtoken, ondemand_type=ondemand_type) + return info_dict + + def _real_extract(self, url): + video_id, record_id = self._match_valid_url(url).groups() + return getattr(self, f'_extract_{self._TYPE}')(video_id or record_id) + + +def _create_valid_url(host, match, qs, base_re=None): + match_base = fr'|{base_re}/(?P<vid1>{match})' if base_re else '(?P<vid1>)' + return rf'''(?x)https?://(?:www\.)?{re.escape(host)}/(?: + [^?#]+\?(?:[^#]+&)?{qs}=(?P<vid2>{match}) + {match_base} + )''' + + +class ZattooBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'zattoo' + _HOST = 'zattoo.com' + + +class ZattooIE(ZattooBaseIE): + _VALID_URL = _create_valid_url(ZattooBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://zattoo.com/program/zdf/250170418', + 'info_dict': { + 'id': '250170418', + 'ext': 'mp4', + 'title': 'Markus Lanz', + 'description': 'md5:e41cb1257de008ca62a73bb876ffa7fc', + 'thumbnail': 're:http://images.zattic.com/cms/.+/format_480x360.jpg', + 'creator': 'ZDF HD', + 'release_year': 2022, + 'episode': 'Folge 1655', + 'categories': 'count:1', + 'tags': 'count:2' + }, + 'params': {'skip_download': 'm3u8'} + }, { + 'url': 'https://zattoo.com/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://zattoo.com/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class ZattooLiveIE(ZattooBaseIE): + _VALID_URL = _create_valid_url(ZattooBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://zattoo.com/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://zattoo.com/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if ZattooIE.suitable(url) else super().suitable(url) + + +class ZattooMoviesIE(ZattooBaseIE): + _VALID_URL = _create_valid_url(ZattooBaseIE._HOST, r'\w+', 'movie_id', 'vod/movies') + _TYPE = 'ondemand' + _TESTS = [{ + 'url': 'https://zattoo.com/vod/movies/7521', + 'only_matching': True, + }, { + 'url': 'https://zattoo.com/ondemand?movie_id=7521&term_token=9f00f43183269484edde', + 'only_matching': True, + }] + + +class ZattooRecordingsIE(ZattooBaseIE): + _VALID_URL = _create_valid_url('zattoo.com', r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://zattoo.com/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://zattoo.com/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class NetPlusTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'netplus' + _HOST = 'netplus.tv' + _API_HOST = 'www.%s' % _HOST + + +class NetPlusTVIE(NetPlusTVBaseIE): + _VALID_URL = _create_valid_url(NetPlusTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://netplus.tv/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://netplus.tv/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class NetPlusTVLiveIE(NetPlusTVBaseIE): + _VALID_URL = _create_valid_url(NetPlusTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://netplus.tv/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://netplus.tv/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if NetPlusTVIE.suitable(url) else super().suitable(url) + + +class NetPlusTVRecordingsIE(NetPlusTVBaseIE): + _VALID_URL = _create_valid_url(NetPlusTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://netplus.tv/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://netplus.tv/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class MNetTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'mnettv' + _HOST = 'tvplus.m-net.de' + + +class MNetTVIE(MNetTVBaseIE): + _VALID_URL = _create_valid_url(MNetTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://tvplus.m-net.de/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://tvplus.m-net.de/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class MNetTVLiveIE(MNetTVBaseIE): + _VALID_URL = _create_valid_url(MNetTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://tvplus.m-net.de/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://tvplus.m-net.de/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if MNetTVIE.suitable(url) else super().suitable(url) + + +class MNetTVRecordingsIE(MNetTVBaseIE): + _VALID_URL = _create_valid_url(MNetTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://tvplus.m-net.de/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://tvplus.m-net.de/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class WalyTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'walytv' + _HOST = 'player.waly.tv' + + +class WalyTVIE(WalyTVBaseIE): + _VALID_URL = _create_valid_url(WalyTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://player.waly.tv/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://player.waly.tv/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class WalyTVLiveIE(WalyTVBaseIE): + _VALID_URL = _create_valid_url(WalyTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://player.waly.tv/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://player.waly.tv/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if WalyTVIE.suitable(url) else super().suitable(url) + + +class WalyTVRecordingsIE(WalyTVBaseIE): + _VALID_URL = _create_valid_url(WalyTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://player.waly.tv/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://player.waly.tv/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class BBVTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'bbvtv' + _HOST = 'bbv-tv.net' + _API_HOST = 'www.%s' % _HOST + + +class BBVTVIE(BBVTVBaseIE): + _VALID_URL = _create_valid_url(BBVTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://bbv-tv.net/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://bbv-tv.net/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class BBVTVLiveIE(BBVTVBaseIE): + _VALID_URL = _create_valid_url(BBVTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://bbv-tv.net/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://bbv-tv.net/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if BBVTVIE.suitable(url) else super().suitable(url) + + +class BBVTVRecordingsIE(BBVTVBaseIE): + _VALID_URL = _create_valid_url(BBVTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://bbv-tv.net/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://bbv-tv.net/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class VTXTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'vtxtv' + _HOST = 'vtxtv.ch' + _API_HOST = 'www.%s' % _HOST + + +class VTXTVIE(VTXTVBaseIE): + _VALID_URL = _create_valid_url(VTXTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://vtxtv.ch/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://vtxtv.ch/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class VTXTVLiveIE(VTXTVBaseIE): + _VALID_URL = _create_valid_url(VTXTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://vtxtv.ch/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://vtxtv.ch/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if VTXTVIE.suitable(url) else super().suitable(url) + + +class VTXTVRecordingsIE(VTXTVBaseIE): + _VALID_URL = _create_valid_url(VTXTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://vtxtv.ch/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://vtxtv.ch/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class GlattvisionTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'glattvisiontv' + _HOST = 'iptv.glattvision.ch' + + +class GlattvisionTVIE(GlattvisionTVBaseIE): + _VALID_URL = _create_valid_url(GlattvisionTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://iptv.glattvision.ch/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://iptv.glattvision.ch/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class GlattvisionTVLiveIE(GlattvisionTVBaseIE): + _VALID_URL = _create_valid_url(GlattvisionTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://iptv.glattvision.ch/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://iptv.glattvision.ch/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if GlattvisionTVIE.suitable(url) else super().suitable(url) + + +class GlattvisionTVRecordingsIE(GlattvisionTVBaseIE): + _VALID_URL = _create_valid_url(GlattvisionTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://iptv.glattvision.ch/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://iptv.glattvision.ch/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class SAKTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'saktv' + _HOST = 'saktv.ch' + _API_HOST = 'www.%s' % _HOST + + +class SAKTVIE(SAKTVBaseIE): + _VALID_URL = _create_valid_url(SAKTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://saktv.ch/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://saktv.ch/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class SAKTVLiveIE(SAKTVBaseIE): + _VALID_URL = _create_valid_url(SAKTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://saktv.ch/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://saktv.ch/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if SAKTVIE.suitable(url) else super().suitable(url) + + +class SAKTVRecordingsIE(SAKTVBaseIE): + _VALID_URL = _create_valid_url(SAKTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://saktv.ch/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://saktv.ch/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class EWETVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'ewetv' + _HOST = 'tvonline.ewe.de' + + +class EWETVIE(EWETVBaseIE): + _VALID_URL = _create_valid_url(EWETVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://tvonline.ewe.de/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://tvonline.ewe.de/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class EWETVLiveIE(EWETVBaseIE): + _VALID_URL = _create_valid_url(EWETVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://tvonline.ewe.de/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://tvonline.ewe.de/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if EWETVIE.suitable(url) else super().suitable(url) + + +class EWETVRecordingsIE(EWETVBaseIE): + _VALID_URL = _create_valid_url(EWETVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://tvonline.ewe.de/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://tvonline.ewe.de/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class QuantumTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'quantumtv' + _HOST = 'quantum-tv.com' + _API_HOST = 'www.%s' % _HOST + + +class QuantumTVIE(QuantumTVBaseIE): + _VALID_URL = _create_valid_url(QuantumTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://quantum-tv.com/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://quantum-tv.com/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class QuantumTVLiveIE(QuantumTVBaseIE): + _VALID_URL = _create_valid_url(QuantumTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://quantum-tv.com/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://quantum-tv.com/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if QuantumTVIE.suitable(url) else super().suitable(url) + + +class QuantumTVRecordingsIE(QuantumTVBaseIE): + _VALID_URL = _create_valid_url(QuantumTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://quantum-tv.com/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://quantum-tv.com/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class OsnatelTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'osnateltv' + _HOST = 'tvonline.osnatel.de' + + +class OsnatelTVIE(OsnatelTVBaseIE): + _VALID_URL = _create_valid_url(OsnatelTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://tvonline.osnatel.de/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://tvonline.osnatel.de/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class OsnatelTVLiveIE(OsnatelTVBaseIE): + _VALID_URL = _create_valid_url(OsnatelTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://tvonline.osnatel.de/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://tvonline.osnatel.de/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if OsnatelTVIE.suitable(url) else super().suitable(url) + + +class OsnatelTVRecordingsIE(OsnatelTVBaseIE): + _VALID_URL = _create_valid_url(OsnatelTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://tvonline.osnatel.de/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://tvonline.osnatel.de/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class EinsUndEinsTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = '1und1tv' + _HOST = '1und1.tv' + _API_HOST = 'www.%s' % _HOST + + +class EinsUndEinsTVIE(EinsUndEinsTVBaseIE): + _VALID_URL = _create_valid_url(EinsUndEinsTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://1und1.tv/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://1und1.tv/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class EinsUndEinsTVLiveIE(EinsUndEinsTVBaseIE): + _VALID_URL = _create_valid_url(EinsUndEinsTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://1und1.tv/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://1und1.tv/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if EinsUndEinsTVIE.suitable(url) else super().suitable(url) + + +class EinsUndEinsTVRecordingsIE(EinsUndEinsTVBaseIE): + _VALID_URL = _create_valid_url(EinsUndEinsTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://1und1.tv/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://1und1.tv/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] + + +class SaltTVBaseIE(ZattooPlatformBaseIE): + _NETRC_MACHINE = 'salttv' + _HOST = 'tv.salt.ch' + + +class SaltTVIE(SaltTVBaseIE): + _VALID_URL = _create_valid_url(SaltTVBaseIE._HOST, r'\d+', 'program', '(?:program|watch)/[^/]+') + _TYPE = 'video' + _TESTS = [{ + 'url': 'https://tv.salt.ch/program/daserste/210177916', + 'only_matching': True, + }, { + 'url': 'https://tv.salt.ch/guide/german?channel=srf1&program=169860555', + 'only_matching': True, + }] + + +class SaltTVLiveIE(SaltTVBaseIE): + _VALID_URL = _create_valid_url(SaltTVBaseIE._HOST, r'[^/?&#]+', 'channel', 'live') + _TYPE = 'live' + _TESTS = [{ + 'url': 'https://tv.salt.ch/channels/german?channel=srf_zwei', + 'only_matching': True, + }, { + 'url': 'https://tv.salt.ch/live/srf1', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if SaltTVIE.suitable(url) else super().suitable(url) + + +class SaltTVRecordingsIE(SaltTVBaseIE): + _VALID_URL = _create_valid_url(SaltTVBaseIE._HOST, r'\d+', 'recording') + _TYPE = 'record' + _TESTS = [{ + 'url': 'https://tv.salt.ch/recordings?recording=193615508', + 'only_matching': True, + }, { + 'url': 'https://tv.salt.ch/tc/ptc_recordings_all_recordings?recording=193615420', + 'only_matching': True, + }] diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zdf.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zdf.py new file mode 100644 index 0000000..c04d51b --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zdf.py @@ -0,0 +1,442 @@ +import re + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + NO_DEFAULT, + ExtractorError, + determine_ext, + extract_attributes, + float_or_none, + int_or_none, + join_nonempty, + merge_dicts, + parse_codecs, + qualities, + traverse_obj, + try_get, + unified_timestamp, + update_url_query, + url_or_none, + urljoin, +) + + +class ZDFBaseIE(InfoExtractor): + _GEO_COUNTRIES = ['DE'] + _QUALITIES = ('auto', 'low', 'med', 'high', 'veryhigh', 'hd', 'fhd', 'uhd') + + def _call_api(self, url, video_id, item, api_token=None, referrer=None): + headers = {} + if api_token: + headers['Api-Auth'] = 'Bearer %s' % api_token + if referrer: + headers['Referer'] = referrer + return self._download_json( + url, video_id, 'Downloading JSON %s' % item, headers=headers) + + @staticmethod + def _extract_subtitles(src): + subtitles = {} + for caption in try_get(src, lambda x: x['captions'], list) or []: + subtitle_url = url_or_none(caption.get('uri')) + if subtitle_url: + lang = caption.get('language', 'deu') + subtitles.setdefault(lang, []).append({ + 'url': subtitle_url, + }) + return subtitles + + def _extract_format(self, video_id, formats, format_urls, meta): + format_url = url_or_none(meta.get('url')) + if not format_url or format_url in format_urls: + return + format_urls.add(format_url) + + mime_type, ext = meta.get('mimeType'), determine_ext(format_url) + if mime_type == 'application/x-mpegURL' or ext == 'm3u8': + new_formats = self._extract_m3u8_formats( + format_url, video_id, 'mp4', m3u8_id='hls', + entry_protocol='m3u8_native', fatal=False) + elif mime_type == 'application/f4m+xml' or ext == 'f4m': + new_formats = self._extract_f4m_formats( + update_url_query(format_url, {'hdcore': '3.7.0'}), video_id, f4m_id='hds', fatal=False) + elif ext == 'mpd': + new_formats = self._extract_mpd_formats( + format_url, video_id, mpd_id='dash', fatal=False) + else: + f = parse_codecs(meta.get('mimeCodec')) + if not f and meta.get('type'): + data = meta['type'].split('_') + if try_get(data, lambda x: x[2]) == ext: + f = {'vcodec': data[0], 'acodec': data[1]} + f.update({ + 'url': format_url, + 'format_id': join_nonempty('http', meta.get('type'), meta.get('quality')), + 'tbr': int_or_none(self._search_regex(r'_(\d+)k_', format_url, 'tbr', default=None)) + }) + new_formats = [f] + formats.extend(merge_dicts(f, { + 'format_note': join_nonempty('quality', 'class', from_dict=meta, delim=', '), + 'language': meta.get('language'), + 'language_preference': 10 if meta.get('class') == 'main' else -10 if meta.get('class') == 'ad' else -1, + 'quality': qualities(self._QUALITIES)(meta.get('quality')), + }) for f in new_formats) + + def _extract_ptmd(self, ptmd_url, video_id, api_token, referrer): + ptmd = self._call_api( + ptmd_url, video_id, 'metadata', api_token, referrer) + + content_id = ptmd.get('basename') or ptmd_url.split('/')[-1] + + formats = [] + track_uris = set() + for p in ptmd['priorityList']: + formitaeten = p.get('formitaeten') + if not isinstance(formitaeten, list): + continue + for f in formitaeten: + f_qualities = f.get('qualities') + if not isinstance(f_qualities, list): + continue + for quality in f_qualities: + tracks = try_get(quality, lambda x: x['audio']['tracks'], list) + if not tracks: + continue + for track in tracks: + self._extract_format( + content_id, formats, track_uris, { + 'url': track.get('uri'), + 'type': f.get('type'), + 'mimeType': f.get('mimeType'), + 'quality': quality.get('quality'), + 'class': track.get('class'), + 'language': track.get('language'), + }) + + duration = float_or_none(try_get( + ptmd, lambda x: x['attributes']['duration']['value']), scale=1000) + + return { + 'extractor_key': ZDFIE.ie_key(), + 'id': content_id, + 'duration': duration, + 'formats': formats, + 'subtitles': self._extract_subtitles(ptmd), + '_format_sort_fields': ('tbr', 'res', 'quality', 'language_preference'), + } + + def _extract_player(self, webpage, video_id, fatal=True): + return self._parse_json( + self._search_regex( + r'(?s)data-zdfplayer-jsb=(["\'])(?P<json>{.+?})\1', webpage, + 'player JSON', default='{}' if not fatal else NO_DEFAULT, + group='json'), + video_id) + + +class ZDFIE(ZDFBaseIE): + _VALID_URL = r'https?://www\.zdf\.de/(?:[^/]+/)*(?P<id>[^/?#&]+)\.html' + _TESTS = [{ + # Same as https://www.phoenix.de/sendungen/ereignisse/corona-nachgehakt/wohin-fuehrt-der-protest-in-der-pandemie-a-2050630.html + 'url': 'https://www.zdf.de/politik/phoenix-sendungen/wohin-fuehrt-der-protest-in-der-pandemie-100.html', + 'md5': '34ec321e7eb34231fd88616c65c92db0', + 'info_dict': { + 'id': '210222_phx_nachgehakt_corona_protest', + 'ext': 'mp4', + 'title': 'Wohin führt der Protest in der Pandemie?', + 'description': 'md5:7d643fe7f565e53a24aac036b2122fbd', + 'duration': 1691, + 'timestamp': 1613948400, + 'upload_date': '20210221', + }, + 'skip': 'No longer available: "Diese Seite wurde leider nicht gefunden"', + }, { + # Same as https://www.3sat.de/film/ab-18/10-wochen-sommer-108.html + 'url': 'https://www.zdf.de/dokumentation/ab-18/10-wochen-sommer-102.html', + 'md5': '0aff3e7bc72c8813f5e0fae333316a1d', + 'info_dict': { + 'id': '141007_ab18_10wochensommer_film', + 'ext': 'mp4', + 'title': 'Ab 18! - 10 Wochen Sommer', + 'description': 'md5:8253f41dc99ce2c3ff892dac2d65fe26', + 'duration': 2660, + 'timestamp': 1608604200, + 'upload_date': '20201222', + }, + 'skip': 'No longer available: "Diese Seite wurde leider nicht gefunden"', + }, { + 'url': 'https://www.zdf.de/nachrichten/heute-journal/heute-journal-vom-30-12-2021-100.html', + 'info_dict': { + 'id': '211230_sendung_hjo', + 'ext': 'mp4', + 'description': 'md5:47dff85977bde9fb8cba9e9c9b929839', + 'duration': 1890.0, + 'upload_date': '20211230', + 'chapters': list, + 'thumbnail': 'md5:e65f459f741be5455c952cd820eb188e', + 'title': 'heute journal vom 30.12.2021', + 'timestamp': 1640897100, + }, + 'skip': 'No longer available: "Diese Seite wurde leider nicht gefunden"', + }, { + 'url': 'https://www.zdf.de/dokumentation/terra-x/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100.html', + 'info_dict': { + 'id': '151025_magie_farben2_tex', + 'ext': 'mp4', + 'title': 'Die Magie der Farben (2/2)', + 'description': 'md5:a89da10c928c6235401066b60a6d5c1a', + 'duration': 2615, + 'timestamp': 1465021200, + 'upload_date': '20160604', + 'thumbnail': 'https://www.zdf.de/assets/mauve-im-labor-100~768x432?cb=1464909117806', + }, + }, { + 'url': 'https://www.zdf.de/funk/druck-11790/funk-alles-ist-verzaubert-102.html', + 'md5': '57af4423db0455a3975d2dc4578536bc', + 'info_dict': { + 'ext': 'mp4', + 'id': 'video_funk_1770473', + 'duration': 1278, + 'description': 'Die Neue an der Schule verdreht Ismail den Kopf.', + 'title': 'Alles ist verzaubert', + 'timestamp': 1635520560, + 'upload_date': '20211029', + 'thumbnail': 'https://www.zdf.de/assets/teaser-funk-alles-ist-verzaubert-102~1920x1080?cb=1663848412907', + }, + }, { + # Same as https://www.phoenix.de/sendungen/dokumentationen/gesten-der-maechtigen-i-a-89468.html?ref=suche + 'url': 'https://www.zdf.de/politik/phoenix-sendungen/die-gesten-der-maechtigen-100.html', + 'only_matching': True, + }, { + # Same as https://www.3sat.de/film/spielfilm/der-hauptmann-100.html + 'url': 'https://www.zdf.de/filme/filme-sonstige/der-hauptmann-112.html', + 'only_matching': True, + }, { + # Same as https://www.3sat.de/wissen/nano/nano-21-mai-2019-102.html, equal media ids + 'url': 'https://www.zdf.de/wissen/nano/nano-21-mai-2019-102.html', + 'only_matching': True, + }, { + 'url': 'https://www.zdf.de/service-und-hilfe/die-neue-zdf-mediathek/zdfmediathek-trailer-100.html', + 'only_matching': True, + }, { + 'url': 'https://www.zdf.de/filme/taunuskrimi/die-lebenden-und-die-toten-1---ein-taunuskrimi-100.html', + 'only_matching': True, + }, { + 'url': 'https://www.zdf.de/dokumentation/planet-e/planet-e-uebersichtsseite-weitere-dokumentationen-von-planet-e-100.html', + 'only_matching': True, + }, { + 'url': 'https://www.zdf.de/arte/todliche-flucht/page-video-artede-toedliche-flucht-16-100.html', + 'info_dict': { + 'id': 'video_artede_083871-001-A', + 'ext': 'mp4', + 'title': 'Tödliche Flucht (1/6)', + 'description': 'md5:e34f96a9a5f8abd839ccfcebad3d5315', + 'duration': 3193.0, + 'timestamp': 1641355200, + 'upload_date': '20220105', + }, + 'skip': 'No longer available "Diese Seite wurde leider nicht gefunden"' + }, { + 'url': 'https://www.zdf.de/serien/soko-stuttgart/das-geld-anderer-leute-100.html', + 'info_dict': { + 'id': '191205_1800_sendung_sok8', + 'ext': 'mp4', + 'title': 'Das Geld anderer Leute', + 'description': 'md5:cb6f660850dc5eb7d1ab776ea094959d', + 'duration': 2581.0, + 'timestamp': 1675160100, + 'upload_date': '20230131', + 'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/e2d7e55a-09f0-424e-ac73-6cac4dd65f35?layout=2400x1350', + }, + }, { + 'url': 'https://www.zdf.de/dokumentation/terra-x/unser-gruener-planet-wuesten-doku-100.html', + 'info_dict': { + 'id': '220605_dk_gruener_planet_wuesten_tex', + 'ext': 'mp4', + 'title': 'Unser grüner Planet - Wüsten', + 'description': 'md5:4fc647b6f9c3796eea66f4a0baea2862', + 'duration': 2613.0, + 'timestamp': 1654450200, + 'upload_date': '20220605', + 'format_note': 'uhd, main', + 'thumbnail': 'https://www.zdf.de/assets/saguaro-kakteen-102~3840x2160?cb=1655910690796', + }, + }] + + def _extract_entry(self, url, player, content, video_id): + title = content.get('title') or content['teaserHeadline'] + + t = content['mainVideoContent']['http://zdf.de/rels/target'] + ptmd_path = traverse_obj(t, ( + (('streams', 'default'), None), + ('http://zdf.de/rels/streams/ptmd', 'http://zdf.de/rels/streams/ptmd-template') + ), get_all=False) + if not ptmd_path: + raise ExtractorError('Could not extract ptmd_path') + + info = self._extract_ptmd( + urljoin(url, ptmd_path.replace('{playerId}', 'android_native_5')), video_id, player['apiToken'], url) + + thumbnails = [] + layouts = try_get( + content, lambda x: x['teaserImageRef']['layouts'], dict) + if layouts: + for layout_key, layout_url in layouts.items(): + layout_url = url_or_none(layout_url) + if not layout_url: + continue + thumbnail = { + 'url': layout_url, + 'format_id': layout_key, + } + mobj = re.search(r'(?P<width>\d+)x(?P<height>\d+)', layout_key) + if mobj: + thumbnail.update({ + 'width': int(mobj.group('width')), + 'height': int(mobj.group('height')), + }) + thumbnails.append(thumbnail) + + chapter_marks = t.get('streamAnchorTag') or [] + chapter_marks.append({'anchorOffset': int_or_none(t.get('duration'))}) + chapters = [{ + 'start_time': chap.get('anchorOffset'), + 'end_time': next_chap.get('anchorOffset'), + 'title': chap.get('anchorLabel') + } for chap, next_chap in zip(chapter_marks, chapter_marks[1:])] + + return merge_dicts(info, { + 'title': title, + 'description': content.get('leadParagraph') or content.get('teasertext'), + 'duration': int_or_none(t.get('duration')), + 'timestamp': unified_timestamp(content.get('editorialDate')), + 'thumbnails': thumbnails, + 'chapters': chapters or None + }) + + def _extract_regular(self, url, player, video_id): + content = self._call_api( + player['content'], video_id, 'content', player['apiToken'], url) + return self._extract_entry(player['content'], player, content, video_id) + + def _extract_mobile(self, video_id): + video = self._download_json( + 'https://zdf-cdn.live.cellular.de/mediathekV2/document/%s' % video_id, + video_id) + + formats = [] + formitaeten = try_get(video, lambda x: x['document']['formitaeten'], list) + document = formitaeten and video['document'] + if formitaeten: + title = document['titel'] + content_id = document['basename'] + + format_urls = set() + for f in formitaeten or []: + self._extract_format(content_id, formats, format_urls, f) + + thumbnails = [] + teaser_bild = document.get('teaserBild') + if isinstance(teaser_bild, dict): + for thumbnail_key, thumbnail in teaser_bild.items(): + thumbnail_url = try_get( + thumbnail, lambda x: x['url'], compat_str) + if thumbnail_url: + thumbnails.append({ + 'url': thumbnail_url, + 'id': thumbnail_key, + 'width': int_or_none(thumbnail.get('width')), + 'height': int_or_none(thumbnail.get('height')), + }) + + return { + 'id': content_id, + 'title': title, + 'description': document.get('beschreibung'), + 'duration': int_or_none(document.get('length')), + 'timestamp': unified_timestamp(document.get('date')) or unified_timestamp( + try_get(video, lambda x: x['meta']['editorialDate'], compat_str)), + 'thumbnails': thumbnails, + 'subtitles': self._extract_subtitles(document), + 'formats': formats, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + webpage = self._download_webpage(url, video_id, fatal=False) + if webpage: + player = self._extract_player(webpage, url, fatal=False) + if player: + return self._extract_regular(url, player, video_id) + + return self._extract_mobile(video_id) + + +class ZDFChannelIE(ZDFBaseIE): + _VALID_URL = r'https?://www\.zdf\.de/(?:[^/]+/)*(?P<id>[^/?#&]+)' + _TESTS = [{ + 'url': 'https://www.zdf.de/sport/das-aktuelle-sportstudio', + 'info_dict': { + 'id': 'das-aktuelle-sportstudio', + 'title': 'das aktuelle sportstudio', + }, + 'playlist_mincount': 18, + }, { + 'url': 'https://www.zdf.de/dokumentation/planet-e', + 'info_dict': { + 'id': 'planet-e', + 'title': 'planet e.', + }, + 'playlist_mincount': 50, + }, { + 'url': 'https://www.zdf.de/gesellschaft/aktenzeichen-xy-ungeloest', + 'info_dict': { + 'id': 'aktenzeichen-xy-ungeloest', + 'title': 'Aktenzeichen XY... ungelöst', + 'entries': "lambda x: not any('xy580-fall1-kindermoerder-gesucht-100' in e['url'] for e in x)", + }, + 'playlist_mincount': 2, + }, { + 'url': 'https://www.zdf.de/filme/taunuskrimi/', + 'only_matching': True, + }] + + @classmethod + def suitable(cls, url): + return False if ZDFIE.suitable(url) else super(ZDFChannelIE, cls).suitable(url) + + def _og_search_title(self, webpage, fatal=False): + title = super(ZDFChannelIE, self)._og_search_title(webpage, fatal=fatal) + return re.split(r'\s+[-|]\s+ZDF(?:mediathek)?$', title or '')[0] or None + + def _real_extract(self, url): + channel_id = self._match_id(url) + + webpage = self._download_webpage(url, channel_id) + + matches = re.finditer( + r'''<div\b[^>]*?\sdata-plusbar-id\s*=\s*(["'])(?P<p_id>[\w-]+)\1[^>]*?\sdata-plusbar-url=\1(?P<url>%s)\1''' % ZDFIE._VALID_URL, + webpage) + + if self._downloader.params.get('noplaylist', False): + entry = next( + (self.url_result(m.group('url'), ie=ZDFIE.ie_key()) for m in matches), + None) + self.to_screen('Downloading just the main video because of --no-playlist') + if entry: + return entry + else: + self.to_screen('Downloading playlist %s - add --no-playlist to download just the main video' % (channel_id, )) + + def check_video(m): + v_ref = self._search_regex( + r'''(<a\b[^>]*?\shref\s*=[^>]+?\sdata-target-id\s*=\s*(["'])%s\2[^>]*>)''' % (m.group('p_id'), ), + webpage, 'check id', default='') + v_ref = extract_attributes(v_ref) + return v_ref.get('data-target-video-type') != 'novideo' + + return self.playlist_from_matches( + (m.group('url') for m in matches if check_video(m)), + channel_id, self._og_search_title(webpage, fatal=False)) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zee5.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zee5.py new file mode 100644 index 0000000..ca79cf0 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zee5.py @@ -0,0 +1,270 @@ +import json +import time +import uuid + +from .common import InfoExtractor +from ..compat import compat_str +from ..utils import ( + ExtractorError, + int_or_none, + jwt_decode_hs256, + parse_age_limit, + str_or_none, + try_call, + try_get, + unified_strdate, + unified_timestamp, + url_or_none, +) + + +class Zee5IE(InfoExtractor): + _VALID_URL = r'''(?x) + (?: + zee5:| + https?://(?:www\.)?zee5\.com/(?:[^#?]+/)? + (?: + (?:tv-shows|kids|web-series|zee5originals)(?:/[^#/?]+){3} + |(?:movies|kids|videos|news|music-videos)/(?!kids-shows)[^#/?]+ + )/(?P<display_id>[^#/?]+)/ + ) + (?P<id>[^#/?]+)/?(?:$|[?#]) + ''' + _TESTS = [{ + 'url': 'https://www.zee5.com/movies/details/adavari-matalaku-ardhale-verule/0-0-movie_1143162669', + 'info_dict': { + 'id': '0-0-movie_1143162669', + 'ext': 'mp4', + 'display_id': 'adavari-matalaku-ardhale-verule', + 'title': 'Adavari Matalaku Ardhale Verule', + 'duration': 9360, + 'description': compat_str, + 'alt_title': 'Adavari Matalaku Ardhale Verule', + 'uploader': 'Zee Entertainment Enterprises Ltd', + 'release_date': '20070427', + 'upload_date': '20070427', + 'timestamp': 1177632000, + 'thumbnail': r're:^https?://.*\.jpg$', + 'episode_number': 0, + 'episode': 'Episode 0', + 'tags': list + }, + 'params': { + 'format': 'bv', + }, + }, { + 'url': 'https://www.zee5.com/kids/kids-shows/bandbudh-aur-budbak/0-6-1899/yoga-se-hoga-bandbudh-aur-budbak/0-1-239839', + 'info_dict': { + 'id': '0-1-239839', + 'ext': 'mp4', + 'display_id': 'yoga-se-hoga-bandbudh-aur-budbak', + 'title': 'Yoga Se Hoga-Bandbudh aur Budbak', + 'duration': 659, + 'description': compat_str, + 'alt_title': 'Yoga Se Hoga-Bandbudh aur Budbak', + 'uploader': 'Zee Entertainment Enterprises Ltd', + 'release_date': '20150101', + 'upload_date': '20150101', + 'timestamp': 1420070400, + 'thumbnail': r're:^https?://.*\.jpg$', + 'series': 'Bandbudh Aur Budbak', + 'season_number': 1, + 'episode_number': 1, + 'episode': 'Episode 1', + 'season': 'Season 1', + 'tags': list, + }, + 'params': { + 'format': 'bv', + }, + }, { + 'url': 'https://www.zee5.com/hi/tv-shows/details/kundali-bhagya/0-6-366/kundali-bhagya-march-08-2021/0-1-manual_7g9jv1os7730?country=IN', + 'only_matching': True + }, { + 'url': 'https://www.zee5.com/global/hi/tv-shows/details/kundali-bhagya/0-6-366/kundali-bhagya-march-08-2021/0-1-manual_7g9jv1os7730', + 'only_matching': True + }, { + 'url': 'https://www.zee5.com/web-series/details/mithya/0-6-4z587408/maine-dekhi-hai-uski-mrityu/0-1-6z587412', + 'only_matching': True + }, { + 'url': 'https://www.zee5.com/kids/kids-movies/maya-bommalu/0-0-movie_1040370005', + 'only_matching': True + }, { + 'url': 'https://www.zee5.com/news/details/jana-sena-chief-pawan-kalyan-shows-slippers-to-ysrcp-leaders/0-0-newsauto_6ettj4242oo0', + 'only_matching': True + }, { + 'url': 'https://www.zee5.com/music-videos/details/adhento-gaani-vunnapaatuga-jersey-nani-shraddha-srinath/0-0-56973', + 'only_matching': True + }] + _DEVICE_ID = str(uuid.uuid4()) + _USER_TOKEN = None + _LOGIN_HINT = 'Use "--username <mobile_number>" to login using otp or "--username token" and "--password <user_token>" to login using user token.' + _NETRC_MACHINE = 'zee5' + _GEO_COUNTRIES = ['IN'] + _USER_COUNTRY = None + + def _perform_login(self, username, password): + if len(username) == 10 and username.isdigit() and self._USER_TOKEN is None: + self.report_login() + otp_request_json = self._download_json(f'https://b2bapi.zee5.com/device/sendotp_v1.php?phoneno=91{username}', + None, note='Sending OTP') + if otp_request_json['code'] == 0: + self.to_screen(otp_request_json['message']) + else: + raise ExtractorError(otp_request_json['message'], expected=True) + otp_code = self._get_tfa_info('OTP') + otp_verify_json = self._download_json(f'https://b2bapi.zee5.com/device/verifyotp_v1.php?phoneno=91{username}&otp={otp_code}&guest_token={self._DEVICE_ID}&platform=web', + None, note='Verifying OTP', fatal=False) + if not otp_verify_json: + raise ExtractorError('Unable to verify OTP.', expected=True) + self._USER_TOKEN = otp_verify_json.get('token') + if not self._USER_TOKEN: + raise ExtractorError(otp_request_json['message'], expected=True) + elif username.lower() == 'token' and try_call(lambda: jwt_decode_hs256(password)): + self._USER_TOKEN = password + else: + raise ExtractorError(self._LOGIN_HINT, expected=True) + + token = jwt_decode_hs256(self._USER_TOKEN) + if token.get('exp', 0) <= int(time.time()): + raise ExtractorError('User token has expired', expected=True) + self._USER_COUNTRY = token.get('current_country') + + def _real_extract(self, url): + video_id, display_id = self._match_valid_url(url).group('id', 'display_id') + access_token_request = self._download_json( + 'https://launchapi.zee5.com/launch?platform_name=web_app', + video_id, note='Downloading access token')['platform_token'] + data = { + 'x-access-token': access_token_request['token'] + } + if self._USER_TOKEN: + data['Authorization'] = 'bearer %s' % self._USER_TOKEN + else: + data['X-Z5-Guest-Token'] = self._DEVICE_ID + + json_data = self._download_json( + 'https://spapi.zee5.com/singlePlayback/getDetails/secure', video_id, query={ + 'content_id': video_id, + 'device_id': self._DEVICE_ID, + 'platform_name': 'desktop_web', + 'country': self._USER_COUNTRY or self.get_param('geo_bypass_country') or 'IN', + 'check_parental_control': False, + }, headers={'content-type': 'application/json'}, data=json.dumps(data).encode('utf-8')) + asset_data = json_data['assetDetails'] + show_data = json_data.get('showDetails', {}) + if 'premium' in asset_data['business_type']: + raise ExtractorError('Premium content is DRM protected.', expected=True) + if not asset_data.get('hls_url'): + self.raise_login_required(self._LOGIN_HINT, metadata_available=True, method=None) + formats, m3u8_subs = self._extract_m3u8_formats_and_subtitles(asset_data['hls_url'], video_id, 'mp4', fatal=False) + + subtitles = {} + for sub in asset_data.get('subtitle_url', []): + sub_url = sub.get('url') + if not sub_url: + continue + subtitles.setdefault(sub.get('language', 'en'), []).append({ + 'url': self._proto_relative_url(sub_url), + }) + subtitles = self._merge_subtitles(subtitles, m3u8_subs) + return { + 'id': video_id, + 'display_id': display_id, + 'title': asset_data['title'], + 'formats': formats, + 'subtitles': subtitles, + 'duration': int_or_none(asset_data.get('duration')), + 'description': str_or_none(asset_data.get('description')), + 'alt_title': str_or_none(asset_data.get('original_title')), + 'uploader': str_or_none(asset_data.get('content_owner')), + 'age_limit': parse_age_limit(asset_data.get('age_rating')), + 'release_date': unified_strdate(asset_data.get('release_date')), + 'timestamp': unified_timestamp(asset_data.get('release_date')), + 'thumbnail': url_or_none(asset_data.get('image_url')), + 'series': str_or_none(asset_data.get('tvshow_name')), + 'season': try_get(show_data, lambda x: x['seasons']['title'], str), + 'season_number': int_or_none(try_get(show_data, lambda x: x['seasons'][0]['orderid'])), + 'episode_number': int_or_none(try_get(asset_data, lambda x: x['orderid'])), + 'tags': try_get(asset_data, lambda x: x['tags'], list) + } + + +class Zee5SeriesIE(InfoExtractor): + IE_NAME = 'zee5:series' + _VALID_URL = r'''(?x) + (?: + zee5:series:| + https?://(?:www\.)?zee5\.com/(?:[^#?]+/)? + (?:tv-shows|web-series|kids|zee5originals)/(?!kids-movies)(?:[^#/?]+/){2} + ) + (?P<id>[^#/?]+)(?:/episodes)?/?(?:$|[?#]) + ''' + _TESTS = [{ + 'url': 'https://www.zee5.com/kids/kids-shows/bandbudh-aur-budbak/0-6-1899', + 'playlist_mincount': 156, + 'info_dict': { + 'id': '0-6-1899', + }, + }, { + 'url': 'https://www.zee5.com/tv-shows/details/bhabi-ji-ghar-par-hai/0-6-199', + 'playlist_mincount': 1500, + 'info_dict': { + 'id': '0-6-199', + }, + }, { + 'url': 'https://www.zee5.com/tv-shows/details/agent-raghav-crime-branch/0-6-965', + 'playlist_mincount': 24, + 'info_dict': { + 'id': '0-6-965', + }, + }, { + 'url': 'https://www.zee5.com/ta/tv-shows/details/nagabhairavi/0-6-3201', + 'playlist_mincount': 3, + 'info_dict': { + 'id': '0-6-3201', + }, + }, { + 'url': 'https://www.zee5.com/global/hi/tv-shows/details/khwaabon-ki-zamin-par/0-6-270', + 'playlist_mincount': 150, + 'info_dict': { + 'id': '0-6-270', + }, + }, { + 'url': 'https://www.zee5.com/tv-shows/details/chala-hawa-yeu-dya-ladies-zindabaad/0-6-2943/episodes', + 'only_matching': True, + }, { + 'url': 'https://www.zee5.com/web-series/details/mithya/0-6-4z587408', + 'only_matching': True, + }] + + def _entries(self, show_id): + access_token_request = self._download_json( + 'https://launchapi.zee5.com/launch?platform_name=web_app', + show_id, note='Downloading access token')['platform_token'] + headers = { + 'X-Access-Token': access_token_request['token'], + 'Referer': 'https://www.zee5.com/', + } + show_url = f'https://gwapi.zee5.com/content/tvshow/{show_id}?translation=en&country=IN' + + page_num = 0 + show_json = self._download_json(show_url, video_id=show_id, headers=headers) + for season in show_json.get('seasons') or []: + season_id = try_get(season, lambda x: x['id'], compat_str) + next_url = f'https://gwapi.zee5.com/content/tvshow/?season_id={season_id}&type=episode&translation=en&country=IN&on_air=false&asset_subtype=tvshow&page=1&limit=100' + while next_url: + page_num += 1 + episodes_json = self._download_json( + next_url, video_id=show_id, headers=headers, + note='Downloading JSON metadata page %d' % page_num) + for episode in try_get(episodes_json, lambda x: x['episode'], list) or []: + video_id = episode.get('id') + yield self.url_result( + 'zee5:%s' % video_id, + ie=Zee5IE.ie_key(), video_id=video_id) + next_url = url_or_none(episodes_json.get('next_episode_api')) + + def _real_extract(self, url): + show_id = self._match_id(url) + return self.playlist_result(self._entries(show_id), playlist_id=show_id) diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/zeenews.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zeenews.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/zeenews.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/zeenews.py diff --git a/lib/python3.11/site-packages/yt_dlp/extractor/zhihu.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zhihu.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/extractor/zhihu.py rename to python/lib/python3.10/site-packages/yt_dlp/extractor/zhihu.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zingmp3.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zingmp3.py new file mode 100644 index 0000000..007658c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zingmp3.py @@ -0,0 +1,426 @@ +import hashlib +import hmac +import itertools +import json +import urllib.parse + +from .common import InfoExtractor +from ..utils import int_or_none, traverse_obj, try_call, urljoin + + +class ZingMp3BaseIE(InfoExtractor): + _VALID_URL_TMPL = r'https?://(?:mp3\.zing|zingmp3)\.vn/(?P<type>(?:%s))/[^/?#]+/(?P<id>\w+)(?:\.html|\?)' + _GEO_COUNTRIES = ['VN'] + _DOMAIN = 'https://zingmp3.vn' + _PER_PAGE = 50 + _API_SLUGS = { + # Audio/video + 'bai-hat': '/api/v2/page/get/song', + 'embed': '/api/v2/page/get/song', + 'video-clip': '/api/v2/page/get/video', + 'lyric': '/api/v2/lyric/get/lyric', + 'song-streaming': '/api/v2/song/get/streaming', + # Playlist + 'playlist': '/api/v2/page/get/playlist', + 'album': '/api/v2/page/get/playlist', + # Chart + 'zing-chart': '/api/v2/page/get/chart-home', + 'zing-chart-tuan': '/api/v2/page/get/week-chart', + 'moi-phat-hanh': '/api/v2/page/get/newrelease-chart', + 'the-loai-video': '/api/v2/video/get/list', + # User + 'info-artist': '/api/v2/page/get/artist', + 'user-list-song': '/api/v2/song/get/list', + 'user-list-video': '/api/v2/video/get/list', + 'hub': '/api/v2/page/get/hub-detail', + } + + def _api_url(self, url_type, params): + api_slug = self._API_SLUGS[url_type] + params.update({'ctime': '1'}) + sha256 = hashlib.sha256( + ''.join(f'{k}={v}' for k, v in sorted(params.items())).encode()).hexdigest() + data = { + **params, + 'apiKey': 'X5BM3w8N7MKozC0B85o4KMlzLZKhV00y', + 'sig': hmac.new(b'acOrvUS15XRW2o9JksiK1KgQ6Vbds8ZW', + f'{api_slug}{sha256}'.encode(), hashlib.sha512).hexdigest(), + } + return f'{self._DOMAIN}{api_slug}?{urllib.parse.urlencode(data)}' + + def _call_api(self, url_type, params, display_id=None, **kwargs): + resp = self._download_json( + self._api_url(url_type, params), display_id or params.get('id'), + note=f'Downloading {url_type} JSON metadata', **kwargs) + return (resp or {}).get('data') or {} + + def _real_initialize(self): + if not self._cookies_passed: + self._request_webpage( + self._api_url('bai-hat', {'id': ''}), None, note='Updating cookies') + + def _parse_items(self, items): + for url in traverse_obj(items, (..., 'link')) or []: + yield self.url_result(urljoin(self._DOMAIN, url)) + + def _fetch_page(self, id_, url_type, page): + raise NotImplementedError('This method must be implemented by subclasses') + + def _paged_list(self, _id, url_type): + count = 0 + for page in itertools.count(1): + data = self._fetch_page(_id, url_type, page) + entries = list(self._parse_items(data.get('items'))) + count += len(entries) + yield from entries + if not data.get('hasMore') or try_call(lambda: count > data['total']): + break + + +class ZingMp3IE(ZingMp3BaseIE): + _VALID_URL = ZingMp3BaseIE._VALID_URL_TMPL % 'bai-hat|video-clip|embed' + IE_NAME = 'zingmp3' + IE_DESC = 'zingmp3.vn' + _TESTS = [{ + 'url': 'https://mp3.zing.vn/bai-hat/Xa-Mai-Xa-Bao-Thy/ZWZB9WAB.html', + 'md5': 'ead7ae13693b3205cbc89536a077daed', + 'info_dict': { + 'id': 'ZWZB9WAB', + 'title': 'Xa Mãi Xa', + 'ext': 'mp3', + 'thumbnail': r're:^https?://.+\.jpg', + 'subtitles': { + 'origin': [{ + 'ext': 'lrc', + }] + }, + 'duration': 255, + 'track': 'Xa Mãi Xa', + 'artist': 'Bảo Thy', + 'album': 'Special Album', + 'album_artist': 'Bảo Thy', + }, + }, { + 'url': 'https://zingmp3.vn/video-clip/Suong-Hoa-Dua-Loi-K-ICM-RYO/ZO8ZF7C7.html', + 'md5': '3c2081e79471a2f4a3edd90b70b185ea', + 'info_dict': { + 'id': 'ZO8ZF7C7', + 'title': 'Sương Hoa ÄÆ°a Lối', + 'ext': 'mp4', + 'thumbnail': r're:^https?://.+\.jpg', + 'duration': 207, + 'track': 'Sương Hoa ÄÆ°a Lối', + 'artist': 'K-ICM, RYO', + 'album': 'Sương Hoa ÄÆ°a Lối (Single)', + 'album_artist': 'K-ICM, RYO', + }, + }, { + 'url': 'https://zingmp3.vn/bai-hat/Nguoi-Yeu-Toi-Lanh-Lung-Sat-Da-Mr-Siro/ZZ6IW7OU.html', + 'md5': '3e9f7a9bd0d965573dbff8d7c68b629d', + 'info_dict': { + 'id': 'ZZ6IW7OU', + 'title': 'Ngưá»i Yêu Tôi Lạnh Lùng Sắt Äá', + 'ext': 'mp3', + 'thumbnail': r're:^https?://.+\.jpg', + 'duration': 303, + 'track': 'Ngưá»i Yêu Tôi Lạnh Lùng Sắt Äá', + 'artist': 'Mr. Siro', + 'album': 'Ngưá»i Yêu Tôi Lạnh Lùng Sắt Äá (Single)', + 'album_artist': 'Mr. Siro', + }, + }, { + 'url': 'https://zingmp3.vn/embed/song/ZWZEI76B?start=false', + 'only_matching': True, + }, { + 'url': 'https://zingmp3.vn/bai-hat/Xa-Mai-Xa-Bao-Thy/ZWZB9WAB.html', + 'only_matching': True, + }] + + def _real_extract(self, url): + song_id, url_type = self._match_valid_url(url).group('id', 'type') + item = self._call_api(url_type, {'id': song_id}) + + item_id = item.get('encodeId') or song_id + if url_type == 'video-clip': + source = item.get('streaming') + source['mp4'] = self._download_json( + 'http://api.mp3.zing.vn/api/mobile/video/getvideoinfo', item_id, + query={'requestdata': json.dumps({'id': item_id})}, + note='Downloading mp4 JSON metadata').get('source') + else: + source = self._call_api('song-streaming', {'id': item_id}) + + formats = [] + for k, v in (source or {}).items(): + if not v or v == 'VIP': + continue + if k not in ('mp4', 'hls'): + formats.append({ + 'ext': 'mp3', + 'format_id': k, + 'tbr': int_or_none(k), + 'url': self._proto_relative_url(v), + 'vcodec': 'none', + }) + continue + for res, video_url in v.items(): + if not video_url: + continue + if k == 'hls': + formats.extend(self._extract_m3u8_formats(video_url, item_id, 'mp4', m3u8_id=k, fatal=False)) + continue + formats.append({ + 'format_id': f'mp4-{res}', + 'url': video_url, + 'height': int_or_none(res), + }) + + if not formats: + if item.get('msg') == 'Sorry, this content is not available in your country.': + self.raise_geo_restricted(countries=self._GEO_COUNTRIES, metadata_available=True) + else: + self.raise_no_formats('The song is only for VIP accounts.') + + lyric = item.get('lyric') or self._call_api('lyric', {'id': item_id}, fatal=False).get('file') + + return { + 'id': item_id, + 'title': traverse_obj(item, 'title', 'alias'), + 'thumbnail': traverse_obj(item, 'thumbnail', 'thumbnailM'), + 'duration': int_or_none(item.get('duration')), + 'track': traverse_obj(item, 'title', 'alias'), + 'artist': traverse_obj(item, 'artistsNames', 'artists_names'), + 'album': traverse_obj(item, ('album', ('name', 'title')), get_all=False), + 'album_artist': traverse_obj(item, ('album', ('artistsNames', 'artists_names')), get_all=False), + 'formats': formats, + 'subtitles': {'origin': [{'url': lyric}]} if lyric else None, + } + + +class ZingMp3AlbumIE(ZingMp3BaseIE): + _VALID_URL = ZingMp3BaseIE._VALID_URL_TMPL % 'album|playlist' + _TESTS = [{ + 'url': 'http://mp3.zing.vn/album/Lau-Dai-Tinh-Ai-Bang-Kieu-Minh-Tuyet/ZWZBWDAF.html', + 'info_dict': { + 'id': 'ZWZBWDAF', + 'title': 'Lâu Äài Tình Ãi', + }, + 'playlist_mincount': 9, + }, { + 'url': 'https://zingmp3.vn/album/Nhung-Bai-Hat-Hay-Nhat-Cua-Mr-Siro-Mr-Siro/ZWZAEZZD.html', + 'info_dict': { + 'id': 'ZWZAEZZD', + 'title': 'Những Bài Hát Hay Nhất Cá»§a Mr. Siro', + }, + 'playlist_mincount': 20, + }, { + 'url': 'http://mp3.zing.vn/playlist/Duong-Hong-Loan-apollobee/IWCAACCB.html', + 'only_matching': True, + }, { + 'url': 'https://zingmp3.vn/album/Lau-Dai-Tinh-Ai-Bang-Kieu-Minh-Tuyet/ZWZBWDAF.html', + 'only_matching': True, + }] + IE_NAME = 'zingmp3:album' + + def _real_extract(self, url): + song_id, url_type = self._match_valid_url(url).group('id', 'type') + data = self._call_api(url_type, {'id': song_id}) + return self.playlist_result( + self._parse_items(traverse_obj(data, ('song', 'items'))), + traverse_obj(data, 'id', 'encodeId'), traverse_obj(data, 'name', 'title')) + + +class ZingMp3ChartHomeIE(ZingMp3BaseIE): + _VALID_URL = r'https?://(?:mp3\.zing|zingmp3)\.vn/(?P<id>(?:zing-chart|moi-phat-hanh))/?(?:[#?]|$)' + _TESTS = [{ + 'url': 'https://zingmp3.vn/zing-chart', + 'info_dict': { + 'id': 'zing-chart', + }, + 'playlist_mincount': 100, + }, { + 'url': 'https://zingmp3.vn/moi-phat-hanh', + 'info_dict': { + 'id': 'moi-phat-hanh', + }, + 'playlist_mincount': 100, + }] + IE_NAME = 'zingmp3:chart-home' + + def _real_extract(self, url): + url_type = self._match_id(url) + data = self._call_api(url_type, {'id': url_type}) + items = traverse_obj(data, ('RTChart', 'items') if url_type == 'zing-chart' else 'items') + return self.playlist_result(self._parse_items(items), url_type) + + +class ZingMp3WeekChartIE(ZingMp3BaseIE): + _VALID_URL = ZingMp3BaseIE._VALID_URL_TMPL % 'zing-chart-tuan' + IE_NAME = 'zingmp3:week-chart' + _TESTS = [{ + 'url': 'https://zingmp3.vn/zing-chart-tuan/Bai-hat-Viet-Nam/IWZ9Z08I.html', + 'info_dict': { + 'id': 'IWZ9Z08I', + 'title': 'zing-chart-vn', + }, + 'playlist_mincount': 10, + }, { + 'url': 'https://zingmp3.vn/zing-chart-tuan/Bai-hat-US-UK/IWZ9Z0BW.html', + 'info_dict': { + 'id': 'IWZ9Z0BW', + 'title': 'zing-chart-us', + }, + 'playlist_mincount': 10, + }, { + 'url': 'https://zingmp3.vn/zing-chart-tuan/Bai-hat-KPop/IWZ9Z0BO.html', + 'info_dict': { + 'id': 'IWZ9Z0BO', + 'title': 'zing-chart-korea', + }, + 'playlist_mincount': 10, + }] + + def _real_extract(self, url): + song_id, url_type = self._match_valid_url(url).group('id', 'type') + data = self._call_api(url_type, {'id': song_id}) + return self.playlist_result( + self._parse_items(data['items']), song_id, f'zing-chart-{data.get("country", "")}') + + +class ZingMp3ChartMusicVideoIE(ZingMp3BaseIE): + _VALID_URL = r'https?://(?:mp3\.zing|zingmp3)\.vn/(?P<type>the-loai-video)/(?P<regions>[^/]+)/(?P<id>[^\.]+)' + IE_NAME = 'zingmp3:chart-music-video' + _TESTS = [{ + 'url': 'https://zingmp3.vn/the-loai-video/Viet-Nam/IWZ9Z08I.html', + 'info_dict': { + 'id': 'IWZ9Z08I', + 'title': 'the-loai-video_Viet-Nam', + }, + 'playlist_mincount': 400, + }, { + 'url': 'https://zingmp3.vn/the-loai-video/Au-My/IWZ9Z08O.html', + 'info_dict': { + 'id': 'IWZ9Z08O', + 'title': 'the-loai-video_Au-My', + }, + 'playlist_mincount': 40, + }, { + 'url': 'https://zingmp3.vn/the-loai-video/Han-Quoc/IWZ9Z08W.html', + 'info_dict': { + 'id': 'IWZ9Z08W', + 'title': 'the-loai-video_Han-Quoc', + }, + 'playlist_mincount': 30, + }, { + 'url': 'https://zingmp3.vn/the-loai-video/Khong-Loi/IWZ9Z086.html', + 'info_dict': { + 'id': 'IWZ9Z086', + 'title': 'the-loai-video_Khong-Loi', + }, + 'playlist_mincount': 1, + }] + + def _fetch_page(self, song_id, url_type, page): + return self._call_api(url_type, { + 'id': song_id, + 'type': 'genre', + 'page': page, + 'count': self._PER_PAGE + }) + + def _real_extract(self, url): + song_id, regions, url_type = self._match_valid_url(url).group('id', 'regions', 'type') + return self.playlist_result(self._paged_list(song_id, url_type), song_id, f'{url_type}_{regions}') + + +class ZingMp3UserIE(ZingMp3BaseIE): + _VALID_URL = r'https?://(?:mp3\.zing|zingmp3)\.vn/(?P<user>[^/]+)/(?P<type>bai-hat|single|album|video)/?(?:[?#]|$)' + IE_NAME = 'zingmp3:user' + _TESTS = [{ + 'url': 'https://zingmp3.vn/Mr-Siro/bai-hat', + 'info_dict': { + 'id': 'IWZ98609', + 'title': 'Mr. Siro - bai-hat', + 'description': 'md5:5bdcf45e955dc1b8d7f518f322ffef36', + }, + 'playlist_mincount': 91, + }, { + 'url': 'https://zingmp3.vn/Mr-Siro/album', + 'info_dict': { + 'id': 'IWZ98609', + 'title': 'Mr. Siro - album', + 'description': 'md5:5bdcf45e955dc1b8d7f518f322ffef36', + }, + 'playlist_mincount': 3, + }, { + 'url': 'https://zingmp3.vn/Mr-Siro/single', + 'info_dict': { + 'id': 'IWZ98609', + 'title': 'Mr. Siro - single', + 'description': 'md5:5bdcf45e955dc1b8d7f518f322ffef36', + }, + 'playlist_mincount': 20, + }, { + 'url': 'https://zingmp3.vn/Mr-Siro/video', + 'info_dict': { + 'id': 'IWZ98609', + 'title': 'Mr. Siro - video', + 'description': 'md5:5bdcf45e955dc1b8d7f518f322ffef36', + }, + 'playlist_mincount': 15, + }] + + def _fetch_page(self, user_id, url_type, page): + url_type = 'user-list-song' if url_type == 'bai-hat' else 'user-list-video' + return self._call_api(url_type, { + 'id': user_id, + 'type': 'artist', + 'page': page, + 'count': self._PER_PAGE + }) + + def _real_extract(self, url): + user_alias, url_type = self._match_valid_url(url).group('user', 'type') + if not url_type: + url_type = 'bai-hat' + + user_info = self._call_api('info-artist', {}, user_alias, query={'alias': user_alias}) + if url_type in ('bai-hat', 'video'): + entries = self._paged_list(user_info['id'], url_type) + else: + entries = self._parse_items(traverse_obj(user_info, ( + 'sections', + lambda _, v: v['sectionId'] == 'aAlbum' if url_type == 'album' else v['sectionId'] == 'aSingle', + 'items', ...))) + return self.playlist_result( + entries, user_info['id'], f'{user_info.get("name")} - {url_type}', user_info.get('biography')) + + +class ZingMp3HubIE(ZingMp3BaseIE): + IE_NAME = 'zingmp3:hub' + _VALID_URL = r'https?://(?:mp3\.zing|zingmp3)\.vn/(?P<type>hub)/(?P<regions>[^/]+)/(?P<id>[^\.]+)' + _TESTS = [{ + 'url': 'https://zingmp3.vn/hub/Nhac-Moi/IWZ9Z0CA.html', + 'info_dict': { + 'id': 'IWZ9Z0CA', + 'title': 'Nhạc Má»›i', + 'description': 'md5:1cc31b68a6f746427b07b2756c22a558', + }, + 'playlist_mincount': 20, + }, { + 'url': 'https://zingmp3.vn/hub/Nhac-Viet/IWZ9Z087.html', + 'info_dict': { + 'id': 'IWZ9Z087', + 'title': 'Nhạc Việt', + 'description': 'md5:acc976c8bdde64d5c6ee4a92c39f7a77', + }, + 'playlist_mincount': 30, + }] + + def _real_extract(self, url): + song_id, regions, url_type = self._match_valid_url(url).group('id', 'regions', 'type') + hub_detail = self._call_api(url_type, {'id': song_id}) + entries = self._parse_items(traverse_obj(hub_detail, ( + 'sections', lambda _, v: v['sectionId'] == 'hub', 'items', ...))) + return self.playlist_result( + entries, song_id, hub_detail.get('title'), hub_detail.get('description')) diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zoom.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zoom.py new file mode 100644 index 0000000..329ba14 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zoom.py @@ -0,0 +1,136 @@ +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, + str_or_none, + js_to_json, + parse_filesize, + traverse_obj, + urlencode_postdata, + urljoin, +) + + +class ZoomIE(InfoExtractor): + IE_NAME = 'zoom' + _VALID_URL = r'(?P<base_url>https?://(?:[^.]+\.)?zoom\.us/)rec(?:ording)?/(?P<type>play|share)/(?P<id>[\w.-]+)' + _TESTS = [{ + 'url': 'https://economist.zoom.us/rec/play/dUk_CNBETmZ5VA2BwEl-jjakPpJ3M1pcfVYAPRsoIbEByGsLjUZtaa4yCATQuOL3der8BlTwxQePl_j0.EImBkXzTIaPvdZO5', + 'md5': 'ab445e8c911fddc4f9adc842c2c5d434', + 'info_dict': { + 'id': 'dUk_CNBETmZ5VA2BwEl-jjakPpJ3M1pcfVYAPRsoIbEByGsLjUZtaa4yCATQuOL3der8BlTwxQePl_j0.EImBkXzTIaPvdZO5', + 'ext': 'mp4', + 'title': 'China\'s "two sessions" and the new five-year plan', + }, + 'skip': 'Recording requires email authentication to access', + }, { + # play URL + 'url': 'https://ffgolf.zoom.us/rec/play/qhEhXbrxq1Zoucx8CMtHzq1Z_2YZRPVCqWK_K-2FkEGRsSLDeOX8Tu4P6jtjZcRry8QhIbvKZdtr4UNo.QcPn2debFskI9whJ', + 'md5': '2c4b1c4e5213ebf9db293e88d9385bee', + 'info_dict': { + 'id': 'qhEhXbrxq1Zoucx8CMtHzq1Z_2YZRPVCqWK_K-2FkEGRsSLDeOX8Tu4P6jtjZcRry8QhIbvKZdtr4UNo.QcPn2debFskI9whJ', + 'ext': 'mp4', + 'title': 'Prépa AF2023 - Séance 5 du 11 avril - R20/VM/GO', + }, + }, { + # share URL + 'url': 'https://us02web.zoom.us/rec/share/hkUk5Zxcga0nkyNGhVCRfzkA2gX_mzgS3LpTxEEWJz9Y_QpIQ4mZFOUx7KZRZDQA.9LGQBdqmDAYgiZ_8', + 'md5': '90fdc7cfcaee5d52d1c817fc03c43c9b', + 'info_dict': { + 'id': 'hkUk5Zxcga0nkyNGhVCRfzkA2gX_mzgS3LpTxEEWJz9Y_QpIQ4mZFOUx7KZRZDQA.9LGQBdqmDAYgiZ_8', + 'ext': 'mp4', + 'title': 'Timea Andrea Lelik\'s Personal Meeting Room', + }, + }] + + def _get_page_data(self, webpage, video_id): + return self._search_json( + r'window\.__data__\s*=', webpage, 'data', video_id, transform_source=js_to_json) + + def _get_real_webpage(self, url, base_url, video_id, url_type): + webpage = self._download_webpage(url, video_id, note=f'Downloading {url_type} webpage') + try: + form = self._form_hidden_inputs('password_form', webpage) + except ExtractorError: + return webpage + + password = self.get_param('videopassword') + if not password: + raise ExtractorError( + 'This video is protected by a passcode, use the --video-password option', expected=True) + is_meeting = form.get('useWhichPasswd') == 'meeting' + validation = self._download_json( + base_url + 'rec/validate%s_passwd' % ('_meet' if is_meeting else ''), + video_id, 'Validating passcode', 'Wrong passcode', data=urlencode_postdata({ + 'id': form[('meet' if is_meeting else 'file') + 'Id'], + 'passwd': password, + 'action': form.get('action'), + })) + if not validation.get('status'): + raise ExtractorError(validation['errorMessage'], expected=True) + return self._download_webpage(url, video_id, note=f'Re-downloading {url_type} webpage') + + def _real_extract(self, url): + base_url, url_type, video_id = self._match_valid_url(url).group('base_url', 'type', 'id') + + if url_type == 'share': + webpage = self._get_real_webpage(url, base_url, video_id, 'share') + meeting_id = self._get_page_data(webpage, video_id)['meetingId'] + redirect_path = self._download_json( + f'{base_url}nws/recording/1.0/play/share-info/{meeting_id}', + video_id, note='Downloading share info JSON')['result']['redirectUrl'] + url = urljoin(base_url, redirect_path) + + webpage = self._get_real_webpage(url, base_url, video_id, 'play') + file_id = self._get_page_data(webpage, video_id)['fileId'] + if not file_id: + # When things go wrong, file_id can be empty string + raise ExtractorError('Unable to extract file ID') + + data = self._download_json( + f'{base_url}nws/recording/1.0/play/info/{file_id}', video_id, + note='Downloading play info JSON')['result'] + + subtitles = {} + for _type in ('transcript', 'cc', 'chapter'): + if data.get('%sUrl' % _type): + subtitles[_type] = [{ + 'url': urljoin(base_url, data['%sUrl' % _type]), + 'ext': 'vtt', + }] + + formats = [] + + if data.get('viewMp4Url'): + formats.append({ + 'format_note': 'Camera stream', + 'url': str_or_none(data.get('viewMp4Url')), + 'width': int_or_none(traverse_obj(data, ('viewResolvtions', 0))), + 'height': int_or_none(traverse_obj(data, ('viewResolvtions', 1))), + 'format_id': str_or_none(traverse_obj(data, ('recording', 'id'))), + 'ext': 'mp4', + 'filesize_approx': parse_filesize(str_or_none(traverse_obj(data, ('recording', 'fileSizeInMB')))), + 'preference': 0 + }) + + if data.get('shareMp4Url'): + formats.append({ + 'format_note': 'Screen share stream', + 'url': str_or_none(data.get('shareMp4Url')), + 'width': int_or_none(traverse_obj(data, ('shareResolvtions', 0))), + 'height': int_or_none(traverse_obj(data, ('shareResolvtions', 1))), + 'format_id': str_or_none(traverse_obj(data, ('shareVideo', 'id'))), + 'ext': 'mp4', + 'preference': -1 + }) + + return { + 'id': video_id, + 'title': str_or_none(traverse_obj(data, ('meet', 'topic'))), + 'duration': int_or_none(data.get('duration')), + 'subtitles': subtitles, + 'formats': formats, + 'http_headers': { + 'Referer': base_url, + }, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/extractor/zype.py b/python/lib/python3.10/site-packages/yt_dlp/extractor/zype.py new file mode 100644 index 0000000..2f3b4c4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/extractor/zype.py @@ -0,0 +1,135 @@ +import re + +from .common import InfoExtractor +from ..networking.exceptions import HTTPError +from ..utils import ( + dict_get, + ExtractorError, + int_or_none, + js_to_json, + parse_iso8601, +) + + +class ZypeIE(InfoExtractor): + _ID_RE = r'[\da-fA-F]+' + _COMMON_RE = r'//player\.zype\.com/embed/%s\.(?:js|json|html)\?.*?(?:access_token|(?:ap[ip]|player)_key)=' + _VALID_URL = r'https?:%s[^&]+' % (_COMMON_RE % ('(?P<id>%s)' % _ID_RE)) + _EMBED_REGEX = [fr'<script[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?{_COMMON_RE % _ID_RE}.+?)\1'] + _TEST = { + 'url': 'https://player.zype.com/embed/5b400b834b32992a310622b9.js?api_key=jZ9GUhRmxcPvX7M3SlfejB6Hle9jyHTdk2jVxG7wOHPLODgncEKVdPYBhuz9iWXQ&autoplay=false&controls=true&da=false', + 'md5': 'eaee31d474c76a955bdaba02a505c595', + 'info_dict': { + 'id': '5b400b834b32992a310622b9', + 'ext': 'mp4', + 'title': 'Smoky Barbecue Favorites', + 'thumbnail': r're:^https?://.*\.jpe?g', + 'description': 'md5:5ff01e76316bd8d46508af26dc86023b', + 'timestamp': 1504915200, + 'upload_date': '20170909', + }, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + try: + response = self._download_json(re.sub( + r'\.(?:js|html)\?', '.json?', url), video_id)['response'] + except ExtractorError as e: + if isinstance(e.cause, HTTPError) and e.cause.status in (400, 401, 403): + raise ExtractorError(self._parse_json( + e.cause.response.read().decode(), video_id)['message'], expected=True) + raise + + body = response['body'] + video = response['video'] + title = video['title'] + + subtitles = {} + + if isinstance(body, dict): + formats = [] + for output in body.get('outputs', []): + output_url = output.get('url') + if not output_url: + continue + name = output.get('name') + if name == 'm3u8': + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + output_url, video_id, 'mp4', + 'm3u8_native', m3u8_id='hls', fatal=False) + else: + f = { + 'format_id': name, + 'tbr': int_or_none(output.get('bitrate')), + 'url': output_url, + } + if name in ('m4a', 'mp3'): + f['vcodec'] = 'none' + else: + f.update({ + 'height': int_or_none(output.get('height')), + 'width': int_or_none(output.get('width')), + }) + formats.append(f) + text_tracks = body.get('subtitles') or [] + else: + m3u8_url = self._search_regex( + r'(["\'])(?P<url>(?:(?!\1).)+\.m3u8(?:(?!\1).)*)\1', + body, 'm3u8 url', group='url', default=None) + if not m3u8_url: + source = self._search_regex( + r'(?s)sources\s*:\s*\[\s*({.+?})\s*\]', body, 'source') + + def get_attr(key): + return self._search_regex( + r'\b%s\s*:\s*([\'"])(?P<val>(?:(?!\1).)+)\1' % key, + source, key, group='val') + + if get_attr('integration') == 'verizon-media': + m3u8_url = 'https://content.uplynk.com/%s.m3u8' % get_attr('id') + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + m3u8_url, video_id, 'mp4', 'm3u8_native', m3u8_id='hls') + text_tracks = self._search_regex( + r'textTracks\s*:\s*(\[[^]]+\])', + body, 'text tracks', default=None) + if text_tracks: + text_tracks = self._parse_json( + text_tracks, video_id, js_to_json, False) + + if text_tracks: + for text_track in text_tracks: + tt_url = dict_get(text_track, ('file', 'src')) + if not tt_url: + continue + subtitles.setdefault(text_track.get('label') or 'English', []).append({ + 'url': tt_url, + }) + + thumbnails = [] + for thumbnail in video.get('thumbnails', []): + thumbnail_url = thumbnail.get('url') + if not thumbnail_url: + continue + thumbnails.append({ + 'url': thumbnail_url, + 'width': int_or_none(thumbnail.get('width')), + 'height': int_or_none(thumbnail.get('height')), + }) + + return { + 'id': video_id, + 'display_id': video.get('friendly_title'), + 'title': title, + 'thumbnails': thumbnails, + 'description': dict_get(video, ('description', 'ott_description', 'short_description')), + 'timestamp': parse_iso8601(video.get('published_at')), + 'duration': int_or_none(video.get('duration')), + 'view_count': int_or_none(video.get('request_count')), + 'average_rating': int_or_none(video.get('rating')), + 'season_number': int_or_none(video.get('season')), + 'episode_number': int_or_none(video.get('episode')), + 'formats': formats, + 'subtitles': subtitles, + } diff --git a/python/lib/python3.10/site-packages/yt_dlp/jsinterp.py b/python/lib/python3.10/site-packages/yt_dlp/jsinterp.py new file mode 100644 index 0000000..bda3fb4 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/jsinterp.py @@ -0,0 +1,853 @@ +import collections +import contextlib +import itertools +import json +import math +import operator +import re + +from .utils import ( + NO_DEFAULT, + ExtractorError, + function_with_repr, + js_to_json, + remove_quotes, + truncate_string, + unified_timestamp, + write_string, +) + + +def _js_bit_op(op): + def zeroise(x): + if x in (None, JS_Undefined): + return 0 + with contextlib.suppress(TypeError): + if math.isnan(x): # NB: NaN cannot be checked by membership + return 0 + return x + + def wrapped(a, b): + return op(zeroise(a), zeroise(b)) & 0xffffffff + + return wrapped + + +def _js_arith_op(op): + + def wrapped(a, b): + if JS_Undefined in (a, b): + return float('nan') + return op(a or 0, b or 0) + + return wrapped + + +def _js_div(a, b): + if JS_Undefined in (a, b) or not (a or b): + return float('nan') + return (a or 0) / b if b else float('inf') + + +def _js_mod(a, b): + if JS_Undefined in (a, b) or not b: + return float('nan') + return (a or 0) % b + + +def _js_exp(a, b): + if not b: + return 1 # even 0 ** 0 !! + elif JS_Undefined in (a, b): + return float('nan') + return (a or 0) ** b + + +def _js_eq_op(op): + + def wrapped(a, b): + if {a, b} <= {None, JS_Undefined}: + return op(a, a) + return op(a, b) + + return wrapped + + +def _js_comp_op(op): + + def wrapped(a, b): + if JS_Undefined in (a, b): + return False + if isinstance(a, str) or isinstance(b, str): + return op(str(a or 0), str(b or 0)) + return op(a or 0, b or 0) + + return wrapped + + +def _js_ternary(cndn, if_true=True, if_false=False): + """Simulate JS's ternary operator (cndn?if_true:if_false)""" + if cndn in (False, None, 0, '', JS_Undefined): + return if_false + with contextlib.suppress(TypeError): + if math.isnan(cndn): # NB: NaN cannot be checked by membership + return if_false + return if_true + + +# Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence +_OPERATORS = { # None => Defined in JSInterpreter._operator + '?': None, + '??': None, + '||': None, + '&&': None, + + '|': _js_bit_op(operator.or_), + '^': _js_bit_op(operator.xor), + '&': _js_bit_op(operator.and_), + + '===': operator.is_, + '!==': operator.is_not, + '==': _js_eq_op(operator.eq), + '!=': _js_eq_op(operator.ne), + + '<=': _js_comp_op(operator.le), + '>=': _js_comp_op(operator.ge), + '<': _js_comp_op(operator.lt), + '>': _js_comp_op(operator.gt), + + '>>': _js_bit_op(operator.rshift), + '<<': _js_bit_op(operator.lshift), + + '+': _js_arith_op(operator.add), + '-': _js_arith_op(operator.sub), + + '*': _js_arith_op(operator.mul), + '%': _js_mod, + '/': _js_div, + '**': _js_exp, +} + +_COMP_OPERATORS = {'===', '!==', '==', '!=', '<=', '>=', '<', '>'} + +_NAME_RE = r'[a-zA-Z_$][\w$]*' +_MATCHING_PARENS = dict(zip(*zip('()', '{}', '[]'))) +_QUOTES = '\'"/' + + +class JS_Undefined: + pass + + +class JS_Break(ExtractorError): + def __init__(self): + ExtractorError.__init__(self, 'Invalid break') + + +class JS_Continue(ExtractorError): + def __init__(self): + ExtractorError.__init__(self, 'Invalid continue') + + +class JS_Throw(ExtractorError): + def __init__(self, e): + self.error = e + ExtractorError.__init__(self, f'Uncaught exception {e}') + + +class LocalNameSpace(collections.ChainMap): + def __setitem__(self, key, value): + for scope in self.maps: + if key in scope: + scope[key] = value + return + self.maps[0][key] = value + + def __delitem__(self, key): + raise NotImplementedError('Deleting is not supported') + + +class Debugger: + import sys + ENABLED = False and 'pytest' in sys.modules + + @staticmethod + def write(*args, level=100): + write_string(f'[debug] JS: {" " * (100 - level)}' + f'{" ".join(truncate_string(str(x), 50, 50) for x in args)}\n') + + @classmethod + def wrap_interpreter(cls, f): + def interpret_statement(self, stmt, local_vars, allow_recursion, *args, **kwargs): + if cls.ENABLED and stmt.strip(): + cls.write(stmt, level=allow_recursion) + try: + ret, should_ret = f(self, stmt, local_vars, allow_recursion, *args, **kwargs) + except Exception as e: + if cls.ENABLED: + if isinstance(e, ExtractorError): + e = e.orig_msg + cls.write('=> Raises:', e, '<-|', stmt, level=allow_recursion) + raise + if cls.ENABLED and stmt.strip(): + if should_ret or not repr(ret) == stmt: + cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion) + return ret, should_ret + return interpret_statement + + +class JSInterpreter: + __named_object_counter = 0 + + _RE_FLAGS = { + # special knowledge: Python's re flags are bitmask values, current max 128 + # invent new bitmask values well above that for literal parsing + # TODO: new pattern class to execute matches with these flags + 'd': 1024, # Generate indices for substring matches + 'g': 2048, # Global search + 'i': re.I, # Case-insensitive search + 'm': re.M, # Multi-line search + 's': re.S, # Allows . to match newline characters + 'u': re.U, # Treat a pattern as a sequence of unicode code points + 'y': 4096, # Perform a "sticky" search that matches starting at the current position in the target string + } + + def __init__(self, code, objects=None): + self.code, self._functions = code, {} + self._objects = {} if objects is None else objects + + class Exception(ExtractorError): + def __init__(self, msg, expr=None, *args, **kwargs): + if expr is not None: + msg = f'{msg.rstrip()} in: {truncate_string(expr, 50, 50)}' + super().__init__(msg, *args, **kwargs) + + def _named_object(self, namespace, obj): + self.__named_object_counter += 1 + name = f'__yt_dlp_jsinterp_obj{self.__named_object_counter}' + if callable(obj) and not isinstance(obj, function_with_repr): + obj = function_with_repr(obj, f'F<{self.__named_object_counter}>') + namespace[name] = obj + return name + + @classmethod + def _regex_flags(cls, expr): + flags = 0 + if not expr: + return flags, expr + for idx, ch in enumerate(expr): + if ch not in cls._RE_FLAGS: + break + flags |= cls._RE_FLAGS[ch] + return flags, expr[idx + 1:] + + @staticmethod + def _separate(expr, delim=',', max_split=None): + OP_CHARS = '+-*/%&|^=<>!,;{}:[' + if not expr: + return + counters = {k: 0 for k in _MATCHING_PARENS.values()} + start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1 + in_quote, escaping, after_op, in_regex_char_group = None, False, True, False + for idx, char in enumerate(expr): + if not in_quote and char in _MATCHING_PARENS: + counters[_MATCHING_PARENS[char]] += 1 + elif not in_quote and char in counters: + # Something's wrong if we get negative, but ignore it anyway + if counters[char]: + counters[char] -= 1 + elif not escaping: + if char in _QUOTES and in_quote in (char, None): + if in_quote or after_op or char != '/': + in_quote = None if in_quote and not in_regex_char_group else char + elif in_quote == '/' and char in '[]': + in_regex_char_group = char == '[' + escaping = not escaping and in_quote and char == '\\' + in_unary_op = (not in_quote and not in_regex_char_group + and after_op not in (True, False) and char in '-+') + after_op = char if (not in_quote and char in OP_CHARS) else (char.isspace() and after_op) + + if char != delim[pos] or any(counters.values()) or in_quote or in_unary_op: + pos = 0 + continue + elif pos != delim_len: + pos += 1 + continue + yield expr[start: idx - delim_len] + start, pos = idx + 1, 0 + splits += 1 + if max_split and splits >= max_split: + break + yield expr[start:] + + @classmethod + def _separate_at_paren(cls, expr, delim=None): + if delim is None: + delim = expr and _MATCHING_PARENS[expr[0]] + separated = list(cls._separate(expr, delim, 1)) + if len(separated) < 2: + raise cls.Exception(f'No terminating paren {delim}', expr) + return separated[0][1:].strip(), separated[1].strip() + + def _operator(self, op, left_val, right_expr, expr, local_vars, allow_recursion): + if op in ('||', '&&'): + if (op == '&&') ^ _js_ternary(left_val): + return left_val # short circuiting + elif op == '??': + if left_val not in (None, JS_Undefined): + return left_val + elif op == '?': + right_expr = _js_ternary(left_val, *self._separate(right_expr, ':', 1)) + + right_val = self.interpret_expression(right_expr, local_vars, allow_recursion) + if not _OPERATORS.get(op): + return right_val + + try: + return _OPERATORS[op](left_val, right_val) + except Exception as e: + raise self.Exception(f'Failed to evaluate {left_val!r} {op} {right_val!r}', expr, cause=e) + + def _index(self, obj, idx, allow_undefined=False): + if idx == 'length': + return len(obj) + try: + return obj[int(idx)] if isinstance(obj, list) else obj[idx] + except Exception as e: + if allow_undefined: + return JS_Undefined + raise self.Exception(f'Cannot get index {idx}', repr(obj), cause=e) + + def _dump(self, obj, namespace): + try: + return json.dumps(obj) + except TypeError: + return self._named_object(namespace, obj) + + @Debugger.wrap_interpreter + def interpret_statement(self, stmt, local_vars, allow_recursion=100): + if allow_recursion < 0: + raise self.Exception('Recursion limit reached') + allow_recursion -= 1 + + should_return = False + sub_statements = list(self._separate(stmt, ';')) or [''] + expr = stmt = sub_statements.pop().strip() + + for sub_stmt in sub_statements: + ret, should_return = self.interpret_statement(sub_stmt, local_vars, allow_recursion) + if should_return: + return ret, should_return + + m = re.match(r'(?P<var>(?:var|const|let)\s)|return(?:\s+|(?=["\'])|$)|(?P<throw>throw\s+)', stmt) + if m: + expr = stmt[len(m.group(0)):].strip() + if m.group('throw'): + raise JS_Throw(self.interpret_expression(expr, local_vars, allow_recursion)) + should_return = not m.group('var') + if not expr: + return None, should_return + + if expr[0] in _QUOTES: + inner, outer = self._separate(expr, expr[0], 1) + if expr[0] == '/': + flags, outer = self._regex_flags(outer) + # We don't support regex methods yet, so no point compiling it + inner = f'{inner}/{flags}' + # Avoid https://github.com/python/cpython/issues/74534 + # inner = re.compile(inner[1:].replace('[[', r'[\['), flags=flags) + else: + inner = json.loads(js_to_json(f'{inner}{expr[0]}', strict=True)) + if not outer: + return inner, should_return + expr = self._named_object(local_vars, inner) + outer + + if expr.startswith('new '): + obj = expr[4:] + if obj.startswith('Date('): + left, right = self._separate_at_paren(obj[4:]) + date = unified_timestamp( + self.interpret_expression(left, local_vars, allow_recursion), False) + if date is None: + raise self.Exception(f'Failed to parse date {left!r}', expr) + expr = self._dump(int(date * 1000), local_vars) + right + else: + raise self.Exception(f'Unsupported object {obj}', expr) + + if expr.startswith('void '): + left = self.interpret_expression(expr[5:], local_vars, allow_recursion) + return None, should_return + + if expr.startswith('{'): + inner, outer = self._separate_at_paren(expr) + # try for object expression (Map) + sub_expressions = [list(self._separate(sub_expr.strip(), ':', 1)) for sub_expr in self._separate(inner)] + if all(len(sub_expr) == 2 for sub_expr in sub_expressions): + def dict_item(key, val): + val = self.interpret_expression(val, local_vars, allow_recursion) + if re.match(_NAME_RE, key): + return key, val + return self.interpret_expression(key, local_vars, allow_recursion), val + + return dict(dict_item(k, v) for k, v in sub_expressions), should_return + + inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion) + if not outer or should_abort: + return inner, should_abort or should_return + else: + expr = self._dump(inner, local_vars) + outer + + if expr.startswith('('): + inner, outer = self._separate_at_paren(expr) + inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion) + if not outer or should_abort: + return inner, should_abort or should_return + else: + expr = self._dump(inner, local_vars) + outer + + if expr.startswith('['): + inner, outer = self._separate_at_paren(expr) + name = self._named_object(local_vars, [ + self.interpret_expression(item, local_vars, allow_recursion) + for item in self._separate(inner)]) + expr = name + outer + + m = re.match(r'''(?x) + (?P<try>try)\s*\{| + (?P<if>if)\s*\(| + (?P<switch>switch)\s*\(| + (?P<for>for)\s*\( + ''', expr) + md = m.groupdict() if m else {} + if md.get('if'): + cndn, expr = self._separate_at_paren(expr[m.end() - 1:]) + if_expr, expr = self._separate_at_paren(expr.lstrip()) + # TODO: "else if" is not handled + else_expr = None + m = re.match(r'else\s*{', expr) + if m: + else_expr, expr = self._separate_at_paren(expr[m.end() - 1:]) + cndn = _js_ternary(self.interpret_expression(cndn, local_vars, allow_recursion)) + ret, should_abort = self.interpret_statement( + if_expr if cndn else else_expr, local_vars, allow_recursion) + if should_abort: + return ret, True + + if md.get('try'): + try_expr, expr = self._separate_at_paren(expr[m.end() - 1:]) + err = None + try: + ret, should_abort = self.interpret_statement(try_expr, local_vars, allow_recursion) + if should_abort: + return ret, True + except Exception as e: + # XXX: This works for now, but makes debugging future issues very hard + err = e + + pending = (None, False) + m = re.match(fr'catch\s*(?P<err>\(\s*{_NAME_RE}\s*\))?\{{', expr) + if m: + sub_expr, expr = self._separate_at_paren(expr[m.end() - 1:]) + if err: + catch_vars = {} + if m.group('err'): + catch_vars[m.group('err')] = err.error if isinstance(err, JS_Throw) else err + catch_vars = local_vars.new_child(catch_vars) + err, pending = None, self.interpret_statement(sub_expr, catch_vars, allow_recursion) + + m = re.match(r'finally\s*\{', expr) + if m: + sub_expr, expr = self._separate_at_paren(expr[m.end() - 1:]) + ret, should_abort = self.interpret_statement(sub_expr, local_vars, allow_recursion) + if should_abort: + return ret, True + + ret, should_abort = pending + if should_abort: + return ret, True + + if err: + raise err + + elif md.get('for'): + constructor, remaining = self._separate_at_paren(expr[m.end() - 1:]) + if remaining.startswith('{'): + body, expr = self._separate_at_paren(remaining) + else: + switch_m = re.match(r'switch\s*\(', remaining) # FIXME + if switch_m: + switch_val, remaining = self._separate_at_paren(remaining[switch_m.end() - 1:]) + body, expr = self._separate_at_paren(remaining, '}') + body = 'switch(%s){%s}' % (switch_val, body) + else: + body, expr = remaining, '' + start, cndn, increment = self._separate(constructor, ';') + self.interpret_expression(start, local_vars, allow_recursion) + while True: + if not _js_ternary(self.interpret_expression(cndn, local_vars, allow_recursion)): + break + try: + ret, should_abort = self.interpret_statement(body, local_vars, allow_recursion) + if should_abort: + return ret, True + except JS_Break: + break + except JS_Continue: + pass + self.interpret_expression(increment, local_vars, allow_recursion) + + elif md.get('switch'): + switch_val, remaining = self._separate_at_paren(expr[m.end() - 1:]) + switch_val = self.interpret_expression(switch_val, local_vars, allow_recursion) + body, expr = self._separate_at_paren(remaining, '}') + items = body.replace('default:', 'case default:').split('case ')[1:] + for default in (False, True): + matched = False + for item in items: + case, stmt = (i.strip() for i in self._separate(item, ':', 1)) + if default: + matched = matched or case == 'default' + elif not matched: + matched = (case != 'default' + and switch_val == self.interpret_expression(case, local_vars, allow_recursion)) + if not matched: + continue + try: + ret, should_abort = self.interpret_statement(stmt, local_vars, allow_recursion) + if should_abort: + return ret + except JS_Break: + break + if matched: + break + + if md: + ret, should_abort = self.interpret_statement(expr, local_vars, allow_recursion) + return ret, should_abort or should_return + + # Comma separated statements + sub_expressions = list(self._separate(expr)) + if len(sub_expressions) > 1: + for sub_expr in sub_expressions: + ret, should_abort = self.interpret_statement(sub_expr, local_vars, allow_recursion) + if should_abort: + return ret, True + return ret, False + + for m in re.finditer(rf'''(?x) + (?P<pre_sign>\+\+|--)(?P<var1>{_NAME_RE})| + (?P<var2>{_NAME_RE})(?P<post_sign>\+\+|--)''', expr): + var = m.group('var1') or m.group('var2') + start, end = m.span() + sign = m.group('pre_sign') or m.group('post_sign') + ret = local_vars[var] + local_vars[var] += 1 if sign[0] == '+' else -1 + if m.group('pre_sign'): + ret = local_vars[var] + expr = expr[:start] + self._dump(ret, local_vars) + expr[end:] + + if not expr: + return None, should_return + + m = re.match(fr'''(?x) + (?P<assign> + (?P<out>{_NAME_RE})(?:\[(?P<index>[^\]]+?)\])?\s* + (?P<op>{"|".join(map(re.escape, set(_OPERATORS) - _COMP_OPERATORS))})? + =(?!=)(?P<expr>.*)$ + )|(?P<return> + (?!if|return|true|false|null|undefined|NaN)(?P<name>{_NAME_RE})$ + )|(?P<indexing> + (?P<in>{_NAME_RE})\[(?P<idx>.+)\]$ + )|(?P<attribute> + (?P<var>{_NAME_RE})(?:(?P<nullish>\?)?\.(?P<member>[^(]+)|\[(?P<member2>[^\]]+)\])\s* + )|(?P<function> + (?P<fname>{_NAME_RE})\((?P<args>.*)\)$ + )''', expr) + if m and m.group('assign'): + left_val = local_vars.get(m.group('out')) + + if not m.group('index'): + local_vars[m.group('out')] = self._operator( + m.group('op'), left_val, m.group('expr'), expr, local_vars, allow_recursion) + return local_vars[m.group('out')], should_return + elif left_val in (None, JS_Undefined): + raise self.Exception(f'Cannot index undefined variable {m.group("out")}', expr) + + idx = self.interpret_expression(m.group('index'), local_vars, allow_recursion) + if not isinstance(idx, (int, float)): + raise self.Exception(f'List index {idx} must be integer', expr) + idx = int(idx) + left_val[idx] = self._operator( + m.group('op'), self._index(left_val, idx), m.group('expr'), expr, local_vars, allow_recursion) + return left_val[idx], should_return + + elif expr.isdigit(): + return int(expr), should_return + + elif expr == 'break': + raise JS_Break() + elif expr == 'continue': + raise JS_Continue() + elif expr == 'undefined': + return JS_Undefined, should_return + elif expr == 'NaN': + return float('NaN'), should_return + + elif m and m.group('return'): + return local_vars.get(m.group('name'), JS_Undefined), should_return + + with contextlib.suppress(ValueError): + return json.loads(js_to_json(expr, strict=True)), should_return + + if m and m.group('indexing'): + val = local_vars[m.group('in')] + idx = self.interpret_expression(m.group('idx'), local_vars, allow_recursion) + return self._index(val, idx), should_return + + for op in _OPERATORS: + separated = list(self._separate(expr, op)) + right_expr = separated.pop() + while True: + if op in '?<>*-' and len(separated) > 1 and not separated[-1].strip(): + separated.pop() + elif not (separated and op == '?' and right_expr.startswith('.')): + break + right_expr = f'{op}{right_expr}' + if op != '-': + right_expr = f'{separated.pop()}{op}{right_expr}' + if not separated: + continue + left_val = self.interpret_expression(op.join(separated), local_vars, allow_recursion) + return self._operator(op, left_val, right_expr, expr, local_vars, allow_recursion), should_return + + if m and m.group('attribute'): + variable, member, nullish = m.group('var', 'member', 'nullish') + if not member: + member = self.interpret_expression(m.group('member2'), local_vars, allow_recursion) + arg_str = expr[m.end():] + if arg_str.startswith('('): + arg_str, remaining = self._separate_at_paren(arg_str) + else: + arg_str, remaining = None, arg_str + + def assertion(cndn, msg): + """ assert, but without risk of getting optimized out """ + if not cndn: + raise self.Exception(f'{member} {msg}', expr) + + def eval_method(): + if (variable, member) == ('console', 'debug'): + if Debugger.ENABLED: + Debugger.write(self.interpret_expression(f'[{arg_str}]', local_vars, allow_recursion)) + return + + types = { + 'String': str, + 'Math': float, + } + obj = local_vars.get(variable, types.get(variable, NO_DEFAULT)) + if obj is NO_DEFAULT: + if variable not in self._objects: + try: + self._objects[variable] = self.extract_object(variable) + except self.Exception: + if not nullish: + raise + obj = self._objects.get(variable, JS_Undefined) + + if nullish and obj is JS_Undefined: + return JS_Undefined + + # Member access + if arg_str is None: + return self._index(obj, member, nullish) + + # Function call + argvals = [ + self.interpret_expression(v, local_vars, allow_recursion) + for v in self._separate(arg_str)] + + if obj == str: + if member == 'fromCharCode': + assertion(argvals, 'takes one or more arguments') + return ''.join(map(chr, argvals)) + raise self.Exception(f'Unsupported String method {member}', expr) + elif obj == float: + if member == 'pow': + assertion(len(argvals) == 2, 'takes two arguments') + return argvals[0] ** argvals[1] + raise self.Exception(f'Unsupported Math method {member}', expr) + + if member == 'split': + assertion(argvals, 'takes one or more arguments') + assertion(len(argvals) == 1, 'with limit argument is not implemented') + return obj.split(argvals[0]) if argvals[0] else list(obj) + elif member == 'join': + assertion(isinstance(obj, list), 'must be applied on a list') + assertion(len(argvals) == 1, 'takes exactly one argument') + return argvals[0].join(obj) + elif member == 'reverse': + assertion(not argvals, 'does not take any arguments') + obj.reverse() + return obj + elif member == 'slice': + assertion(isinstance(obj, list), 'must be applied on a list') + assertion(len(argvals) == 1, 'takes exactly one argument') + return obj[argvals[0]:] + elif member == 'splice': + assertion(isinstance(obj, list), 'must be applied on a list') + assertion(argvals, 'takes one or more arguments') + index, howMany = map(int, (argvals + [len(obj)])[:2]) + if index < 0: + index += len(obj) + add_items = argvals[2:] + res = [] + for i in range(index, min(index + howMany, len(obj))): + res.append(obj.pop(index)) + for i, item in enumerate(add_items): + obj.insert(index + i, item) + return res + elif member == 'unshift': + assertion(isinstance(obj, list), 'must be applied on a list') + assertion(argvals, 'takes one or more arguments') + for item in reversed(argvals): + obj.insert(0, item) + return obj + elif member == 'pop': + assertion(isinstance(obj, list), 'must be applied on a list') + assertion(not argvals, 'does not take any arguments') + if not obj: + return + return obj.pop() + elif member == 'push': + assertion(argvals, 'takes one or more arguments') + obj.extend(argvals) + return obj + elif member == 'forEach': + assertion(argvals, 'takes one or more arguments') + assertion(len(argvals) <= 2, 'takes at-most 2 arguments') + f, this = (argvals + [''])[:2] + return [f((item, idx, obj), {'this': this}, allow_recursion) for idx, item in enumerate(obj)] + elif member == 'indexOf': + assertion(argvals, 'takes one or more arguments') + assertion(len(argvals) <= 2, 'takes at-most 2 arguments') + idx, start = (argvals + [0])[:2] + try: + return obj.index(idx, start) + except ValueError: + return -1 + elif member == 'charCodeAt': + assertion(isinstance(obj, str), 'must be applied on a string') + assertion(len(argvals) == 1, 'takes exactly one argument') + idx = argvals[0] if isinstance(argvals[0], int) else 0 + if idx >= len(obj): + return None + return ord(obj[idx]) + + idx = int(member) if isinstance(obj, list) else member + return obj[idx](argvals, allow_recursion=allow_recursion) + + if remaining: + ret, should_abort = self.interpret_statement( + self._named_object(local_vars, eval_method()) + remaining, + local_vars, allow_recursion) + return ret, should_return or should_abort + else: + return eval_method(), should_return + + elif m and m.group('function'): + fname = m.group('fname') + argvals = [self.interpret_expression(v, local_vars, allow_recursion) + for v in self._separate(m.group('args'))] + if fname in local_vars: + return local_vars[fname](argvals, allow_recursion=allow_recursion), should_return + elif fname not in self._functions: + self._functions[fname] = self.extract_function(fname) + return self._functions[fname](argvals, allow_recursion=allow_recursion), should_return + + raise self.Exception( + f'Unsupported JS expression {truncate_string(expr, 20, 20) if expr != stmt else ""}', stmt) + + def interpret_expression(self, expr, local_vars, allow_recursion): + ret, should_return = self.interpret_statement(expr, local_vars, allow_recursion) + if should_return: + raise self.Exception('Cannot return from an expression', expr) + return ret + + def extract_object(self, objname): + _FUNC_NAME_RE = r'''(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')''' + obj = {} + obj_m = re.search( + r'''(?x) + (?<!\.)%s\s*=\s*{\s* + (?P<fields>(%s\s*:\s*function\s*\(.*?\)\s*{.*?}(?:,\s*)?)*) + }\s*; + ''' % (re.escape(objname), _FUNC_NAME_RE), + self.code) + if not obj_m: + raise self.Exception(f'Could not find object {objname}') + fields = obj_m.group('fields') + # Currently, it only supports function definitions + fields_m = re.finditer( + r'''(?x) + (?P<key>%s)\s*:\s*function\s*\((?P<args>(?:%s|,)*)\){(?P<code>[^}]+)} + ''' % (_FUNC_NAME_RE, _NAME_RE), + fields) + for f in fields_m: + argnames = f.group('args').split(',') + name = remove_quotes(f.group('key')) + obj[name] = function_with_repr(self.build_function(argnames, f.group('code')), f'F<{name}>') + + return obj + + def extract_function_code(self, funcname): + """ @returns argnames, code """ + func_m = re.search( + r'''(?xs) + (?: + function\s+%(name)s| + [{;,]\s*%(name)s\s*=\s*function| + (?:var|const|let)\s+%(name)s\s*=\s*function + )\s* + \((?P<args>[^)]*)\)\s* + (?P<code>{.+})''' % {'name': re.escape(funcname)}, + self.code) + if func_m is None: + raise self.Exception(f'Could not find JS function "{funcname}"') + code, _ = self._separate_at_paren(func_m.group('code')) + return [x.strip() for x in func_m.group('args').split(',')], code + + def extract_function(self, funcname): + return function_with_repr( + self.extract_function_from_code(*self.extract_function_code(funcname)), + f'F<{funcname}>') + + def extract_function_from_code(self, argnames, code, *global_stack): + local_vars = {} + while True: + mobj = re.search(r'function\((?P<args>[^)]*)\)\s*{', code) + if mobj is None: + break + start, body_start = mobj.span() + body, remaining = self._separate_at_paren(code[body_start - 1:]) + name = self._named_object(local_vars, self.extract_function_from_code( + [x.strip() for x in mobj.group('args').split(',')], + body, local_vars, *global_stack)) + code = code[:start] + name + remaining + return self.build_function(argnames, code, local_vars, *global_stack) + + def call_function(self, funcname, *args): + return self.extract_function(funcname)(args) + + def build_function(self, argnames, code, *global_stack): + global_stack = list(global_stack) or [{}] + argnames = tuple(argnames) + + def resf(args, kwargs={}, allow_recursion=100): + global_stack[0].update(itertools.zip_longest(argnames, args, fillvalue=None)) + global_stack[0].update(kwargs) + var_stack = LocalNameSpace(*global_stack) + ret, should_abort = self.interpret_statement(code.replace('\n', ' '), var_stack, allow_recursion - 1) + if should_abort: + return ret + return resf diff --git a/lib/python3.11/site-packages/yt_dlp/minicurses.py b/python/lib/python3.10/site-packages/yt_dlp/minicurses.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/minicurses.py rename to python/lib/python3.10/site-packages/yt_dlp/minicurses.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/networking/__init__.py b/python/lib/python3.10/site-packages/yt_dlp/networking/__init__.py new file mode 100644 index 0000000..5b1599a --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/networking/__init__.py @@ -0,0 +1,13 @@ +# flake8: noqa: F401 +from .common import ( + HEADRequest, + PUTRequest, + Request, + RequestDirector, + RequestHandler, + Response, +) + +# isort: split +# TODO: all request handlers should be safely imported +from . import _urllib diff --git a/python/lib/python3.10/site-packages/yt_dlp/networking/_helper.py b/python/lib/python3.10/site-packages/yt_dlp/networking/_helper.py new file mode 100644 index 0000000..4c9dbf2 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/networking/_helper.py @@ -0,0 +1,265 @@ +from __future__ import annotations + +import contextlib +import functools +import socket +import ssl +import sys +import typing +import urllib.parse +import urllib.request + +from .exceptions import RequestError, UnsupportedRequest +from ..dependencies import certifi +from ..socks import ProxyType +from ..utils import format_field, traverse_obj + +if typing.TYPE_CHECKING: + from collections.abc import Iterable + + from ..utils.networking import HTTPHeaderDict + + +def ssl_load_certs(context: ssl.SSLContext, use_certifi=True): + if certifi and use_certifi: + context.load_verify_locations(cafile=certifi.where()) + else: + try: + context.load_default_certs() + # Work around the issue in load_default_certs when there are bad certificates. See: + # https://github.com/yt-dlp/yt-dlp/issues/1060, + # https://bugs.python.org/issue35665, https://bugs.python.org/issue45312 + except ssl.SSLError: + # enum_certificates is not present in mingw python. See https://github.com/yt-dlp/yt-dlp/issues/1151 + if sys.platform == 'win32' and hasattr(ssl, 'enum_certificates'): + for storename in ('CA', 'ROOT'): + ssl_load_windows_store_certs(context, storename) + context.set_default_verify_paths() + + +def ssl_load_windows_store_certs(ssl_context, storename): + # Code adapted from _load_windows_store_certs in https://github.com/python/cpython/blob/main/Lib/ssl.py + try: + certs = [cert for cert, encoding, trust in ssl.enum_certificates(storename) + if encoding == 'x509_asn' and ( + trust is True or ssl.Purpose.SERVER_AUTH.oid in trust)] + except PermissionError: + return + for cert in certs: + with contextlib.suppress(ssl.SSLError): + ssl_context.load_verify_locations(cadata=cert) + + +def make_socks_proxy_opts(socks_proxy): + url_components = urllib.parse.urlparse(socks_proxy) + if url_components.scheme.lower() == 'socks5': + socks_type = ProxyType.SOCKS5 + rdns = False + elif url_components.scheme.lower() == 'socks5h': + socks_type = ProxyType.SOCKS5 + rdns = True + elif url_components.scheme.lower() == 'socks4': + socks_type = ProxyType.SOCKS4 + rdns = False + elif url_components.scheme.lower() == 'socks4a': + socks_type = ProxyType.SOCKS4A + rdns = True + else: + raise ValueError(f'Unknown SOCKS proxy version: {url_components.scheme.lower()}') + + def unquote_if_non_empty(s): + if not s: + return s + return urllib.parse.unquote_plus(s) + return { + 'proxytype': socks_type, + 'addr': url_components.hostname, + 'port': url_components.port or 1080, + 'rdns': rdns, + 'username': unquote_if_non_empty(url_components.username), + 'password': unquote_if_non_empty(url_components.password), + } + + +def select_proxy(url, proxies): + """Unified proxy selector for all backends""" + url_components = urllib.parse.urlparse(url) + if 'no' in proxies: + hostport = url_components.hostname + format_field(url_components.port, None, ':%s') + if urllib.request.proxy_bypass_environment(hostport, {'no': proxies['no']}): + return + elif urllib.request.proxy_bypass(hostport): # check system settings + return + + return traverse_obj(proxies, url_components.scheme or 'http', 'all') + + +def get_redirect_method(method, status): + """Unified redirect method handling""" + + # A 303 must either use GET or HEAD for subsequent request + # https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.4 + if status == 303 and method != 'HEAD': + method = 'GET' + # 301 and 302 redirects are commonly turned into a GET from a POST + # for subsequent requests by browsers, so we'll do the same. + # https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.2 + # https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.3 + if status in (301, 302) and method == 'POST': + method = 'GET' + return method + + +def make_ssl_context( + verify=True, + client_certificate=None, + client_certificate_key=None, + client_certificate_password=None, + legacy_support=False, + use_certifi=True, +): + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + context.check_hostname = verify + context.verify_mode = ssl.CERT_REQUIRED if verify else ssl.CERT_NONE + + # Some servers may reject requests if ALPN extension is not sent. See: + # https://github.com/python/cpython/issues/85140 + # https://github.com/yt-dlp/yt-dlp/issues/3878 + with contextlib.suppress(NotImplementedError): + context.set_alpn_protocols(['http/1.1']) + if verify: + ssl_load_certs(context, use_certifi) + + if legacy_support: + context.options |= 4 # SSL_OP_LEGACY_SERVER_CONNECT + context.set_ciphers('DEFAULT') # compat + + elif ssl.OPENSSL_VERSION_INFO >= (1, 1, 1) and not ssl.OPENSSL_VERSION.startswith('LibreSSL'): + # Use the default SSL ciphers and minimum TLS version settings from Python 3.10 [1]. + # This is to ensure consistent behavior across Python versions and libraries, and help avoid fingerprinting + # in some situations [2][3]. + # Python 3.10 only supports OpenSSL 1.1.1+ [4]. Because this change is likely + # untested on older versions, we only apply this to OpenSSL 1.1.1+ to be safe. + # LibreSSL is excluded until further investigation due to cipher support issues [5][6]. + # 1. https://github.com/python/cpython/commit/e983252b516edb15d4338b0a47631b59ef1e2536 + # 2. https://github.com/yt-dlp/yt-dlp/issues/4627 + # 3. https://github.com/yt-dlp/yt-dlp/pull/5294 + # 4. https://peps.python.org/pep-0644/ + # 5. https://peps.python.org/pep-0644/#libressl-support + # 6. https://github.com/yt-dlp/yt-dlp/commit/5b9f253fa0aee996cf1ed30185d4b502e00609c4#commitcomment-89054368 + context.set_ciphers( + '@SECLEVEL=2:ECDH+AESGCM:ECDH+CHACHA20:ECDH+AES:DHE+AES:!aNULL:!eNULL:!aDSS:!SHA1:!AESCCM') + context.minimum_version = ssl.TLSVersion.TLSv1_2 + + if client_certificate: + try: + context.load_cert_chain( + client_certificate, keyfile=client_certificate_key, + password=client_certificate_password) + except ssl.SSLError: + raise RequestError('Unable to load client certificate') + + if getattr(context, 'post_handshake_auth', None) is not None: + context.post_handshake_auth = True + return context + + +class InstanceStoreMixin: + def __init__(self, **kwargs): + self.__instances = [] + super().__init__(**kwargs) # So that both MRO works + + @staticmethod + def _create_instance(**kwargs): + raise NotImplementedError + + def _get_instance(self, **kwargs): + for key, instance in self.__instances: + if key == kwargs: + return instance + + instance = self._create_instance(**kwargs) + self.__instances.append((kwargs, instance)) + return instance + + def _close_instance(self, instance): + if callable(getattr(instance, 'close', None)): + instance.close() + + def _clear_instances(self): + for _, instance in self.__instances: + self._close_instance(instance) + self.__instances.clear() + + +def add_accept_encoding_header(headers: HTTPHeaderDict, supported_encodings: Iterable[str]): + if 'Accept-Encoding' not in headers: + headers['Accept-Encoding'] = ', '.join(supported_encodings) or 'identity' + + +def wrap_request_errors(func): + @functools.wraps(func) + def wrapper(self, *args, **kwargs): + try: + return func(self, *args, **kwargs) + except UnsupportedRequest as e: + if e.handler is None: + e.handler = self + raise + return wrapper + + +def _socket_connect(ip_addr, timeout, source_address): + af, socktype, proto, canonname, sa = ip_addr + sock = socket.socket(af, socktype, proto) + try: + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + except socket.error: + sock.close() + raise + + +def create_connection( + address, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, + *, + _create_socket_func=_socket_connect +): + # Work around socket.create_connection() which tries all addresses from getaddrinfo() including IPv6. + # This filters the addresses based on the given source_address. + # Based on: https://github.com/python/cpython/blob/main/Lib/socket.py#L810 + host, port = address + ip_addrs = socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM) + if not ip_addrs: + raise socket.error('getaddrinfo returns an empty list') + if source_address is not None: + af = socket.AF_INET if ':' not in source_address[0] else socket.AF_INET6 + ip_addrs = [addr for addr in ip_addrs if addr[0] == af] + if not ip_addrs: + raise OSError( + f'No remote IPv{4 if af == socket.AF_INET else 6} addresses available for connect. ' + f'Can\'t use "{source_address[0]}" as source address') + + err = None + for ip_addr in ip_addrs: + try: + sock = _create_socket_func(ip_addr, timeout, source_address) + # Explicitly break __traceback__ reference cycle + # https://bugs.python.org/issue36820 + err = None + return sock + except socket.error as e: + err = e + + try: + raise err + finally: + # Explicitly break __traceback__ reference cycle + # https://bugs.python.org/issue36820 + err = None diff --git a/python/lib/python3.10/site-packages/yt_dlp/networking/_urllib.py b/python/lib/python3.10/site-packages/yt_dlp/networking/_urllib.py new file mode 100644 index 0000000..9e2bf33 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/networking/_urllib.py @@ -0,0 +1,436 @@ +from __future__ import annotations + +import functools +import http.client +import io +import socket +import ssl +import urllib.error +import urllib.parse +import urllib.request +import urllib.response +import zlib +from urllib.request import ( + DataHandler, + FileHandler, + FTPHandler, + HTTPCookieProcessor, + HTTPDefaultErrorHandler, + HTTPErrorProcessor, + UnknownHandler, +) + +from ._helper import ( + InstanceStoreMixin, + add_accept_encoding_header, + create_connection, + get_redirect_method, + make_socks_proxy_opts, + select_proxy, +) +from .common import Features, RequestHandler, Response, register_rh +from .exceptions import ( + CertificateVerifyError, + HTTPError, + IncompleteRead, + ProxyError, + RequestError, + SSLError, + TransportError, +) +from ..dependencies import brotli +from ..socks import ProxyError as SocksProxyError +from ..socks import sockssocket +from ..utils import update_url_query +from ..utils.networking import normalize_url + +SUPPORTED_ENCODINGS = ['gzip', 'deflate'] +CONTENT_DECODE_ERRORS = [zlib.error, OSError] + +if brotli: + SUPPORTED_ENCODINGS.append('br') + CONTENT_DECODE_ERRORS.append(brotli.error) + + +def _create_http_connection(http_class, source_address, *args, **kwargs): + hc = http_class(*args, **kwargs) + + if hasattr(hc, '_create_connection'): + hc._create_connection = create_connection + + if source_address is not None: + hc.source_address = (source_address, 0) + + return hc + + +class HTTPHandler(urllib.request.AbstractHTTPHandler): + """Handler for HTTP requests and responses. + + This class, when installed with an OpenerDirector, automatically adds + the standard headers to every HTTP request and handles gzipped, deflated and + brotli responses from web servers. + + Part of this code was copied from: + + http://techknack.net/python-urllib2-handlers/ + + Andrew Rowls, the author of that code, agreed to release it to the + public domain. + """ + + def __init__(self, context=None, source_address=None, *args, **kwargs): + super().__init__(*args, **kwargs) + self._source_address = source_address + self._context = context + + @staticmethod + def _make_conn_class(base, req): + conn_class = base + socks_proxy = req.headers.pop('Ytdl-socks-proxy', None) + if socks_proxy: + conn_class = make_socks_conn_class(conn_class, socks_proxy) + return conn_class + + def http_open(self, req): + conn_class = self._make_conn_class(http.client.HTTPConnection, req) + return self.do_open(functools.partial( + _create_http_connection, conn_class, self._source_address), req) + + def https_open(self, req): + conn_class = self._make_conn_class(http.client.HTTPSConnection, req) + return self.do_open( + functools.partial( + _create_http_connection, conn_class, self._source_address), + req, context=self._context) + + @staticmethod + def deflate(data): + if not data: + return data + try: + return zlib.decompress(data, -zlib.MAX_WBITS) + except zlib.error: + return zlib.decompress(data) + + @staticmethod + def brotli(data): + if not data: + return data + return brotli.decompress(data) + + @staticmethod + def gz(data): + # There may be junk added the end of the file + # We ignore it by only ever decoding a single gzip payload + if not data: + return data + return zlib.decompress(data, wbits=zlib.MAX_WBITS | 16) + + def http_request(self, req): + # According to RFC 3986, URLs can not contain non-ASCII characters, however this is not + # always respected by websites, some tend to give out URLs with non percent-encoded + # non-ASCII characters (see telemb.py, ard.py [#3412]) + # urllib chokes on URLs with non-ASCII characters (see http://bugs.python.org/issue3991) + # To work around aforementioned issue we will replace request's original URL with + # percent-encoded one + # Since redirects are also affected (e.g. http://www.southpark.de/alle-episoden/s18e09) + # the code of this workaround has been moved here from YoutubeDL.urlopen() + url = req.get_full_url() + url_escaped = normalize_url(url) + + # Substitute URL if any change after escaping + if url != url_escaped: + req = update_Request(req, url=url_escaped) + + return super().do_request_(req) + + def http_response(self, req, resp): + old_resp = resp + + # Content-Encoding header lists the encodings in order that they were applied [1]. + # To decompress, we simply do the reverse. + # [1]: https://datatracker.ietf.org/doc/html/rfc9110#name-content-encoding + decoded_response = None + for encoding in (e.strip() for e in reversed(resp.headers.get('Content-encoding', '').split(','))): + if encoding == 'gzip': + decoded_response = self.gz(decoded_response or resp.read()) + elif encoding == 'deflate': + decoded_response = self.deflate(decoded_response or resp.read()) + elif encoding == 'br' and brotli: + decoded_response = self.brotli(decoded_response or resp.read()) + + if decoded_response is not None: + resp = urllib.request.addinfourl(io.BytesIO(decoded_response), old_resp.headers, old_resp.url, old_resp.code) + resp.msg = old_resp.msg + # Percent-encode redirect URL of Location HTTP header to satisfy RFC 3986 (see + # https://github.com/ytdl-org/youtube-dl/issues/6457). + if 300 <= resp.code < 400: + location = resp.headers.get('Location') + if location: + # As of RFC 2616 default charset is iso-8859-1 that is respected by python 3 + location = location.encode('iso-8859-1').decode() + location_escaped = normalize_url(location) + if location != location_escaped: + del resp.headers['Location'] + resp.headers['Location'] = location_escaped + return resp + + https_request = http_request + https_response = http_response + + +def make_socks_conn_class(base_class, socks_proxy): + assert issubclass(base_class, ( + http.client.HTTPConnection, http.client.HTTPSConnection)) + + proxy_args = make_socks_proxy_opts(socks_proxy) + + class SocksConnection(base_class): + _create_connection = create_connection + + def connect(self): + def sock_socket_connect(ip_addr, timeout, source_address): + af, socktype, proto, canonname, sa = ip_addr + sock = sockssocket(af, socktype, proto) + try: + connect_proxy_args = proxy_args.copy() + connect_proxy_args.update({'addr': sa[0], 'port': sa[1]}) + sock.setproxy(**connect_proxy_args) + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: # noqa: E721 + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect((self.host, self.port)) + return sock + except socket.error: + sock.close() + raise + self.sock = create_connection( + (proxy_args['addr'], proxy_args['port']), timeout=self.timeout, + source_address=self.source_address, _create_socket_func=sock_socket_connect) + if isinstance(self, http.client.HTTPSConnection): + self.sock = self._context.wrap_socket(self.sock, server_hostname=self.host) + + return SocksConnection + + +class RedirectHandler(urllib.request.HTTPRedirectHandler): + """YoutubeDL redirect handler + + The code is based on HTTPRedirectHandler implementation from CPython [1]. + + This redirect handler fixes and improves the logic to better align with RFC7261 + and what browsers tend to do [2][3] + + 1. https://github.com/python/cpython/blob/master/Lib/urllib/request.py + 2. https://datatracker.ietf.org/doc/html/rfc7231 + 3. https://github.com/python/cpython/issues/91306 + """ + + http_error_301 = http_error_303 = http_error_307 = http_error_308 = urllib.request.HTTPRedirectHandler.http_error_302 + + def redirect_request(self, req, fp, code, msg, headers, newurl): + if code not in (301, 302, 303, 307, 308): + raise urllib.error.HTTPError(req.full_url, code, msg, headers, fp) + + new_data = req.data + + # Technically the Cookie header should be in unredirected_hdrs, + # however in practice some may set it in normal headers anyway. + # We will remove it here to prevent any leaks. + remove_headers = ['Cookie'] + + new_method = get_redirect_method(req.get_method(), code) + # only remove payload if method changed (e.g. POST to GET) + if new_method != req.get_method(): + new_data = None + remove_headers.extend(['Content-Length', 'Content-Type']) + + new_headers = {k: v for k, v in req.headers.items() if k.title() not in remove_headers} + + return urllib.request.Request( + newurl, headers=new_headers, origin_req_host=req.origin_req_host, + unverifiable=True, method=new_method, data=new_data) + + +class ProxyHandler(urllib.request.BaseHandler): + handler_order = 100 + + def __init__(self, proxies=None): + self.proxies = proxies + # Set default handlers + for type in ('http', 'https', 'ftp'): + setattr(self, '%s_open' % type, lambda r, meth=self.proxy_open: meth(r)) + + def proxy_open(self, req): + proxy = select_proxy(req.get_full_url(), self.proxies) + if proxy is None: + return + if urllib.parse.urlparse(proxy).scheme.lower() in ('socks4', 'socks4a', 'socks5', 'socks5h'): + req.add_header('Ytdl-socks-proxy', proxy) + # yt-dlp's http/https handlers do wrapping the socket with socks + return None + return urllib.request.ProxyHandler.proxy_open( + self, req, proxy, None) + + +class PUTRequest(urllib.request.Request): + def get_method(self): + return 'PUT' + + +class HEADRequest(urllib.request.Request): + def get_method(self): + return 'HEAD' + + +def update_Request(req, url=None, data=None, headers=None, query=None): + req_headers = req.headers.copy() + req_headers.update(headers or {}) + req_data = data if data is not None else req.data + req_url = update_url_query(url or req.get_full_url(), query) + req_get_method = req.get_method() + if req_get_method == 'HEAD': + req_type = HEADRequest + elif req_get_method == 'PUT': + req_type = PUTRequest + else: + req_type = urllib.request.Request + new_req = req_type( + req_url, data=req_data, headers=req_headers, + origin_req_host=req.origin_req_host, unverifiable=req.unverifiable) + if hasattr(req, 'timeout'): + new_req.timeout = req.timeout + return new_req + + +class UrllibResponseAdapter(Response): + """ + HTTP Response adapter class for urllib addinfourl and http.client.HTTPResponse + """ + + def __init__(self, res: http.client.HTTPResponse | urllib.response.addinfourl): + # addinfourl: In Python 3.9+, .status was introduced and .getcode() was deprecated [1] + # HTTPResponse: .getcode() was deprecated, .status always existed [2] + # 1. https://docs.python.org/3/library/urllib.request.html#urllib.response.addinfourl.getcode + # 2. https://docs.python.org/3.10/library/http.client.html#http.client.HTTPResponse.status + super().__init__( + fp=res, headers=res.headers, url=res.url, + status=getattr(res, 'status', None) or res.getcode(), reason=getattr(res, 'reason', None)) + + def read(self, amt=None): + try: + return self.fp.read(amt) + except Exception as e: + handle_response_read_exceptions(e) + raise e + + +def handle_sslerror(e: ssl.SSLError): + if not isinstance(e, ssl.SSLError): + return + if isinstance(e, ssl.SSLCertVerificationError): + raise CertificateVerifyError(cause=e) from e + raise SSLError(cause=e) from e + + +def handle_response_read_exceptions(e): + if isinstance(e, http.client.IncompleteRead): + raise IncompleteRead(partial=len(e.partial), cause=e, expected=e.expected) from e + elif isinstance(e, ssl.SSLError): + handle_sslerror(e) + elif isinstance(e, (OSError, EOFError, http.client.HTTPException, *CONTENT_DECODE_ERRORS)): + # OSErrors raised here should mostly be network related + raise TransportError(cause=e) from e + + +@register_rh +class UrllibRH(RequestHandler, InstanceStoreMixin): + _SUPPORTED_URL_SCHEMES = ('http', 'https', 'data', 'ftp') + _SUPPORTED_PROXY_SCHEMES = ('http', 'socks4', 'socks4a', 'socks5', 'socks5h') + _SUPPORTED_FEATURES = (Features.NO_PROXY, Features.ALL_PROXY) + RH_NAME = 'urllib' + + def __init__(self, *, enable_file_urls: bool = False, **kwargs): + super().__init__(**kwargs) + self.enable_file_urls = enable_file_urls + if self.enable_file_urls: + self._SUPPORTED_URL_SCHEMES = (*self._SUPPORTED_URL_SCHEMES, 'file') + + def _check_extensions(self, extensions): + super()._check_extensions(extensions) + extensions.pop('cookiejar', None) + extensions.pop('timeout', None) + + def _create_instance(self, proxies, cookiejar): + opener = urllib.request.OpenerDirector() + handlers = [ + ProxyHandler(proxies), + HTTPHandler( + debuglevel=int(bool(self.verbose)), + context=self._make_sslcontext(), + source_address=self.source_address), + HTTPCookieProcessor(cookiejar), + DataHandler(), + UnknownHandler(), + HTTPDefaultErrorHandler(), + FTPHandler(), + HTTPErrorProcessor(), + RedirectHandler(), + ] + + if self.enable_file_urls: + handlers.append(FileHandler()) + + for handler in handlers: + opener.add_handler(handler) + + # Delete the default user-agent header, which would otherwise apply in + # cases where our custom HTTP handler doesn't come into play + # (See https://github.com/ytdl-org/youtube-dl/issues/1309 for details) + opener.addheaders = [] + return opener + + def _send(self, request): + headers = self._merge_headers(request.headers) + add_accept_encoding_header(headers, SUPPORTED_ENCODINGS) + urllib_req = urllib.request.Request( + url=request.url, + data=request.data, + headers=dict(headers), + method=request.method + ) + + opener = self._get_instance( + proxies=request.proxies or self.proxies, + cookiejar=request.extensions.get('cookiejar') or self.cookiejar + ) + try: + res = opener.open(urllib_req, timeout=float(request.extensions.get('timeout') or self.timeout)) + except urllib.error.HTTPError as e: + if isinstance(e.fp, (http.client.HTTPResponse, urllib.response.addinfourl)): + # Prevent file object from being closed when urllib.error.HTTPError is destroyed. + e._closer.close_called = True + raise HTTPError(UrllibResponseAdapter(e.fp), redirect_loop='redirect error' in str(e)) from e + raise # unexpected + except urllib.error.URLError as e: + cause = e.reason # NOTE: cause may be a string + + # proxy errors + if 'tunnel connection failed' in str(cause).lower() or isinstance(cause, SocksProxyError): + raise ProxyError(cause=e) from e + + handle_response_read_exceptions(cause) + raise TransportError(cause=e) from e + except (http.client.InvalidURL, ValueError) as e: + # Validation errors + # http.client.HTTPConnection raises ValueError in some validation cases + # such as if request method contains illegal control characters [1] + # 1. https://github.com/python/cpython/blob/987b712b4aeeece336eed24fcc87a950a756c3e2/Lib/http/client.py#L1256 + raise RequestError(cause=e) from e + except Exception as e: + handle_response_read_exceptions(e) + raise # unexpected + + return UrllibResponseAdapter(res) diff --git a/python/lib/python3.10/site-packages/yt_dlp/networking/common.py b/python/lib/python3.10/site-packages/yt_dlp/networking/common.py new file mode 100644 index 0000000..584c7bb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/networking/common.py @@ -0,0 +1,564 @@ +from __future__ import annotations + +import abc +import copy +import enum +import functools +import io +import typing +import urllib.parse +import urllib.request +import urllib.response +from collections.abc import Iterable, Mapping +from email.message import Message +from http import HTTPStatus + +from ._helper import make_ssl_context, wrap_request_errors +from .exceptions import ( + NoSupportingHandlers, + RequestError, + TransportError, + UnsupportedRequest, +) +from ..compat.types import NoneType +from ..cookies import YoutubeDLCookieJar +from ..utils import ( + bug_reports_message, + classproperty, + deprecation_warning, + error_to_str, + update_url_query, +) +from ..utils.networking import HTTPHeaderDict, normalize_url + + +def register_preference(*handlers: type[RequestHandler]): + assert all(issubclass(handler, RequestHandler) for handler in handlers) + + def outer(preference: Preference): + @functools.wraps(preference) + def inner(handler, *args, **kwargs): + if not handlers or isinstance(handler, handlers): + return preference(handler, *args, **kwargs) + return 0 + _RH_PREFERENCES.add(inner) + return inner + return outer + + +class RequestDirector: + """RequestDirector class + + Helper class that, when given a request, forward it to a RequestHandler that supports it. + + Preference functions in the form of func(handler, request) -> int + can be registered into the `preferences` set. These are used to sort handlers + in order of preference. + + @param logger: Logger instance. + @param verbose: Print debug request information to stdout. + """ + + def __init__(self, logger, verbose=False): + self.handlers: dict[str, RequestHandler] = {} + self.preferences: set[Preference] = set() + self.logger = logger # TODO(Grub4k): default logger + self.verbose = verbose + + def close(self): + for handler in self.handlers.values(): + handler.close() + + def add_handler(self, handler: RequestHandler): + """Add a handler. If a handler of the same RH_KEY exists, it will overwrite it""" + assert isinstance(handler, RequestHandler), 'handler must be a RequestHandler' + self.handlers[handler.RH_KEY] = handler + + def _get_handlers(self, request: Request) -> list[RequestHandler]: + """Sorts handlers by preference, given a request""" + preferences = { + rh: sum(pref(rh, request) for pref in self.preferences) + for rh in self.handlers.values() + } + self._print_verbose('Handler preferences for this request: %s' % ', '.join( + f'{rh.RH_NAME}={pref}' for rh, pref in preferences.items())) + return sorted(self.handlers.values(), key=preferences.get, reverse=True) + + def _print_verbose(self, msg): + if self.verbose: + self.logger.stdout(f'director: {msg}') + + def send(self, request: Request) -> Response: + """ + Passes a request onto a suitable RequestHandler + """ + if not self.handlers: + raise RequestError('No request handlers configured') + + assert isinstance(request, Request) + + unexpected_errors = [] + unsupported_errors = [] + for handler in self._get_handlers(request): + self._print_verbose(f'Checking if "{handler.RH_NAME}" supports this request.') + try: + handler.validate(request) + except UnsupportedRequest as e: + self._print_verbose( + f'"{handler.RH_NAME}" cannot handle this request (reason: {error_to_str(e)})') + unsupported_errors.append(e) + continue + + self._print_verbose(f'Sending request via "{handler.RH_NAME}"') + try: + response = handler.send(request) + except RequestError: + raise + except Exception as e: + self.logger.error( + f'[{handler.RH_NAME}] Unexpected error: {error_to_str(e)}{bug_reports_message()}', + is_error=False) + unexpected_errors.append(e) + continue + + assert isinstance(response, Response) + return response + + raise NoSupportingHandlers(unsupported_errors, unexpected_errors) + + +_REQUEST_HANDLERS = {} + + +def register_rh(handler): + """Register a RequestHandler class""" + assert issubclass(handler, RequestHandler), f'{handler} must be a subclass of RequestHandler' + assert handler.RH_KEY not in _REQUEST_HANDLERS, f'RequestHandler {handler.RH_KEY} already registered' + _REQUEST_HANDLERS[handler.RH_KEY] = handler + return handler + + +class Features(enum.Enum): + ALL_PROXY = enum.auto() + NO_PROXY = enum.auto() + + +class RequestHandler(abc.ABC): + + """Request Handler class + + Request handlers are class that, given a Request, + process the request from start to finish and return a Response. + + Concrete subclasses need to redefine the _send(request) method, + which handles the underlying request logic and returns a Response. + + RH_NAME class variable may contain a display name for the RequestHandler. + By default, this is generated from the class name. + + The concrete request handler MUST have "RH" as the suffix in the class name. + + All exceptions raised by a RequestHandler should be an instance of RequestError. + Any other exception raised will be treated as a handler issue. + + If a Request is not supported by the handler, an UnsupportedRequest + should be raised with a reason. + + By default, some checks are done on the request in _validate() based on the following class variables: + - `_SUPPORTED_URL_SCHEMES`: a tuple of supported url schemes. + Any Request with an url scheme not in this list will raise an UnsupportedRequest. + + - `_SUPPORTED_PROXY_SCHEMES`: a tuple of support proxy url schemes. Any Request that contains + a proxy url with an url scheme not in this list will raise an UnsupportedRequest. + + - `_SUPPORTED_FEATURES`: a tuple of supported features, as defined in Features enum. + + The above may be set to None to disable the checks. + + Parameters: + @param logger: logger instance + @param headers: HTTP Headers to include when sending requests. + @param cookiejar: Cookiejar to use for requests. + @param timeout: Socket timeout to use when sending requests. + @param proxies: Proxies to use for sending requests. + @param source_address: Client-side IP address to bind to for requests. + @param verbose: Print debug request and traffic information to stdout. + @param prefer_system_certs: Whether to prefer system certificates over other means (e.g. certifi). + @param client_cert: SSL client certificate configuration. + dict with {client_certificate, client_certificate_key, client_certificate_password} + @param verify: Verify SSL certificates + @param legacy_ssl_support: Enable legacy SSL options such as legacy server connect and older cipher support. + + Some configuration options may be available for individual Requests too. In this case, + either the Request configuration option takes precedence or they are merged. + + Requests may have additional optional parameters defined as extensions. + RequestHandler subclasses may choose to support custom extensions. + + If an extension is supported, subclasses should extend _check_extensions(extensions) + to pop and validate the extension. + - Extensions left in `extensions` are treated as unsupported and UnsupportedRequest will be raised. + + The following extensions are defined for RequestHandler: + - `cookiejar`: Cookiejar to use for this request. + - `timeout`: socket timeout to use for this request. + To enable these, add extensions.pop('<extension>', None) to _check_extensions + + Apart from the url protocol, proxies dict may contain the following keys: + - `all`: proxy to use for all protocols. Used as a fallback if no proxy is set for a specific protocol. + - `no`: comma seperated list of hostnames (optionally with port) to not use a proxy for. + Note: a RequestHandler may not support these, as defined in `_SUPPORTED_FEATURES`. + + """ + + _SUPPORTED_URL_SCHEMES = () + _SUPPORTED_PROXY_SCHEMES = () + _SUPPORTED_FEATURES = () + + def __init__( + self, *, + logger, # TODO(Grub4k): default logger + headers: HTTPHeaderDict = None, + cookiejar: YoutubeDLCookieJar = None, + timeout: float | int | None = None, + proxies: dict = None, + source_address: str = None, + verbose: bool = False, + prefer_system_certs: bool = False, + client_cert: dict[str, str | None] = None, + verify: bool = True, + legacy_ssl_support: bool = False, + **_, + ): + + self._logger = logger + self.headers = headers or {} + self.cookiejar = cookiejar if cookiejar is not None else YoutubeDLCookieJar() + self.timeout = float(timeout or 20) + self.proxies = proxies or {} + self.source_address = source_address + self.verbose = verbose + self.prefer_system_certs = prefer_system_certs + self._client_cert = client_cert or {} + self.verify = verify + self.legacy_ssl_support = legacy_ssl_support + super().__init__() + + def _make_sslcontext(self): + return make_ssl_context( + verify=self.verify, + legacy_support=self.legacy_ssl_support, + use_certifi=not self.prefer_system_certs, + **self._client_cert, + ) + + def _merge_headers(self, request_headers): + return HTTPHeaderDict(self.headers, request_headers) + + def _check_url_scheme(self, request: Request): + scheme = urllib.parse.urlparse(request.url).scheme.lower() + if self._SUPPORTED_URL_SCHEMES is not None and scheme not in self._SUPPORTED_URL_SCHEMES: + raise UnsupportedRequest(f'Unsupported url scheme: "{scheme}"') + return scheme # for further processing + + def _check_proxies(self, proxies): + for proxy_key, proxy_url in proxies.items(): + if proxy_url is None: + continue + if proxy_key == 'no': + if self._SUPPORTED_FEATURES is not None and Features.NO_PROXY not in self._SUPPORTED_FEATURES: + raise UnsupportedRequest('"no" proxy is not supported') + continue + if ( + proxy_key == 'all' + and self._SUPPORTED_FEATURES is not None + and Features.ALL_PROXY not in self._SUPPORTED_FEATURES + ): + raise UnsupportedRequest('"all" proxy is not supported') + + # Unlikely this handler will use this proxy, so ignore. + # This is to allow a case where a proxy may be set for a protocol + # for one handler in which such protocol (and proxy) is not supported by another handler. + if self._SUPPORTED_URL_SCHEMES is not None and proxy_key not in (*self._SUPPORTED_URL_SCHEMES, 'all'): + continue + + if self._SUPPORTED_PROXY_SCHEMES is None: + # Skip proxy scheme checks + continue + + try: + if urllib.request._parse_proxy(proxy_url)[0] is None: + # Scheme-less proxies are not supported + raise UnsupportedRequest(f'Proxy "{proxy_url}" missing scheme') + except ValueError as e: + # parse_proxy may raise on some invalid proxy urls such as "/a/b/c" + raise UnsupportedRequest(f'Invalid proxy url "{proxy_url}": {e}') + + scheme = urllib.parse.urlparse(proxy_url).scheme.lower() + if scheme not in self._SUPPORTED_PROXY_SCHEMES: + raise UnsupportedRequest(f'Unsupported proxy type: "{scheme}"') + + def _check_extensions(self, extensions): + """Check extensions for unsupported extensions. Subclasses should extend this.""" + assert isinstance(extensions.get('cookiejar'), (YoutubeDLCookieJar, NoneType)) + assert isinstance(extensions.get('timeout'), (float, int, NoneType)) + + def _validate(self, request): + self._check_url_scheme(request) + self._check_proxies(request.proxies or self.proxies) + extensions = request.extensions.copy() + self._check_extensions(extensions) + if extensions: + # TODO: add support for optional extensions + raise UnsupportedRequest(f'Unsupported extensions: {", ".join(extensions.keys())}') + + @wrap_request_errors + def validate(self, request: Request): + if not isinstance(request, Request): + raise TypeError('Expected an instance of Request') + self._validate(request) + + @wrap_request_errors + def send(self, request: Request) -> Response: + if not isinstance(request, Request): + raise TypeError('Expected an instance of Request') + return self._send(request) + + @abc.abstractmethod + def _send(self, request: Request): + """Handle a request from start to finish. Redefine in subclasses.""" + pass + + def close(self): + pass + + @classproperty + def RH_NAME(cls): + return cls.__name__[:-2] + + @classproperty + def RH_KEY(cls): + assert cls.__name__.endswith('RH'), 'RequestHandler class names must end with "RH"' + return cls.__name__[:-2] + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +class Request: + """ + Represents a request to be made. + Partially backwards-compatible with urllib.request.Request. + + @param url: url to send. Will be sanitized. + @param data: payload data to send. Must be bytes, iterable of bytes, a file-like object or None + @param headers: headers to send. + @param proxies: proxy dict mapping of proto:proxy to use for the request and any redirects. + @param query: URL query parameters to update the url with. + @param method: HTTP method to use. If no method specified, will use POST if payload data is present else GET + @param extensions: Dictionary of Request extensions to add, as supported by handlers. + """ + + def __init__( + self, + url: str, + data: RequestData = None, + headers: typing.Mapping = None, + proxies: dict = None, + query: dict = None, + method: str = None, + extensions: dict = None + ): + + self._headers = HTTPHeaderDict() + self._data = None + + if query: + url = update_url_query(url, query) + + self.url = url + self.method = method + if headers: + self.headers = headers + self.data = data # note: must be done after setting headers + self.proxies = proxies or {} + self.extensions = extensions or {} + + @property + def url(self): + return self._url + + @url.setter + def url(self, url): + if not isinstance(url, str): + raise TypeError('url must be a string') + elif url.startswith('//'): + url = 'http:' + url + self._url = normalize_url(url) + + @property + def method(self): + return self._method or ('POST' if self.data is not None else 'GET') + + @method.setter + def method(self, method): + if method is None: + self._method = None + elif isinstance(method, str): + self._method = method.upper() + else: + raise TypeError('method must be a string') + + @property + def data(self): + return self._data + + @data.setter + def data(self, data: RequestData): + # Try catch some common mistakes + if data is not None and ( + not isinstance(data, (bytes, io.IOBase, Iterable)) or isinstance(data, (str, Mapping)) + ): + raise TypeError('data must be bytes, iterable of bytes, or a file-like object') + + if data == self._data and self._data is None: + self.headers.pop('Content-Length', None) + + # https://docs.python.org/3/library/urllib.request.html#urllib.request.Request.data + if data != self._data: + if self._data is not None: + self.headers.pop('Content-Length', None) + self._data = data + + if self._data is None: + self.headers.pop('Content-Type', None) + + if 'Content-Type' not in self.headers and self._data is not None: + self.headers['Content-Type'] = 'application/x-www-form-urlencoded' + + @property + def headers(self) -> HTTPHeaderDict: + return self._headers + + @headers.setter + def headers(self, new_headers: Mapping): + """Replaces headers of the request. If not a CaseInsensitiveDict, it will be converted to one.""" + if isinstance(new_headers, HTTPHeaderDict): + self._headers = new_headers + elif isinstance(new_headers, Mapping): + self._headers = HTTPHeaderDict(new_headers) + else: + raise TypeError('headers must be a mapping') + + def update(self, url=None, data=None, headers=None, query=None): + self.data = data if data is not None else self.data + self.headers.update(headers or {}) + self.url = update_url_query(url or self.url, query or {}) + + def copy(self): + return self.__class__( + url=self.url, + headers=copy.deepcopy(self.headers), + proxies=copy.deepcopy(self.proxies), + data=self._data, + extensions=copy.copy(self.extensions), + method=self._method, + ) + + +HEADRequest = functools.partial(Request, method='HEAD') +PUTRequest = functools.partial(Request, method='PUT') + + +class Response(io.IOBase): + """ + Base class for HTTP response adapters. + + By default, it provides a basic wrapper for a file-like response object. + + Interface partially backwards-compatible with addinfourl and http.client.HTTPResponse. + + @param fp: Original, file-like, response. + @param url: URL that this is a response of. + @param headers: response headers. + @param status: Response HTTP status code. Default is 200 OK. + @param reason: HTTP status reason. Will use built-in reasons based on status code if not provided. + """ + + def __init__( + self, + fp: typing.IO, + url: str, + headers: Mapping[str, str], + status: int = 200, + reason: str = None): + + self.fp = fp + self.headers = Message() + for name, value in headers.items(): + self.headers.add_header(name, value) + self.status = status + self.url = url + try: + self.reason = reason or HTTPStatus(status).phrase + except ValueError: + self.reason = None + + def readable(self): + return self.fp.readable() + + def read(self, amt: int = None) -> bytes: + # Expected errors raised here should be of type RequestError or subclasses. + # Subclasses should redefine this method with more precise error handling. + try: + return self.fp.read(amt) + except Exception as e: + raise TransportError(cause=e) from e + + def close(self): + self.fp.close() + return super().close() + + def get_header(self, name, default=None): + """Get header for name. + If there are multiple matching headers, return all seperated by comma.""" + headers = self.headers.get_all(name) + if not headers: + return default + if name.title() == 'Set-Cookie': + # Special case, only get the first one + # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.3-4.1 + return headers[0] + return ', '.join(headers) + + # The following methods are for compatability reasons and are deprecated + @property + def code(self): + deprecation_warning('Response.code is deprecated, use Response.status', stacklevel=2) + return self.status + + def getcode(self): + deprecation_warning('Response.getcode() is deprecated, use Response.status', stacklevel=2) + return self.status + + def geturl(self): + deprecation_warning('Response.geturl() is deprecated, use Response.url', stacklevel=2) + return self.url + + def info(self): + deprecation_warning('Response.info() is deprecated, use Response.headers', stacklevel=2) + return self.headers + + def getheader(self, name, default=None): + deprecation_warning('Response.getheader() is deprecated, use Response.get_header', stacklevel=2) + return self.get_header(name, default) + + +if typing.TYPE_CHECKING: + RequestData = bytes | Iterable[bytes] | typing.IO | None + Preference = typing.Callable[[RequestHandler, Request], int] + +_RH_PREFERENCES: set[Preference] = set() diff --git a/python/lib/python3.10/site-packages/yt_dlp/networking/exceptions.py b/python/lib/python3.10/site-packages/yt_dlp/networking/exceptions.py new file mode 100644 index 0000000..f58dc24 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/networking/exceptions.py @@ -0,0 +1,217 @@ +from __future__ import annotations + +import typing +import urllib.error + +from ..utils import YoutubeDLError, deprecation_warning + +if typing.TYPE_CHECKING: + from .common import RequestHandler, Response + + +class RequestError(YoutubeDLError): + def __init__( + self, + msg: str | None = None, + cause: Exception | str | None = None, + handler: RequestHandler = None + ): + self.handler = handler + self.cause = cause + if not msg and cause: + msg = str(cause) + super().__init__(msg) + + +class UnsupportedRequest(RequestError): + """raised when a handler cannot handle a request""" + pass + + +class NoSupportingHandlers(RequestError): + """raised when no handlers can support a request for various reasons""" + + def __init__(self, unsupported_errors: list[UnsupportedRequest], unexpected_errors: list[Exception]): + self.unsupported_errors = unsupported_errors or [] + self.unexpected_errors = unexpected_errors or [] + + # Print a quick summary of the errors + err_handler_map = {} + for err in unsupported_errors: + err_handler_map.setdefault(err.msg, []).append(err.handler.RH_NAME) + + reason_str = ', '.join([f'{msg} ({", ".join(handlers)})' for msg, handlers in err_handler_map.items()]) + if unexpected_errors: + reason_str = ' + '.join(filter(None, [reason_str, f'{len(unexpected_errors)} unexpected error(s)'])) + + err_str = 'Unable to handle request' + if reason_str: + err_str += f': {reason_str}' + + super().__init__(msg=err_str) + + +class TransportError(RequestError): + """Network related errors""" + + +class HTTPError(RequestError): + def __init__(self, response: Response, redirect_loop=False): + self.response = response + self.status = response.status + self.reason = response.reason + self.redirect_loop = redirect_loop + msg = f'HTTP Error {response.status}: {response.reason}' + if redirect_loop: + msg += ' (redirect loop detected)' + + super().__init__(msg=msg) + + def close(self): + self.response.close() + + def __repr__(self): + return f'<HTTPError {self.status}: {self.reason}>' + + +class IncompleteRead(TransportError): + def __init__(self, partial: int, expected: int = None, **kwargs): + self.partial = partial + self.expected = expected + msg = f'{partial} bytes read' + if expected is not None: + msg += f', {expected} more expected' + + super().__init__(msg=msg, **kwargs) + + def __repr__(self): + return f'<IncompleteRead: {self.msg}>' + + +class SSLError(TransportError): + pass + + +class CertificateVerifyError(SSLError): + """Raised when certificate validated has failed""" + pass + + +class ProxyError(TransportError): + pass + + +class _CompatHTTPError(urllib.error.HTTPError, HTTPError): + """ + Provides backwards compatibility with urllib.error.HTTPError. + Do not use this class directly, use HTTPError instead. + """ + + def __init__(self, http_error: HTTPError): + super().__init__( + url=http_error.response.url, + code=http_error.status, + msg=http_error.msg, + hdrs=http_error.response.headers, + fp=http_error.response + ) + self._closer.close_called = True # Disable auto close + self._http_error = http_error + HTTPError.__init__(self, http_error.response, redirect_loop=http_error.redirect_loop) + + @property + def status(self): + return self._http_error.status + + @status.setter + def status(self, value): + return + + @property + def reason(self): + return self._http_error.reason + + @reason.setter + def reason(self, value): + return + + @property + def headers(self): + deprecation_warning('HTTPError.headers is deprecated, use HTTPError.response.headers instead') + return self._http_error.response.headers + + @headers.setter + def headers(self, value): + return + + def info(self): + deprecation_warning('HTTPError.info() is deprecated, use HTTPError.response.headers instead') + return self.response.headers + + def getcode(self): + deprecation_warning('HTTPError.getcode is deprecated, use HTTPError.status instead') + return self.status + + def geturl(self): + deprecation_warning('HTTPError.geturl is deprecated, use HTTPError.response.url instead') + return self.response.url + + @property + def code(self): + deprecation_warning('HTTPError.code is deprecated, use HTTPError.status instead') + return self.status + + @code.setter + def code(self, value): + return + + @property + def url(self): + deprecation_warning('HTTPError.url is deprecated, use HTTPError.response.url instead') + return self.response.url + + @url.setter + def url(self, value): + return + + @property + def hdrs(self): + deprecation_warning('HTTPError.hdrs is deprecated, use HTTPError.response.headers instead') + return self.response.headers + + @hdrs.setter + def hdrs(self, value): + return + + @property + def filename(self): + deprecation_warning('HTTPError.filename is deprecated, use HTTPError.response.url instead') + return self.response.url + + @filename.setter + def filename(self, value): + return + + def __getattr__(self, name): + # File operations are passed through the response. + # Warn for some commonly used ones + passthrough_warnings = { + 'read': 'response.read()', + # technically possibly due to passthrough, but we should discourage this + 'get_header': 'response.get_header()', + 'readable': 'response.readable()', + 'closed': 'response.closed', + 'tell': 'response.tell()', + } + if name in passthrough_warnings: + deprecation_warning(f'HTTPError.{name} is deprecated, use HTTPError.{passthrough_warnings[name]} instead') + return super().__getattr__(name) + + def __str__(self): + return str(self._http_error) + + def __repr__(self): + return repr(self._http_error) + + +network_exceptions = (HTTPError, TransportError) diff --git a/python/lib/python3.10/site-packages/yt_dlp/options.py b/python/lib/python3.10/site-packages/yt_dlp/options.py new file mode 100644 index 0000000..85a6402 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/options.py @@ -0,0 +1,1913 @@ +import collections +import contextlib +import optparse +import os.path +import re +import shlex +import shutil +import string +import sys + +from .compat import compat_expanduser +from .cookies import SUPPORTED_BROWSERS, SUPPORTED_KEYRINGS +from .downloader.external import list_external_downloaders +from .postprocessor import ( + FFmpegExtractAudioPP, + FFmpegMergerPP, + FFmpegSubtitlesConvertorPP, + FFmpegThumbnailsConvertorPP, + FFmpegVideoRemuxerPP, + SponsorBlockPP, +) +from .postprocessor.modify_chapters import DEFAULT_SPONSORBLOCK_CHAPTER_TITLE +from .update import UPDATE_SOURCES, detect_variant, is_non_updateable +from .utils import ( + OUTTMPL_TYPES, + POSTPROCESS_WHEN, + Config, + deprecation_warning, + expand_path, + format_field, + get_executable_path, + get_system_config_dirs, + get_user_config_dirs, + join_nonempty, + orderedSet_from_options, + remove_end, + variadic, + write_string, +) +from .version import CHANNEL, __version__ + + +def parseOpts(overrideArguments=None, ignore_config_files='if_override'): + PACKAGE_NAME = 'yt-dlp' + + root = Config(create_parser()) + if ignore_config_files == 'if_override': + ignore_config_files = overrideArguments is not None + + def read_config(*paths): + path = os.path.join(*paths) + conf = Config.read_file(path, default=None) + if conf is not None: + return conf, path + + def _load_from_config_dirs(config_dirs): + for config_dir in config_dirs: + head, tail = os.path.split(config_dir) + assert tail == PACKAGE_NAME or config_dir == os.path.join(compat_expanduser('~'), f'.{PACKAGE_NAME}') + + yield read_config(head, f'{PACKAGE_NAME}.conf') + if tail.startswith('.'): # ~/.PACKAGE_NAME + yield read_config(head, f'{PACKAGE_NAME}.conf.txt') + yield read_config(config_dir, 'config') + yield read_config(config_dir, 'config.txt') + + def add_config(label, path=None, func=None): + """ Adds config and returns whether to continue """ + if root.parse_known_args()[0].ignoreconfig: + return False + elif func: + assert path is None + args, current_path = next( + filter(None, _load_from_config_dirs(func(PACKAGE_NAME))), (None, None)) + else: + current_path = os.path.join(path, 'yt-dlp.conf') + args = Config.read_file(current_path, default=None) + if args is not None: + root.append_config(args, current_path, label=label) + return True + + def load_configs(): + yield not ignore_config_files + yield add_config('Portable', get_executable_path()) + yield add_config('Home', expand_path(root.parse_known_args()[0].paths.get('home', '')).strip()) + yield add_config('User', func=get_user_config_dirs) + yield add_config('System', func=get_system_config_dirs) + + opts = optparse.Values({'verbose': True, 'print_help': False}) + try: + try: + if overrideArguments is not None: + root.append_config(overrideArguments, label='Override') + else: + root.append_config(sys.argv[1:], label='Command-line') + loaded_all_configs = all(load_configs()) + except ValueError as err: + raise root.parser.error(err) + + if loaded_all_configs: + # If ignoreconfig is found inside the system configuration file, + # the user configuration is removed + if root.parse_known_args()[0].ignoreconfig: + user_conf = next((i for i, conf in enumerate(root.configs) if conf.label == 'User'), None) + if user_conf is not None: + root.configs.pop(user_conf) + + try: + root.configs[0].load_configs() # Resolve any aliases using --config-location + except ValueError as err: + raise root.parser.error(err) + + opts, args = root.parse_args() + except optparse.OptParseError: + with contextlib.suppress(optparse.OptParseError): + opts, _ = root.parse_known_args(strict=False) + raise + except (SystemExit, KeyboardInterrupt): + opts.verbose = False + raise + finally: + verbose = opts.verbose and f'\n{root}'.replace('\n| ', '\n[debug] ')[1:] + if verbose: + write_string(f'{verbose}\n') + if opts.print_help: + if verbose: + write_string('\n') + root.parser.print_help() + if opts.print_help: + sys.exit() + return root.parser, opts, args + + +class _YoutubeDLHelpFormatter(optparse.IndentedHelpFormatter): + def __init__(self): + # No need to wrap help messages if we're on a wide console + max_width = shutil.get_terminal_size().columns or 80 + # The % is chosen to get a pretty output in README.md + super().__init__(width=max_width, max_help_position=int(0.45 * max_width)) + + @staticmethod + def format_option_strings(option): + """ ('-o', '--option') -> -o, --format METAVAR """ + opts = join_nonempty( + option._short_opts and option._short_opts[0], + option._long_opts and option._long_opts[0], + delim=', ') + if option.takes_value(): + opts += f' {option.metavar}' + return opts + + +class _YoutubeDLOptionParser(optparse.OptionParser): + # optparse is deprecated since python 3.2. So assume a stable interface even for private methods + ALIAS_DEST = '_triggered_aliases' + ALIAS_TRIGGER_LIMIT = 100 + + def __init__(self): + super().__init__( + prog='yt-dlp' if detect_variant() == 'source' else None, + version=__version__, + usage='%prog [OPTIONS] URL [URL...]', + epilog='See full documentation at https://github.com/yt-dlp/yt-dlp#readme', + formatter=_YoutubeDLHelpFormatter(), + conflict_handler='resolve', + ) + self.set_default(self.ALIAS_DEST, collections.defaultdict(int)) + + _UNKNOWN_OPTION = (optparse.BadOptionError, optparse.AmbiguousOptionError) + _BAD_OPTION = optparse.OptionValueError + + def parse_known_args(self, args=None, values=None, strict=True): + """Same as parse_args, but ignore unknown switches. Similar to argparse.parse_known_args""" + self.rargs, self.largs = self._get_args(args), [] + self.values = values or self.get_default_values() + while self.rargs: + arg = self.rargs[0] + try: + if arg == '--': + del self.rargs[0] + break + elif arg.startswith('--'): + self._process_long_opt(self.rargs, self.values) + elif arg.startswith('-') and arg != '-': + self._process_short_opts(self.rargs, self.values) + elif self.allow_interspersed_args: + self.largs.append(self.rargs.pop(0)) + else: + break + except optparse.OptParseError as err: + if isinstance(err, self._UNKNOWN_OPTION): + self.largs.append(err.opt_str) + elif strict: + if isinstance(err, self._BAD_OPTION): + self.error(str(err)) + raise + return self.check_values(self.values, self.largs) + + def error(self, msg): + msg = f'{self.get_prog_name()}: error: {str(msg).strip()}\n' + raise optparse.OptParseError(f'{self.get_usage()}\n{msg}' if self.usage else msg) + + def _get_args(self, args): + return sys.argv[1:] if args is None else list(args) + + def _match_long_opt(self, opt): + """Improve ambiguous argument resolution by comparing option objects instead of argument strings""" + try: + return super()._match_long_opt(opt) + except optparse.AmbiguousOptionError as e: + if len({self._long_opt[p] for p in e.possibilities}) == 1: + return e.possibilities[0] + raise + + +def create_parser(): + def _list_from_options_callback(option, opt_str, value, parser, append=True, delim=',', process=str.strip): + # append can be True, False or -1 (prepend) + current = list(getattr(parser.values, option.dest)) if append else [] + value = list(filter(None, [process(value)] if delim is None else map(process, value.split(delim)))) + setattr( + parser.values, option.dest, + current + value if append is True else value + current) + + def _set_from_options_callback( + option, opt_str, value, parser, allowed_values, delim=',', aliases={}, + process=lambda x: x.lower().strip()): + values = [process(value)] if delim is None else map(process, value.split(delim)) + try: + requested = orderedSet_from_options(values, collections.ChainMap(aliases, {'all': allowed_values}), + start=getattr(parser.values, option.dest)) + except ValueError as e: + raise optparse.OptionValueError(f'wrong {option.metavar} for {opt_str}: {e.args[0]}') + + setattr(parser.values, option.dest, set(requested)) + + def _dict_from_options_callback( + option, opt_str, value, parser, + allowed_keys=r'[\w-]+', delimiter=':', default_key=None, process=None, multiple_keys=True, + process_key=str.lower, append=False): + + out_dict = dict(getattr(parser.values, option.dest)) + multiple_args = not isinstance(value, str) + if multiple_keys: + allowed_keys = fr'({allowed_keys})(,({allowed_keys}))*' + mobj = re.match( + fr'(?is)(?P<keys>{allowed_keys}){delimiter}(?P<val>.*)$', + value[0] if multiple_args else value) + if mobj is not None: + keys, val = mobj.group('keys').split(','), mobj.group('val') + if multiple_args: + val = [val, *value[1:]] + elif default_key is not None: + keys, val = variadic(default_key), value + else: + raise optparse.OptionValueError( + f'wrong {opt_str} formatting; it should be {option.metavar}, not "{value}"') + try: + keys = map(process_key, keys) if process_key else keys + val = process(val) if process else val + except Exception as err: + raise optparse.OptionValueError(f'wrong {opt_str} formatting; {err}') + for key in keys: + out_dict[key] = out_dict.get(key, []) + [val] if append else val + setattr(parser.values, option.dest, out_dict) + + def when_prefix(default): + return { + 'default': {}, + 'type': 'str', + 'action': 'callback', + 'callback': _dict_from_options_callback, + 'callback_kwargs': { + 'allowed_keys': '|'.join(map(re.escape, POSTPROCESS_WHEN)), + 'default_key': default, + 'multiple_keys': False, + 'append': True, + }, + } + + parser = _YoutubeDLOptionParser() + alias_group = optparse.OptionGroup(parser, 'Aliases') + Formatter = string.Formatter() + + def _create_alias(option, opt_str, value, parser): + aliases, opts = value + try: + nargs = len({i if f == '' else f + for i, (_, f, _, _) in enumerate(Formatter.parse(opts)) if f is not None}) + opts.format(*map(str, range(nargs))) # validate + except Exception as err: + raise optparse.OptionValueError(f'wrong {opt_str} OPTIONS formatting; {err}') + if alias_group not in parser.option_groups: + parser.add_option_group(alias_group) + + aliases = (x if x.startswith('-') else f'--{x}' for x in map(str.strip, aliases.split(','))) + try: + args = [f'ARG{i}' for i in range(nargs)] + alias_group.add_option( + *aliases, nargs=nargs, dest=parser.ALIAS_DEST, type='str' if nargs else None, + metavar=' '.join(args), help=opts.format(*args), action='callback', + callback=_alias_callback, callback_kwargs={'opts': opts, 'nargs': nargs}) + except Exception as err: + raise optparse.OptionValueError(f'wrong {opt_str} formatting; {err}') + + def _alias_callback(option, opt_str, value, parser, opts, nargs): + counter = getattr(parser.values, option.dest) + counter[opt_str] += 1 + if counter[opt_str] > parser.ALIAS_TRIGGER_LIMIT: + raise optparse.OptionValueError(f'Alias {opt_str} exceeded invocation limit') + if nargs == 1: + value = [value] + assert (nargs == 0 and value is None) or len(value) == nargs + parser.rargs[:0] = shlex.split( + opts if value is None else opts.format(*map(shlex.quote, value))) + + general = optparse.OptionGroup(parser, 'General Options') + general.add_option( + '-h', '--help', dest='print_help', action='store_true', + help='Print this help text and exit') + general.add_option( + '--version', + action='version', + help='Print program version and exit') + general.add_option( + '-U', '--update', + action='store_const', dest='update_self', const=CHANNEL, + help=format_field( + is_non_updateable(), None, 'Check if updates are available. %s', + default=f'Update this program to the latest {CHANNEL} version')) + general.add_option( + '--no-update', + action='store_false', dest='update_self', + help='Do not check for updates (default)') + general.add_option( + '--update-to', + action='store', dest='update_self', metavar='[CHANNEL]@[TAG]', + help=( + 'Upgrade/downgrade to a specific version. CHANNEL can be a repository as well. ' + f'CHANNEL and TAG default to "{CHANNEL.partition("@")[0]}" and "latest" respectively if omitted; ' + f'See "UPDATE" for details. Supported channels: {", ".join(UPDATE_SOURCES)}')) + general.add_option( + '-i', '--ignore-errors', + action='store_true', dest='ignoreerrors', + help='Ignore download and postprocessing errors. The download will be considered successful even if the postprocessing fails') + general.add_option( + '--no-abort-on-error', + action='store_const', dest='ignoreerrors', const='only_download', + help='Continue with next video on download errors; e.g. to skip unavailable videos in a playlist (default)') + general.add_option( + '--abort-on-error', '--no-ignore-errors', + action='store_false', dest='ignoreerrors', + help='Abort downloading of further videos if an error occurs (Alias: --no-ignore-errors)') + general.add_option( + '--dump-user-agent', + action='store_true', dest='dump_user_agent', default=False, + help='Display the current user-agent and exit') + general.add_option( + '--list-extractors', + action='store_true', dest='list_extractors', default=False, + help='List all supported extractors and exit') + general.add_option( + '--extractor-descriptions', + action='store_true', dest='list_extractor_descriptions', default=False, + help='Output descriptions of all supported extractors and exit') + general.add_option( + '--use-extractors', '--ies', + action='callback', dest='allowed_extractors', metavar='NAMES', type='str', + default=[], callback=_list_from_options_callback, + help=( + 'Extractor names to use separated by commas. ' + 'You can also use regexes, "all", "default" and "end" (end URL matching); ' + 'e.g. --ies "holodex.*,end,youtube". ' + 'Prefix the name with a "-" to exclude it, e.g. --ies default,-generic. ' + 'Use --list-extractors for a list of extractor names. (Alias: --ies)')) + general.add_option( + '--force-generic-extractor', + action='store_true', dest='force_generic_extractor', default=False, + help=optparse.SUPPRESS_HELP) + general.add_option( + '--default-search', + dest='default_search', metavar='PREFIX', + help=( + 'Use this prefix for unqualified URLs. ' + 'E.g. "gvsearch2:python" downloads two videos from google videos for the search term "python". ' + 'Use the value "auto" to let yt-dlp guess ("auto_warning" to emit a warning when guessing). ' + '"error" just throws an error. The default value "fixup_error" repairs broken URLs, ' + 'but emits an error if this is not possible instead of searching')) + general.add_option( + '--ignore-config', '--no-config', + action='store_true', dest='ignoreconfig', + help=( + 'Don\'t load any more configuration files except those given by --config-locations. ' + 'For backward compatibility, if this option is found inside the system configuration file, the user configuration is not loaded. ' + '(Alias: --no-config)')) + general.add_option( + '--no-config-locations', + action='store_const', dest='config_locations', const=[], + help=( + 'Do not load any custom configuration files (default). When given inside a ' + 'configuration file, ignore all previous --config-locations defined in the current file')) + general.add_option( + '--config-locations', + dest='config_locations', metavar='PATH', action='append', + help=( + 'Location of the main configuration file; either the path to the config or its containing directory ' + '("-" for stdin). Can be used multiple times and inside other configuration files')) + general.add_option( + '--flat-playlist', + action='store_const', dest='extract_flat', const='in_playlist', default=False, + help='Do not extract the videos of a playlist, only list them') + general.add_option( + '--no-flat-playlist', + action='store_false', dest='extract_flat', + help='Fully extract the videos of a playlist (default)') + general.add_option( + '--live-from-start', + action='store_true', dest='live_from_start', + help='Download livestreams from the start. Currently only supported for YouTube (Experimental)') + general.add_option( + '--no-live-from-start', + action='store_false', dest='live_from_start', + help='Download livestreams from the current time (default)') + general.add_option( + '--wait-for-video', + dest='wait_for_video', metavar='MIN[-MAX]', default=None, + help=( + 'Wait for scheduled streams to become available. ' + 'Pass the minimum number of seconds (or range) to wait between retries')) + general.add_option( + '--no-wait-for-video', + dest='wait_for_video', action='store_const', const=None, + help='Do not wait for scheduled streams (default)') + general.add_option( + '--mark-watched', + action='store_true', dest='mark_watched', default=False, + help='Mark videos watched (even with --simulate)') + general.add_option( + '--no-mark-watched', + action='store_false', dest='mark_watched', + help='Do not mark videos watched (default)') + general.add_option( + '--no-colors', '--no-colours', + action='store_const', dest='color', const={ + 'stdout': 'no_color', + 'stderr': 'no_color', + }, + help=optparse.SUPPRESS_HELP) + general.add_option( + '--color', + dest='color', metavar='[STREAM:]POLICY', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': 'stdout|stderr', + 'default_key': ['stdout', 'stderr'], + 'process': str.strip, + }, help=( + 'Whether to emit color codes in output, optionally prefixed by ' + 'the STREAM (stdout or stderr) to apply the setting to. ' + 'Can be one of "always", "auto" (default), "never", or ' + '"no_color" (use non color terminal sequences). ' + 'Can be used multiple times')) + general.add_option( + '--compat-options', + metavar='OPTS', dest='compat_opts', default=set(), type='str', + action='callback', callback=_set_from_options_callback, + callback_kwargs={ + 'allowed_values': { + 'filename', 'filename-sanitization', 'format-sort', 'abort-on-error', 'format-spec', 'no-playlist-metafiles', + 'multistreams', 'no-live-chat', 'playlist-index', 'list-formats', 'no-direct-merge', 'playlist-match-filter', + 'no-attach-info-json', 'embed-thumbnail-atomicparsley', 'no-external-downloader-progress', + 'embed-metadata', 'seperate-video-versions', 'no-clean-infojson', 'no-keep-subs', 'no-certifi', + 'no-youtube-channel-redirect', 'no-youtube-unavailable-videos', 'no-youtube-prefer-utc-upload-date', + }, 'aliases': { + 'youtube-dl': ['all', '-multistreams', '-playlist-match-filter'], + 'youtube-dlc': ['all', '-no-youtube-channel-redirect', '-no-live-chat', '-playlist-match-filter'], + '2021': ['2022', 'no-certifi', 'filename-sanitization', 'no-youtube-prefer-utc-upload-date'], + '2022': ['no-external-downloader-progress', 'playlist-match-filter'], + } + }, help=( + 'Options that can help keep compatibility with youtube-dl or youtube-dlc ' + 'configurations by reverting some of the changes made in yt-dlp. ' + 'See "Differences in default behavior" for details')) + general.add_option( + '--alias', metavar='ALIASES OPTIONS', dest='_', type='str', nargs=2, + action='callback', callback=_create_alias, + help=( + 'Create aliases for an option string. Unless an alias starts with a dash "-", it is prefixed with "--". ' + 'Arguments are parsed according to the Python string formatting mini-language. ' + 'E.g. --alias get-audio,-X "-S=aext:{0},abr -x --audio-format {0}" creates options ' + '"--get-audio" and "-X" that takes an argument (ARG0) and expands to ' + '"-S=aext:ARG0,abr -x --audio-format ARG0". All defined aliases are listed in the --help output. ' + 'Alias options can trigger more aliases; so be careful to avoid defining recursive options. ' + f'As a safety measure, each alias may be triggered a maximum of {_YoutubeDLOptionParser.ALIAS_TRIGGER_LIMIT} times. ' + 'This option can be used multiple times')) + + network = optparse.OptionGroup(parser, 'Network Options') + network.add_option( + '--proxy', dest='proxy', + default=None, metavar='URL', + help=( + 'Use the specified HTTP/HTTPS/SOCKS proxy. To enable SOCKS proxy, specify a proper scheme, ' + 'e.g. socks5://user:pass@127.0.0.1:1080/. Pass in an empty string (--proxy "") for direct connection')) + network.add_option( + '--socket-timeout', + dest='socket_timeout', type=float, default=None, metavar='SECONDS', + help='Time to wait before giving up, in seconds') + network.add_option( + '--source-address', + metavar='IP', dest='source_address', default=None, + help='Client-side IP address to bind to', + ) + network.add_option( + '-4', '--force-ipv4', + action='store_const', const='0.0.0.0', dest='source_address', + help='Make all connections via IPv4', + ) + network.add_option( + '-6', '--force-ipv6', + action='store_const', const='::', dest='source_address', + help='Make all connections via IPv6', + ) + network.add_option( + '--enable-file-urls', action='store_true', + dest='enable_file_urls', default=False, + help='Enable file:// URLs. This is disabled by default for security reasons.' + ) + + geo = optparse.OptionGroup(parser, 'Geo-restriction') + geo.add_option( + '--geo-verification-proxy', + dest='geo_verification_proxy', default=None, metavar='URL', + help=( + 'Use this proxy to verify the IP address for some geo-restricted sites. ' + 'The default proxy specified by --proxy (or none, if the option is not present) is used for the actual downloading')) + geo.add_option( + '--cn-verification-proxy', + dest='cn_verification_proxy', default=None, metavar='URL', + help=optparse.SUPPRESS_HELP) + geo.add_option( + '--xff', metavar='VALUE', + dest='geo_bypass', default='default', + help=( + 'How to fake X-Forwarded-For HTTP header to try bypassing geographic restriction. ' + 'One of "default" (only when known to be useful), "never", ' + 'an IP block in CIDR notation, or a two-letter ISO 3166-2 country code')) + geo.add_option( + '--geo-bypass', + action='store_const', dest='geo_bypass', const='default', + help=optparse.SUPPRESS_HELP) + geo.add_option( + '--no-geo-bypass', + action='store_const', dest='geo_bypass', const='never', + help=optparse.SUPPRESS_HELP) + geo.add_option( + '--geo-bypass-country', metavar='CODE', dest='geo_bypass', + help=optparse.SUPPRESS_HELP) + geo.add_option( + '--geo-bypass-ip-block', metavar='IP_BLOCK', dest='geo_bypass', + help=optparse.SUPPRESS_HELP) + + selection = optparse.OptionGroup(parser, 'Video Selection') + selection.add_option( + '--playlist-start', + dest='playliststart', metavar='NUMBER', default=1, type=int, + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--playlist-end', + dest='playlistend', metavar='NUMBER', default=None, type=int, + help=optparse.SUPPRESS_HELP) + selection.add_option( + '-I', '--playlist-items', + dest='playlist_items', metavar='ITEM_SPEC', default=None, + help=( + 'Comma separated playlist_index of the items to download. ' + 'You can specify a range using "[START]:[STOP][:STEP]". For backward compatibility, START-STOP is also supported. ' + 'Use negative indices to count from the right and negative STEP to download in reverse order. ' + 'E.g. "-I 1:3,7,-5::2" used on a playlist of size 15 will download the items at index 1,2,3,7,11,13,15')) + selection.add_option( + '--match-title', + dest='matchtitle', metavar='REGEX', + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--reject-title', + dest='rejecttitle', metavar='REGEX', + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--min-filesize', + metavar='SIZE', dest='min_filesize', default=None, + help='Abort download if filesize is smaller than SIZE, e.g. 50k or 44.6M') + selection.add_option( + '--max-filesize', + metavar='SIZE', dest='max_filesize', default=None, + help='Abort download if filesize is larger than SIZE, e.g. 50k or 44.6M') + selection.add_option( + '--date', + metavar='DATE', dest='date', default=None, + help=( + 'Download only videos uploaded on this date. ' + 'The date can be "YYYYMMDD" or in the format [now|today|yesterday][-N[day|week|month|year]]. ' + 'E.g. "--date today-2weeks" downloads only videos uploaded on the same day two weeks ago')) + selection.add_option( + '--datebefore', + metavar='DATE', dest='datebefore', default=None, + help=( + 'Download only videos uploaded on or before this date. ' + 'The date formats accepted is the same as --date')) + selection.add_option( + '--dateafter', + metavar='DATE', dest='dateafter', default=None, + help=( + 'Download only videos uploaded on or after this date. ' + 'The date formats accepted is the same as --date')) + selection.add_option( + '--min-views', + metavar='COUNT', dest='min_views', default=None, type=int, + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--max-views', + metavar='COUNT', dest='max_views', default=None, type=int, + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--match-filters', + metavar='FILTER', dest='match_filter', action='append', + help=( + 'Generic video filter. Any "OUTPUT TEMPLATE" field can be compared with a ' + 'number or a string using the operators defined in "Filtering Formats". ' + 'You can also simply specify a field to match if the field is present, ' + 'use "!field" to check if the field is not present, and "&" to check multiple conditions. ' + 'Use a "\\" to escape "&" or quotes if needed. If used multiple times, ' + 'the filter matches if atleast one of the conditions are met. E.g. --match-filter ' + '!is_live --match-filter "like_count>?100 & description~=\'(?i)\\bcats \\& dogs\\b\'" ' + 'matches only videos that are not live OR those that have a like count more than 100 ' + '(or the like field is not available) and also has a description ' + 'that contains the phrase "cats & dogs" (caseless). ' + 'Use "--match-filter -" to interactively ask whether to download each video')) + selection.add_option( + '--no-match-filters', + dest='match_filter', action='store_const', const=None, + help='Do not use any --match-filter (default)') + selection.add_option( + '--break-match-filters', + metavar='FILTER', dest='breaking_match_filter', action='append', + help='Same as "--match-filters" but stops the download process when a video is rejected') + selection.add_option( + '--no-break-match-filters', + dest='breaking_match_filter', action='store_const', const=None, + help='Do not use any --break-match-filters (default)') + selection.add_option( + '--no-playlist', + action='store_true', dest='noplaylist', default=False, + help='Download only the video, if the URL refers to a video and a playlist') + selection.add_option( + '--yes-playlist', + action='store_false', dest='noplaylist', + help='Download the playlist, if the URL refers to a video and a playlist') + selection.add_option( + '--age-limit', + metavar='YEARS', dest='age_limit', default=None, type=int, + help='Download only videos suitable for the given age') + selection.add_option( + '--download-archive', metavar='FILE', + dest='download_archive', + help='Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it') + selection.add_option( + '--no-download-archive', + dest='download_archive', action="store_const", const=None, + help='Do not use archive file (default)') + selection.add_option( + '--max-downloads', + dest='max_downloads', metavar='NUMBER', type=int, default=None, + help='Abort after downloading NUMBER files') + selection.add_option( + '--break-on-existing', + action='store_true', dest='break_on_existing', default=False, + help='Stop the download process when encountering a file that is in the archive') + selection.add_option( + '--break-on-reject', + action='store_true', dest='break_on_reject', default=False, + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--break-per-input', + action='store_true', dest='break_per_url', default=False, + help='Alters --max-downloads, --break-on-existing, --break-match-filter, and autonumber to reset per input URL') + selection.add_option( + '--no-break-per-input', + action='store_false', dest='break_per_url', + help='--break-on-existing and similar options terminates the entire download queue') + selection.add_option( + '--skip-playlist-after-errors', metavar='N', + dest='skip_playlist_after_errors', default=None, type=int, + help='Number of allowed failures until the rest of the playlist is skipped') + selection.add_option( + '--include-ads', + dest='include_ads', action='store_true', + help=optparse.SUPPRESS_HELP) + selection.add_option( + '--no-include-ads', + dest='include_ads', action='store_false', + help=optparse.SUPPRESS_HELP) + + authentication = optparse.OptionGroup(parser, 'Authentication Options') + authentication.add_option( + '-u', '--username', + dest='username', metavar='USERNAME', + help='Login with this account ID') + authentication.add_option( + '-p', '--password', + dest='password', metavar='PASSWORD', + help='Account password. If this option is left out, yt-dlp will ask interactively') + authentication.add_option( + '-2', '--twofactor', + dest='twofactor', metavar='TWOFACTOR', + help='Two-factor authentication code') + authentication.add_option( + '-n', '--netrc', + action='store_true', dest='usenetrc', default=False, + help='Use .netrc authentication data') + authentication.add_option( + '--netrc-location', + dest='netrc_location', metavar='PATH', + help='Location of .netrc authentication data; either the path or its containing directory. Defaults to ~/.netrc') + authentication.add_option( + '--netrc-cmd', + dest='netrc_cmd', metavar='NETRC_CMD', + help='Command to execute to get the credentials for an extractor.') + authentication.add_option( + '--video-password', + dest='videopassword', metavar='PASSWORD', + help='Video-specific password') + authentication.add_option( + '--ap-mso', + dest='ap_mso', metavar='MSO', + help='Adobe Pass multiple-system operator (TV provider) identifier, use --ap-list-mso for a list of available MSOs') + authentication.add_option( + '--ap-username', + dest='ap_username', metavar='USERNAME', + help='Multiple-system operator account login') + authentication.add_option( + '--ap-password', + dest='ap_password', metavar='PASSWORD', + help='Multiple-system operator account password. If this option is left out, yt-dlp will ask interactively') + authentication.add_option( + '--ap-list-mso', + action='store_true', dest='ap_list_mso', default=False, + help='List all supported multiple-system operators') + authentication.add_option( + '--client-certificate', + dest='client_certificate', metavar='CERTFILE', + help='Path to client certificate file in PEM format. May include the private key') + authentication.add_option( + '--client-certificate-key', + dest='client_certificate_key', metavar='KEYFILE', + help='Path to private key file for client certificate') + authentication.add_option( + '--client-certificate-password', + dest='client_certificate_password', metavar='PASSWORD', + help='Password for client certificate private key, if encrypted. ' + 'If not provided, and the key is encrypted, yt-dlp will ask interactively') + + video_format = optparse.OptionGroup(parser, 'Video Format Options') + video_format.add_option( + '-f', '--format', + action='store', dest='format', metavar='FORMAT', default=None, + help='Video format code, see "FORMAT SELECTION" for more details') + video_format.add_option( + '-S', '--format-sort', metavar='SORTORDER', + dest='format_sort', default=[], type='str', action='callback', + callback=_list_from_options_callback, callback_kwargs={'append': -1}, + help='Sort the formats by the fields given, see "Sorting Formats" for more details') + video_format.add_option( + '--format-sort-force', '--S-force', + action='store_true', dest='format_sort_force', metavar='FORMAT', default=False, + help=( + 'Force user specified sort order to have precedence over all fields, ' + 'see "Sorting Formats" for more details (Alias: --S-force)')) + video_format.add_option( + '--no-format-sort-force', + action='store_false', dest='format_sort_force', metavar='FORMAT', default=False, + help='Some fields have precedence over the user specified sort order (default)') + video_format.add_option( + '--video-multistreams', + action='store_true', dest='allow_multiple_video_streams', default=None, + help='Allow multiple video streams to be merged into a single file') + video_format.add_option( + '--no-video-multistreams', + action='store_false', dest='allow_multiple_video_streams', + help='Only one video stream is downloaded for each output file (default)') + video_format.add_option( + '--audio-multistreams', + action='store_true', dest='allow_multiple_audio_streams', default=None, + help='Allow multiple audio streams to be merged into a single file') + video_format.add_option( + '--no-audio-multistreams', + action='store_false', dest='allow_multiple_audio_streams', + help='Only one audio stream is downloaded for each output file (default)') + video_format.add_option( + '--all-formats', + action='store_const', dest='format', const='all', + help=optparse.SUPPRESS_HELP) + video_format.add_option( + '--prefer-free-formats', + action='store_true', dest='prefer_free_formats', default=False, + help=( + 'Prefer video formats with free containers over non-free ones of same quality. ' + 'Use with "-S ext" to strictly prefer free containers irrespective of quality')) + video_format.add_option( + '--no-prefer-free-formats', + action='store_false', dest='prefer_free_formats', default=False, + help="Don't give any special preference to free containers (default)") + video_format.add_option( + '--check-formats', + action='store_const', const='selected', dest='check_formats', default=None, + help='Make sure formats are selected only from those that are actually downloadable') + video_format.add_option( + '--check-all-formats', + action='store_true', dest='check_formats', + help='Check all formats for whether they are actually downloadable') + video_format.add_option( + '--no-check-formats', + action='store_false', dest='check_formats', + help='Do not check that the formats are actually downloadable') + video_format.add_option( + '-F', '--list-formats', + action='store_true', dest='listformats', + help='List available formats of each video. Simulate unless --no-simulate is used') + video_format.add_option( + '--list-formats-as-table', + action='store_true', dest='listformats_table', default=True, + help=optparse.SUPPRESS_HELP) + video_format.add_option( + '--list-formats-old', '--no-list-formats-as-table', + action='store_false', dest='listformats_table', + help=optparse.SUPPRESS_HELP) + video_format.add_option( + '--merge-output-format', + action='store', dest='merge_output_format', metavar='FORMAT', default=None, + help=( + 'Containers that may be used when merging formats, separated by "/", e.g. "mp4/mkv". ' + 'Ignored if no merge is required. ' + f'(currently supported: {", ".join(sorted(FFmpegMergerPP.SUPPORTED_EXTS))})')) + video_format.add_option( + '--allow-unplayable-formats', + action='store_true', dest='allow_unplayable_formats', default=False, + help=optparse.SUPPRESS_HELP) + video_format.add_option( + '--no-allow-unplayable-formats', + action='store_false', dest='allow_unplayable_formats', + help=optparse.SUPPRESS_HELP) + + subtitles = optparse.OptionGroup(parser, 'Subtitle Options') + subtitles.add_option( + '--write-subs', '--write-srt', + action='store_true', dest='writesubtitles', default=False, + help='Write subtitle file') + subtitles.add_option( + '--no-write-subs', '--no-write-srt', + action='store_false', dest='writesubtitles', + help='Do not write subtitle file (default)') + subtitles.add_option( + '--write-auto-subs', '--write-automatic-subs', + action='store_true', dest='writeautomaticsub', default=False, + help='Write automatically generated subtitle file (Alias: --write-automatic-subs)') + subtitles.add_option( + '--no-write-auto-subs', '--no-write-automatic-subs', + action='store_false', dest='writeautomaticsub', default=False, + help='Do not write auto-generated subtitles (default) (Alias: --no-write-automatic-subs)') + subtitles.add_option( + '--all-subs', + action='store_true', dest='allsubtitles', default=False, + help=optparse.SUPPRESS_HELP) + subtitles.add_option( + '--list-subs', + action='store_true', dest='listsubtitles', default=False, + help='List available subtitles of each video. Simulate unless --no-simulate is used') + subtitles.add_option( + '--sub-format', + action='store', dest='subtitlesformat', metavar='FORMAT', default='best', + help='Subtitle format; accepts formats preference, e.g. "srt" or "ass/srt/best"') + subtitles.add_option( + '--sub-langs', '--srt-langs', + action='callback', dest='subtitleslangs', metavar='LANGS', type='str', + default=[], callback=_list_from_options_callback, + help=( + 'Languages of the subtitles to download (can be regex) or "all" separated by commas, e.g. --sub-langs "en.*,ja". ' + 'You can prefix the language code with a "-" to exclude it from the requested languages, e.g. --sub-langs all,-live_chat. ' + 'Use --list-subs for a list of available language tags')) + + downloader = optparse.OptionGroup(parser, 'Download Options') + downloader.add_option( + '-N', '--concurrent-fragments', + dest='concurrent_fragment_downloads', metavar='N', default=1, type=int, + help='Number of fragments of a dash/hlsnative video that should be downloaded concurrently (default is %default)') + downloader.add_option( + '-r', '--limit-rate', '--rate-limit', + dest='ratelimit', metavar='RATE', + help='Maximum download rate in bytes per second, e.g. 50K or 4.2M') + downloader.add_option( + '--throttled-rate', + dest='throttledratelimit', metavar='RATE', + help='Minimum download rate in bytes per second below which throttling is assumed and the video data is re-extracted, e.g. 100K') + downloader.add_option( + '-R', '--retries', + dest='retries', metavar='RETRIES', default=10, + help='Number of retries (default is %default), or "infinite"') + downloader.add_option( + '--file-access-retries', + dest='file_access_retries', metavar='RETRIES', default=3, + help='Number of times to retry on file access error (default is %default), or "infinite"') + downloader.add_option( + '--fragment-retries', + dest='fragment_retries', metavar='RETRIES', default=10, + help='Number of retries for a fragment (default is %default), or "infinite" (DASH, hlsnative and ISM)') + downloader.add_option( + '--retry-sleep', + dest='retry_sleep', metavar='[TYPE:]EXPR', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': 'http|fragment|file_access|extractor', + 'default_key': 'http', + }, help=( + 'Time to sleep between retries in seconds (optionally) prefixed by the type of retry ' + '(http (default), fragment, file_access, extractor) to apply the sleep to. ' + 'EXPR can be a number, linear=START[:END[:STEP=1]] or exp=START[:END[:BASE=2]]. ' + 'This option can be used multiple times to set the sleep for the different retry types, ' + 'e.g. --retry-sleep linear=1::2 --retry-sleep fragment:exp=1:20')) + downloader.add_option( + '--skip-unavailable-fragments', '--no-abort-on-unavailable-fragments', + action='store_true', dest='skip_unavailable_fragments', default=True, + help='Skip unavailable fragments for DASH, hlsnative and ISM downloads (default) (Alias: --no-abort-on-unavailable-fragments)') + downloader.add_option( + '--abort-on-unavailable-fragments', '--no-skip-unavailable-fragments', + action='store_false', dest='skip_unavailable_fragments', + help='Abort download if a fragment is unavailable (Alias: --no-skip-unavailable-fragments)') + downloader.add_option( + '--keep-fragments', + action='store_true', dest='keep_fragments', default=False, + help='Keep downloaded fragments on disk after downloading is finished') + downloader.add_option( + '--no-keep-fragments', + action='store_false', dest='keep_fragments', + help='Delete downloaded fragments after downloading is finished (default)') + downloader.add_option( + '--buffer-size', + dest='buffersize', metavar='SIZE', default='1024', + help='Size of download buffer, e.g. 1024 or 16K (default is %default)') + downloader.add_option( + '--resize-buffer', + action='store_false', dest='noresizebuffer', + help='The buffer size is automatically resized from an initial value of --buffer-size (default)') + downloader.add_option( + '--no-resize-buffer', + action='store_true', dest='noresizebuffer', default=False, + help='Do not automatically adjust the buffer size') + downloader.add_option( + '--http-chunk-size', + dest='http_chunk_size', metavar='SIZE', default=None, + help=( + 'Size of a chunk for chunk-based HTTP downloading, e.g. 10485760 or 10M (default is disabled). ' + 'May be useful for bypassing bandwidth throttling imposed by a webserver (experimental)')) + downloader.add_option( + '--test', + action='store_true', dest='test', default=False, + help=optparse.SUPPRESS_HELP) + downloader.add_option( + '--playlist-reverse', + action='store_true', dest='playlist_reverse', + help=optparse.SUPPRESS_HELP) + downloader.add_option( + '--no-playlist-reverse', + action='store_false', dest='playlist_reverse', + help=optparse.SUPPRESS_HELP) + downloader.add_option( + '--playlist-random', + action='store_true', dest='playlist_random', + help='Download playlist videos in random order') + downloader.add_option( + '--lazy-playlist', + action='store_true', dest='lazy_playlist', + help='Process entries in the playlist as they are received. This disables n_entries, --playlist-random and --playlist-reverse') + downloader.add_option( + '--no-lazy-playlist', + action='store_false', dest='lazy_playlist', + help='Process videos in the playlist only after the entire playlist is parsed (default)') + downloader.add_option( + '--xattr-set-filesize', + dest='xattr_set_filesize', action='store_true', + help='Set file xattribute ytdl.filesize with expected file size') + downloader.add_option( + '--hls-prefer-native', + dest='hls_prefer_native', action='store_true', default=None, + help=optparse.SUPPRESS_HELP) + downloader.add_option( + '--hls-prefer-ffmpeg', + dest='hls_prefer_native', action='store_false', default=None, + help=optparse.SUPPRESS_HELP) + downloader.add_option( + '--hls-use-mpegts', + dest='hls_use_mpegts', action='store_true', default=None, + help=( + 'Use the mpegts container for HLS videos; ' + 'allowing some players to play the video while downloading, ' + 'and reducing the chance of file corruption if download is interrupted. ' + 'This is enabled by default for live streams')) + downloader.add_option( + '--no-hls-use-mpegts', + dest='hls_use_mpegts', action='store_false', + help=( + 'Do not use the mpegts container for HLS videos. ' + 'This is default when not downloading live streams')) + downloader.add_option( + '--download-sections', + metavar='REGEX', dest='download_ranges', action='append', + help=( + 'Download only chapters that match the regular expression. ' + 'A "*" prefix denotes time-range instead of chapter. Negative timestamps are calculated from the end. ' + '"*from-url" can be used to download between the "start_time" and "end_time" extracted from the URL. ' + 'Needs ffmpeg. This option can be used multiple times to download multiple sections, ' + 'e.g. --download-sections "*10:15-inf" --download-sections "intro"')) + downloader.add_option( + '--downloader', '--external-downloader', + dest='external_downloader', metavar='[PROTO:]NAME', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': 'http|ftp|m3u8|dash|rtsp|rtmp|mms', + 'default_key': 'default', + 'process': str.strip + }, help=( + 'Name or path of the external downloader to use (optionally) prefixed by ' + 'the protocols (http, ftp, m3u8, dash, rstp, rtmp, mms) to use it for. ' + f'Currently supports native, {", ".join(sorted(list_external_downloaders()))}. ' + 'You can use this option multiple times to set different downloaders for different protocols. ' + 'E.g. --downloader aria2c --downloader "dash,m3u8:native" will use ' + 'aria2c for http/ftp downloads, and the native downloader for dash/m3u8 downloads ' + '(Alias: --external-downloader)')) + downloader.add_option( + '--downloader-args', '--external-downloader-args', + metavar='NAME:ARGS', dest='external_downloader_args', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': r'ffmpeg_[io]\d*|%s' % '|'.join(map(re.escape, list_external_downloaders())), + 'default_key': 'default', + 'process': shlex.split + }, help=( + 'Give these arguments to the external downloader. ' + 'Specify the downloader name and the arguments separated by a colon ":". ' + 'For ffmpeg, arguments can be passed to different positions using the same syntax as --postprocessor-args. ' + 'You can use this option multiple times to give different arguments to different downloaders ' + '(Alias: --external-downloader-args)')) + + workarounds = optparse.OptionGroup(parser, 'Workarounds') + workarounds.add_option( + '--encoding', + dest='encoding', metavar='ENCODING', + help='Force the specified encoding (experimental)') + workarounds.add_option( + '--legacy-server-connect', + action='store_true', dest='legacy_server_connect', default=False, + help='Explicitly allow HTTPS connection to servers that do not support RFC 5746 secure renegotiation') + workarounds.add_option( + '--no-check-certificates', + action='store_true', dest='no_check_certificate', default=False, + help='Suppress HTTPS certificate validation') + workarounds.add_option( + '--prefer-insecure', '--prefer-unsecure', + action='store_true', dest='prefer_insecure', + help='Use an unencrypted connection to retrieve information about the video (Currently supported only for YouTube)') + workarounds.add_option( + '--user-agent', + metavar='UA', dest='user_agent', + help=optparse.SUPPRESS_HELP) + workarounds.add_option( + '--referer', + metavar='URL', dest='referer', default=None, + help=optparse.SUPPRESS_HELP) + workarounds.add_option( + '--add-headers', + metavar='FIELD:VALUE', dest='headers', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={'multiple_keys': False}, + help='Specify a custom HTTP header and its value, separated by a colon ":". You can use this option multiple times', + ) + workarounds.add_option( + '--bidi-workaround', + dest='bidi_workaround', action='store_true', + help='Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH') + workarounds.add_option( + '--sleep-requests', metavar='SECONDS', + dest='sleep_interval_requests', type=float, + help='Number of seconds to sleep between requests during data extraction') + workarounds.add_option( + '--sleep-interval', '--min-sleep-interval', metavar='SECONDS', + dest='sleep_interval', type=float, + help=( + 'Number of seconds to sleep before each download. ' + 'This is the minimum time to sleep when used along with --max-sleep-interval ' + '(Alias: --min-sleep-interval)')) + workarounds.add_option( + '--max-sleep-interval', metavar='SECONDS', + dest='max_sleep_interval', type=float, + help='Maximum number of seconds to sleep. Can only be used along with --min-sleep-interval') + workarounds.add_option( + '--sleep-subtitles', metavar='SECONDS', + dest='sleep_interval_subtitles', default=0, type=int, + help='Number of seconds to sleep before each subtitle download') + + verbosity = optparse.OptionGroup(parser, 'Verbosity and Simulation Options') + verbosity.add_option( + '-q', '--quiet', + action='store_true', dest='quiet', default=None, + help='Activate quiet mode. If used with --verbose, print the log to stderr') + verbosity.add_option( + '--no-quiet', + action='store_false', dest='quiet', + help='Deactivate quiet mode. (Default)') + verbosity.add_option( + '--no-warnings', + dest='no_warnings', action='store_true', default=False, + help='Ignore warnings') + verbosity.add_option( + '-s', '--simulate', + action='store_true', dest='simulate', default=None, + help='Do not download the video and do not write anything to disk') + verbosity.add_option( + '--no-simulate', + action='store_false', dest='simulate', + help='Download the video even if printing/listing options are used') + verbosity.add_option( + '--ignore-no-formats-error', + action='store_true', dest='ignore_no_formats_error', default=False, + help=( + 'Ignore "No video formats" error. Useful for extracting metadata ' + 'even if the videos are not actually available for download (experimental)')) + verbosity.add_option( + '--no-ignore-no-formats-error', + action='store_false', dest='ignore_no_formats_error', + help='Throw error when no downloadable video formats are found (default)') + verbosity.add_option( + '--skip-download', '--no-download', + action='store_true', dest='skip_download', default=False, + help='Do not download the video but write all related files (Alias: --no-download)') + verbosity.add_option( + '-O', '--print', + metavar='[WHEN:]TEMPLATE', dest='forceprint', **when_prefix('video'), + help=( + 'Field name or output template to print to screen, optionally prefixed with when to print it, separated by a ":". ' + 'Supported values of "WHEN" are the same as that of --use-postprocessor (default: video). ' + 'Implies --quiet. Implies --simulate unless --no-simulate or later stages of WHEN are used. ' + 'This option can be used multiple times')) + verbosity.add_option( + '--print-to-file', + metavar='[WHEN:]TEMPLATE FILE', dest='print_to_file', nargs=2, **when_prefix('video'), + help=( + 'Append given template to the file. The values of WHEN and TEMPLATE are same as that of --print. ' + 'FILE uses the same syntax as the output template. This option can be used multiple times')) + verbosity.add_option( + '-g', '--get-url', + action='store_true', dest='geturl', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '-e', '--get-title', + action='store_true', dest='gettitle', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-id', + action='store_true', dest='getid', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-thumbnail', + action='store_true', dest='getthumbnail', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-description', + action='store_true', dest='getdescription', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-duration', + action='store_true', dest='getduration', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-filename', + action='store_true', dest='getfilename', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--get-format', + action='store_true', dest='getformat', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '-j', '--dump-json', + action='store_true', dest='dumpjson', default=False, + help='Quiet, but print JSON information for each video. Simulate unless --no-simulate is used. See "OUTPUT TEMPLATE" for a description of available keys') + verbosity.add_option( + '-J', '--dump-single-json', + action='store_true', dest='dump_single_json', default=False, + help=( + 'Quiet, but print JSON information for each url or infojson passed. Simulate unless --no-simulate is used. ' + 'If the URL refers to a playlist, the whole playlist information is dumped in a single line')) + verbosity.add_option( + '--print-json', + action='store_true', dest='print_json', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--force-write-archive', '--force-write-download-archive', '--force-download-archive', + action='store_true', dest='force_write_download_archive', default=False, + help=( + 'Force download archive entries to be written as far as no errors occur, ' + 'even if -s or another simulation option is used (Alias: --force-download-archive)')) + verbosity.add_option( + '--newline', + action='store_true', dest='progress_with_newline', default=False, + help='Output progress bar as new lines') + verbosity.add_option( + '--no-progress', + action='store_true', dest='noprogress', default=None, + help='Do not print progress bar') + verbosity.add_option( + '--progress', + action='store_false', dest='noprogress', + help='Show progress bar, even if in quiet mode') + verbosity.add_option( + '--console-title', + action='store_true', dest='consoletitle', default=False, + help='Display progress in console titlebar') + verbosity.add_option( + '--progress-template', + metavar='[TYPES:]TEMPLATE', dest='progress_template', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': '(download|postprocess)(-title)?', + 'default_key': 'download' + }, help=( + 'Template for progress outputs, optionally prefixed with one of "download:" (default), ' + '"download-title:" (the console title), "postprocess:", or "postprocess-title:". ' + 'The video\'s fields are accessible under the "info" key and ' + 'the progress attributes are accessible under "progress" key. E.g. ' + # TODO: Document the fields inside "progress" + '--console-title --progress-template "download-title:%(info.id)s-%(progress.eta)s"')) + verbosity.add_option( + '-v', '--verbose', + action='store_true', dest='verbose', default=False, + help='Print various debugging information') + verbosity.add_option( + '--dump-pages', '--dump-intermediate-pages', + action='store_true', dest='dump_intermediate_pages', default=False, + help='Print downloaded pages encoded using base64 to debug problems (very verbose)') + verbosity.add_option( + '--write-pages', + action='store_true', dest='write_pages', default=False, + help='Write downloaded intermediary pages to files in the current directory to debug problems') + verbosity.add_option( + '--load-pages', + action='store_true', dest='load_pages', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--youtube-print-sig-code', + action='store_true', dest='youtube_print_sig_code', default=False, + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--print-traffic', '--dump-headers', + dest='debug_printtraffic', action='store_true', default=False, + help='Display sent and read HTTP traffic') + verbosity.add_option( + '-C', '--call-home', + dest='call_home', action='store_true', default=False, + # help='Contact the yt-dlp server for debugging') + help=optparse.SUPPRESS_HELP) + verbosity.add_option( + '--no-call-home', + dest='call_home', action='store_false', + # help='Do not contact the yt-dlp server for debugging (default)') + help=optparse.SUPPRESS_HELP) + + filesystem = optparse.OptionGroup(parser, 'Filesystem Options') + filesystem.add_option( + '-a', '--batch-file', + dest='batchfile', metavar='FILE', + help=( + 'File containing URLs to download ("-" for stdin), one URL per line. ' + 'Lines starting with "#", ";" or "]" are considered as comments and ignored')) + filesystem.add_option( + '--no-batch-file', + dest='batchfile', action='store_const', const=None, + help='Do not read URLs from batch file (default)') + filesystem.add_option( + '--id', default=False, + action='store_true', dest='useid', help=optparse.SUPPRESS_HELP) + filesystem.add_option( + '-P', '--paths', + metavar='[TYPES:]PATH', dest='paths', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': 'home|temp|%s' % '|'.join(map(re.escape, OUTTMPL_TYPES.keys())), + 'default_key': 'home' + }, help=( + 'The paths where the files should be downloaded. ' + 'Specify the type of file and the path separated by a colon ":". ' + 'All the same TYPES as --output are supported. ' + 'Additionally, you can also provide "home" (default) and "temp" paths. ' + 'All intermediary files are first downloaded to the temp path and ' + 'then the final files are moved over to the home path after download is finished. ' + 'This option is ignored if --output is an absolute path')) + filesystem.add_option( + '-o', '--output', + metavar='[TYPES:]TEMPLATE', dest='outtmpl', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': '|'.join(map(re.escape, OUTTMPL_TYPES.keys())), + 'default_key': 'default' + }, help='Output filename template; see "OUTPUT TEMPLATE" for details') + filesystem.add_option( + '--output-na-placeholder', + dest='outtmpl_na_placeholder', metavar='TEXT', default='NA', + help=('Placeholder for unavailable fields in "OUTPUT TEMPLATE" (default: "%default")')) + filesystem.add_option( + '--autonumber-size', + dest='autonumber_size', metavar='NUMBER', type=int, + help=optparse.SUPPRESS_HELP) + filesystem.add_option( + '--autonumber-start', + dest='autonumber_start', metavar='NUMBER', default=1, type=int, + help=optparse.SUPPRESS_HELP) + filesystem.add_option( + '--restrict-filenames', + action='store_true', dest='restrictfilenames', default=False, + help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames') + filesystem.add_option( + '--no-restrict-filenames', + action='store_false', dest='restrictfilenames', + help='Allow Unicode characters, "&" and spaces in filenames (default)') + filesystem.add_option( + '--windows-filenames', + action='store_true', dest='windowsfilenames', default=False, + help='Force filenames to be Windows-compatible') + filesystem.add_option( + '--no-windows-filenames', + action='store_false', dest='windowsfilenames', + help='Make filenames Windows-compatible only if using Windows (default)') + filesystem.add_option( + '--trim-filenames', '--trim-file-names', metavar='LENGTH', + dest='trim_file_name', default=0, type=int, + help='Limit the filename length (excluding extension) to the specified number of characters') + filesystem.add_option( + '-w', '--no-overwrites', + action='store_false', dest='overwrites', default=None, + help='Do not overwrite any files') + filesystem.add_option( + '--force-overwrites', '--yes-overwrites', + action='store_true', dest='overwrites', + help='Overwrite all video and metadata files. This option includes --no-continue') + filesystem.add_option( + '--no-force-overwrites', + action='store_const', dest='overwrites', const=None, + help='Do not overwrite the video, but overwrite related files (default)') + filesystem.add_option( + '-c', '--continue', + action='store_true', dest='continue_dl', default=True, + help='Resume partially downloaded files/fragments (default)') + filesystem.add_option( + '--no-continue', + action='store_false', dest='continue_dl', + help=( + 'Do not resume partially downloaded fragments. ' + 'If the file is not fragmented, restart download of the entire file')) + filesystem.add_option( + '--part', + action='store_false', dest='nopart', default=False, + help='Use .part files instead of writing directly into output file (default)') + filesystem.add_option( + '--no-part', + action='store_true', dest='nopart', + help='Do not use .part files - write directly into output file') + filesystem.add_option( + '--mtime', + action='store_true', dest='updatetime', default=True, + help='Use the Last-modified header to set the file modification time (default)') + filesystem.add_option( + '--no-mtime', + action='store_false', dest='updatetime', + help='Do not use the Last-modified header to set the file modification time') + filesystem.add_option( + '--write-description', + action='store_true', dest='writedescription', default=False, + help='Write video description to a .description file') + filesystem.add_option( + '--no-write-description', + action='store_false', dest='writedescription', + help='Do not write video description (default)') + filesystem.add_option( + '--write-info-json', + action='store_true', dest='writeinfojson', default=None, + help='Write video metadata to a .info.json file (this may contain personal information)') + filesystem.add_option( + '--no-write-info-json', + action='store_false', dest='writeinfojson', + help='Do not write video metadata (default)') + filesystem.add_option( + '--write-annotations', + action='store_true', dest='writeannotations', default=False, + help=optparse.SUPPRESS_HELP) + filesystem.add_option( + '--no-write-annotations', + action='store_false', dest='writeannotations', + help=optparse.SUPPRESS_HELP) + filesystem.add_option( + '--write-playlist-metafiles', + action='store_true', dest='allow_playlist_files', default=None, + help=( + 'Write playlist metadata in addition to the video metadata ' + 'when using --write-info-json, --write-description etc. (default)')) + filesystem.add_option( + '--no-write-playlist-metafiles', + action='store_false', dest='allow_playlist_files', + help='Do not write playlist metadata when using --write-info-json, --write-description etc.') + filesystem.add_option( + '--clean-info-json', '--clean-infojson', + action='store_true', dest='clean_infojson', default=None, + help=( + 'Remove some internal metadata such as filenames from the infojson (default)')) + filesystem.add_option( + '--no-clean-info-json', '--no-clean-infojson', + action='store_false', dest='clean_infojson', + help='Write all fields to the infojson') + filesystem.add_option( + '--write-comments', '--get-comments', + action='store_true', dest='getcomments', default=False, + help=( + 'Retrieve video comments to be placed in the infojson. ' + 'The comments are fetched even without this option if the extraction is known to be quick (Alias: --get-comments)')) + filesystem.add_option( + '--no-write-comments', '--no-get-comments', + action='store_false', dest='getcomments', + help='Do not retrieve video comments unless the extraction is known to be quick (Alias: --no-get-comments)') + filesystem.add_option( + '--load-info-json', '--load-info', + dest='load_info_filename', metavar='FILE', + help='JSON file containing the video information (created with the "--write-info-json" option)') + filesystem.add_option( + '--cookies', + dest='cookiefile', metavar='FILE', + help='Netscape formatted file to read cookies from and dump cookie jar in') + filesystem.add_option( + '--no-cookies', + action='store_const', const=None, dest='cookiefile', metavar='FILE', + help='Do not read/dump cookies from/to file (default)') + filesystem.add_option( + '--cookies-from-browser', + dest='cookiesfrombrowser', metavar='BROWSER[+KEYRING][:PROFILE][::CONTAINER]', + help=( + 'The name of the browser to load cookies from. ' + f'Currently supported browsers are: {", ".join(sorted(SUPPORTED_BROWSERS))}. ' + 'Optionally, the KEYRING used for decrypting Chromium cookies on Linux, ' + 'the name/path of the PROFILE to load cookies from, ' + 'and the CONTAINER name (if Firefox) ("none" for no container) ' + 'can be given with their respective seperators. ' + 'By default, all containers of the most recently accessed profile are used. ' + f'Currently supported keyrings are: {", ".join(map(str.lower, sorted(SUPPORTED_KEYRINGS)))}')) + filesystem.add_option( + '--no-cookies-from-browser', + action='store_const', const=None, dest='cookiesfrombrowser', + help='Do not load cookies from browser (default)') + filesystem.add_option( + '--cache-dir', dest='cachedir', default=None, metavar='DIR', + help=( + 'Location in the filesystem where yt-dlp can store some downloaded information ' + '(such as client ids and signatures) permanently. By default ${XDG_CACHE_HOME}/yt-dlp')) + filesystem.add_option( + '--no-cache-dir', action='store_false', dest='cachedir', + help='Disable filesystem caching') + filesystem.add_option( + '--rm-cache-dir', + action='store_true', dest='rm_cachedir', + help='Delete all filesystem cache files') + + thumbnail = optparse.OptionGroup(parser, 'Thumbnail Options') + thumbnail.add_option( + '--write-thumbnail', + action='callback', dest='writethumbnail', default=False, + # Should override --no-write-thumbnail, but not --write-all-thumbnail + callback=lambda option, _, __, parser: setattr( + parser.values, option.dest, getattr(parser.values, option.dest) or True), + help='Write thumbnail image to disk') + thumbnail.add_option( + '--no-write-thumbnail', + action='store_false', dest='writethumbnail', + help='Do not write thumbnail image to disk (default)') + thumbnail.add_option( + '--write-all-thumbnails', + action='store_const', dest='writethumbnail', const='all', + help='Write all thumbnail image formats to disk') + thumbnail.add_option( + '--list-thumbnails', + action='store_true', dest='list_thumbnails', default=False, + help='List available thumbnails of each video. Simulate unless --no-simulate is used') + + link = optparse.OptionGroup(parser, 'Internet Shortcut Options') + link.add_option( + '--write-link', + action='store_true', dest='writelink', default=False, + help='Write an internet shortcut file, depending on the current platform (.url, .webloc or .desktop). The URL may be cached by the OS') + link.add_option( + '--write-url-link', + action='store_true', dest='writeurllink', default=False, + help='Write a .url Windows internet shortcut. The OS caches the URL based on the file path') + link.add_option( + '--write-webloc-link', + action='store_true', dest='writewebloclink', default=False, + help='Write a .webloc macOS internet shortcut') + link.add_option( + '--write-desktop-link', + action='store_true', dest='writedesktoplink', default=False, + help='Write a .desktop Linux internet shortcut') + + postproc = optparse.OptionGroup(parser, 'Post-Processing Options') + postproc.add_option( + '-x', '--extract-audio', + action='store_true', dest='extractaudio', default=False, + help='Convert video files to audio-only files (requires ffmpeg and ffprobe)') + postproc.add_option( + '--audio-format', metavar='FORMAT', dest='audioformat', default='best', + help=( + 'Format to convert the audio to when -x is used. ' + f'(currently supported: best (default), {", ".join(sorted(FFmpegExtractAudioPP.SUPPORTED_EXTS))}). ' + 'You can specify multiple rules using similar syntax as --remux-video')) + postproc.add_option( + '--audio-quality', metavar='QUALITY', + dest='audioquality', default='5', + help=( + 'Specify ffmpeg audio quality to use when converting the audio with -x. ' + 'Insert a value between 0 (best) and 10 (worst) for VBR or a specific bitrate like 128K (default %default)')) + postproc.add_option( + '--remux-video', + metavar='FORMAT', dest='remuxvideo', default=None, + help=( + 'Remux the video into another container if necessary ' + f'(currently supported: {", ".join(FFmpegVideoRemuxerPP.SUPPORTED_EXTS)}). ' + 'If target container does not support the video/audio codec, remuxing will fail. You can specify multiple rules; ' + 'e.g. "aac>m4a/mov>mp4/mkv" will remux aac to m4a, mov to mp4 and anything else to mkv')) + postproc.add_option( + '--recode-video', + metavar='FORMAT', dest='recodevideo', default=None, + help='Re-encode the video into another format if necessary. The syntax and supported formats are the same as --remux-video') + postproc.add_option( + '--postprocessor-args', '--ppa', + metavar='NAME:ARGS', dest='postprocessor_args', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'allowed_keys': r'\w+(?:\+\w+)?', + 'default_key': 'default-compat', + 'process': shlex.split, + 'multiple_keys': False + }, help=( + 'Give these arguments to the postprocessors. ' + 'Specify the postprocessor/executable name and the arguments separated by a colon ":" ' + 'to give the argument to the specified postprocessor/executable. Supported PP are: ' + 'Merger, ModifyChapters, SplitChapters, ExtractAudio, VideoRemuxer, VideoConvertor, ' + 'Metadata, EmbedSubtitle, EmbedThumbnail, SubtitlesConvertor, ThumbnailsConvertor, ' + 'FixupStretched, FixupM4a, FixupM3u8, FixupTimestamp and FixupDuration. ' + 'The supported executables are: AtomicParsley, FFmpeg and FFprobe. ' + 'You can also specify "PP+EXE:ARGS" to give the arguments to the specified executable ' + 'only when being used by the specified postprocessor. Additionally, for ffmpeg/ffprobe, ' + '"_i"/"_o" can be appended to the prefix optionally followed by a number to pass the argument ' + 'before the specified input/output file, e.g. --ppa "Merger+ffmpeg_i1:-v quiet". ' + 'You can use this option multiple times to give different arguments to different ' + 'postprocessors. (Alias: --ppa)')) + postproc.add_option( + '-k', '--keep-video', + action='store_true', dest='keepvideo', default=False, + help='Keep the intermediate video file on disk after post-processing') + postproc.add_option( + '--no-keep-video', + action='store_false', dest='keepvideo', + help='Delete the intermediate video file after post-processing (default)') + postproc.add_option( + '--post-overwrites', + action='store_false', dest='nopostoverwrites', + help='Overwrite post-processed files (default)') + postproc.add_option( + '--no-post-overwrites', + action='store_true', dest='nopostoverwrites', default=False, + help='Do not overwrite post-processed files') + postproc.add_option( + '--embed-subs', + action='store_true', dest='embedsubtitles', default=False, + help='Embed subtitles in the video (only for mp4, webm and mkv videos)') + postproc.add_option( + '--no-embed-subs', + action='store_false', dest='embedsubtitles', + help='Do not embed subtitles (default)') + postproc.add_option( + '--embed-thumbnail', + action='store_true', dest='embedthumbnail', default=False, + help='Embed thumbnail in the video as cover art') + postproc.add_option( + '--no-embed-thumbnail', + action='store_false', dest='embedthumbnail', + help='Do not embed thumbnail (default)') + postproc.add_option( + '--embed-metadata', '--add-metadata', + action='store_true', dest='addmetadata', default=False, + help=( + 'Embed metadata to the video file. Also embeds chapters/infojson if present ' + 'unless --no-embed-chapters/--no-embed-info-json are used (Alias: --add-metadata)')) + postproc.add_option( + '--no-embed-metadata', '--no-add-metadata', + action='store_false', dest='addmetadata', + help='Do not add metadata to file (default) (Alias: --no-add-metadata)') + postproc.add_option( + '--embed-chapters', '--add-chapters', + action='store_true', dest='addchapters', default=None, + help='Add chapter markers to the video file (Alias: --add-chapters)') + postproc.add_option( + '--no-embed-chapters', '--no-add-chapters', + action='store_false', dest='addchapters', + help='Do not add chapter markers (default) (Alias: --no-add-chapters)') + postproc.add_option( + '--embed-info-json', + action='store_true', dest='embed_infojson', default=None, + help='Embed the infojson as an attachment to mkv/mka video files') + postproc.add_option( + '--no-embed-info-json', + action='store_false', dest='embed_infojson', + help='Do not embed the infojson as an attachment to the video file') + postproc.add_option( + '--metadata-from-title', + metavar='FORMAT', dest='metafromtitle', + help=optparse.SUPPRESS_HELP) + postproc.add_option( + '--parse-metadata', + metavar='[WHEN:]FROM:TO', dest='parse_metadata', **when_prefix('pre_process'), + help=( + 'Parse additional metadata like title/artist from other fields; see "MODIFYING METADATA" for details. ' + 'Supported values of "WHEN" are the same as that of --use-postprocessor (default: pre_process)')) + postproc.add_option( + '--replace-in-metadata', + dest='parse_metadata', metavar='[WHEN:]FIELDS REGEX REPLACE', nargs=3, **when_prefix('pre_process'), + help=( + 'Replace text in a metadata field using the given regex. This option can be used multiple times. ' + 'Supported values of "WHEN" are the same as that of --use-postprocessor (default: pre_process)')) + postproc.add_option( + '--xattrs', '--xattr', + action='store_true', dest='xattrs', default=False, + help='Write metadata to the video file\'s xattrs (using dublin core and xdg standards)') + postproc.add_option( + '--concat-playlist', + metavar='POLICY', dest='concat_playlist', default='multi_video', + choices=('never', 'always', 'multi_video'), + help=( + 'Concatenate videos in a playlist. One of "never", "always", or ' + '"multi_video" (default; only when the videos form a single show). ' + 'All the video files must have same codecs and number of streams to be concatable. ' + 'The "pl_video:" prefix can be used with "--paths" and "--output" to ' + 'set the output filename for the concatenated files. See "OUTPUT TEMPLATE" for details')) + postproc.add_option( + '--fixup', + metavar='POLICY', dest='fixup', default=None, + choices=('never', 'ignore', 'warn', 'detect_or_warn', 'force'), + help=( + 'Automatically correct known faults of the file. ' + 'One of never (do nothing), warn (only emit a warning), ' + 'detect_or_warn (the default; fix file if we can, warn otherwise), ' + 'force (try fixing even if file already exists)')) + postproc.add_option( + '--prefer-avconv', '--no-prefer-ffmpeg', + action='store_false', dest='prefer_ffmpeg', + help=optparse.SUPPRESS_HELP) + postproc.add_option( + '--prefer-ffmpeg', '--no-prefer-avconv', + action='store_true', dest='prefer_ffmpeg', default=True, + help=optparse.SUPPRESS_HELP) + postproc.add_option( + '--ffmpeg-location', '--avconv-location', metavar='PATH', + dest='ffmpeg_location', + help='Location of the ffmpeg binary; either the path to the binary or its containing directory') + postproc.add_option( + '--exec', + metavar='[WHEN:]CMD', dest='exec_cmd', **when_prefix('after_move'), + help=( + 'Execute a command, optionally prefixed with when to execute it, separated by a ":". ' + 'Supported values of "WHEN" are the same as that of --use-postprocessor (default: after_move). ' + 'Same syntax as the output template can be used to pass any field as arguments to the command. ' + 'If no fields are passed, %(filepath,_filename|)q is appended to the end of the command. ' + 'This option can be used multiple times')) + postproc.add_option( + '--no-exec', + action='store_const', dest='exec_cmd', const={}, + help='Remove any previously defined --exec') + postproc.add_option( + '--exec-before-download', metavar='CMD', + action='append', dest='exec_before_dl_cmd', + help=optparse.SUPPRESS_HELP) + postproc.add_option( + '--no-exec-before-download', + action='store_const', dest='exec_before_dl_cmd', const=None, + help=optparse.SUPPRESS_HELP) + postproc.add_option( + '--convert-subs', '--convert-sub', '--convert-subtitles', + metavar='FORMAT', dest='convertsubtitles', default=None, + help=( + 'Convert the subtitles to another format (currently supported: %s) ' + '(Alias: --convert-subtitles)' % ', '.join(sorted(FFmpegSubtitlesConvertorPP.SUPPORTED_EXTS)))) + postproc.add_option( + '--convert-thumbnails', + metavar='FORMAT', dest='convertthumbnails', default=None, + help=( + 'Convert the thumbnails to another format ' + f'(currently supported: {", ".join(sorted(FFmpegThumbnailsConvertorPP.SUPPORTED_EXTS))}). ' + 'You can specify multiple rules using similar syntax as --remux-video')) + postproc.add_option( + '--split-chapters', '--split-tracks', + dest='split_chapters', action='store_true', default=False, + help=( + 'Split video into multiple files based on internal chapters. ' + 'The "chapter:" prefix can be used with "--paths" and "--output" to ' + 'set the output filename for the split files. See "OUTPUT TEMPLATE" for details')) + postproc.add_option( + '--no-split-chapters', '--no-split-tracks', + dest='split_chapters', action='store_false', + help='Do not split video based on chapters (default)') + postproc.add_option( + '--remove-chapters', + metavar='REGEX', dest='remove_chapters', action='append', + help=( + 'Remove chapters whose title matches the given regular expression. ' + 'The syntax is the same as --download-sections. This option can be used multiple times')) + postproc.add_option( + '--no-remove-chapters', dest='remove_chapters', action='store_const', const=None, + help='Do not remove any chapters from the file (default)') + postproc.add_option( + '--force-keyframes-at-cuts', + action='store_true', dest='force_keyframes_at_cuts', default=False, + help=( + 'Force keyframes at cuts when downloading/splitting/removing sections. ' + 'This is slow due to needing a re-encode, but the resulting video may have fewer artifacts around the cuts')) + postproc.add_option( + '--no-force-keyframes-at-cuts', + action='store_false', dest='force_keyframes_at_cuts', + help='Do not force keyframes around the chapters when cutting/splitting (default)') + _postprocessor_opts_parser = lambda key, val='': ( + *(item.split('=', 1) for item in (val.split(';') if val else [])), + ('key', remove_end(key, 'PP'))) + postproc.add_option( + '--use-postprocessor', + metavar='NAME[:ARGS]', dest='add_postprocessors', default=[], type='str', + action='callback', callback=_list_from_options_callback, + callback_kwargs={ + 'delim': None, + 'process': lambda val: dict(_postprocessor_opts_parser(*val.split(':', 1))) + }, help=( + 'The (case sensitive) name of plugin postprocessors to be enabled, ' + 'and (optionally) arguments to be passed to it, separated by a colon ":". ' + 'ARGS are a semicolon ";" delimited list of NAME=VALUE. ' + 'The "when" argument determines when the postprocessor is invoked. ' + 'It can be one of "pre_process" (after video extraction), "after_filter" (after video passes filter), ' + '"video" (after --format; before --print/--output), "before_dl" (before each video download), ' + '"post_process" (after each video download; default), ' + '"after_move" (after moving video file to it\'s final locations), ' + '"after_video" (after downloading and processing all formats of a video), ' + 'or "playlist" (at end of playlist). ' + 'This option can be used multiple times to add different postprocessors')) + + sponsorblock = optparse.OptionGroup(parser, 'SponsorBlock Options', description=( + 'Make chapter entries for, or remove various segments (sponsor, introductions, etc.) ' + 'from downloaded YouTube videos using the SponsorBlock API (https://sponsor.ajay.app)')) + sponsorblock.add_option( + '--sponsorblock-mark', metavar='CATS', + dest='sponsorblock_mark', default=set(), action='callback', type='str', + callback=_set_from_options_callback, callback_kwargs={ + 'allowed_values': SponsorBlockPP.CATEGORIES.keys(), + 'aliases': {'default': ['all']} + }, help=( + 'SponsorBlock categories to create chapters for, separated by commas. ' + f'Available categories are {", ".join(SponsorBlockPP.CATEGORIES.keys())}, all and default (=all). ' + 'You can prefix the category with a "-" to exclude it. See [1] for description of the categories. ' + 'E.g. --sponsorblock-mark all,-preview [1] https://wiki.sponsor.ajay.app/w/Segment_Categories')) + sponsorblock.add_option( + '--sponsorblock-remove', metavar='CATS', + dest='sponsorblock_remove', default=set(), action='callback', type='str', + callback=_set_from_options_callback, callback_kwargs={ + 'allowed_values': set(SponsorBlockPP.CATEGORIES.keys()) - set(SponsorBlockPP.NON_SKIPPABLE_CATEGORIES.keys()), + # Note: From https://wiki.sponsor.ajay.app/w/Types: + # The filler category is very aggressive. + # It is strongly recommended to not use this in a client by default. + 'aliases': {'default': ['all', '-filler']} + }, help=( + 'SponsorBlock categories to be removed from the video file, separated by commas. ' + 'If a category is present in both mark and remove, remove takes precedence. ' + 'The syntax and available categories are the same as for --sponsorblock-mark ' + 'except that "default" refers to "all,-filler" ' + f'and {", ".join(SponsorBlockPP.NON_SKIPPABLE_CATEGORIES.keys())} are not available')) + sponsorblock.add_option( + '--sponsorblock-chapter-title', metavar='TEMPLATE', + default=DEFAULT_SPONSORBLOCK_CHAPTER_TITLE, dest='sponsorblock_chapter_title', + help=( + 'An output template for the title of the SponsorBlock chapters created by --sponsorblock-mark. ' + 'The only available fields are start_time, end_time, category, categories, name, category_names. ' + 'Defaults to "%default"')) + sponsorblock.add_option( + '--no-sponsorblock', default=False, + action='store_true', dest='no_sponsorblock', + help='Disable both --sponsorblock-mark and --sponsorblock-remove') + sponsorblock.add_option( + '--sponsorblock-api', metavar='URL', + default='https://sponsor.ajay.app', dest='sponsorblock_api', + help='SponsorBlock API location, defaults to %default') + + sponsorblock.add_option( + '--sponskrub', + action='store_true', dest='sponskrub', default=False, + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--no-sponskrub', + action='store_false', dest='sponskrub', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--sponskrub-cut', default=False, + action='store_true', dest='sponskrub_cut', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--no-sponskrub-cut', + action='store_false', dest='sponskrub_cut', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--sponskrub-force', default=False, + action='store_true', dest='sponskrub_force', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--no-sponskrub-force', + action='store_true', dest='sponskrub_force', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--sponskrub-location', metavar='PATH', + dest='sponskrub_path', default='', + help=optparse.SUPPRESS_HELP) + sponsorblock.add_option( + '--sponskrub-args', dest='sponskrub_args', metavar='ARGS', + help=optparse.SUPPRESS_HELP) + + extractor = optparse.OptionGroup(parser, 'Extractor Options') + extractor.add_option( + '--extractor-retries', + dest='extractor_retries', metavar='RETRIES', default=3, + help='Number of retries for known extractor errors (default is %default), or "infinite"') + extractor.add_option( + '--allow-dynamic-mpd', '--no-ignore-dynamic-mpd', + action='store_true', dest='dynamic_mpd', default=True, + help='Process dynamic DASH manifests (default) (Alias: --no-ignore-dynamic-mpd)') + extractor.add_option( + '--ignore-dynamic-mpd', '--no-allow-dynamic-mpd', + action='store_false', dest='dynamic_mpd', + help='Do not process dynamic DASH manifests (Alias: --no-allow-dynamic-mpd)') + extractor.add_option( + '--hls-split-discontinuity', + dest='hls_split_discontinuity', action='store_true', default=False, + help='Split HLS playlists to different formats at discontinuities such as ad breaks' + ) + extractor.add_option( + '--no-hls-split-discontinuity', + dest='hls_split_discontinuity', action='store_false', + help='Do not split HLS playlists to different formats at discontinuities such as ad breaks (default)') + _extractor_arg_parser = lambda key, vals='': (key.strip().lower().replace('-', '_'), [ + val.replace(r'\,', ',').strip() for val in re.split(r'(?<!\\),', vals)]) + extractor.add_option( + '--extractor-args', + metavar='IE_KEY:ARGS', dest='extractor_args', default={}, type='str', + action='callback', callback=_dict_from_options_callback, + callback_kwargs={ + 'multiple_keys': False, + 'process': lambda val: dict( + _extractor_arg_parser(*arg.split('=', 1)) for arg in val.split(';')) + }, help=( + 'Pass ARGS arguments to the IE_KEY extractor. See "EXTRACTOR ARGUMENTS" for details. ' + 'You can use this option multiple times to give arguments for different extractors')) + extractor.add_option( + '--youtube-include-dash-manifest', '--no-youtube-skip-dash-manifest', + action='store_true', dest='youtube_include_dash_manifest', default=True, + help=optparse.SUPPRESS_HELP) + extractor.add_option( + '--youtube-skip-dash-manifest', '--no-youtube-include-dash-manifest', + action='store_false', dest='youtube_include_dash_manifest', + help=optparse.SUPPRESS_HELP) + extractor.add_option( + '--youtube-include-hls-manifest', '--no-youtube-skip-hls-manifest', + action='store_true', dest='youtube_include_hls_manifest', default=True, + help=optparse.SUPPRESS_HELP) + extractor.add_option( + '--youtube-skip-hls-manifest', '--no-youtube-include-hls-manifest', + action='store_false', dest='youtube_include_hls_manifest', + help=optparse.SUPPRESS_HELP) + + parser.add_option_group(general) + parser.add_option_group(network) + parser.add_option_group(geo) + parser.add_option_group(selection) + parser.add_option_group(downloader) + parser.add_option_group(filesystem) + parser.add_option_group(thumbnail) + parser.add_option_group(link) + parser.add_option_group(verbosity) + parser.add_option_group(workarounds) + parser.add_option_group(video_format) + parser.add_option_group(subtitles) + parser.add_option_group(authentication) + parser.add_option_group(postproc) + parser.add_option_group(sponsorblock) + parser.add_option_group(extractor) + + return parser + + +def _hide_login_info(opts): + deprecation_warning(f'"{__name__}._hide_login_info" is deprecated and may be removed ' + 'in a future version. Use "yt_dlp.utils.Config.hide_login_info" instead') + return Config.hide_login_info(opts) diff --git a/lib/python3.11/site-packages/yt_dlp/plugins.py b/python/lib/python3.10/site-packages/yt_dlp/plugins.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/plugins.py rename to python/lib/python3.10/site-packages/yt_dlp/plugins.py diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/__init__.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/__init__.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/__init__.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/__init__.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/postprocessor/common.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/common.py new file mode 100644 index 0000000..8cef86c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/common.py @@ -0,0 +1,215 @@ +import functools +import json +import os + +from ..networking import Request +from ..networking.exceptions import HTTPError, network_exceptions +from ..utils import ( + PostProcessingError, + RetryManager, + _configuration_args, + deprecation_warning, + encodeFilename, +) + + +class PostProcessorMetaClass(type): + @staticmethod + def run_wrapper(func): + @functools.wraps(func) + def run(self, info, *args, **kwargs): + info_copy = self._copy_infodict(info) + self._hook_progress({'status': 'started'}, info_copy) + ret = func(self, info, *args, **kwargs) + if ret is not None: + _, info = ret + self._hook_progress({'status': 'finished'}, info_copy) + return ret + return run + + def __new__(cls, name, bases, attrs): + if 'run' in attrs: + attrs['run'] = cls.run_wrapper(attrs['run']) + return type.__new__(cls, name, bases, attrs) + + +class PostProcessor(metaclass=PostProcessorMetaClass): + """Post Processor class. + + PostProcessor objects can be added to downloaders with their + add_post_processor() method. When the downloader has finished a + successful download, it will take its internal chain of PostProcessors + and start calling the run() method on each one of them, first with + an initial argument and then with the returned value of the previous + PostProcessor. + + PostProcessor objects follow a "mutual registration" process similar + to InfoExtractor objects. + + Optionally PostProcessor can use a list of additional command-line arguments + with self._configuration_args. + """ + + _downloader = None + + def __init__(self, downloader=None): + self._progress_hooks = [] + self.add_progress_hook(self.report_progress) + self.set_downloader(downloader) + self.PP_NAME = self.pp_key() + + @classmethod + def pp_key(cls): + name = cls.__name__[:-2] + return name[6:] if name[:6].lower() == 'ffmpeg' else name + + def to_screen(self, text, prefix=True, *args, **kwargs): + if self._downloader: + tag = '[%s] ' % self.PP_NAME if prefix else '' + return self._downloader.to_screen(f'{tag}{text}', *args, **kwargs) + + def report_warning(self, text, *args, **kwargs): + if self._downloader: + return self._downloader.report_warning(text, *args, **kwargs) + + def deprecation_warning(self, msg): + warn = getattr(self._downloader, 'deprecation_warning', deprecation_warning) + return warn(msg, stacklevel=1) + + def deprecated_feature(self, msg): + if self._downloader: + return self._downloader.deprecated_feature(msg) + return deprecation_warning(msg, stacklevel=1) + + def report_error(self, text, *args, **kwargs): + self.deprecation_warning('"yt_dlp.postprocessor.PostProcessor.report_error" is deprecated. ' + 'raise "yt_dlp.utils.PostProcessingError" instead') + if self._downloader: + return self._downloader.report_error(text, *args, **kwargs) + + def write_debug(self, text, *args, **kwargs): + if self._downloader: + return self._downloader.write_debug(text, *args, **kwargs) + + def _delete_downloaded_files(self, *files_to_delete, **kwargs): + if self._downloader: + return self._downloader._delete_downloaded_files(*files_to_delete, **kwargs) + for filename in set(filter(None, files_to_delete)): + os.remove(filename) + + def get_param(self, name, default=None, *args, **kwargs): + if self._downloader: + return self._downloader.params.get(name, default, *args, **kwargs) + return default + + def set_downloader(self, downloader): + """Sets the downloader for this PP.""" + self._downloader = downloader + for ph in getattr(downloader, '_postprocessor_hooks', []): + self.add_progress_hook(ph) + + def _copy_infodict(self, info_dict): + return getattr(self._downloader, '_copy_infodict', dict)(info_dict) + + @staticmethod + def _restrict_to(*, video=True, audio=True, images=True, simulated=True): + allowed = {'video': video, 'audio': audio, 'images': images} + + def decorator(func): + @functools.wraps(func) + def wrapper(self, info): + if not simulated and (self.get_param('simulate') or self.get_param('skip_download')): + return [], info + format_type = ( + 'video' if info.get('vcodec') != 'none' + else 'audio' if info.get('acodec') != 'none' + else 'images') + if allowed[format_type]: + return func(self, info) + else: + self.to_screen('Skipping %s' % format_type) + return [], info + return wrapper + return decorator + + def run(self, information): + """Run the PostProcessor. + + The "information" argument is a dictionary like the ones + composed by InfoExtractors. The only difference is that this + one has an extra field called "filepath" that points to the + downloaded file. + + This method returns a tuple, the first element is a list of the files + that can be deleted, and the second of which is the updated + information. + + In addition, this method may raise a PostProcessingError + exception if post processing fails. + """ + return [], information # by default, keep file and do nothing + + def try_utime(self, path, atime, mtime, errnote='Cannot update utime of file'): + try: + os.utime(encodeFilename(path), (atime, mtime)) + except Exception: + self.report_warning(errnote) + + def _configuration_args(self, exe, *args, **kwargs): + return _configuration_args( + self.pp_key(), self.get_param('postprocessor_args'), exe, *args, **kwargs) + + def _hook_progress(self, status, info_dict): + if not self._progress_hooks: + return + status.update({ + 'info_dict': info_dict, + 'postprocessor': self.pp_key(), + }) + for ph in self._progress_hooks: + ph(status) + + def add_progress_hook(self, ph): + # See YoutubeDl.py (search for postprocessor_hooks) for a description of this interface + self._progress_hooks.append(ph) + + def report_progress(self, s): + s['_default_template'] = '%(postprocessor)s %(status)s' % s + if not self._downloader: + return + + progress_dict = s.copy() + progress_dict.pop('info_dict') + progress_dict = {'info': s['info_dict'], 'progress': progress_dict} + + progress_template = self.get_param('progress_template', {}) + tmpl = progress_template.get('postprocess') + if tmpl: + self._downloader.to_screen( + self._downloader.evaluate_outtmpl(tmpl, progress_dict), quiet=False) + + self._downloader.to_console_title(self._downloader.evaluate_outtmpl( + progress_template.get('postprocess-title') or 'yt-dlp %(progress._default_template)s', + progress_dict)) + + def _retry_download(self, err, count, retries): + # While this is not an extractor, it behaves similar to one and + # so obey extractor_retries and "--retry-sleep extractor" + RetryManager.report_retry(err, count, retries, info=self.to_screen, warn=self.report_warning, + sleep_func=self.get_param('retry_sleep_functions', {}).get('extractor')) + + def _download_json(self, url, *, expected_http_errors=(404,)): + self.write_debug(f'{self.PP_NAME} query: {url}') + for retry in RetryManager(self.get_param('extractor_retries', 3), self._retry_download): + try: + rsp = self._downloader.urlopen(Request(url)) + except network_exceptions as e: + if isinstance(e, HTTPError) and e.status in expected_http_errors: + return None + retry.error = PostProcessingError(f'Unable to communicate with {self.PP_NAME} API: {e}') + continue + return json.loads(rsp.read().decode(rsp.headers.get_param('charset') or 'utf-8')) + + +class AudioConversionError(PostProcessingError): # Deprecated + pass diff --git a/python/lib/python3.10/site-packages/yt_dlp/postprocessor/embedthumbnail.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/embedthumbnail.py new file mode 100644 index 0000000..d7be0b3 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/embedthumbnail.py @@ -0,0 +1,227 @@ +import base64 +import os +import re +import subprocess + +from .common import PostProcessor +from .ffmpeg import FFmpegPostProcessor, FFmpegThumbnailsConvertorPP +from ..compat import imghdr +from ..dependencies import mutagen +from ..utils import ( + Popen, + PostProcessingError, + check_executable, + encodeArgument, + encodeFilename, + error_to_compat_str, + prepend_extension, + shell_quote, +) + +if mutagen: + from mutagen.flac import FLAC, Picture + from mutagen.mp4 import MP4, MP4Cover + from mutagen.oggopus import OggOpus + from mutagen.oggvorbis import OggVorbis + + +class EmbedThumbnailPPError(PostProcessingError): + pass + + +class EmbedThumbnailPP(FFmpegPostProcessor): + + def __init__(self, downloader=None, already_have_thumbnail=False): + FFmpegPostProcessor.__init__(self, downloader) + self._already_have_thumbnail = already_have_thumbnail + + def _get_thumbnail_resolution(self, filename, thumbnail_dict): + def guess(): + width, height = thumbnail_dict.get('width'), thumbnail_dict.get('height') + if width and height: + return width, height + + try: + size_regex = r',\s*(?P<w>\d+)x(?P<h>\d+)\s*[,\[]' + size_result = self.run_ffmpeg(filename, None, ['-hide_banner'], expected_retcodes=(1,)) + mobj = re.search(size_regex, size_result) + if mobj is None: + return guess() + except PostProcessingError as err: + self.report_warning('unable to find the thumbnail resolution; %s' % error_to_compat_str(err)) + return guess() + return int(mobj.group('w')), int(mobj.group('h')) + + def _report_run(self, exe, filename): + self.to_screen(f'{exe}: Adding thumbnail to "{filename}"') + + @PostProcessor._restrict_to(images=False) + def run(self, info): + filename = info['filepath'] + temp_filename = prepend_extension(filename, 'temp') + + if not info.get('thumbnails'): + self.to_screen('There aren\'t any thumbnails to embed') + return [], info + + idx = next((-i for i, t in enumerate(info['thumbnails'][::-1], 1) if t.get('filepath')), None) + if idx is None: + self.to_screen('There are no thumbnails on disk') + return [], info + thumbnail_filename = info['thumbnails'][idx]['filepath'] + if not os.path.exists(encodeFilename(thumbnail_filename)): + self.report_warning('Skipping embedding the thumbnail because the file is missing.') + return [], info + + # Correct extension for WebP file with wrong extension (see #25687, #25717) + convertor = FFmpegThumbnailsConvertorPP(self._downloader) + convertor.fixup_webp(info, idx) + + original_thumbnail = thumbnail_filename = info['thumbnails'][idx]['filepath'] + + # Convert unsupported thumbnail formats (see #25687, #25717) + # PNG is preferred since JPEG is lossy + thumbnail_ext = os.path.splitext(thumbnail_filename)[1][1:] + if info['ext'] not in ('mkv', 'mka') and thumbnail_ext not in ('jpg', 'jpeg', 'png'): + thumbnail_filename = convertor.convert_thumbnail(thumbnail_filename, 'png') + thumbnail_ext = 'png' + + mtime = os.stat(encodeFilename(filename)).st_mtime + + success = True + if info['ext'] == 'mp3': + options = [ + '-c', 'copy', '-map', '0:0', '-map', '1:0', '-write_id3v1', '1', '-id3v2_version', '3', + '-metadata:s:v', 'title="Album cover"', '-metadata:s:v', 'comment=Cover (front)'] + + self._report_run('ffmpeg', filename) + self.run_ffmpeg_multiple_files([filename, thumbnail_filename], temp_filename, options) + + elif info['ext'] in ['mkv', 'mka']: + options = list(self.stream_copy_opts()) + + mimetype = f'image/{thumbnail_ext.replace("jpg", "jpeg")}' + old_stream, new_stream = self.get_stream_number( + filename, ('tags', 'mimetype'), mimetype) + if old_stream is not None: + options.extend(['-map', '-0:%d' % old_stream]) + new_stream -= 1 + options.extend([ + '-attach', self._ffmpeg_filename_argument(thumbnail_filename), + '-metadata:s:%d' % new_stream, 'mimetype=%s' % mimetype, + '-metadata:s:%d' % new_stream, 'filename=cover.%s' % thumbnail_ext]) + + self._report_run('ffmpeg', filename) + self.run_ffmpeg(filename, temp_filename, options) + + elif info['ext'] in ['m4a', 'mp4', 'm4v', 'mov']: + prefer_atomicparsley = 'embed-thumbnail-atomicparsley' in self.get_param('compat_opts', []) + # Method 1: Use mutagen + if not mutagen or prefer_atomicparsley: + success = False + else: + try: + self._report_run('mutagen', filename) + meta = MP4(filename) + # NOTE: the 'covr' atom is a non-standard MPEG-4 atom, + # Apple iTunes 'M4A' files include the 'moov.udta.meta.ilst' atom. + f = {'jpeg': MP4Cover.FORMAT_JPEG, 'png': MP4Cover.FORMAT_PNG}[imghdr.what(thumbnail_filename)] + with open(thumbnail_filename, 'rb') as thumbfile: + thumb_data = thumbfile.read() + meta.tags['covr'] = [MP4Cover(data=thumb_data, imageformat=f)] + meta.save() + temp_filename = filename + except Exception as err: + self.report_warning('unable to embed using mutagen; %s' % error_to_compat_str(err)) + success = False + + # Method 2: Use AtomicParsley + if not success: + success = True + atomicparsley = next(( + # libatomicparsley.so : See https://github.com/xibr/ytdlp-lazy/issues/1 + x for x in ['AtomicParsley', 'atomicparsley', 'libatomicparsley.so'] + if check_executable(x, ['-v'])), None) + if atomicparsley is None: + self.to_screen('Neither mutagen nor AtomicParsley was found. Falling back to ffmpeg') + success = False + else: + if not prefer_atomicparsley: + self.to_screen('mutagen was not found. Falling back to AtomicParsley') + cmd = [encodeFilename(atomicparsley, True), + encodeFilename(filename, True), + encodeArgument('--artwork'), + encodeFilename(thumbnail_filename, True), + encodeArgument('-o'), + encodeFilename(temp_filename, True)] + cmd += [encodeArgument(o) for o in self._configuration_args('AtomicParsley')] + + self._report_run('atomicparsley', filename) + self.write_debug('AtomicParsley command line: %s' % shell_quote(cmd)) + stdout, stderr, returncode = Popen.run(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if returncode: + self.report_warning(f'Unable to embed thumbnails using AtomicParsley; {stderr.strip()}') + # for formats that don't support thumbnails (like 3gp) AtomicParsley + # won't create to the temporary file + if 'No changes' in stdout: + self.report_warning('The file format doesn\'t support embedding a thumbnail') + success = False + + # Method 3: Use ffmpeg+ffprobe + # Thumbnails attached using this method doesn't show up as cover in some cases + # See https://github.com/yt-dlp/yt-dlp/issues/2125, https://github.com/yt-dlp/yt-dlp/issues/411 + if not success: + success = True + try: + options = [*self.stream_copy_opts(), '-map', '1'] + + old_stream, new_stream = self.get_stream_number( + filename, ('disposition', 'attached_pic'), 1) + if old_stream is not None: + options.extend(['-map', '-0:%d' % old_stream]) + new_stream -= 1 + options.extend(['-disposition:%s' % new_stream, 'attached_pic']) + + self._report_run('ffmpeg', filename) + self.run_ffmpeg_multiple_files([filename, thumbnail_filename], temp_filename, options) + except PostProcessingError as err: + success = False + raise EmbedThumbnailPPError(f'Unable to embed using ffprobe & ffmpeg; {err}') + + elif info['ext'] in ['ogg', 'opus', 'flac']: + if not mutagen: + raise EmbedThumbnailPPError('module mutagen was not found. Please install using `python -m pip install mutagen`') + + self._report_run('mutagen', filename) + f = {'opus': OggOpus, 'flac': FLAC, 'ogg': OggVorbis}[info['ext']](filename) + + pic = Picture() + pic.mime = 'image/%s' % imghdr.what(thumbnail_filename) + with open(thumbnail_filename, 'rb') as thumbfile: + pic.data = thumbfile.read() + pic.type = 3 # front cover + res = self._get_thumbnail_resolution(thumbnail_filename, info['thumbnails'][idx]) + if res is not None: + pic.width, pic.height = res + + if info['ext'] == 'flac': + f.add_picture(pic) + else: + # https://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE + f['METADATA_BLOCK_PICTURE'] = base64.b64encode(pic.write()).decode('ascii') + f.save() + temp_filename = filename + + else: + raise EmbedThumbnailPPError('Supported filetypes for thumbnail embedding are: mp3, mkv/mka, ogg/opus/flac, m4a/mp4/m4v/mov') + + if success and temp_filename != filename: + os.replace(temp_filename, filename) + + self.try_utime(filename, mtime, mtime) + converted = original_thumbnail != thumbnail_filename + self._delete_downloaded_files( + thumbnail_filename if converted or not self._already_have_thumbnail else None, + original_thumbnail if converted and not self._already_have_thumbnail else None, + info=info) + return [], info diff --git a/python/lib/python3.10/site-packages/yt_dlp/postprocessor/exec.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/exec.py new file mode 100644 index 0000000..c2e73fb --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/exec.py @@ -0,0 +1,41 @@ +from .common import PostProcessor +from ..compat import compat_shlex_quote +from ..utils import Popen, PostProcessingError, variadic + + +class ExecPP(PostProcessor): + + def __init__(self, downloader, exec_cmd): + PostProcessor.__init__(self, downloader) + self.exec_cmd = variadic(exec_cmd) + + def parse_cmd(self, cmd, info): + tmpl, tmpl_dict = self._downloader.prepare_outtmpl(cmd, info) + if tmpl_dict: # if there are no replacements, tmpl_dict = {} + return self._downloader.escape_outtmpl(tmpl) % tmpl_dict + + filepath = info.get('filepath', info.get('_filename')) + # If video, and no replacements are found, replace {} for backard compatibility + if filepath: + if '{}' not in cmd: + cmd += ' {}' + cmd = cmd.replace('{}', compat_shlex_quote(filepath)) + return cmd + + def run(self, info): + for tmpl in self.exec_cmd: + cmd = self.parse_cmd(tmpl, info) + self.to_screen(f'Executing command: {cmd}') + _, _, return_code = Popen.run(cmd, shell=True) + if return_code != 0: + raise PostProcessingError(f'Command returned error code {return_code}') + return [], info + + +# Deprecated +class ExecAfterDownloadPP(ExecPP): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.deprecation_warning( + 'yt_dlp.postprocessor.ExecAfterDownloadPP is deprecated ' + 'and may be removed in a future version. Use yt_dlp.postprocessor.ExecPP instead') diff --git a/python/lib/python3.10/site-packages/yt_dlp/postprocessor/ffmpeg.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/ffmpeg.py new file mode 100644 index 0000000..323f430 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/ffmpeg.py @@ -0,0 +1,1190 @@ +import collections +import contextvars +import itertools +import json +import os +import re +import subprocess +import time + +from .common import PostProcessor +from ..compat import functools, imghdr +from ..utils import ( + MEDIA_EXTENSIONS, + ISO639Utils, + Popen, + PostProcessingError, + _get_exe_version_output, + deprecation_warning, + detect_exe_version, + determine_ext, + dfxp2srt, + encodeArgument, + encodeFilename, + filter_dict, + float_or_none, + is_outdated_version, + orderedSet, + prepend_extension, + replace_extension, + shell_quote, + traverse_obj, + variadic, + write_json_file, +) + +EXT_TO_OUT_FORMATS = { + 'aac': 'adts', + 'flac': 'flac', + 'm4a': 'ipod', + 'mka': 'matroska', + 'mkv': 'matroska', + 'mpg': 'mpeg', + 'ogv': 'ogg', + 'ts': 'mpegts', + 'wma': 'asf', + 'wmv': 'asf', + 'weba': 'webm', + 'vtt': 'webvtt', +} +ACODECS = { + # name: (ext, encoder, opts) + 'mp3': ('mp3', 'libmp3lame', ()), + 'aac': ('m4a', 'aac', ('-f', 'adts')), + 'm4a': ('m4a', 'aac', ('-bsf:a', 'aac_adtstoasc')), + 'opus': ('opus', 'libopus', ()), + 'vorbis': ('ogg', 'libvorbis', ()), + 'flac': ('flac', 'flac', ()), + 'alac': ('m4a', None, ('-acodec', 'alac')), + 'wav': ('wav', None, ('-f', 'wav')), +} + + +def create_mapping_re(supported): + return re.compile(r'{0}(?:/{0})*$'.format(r'(?:\s*\w+\s*>)?\s*(?:%s)\s*' % '|'.join(supported))) + + +def resolve_mapping(source, mapping): + """ + Get corresponding item from a mapping string like 'A>B/C>D/E' + @returns (target, error_message) + """ + for pair in mapping.lower().split('/'): + kv = pair.split('>', 1) + if len(kv) == 1 or kv[0].strip() == source: + target = kv[-1].strip() + if target == source: + return target, f'already is in target format {source}' + return target, None + return None, f'could not find a mapping for {source}' + + +class FFmpegPostProcessorError(PostProcessingError): + pass + + +class FFmpegPostProcessor(PostProcessor): + _ffmpeg_location = contextvars.ContextVar('ffmpeg_location', default=None) + + def __init__(self, downloader=None): + PostProcessor.__init__(self, downloader) + self._prefer_ffmpeg = self.get_param('prefer_ffmpeg', True) + self._paths = self._determine_executables() + + @staticmethod + def get_versions_and_features(downloader=None): + pp = FFmpegPostProcessor(downloader) + return pp._versions, pp._features + + @staticmethod + def get_versions(downloader=None): + return FFmpegPostProcessor.get_versions_and_features(downloader)[0] + + _ffmpeg_to_avconv = {'ffmpeg': 'avconv', 'ffprobe': 'avprobe'} + + def _determine_executables(self): + programs = [*self._ffmpeg_to_avconv.keys(), *self._ffmpeg_to_avconv.values()] + + location = self.get_param('ffmpeg_location', self._ffmpeg_location.get()) + if location is None: + return {p: p for p in programs} + + if not os.path.exists(location): + self.report_warning( + f'ffmpeg-location {location} does not exist! Continuing without ffmpeg', only_once=True) + return {} + elif os.path.isdir(location): + dirname, basename, filename = location, None, None + else: + filename = os.path.basename(location) + basename = next((p for p in programs if p in filename), 'ffmpeg') + dirname = os.path.dirname(os.path.abspath(location)) + if basename in self._ffmpeg_to_avconv.keys(): + self._prefer_ffmpeg = True + + paths = {p: os.path.join(dirname, p) for p in programs} + if basename and basename in filename: + for p in programs: + path = os.path.join(dirname, filename.replace(basename, p)) + if os.path.exists(path): + paths[p] = path + if basename: + paths[basename] = location + return paths + + _version_cache, _features_cache = {None: None}, {} + + def _get_ffmpeg_version(self, prog): + path = self._paths.get(prog) + if path in self._version_cache: + return self._version_cache[path], self._features_cache.get(path, {}) + out = _get_exe_version_output(path, ['-bsfs']) + ver = detect_exe_version(out) if out else False + if ver: + regexs = [ + r'(?:\d+:)?([0-9.]+)-[0-9]+ubuntu[0-9.]+$', # Ubuntu, see [1] + r'n([0-9.]+)$', # Arch Linux + # 1. http://www.ducea.com/2006/06/17/ubuntu-package-version-naming-explanation/ + ] + for regex in regexs: + mobj = re.match(regex, ver) + if mobj: + ver = mobj.group(1) + self._version_cache[path] = ver + if prog != 'ffmpeg' or not out: + return ver, {} + + mobj = re.search(r'(?m)^\s+libavformat\s+(?:[0-9. ]+)\s+/\s+(?P<runtime>[0-9. ]+)', out) + lavf_runtime_version = mobj.group('runtime').replace(' ', '') if mobj else None + self._features_cache[path] = features = { + 'fdk': '--enable-libfdk-aac' in out, + 'setts': 'setts' in out.splitlines(), + 'needs_adtstoasc': is_outdated_version(lavf_runtime_version, '57.56.100', False), + } + return ver, features + + @property + def _versions(self): + return filter_dict({self.basename: self._version, self.probe_basename: self._probe_version}) + + @functools.cached_property + def basename(self): + self._version # run property + return self.basename + + @functools.cached_property + def probe_basename(self): + self._probe_version # run property + return self.probe_basename + + def _get_version(self, kind): + executables = (kind, ) + if not self._prefer_ffmpeg: + executables = (kind, self._ffmpeg_to_avconv[kind]) + basename, version, features = next(filter( + lambda x: x[1], ((p, *self._get_ffmpeg_version(p)) for p in executables)), (None, None, {})) + if kind == 'ffmpeg': + self.basename, self._features = basename, features + else: + self.probe_basename = basename + if basename == self._ffmpeg_to_avconv[kind]: + self.deprecated_feature(f'Support for {self._ffmpeg_to_avconv[kind]} is deprecated and ' + f'may be removed in a future version. Use {kind} instead') + return version + + @functools.cached_property + def _version(self): + return self._get_version('ffmpeg') + + @functools.cached_property + def _probe_version(self): + return self._get_version('ffprobe') + + @property + def available(self): + return self.basename is not None + + @property + def executable(self): + return self._paths.get(self.basename) + + @property + def probe_available(self): + return self.probe_basename is not None + + @property + def probe_executable(self): + return self._paths.get(self.probe_basename) + + @staticmethod + def stream_copy_opts(copy=True, *, ext=None): + yield from ('-map', '0') + # Don't copy Apple TV chapters track, bin_data + # See https://github.com/yt-dlp/yt-dlp/issues/2, #19042, #19024, https://trac.ffmpeg.org/ticket/6016 + yield from ('-dn', '-ignore_unknown') + if copy: + yield from ('-c', 'copy') + if ext in ('mp4', 'mov', 'm4a'): + yield from ('-c:s', 'mov_text') + + def check_version(self): + if not self.available: + raise FFmpegPostProcessorError('ffmpeg not found. Please install or provide the path using --ffmpeg-location') + + required_version = '10-0' if self.basename == 'avconv' else '1.0' + if is_outdated_version(self._version, required_version): + self.report_warning(f'Your copy of {self.basename} is outdated, update {self.basename} ' + f'to version {required_version} or newer if you encounter any errors') + + def get_audio_codec(self, path): + if not self.probe_available and not self.available: + raise PostProcessingError('ffprobe and ffmpeg not found. Please install or provide the path using --ffmpeg-location') + try: + if self.probe_available: + cmd = [ + encodeFilename(self.probe_executable, True), + encodeArgument('-show_streams')] + else: + cmd = [ + encodeFilename(self.executable, True), + encodeArgument('-i')] + cmd.append(encodeFilename(self._ffmpeg_filename_argument(path), True)) + self.write_debug(f'{self.basename} command line: {shell_quote(cmd)}') + stdout, stderr, returncode = Popen.run( + cmd, text=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if returncode != (0 if self.probe_available else 1): + return None + except OSError: + return None + output = stdout if self.probe_available else stderr + if self.probe_available: + audio_codec = None + for line in output.split('\n'): + if line.startswith('codec_name='): + audio_codec = line.split('=')[1].strip() + elif line.strip() == 'codec_type=audio' and audio_codec is not None: + return audio_codec + else: + # Stream #FILE_INDEX:STREAM_INDEX[STREAM_ID](LANGUAGE): CODEC_TYPE: CODEC_NAME + mobj = re.search( + r'Stream\s*#\d+:\d+(?:\[0x[0-9a-f]+\])?(?:\([a-z]{3}\))?:\s*Audio:\s*([0-9a-z]+)', + output) + if mobj: + return mobj.group(1) + return None + + def get_metadata_object(self, path, opts=[]): + if self.probe_basename != 'ffprobe': + if self.probe_available: + self.report_warning('Only ffprobe is supported for metadata extraction') + raise PostProcessingError('ffprobe not found. Please install or provide the path using --ffmpeg-location') + self.check_version() + + cmd = [ + encodeFilename(self.probe_executable, True), + encodeArgument('-hide_banner'), + encodeArgument('-show_format'), + encodeArgument('-show_streams'), + encodeArgument('-print_format'), + encodeArgument('json'), + ] + + cmd += opts + cmd.append(self._ffmpeg_filename_argument(path)) + self.write_debug(f'ffprobe command line: {shell_quote(cmd)}') + stdout, _, _ = Popen.run(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + return json.loads(stdout) + + def get_stream_number(self, path, keys, value): + streams = self.get_metadata_object(path)['streams'] + num = next( + (i for i, stream in enumerate(streams) if traverse_obj(stream, keys, casesense=False) == value), + None) + return num, len(streams) + + def _fixup_chapters(self, info): + last_chapter = traverse_obj(info, ('chapters', -1)) + if last_chapter and not last_chapter.get('end_time'): + last_chapter['end_time'] = self._get_real_video_duration(info['filepath']) + + def _get_real_video_duration(self, filepath, fatal=True): + try: + duration = float_or_none( + traverse_obj(self.get_metadata_object(filepath), ('format', 'duration'))) + if not duration: + raise PostProcessingError('ffprobe returned empty duration') + return duration + except PostProcessingError as e: + if fatal: + raise PostProcessingError(f'Unable to determine video duration: {e.msg}') + + def _duration_mismatch(self, d1, d2, tolerance=2): + if not d1 or not d2: + return None + # The duration is often only known to nearest second. So there can be <1sec disparity natually. + # Further excuse an additional <1sec difference. + return abs(d1 - d2) > tolerance + + def run_ffmpeg_multiple_files(self, input_paths, out_path, opts, **kwargs): + return self.real_run_ffmpeg( + [(path, []) for path in input_paths], + [(out_path, opts)], **kwargs) + + def real_run_ffmpeg(self, input_path_opts, output_path_opts, *, expected_retcodes=(0,)): + self.check_version() + + oldest_mtime = min( + os.stat(encodeFilename(path)).st_mtime for path, _ in input_path_opts if path) + + cmd = [encodeFilename(self.executable, True), encodeArgument('-y')] + # avconv does not have repeat option + if self.basename == 'ffmpeg': + cmd += [encodeArgument('-loglevel'), encodeArgument('repeat+info')] + + def make_args(file, args, name, number): + keys = ['_%s%d' % (name, number), '_%s' % name] + if name == 'o': + args += ['-movflags', '+faststart'] + if number == 1: + keys.append('') + args += self._configuration_args(self.basename, keys) + if name == 'i': + args.append('-i') + return ( + [encodeArgument(arg) for arg in args] + + [encodeFilename(self._ffmpeg_filename_argument(file), True)]) + + for arg_type, path_opts in (('i', input_path_opts), ('o', output_path_opts)): + cmd += itertools.chain.from_iterable( + make_args(path, list(opts), arg_type, i + 1) + for i, (path, opts) in enumerate(path_opts) if path) + + self.write_debug('ffmpeg command line: %s' % shell_quote(cmd)) + _, stderr, returncode = Popen.run( + cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + if returncode not in variadic(expected_retcodes): + self.write_debug(stderr) + raise FFmpegPostProcessorError(stderr.strip().splitlines()[-1]) + for out_path, _ in output_path_opts: + if out_path: + self.try_utime(out_path, oldest_mtime, oldest_mtime) + return stderr + + def run_ffmpeg(self, path, out_path, opts, **kwargs): + return self.run_ffmpeg_multiple_files([path], out_path, opts, **kwargs) + + @staticmethod + def _ffmpeg_filename_argument(fn): + # Always use 'file:' because the filename may contain ':' (ffmpeg + # interprets that as a protocol) or can start with '-' (-- is broken in + # ffmpeg, see https://ffmpeg.org/trac/ffmpeg/ticket/2127 for details) + # Also leave '-' intact in order not to break streaming to stdout. + if fn.startswith(('http://', 'https://')): + return fn + return 'file:' + fn if fn != '-' else fn + + @staticmethod + def _quote_for_ffmpeg(string): + # See https://ffmpeg.org/ffmpeg-utils.html#toc-Quoting-and-escaping + # A sequence of '' produces '\'''\''; + # final replace removes the empty '' between \' \'. + string = string.replace("'", r"'\''").replace("'''", "'") + # Handle potential ' at string boundaries. + string = string[1:] if string[0] == "'" else "'" + string + return string[:-1] if string[-1] == "'" else string + "'" + + def force_keyframes(self, filename, timestamps): + timestamps = orderedSet(timestamps) + if timestamps[0] == 0: + timestamps = timestamps[1:] + keyframe_file = prepend_extension(filename, 'keyframes.temp') + self.to_screen(f'Re-encoding "{filename}" with appropriate keyframes') + self.run_ffmpeg(filename, keyframe_file, [ + *self.stream_copy_opts(False, ext=determine_ext(filename)), + '-force_key_frames', ','.join(f'{t:.6f}' for t in timestamps)]) + return keyframe_file + + def concat_files(self, in_files, out_file, concat_opts=None): + """ + Use concat demuxer to concatenate multiple files having identical streams. + + Only inpoint, outpoint, and duration concat options are supported. + See https://ffmpeg.org/ffmpeg-formats.html#concat-1 for details + """ + concat_file = f'{out_file}.concat' + self.write_debug(f'Writing concat spec to {concat_file}') + with open(concat_file, 'w', encoding='utf-8') as f: + f.writelines(self._concat_spec(in_files, concat_opts)) + + out_flags = list(self.stream_copy_opts(ext=determine_ext(out_file))) + + self.real_run_ffmpeg( + [(concat_file, ['-hide_banner', '-nostdin', '-f', 'concat', '-safe', '0'])], + [(out_file, out_flags)]) + self._delete_downloaded_files(concat_file) + + @classmethod + def _concat_spec(cls, in_files, concat_opts=None): + if concat_opts is None: + concat_opts = [{}] * len(in_files) + yield 'ffconcat version 1.0\n' + for file, opts in zip(in_files, concat_opts): + yield f'file {cls._quote_for_ffmpeg(cls._ffmpeg_filename_argument(file))}\n' + # Iterate explicitly to yield the following directives in order, ignoring the rest. + for directive in 'inpoint', 'outpoint', 'duration': + if directive in opts: + yield f'{directive} {opts[directive]}\n' + + +class FFmpegExtractAudioPP(FFmpegPostProcessor): + COMMON_AUDIO_EXTS = MEDIA_EXTENSIONS.common_audio + ('wma', ) + SUPPORTED_EXTS = tuple(ACODECS.keys()) + FORMAT_RE = create_mapping_re(('best', *SUPPORTED_EXTS)) + + def __init__(self, downloader=None, preferredcodec=None, preferredquality=None, nopostoverwrites=False): + FFmpegPostProcessor.__init__(self, downloader) + self.mapping = preferredcodec or 'best' + self._preferredquality = float_or_none(preferredquality) + self._nopostoverwrites = nopostoverwrites + + def _quality_args(self, codec): + if self._preferredquality is None: + return [] + elif self._preferredquality > 10: + return ['-b:a', f'{self._preferredquality}k'] + + limits = { + 'libmp3lame': (10, 0), + 'libvorbis': (0, 10), + # FFmpeg's AAC encoder does not have an upper limit for the value of -q:a. + # Experimentally, with values over 4, bitrate changes were minimal or non-existent + 'aac': (0.1, 4), + 'libfdk_aac': (1, 5), + }.get(codec) + if not limits: + return [] + + q = limits[1] + (limits[0] - limits[1]) * (self._preferredquality / 10) + if codec == 'libfdk_aac': + return ['-vbr', f'{int(q)}'] + return ['-q:a', f'{q}'] + + def run_ffmpeg(self, path, out_path, codec, more_opts): + if codec is None: + acodec_opts = [] + else: + acodec_opts = ['-acodec', codec] + opts = ['-vn'] + acodec_opts + more_opts + try: + FFmpegPostProcessor.run_ffmpeg(self, path, out_path, opts) + except FFmpegPostProcessorError as err: + raise PostProcessingError(f'audio conversion failed: {err.msg}') + + @PostProcessor._restrict_to(images=False) + def run(self, information): + orig_path = path = information['filepath'] + target_format, _skip_msg = resolve_mapping(information['ext'], self.mapping) + if target_format == 'best' and information['ext'] in self.COMMON_AUDIO_EXTS: + target_format, _skip_msg = None, 'the file is already in a common audio format' + if not target_format: + self.to_screen(f'Not converting audio {orig_path}; {_skip_msg}') + return [], information + + filecodec = self.get_audio_codec(path) + if filecodec is None: + raise PostProcessingError('WARNING: unable to obtain file audio codec with ffprobe') + + if filecodec == 'aac' and target_format in ('m4a', 'best'): + # Lossless, but in another container + extension, _, more_opts, acodec = *ACODECS['m4a'], 'copy' + elif target_format == 'best' or target_format == filecodec: + # Lossless if possible + try: + extension, _, more_opts, acodec = *ACODECS[filecodec], 'copy' + except KeyError: + extension, acodec, more_opts = ACODECS['mp3'] + else: + # We convert the audio (lossy if codec is lossy) + extension, acodec, more_opts = ACODECS[target_format] + if acodec == 'aac' and self._features.get('fdk'): + acodec, more_opts = 'libfdk_aac', [] + + more_opts = list(more_opts) + if acodec != 'copy': + more_opts = self._quality_args(acodec) + + temp_path = new_path = replace_extension(path, extension, information['ext']) + + if new_path == path: + if acodec == 'copy': + self.to_screen(f'Not converting audio {orig_path}; file is already in target format {target_format}') + return [], information + orig_path = prepend_extension(path, 'orig') + temp_path = prepend_extension(path, 'temp') + if (self._nopostoverwrites and os.path.exists(encodeFilename(new_path)) + and os.path.exists(encodeFilename(orig_path))): + self.to_screen('Post-process file %s exists, skipping' % new_path) + return [], information + + self.to_screen(f'Destination: {new_path}') + self.run_ffmpeg(path, temp_path, acodec, more_opts) + + os.replace(path, orig_path) + os.replace(temp_path, new_path) + information['filepath'] = new_path + information['ext'] = extension + + # Try to update the date time for extracted audio file. + if information.get('filetime') is not None: + self.try_utime( + new_path, time.time(), information['filetime'], errnote='Cannot update utime of audio file') + + return [orig_path], information + + +class FFmpegVideoConvertorPP(FFmpegPostProcessor): + SUPPORTED_EXTS = ( + *sorted((*MEDIA_EXTENSIONS.common_video, 'gif')), + *sorted((*MEDIA_EXTENSIONS.common_audio, 'aac', 'vorbis')), + ) + FORMAT_RE = create_mapping_re(SUPPORTED_EXTS) + _ACTION = 'converting' + + def __init__(self, downloader=None, preferedformat=None): + super().__init__(downloader) + self.mapping = preferedformat + + @staticmethod + def _options(target_ext): + yield from FFmpegPostProcessor.stream_copy_opts(False) + if target_ext == 'avi': + yield from ('-c:v', 'libxvid', '-vtag', 'XVID') + + @PostProcessor._restrict_to(images=False) + def run(self, info): + filename, source_ext = info['filepath'], info['ext'].lower() + target_ext, _skip_msg = resolve_mapping(source_ext, self.mapping) + if _skip_msg: + self.to_screen(f'Not {self._ACTION} media file "{filename}"; {_skip_msg}') + return [], info + + outpath = replace_extension(filename, target_ext, source_ext) + self.to_screen(f'{self._ACTION.title()} video from {source_ext} to {target_ext}; Destination: {outpath}') + self.run_ffmpeg(filename, outpath, self._options(target_ext)) + + info['filepath'] = outpath + info['format'] = info['ext'] = target_ext + return [filename], info + + +class FFmpegVideoRemuxerPP(FFmpegVideoConvertorPP): + _ACTION = 'remuxing' + + @staticmethod + def _options(target_ext): + return FFmpegPostProcessor.stream_copy_opts() + + +class FFmpegEmbedSubtitlePP(FFmpegPostProcessor): + SUPPORTED_EXTS = ('mp4', 'mov', 'm4a', 'webm', 'mkv', 'mka') + + def __init__(self, downloader=None, already_have_subtitle=False): + super().__init__(downloader) + self._already_have_subtitle = already_have_subtitle + + @PostProcessor._restrict_to(images=False) + def run(self, info): + if info['ext'] not in self.SUPPORTED_EXTS: + self.to_screen(f'Subtitles can only be embedded in {", ".join(self.SUPPORTED_EXTS)} files') + return [], info + subtitles = info.get('requested_subtitles') + if not subtitles: + self.to_screen('There aren\'t any subtitles to embed') + return [], info + + filename = info['filepath'] + + # Disabled temporarily. There needs to be a way to override this + # in case of duration actually mismatching in extractor + # See: https://github.com/yt-dlp/yt-dlp/issues/1870, https://github.com/yt-dlp/yt-dlp/issues/1385 + ''' + if info.get('duration') and not info.get('__real_download') and self._duration_mismatch( + self._get_real_video_duration(filename, False), info['duration']): + self.to_screen(f'Skipping {self.pp_key()} since the real and expected durations mismatch') + return [], info + ''' + + ext = info['ext'] + sub_langs, sub_names, sub_filenames = [], [], [] + webm_vtt_warn = False + mp4_ass_warn = False + + for lang, sub_info in subtitles.items(): + if not os.path.exists(sub_info.get('filepath', '')): + self.report_warning(f'Skipping embedding {lang} subtitle because the file is missing') + continue + sub_ext = sub_info['ext'] + if sub_ext == 'json': + self.report_warning('JSON subtitles cannot be embedded') + elif ext != 'webm' or ext == 'webm' and sub_ext == 'vtt': + sub_langs.append(lang) + sub_names.append(sub_info.get('name')) + sub_filenames.append(sub_info['filepath']) + else: + if not webm_vtt_warn and ext == 'webm' and sub_ext != 'vtt': + webm_vtt_warn = True + self.report_warning('Only WebVTT subtitles can be embedded in webm files') + if not mp4_ass_warn and ext == 'mp4' and sub_ext == 'ass': + mp4_ass_warn = True + self.report_warning('ASS subtitles cannot be properly embedded in mp4 files; expect issues') + + if not sub_langs: + return [], info + + input_files = [filename] + sub_filenames + + opts = [ + *self.stream_copy_opts(ext=info['ext']), + # Don't copy the existing subtitles, we may be running the + # postprocessor a second time + '-map', '-0:s', + ] + for i, (lang, name) in enumerate(zip(sub_langs, sub_names)): + opts.extend(['-map', '%d:0' % (i + 1)]) + lang_code = ISO639Utils.short2long(lang) or lang + opts.extend(['-metadata:s:s:%d' % i, 'language=%s' % lang_code]) + if name: + opts.extend(['-metadata:s:s:%d' % i, 'handler_name=%s' % name, + '-metadata:s:s:%d' % i, 'title=%s' % name]) + + temp_filename = prepend_extension(filename, 'temp') + self.to_screen('Embedding subtitles in "%s"' % filename) + self.run_ffmpeg_multiple_files(input_files, temp_filename, opts) + os.replace(temp_filename, filename) + + files_to_delete = [] if self._already_have_subtitle else sub_filenames + return files_to_delete, info + + +class FFmpegMetadataPP(FFmpegPostProcessor): + + def __init__(self, downloader, add_metadata=True, add_chapters=True, add_infojson='if_exists'): + FFmpegPostProcessor.__init__(self, downloader) + self._add_metadata = add_metadata + self._add_chapters = add_chapters + self._add_infojson = add_infojson + + @staticmethod + def _options(target_ext): + audio_only = target_ext == 'm4a' + yield from FFmpegPostProcessor.stream_copy_opts(not audio_only) + if audio_only: + yield from ('-vn', '-acodec', 'copy') + + @PostProcessor._restrict_to(images=False) + def run(self, info): + self._fixup_chapters(info) + filename, metadata_filename = info['filepath'], None + files_to_delete, options = [], [] + if self._add_chapters and info.get('chapters'): + metadata_filename = replace_extension(filename, 'meta') + options.extend(self._get_chapter_opts(info['chapters'], metadata_filename)) + files_to_delete.append(metadata_filename) + if self._add_metadata: + options.extend(self._get_metadata_opts(info)) + + if self._add_infojson: + if info['ext'] in ('mkv', 'mka'): + infojson_filename = info.get('infojson_filename') + options.extend(self._get_infojson_opts(info, infojson_filename)) + if not infojson_filename: + files_to_delete.append(info.get('infojson_filename')) + elif self._add_infojson is True: + self.to_screen('The info-json can only be attached to mkv/mka files') + + if not options: + self.to_screen('There isn\'t any metadata to add') + return [], info + + temp_filename = prepend_extension(filename, 'temp') + self.to_screen('Adding metadata to "%s"' % filename) + self.run_ffmpeg_multiple_files( + (filename, metadata_filename), temp_filename, + itertools.chain(self._options(info['ext']), *options)) + self._delete_downloaded_files(*files_to_delete) + os.replace(temp_filename, filename) + return [], info + + @staticmethod + def _get_chapter_opts(chapters, metadata_filename): + with open(metadata_filename, 'w', encoding='utf-8') as f: + def ffmpeg_escape(text): + return re.sub(r'([\\=;#\n])', r'\\\1', text) + + metadata_file_content = ';FFMETADATA1\n' + for chapter in chapters: + metadata_file_content += '[CHAPTER]\nTIMEBASE=1/1000\n' + metadata_file_content += 'START=%d\n' % (chapter['start_time'] * 1000) + metadata_file_content += 'END=%d\n' % (chapter['end_time'] * 1000) + chapter_title = chapter.get('title') + if chapter_title: + metadata_file_content += 'title=%s\n' % ffmpeg_escape(chapter_title) + f.write(metadata_file_content) + yield ('-map_metadata', '1') + + def _get_metadata_opts(self, info): + meta_prefix = 'meta' + metadata = collections.defaultdict(dict) + + def add(meta_list, info_list=None): + value = next(( + str(info[key]) for key in [f'{meta_prefix}_'] + list(variadic(info_list or meta_list)) + if info.get(key) is not None), None) + if value not in ('', None): + value = value.replace('\0', '') # nul character cannot be passed in command line + metadata['common'].update({meta_f: value for meta_f in variadic(meta_list)}) + + # Info on media metadata/metadata supported by ffmpeg: + # https://wiki.multimedia.cx/index.php/FFmpeg_Metadata + # https://kdenlive.org/en/project/adding-meta-data-to-mp4-video/ + # https://kodi.wiki/view/Video_file_tagging + + add('title', ('track', 'title')) + add('date', 'upload_date') + add(('description', 'synopsis'), 'description') + add(('purl', 'comment'), 'webpage_url') + add('track', 'track_number') + add('artist', ('artist', 'creator', 'uploader', 'uploader_id')) + add('genre') + add('album') + add('album_artist') + add('disc', 'disc_number') + add('show', 'series') + add('season_number') + add('episode_id', ('episode', 'episode_id')) + add('episode_sort', 'episode_number') + if 'embed-metadata' in self.get_param('compat_opts', []): + add('comment', 'description') + metadata['common'].pop('synopsis', None) + + meta_regex = rf'{re.escape(meta_prefix)}(?P<i>\d+)?_(?P<key>.+)' + for key, value in info.items(): + mobj = re.fullmatch(meta_regex, key) + if value is not None and mobj: + metadata[mobj.group('i') or 'common'][mobj.group('key')] = value.replace('\0', '') + + # Write id3v1 metadata also since Windows Explorer can't handle id3v2 tags + yield ('-write_id3v1', '1') + + for name, value in metadata['common'].items(): + yield ('-metadata', f'{name}={value}') + + stream_idx = 0 + for fmt in info.get('requested_formats') or []: + stream_count = 2 if 'none' not in (fmt.get('vcodec'), fmt.get('acodec')) else 1 + lang = ISO639Utils.short2long(fmt.get('language') or '') or fmt.get('language') + for i in range(stream_idx, stream_idx + stream_count): + if lang: + metadata[str(i)].setdefault('language', lang) + for name, value in metadata[str(i)].items(): + yield (f'-metadata:s:{i}', f'{name}={value}') + stream_idx += stream_count + + def _get_infojson_opts(self, info, infofn): + if not infofn or not os.path.exists(infofn): + if self._add_infojson is not True: + return + infofn = infofn or '%s.temp' % ( + self._downloader.prepare_filename(info, 'infojson') + or replace_extension(self._downloader.prepare_filename(info), 'info.json', info['ext'])) + if not self._downloader._ensure_dir_exists(infofn): + return + self.write_debug(f'Writing info-json to: {infofn}') + write_json_file(self._downloader.sanitize_info(info, self.get_param('clean_infojson', True)), infofn) + info['infojson_filename'] = infofn + + old_stream, new_stream = self.get_stream_number(info['filepath'], ('tags', 'mimetype'), 'application/json') + if old_stream is not None: + yield ('-map', '-0:%d' % old_stream) + new_stream -= 1 + + yield ( + '-attach', self._ffmpeg_filename_argument(infofn), + f'-metadata:s:{new_stream}', 'mimetype=application/json', + f'-metadata:s:{new_stream}', 'filename=info.json', + ) + + +class FFmpegMergerPP(FFmpegPostProcessor): + SUPPORTED_EXTS = MEDIA_EXTENSIONS.common_video + + @PostProcessor._restrict_to(images=False) + def run(self, info): + filename = info['filepath'] + temp_filename = prepend_extension(filename, 'temp') + args = ['-c', 'copy'] + audio_streams = 0 + for (i, fmt) in enumerate(info['requested_formats']): + if fmt.get('acodec') != 'none': + args.extend(['-map', f'{i}:a:0']) + aac_fixup = fmt['protocol'].startswith('m3u8') and self.get_audio_codec(fmt['filepath']) == 'aac' + if aac_fixup: + args.extend([f'-bsf:a:{audio_streams}', 'aac_adtstoasc']) + audio_streams += 1 + if fmt.get('vcodec') != 'none': + args.extend(['-map', '%u:v:0' % (i)]) + self.to_screen('Merging formats into "%s"' % filename) + self.run_ffmpeg_multiple_files(info['__files_to_merge'], temp_filename, args) + os.rename(encodeFilename(temp_filename), encodeFilename(filename)) + return info['__files_to_merge'], info + + def can_merge(self): + # TODO: figure out merge-capable ffmpeg version + if self.basename != 'avconv': + return True + + required_version = '10-0' + if is_outdated_version( + self._versions[self.basename], required_version): + warning = ('Your copy of %s is outdated and unable to properly mux separate video and audio files, ' + 'yt-dlp will download single file media. ' + 'Update %s to version %s or newer to fix this.') % ( + self.basename, self.basename, required_version) + self.report_warning(warning) + return False + return True + + +class FFmpegFixupPostProcessor(FFmpegPostProcessor): + def _fixup(self, msg, filename, options): + temp_filename = prepend_extension(filename, 'temp') + + self.to_screen(f'{msg} of "{filename}"') + self.run_ffmpeg(filename, temp_filename, options) + + os.replace(temp_filename, filename) + + +class FFmpegFixupStretchedPP(FFmpegFixupPostProcessor): + @PostProcessor._restrict_to(images=False, audio=False) + def run(self, info): + stretched_ratio = info.get('stretched_ratio') + if stretched_ratio not in (None, 1): + self._fixup('Fixing aspect ratio', info['filepath'], [ + *self.stream_copy_opts(), '-aspect', '%f' % stretched_ratio]) + return [], info + + +class FFmpegFixupM4aPP(FFmpegFixupPostProcessor): + @PostProcessor._restrict_to(images=False, video=False) + def run(self, info): + if info.get('container') == 'm4a_dash': + self._fixup('Correcting container', info['filepath'], [*self.stream_copy_opts(), '-f', 'mp4']) + return [], info + + +class FFmpegFixupM3u8PP(FFmpegFixupPostProcessor): + def _needs_fixup(self, info): + yield info['ext'] in ('mp4', 'm4a') + yield info['protocol'].startswith('m3u8') + try: + metadata = self.get_metadata_object(info['filepath']) + except PostProcessingError as e: + self.report_warning(f'Unable to extract metadata: {e.msg}') + yield True + else: + yield traverse_obj(metadata, ('format', 'format_name'), casesense=False) == 'mpegts' + + @PostProcessor._restrict_to(images=False) + def run(self, info): + if all(self._needs_fixup(info)): + args = ['-f', 'mp4'] + if self.get_audio_codec(info['filepath']) == 'aac': + args.extend(['-bsf:a', 'aac_adtstoasc']) + self._fixup('Fixing MPEG-TS in MP4 container', info['filepath'], [ + *self.stream_copy_opts(), *args]) + return [], info + + +class FFmpegFixupTimestampPP(FFmpegFixupPostProcessor): + + def __init__(self, downloader=None, trim=0.001): + # "trim" should be used when the video contains unintended packets + super().__init__(downloader) + assert isinstance(trim, (int, float)) + self.trim = str(trim) + + @PostProcessor._restrict_to(images=False) + def run(self, info): + if not self._features.get('setts'): + self.report_warning( + 'A re-encode is needed to fix timestamps in older versions of ffmpeg. ' + 'Please install ffmpeg 4.4 or later to fixup without re-encoding') + opts = ['-vf', 'setpts=PTS-STARTPTS'] + else: + opts = ['-c', 'copy', '-bsf', 'setts=ts=TS-STARTPTS'] + self._fixup('Fixing frame timestamp', info['filepath'], opts + [*self.stream_copy_opts(False), '-ss', self.trim]) + return [], info + + +class FFmpegCopyStreamPP(FFmpegFixupPostProcessor): + MESSAGE = 'Copying stream' + + @PostProcessor._restrict_to(images=False) + def run(self, info): + self._fixup(self.MESSAGE, info['filepath'], self.stream_copy_opts()) + return [], info + + +class FFmpegFixupDurationPP(FFmpegCopyStreamPP): + MESSAGE = 'Fixing video duration' + + +class FFmpegFixupDuplicateMoovPP(FFmpegCopyStreamPP): + MESSAGE = 'Fixing duplicate MOOV atoms' + + +class FFmpegSubtitlesConvertorPP(FFmpegPostProcessor): + SUPPORTED_EXTS = MEDIA_EXTENSIONS.subtitles + + def __init__(self, downloader=None, format=None): + super().__init__(downloader) + self.format = format + + def run(self, info): + subs = info.get('requested_subtitles') + new_ext = self.format + new_format = new_ext + if new_format == 'vtt': + new_format = 'webvtt' + if subs is None: + self.to_screen('There aren\'t any subtitles to convert') + return [], info + self.to_screen('Converting subtitles') + sub_filenames = [] + for lang, sub in subs.items(): + if not os.path.exists(sub.get('filepath', '')): + self.report_warning(f'Skipping embedding {lang} subtitle because the file is missing') + continue + ext = sub['ext'] + if ext == new_ext: + self.to_screen('Subtitle file for %s is already in the requested format' % new_ext) + continue + elif ext == 'json': + self.to_screen( + 'You have requested to convert json subtitles into another format, ' + 'which is currently not possible') + continue + old_file = sub['filepath'] + sub_filenames.append(old_file) + new_file = replace_extension(old_file, new_ext) + + if ext in ('dfxp', 'ttml', 'tt'): + self.report_warning( + 'You have requested to convert dfxp (TTML) subtitles into another format, ' + 'which results in style information loss') + + dfxp_file = old_file + srt_file = replace_extension(old_file, 'srt') + + with open(dfxp_file, 'rb') as f: + srt_data = dfxp2srt(f.read()) + + with open(srt_file, 'w', encoding='utf-8') as f: + f.write(srt_data) + old_file = srt_file + + subs[lang] = { + 'ext': 'srt', + 'data': srt_data, + 'filepath': srt_file, + } + + if new_ext == 'srt': + continue + else: + sub_filenames.append(srt_file) + + self.run_ffmpeg(old_file, new_file, ['-f', new_format]) + + with open(new_file, encoding='utf-8') as f: + subs[lang] = { + 'ext': new_ext, + 'data': f.read(), + 'filepath': new_file, + } + + info['__files_to_move'][new_file] = replace_extension( + info['__files_to_move'][sub['filepath']], new_ext) + + return sub_filenames, info + + +class FFmpegSplitChaptersPP(FFmpegPostProcessor): + def __init__(self, downloader, force_keyframes=False): + FFmpegPostProcessor.__init__(self, downloader) + self._force_keyframes = force_keyframes + + def _prepare_filename(self, number, chapter, info): + info = info.copy() + info.update({ + 'section_number': number, + 'section_title': chapter.get('title'), + 'section_start': chapter.get('start_time'), + 'section_end': chapter.get('end_time'), + }) + return self._downloader.prepare_filename(info, 'chapter') + + def _ffmpeg_args_for_chapter(self, number, chapter, info): + destination = self._prepare_filename(number, chapter, info) + if not self._downloader._ensure_dir_exists(encodeFilename(destination)): + return + + chapter['filepath'] = destination + self.to_screen('Chapter %03d; Destination: %s' % (number, destination)) + return ( + destination, + ['-ss', str(chapter['start_time']), + '-t', str(chapter['end_time'] - chapter['start_time'])]) + + @PostProcessor._restrict_to(images=False) + def run(self, info): + self._fixup_chapters(info) + chapters = info.get('chapters') or [] + if not chapters: + self.to_screen('Chapter information is unavailable') + return [], info + + in_file = info['filepath'] + if self._force_keyframes and len(chapters) > 1: + in_file = self.force_keyframes(in_file, (c['start_time'] for c in chapters)) + self.to_screen('Splitting video by chapters; %d chapters found' % len(chapters)) + for idx, chapter in enumerate(chapters): + destination, opts = self._ffmpeg_args_for_chapter(idx + 1, chapter, info) + self.real_run_ffmpeg([(in_file, opts)], [(destination, self.stream_copy_opts())]) + if in_file != info['filepath']: + self._delete_downloaded_files(in_file, msg=None) + return [], info + + +class FFmpegThumbnailsConvertorPP(FFmpegPostProcessor): + SUPPORTED_EXTS = MEDIA_EXTENSIONS.thumbnails + FORMAT_RE = create_mapping_re(SUPPORTED_EXTS) + + def __init__(self, downloader=None, format=None): + super().__init__(downloader) + self.mapping = format + + @classmethod + def is_webp(cls, path): + deprecation_warning(f'{cls.__module__}.{cls.__name__}.is_webp is deprecated') + return imghdr.what(path) == 'webp' + + def fixup_webp(self, info, idx=-1): + thumbnail_filename = info['thumbnails'][idx]['filepath'] + _, thumbnail_ext = os.path.splitext(thumbnail_filename) + if thumbnail_ext: + if thumbnail_ext.lower() != '.webp' and imghdr.what(thumbnail_filename) == 'webp': + self.to_screen('Correcting thumbnail "%s" extension to webp' % thumbnail_filename) + webp_filename = replace_extension(thumbnail_filename, 'webp') + os.replace(thumbnail_filename, webp_filename) + info['thumbnails'][idx]['filepath'] = webp_filename + info['__files_to_move'][webp_filename] = replace_extension( + info['__files_to_move'].pop(thumbnail_filename), 'webp') + + @staticmethod + def _options(target_ext): + yield from ('-update', '1') + if target_ext == 'jpg': + yield from ('-bsf:v', 'mjpeg2jpeg') + + def convert_thumbnail(self, thumbnail_filename, target_ext): + thumbnail_conv_filename = replace_extension(thumbnail_filename, target_ext) + + self.to_screen(f'Converting thumbnail "{thumbnail_filename}" to {target_ext}') + _, source_ext = os.path.splitext(thumbnail_filename) + self.real_run_ffmpeg( + [(thumbnail_filename, [] if source_ext == '.gif' else ['-f', 'image2', '-pattern_type', 'none'])], + [(thumbnail_conv_filename, self._options(target_ext))]) + return thumbnail_conv_filename + + def run(self, info): + files_to_delete = [] + has_thumbnail = False + + for idx, thumbnail_dict in enumerate(info.get('thumbnails') or []): + original_thumbnail = thumbnail_dict.get('filepath') + if not original_thumbnail: + continue + has_thumbnail = True + self.fixup_webp(info, idx) + original_thumbnail = thumbnail_dict['filepath'] # Path can change during fixup + thumbnail_ext = os.path.splitext(original_thumbnail)[1][1:].lower() + if thumbnail_ext == 'jpeg': + thumbnail_ext = 'jpg' + target_ext, _skip_msg = resolve_mapping(thumbnail_ext, self.mapping) + if _skip_msg: + self.to_screen(f'Not converting thumbnail "{original_thumbnail}"; {_skip_msg}') + continue + thumbnail_dict['filepath'] = self.convert_thumbnail(original_thumbnail, target_ext) + files_to_delete.append(original_thumbnail) + info['__files_to_move'][thumbnail_dict['filepath']] = replace_extension( + info['__files_to_move'][original_thumbnail], target_ext) + + if not has_thumbnail: + self.to_screen('There aren\'t any thumbnails to convert') + return files_to_delete, info + + +class FFmpegConcatPP(FFmpegPostProcessor): + def __init__(self, downloader, only_multi_video=False): + self._only_multi_video = only_multi_video + super().__init__(downloader) + + def _get_codecs(self, file): + codecs = traverse_obj(self.get_metadata_object(file), ('streams', ..., 'codec_name')) + self.write_debug(f'Codecs = {", ".join(codecs)}') + return tuple(codecs) + + def concat_files(self, in_files, out_file): + if not self._downloader._ensure_dir_exists(out_file): + return + if len(in_files) == 1: + if os.path.realpath(in_files[0]) != os.path.realpath(out_file): + self.to_screen(f'Moving "{in_files[0]}" to "{out_file}"') + os.replace(in_files[0], out_file) + return [] + + if len(set(map(self._get_codecs, in_files))) > 1: + raise PostProcessingError( + 'The files have different streams/codecs and cannot be concatenated. ' + 'Either select different formats or --recode-video them to a common format') + + self.to_screen(f'Concatenating {len(in_files)} files; Destination: {out_file}') + super().concat_files(in_files, out_file) + return in_files + + @PostProcessor._restrict_to(images=False, simulated=False) + def run(self, info): + entries = info.get('entries') or [] + if not any(entries) or (self._only_multi_video and info['_type'] != 'multi_video'): + return [], info + elif traverse_obj(entries, (..., lambda k, v: k == 'requested_downloads' and len(v) > 1)): + raise PostProcessingError('Concatenation is not supported when downloading multiple separate formats') + + in_files = traverse_obj(entries, (..., 'requested_downloads', 0, 'filepath')) or [] + if len(in_files) < len(entries): + raise PostProcessingError('Aborting concatenation because some downloads failed') + + exts = traverse_obj(entries, (..., 'requested_downloads', 0, 'ext'), (..., 'ext')) + ie_copy = collections.ChainMap({'ext': exts[0] if len(set(exts)) == 1 else 'mkv'}, + info, self._downloader._playlist_infodict(info)) + out_file = self._downloader.prepare_filename(ie_copy, 'pl_video') + + files_to_delete = self.concat_files(in_files, out_file) + + info['requested_downloads'] = [{ + 'filepath': out_file, + 'ext': ie_copy['ext'], + }] + return files_to_delete, info diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/metadataparser.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/metadataparser.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/metadataparser.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/metadataparser.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/postprocessor/modify_chapters.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/modify_chapters.py new file mode 100644 index 0000000..f521986 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/modify_chapters.py @@ -0,0 +1,336 @@ +import copy +import heapq +import os + +from .common import PostProcessor +from .ffmpeg import FFmpegPostProcessor, FFmpegSubtitlesConvertorPP +from .sponsorblock import SponsorBlockPP +from ..utils import PostProcessingError, orderedSet, prepend_extension + +_TINY_CHAPTER_DURATION = 1 +DEFAULT_SPONSORBLOCK_CHAPTER_TITLE = '[SponsorBlock]: %(category_names)l' + + +class ModifyChaptersPP(FFmpegPostProcessor): + def __init__(self, downloader, remove_chapters_patterns=None, remove_sponsor_segments=None, remove_ranges=None, + *, sponsorblock_chapter_title=DEFAULT_SPONSORBLOCK_CHAPTER_TITLE, force_keyframes=False): + FFmpegPostProcessor.__init__(self, downloader) + self._remove_chapters_patterns = set(remove_chapters_patterns or []) + self._remove_sponsor_segments = set(remove_sponsor_segments or []) - set(SponsorBlockPP.NON_SKIPPABLE_CATEGORIES.keys()) + self._ranges_to_remove = set(remove_ranges or []) + self._sponsorblock_chapter_title = sponsorblock_chapter_title + self._force_keyframes = force_keyframes + + @PostProcessor._restrict_to(images=False) + def run(self, info): + self._fixup_chapters(info) + # Chapters must be preserved intact when downloading multiple formats of the same video. + chapters, sponsor_chapters = self._mark_chapters_to_remove( + copy.deepcopy(info.get('chapters')) or [], + copy.deepcopy(info.get('sponsorblock_chapters')) or []) + if not chapters and not sponsor_chapters: + return [], info + + real_duration = self._get_real_video_duration(info['filepath']) + if not chapters: + chapters = [{'start_time': 0, 'end_time': info.get('duration') or real_duration, 'title': info['title']}] + + info['chapters'], cuts = self._remove_marked_arrange_sponsors(chapters + sponsor_chapters) + if not cuts: + return [], info + elif not info['chapters']: + self.report_warning('You have requested to remove the entire video, which is not possible') + return [], info + + original_duration, info['duration'] = info.get('duration'), info['chapters'][-1]['end_time'] + if self._duration_mismatch(real_duration, original_duration, 1): + if not self._duration_mismatch(real_duration, info['duration']): + self.to_screen(f'Skipping {self.pp_key()} since the video appears to be already cut') + return [], info + if not info.get('__real_download'): + raise PostProcessingError('Cannot cut video since the real and expected durations mismatch. ' + 'Different chapters may have already been removed') + else: + self.write_debug('Expected and actual durations mismatch') + + concat_opts = self._make_concat_opts(cuts, real_duration) + self.write_debug('Concat spec = %s' % ', '.join(f'{c.get("inpoint", 0.0)}-{c.get("outpoint", "inf")}' for c in concat_opts)) + + def remove_chapters(file, is_sub): + return file, self.remove_chapters(file, cuts, concat_opts, self._force_keyframes and not is_sub) + + in_out_files = [remove_chapters(info['filepath'], False)] + in_out_files.extend(remove_chapters(in_file, True) for in_file in self._get_supported_subs(info)) + + # Renaming should only happen after all files are processed + files_to_remove = [] + for in_file, out_file in in_out_files: + mtime = os.stat(in_file).st_mtime + uncut_file = prepend_extension(in_file, 'uncut') + os.replace(in_file, uncut_file) + os.replace(out_file, in_file) + self.try_utime(in_file, mtime, mtime) + files_to_remove.append(uncut_file) + + return files_to_remove, info + + def _mark_chapters_to_remove(self, chapters, sponsor_chapters): + if self._remove_chapters_patterns: + warn_no_chapter_to_remove = True + if not chapters: + self.to_screen('Chapter information is unavailable') + warn_no_chapter_to_remove = False + for c in chapters: + if any(regex.search(c['title']) for regex in self._remove_chapters_patterns): + c['remove'] = True + warn_no_chapter_to_remove = False + if warn_no_chapter_to_remove: + self.to_screen('There are no chapters matching the regex') + + if self._remove_sponsor_segments: + warn_no_chapter_to_remove = True + if not sponsor_chapters: + self.to_screen('SponsorBlock information is unavailable') + warn_no_chapter_to_remove = False + for c in sponsor_chapters: + if c['category'] in self._remove_sponsor_segments: + c['remove'] = True + warn_no_chapter_to_remove = False + if warn_no_chapter_to_remove: + self.to_screen('There are no matching SponsorBlock chapters') + + sponsor_chapters.extend({ + 'start_time': start, + 'end_time': end, + 'category': 'manually_removed', + '_categories': [('manually_removed', start, end, 'Manually removed')], + 'remove': True, + } for start, end in self._ranges_to_remove) + + return chapters, sponsor_chapters + + def _get_supported_subs(self, info): + for sub in (info.get('requested_subtitles') or {}).values(): + sub_file = sub.get('filepath') + # The file might have been removed by --embed-subs + if not sub_file or not os.path.exists(sub_file): + continue + ext = sub['ext'] + if ext not in FFmpegSubtitlesConvertorPP.SUPPORTED_EXTS: + self.report_warning(f'Cannot remove chapters from external {ext} subtitles; "{sub_file}" is now out of sync') + continue + # TODO: create __real_download for subs? + yield sub_file + + def _remove_marked_arrange_sponsors(self, chapters): + # Store cuts separately, since adjacent and overlapping cuts must be merged. + cuts = [] + + def append_cut(c): + assert 'remove' in c, 'Not a cut is appended to cuts' + last_to_cut = cuts[-1] if cuts else None + if last_to_cut and last_to_cut['end_time'] >= c['start_time']: + last_to_cut['end_time'] = max(last_to_cut['end_time'], c['end_time']) + else: + cuts.append(c) + return len(cuts) - 1 + + def excess_duration(c): + # Cuts that are completely within the chapter reduce chapters' duration. + # Since cuts can overlap, excess duration may be less that the sum of cuts' durations. + # To avoid that, chapter stores the index to the fist cut within the chapter, + # instead of storing excess duration. append_cut ensures that subsequent cuts (if any) + # will be merged with previous ones (if necessary). + cut_idx, excess = c.pop('cut_idx', len(cuts)), 0 + while cut_idx < len(cuts): + cut = cuts[cut_idx] + if cut['start_time'] >= c['end_time']: + break + if cut['end_time'] > c['start_time']: + excess += min(cut['end_time'], c['end_time']) + excess -= max(cut['start_time'], c['start_time']) + cut_idx += 1 + return excess + + new_chapters = [] + + def append_chapter(c): + assert 'remove' not in c, 'Cut is appended to chapters' + length = c['end_time'] - c['start_time'] - excess_duration(c) + # Chapter is completely covered by cuts or sponsors. + if length <= 0: + return + start = new_chapters[-1]['end_time'] if new_chapters else 0 + c.update(start_time=start, end_time=start + length) + new_chapters.append(c) + + # Turn into a priority queue, index is a tie breaker. + # Plain stack sorted by start_time is not enough: after splitting the chapter, + # the part returned to the stack is not guaranteed to have start_time + # less than or equal to the that of the stack's head. + chapters = [(c['start_time'], i, c) for i, c in enumerate(chapters)] + heapq.heapify(chapters) + + _, cur_i, cur_chapter = heapq.heappop(chapters) + while chapters: + _, i, c = heapq.heappop(chapters) + # Non-overlapping chapters or cuts can be appended directly. However, + # adjacent non-overlapping cuts must be merged, which is handled by append_cut. + if cur_chapter['end_time'] <= c['start_time']: + (append_chapter if 'remove' not in cur_chapter else append_cut)(cur_chapter) + cur_i, cur_chapter = i, c + continue + + # Eight possibilities for overlapping chapters: (cut, cut), (cut, sponsor), + # (cut, normal), (sponsor, cut), (normal, cut), (sponsor, sponsor), + # (sponsor, normal), and (normal, sponsor). There is no (normal, normal): + # normal chapters are assumed not to overlap. + if 'remove' in cur_chapter: + # (cut, cut): adjust end_time. + if 'remove' in c: + cur_chapter['end_time'] = max(cur_chapter['end_time'], c['end_time']) + # (cut, sponsor/normal): chop the beginning of the later chapter + # (if it's not completely hidden by the cut). Push to the priority queue + # to restore sorting by start_time: with beginning chopped, c may actually + # start later than the remaining chapters from the queue. + elif cur_chapter['end_time'] < c['end_time']: + c['start_time'] = cur_chapter['end_time'] + c['_was_cut'] = True + heapq.heappush(chapters, (c['start_time'], i, c)) + # (sponsor/normal, cut). + elif 'remove' in c: + cur_chapter['_was_cut'] = True + # Chop the end of the current chapter if the cut is not contained within it. + # Chopping the end doesn't break start_time sorting, no PQ push is necessary. + if cur_chapter['end_time'] <= c['end_time']: + cur_chapter['end_time'] = c['start_time'] + append_chapter(cur_chapter) + cur_i, cur_chapter = i, c + continue + # Current chapter contains the cut within it. If the current chapter is + # a sponsor chapter, check whether the categories before and after the cut differ. + if '_categories' in cur_chapter: + after_c = dict(cur_chapter, start_time=c['end_time'], _categories=[]) + cur_cats = [] + for cat_start_end in cur_chapter['_categories']: + if cat_start_end[1] < c['start_time']: + cur_cats.append(cat_start_end) + if cat_start_end[2] > c['end_time']: + after_c['_categories'].append(cat_start_end) + cur_chapter['_categories'] = cur_cats + if cur_chapter['_categories'] != after_c['_categories']: + # Categories before and after the cut differ: push the after part to PQ. + heapq.heappush(chapters, (after_c['start_time'], cur_i, after_c)) + cur_chapter['end_time'] = c['start_time'] + append_chapter(cur_chapter) + cur_i, cur_chapter = i, c + continue + # Either sponsor categories before and after the cut are the same or + # we're dealing with a normal chapter. Just register an outstanding cut: + # subsequent append_chapter will reduce the duration. + cur_chapter.setdefault('cut_idx', append_cut(c)) + # (sponsor, normal): if a normal chapter is not completely overlapped, + # chop the beginning of it and push it to PQ. + elif '_categories' in cur_chapter and '_categories' not in c: + if cur_chapter['end_time'] < c['end_time']: + c['start_time'] = cur_chapter['end_time'] + c['_was_cut'] = True + heapq.heappush(chapters, (c['start_time'], i, c)) + # (normal, sponsor) and (sponsor, sponsor) + else: + assert '_categories' in c, 'Normal chapters overlap' + cur_chapter['_was_cut'] = True + c['_was_cut'] = True + # Push the part after the sponsor to PQ. + if cur_chapter['end_time'] > c['end_time']: + # deepcopy to make categories in after_c and cur_chapter/c refer to different lists. + after_c = dict(copy.deepcopy(cur_chapter), start_time=c['end_time']) + heapq.heappush(chapters, (after_c['start_time'], cur_i, after_c)) + # Push the part after the overlap to PQ. + elif c['end_time'] > cur_chapter['end_time']: + after_cur = dict(copy.deepcopy(c), start_time=cur_chapter['end_time']) + heapq.heappush(chapters, (after_cur['start_time'], cur_i, after_cur)) + c['end_time'] = cur_chapter['end_time'] + # (sponsor, sponsor): merge categories in the overlap. + if '_categories' in cur_chapter: + c['_categories'] = cur_chapter['_categories'] + c['_categories'] + # Inherit the cuts that the current chapter has accumulated within it. + if 'cut_idx' in cur_chapter: + c['cut_idx'] = cur_chapter['cut_idx'] + cur_chapter['end_time'] = c['start_time'] + append_chapter(cur_chapter) + cur_i, cur_chapter = i, c + (append_chapter if 'remove' not in cur_chapter else append_cut)(cur_chapter) + return self._remove_tiny_rename_sponsors(new_chapters), cuts + + def _remove_tiny_rename_sponsors(self, chapters): + new_chapters = [] + for i, c in enumerate(chapters): + # Merge with the previous/next if the chapter is tiny. + # Only tiny chapters resulting from a cut can be skipped. + # Chapters that were already tiny in the original list will be preserved. + if (('_was_cut' in c or '_categories' in c) + and c['end_time'] - c['start_time'] < _TINY_CHAPTER_DURATION): + if not new_chapters: + # Prepend tiny chapter to the next one if possible. + if i < len(chapters) - 1: + chapters[i + 1]['start_time'] = c['start_time'] + continue + else: + old_c = new_chapters[-1] + if i < len(chapters) - 1: + next_c = chapters[i + 1] + # Not a typo: key names in old_c and next_c are really different. + prev_is_sponsor = 'categories' in old_c + next_is_sponsor = '_categories' in next_c + # Preferentially prepend tiny normals to normals and sponsors to sponsors. + if (('_categories' not in c and prev_is_sponsor and not next_is_sponsor) + or ('_categories' in c and not prev_is_sponsor and next_is_sponsor)): + next_c['start_time'] = c['start_time'] + continue + old_c['end_time'] = c['end_time'] + continue + + c.pop('_was_cut', None) + cats = c.pop('_categories', None) + if cats: + category, _, _, category_name = min(cats, key=lambda c: c[2] - c[1]) + c.update({ + 'category': category, + 'categories': orderedSet(x[0] for x in cats), + 'name': category_name, + 'category_names': orderedSet(x[3] for x in cats), + }) + c['title'] = self._downloader.evaluate_outtmpl(self._sponsorblock_chapter_title, c.copy()) + # Merge identically named sponsors. + if (new_chapters and 'categories' in new_chapters[-1] + and new_chapters[-1]['title'] == c['title']): + new_chapters[-1]['end_time'] = c['end_time'] + continue + new_chapters.append(c) + return new_chapters + + def remove_chapters(self, filename, ranges_to_cut, concat_opts, force_keyframes=False): + in_file = filename + out_file = prepend_extension(in_file, 'temp') + if force_keyframes: + in_file = self.force_keyframes(in_file, (t for c in ranges_to_cut for t in (c['start_time'], c['end_time']))) + self.to_screen(f'Removing chapters from {filename}') + self.concat_files([in_file] * len(concat_opts), out_file, concat_opts) + if in_file != filename: + self._delete_downloaded_files(in_file, msg=None) + return out_file + + @staticmethod + def _make_concat_opts(chapters_to_remove, duration): + opts = [{}] + for s in chapters_to_remove: + # Do not create 0 duration chunk at the beginning. + if s['start_time'] == 0: + opts[-1]['inpoint'] = f'{s["end_time"]:.6f}' + continue + opts[-1]['outpoint'] = f'{s["start_time"]:.6f}' + # Do not create 0 duration chunk at the end. + if s['end_time'] < duration: + opts.append({'inpoint': f'{s["end_time"]:.6f}'}) + return opts diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/sponskrub.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/sponskrub.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/sponskrub.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/sponskrub.py diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/sponsorblock.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/sponsorblock.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/sponsorblock.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/sponsorblock.py diff --git a/lib/python3.11/site-packages/yt_dlp/postprocessor/xattrpp.py b/python/lib/python3.10/site-packages/yt_dlp/postprocessor/xattrpp.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/postprocessor/xattrpp.py rename to python/lib/python3.10/site-packages/yt_dlp/postprocessor/xattrpp.py diff --git a/python/lib/python3.10/site-packages/yt_dlp/socks.py b/python/lib/python3.10/site-packages/yt_dlp/socks.py new file mode 100644 index 0000000..e7f41d7 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/socks.py @@ -0,0 +1,274 @@ +# Public Domain SOCKS proxy protocol implementation +# Adapted from https://gist.github.com/bluec0re/cafd3764412967417fd3 +# References: +# SOCKS4 protocol http://www.openssh.com/txt/socks4.protocol +# SOCKS4A protocol http://www.openssh.com/txt/socks4a.protocol +# SOCKS5 protocol https://tools.ietf.org/html/rfc1928 +# SOCKS5 username/password authentication https://tools.ietf.org/html/rfc1929 + +import collections +import socket +import struct + +from .compat import compat_ord + +__author__ = 'Timo Schmid <coding@timoschmid.de>' + +SOCKS4_VERSION = 4 +SOCKS4_REPLY_VERSION = 0x00 +# Excerpt from SOCKS4A protocol: +# if the client cannot resolve the destination host's domain name to find its +# IP address, it should set the first three bytes of DSTIP to NULL and the last +# byte to a non-zero value. +SOCKS4_DEFAULT_DSTIP = struct.pack('!BBBB', 0, 0, 0, 0xFF) + +SOCKS5_VERSION = 5 +SOCKS5_USER_AUTH_VERSION = 0x01 +SOCKS5_USER_AUTH_SUCCESS = 0x00 + + +class Socks4Command: + CMD_CONNECT = 0x01 + CMD_BIND = 0x02 + + +class Socks5Command(Socks4Command): + CMD_UDP_ASSOCIATE = 0x03 + + +class Socks5Auth: + AUTH_NONE = 0x00 + AUTH_GSSAPI = 0x01 + AUTH_USER_PASS = 0x02 + AUTH_NO_ACCEPTABLE = 0xFF # For server response + + +class Socks5AddressType: + ATYP_IPV4 = 0x01 + ATYP_DOMAINNAME = 0x03 + ATYP_IPV6 = 0x04 + + +class ProxyError(socket.error): + ERR_SUCCESS = 0x00 + + def __init__(self, code=None, msg=None): + if code is not None and msg is None: + msg = self.CODES.get(code) or 'unknown error' + super().__init__(code, msg) + + +class InvalidVersionError(ProxyError): + def __init__(self, expected_version, got_version): + msg = ('Invalid response version from server. Expected {:02x} got ' + '{:02x}'.format(expected_version, got_version)) + super().__init__(0, msg) + + +class Socks4Error(ProxyError): + ERR_SUCCESS = 90 + + CODES = { + 91: 'request rejected or failed', + 92: 'request rejected because SOCKS server cannot connect to identd on the client', + 93: 'request rejected because the client program and identd report different user-ids' + } + + +class Socks5Error(ProxyError): + ERR_GENERAL_FAILURE = 0x01 + + CODES = { + 0x01: 'general SOCKS server failure', + 0x02: 'connection not allowed by ruleset', + 0x03: 'Network unreachable', + 0x04: 'Host unreachable', + 0x05: 'Connection refused', + 0x06: 'TTL expired', + 0x07: 'Command not supported', + 0x08: 'Address type not supported', + 0xFE: 'unknown username or invalid password', + 0xFF: 'all offered authentication methods were rejected' + } + + +class ProxyType: + SOCKS4 = 0 + SOCKS4A = 1 + SOCKS5 = 2 + + +Proxy = collections.namedtuple('Proxy', ( + 'type', 'host', 'port', 'username', 'password', 'remote_dns')) + + +class sockssocket(socket.socket): + def __init__(self, *args, **kwargs): + self._proxy = None + super().__init__(*args, **kwargs) + + def setproxy(self, proxytype, addr, port, rdns=True, username=None, password=None): + assert proxytype in (ProxyType.SOCKS4, ProxyType.SOCKS4A, ProxyType.SOCKS5) + + self._proxy = Proxy(proxytype, addr, port, username, password, rdns) + + def recvall(self, cnt): + data = b'' + while len(data) < cnt: + cur = self.recv(cnt - len(data)) + if not cur: + raise EOFError(f'{cnt - len(data)} bytes missing') + data += cur + return data + + def _recv_bytes(self, cnt): + data = self.recvall(cnt) + return struct.unpack(f'!{cnt}B', data) + + @staticmethod + def _len_and_data(data): + return struct.pack('!B', len(data)) + data + + def _check_response_version(self, expected_version, got_version): + if got_version != expected_version: + self.close() + raise InvalidVersionError(expected_version, got_version) + + def _resolve_address(self, destaddr, default, use_remote_dns, family=None): + for f in (family,) if family else (socket.AF_INET, socket.AF_INET6): + try: + return f, socket.inet_pton(f, destaddr) + except OSError: + continue + + if use_remote_dns and self._proxy.remote_dns: + return 0, default + else: + res = socket.getaddrinfo(destaddr, None, family=family or 0) + f, _, _, _, ipaddr = res[0] + return f, socket.inet_pton(f, ipaddr[0]) + + def _setup_socks4(self, address, is_4a=False): + destaddr, port = address + + _, ipaddr = self._resolve_address(destaddr, SOCKS4_DEFAULT_DSTIP, use_remote_dns=is_4a, family=socket.AF_INET) + + packet = struct.pack('!BBH', SOCKS4_VERSION, Socks4Command.CMD_CONNECT, port) + ipaddr + + username = (self._proxy.username or '').encode() + packet += username + b'\x00' + + if is_4a and self._proxy.remote_dns and ipaddr == SOCKS4_DEFAULT_DSTIP: + packet += destaddr.encode() + b'\x00' + + self.sendall(packet) + + version, resp_code, dstport, dsthost = struct.unpack('!BBHI', self.recvall(8)) + + self._check_response_version(SOCKS4_REPLY_VERSION, version) + + if resp_code != Socks4Error.ERR_SUCCESS: + self.close() + raise Socks4Error(resp_code) + + return (dsthost, dstport) + + def _setup_socks4a(self, address): + self._setup_socks4(address, is_4a=True) + + def _socks5_auth(self): + packet = struct.pack('!B', SOCKS5_VERSION) + + auth_methods = [Socks5Auth.AUTH_NONE] + if self._proxy.username and self._proxy.password: + auth_methods.append(Socks5Auth.AUTH_USER_PASS) + + packet += struct.pack('!B', len(auth_methods)) + packet += struct.pack(f'!{len(auth_methods)}B', *auth_methods) + + self.sendall(packet) + + version, method = self._recv_bytes(2) + + self._check_response_version(SOCKS5_VERSION, version) + + if method == Socks5Auth.AUTH_NO_ACCEPTABLE or ( + method == Socks5Auth.AUTH_USER_PASS and (not self._proxy.username or not self._proxy.password)): + self.close() + raise Socks5Error(Socks5Auth.AUTH_NO_ACCEPTABLE) + + if method == Socks5Auth.AUTH_USER_PASS: + username = self._proxy.username.encode() + password = self._proxy.password.encode() + packet = struct.pack('!B', SOCKS5_USER_AUTH_VERSION) + packet += self._len_and_data(username) + self._len_and_data(password) + self.sendall(packet) + + version, status = self._recv_bytes(2) + + self._check_response_version(SOCKS5_USER_AUTH_VERSION, version) + + if status != SOCKS5_USER_AUTH_SUCCESS: + self.close() + raise Socks5Error(Socks5Error.ERR_GENERAL_FAILURE) + + def _setup_socks5(self, address): + destaddr, port = address + + family, ipaddr = self._resolve_address(destaddr, None, use_remote_dns=True) + + self._socks5_auth() + + reserved = 0 + packet = struct.pack('!BBB', SOCKS5_VERSION, Socks5Command.CMD_CONNECT, reserved) + if ipaddr is None: + destaddr = destaddr.encode() + packet += struct.pack('!B', Socks5AddressType.ATYP_DOMAINNAME) + packet += self._len_and_data(destaddr) + elif family == socket.AF_INET: + packet += struct.pack('!B', Socks5AddressType.ATYP_IPV4) + ipaddr + elif family == socket.AF_INET6: + packet += struct.pack('!B', Socks5AddressType.ATYP_IPV6) + ipaddr + packet += struct.pack('!H', port) + + self.sendall(packet) + + version, status, reserved, atype = self._recv_bytes(4) + + self._check_response_version(SOCKS5_VERSION, version) + + if status != Socks5Error.ERR_SUCCESS: + self.close() + raise Socks5Error(status) + + if atype == Socks5AddressType.ATYP_IPV4: + destaddr = self.recvall(4) + elif atype == Socks5AddressType.ATYP_DOMAINNAME: + alen = compat_ord(self.recv(1)) + destaddr = self.recvall(alen) + elif atype == Socks5AddressType.ATYP_IPV6: + destaddr = self.recvall(16) + destport = struct.unpack('!H', self.recvall(2))[0] + + return (destaddr, destport) + + def _make_proxy(self, connect_func, address): + if not self._proxy: + return connect_func(self, address) + + result = connect_func(self, (self._proxy.host, self._proxy.port)) + if result != 0 and result is not None: + return result + setup_funcs = { + ProxyType.SOCKS4: self._setup_socks4, + ProxyType.SOCKS4A: self._setup_socks4a, + ProxyType.SOCKS5: self._setup_socks5, + } + setup_funcs[self._proxy.type](address) + return result + + def connect(self, address): + self._make_proxy(socket.socket.connect, address) + + def connect_ex(self, address): + return self._make_proxy(socket.socket.connect_ex, address) diff --git a/python/lib/python3.10/site-packages/yt_dlp/update.py b/python/lib/python3.10/site-packages/yt_dlp/update.py new file mode 100644 index 0000000..db79df1 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/update.py @@ -0,0 +1,464 @@ +import atexit +import contextlib +import hashlib +import json +import os +import platform +import re +import subprocess +import sys +from zipimport import zipimporter + +from .compat import functools # isort: split +from .compat import compat_realpath, compat_shlex_quote +from .networking import Request +from .networking.exceptions import HTTPError, network_exceptions +from .utils import ( + Popen, + cached_method, + deprecation_warning, + remove_end, + remove_start, + shell_quote, + system_identifier, + version_tuple, +) +from .version import CHANNEL, UPDATE_HINT, VARIANT, __version__ + +UPDATE_SOURCES = { + 'stable': 'yt-dlp/yt-dlp', + 'nightly': 'yt-dlp/yt-dlp-nightly-builds', +} +REPOSITORY = UPDATE_SOURCES['stable'] + +_VERSION_RE = re.compile(r'(\d+\.)*\d+') + +API_BASE_URL = 'https://api.github.com/repos' + +# Backwards compatibility variables for the current channel +API_URL = f'{API_BASE_URL}/{REPOSITORY}/releases' + + +@functools.cache +def _get_variant_and_executable_path(): + """@returns (variant, executable_path)""" + if getattr(sys, 'frozen', False): + path = sys.executable + if not hasattr(sys, '_MEIPASS'): + return 'py2exe', path + elif sys._MEIPASS == os.path.dirname(path): + return f'{sys.platform}_dir', path + elif sys.platform == 'darwin': + machine = '_legacy' if version_tuple(platform.mac_ver()[0]) < (10, 15) else '' + else: + machine = f'_{platform.machine().lower()}' + # Ref: https://en.wikipedia.org/wiki/Uname#Examples + if machine[1:] in ('x86', 'x86_64', 'amd64', 'i386', 'i686'): + machine = '_x86' if platform.architecture()[0][:2] == '32' else '' + return f'{remove_end(sys.platform, "32")}{machine}_exe', path + + path = os.path.dirname(__file__) + if isinstance(__loader__, zipimporter): + return 'zip', os.path.join(path, '..') + elif (os.path.basename(sys.argv[0]) in ('__main__.py', '-m') + and os.path.exists(os.path.join(path, '../.git/HEAD'))): + return 'source', path + return 'unknown', path + + +def detect_variant(): + return VARIANT or _get_variant_and_executable_path()[0] + + +@functools.cache +def current_git_head(): + if detect_variant() != 'source': + return + with contextlib.suppress(Exception): + stdout, _, _ = Popen.run( + ['git', 'rev-parse', '--short', 'HEAD'], + text=True, cwd=os.path.dirname(os.path.abspath(__file__)), + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if re.fullmatch('[0-9a-f]+', stdout.strip()): + return stdout.strip() + + +_FILE_SUFFIXES = { + 'zip': '', + 'py2exe': '_min.exe', + 'win_exe': '.exe', + 'win_x86_exe': '_x86.exe', + 'darwin_exe': '_macos', + 'darwin_legacy_exe': '_macos_legacy', + 'linux_exe': '_linux', + 'linux_aarch64_exe': '_linux_aarch64', + 'linux_armv7l_exe': '_linux_armv7l', +} + +_NON_UPDATEABLE_REASONS = { + **{variant: None for variant in _FILE_SUFFIXES}, # Updatable + **{variant: f'Auto-update is not supported for unpackaged {name} executable; Re-download the latest release' + for variant, name in {'win32_dir': 'Windows', 'darwin_dir': 'MacOS', 'linux_dir': 'Linux'}.items()}, + 'source': 'You cannot update when running from source code; Use git to pull the latest changes', + 'unknown': 'You installed yt-dlp with a package manager or setup.py; Use that to update', + 'other': 'You are using an unofficial build of yt-dlp; Build the executable again', +} + + +def is_non_updateable(): + if UPDATE_HINT: + return UPDATE_HINT + return _NON_UPDATEABLE_REASONS.get( + detect_variant(), _NON_UPDATEABLE_REASONS['unknown' if VARIANT else 'other']) + + +def _get_system_deprecation(): + MIN_SUPPORTED, MIN_RECOMMENDED = (3, 7), (3, 8) + + if sys.version_info > MIN_RECOMMENDED: + return None + + major, minor = sys.version_info[:2] + if sys.version_info < MIN_SUPPORTED: + msg = f'Python version {major}.{minor} is no longer supported' + else: + msg = f'Support for Python version {major}.{minor} has been deprecated. ' + # Temporary until `win_x86_exe` uses 3.8, which will deprecate Vista and Server 2008 + if detect_variant() == 'win_x86_exe': + platform_name = platform.platform() + if any(platform_name.startswith(f'Windows-{name}') for name in ('Vista', '2008Server')): + msg = 'Support for Windows Vista/Server 2008 has been deprecated. ' + else: + return None + msg += ('See https://github.com/yt-dlp/yt-dlp/issues/7803 for details.' + '\nYou may stop receiving updates on this version at any time') + + major, minor = MIN_RECOMMENDED + return f'{msg}! Please update to Python {major}.{minor} or above' + + +def _sha256_file(path): + h = hashlib.sha256() + mv = memoryview(bytearray(128 * 1024)) + with open(os.path.realpath(path), 'rb', buffering=0) as f: + for n in iter(lambda: f.readinto(mv), 0): + h.update(mv[:n]) + return h.hexdigest() + + +class Updater: + _exact = True + + def __init__(self, ydl, target=None): + self.ydl = ydl + + self.target_channel, sep, self.target_tag = (target or CHANNEL).rpartition('@') + # stable => stable@latest + if not sep and ('/' in self.target_tag or self.target_tag in UPDATE_SOURCES): + self.target_channel = self.target_tag + self.target_tag = None + elif not self.target_channel: + self.target_channel = CHANNEL.partition('@')[0] + + if not self.target_tag: + self.target_tag = 'latest' + self._exact = False + elif self.target_tag != 'latest': + self.target_tag = f'tags/{self.target_tag}' + + if '/' in self.target_channel: + self._target_repo = self.target_channel + if self.target_channel not in (CHANNEL, *UPDATE_SOURCES.values()): + self.ydl.report_warning( + f'You are switching to an {self.ydl._format_err("unofficial", "red")} executable ' + f'from {self.ydl._format_err(self._target_repo, self.ydl.Styles.EMPHASIS)}. ' + f'Run {self.ydl._format_err("at your own risk", "light red")}') + self._block_restart('Automatically restarting into custom builds is disabled for security reasons') + else: + self._target_repo = UPDATE_SOURCES.get(self.target_channel) + if not self._target_repo: + self._report_error( + f'Invalid update channel {self.target_channel!r} requested. ' + f'Valid channels are {", ".join(UPDATE_SOURCES)}', True) + + def _version_compare(self, a, b, channel=CHANNEL): + if self._exact and channel != self.target_channel: + return False + + if _VERSION_RE.fullmatch(f'{a}.{b}'): + a, b = version_tuple(a), version_tuple(b) + return a == b if self._exact else a >= b + return a == b + + @functools.cached_property + def _tag(self): + if self._version_compare(self.current_version, self.latest_version): + return self.target_tag + + identifier = f'{detect_variant()} {self.target_channel} {system_identifier()}' + for line in self._download('_update_spec', 'latest').decode().splitlines(): + if not line.startswith('lock '): + continue + _, tag, pattern = line.split(' ', 2) + if re.match(pattern, identifier): + if not self._exact: + return f'tags/{tag}' + elif self.target_tag == 'latest' or not self._version_compare( + tag, self.target_tag[5:], channel=self.target_channel): + self._report_error( + f'yt-dlp cannot be updated above {tag} since you are on an older Python version', True) + return f'tags/{self.current_version}' + return self.target_tag + + @cached_method + def _get_version_info(self, tag): + url = f'{API_BASE_URL}/{self._target_repo}/releases/{tag}' + self.ydl.write_debug(f'Fetching release info: {url}') + return json.loads(self.ydl.urlopen(Request(url, headers={ + 'Accept': 'application/vnd.github+json', + 'User-Agent': 'yt-dlp', + 'X-GitHub-Api-Version': '2022-11-28', + })).read().decode()) + + @property + def current_version(self): + """Current version""" + return __version__ + + @staticmethod + def _label(channel, tag): + """Label for a given channel and tag""" + return f'{channel}@{remove_start(tag, "tags/")}' + + def _get_actual_tag(self, tag): + if tag.startswith('tags/'): + return tag[5:] + return self._get_version_info(tag)['tag_name'] + + @property + def new_version(self): + """Version of the latest release we can update to""" + return self._get_actual_tag(self._tag) + + @property + def latest_version(self): + """Version of the target release""" + return self._get_actual_tag(self.target_tag) + + @property + def has_update(self): + """Whether there is an update available""" + return not self._version_compare(self.current_version, self.new_version) + + @functools.cached_property + def filename(self): + """Filename of the executable""" + return compat_realpath(_get_variant_and_executable_path()[1]) + + def _download(self, name, tag): + slug = 'latest/download' if tag == 'latest' else f'download/{tag[5:]}' + url = f'https://github.com/{self._target_repo}/releases/{slug}/{name}' + self.ydl.write_debug(f'Downloading {name} from {url}') + return self.ydl.urlopen(url).read() + + @functools.cached_property + def release_name(self): + """The release filename""" + return f'yt-dlp{_FILE_SUFFIXES[detect_variant()]}' + + @functools.cached_property + def release_hash(self): + """Hash of the latest release""" + hash_data = dict(ln.split()[::-1] for ln in self._download('SHA2-256SUMS', self._tag).decode().splitlines()) + return hash_data[self.release_name] + + def _report_error(self, msg, expected=False): + self.ydl.report_error(msg, tb=False if expected else None) + self.ydl._download_retcode = 100 + + def _report_permission_error(self, file): + self._report_error(f'Unable to write to {file}; Try running as administrator', True) + + def _report_network_error(self, action, delim=';'): + self._report_error( + f'Unable to {action}{delim} visit ' + f'https://github.com/{self._target_repo}/releases/{self.target_tag.replace("tags/", "tag/")}', True) + + def check_update(self): + """Report whether there is an update available""" + if not self._target_repo: + return False + try: + self.ydl.to_screen(( + f'Available version: {self._label(self.target_channel, self.latest_version)}, ' if self.target_tag == 'latest' else '' + ) + f'Current version: {self._label(CHANNEL, self.current_version)}') + except network_exceptions as e: + return self._report_network_error(f'obtain version info ({e})', delim='; Please try again later or') + + if not is_non_updateable(): + self.ydl.to_screen(f'Current Build Hash: {_sha256_file(self.filename)}') + + if self.has_update: + return True + + if self.target_tag == self._tag: + self.ydl.to_screen(f'yt-dlp is up to date ({self._label(CHANNEL, self.current_version)})') + elif not self._exact: + self.ydl.report_warning('yt-dlp cannot be updated any further since you are on an older Python version') + return False + + def update(self): + """Update yt-dlp executable to the latest version""" + if not self.check_update(): + return + err = is_non_updateable() + if err: + return self._report_error(err, True) + self.ydl.to_screen(f'Updating to {self._label(self.target_channel, self.new_version)} ...') + if (_VERSION_RE.fullmatch(self.target_tag[5:]) + and version_tuple(self.target_tag[5:]) < (2023, 3, 2)): + self.ydl.report_warning('You are downgrading to a version without --update-to') + self._block_restart('Cannot automatically restart to a version without --update-to') + + directory = os.path.dirname(self.filename) + if not os.access(self.filename, os.W_OK): + return self._report_permission_error(self.filename) + elif not os.access(directory, os.W_OK): + return self._report_permission_error(directory) + + new_filename, old_filename = f'{self.filename}.new', f'{self.filename}.old' + if detect_variant() == 'zip': # Can be replaced in-place + new_filename, old_filename = self.filename, None + + try: + if os.path.exists(old_filename or ''): + os.remove(old_filename) + except OSError: + return self._report_error('Unable to remove the old version') + + try: + newcontent = self._download(self.release_name, self._tag) + except network_exceptions as e: + if isinstance(e, HTTPError) and e.status == 404: + return self._report_error( + f'The requested tag {self._label(self.target_channel, self.target_tag)} does not exist', True) + return self._report_network_error(f'fetch updates: {e}') + + try: + expected_hash = self.release_hash + except Exception: + self.ydl.report_warning('no hash information found for the release') + else: + if hashlib.sha256(newcontent).hexdigest() != expected_hash: + return self._report_network_error('verify the new executable') + + try: + with open(new_filename, 'wb') as outf: + outf.write(newcontent) + except OSError: + return self._report_permission_error(new_filename) + + if old_filename: + mask = os.stat(self.filename).st_mode + try: + os.rename(self.filename, old_filename) + except OSError: + return self._report_error('Unable to move current version') + + try: + os.rename(new_filename, self.filename) + except OSError: + self._report_error('Unable to overwrite current version') + return os.rename(old_filename, self.filename) + + variant = detect_variant() + if variant.startswith('win') or variant == 'py2exe': + atexit.register(Popen, f'ping 127.0.0.1 -n 5 -w 1000 & del /F "{old_filename}"', + shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + elif old_filename: + try: + os.remove(old_filename) + except OSError: + self._report_error('Unable to remove the old version') + + try: + os.chmod(self.filename, mask) + except OSError: + return self._report_error( + f'Unable to set permissions. Run: sudo chmod a+rx {compat_shlex_quote(self.filename)}') + + self.ydl.to_screen(f'Updated yt-dlp to {self._label(self.target_channel, self.new_version)}') + return True + + @functools.cached_property + def cmd(self): + """The command-line to run the executable, if known""" + # There is no sys.orig_argv in py < 3.10. Also, it can be [] when frozen + if getattr(sys, 'orig_argv', None): + return sys.orig_argv + elif getattr(sys, 'frozen', False): + return sys.argv + + def restart(self): + """Restart the executable""" + assert self.cmd, 'Must be frozen or Py >= 3.10' + self.ydl.write_debug(f'Restarting: {shell_quote(self.cmd)}') + _, _, returncode = Popen.run(self.cmd) + return returncode + + def _block_restart(self, msg): + def wrapper(): + self._report_error(f'{msg}. Restart yt-dlp to use the updated version', expected=True) + return self.ydl._download_retcode + self.restart = wrapper + + +def run_update(ydl): + """Update the program file with the latest version from the repository + @returns Whether there was a successful update (No update = False) + """ + return Updater(ydl).update() + + +# Deprecated +def update_self(to_screen, verbose, opener): + import traceback + + deprecation_warning(f'"{__name__}.update_self" is deprecated and may be removed ' + f'in a future version. Use "{__name__}.run_update(ydl)" instead') + + printfn = to_screen + + class FakeYDL(): + to_screen = printfn + + def report_warning(self, msg, *args, **kwargs): + return printfn(f'WARNING: {msg}', *args, **kwargs) + + def report_error(self, msg, tb=None): + printfn(f'ERROR: {msg}') + if not verbose: + return + if tb is None: + # Copied from YoutubeDL.trouble + if sys.exc_info()[0]: + tb = '' + if hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]: + tb += ''.join(traceback.format_exception(*sys.exc_info()[1].exc_info)) + tb += traceback.format_exc() + else: + tb_data = traceback.format_list(traceback.extract_stack()) + tb = ''.join(tb_data) + if tb: + printfn(tb) + + def write_debug(self, msg, *args, **kwargs): + printfn(f'[debug] {msg}', *args, **kwargs) + + def urlopen(self, url): + return opener.open(url) + + return run_update(FakeYDL()) + + +__all__ = ['Updater'] diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/__init__.py b/python/lib/python3.10/site-packages/yt_dlp/utils/__init__.py new file mode 100644 index 0000000..c267e32 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/__init__.py @@ -0,0 +1,10 @@ +# flake8: noqa: F403 +from ..compat.compat_utils import passthrough_module + +passthrough_module(__name__, '._deprecated') +del passthrough_module + +# isort: off +from .traversal import * +from ._utils import * +from ._utils import _configuration_args, _get_exe_version_output # noqa: F401 diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/_deprecated.py b/python/lib/python3.10/site-packages/yt_dlp/utils/_deprecated.py new file mode 100644 index 0000000..a8ae8ec --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/_deprecated.py @@ -0,0 +1,39 @@ +"""Deprecated - New code should avoid these""" +import warnings + +from ..compat.compat_utils import passthrough_module + +# XXX: Implement this the same way as other DeprecationWarnings without circular import +passthrough_module(__name__, '.._legacy', callback=lambda attr: warnings.warn( + DeprecationWarning(f'{__name__}.{attr} is deprecated'), stacklevel=6)) +del passthrough_module + + +from ._utils import preferredencoding + + +def encodeFilename(s, for_subprocess=False): + assert isinstance(s, str) + return s + + +def decodeFilename(b, for_subprocess=False): + return b + + +def decodeArgument(b): + return b + + +def decodeOption(optval): + if optval is None: + return optval + if isinstance(optval, bytes): + optval = optval.decode(preferredencoding()) + + assert isinstance(optval, str) + return optval + + +def error_to_compat_str(err): + return str(err) diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/_legacy.py b/python/lib/python3.10/site-packages/yt_dlp/utils/_legacy.py new file mode 100644 index 0000000..dde0209 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/_legacy.py @@ -0,0 +1,242 @@ +"""No longer used and new code should not use. Exists only for API compat.""" +import platform +import struct +import sys +import urllib.error +import urllib.parse +import urllib.request +import zlib + +from ._utils import Popen, decode_base_n, preferredencoding +from .networking import escape_rfc3986 # noqa: F401 +from .networking import normalize_url as escape_url # noqa: F401 +from .traversal import traverse_obj +from ..dependencies import certifi, websockets +from ..networking._helper import make_ssl_context +from ..networking._urllib import HTTPHandler + +# isort: split +from .networking import random_user_agent, std_headers # noqa: F401 +from ..cookies import YoutubeDLCookieJar # noqa: F401 +from ..networking._urllib import PUTRequest # noqa: F401 +from ..networking._urllib import SUPPORTED_ENCODINGS, HEADRequest # noqa: F401 +from ..networking._urllib import ProxyHandler as PerRequestProxyHandler # noqa: F401 +from ..networking._urllib import RedirectHandler as YoutubeDLRedirectHandler # noqa: F401 +from ..networking._urllib import ( # noqa: F401 + make_socks_conn_class, + update_Request, +) +from ..networking.exceptions import HTTPError, network_exceptions # noqa: F401 + +has_certifi = bool(certifi) +has_websockets = bool(websockets) + + +def load_plugins(name, suffix, namespace): + from ..plugins import load_plugins + ret = load_plugins(name, suffix) + namespace.update(ret) + return ret + + +def traverse_dict(dictn, keys, casesense=True): + return traverse_obj(dictn, keys, casesense=casesense, is_user_input=True, traverse_string=True) + + +def decode_base(value, digits): + return decode_base_n(value, table=digits) + + +def platform_name(): + """ Returns the platform name as a str """ + return platform.platform() + + +def get_subprocess_encoding(): + if sys.platform == 'win32' and sys.getwindowsversion()[0] >= 5: + # For subprocess calls, encode with locale encoding + # Refer to http://stackoverflow.com/a/9951851/35070 + encoding = preferredencoding() + else: + encoding = sys.getfilesystemencoding() + if encoding is None: + encoding = 'utf-8' + return encoding + + +# UNUSED +# Based on png2str() written by @gdkchan and improved by @yokrysty +# Originally posted at https://github.com/ytdl-org/youtube-dl/issues/9706 +def decode_png(png_data): + # Reference: https://www.w3.org/TR/PNG/ + header = png_data[8:] + + if png_data[:8] != b'\x89PNG\x0d\x0a\x1a\x0a' or header[4:8] != b'IHDR': + raise OSError('Not a valid PNG file.') + + int_map = {1: '>B', 2: '>H', 4: '>I'} + unpack_integer = lambda x: struct.unpack(int_map[len(x)], x)[0] + + chunks = [] + + while header: + length = unpack_integer(header[:4]) + header = header[4:] + + chunk_type = header[:4] + header = header[4:] + + chunk_data = header[:length] + header = header[length:] + + header = header[4:] # Skip CRC + + chunks.append({ + 'type': chunk_type, + 'length': length, + 'data': chunk_data + }) + + ihdr = chunks[0]['data'] + + width = unpack_integer(ihdr[:4]) + height = unpack_integer(ihdr[4:8]) + + idat = b'' + + for chunk in chunks: + if chunk['type'] == b'IDAT': + idat += chunk['data'] + + if not idat: + raise OSError('Unable to read PNG data.') + + decompressed_data = bytearray(zlib.decompress(idat)) + + stride = width * 3 + pixels = [] + + def _get_pixel(idx): + x = idx % stride + y = idx // stride + return pixels[y][x] + + for y in range(height): + basePos = y * (1 + stride) + filter_type = decompressed_data[basePos] + + current_row = [] + + pixels.append(current_row) + + for x in range(stride): + color = decompressed_data[1 + basePos + x] + basex = y * stride + x + left = 0 + up = 0 + + if x > 2: + left = _get_pixel(basex - 3) + if y > 0: + up = _get_pixel(basex - stride) + + if filter_type == 1: # Sub + color = (color + left) & 0xff + elif filter_type == 2: # Up + color = (color + up) & 0xff + elif filter_type == 3: # Average + color = (color + ((left + up) >> 1)) & 0xff + elif filter_type == 4: # Paeth + a = left + b = up + c = 0 + + if x > 2 and y > 0: + c = _get_pixel(basex - stride - 3) + + p = a + b - c + + pa = abs(p - a) + pb = abs(p - b) + pc = abs(p - c) + + if pa <= pb and pa <= pc: + color = (color + a) & 0xff + elif pb <= pc: + color = (color + b) & 0xff + else: + color = (color + c) & 0xff + + current_row.append(color) + + return width, height, pixels + + +def register_socks_protocols(): + # "Register" SOCKS protocols + # In Python < 2.6.5, urlsplit() suffers from bug https://bugs.python.org/issue7904 + # URLs with protocols not in urlparse.uses_netloc are not handled correctly + for scheme in ('socks', 'socks4', 'socks4a', 'socks5'): + if scheme not in urllib.parse.uses_netloc: + urllib.parse.uses_netloc.append(scheme) + + +def handle_youtubedl_headers(headers): + filtered_headers = headers + + if 'Youtubedl-no-compression' in filtered_headers: + filtered_headers = {k: v for k, v in filtered_headers.items() if k.lower() != 'accept-encoding'} + del filtered_headers['Youtubedl-no-compression'] + + return filtered_headers + + +def request_to_url(req): + if isinstance(req, urllib.request.Request): + return req.get_full_url() + else: + return req + + +def sanitized_Request(url, *args, **kwargs): + from ..utils import extract_basic_auth, sanitize_url + url, auth_header = extract_basic_auth(escape_url(sanitize_url(url))) + if auth_header is not None: + headers = args[1] if len(args) >= 2 else kwargs.setdefault('headers', {}) + headers['Authorization'] = auth_header + return urllib.request.Request(url, *args, **kwargs) + + +class YoutubeDLHandler(HTTPHandler): + def __init__(self, params, *args, **kwargs): + self._params = params + super().__init__(*args, **kwargs) + + +YoutubeDLHTTPSHandler = YoutubeDLHandler + + +class YoutubeDLCookieProcessor(urllib.request.HTTPCookieProcessor): + def __init__(self, cookiejar=None): + urllib.request.HTTPCookieProcessor.__init__(self, cookiejar) + + def http_response(self, request, response): + return urllib.request.HTTPCookieProcessor.http_response(self, request, response) + + https_request = urllib.request.HTTPCookieProcessor.http_request + https_response = http_response + + +def make_HTTPS_handler(params, **kwargs): + return YoutubeDLHTTPSHandler(params, context=make_ssl_context( + verify=not params.get('nocheckcertificate'), + client_certificate=params.get('client_certificate'), + client_certificate_key=params.get('client_certificate_key'), + client_certificate_password=params.get('client_certificate_password'), + legacy_support=params.get('legacyserverconnect'), + use_certifi='no-certifi' not in params.get('compat_opts', []), + ), **kwargs) + + +def process_communicate_or_kill(p, *args, **kwargs): + return Popen.communicate_or_kill(p, *args, **kwargs) diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/_utils.py b/python/lib/python3.10/site-packages/yt_dlp/utils/_utils.py new file mode 100644 index 0000000..10c7c43 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/_utils.py @@ -0,0 +1,5502 @@ +import asyncio +import atexit +import base64 +import binascii +import calendar +import codecs +import collections +import collections.abc +import contextlib +import datetime +import email.header +import email.utils +import errno +import hashlib +import hmac +import html.entities +import html.parser +import inspect +import io +import itertools +import json +import locale +import math +import mimetypes +import netrc +import operator +import os +import platform +import random +import re +import shlex +import socket +import ssl +import struct +import subprocess +import sys +import tempfile +import time +import traceback +import types +import unicodedata +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree + +from . import traversal + +from ..compat import functools # isort: split +from ..compat import ( + compat_etree_fromstring, + compat_expanduser, + compat_HTMLParseError, + compat_os_name, + compat_shlex_quote, +) +from ..dependencies import websockets, xattr + +__name__ = __name__.rsplit('.', 1)[0] # Pretend to be the parent module + +# This is not clearly defined otherwise +compiled_regex_type = type(re.compile('')) + + +class NO_DEFAULT: + pass + + +def IDENTITY(x): + return x + + +ENGLISH_MONTH_NAMES = [ + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December'] + +MONTH_NAMES = { + 'en': ENGLISH_MONTH_NAMES, + 'fr': [ + 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', + 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], + # these follow the genitive grammatical case (dopeÅ‚niacz) + # some websites might be using nominative, which will require another month list + # https://en.wikibooks.org/wiki/Polish/Noun_cases + 'pl': ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', + 'lipca', 'sierpnia', 'wrzeÅ›nia', 'października', 'listopada', 'grudnia'], +} + +# From https://github.com/python/cpython/blob/3.11/Lib/email/_parseaddr.py#L36-L42 +TIMEZONE_NAMES = { + 'UT': 0, 'UTC': 0, 'GMT': 0, 'Z': 0, + 'AST': -4, 'ADT': -3, # Atlantic (used in Canada) + 'EST': -5, 'EDT': -4, # Eastern + 'CST': -6, 'CDT': -5, # Central + 'MST': -7, 'MDT': -6, # Mountain + 'PST': -8, 'PDT': -7 # Pacific +} + +# needed for sanitizing filenames in restricted mode +ACCENT_CHARS = dict(zip('ÂÃÄÀÃÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖÅØŒÙÚÛÜŰÃÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿ', + itertools.chain('AAAAAA', ['AE'], 'CEEEEIIIIDNOOOOOOO', ['OE'], 'UUUUUY', ['TH', 'ss'], + 'aaaaaa', ['ae'], 'ceeeeiiiionooooooo', ['oe'], 'uuuuuy', ['th'], 'y'))) + +DATE_FORMATS = ( + '%d %B %Y', + '%d %b %Y', + '%B %d %Y', + '%B %dst %Y', + '%B %dnd %Y', + '%B %drd %Y', + '%B %dth %Y', + '%b %d %Y', + '%b %dst %Y', + '%b %dnd %Y', + '%b %drd %Y', + '%b %dth %Y', + '%b %dst %Y %I:%M', + '%b %dnd %Y %I:%M', + '%b %drd %Y %I:%M', + '%b %dth %Y %I:%M', + '%Y %m %d', + '%Y-%m-%d', + '%Y.%m.%d.', + '%Y/%m/%d', + '%Y/%m/%d %H:%M', + '%Y/%m/%d %H:%M:%S', + '%Y%m%d%H%M', + '%Y%m%d%H%M%S', + '%Y%m%d', + '%Y-%m-%d %H:%M', + '%Y-%m-%d %H:%M:%S', + '%Y-%m-%d %H:%M:%S.%f', + '%Y-%m-%d %H:%M:%S:%f', + '%d.%m.%Y %H:%M', + '%d.%m.%Y %H.%M', + '%Y-%m-%dT%H:%M:%SZ', + '%Y-%m-%dT%H:%M:%S.%fZ', + '%Y-%m-%dT%H:%M:%S.%f0Z', + '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%dT%H:%M:%S.%f', + '%Y-%m-%dT%H:%M', + '%b %d %Y at %H:%M', + '%b %d %Y at %H:%M:%S', + '%B %d %Y at %H:%M', + '%B %d %Y at %H:%M:%S', + '%H:%M %d-%b-%Y', +) + +DATE_FORMATS_DAY_FIRST = list(DATE_FORMATS) +DATE_FORMATS_DAY_FIRST.extend([ + '%d-%m-%Y', + '%d.%m.%Y', + '%d.%m.%y', + '%d/%m/%Y', + '%d/%m/%y', + '%d/%m/%Y %H:%M:%S', + '%d-%m-%Y %H:%M', + '%H:%M %d/%m/%Y', +]) + +DATE_FORMATS_MONTH_FIRST = list(DATE_FORMATS) +DATE_FORMATS_MONTH_FIRST.extend([ + '%m-%d-%Y', + '%m.%d.%Y', + '%m/%d/%Y', + '%m/%d/%y', + '%m/%d/%Y %H:%M:%S', +]) + +PACKED_CODES_RE = r"}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)" +JSON_LD_RE = r'(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>\s*(?P<json_ld>{.+?}|\[.+?\])\s*</script>' + +NUMBER_RE = r'\d+(?:\.\d+)?' + + +@functools.cache +def preferredencoding(): + """Get preferred encoding. + + Returns the best encoding scheme for the system, based on + locale.getpreferredencoding() and some further tweaks. + """ + try: + pref = locale.getpreferredencoding() + 'TEST'.encode(pref) + except Exception: + pref = 'UTF-8' + + return pref + + +def write_json_file(obj, fn): + """ Encode obj as JSON and write it to fn, atomically if possible """ + + tf = tempfile.NamedTemporaryFile( + prefix=f'{os.path.basename(fn)}.', dir=os.path.dirname(fn), + suffix='.tmp', delete=False, mode='w', encoding='utf-8') + + try: + with tf: + json.dump(obj, tf, ensure_ascii=False) + if sys.platform == 'win32': + # Need to remove existing file on Windows, else os.rename raises + # WindowsError or FileExistsError. + with contextlib.suppress(OSError): + os.unlink(fn) + with contextlib.suppress(OSError): + mask = os.umask(0) + os.umask(mask) + os.chmod(tf.name, 0o666 & ~mask) + os.rename(tf.name, fn) + except Exception: + with contextlib.suppress(OSError): + os.remove(tf.name) + raise + + +def find_xpath_attr(node, xpath, key, val=None): + """ Find the xpath xpath[@key=val] """ + assert re.match(r'^[a-zA-Z_-]+$', key) + expr = xpath + ('[@%s]' % key if val is None else f"[@{key}='{val}']") + return node.find(expr) + +# On python2.6 the xml.etree.ElementTree.Element methods don't support +# the namespace parameter + + +def xpath_with_ns(path, ns_map): + components = [c.split(':') for c in path.split('/')] + replaced = [] + for c in components: + if len(c) == 1: + replaced.append(c[0]) + else: + ns, tag = c + replaced.append('{%s}%s' % (ns_map[ns], tag)) + return '/'.join(replaced) + + +def xpath_element(node, xpath, name=None, fatal=False, default=NO_DEFAULT): + def _find_xpath(xpath): + return node.find(xpath) + + if isinstance(xpath, str): + n = _find_xpath(xpath) + else: + for xp in xpath: + n = _find_xpath(xp) + if n is not None: + break + + if n is None: + if default is not NO_DEFAULT: + return default + elif fatal: + name = xpath if name is None else name + raise ExtractorError('Could not find XML element %s' % name) + else: + return None + return n + + +def xpath_text(node, xpath, name=None, fatal=False, default=NO_DEFAULT): + n = xpath_element(node, xpath, name, fatal=fatal, default=default) + if n is None or n == default: + return n + if n.text is None: + if default is not NO_DEFAULT: + return default + elif fatal: + name = xpath if name is None else name + raise ExtractorError('Could not find XML element\'s text %s' % name) + else: + return None + return n.text + + +def xpath_attr(node, xpath, key, name=None, fatal=False, default=NO_DEFAULT): + n = find_xpath_attr(node, xpath, key) + if n is None: + if default is not NO_DEFAULT: + return default + elif fatal: + name = f'{xpath}[@{key}]' if name is None else name + raise ExtractorError('Could not find XML attribute %s' % name) + else: + return None + return n.attrib[key] + + +def get_element_by_id(id, html, **kwargs): + """Return the content of the tag with the specified ID in the passed HTML document""" + return get_element_by_attribute('id', id, html, **kwargs) + + +def get_element_html_by_id(id, html, **kwargs): + """Return the html of the tag with the specified ID in the passed HTML document""" + return get_element_html_by_attribute('id', id, html, **kwargs) + + +def get_element_by_class(class_name, html): + """Return the content of the first tag with the specified class in the passed HTML document""" + retval = get_elements_by_class(class_name, html) + return retval[0] if retval else None + + +def get_element_html_by_class(class_name, html): + """Return the html of the first tag with the specified class in the passed HTML document""" + retval = get_elements_html_by_class(class_name, html) + return retval[0] if retval else None + + +def get_element_by_attribute(attribute, value, html, **kwargs): + retval = get_elements_by_attribute(attribute, value, html, **kwargs) + return retval[0] if retval else None + + +def get_element_html_by_attribute(attribute, value, html, **kargs): + retval = get_elements_html_by_attribute(attribute, value, html, **kargs) + return retval[0] if retval else None + + +def get_elements_by_class(class_name, html, **kargs): + """Return the content of all tags with the specified class in the passed HTML document as a list""" + return get_elements_by_attribute( + 'class', r'[^\'"]*(?<=[\'"\s])%s(?=[\'"\s])[^\'"]*' % re.escape(class_name), + html, escape_value=False) + + +def get_elements_html_by_class(class_name, html): + """Return the html of all tags with the specified class in the passed HTML document as a list""" + return get_elements_html_by_attribute( + 'class', r'[^\'"]*(?<=[\'"\s])%s(?=[\'"\s])[^\'"]*' % re.escape(class_name), + html, escape_value=False) + + +def get_elements_by_attribute(*args, **kwargs): + """Return the content of the tag with the specified attribute in the passed HTML document""" + return [content for content, _ in get_elements_text_and_html_by_attribute(*args, **kwargs)] + + +def get_elements_html_by_attribute(*args, **kwargs): + """Return the html of the tag with the specified attribute in the passed HTML document""" + return [whole for _, whole in get_elements_text_and_html_by_attribute(*args, **kwargs)] + + +def get_elements_text_and_html_by_attribute(attribute, value, html, *, tag=r'[\w:.-]+', escape_value=True): + """ + Return the text (content) and the html (whole) of the tag with the specified + attribute in the passed HTML document + """ + if not value: + return + + quote = '' if re.match(r'''[\s"'`=<>]''', value) else '?' + + value = re.escape(value) if escape_value else value + + partial_element_re = rf'''(?x) + <(?P<tag>{tag}) + (?:\s(?:[^>"']|"[^"]*"|'[^']*')*)? + \s{re.escape(attribute)}\s*=\s*(?P<_q>['"]{quote})(?-x:{value})(?P=_q) + ''' + + for m in re.finditer(partial_element_re, html): + content, whole = get_element_text_and_html_by_tag(m.group('tag'), html[m.start():]) + + yield ( + unescapeHTML(re.sub(r'^(?P<q>["\'])(?P<content>.*)(?P=q)$', r'\g<content>', content, flags=re.DOTALL)), + whole + ) + + +class HTMLBreakOnClosingTagParser(html.parser.HTMLParser): + """ + HTML parser which raises HTMLBreakOnClosingTagException upon reaching the + closing tag for the first opening tag it has encountered, and can be used + as a context manager + """ + + class HTMLBreakOnClosingTagException(Exception): + pass + + def __init__(self): + self.tagstack = collections.deque() + html.parser.HTMLParser.__init__(self) + + def __enter__(self): + return self + + def __exit__(self, *_): + self.close() + + def close(self): + # handle_endtag does not return upon raising HTMLBreakOnClosingTagException, + # so data remains buffered; we no longer have any interest in it, thus + # override this method to discard it + pass + + def handle_starttag(self, tag, _): + self.tagstack.append(tag) + + def handle_endtag(self, tag): + if not self.tagstack: + raise compat_HTMLParseError('no tags in the stack') + while self.tagstack: + inner_tag = self.tagstack.pop() + if inner_tag == tag: + break + else: + raise compat_HTMLParseError(f'matching opening tag for closing {tag} tag not found') + if not self.tagstack: + raise self.HTMLBreakOnClosingTagException() + + +# XXX: This should be far less strict +def get_element_text_and_html_by_tag(tag, html): + """ + For the first element with the specified tag in the passed HTML document + return its' content (text) and the whole element (html) + """ + def find_or_raise(haystack, needle, exc): + try: + return haystack.index(needle) + except ValueError: + raise exc + closing_tag = f'</{tag}>' + whole_start = find_or_raise( + html, f'<{tag}', compat_HTMLParseError(f'opening {tag} tag not found')) + content_start = find_or_raise( + html[whole_start:], '>', compat_HTMLParseError(f'malformed opening {tag} tag')) + content_start += whole_start + 1 + with HTMLBreakOnClosingTagParser() as parser: + parser.feed(html[whole_start:content_start]) + if not parser.tagstack or parser.tagstack[0] != tag: + raise compat_HTMLParseError(f'parser did not match opening {tag} tag') + offset = content_start + while offset < len(html): + next_closing_tag_start = find_or_raise( + html[offset:], closing_tag, + compat_HTMLParseError(f'closing {tag} tag not found')) + next_closing_tag_end = next_closing_tag_start + len(closing_tag) + try: + parser.feed(html[offset:offset + next_closing_tag_end]) + offset += next_closing_tag_end + except HTMLBreakOnClosingTagParser.HTMLBreakOnClosingTagException: + return html[content_start:offset + next_closing_tag_start], \ + html[whole_start:offset + next_closing_tag_end] + raise compat_HTMLParseError('unexpected end of html') + + +class HTMLAttributeParser(html.parser.HTMLParser): + """Trivial HTML parser to gather the attributes for a single element""" + + def __init__(self): + self.attrs = {} + html.parser.HTMLParser.__init__(self) + + def handle_starttag(self, tag, attrs): + self.attrs = dict(attrs) + raise compat_HTMLParseError('done') + + +class HTMLListAttrsParser(html.parser.HTMLParser): + """HTML parser to gather the attributes for the elements of a list""" + + def __init__(self): + html.parser.HTMLParser.__init__(self) + self.items = [] + self._level = 0 + + def handle_starttag(self, tag, attrs): + if tag == 'li' and self._level == 0: + self.items.append(dict(attrs)) + self._level += 1 + + def handle_endtag(self, tag): + self._level -= 1 + + +def extract_attributes(html_element): + """Given a string for an HTML element such as + <el + a="foo" B="bar" c="&98;az" d=boz + empty= noval entity="&" + sq='"' dq="'" + > + Decode and return a dictionary of attributes. + { + 'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz', + 'empty': '', 'noval': None, 'entity': '&', + 'sq': '"', 'dq': '\'' + }. + """ + parser = HTMLAttributeParser() + with contextlib.suppress(compat_HTMLParseError): + parser.feed(html_element) + parser.close() + return parser.attrs + + +def parse_list(webpage): + """Given a string for an series of HTML <li> elements, + return a dictionary of their attributes""" + parser = HTMLListAttrsParser() + parser.feed(webpage) + parser.close() + return parser.items + + +def clean_html(html): + """Clean an HTML snippet into a readable string""" + + if html is None: # Convenience for sanitizing descriptions etc. + return html + + html = re.sub(r'\s+', ' ', html) + html = re.sub(r'(?u)\s?<\s?br\s?/?\s?>\s?', '\n', html) + html = re.sub(r'(?u)<\s?/\s?p\s?>\s?<\s?p[^>]*>', '\n', html) + # Strip html tags + html = re.sub('<.*?>', '', html) + # Replace html entities + html = unescapeHTML(html) + return html.strip() + + +class LenientJSONDecoder(json.JSONDecoder): + # TODO: Write tests + def __init__(self, *args, transform_source=None, ignore_extra=False, close_objects=0, **kwargs): + self.transform_source, self.ignore_extra = transform_source, ignore_extra + self._close_attempts = 2 * close_objects + super().__init__(*args, **kwargs) + + @staticmethod + def _close_object(err): + doc = err.doc[:err.pos] + # We need to add comma first to get the correct error message + if err.msg.startswith('Expecting \',\''): + return doc + ',' + elif not doc.endswith(','): + return + + if err.msg.startswith('Expecting property name'): + return doc[:-1] + '}' + elif err.msg.startswith('Expecting value'): + return doc[:-1] + ']' + + def decode(self, s): + if self.transform_source: + s = self.transform_source(s) + for attempt in range(self._close_attempts + 1): + try: + if self.ignore_extra: + return self.raw_decode(s.lstrip())[0] + return super().decode(s) + except json.JSONDecodeError as e: + if e.pos is None: + raise + elif attempt < self._close_attempts: + s = self._close_object(e) + if s is not None: + continue + raise type(e)(f'{e.msg} in {s[e.pos-10:e.pos+10]!r}', s, e.pos) + assert False, 'Too many attempts to decode JSON' + + +def sanitize_open(filename, open_mode): + """Try to open the given filename, and slightly tweak it if this fails. + + Attempts to open the given filename. If this fails, it tries to change + the filename slightly, step by step, until it's either able to open it + or it fails and raises a final exception, like the standard open() + function. + + It returns the tuple (stream, definitive_file_name). + """ + if filename == '-': + if sys.platform == 'win32': + import msvcrt + + # stdout may be any IO stream, e.g. when using contextlib.redirect_stdout + with contextlib.suppress(io.UnsupportedOperation): + msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) + return (sys.stdout.buffer if hasattr(sys.stdout, 'buffer') else sys.stdout, filename) + + for attempt in range(2): + try: + try: + if sys.platform == 'win32': + # FIXME: An exclusive lock also locks the file from being read. + # Since windows locks are mandatory, don't lock the file on windows (for now). + # Ref: https://github.com/yt-dlp/yt-dlp/issues/3124 + raise LockingUnsupportedError() + stream = locked_file(filename, open_mode, block=False).__enter__() + except OSError: + stream = open(filename, open_mode) + return stream, filename + except OSError as err: + if attempt or err.errno in (errno.EACCES,): + raise + old_filename, filename = filename, sanitize_path(filename) + if old_filename == filename: + raise + + +def timeconvert(timestr): + """Convert RFC 2822 defined time string into system timestamp""" + timestamp = None + timetuple = email.utils.parsedate_tz(timestr) + if timetuple is not None: + timestamp = email.utils.mktime_tz(timetuple) + return timestamp + + +def sanitize_filename(s, restricted=False, is_id=NO_DEFAULT): + """Sanitizes a string so it could be used as part of a filename. + @param restricted Use a stricter subset of allowed characters + @param is_id Whether this is an ID that should be kept unchanged if possible. + If unset, yt-dlp's new sanitization rules are in effect + """ + if s == '': + return '' + + def replace_insane(char): + if restricted and char in ACCENT_CHARS: + return ACCENT_CHARS[char] + elif not restricted and char == '\n': + return '\0 ' + elif is_id is NO_DEFAULT and not restricted and char in '"*:<>?|/\\': + # Replace with their full-width unicode counterparts + return {'/': '\u29F8', '\\': '\u29f9'}.get(char, chr(ord(char) + 0xfee0)) + elif char == '?' or ord(char) < 32 or ord(char) == 127: + return '' + elif char == '"': + return '' if restricted else '\'' + elif char == ':': + return '\0_\0-' if restricted else '\0 \0-' + elif char in '\\/|*<>': + return '\0_' + if restricted and (char in '!&\'()[]{}$;`^,#' or char.isspace() or ord(char) > 127): + return '\0_' + return char + + # Replace look-alike Unicode glyphs + if restricted and (is_id is NO_DEFAULT or not is_id): + s = unicodedata.normalize('NFKC', s) + s = re.sub(r'[0-9]+(?::[0-9]+)+', lambda m: m.group(0).replace(':', '_'), s) # Handle timestamps + result = ''.join(map(replace_insane, s)) + if is_id is NO_DEFAULT: + result = re.sub(r'(\0.)(?:(?=\1)..)+', r'\1', result) # Remove repeated substitute chars + STRIP_RE = r'(?:\0.|[ _-])*' + result = re.sub(f'^\0.{STRIP_RE}|{STRIP_RE}\0.$', '', result) # Remove substitute chars from start/end + result = result.replace('\0', '') or '_' + + if not is_id: + while '__' in result: + result = result.replace('__', '_') + result = result.strip('_') + # Common case of "Foreign band name - English song title" + if restricted and result.startswith('-_'): + result = result[2:] + if result.startswith('-'): + result = '_' + result[len('-'):] + result = result.lstrip('.') + if not result: + result = '_' + return result + + +def sanitize_path(s, force=False): + """Sanitizes and normalizes path on Windows""" + # XXX: this handles drive relative paths (c:sth) incorrectly + if sys.platform == 'win32': + force = False + drive_or_unc, _ = os.path.splitdrive(s) + elif force: + drive_or_unc = '' + else: + return s + + norm_path = os.path.normpath(remove_start(s, drive_or_unc)).split(os.path.sep) + if drive_or_unc: + norm_path.pop(0) + sanitized_path = [ + path_part if path_part in ['.', '..'] else re.sub(r'(?:[/<>:"\|\\?\*]|[\s.]$)', '#', path_part) + for path_part in norm_path] + if drive_or_unc: + sanitized_path.insert(0, drive_or_unc + os.path.sep) + elif force and s and s[0] == os.path.sep: + sanitized_path.insert(0, os.path.sep) + # TODO: Fix behavioral differences <3.12 + # The workaround using `normpath` only superficially passes tests + # Ref: https://github.com/python/cpython/pull/100351 + return os.path.normpath(os.path.join(*sanitized_path)) + + +def sanitize_url(url, *, scheme='http'): + # Prepend protocol-less URLs with `http:` scheme in order to mitigate + # the number of unwanted failures due to missing protocol + if url is None: + return + elif url.startswith('//'): + return f'{scheme}:{url}' + # Fix some common typos seen so far + COMMON_TYPOS = ( + # https://github.com/ytdl-org/youtube-dl/issues/15649 + (r'^httpss://', r'https://'), + # https://bx1.be/lives/direct-tv/ + (r'^rmtp([es]?)://', r'rtmp\1://'), + ) + for mistake, fixup in COMMON_TYPOS: + if re.match(mistake, url): + return re.sub(mistake, fixup, url) + return url + + +def extract_basic_auth(url): + parts = urllib.parse.urlsplit(url) + if parts.username is None: + return url, None + url = urllib.parse.urlunsplit(parts._replace(netloc=( + parts.hostname if parts.port is None + else '%s:%d' % (parts.hostname, parts.port)))) + auth_payload = base64.b64encode( + ('%s:%s' % (parts.username, parts.password or '')).encode()) + return url, f'Basic {auth_payload.decode()}' + + +def expand_path(s): + """Expand shell variables and ~""" + return os.path.expandvars(compat_expanduser(s)) + + +def orderedSet(iterable, *, lazy=False): + """Remove all duplicates from the input iterable""" + def _iter(): + seen = [] # Do not use set since the items can be unhashable + for x in iterable: + if x not in seen: + seen.append(x) + yield x + + return _iter() if lazy else list(_iter()) + + +def _htmlentity_transform(entity_with_semicolon): + """Transforms an HTML entity to a character.""" + entity = entity_with_semicolon[:-1] + + # Known non-numeric HTML entity + if entity in html.entities.name2codepoint: + return chr(html.entities.name2codepoint[entity]) + + # TODO: HTML5 allows entities without a semicolon. + # E.g. 'Éric' should be decoded as 'Éric'. + if entity_with_semicolon in html.entities.html5: + return html.entities.html5[entity_with_semicolon] + + mobj = re.match(r'#(x[0-9a-fA-F]+|[0-9]+)', entity) + if mobj is not None: + numstr = mobj.group(1) + if numstr.startswith('x'): + base = 16 + numstr = '0%s' % numstr + else: + base = 10 + # See https://github.com/ytdl-org/youtube-dl/issues/7518 + with contextlib.suppress(ValueError): + return chr(int(numstr, base)) + + # Unknown entity in name, return its literal representation + return '&%s;' % entity + + +def unescapeHTML(s): + if s is None: + return None + assert isinstance(s, str) + + return re.sub( + r'&([^&;]+;)', lambda m: _htmlentity_transform(m.group(1)), s) + + +def escapeHTML(text): + return ( + text + .replace('&', '&') + .replace('<', '<') + .replace('>', '>') + .replace('"', '"') + .replace("'", ''') + ) + + +class netrc_from_content(netrc.netrc): + def __init__(self, content): + self.hosts, self.macros = {}, {} + with io.StringIO(content) as stream: + self._parse('-', stream, False) + + +class Popen(subprocess.Popen): + if sys.platform == 'win32': + _startupinfo = subprocess.STARTUPINFO() + _startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + else: + _startupinfo = None + + @staticmethod + def _fix_pyinstaller_ld_path(env): + """Restore LD_LIBRARY_PATH when using PyInstaller + Ref: https://github.com/pyinstaller/pyinstaller/blob/develop/doc/runtime-information.rst#ld_library_path--libpath-considerations + https://github.com/yt-dlp/yt-dlp/issues/4573 + """ + if not hasattr(sys, '_MEIPASS'): + return + + def _fix(key): + orig = env.get(f'{key}_ORIG') + if orig is None: + env.pop(key, None) + else: + env[key] = orig + + _fix('LD_LIBRARY_PATH') # Linux + _fix('DYLD_LIBRARY_PATH') # macOS + + def __init__(self, args, *remaining, env=None, text=False, shell=False, **kwargs): + if env is None: + env = os.environ.copy() + self._fix_pyinstaller_ld_path(env) + + self.__text_mode = kwargs.get('encoding') or kwargs.get('errors') or text or kwargs.get('universal_newlines') + if text is True: + kwargs['universal_newlines'] = True # For 3.6 compatibility + kwargs.setdefault('encoding', 'utf-8') + kwargs.setdefault('errors', 'replace') + + if shell and compat_os_name == 'nt' and kwargs.get('executable') is None: + if not isinstance(args, str): + args = ' '.join(compat_shlex_quote(a) for a in args) + shell = False + args = f'{self.__comspec()} /Q /S /D /V:OFF /C "{args}"' + + super().__init__(args, *remaining, env=env, shell=shell, **kwargs, startupinfo=self._startupinfo) + + def __comspec(self): + comspec = os.environ.get('ComSpec') or os.path.join( + os.environ.get('SystemRoot', ''), 'System32', 'cmd.exe') + if os.path.isabs(comspec): + return comspec + raise FileNotFoundError('shell not found: neither %ComSpec% nor %SystemRoot% is set') + + def communicate_or_kill(self, *args, **kwargs): + try: + return self.communicate(*args, **kwargs) + except BaseException: # Including KeyboardInterrupt + self.kill(timeout=None) + raise + + def kill(self, *, timeout=0): + super().kill() + if timeout != 0: + self.wait(timeout=timeout) + + @classmethod + def run(cls, *args, timeout=None, **kwargs): + with cls(*args, **kwargs) as proc: + default = '' if proc.__text_mode else b'' + stdout, stderr = proc.communicate_or_kill(timeout=timeout) + return stdout or default, stderr or default, proc.returncode + + +def encodeArgument(s): + # Legacy code that uses byte strings + # Uncomment the following line after fixing all post processors + # assert isinstance(s, str), 'Internal error: %r should be of type %r, is %r' % (s, str, type(s)) + return s if isinstance(s, str) else s.decode('ascii') + + +_timetuple = collections.namedtuple('Time', ('hours', 'minutes', 'seconds', 'milliseconds')) + + +def timetuple_from_msec(msec): + secs, msec = divmod(msec, 1000) + mins, secs = divmod(secs, 60) + hrs, mins = divmod(mins, 60) + return _timetuple(hrs, mins, secs, msec) + + +def formatSeconds(secs, delim=':', msec=False): + time = timetuple_from_msec(secs * 1000) + if time.hours: + ret = '%d%s%02d%s%02d' % (time.hours, delim, time.minutes, delim, time.seconds) + elif time.minutes: + ret = '%d%s%02d' % (time.minutes, delim, time.seconds) + else: + ret = '%d' % time.seconds + return '%s.%03d' % (ret, time.milliseconds) if msec else ret + + +def bug_reports_message(before=';'): + from ..update import REPOSITORY + + msg = (f'please report this issue on https://github.com/{REPOSITORY}/issues?q= , ' + 'filling out the appropriate issue template. Confirm you are on the latest version using yt-dlp -U') + + before = before.rstrip() + if not before or before.endswith(('.', '!', '?')): + msg = msg[0].title() + msg[1:] + + return (before + ' ' if before else '') + msg + + +class YoutubeDLError(Exception): + """Base exception for YoutubeDL errors.""" + msg = None + + def __init__(self, msg=None): + if msg is not None: + self.msg = msg + elif self.msg is None: + self.msg = type(self).__name__ + super().__init__(self.msg) + + +class ExtractorError(YoutubeDLError): + """Error during info extraction.""" + + def __init__(self, msg, tb=None, expected=False, cause=None, video_id=None, ie=None): + """ tb, if given, is the original traceback (so that it can be printed out). + If expected is set, this is a normal error message and most likely not a bug in yt-dlp. + """ + from ..networking.exceptions import network_exceptions + if sys.exc_info()[0] in network_exceptions: + expected = True + + self.orig_msg = str(msg) + self.traceback = tb + self.expected = expected + self.cause = cause + self.video_id = video_id + self.ie = ie + self.exc_info = sys.exc_info() # preserve original exception + if isinstance(self.exc_info[1], ExtractorError): + self.exc_info = self.exc_info[1].exc_info + super().__init__(self.__msg) + + @property + def __msg(self): + return ''.join(( + format_field(self.ie, None, '[%s] '), + format_field(self.video_id, None, '%s: '), + self.orig_msg, + format_field(self.cause, None, ' (caused by %r)'), + '' if self.expected else bug_reports_message())) + + def format_traceback(self): + return join_nonempty( + self.traceback and ''.join(traceback.format_tb(self.traceback)), + self.cause and ''.join(traceback.format_exception(None, self.cause, self.cause.__traceback__)[1:]), + delim='\n') or None + + def __setattr__(self, name, value): + super().__setattr__(name, value) + if getattr(self, 'msg', None) and name not in ('msg', 'args'): + self.msg = self.__msg or type(self).__name__ + self.args = (self.msg, ) # Cannot be property + + +class UnsupportedError(ExtractorError): + def __init__(self, url): + super().__init__( + 'Unsupported URL: %s' % url, expected=True) + self.url = url + + +class RegexNotFoundError(ExtractorError): + """Error when a regex didn't match""" + pass + + +class GeoRestrictedError(ExtractorError): + """Geographic restriction Error exception. + + This exception may be thrown when a video is not available from your + geographic location due to geographic restrictions imposed by a website. + """ + + def __init__(self, msg, countries=None, **kwargs): + kwargs['expected'] = True + super().__init__(msg, **kwargs) + self.countries = countries + + +class UserNotLive(ExtractorError): + """Error when a channel/user is not live""" + + def __init__(self, msg=None, **kwargs): + kwargs['expected'] = True + super().__init__(msg or 'The channel is not currently live', **kwargs) + + +class DownloadError(YoutubeDLError): + """Download Error exception. + + This exception may be thrown by FileDownloader objects if they are not + configured to continue on errors. They will contain the appropriate + error message. + """ + + def __init__(self, msg, exc_info=None): + """ exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). """ + super().__init__(msg) + self.exc_info = exc_info + + +class EntryNotInPlaylist(YoutubeDLError): + """Entry not in playlist exception. + + This exception will be thrown by YoutubeDL when a requested entry + is not found in the playlist info_dict + """ + msg = 'Entry not found in info' + + +class SameFileError(YoutubeDLError): + """Same File exception. + + This exception will be thrown by FileDownloader objects if they detect + multiple files would have to be downloaded to the same file on disk. + """ + msg = 'Fixed output name but more than one file to download' + + def __init__(self, filename=None): + if filename is not None: + self.msg += f': {filename}' + super().__init__(self.msg) + + +class PostProcessingError(YoutubeDLError): + """Post Processing exception. + + This exception may be raised by PostProcessor's .run() method to + indicate an error in the postprocessing task. + """ + + +class DownloadCancelled(YoutubeDLError): + """ Exception raised when the download queue should be interrupted """ + msg = 'The download was cancelled' + + +class ExistingVideoReached(DownloadCancelled): + """ --break-on-existing triggered """ + msg = 'Encountered a video that is already in the archive, stopping due to --break-on-existing' + + +class RejectedVideoReached(DownloadCancelled): + """ --break-match-filter triggered """ + msg = 'Encountered a video that did not match filter, stopping due to --break-match-filter' + + +class MaxDownloadsReached(DownloadCancelled): + """ --max-downloads limit has been reached. """ + msg = 'Maximum number of downloads reached, stopping due to --max-downloads' + + +class ReExtractInfo(YoutubeDLError): + """ Video info needs to be re-extracted. """ + + def __init__(self, msg, expected=False): + super().__init__(msg) + self.expected = expected + + +class ThrottledDownload(ReExtractInfo): + """ Download speed below --throttled-rate. """ + msg = 'The download speed is below throttle limit' + + def __init__(self): + super().__init__(self.msg, expected=False) + + +class UnavailableVideoError(YoutubeDLError): + """Unavailable Format exception. + + This exception will be thrown when a video is requested + in a format that is not available for that video. + """ + msg = 'Unable to download video' + + def __init__(self, err=None): + if err is not None: + self.msg += f': {err}' + super().__init__(self.msg) + + +class ContentTooShortError(YoutubeDLError): + """Content Too Short exception. + + This exception may be raised by FileDownloader objects when a file they + download is too small for what the server announced first, indicating + the connection was probably interrupted. + """ + + def __init__(self, downloaded, expected): + super().__init__(f'Downloaded {downloaded} bytes, expected {expected} bytes') + # Both in bytes + self.downloaded = downloaded + self.expected = expected + + +class XAttrMetadataError(YoutubeDLError): + def __init__(self, code=None, msg='Unknown error'): + super().__init__(msg) + self.code = code + self.msg = msg + + # Parsing code and msg + if (self.code in (errno.ENOSPC, errno.EDQUOT) + or 'No space left' in self.msg or 'Disk quota exceeded' in self.msg): + self.reason = 'NO_SPACE' + elif self.code == errno.E2BIG or 'Argument list too long' in self.msg: + self.reason = 'VALUE_TOO_LONG' + else: + self.reason = 'NOT_SUPPORTED' + + +class XAttrUnavailableError(YoutubeDLError): + pass + + +def is_path_like(f): + return isinstance(f, (str, bytes, os.PathLike)) + + +def extract_timezone(date_str): + m = re.search( + r'''(?x) + ^.{8,}? # >=8 char non-TZ prefix, if present + (?P<tz>Z| # just the UTC Z, or + (?:(?<=.\b\d{4}|\b\d{2}:\d\d)| # preceded by 4 digits or hh:mm or + (?<!.\b[a-zA-Z]{3}|[a-zA-Z]{4}|..\b\d\d)) # not preceded by 3 alpha word or >= 4 alpha or 2 digits + [ ]? # optional space + (?P<sign>\+|-) # +/- + (?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2}) # hh[:]mm + $) + ''', date_str) + if not m: + m = re.search(r'\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$', date_str) + timezone = TIMEZONE_NAMES.get(m and m.group('tz').strip()) + if timezone is not None: + date_str = date_str[:-len(m.group('tz'))] + timezone = datetime.timedelta(hours=timezone or 0) + else: + date_str = date_str[:-len(m.group('tz'))] + if not m.group('sign'): + timezone = datetime.timedelta() + else: + sign = 1 if m.group('sign') == '+' else -1 + timezone = datetime.timedelta( + hours=sign * int(m.group('hours')), + minutes=sign * int(m.group('minutes'))) + return timezone, date_str + + +def parse_iso8601(date_str, delimiter='T', timezone=None): + """ Return a UNIX timestamp from the given date """ + + if date_str is None: + return None + + date_str = re.sub(r'\.[0-9]+', '', date_str) + + if timezone is None: + timezone, date_str = extract_timezone(date_str) + + with contextlib.suppress(ValueError): + date_format = f'%Y-%m-%d{delimiter}%H:%M:%S' + dt = datetime.datetime.strptime(date_str, date_format) - timezone + return calendar.timegm(dt.timetuple()) + + +def date_formats(day_first=True): + return DATE_FORMATS_DAY_FIRST if day_first else DATE_FORMATS_MONTH_FIRST + + +def unified_strdate(date_str, day_first=True): + """Return a string with the date in the format YYYYMMDD""" + + if date_str is None: + return None + upload_date = None + # Replace commas + date_str = date_str.replace(',', ' ') + # Remove AM/PM + timezone + date_str = re.sub(r'(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?', '', date_str) + _, date_str = extract_timezone(date_str) + + for expression in date_formats(day_first): + with contextlib.suppress(ValueError): + upload_date = datetime.datetime.strptime(date_str, expression).strftime('%Y%m%d') + if upload_date is None: + timetuple = email.utils.parsedate_tz(date_str) + if timetuple: + with contextlib.suppress(ValueError): + upload_date = datetime.datetime(*timetuple[:6]).strftime('%Y%m%d') + if upload_date is not None: + return str(upload_date) + + +def unified_timestamp(date_str, day_first=True): + if not isinstance(date_str, str): + return None + + date_str = re.sub(r'\s+', ' ', re.sub( + r'(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?)(day)?', '', date_str)) + + pm_delta = 12 if re.search(r'(?i)PM', date_str) else 0 + timezone, date_str = extract_timezone(date_str) + + # Remove AM/PM + timezone + date_str = re.sub(r'(?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?', '', date_str) + + # Remove unrecognized timezones from ISO 8601 alike timestamps + m = re.search(r'\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$', date_str) + if m: + date_str = date_str[:-len(m.group('tz'))] + + # Python only supports microseconds, so remove nanoseconds + m = re.search(r'^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$', date_str) + if m: + date_str = m.group(1) + + for expression in date_formats(day_first): + with contextlib.suppress(ValueError): + dt = datetime.datetime.strptime(date_str, expression) - timezone + datetime.timedelta(hours=pm_delta) + return calendar.timegm(dt.timetuple()) + + timetuple = email.utils.parsedate_tz(date_str) + if timetuple: + return calendar.timegm(timetuple) + pm_delta * 3600 - timezone.total_seconds() + + +def determine_ext(url, default_ext='unknown_video'): + if url is None or '.' not in url: + return default_ext + guess = url.partition('?')[0].rpartition('.')[2] + if re.match(r'^[A-Za-z0-9]+$', guess): + return guess + # Try extract ext from URLs like http://example.com/foo/bar.mp4/?download + elif guess.rstrip('/') in KNOWN_EXTENSIONS: + return guess.rstrip('/') + else: + return default_ext + + +def subtitles_filename(filename, sub_lang, sub_format, expected_real_ext=None): + return replace_extension(filename, sub_lang + '.' + sub_format, expected_real_ext) + + +def datetime_from_str(date_str, precision='auto', format='%Y%m%d'): + R""" + Return a datetime object from a string. + Supported format: + (now|today|yesterday|DATE)([+-]\d+(microsecond|second|minute|hour|day|week|month|year)s?)? + + @param format strftime format of DATE + @param precision Round the datetime object: auto|microsecond|second|minute|hour|day + auto: round to the unit provided in date_str (if applicable). + """ + auto_precision = False + if precision == 'auto': + auto_precision = True + precision = 'microsecond' + today = datetime_round(datetime.datetime.now(datetime.timezone.utc), precision) + if date_str in ('now', 'today'): + return today + if date_str == 'yesterday': + return today - datetime.timedelta(days=1) + match = re.match( + r'(?P<start>.+)(?P<sign>[+-])(?P<time>\d+)(?P<unit>microsecond|second|minute|hour|day|week|month|year)s?', + date_str) + if match is not None: + start_time = datetime_from_str(match.group('start'), precision, format) + time = int(match.group('time')) * (-1 if match.group('sign') == '-' else 1) + unit = match.group('unit') + if unit == 'month' or unit == 'year': + new_date = datetime_add_months(start_time, time * 12 if unit == 'year' else time) + unit = 'day' + else: + if unit == 'week': + unit = 'day' + time *= 7 + delta = datetime.timedelta(**{unit + 's': time}) + new_date = start_time + delta + if auto_precision: + return datetime_round(new_date, unit) + return new_date + + return datetime_round(datetime.datetime.strptime(date_str, format), precision) + + +def date_from_str(date_str, format='%Y%m%d', strict=False): + R""" + Return a date object from a string using datetime_from_str + + @param strict Restrict allowed patterns to "YYYYMMDD" and + (now|today|yesterday)(-\d+(day|week|month|year)s?)? + """ + if strict and not re.fullmatch(r'\d{8}|(now|today|yesterday)(-\d+(day|week|month|year)s?)?', date_str): + raise ValueError(f'Invalid date format "{date_str}"') + return datetime_from_str(date_str, precision='microsecond', format=format).date() + + +def datetime_add_months(dt, months): + """Increment/Decrement a datetime object by months.""" + month = dt.month + months - 1 + year = dt.year + month // 12 + month = month % 12 + 1 + day = min(dt.day, calendar.monthrange(year, month)[1]) + return dt.replace(year, month, day) + + +def datetime_round(dt, precision='day'): + """ + Round a datetime object's time to a specific precision + """ + if precision == 'microsecond': + return dt + + unit_seconds = { + 'day': 86400, + 'hour': 3600, + 'minute': 60, + 'second': 1, + } + roundto = lambda x, n: ((x + n / 2) // n) * n + timestamp = roundto(calendar.timegm(dt.timetuple()), unit_seconds[precision]) + return datetime.datetime.fromtimestamp(timestamp, datetime.timezone.utc) + + +def hyphenate_date(date_str): + """ + Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' format""" + match = re.match(r'^(\d\d\d\d)(\d\d)(\d\d)$', date_str) + if match is not None: + return '-'.join(match.groups()) + else: + return date_str + + +class DateRange: + """Represents a time interval between two dates""" + + def __init__(self, start=None, end=None): + """start and end must be strings in the format accepted by date""" + if start is not None: + self.start = date_from_str(start, strict=True) + else: + self.start = datetime.datetime.min.date() + if end is not None: + self.end = date_from_str(end, strict=True) + else: + self.end = datetime.datetime.max.date() + if self.start > self.end: + raise ValueError('Date range: "%s" , the start date must be before the end date' % self) + + @classmethod + def day(cls, day): + """Returns a range that only contains the given day""" + return cls(day, day) + + def __contains__(self, date): + """Check if the date is in the range""" + if not isinstance(date, datetime.date): + date = date_from_str(date) + return self.start <= date <= self.end + + def __repr__(self): + return f'{__name__}.{type(self).__name__}({self.start.isoformat()!r}, {self.end.isoformat()!r})' + + def __eq__(self, other): + return (isinstance(other, DateRange) + and self.start == other.start and self.end == other.end) + + +@functools.cache +def system_identifier(): + python_implementation = platform.python_implementation() + if python_implementation == 'PyPy' and hasattr(sys, 'pypy_version_info'): + python_implementation += ' version %d.%d.%d' % sys.pypy_version_info[:3] + libc_ver = [] + with contextlib.suppress(OSError): # We may not have access to the executable + libc_ver = platform.libc_ver() + + return 'Python %s (%s %s %s) - %s (%s%s)' % ( + platform.python_version(), + python_implementation, + platform.machine(), + platform.architecture()[0], + platform.platform(), + ssl.OPENSSL_VERSION, + format_field(join_nonempty(*libc_ver, delim=' '), None, ', %s'), + ) + + +@functools.cache +def get_windows_version(): + ''' Get Windows version. returns () if it's not running on Windows ''' + if compat_os_name == 'nt': + return version_tuple(platform.win32_ver()[1]) + else: + return () + + +def write_string(s, out=None, encoding=None): + assert isinstance(s, str) + out = out or sys.stderr + # `sys.stderr` might be `None` (Ref: https://github.com/pyinstaller/pyinstaller/pull/7217) + if not out: + return + + if compat_os_name == 'nt' and supports_terminal_sequences(out): + s = re.sub(r'([\r\n]+)', r' \1', s) + + enc, buffer = None, out + if 'b' in getattr(out, 'mode', ''): + enc = encoding or preferredencoding() + elif hasattr(out, 'buffer'): + buffer = out.buffer + enc = encoding or getattr(out, 'encoding', None) or preferredencoding() + + buffer.write(s.encode(enc, 'ignore') if enc else s) + out.flush() + + +# TODO: Use global logger +def deprecation_warning(msg, *, printer=None, stacklevel=0, **kwargs): + from .. import _IN_CLI + if _IN_CLI: + if msg in deprecation_warning._cache: + return + deprecation_warning._cache.add(msg) + if printer: + return printer(f'{msg}{bug_reports_message()}', **kwargs) + return write_string(f'ERROR: {msg}{bug_reports_message()}\n', **kwargs) + else: + import warnings + warnings.warn(DeprecationWarning(msg), stacklevel=stacklevel + 3) + + +deprecation_warning._cache = set() + + +def bytes_to_intlist(bs): + if not bs: + return [] + if isinstance(bs[0], int): # Python 3 + return list(bs) + else: + return [ord(c) for c in bs] + + +def intlist_to_bytes(xs): + if not xs: + return b'' + return struct.pack('%dB' % len(xs), *xs) + + +class LockingUnsupportedError(OSError): + msg = 'File locking is not supported' + + def __init__(self): + super().__init__(self.msg) + + +# Cross-platform file locking +if sys.platform == 'win32': + import ctypes + import ctypes.wintypes + import msvcrt + + class OVERLAPPED(ctypes.Structure): + _fields_ = [ + ('Internal', ctypes.wintypes.LPVOID), + ('InternalHigh', ctypes.wintypes.LPVOID), + ('Offset', ctypes.wintypes.DWORD), + ('OffsetHigh', ctypes.wintypes.DWORD), + ('hEvent', ctypes.wintypes.HANDLE), + ] + + kernel32 = ctypes.WinDLL('kernel32') + LockFileEx = kernel32.LockFileEx + LockFileEx.argtypes = [ + ctypes.wintypes.HANDLE, # hFile + ctypes.wintypes.DWORD, # dwFlags + ctypes.wintypes.DWORD, # dwReserved + ctypes.wintypes.DWORD, # nNumberOfBytesToLockLow + ctypes.wintypes.DWORD, # nNumberOfBytesToLockHigh + ctypes.POINTER(OVERLAPPED) # Overlapped + ] + LockFileEx.restype = ctypes.wintypes.BOOL + UnlockFileEx = kernel32.UnlockFileEx + UnlockFileEx.argtypes = [ + ctypes.wintypes.HANDLE, # hFile + ctypes.wintypes.DWORD, # dwReserved + ctypes.wintypes.DWORD, # nNumberOfBytesToLockLow + ctypes.wintypes.DWORD, # nNumberOfBytesToLockHigh + ctypes.POINTER(OVERLAPPED) # Overlapped + ] + UnlockFileEx.restype = ctypes.wintypes.BOOL + whole_low = 0xffffffff + whole_high = 0x7fffffff + + def _lock_file(f, exclusive, block): + overlapped = OVERLAPPED() + overlapped.Offset = 0 + overlapped.OffsetHigh = 0 + overlapped.hEvent = 0 + f._lock_file_overlapped_p = ctypes.pointer(overlapped) + + if not LockFileEx(msvcrt.get_osfhandle(f.fileno()), + (0x2 if exclusive else 0x0) | (0x0 if block else 0x1), + 0, whole_low, whole_high, f._lock_file_overlapped_p): + # NB: No argument form of "ctypes.FormatError" does not work on PyPy + raise BlockingIOError(f'Locking file failed: {ctypes.FormatError(ctypes.GetLastError())!r}') + + def _unlock_file(f): + assert f._lock_file_overlapped_p + handle = msvcrt.get_osfhandle(f.fileno()) + if not UnlockFileEx(handle, 0, whole_low, whole_high, f._lock_file_overlapped_p): + raise OSError('Unlocking file failed: %r' % ctypes.FormatError()) + +else: + try: + import fcntl + + def _lock_file(f, exclusive, block): + flags = fcntl.LOCK_EX if exclusive else fcntl.LOCK_SH + if not block: + flags |= fcntl.LOCK_NB + try: + fcntl.flock(f, flags) + except BlockingIOError: + raise + except OSError: # AOSP does not have flock() + fcntl.lockf(f, flags) + + def _unlock_file(f): + with contextlib.suppress(OSError): + return fcntl.flock(f, fcntl.LOCK_UN) + with contextlib.suppress(OSError): + return fcntl.lockf(f, fcntl.LOCK_UN) # AOSP does not have flock() + return fcntl.flock(f, fcntl.LOCK_UN | fcntl.LOCK_NB) # virtiofs needs LOCK_NB on unlocking + + except ImportError: + + def _lock_file(f, exclusive, block): + raise LockingUnsupportedError() + + def _unlock_file(f): + raise LockingUnsupportedError() + + +class locked_file: + locked = False + + def __init__(self, filename, mode, block=True, encoding=None): + if mode not in {'r', 'rb', 'a', 'ab', 'w', 'wb'}: + raise NotImplementedError(mode) + self.mode, self.block = mode, block + + writable = any(f in mode for f in 'wax+') + readable = any(f in mode for f in 'r+') + flags = functools.reduce(operator.ior, ( + getattr(os, 'O_CLOEXEC', 0), # UNIX only + getattr(os, 'O_BINARY', 0), # Windows only + getattr(os, 'O_NOINHERIT', 0), # Windows only + os.O_CREAT if writable else 0, # O_TRUNC only after locking + os.O_APPEND if 'a' in mode else 0, + os.O_EXCL if 'x' in mode else 0, + os.O_RDONLY if not writable else os.O_RDWR if readable else os.O_WRONLY, + )) + + self.f = os.fdopen(os.open(filename, flags, 0o666), mode, encoding=encoding) + + def __enter__(self): + exclusive = 'r' not in self.mode + try: + _lock_file(self.f, exclusive, self.block) + self.locked = True + except OSError: + self.f.close() + raise + if 'w' in self.mode: + try: + self.f.truncate() + except OSError as e: + if e.errno not in ( + errno.ESPIPE, # Illegal seek - expected for FIFO + errno.EINVAL, # Invalid argument - expected for /dev/null + ): + raise + return self + + def unlock(self): + if not self.locked: + return + try: + _unlock_file(self.f) + finally: + self.locked = False + + def __exit__(self, *_): + try: + self.unlock() + finally: + self.f.close() + + open = __enter__ + close = __exit__ + + def __getattr__(self, attr): + return getattr(self.f, attr) + + def __iter__(self): + return iter(self.f) + + +@functools.cache +def get_filesystem_encoding(): + encoding = sys.getfilesystemencoding() + return encoding if encoding is not None else 'utf-8' + + +def shell_quote(args): + quoted_args = [] + encoding = get_filesystem_encoding() + for a in args: + if isinstance(a, bytes): + # We may get a filename encoded with 'encodeFilename' + a = a.decode(encoding) + quoted_args.append(compat_shlex_quote(a)) + return ' '.join(quoted_args) + + +def smuggle_url(url, data): + """ Pass additional data in a URL for internal use. """ + + url, idata = unsmuggle_url(url, {}) + data.update(idata) + sdata = urllib.parse.urlencode( + {'__youtubedl_smuggle': json.dumps(data)}) + return url + '#' + sdata + + +def unsmuggle_url(smug_url, default=None): + if '#__youtubedl_smuggle' not in smug_url: + return smug_url, default + url, _, sdata = smug_url.rpartition('#') + jsond = urllib.parse.parse_qs(sdata)['__youtubedl_smuggle'][0] + data = json.loads(jsond) + return url, data + + +def format_decimal_suffix(num, fmt='%d%s', *, factor=1000): + """ Formats numbers with decimal sufixes like K, M, etc """ + num, factor = float_or_none(num), float(factor) + if num is None or num < 0: + return None + POSSIBLE_SUFFIXES = 'kMGTPEZY' + exponent = 0 if num == 0 else min(int(math.log(num, factor)), len(POSSIBLE_SUFFIXES)) + suffix = ['', *POSSIBLE_SUFFIXES][exponent] + if factor == 1024: + suffix = {'k': 'Ki', '': ''}.get(suffix, f'{suffix}i') + converted = num / (factor ** exponent) + return fmt % (converted, suffix) + + +def format_bytes(bytes): + return format_decimal_suffix(bytes, '%.2f%sB', factor=1024) or 'N/A' + + +def lookup_unit_table(unit_table, s, strict=False): + num_re = NUMBER_RE if strict else NUMBER_RE.replace(R'\.', '[,.]') + units_re = '|'.join(re.escape(u) for u in unit_table) + m = (re.fullmatch if strict else re.match)( + rf'(?P<num>{num_re})\s*(?P<unit>{units_re})\b', s) + if not m: + return None + + num = float(m.group('num').replace(',', '.')) + mult = unit_table[m.group('unit')] + return round(num * mult) + + +def parse_bytes(s): + """Parse a string indicating a byte quantity into an integer""" + return lookup_unit_table( + {u: 1024**i for i, u in enumerate(['', *'KMGTPEZY'])}, + s.upper(), strict=True) + + +def parse_filesize(s): + if s is None: + return None + + # The lower-case forms are of course incorrect and unofficial, + # but we support those too + _UNIT_TABLE = { + 'B': 1, + 'b': 1, + 'bytes': 1, + 'KiB': 1024, + 'KB': 1000, + 'kB': 1024, + 'Kb': 1000, + 'kb': 1000, + 'kilobytes': 1000, + 'kibibytes': 1024, + 'MiB': 1024 ** 2, + 'MB': 1000 ** 2, + 'mB': 1024 ** 2, + 'Mb': 1000 ** 2, + 'mb': 1000 ** 2, + 'megabytes': 1000 ** 2, + 'mebibytes': 1024 ** 2, + 'GiB': 1024 ** 3, + 'GB': 1000 ** 3, + 'gB': 1024 ** 3, + 'Gb': 1000 ** 3, + 'gb': 1000 ** 3, + 'gigabytes': 1000 ** 3, + 'gibibytes': 1024 ** 3, + 'TiB': 1024 ** 4, + 'TB': 1000 ** 4, + 'tB': 1024 ** 4, + 'Tb': 1000 ** 4, + 'tb': 1000 ** 4, + 'terabytes': 1000 ** 4, + 'tebibytes': 1024 ** 4, + 'PiB': 1024 ** 5, + 'PB': 1000 ** 5, + 'pB': 1024 ** 5, + 'Pb': 1000 ** 5, + 'pb': 1000 ** 5, + 'petabytes': 1000 ** 5, + 'pebibytes': 1024 ** 5, + 'EiB': 1024 ** 6, + 'EB': 1000 ** 6, + 'eB': 1024 ** 6, + 'Eb': 1000 ** 6, + 'eb': 1000 ** 6, + 'exabytes': 1000 ** 6, + 'exbibytes': 1024 ** 6, + 'ZiB': 1024 ** 7, + 'ZB': 1000 ** 7, + 'zB': 1024 ** 7, + 'Zb': 1000 ** 7, + 'zb': 1000 ** 7, + 'zettabytes': 1000 ** 7, + 'zebibytes': 1024 ** 7, + 'YiB': 1024 ** 8, + 'YB': 1000 ** 8, + 'yB': 1024 ** 8, + 'Yb': 1000 ** 8, + 'yb': 1000 ** 8, + 'yottabytes': 1000 ** 8, + 'yobibytes': 1024 ** 8, + } + + return lookup_unit_table(_UNIT_TABLE, s) + + +def parse_count(s): + if s is None: + return None + + s = re.sub(r'^[^\d]+\s', '', s).strip() + + if re.match(r'^[\d,.]+$', s): + return str_to_int(s) + + _UNIT_TABLE = { + 'k': 1000, + 'K': 1000, + 'm': 1000 ** 2, + 'M': 1000 ** 2, + 'kk': 1000 ** 2, + 'KK': 1000 ** 2, + 'b': 1000 ** 3, + 'B': 1000 ** 3, + } + + ret = lookup_unit_table(_UNIT_TABLE, s) + if ret is not None: + return ret + + mobj = re.match(r'([\d,.]+)(?:$|\s)', s) + if mobj: + return str_to_int(mobj.group(1)) + + +def parse_resolution(s, *, lenient=False): + if s is None: + return {} + + if lenient: + mobj = re.search(r'(?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)', s) + else: + mobj = re.search(r'(?<![a-zA-Z0-9])(?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)(?![a-zA-Z0-9])', s) + if mobj: + return { + 'width': int(mobj.group('w')), + 'height': int(mobj.group('h')), + } + + mobj = re.search(r'(?<![a-zA-Z0-9])(\d+)[pPiI](?![a-zA-Z0-9])', s) + if mobj: + return {'height': int(mobj.group(1))} + + mobj = re.search(r'\b([48])[kK]\b', s) + if mobj: + return {'height': int(mobj.group(1)) * 540} + + return {} + + +def parse_bitrate(s): + if not isinstance(s, str): + return + mobj = re.search(r'\b(\d+)\s*kbps', s) + if mobj: + return int(mobj.group(1)) + + +def month_by_name(name, lang='en'): + """ Return the number of a month by (locale-independently) English name """ + + month_names = MONTH_NAMES.get(lang, MONTH_NAMES['en']) + + try: + return month_names.index(name) + 1 + except ValueError: + return None + + +def month_by_abbreviation(abbrev): + """ Return the number of a month by (locale-independently) English + abbreviations """ + + try: + return [s[:3] for s in ENGLISH_MONTH_NAMES].index(abbrev) + 1 + except ValueError: + return None + + +def fix_xml_ampersands(xml_str): + """Replace all the '&' by '&' in XML""" + return re.sub( + r'&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)', + '&', + xml_str) + + +def setproctitle(title): + assert isinstance(title, str) + + # Workaround for https://github.com/yt-dlp/yt-dlp/issues/4541 + try: + import ctypes + except ImportError: + return + + try: + libc = ctypes.cdll.LoadLibrary('libc.so.6') + except OSError: + return + except TypeError: + # LoadLibrary in Windows Python 2.7.13 only expects + # a bytestring, but since unicode_literals turns + # every string into a unicode string, it fails. + return + title_bytes = title.encode() + buf = ctypes.create_string_buffer(len(title_bytes)) + buf.value = title_bytes + try: + libc.prctl(15, buf, 0, 0, 0) + except AttributeError: + return # Strange libc, just skip this + + +def remove_start(s, start): + return s[len(start):] if s is not None and s.startswith(start) else s + + +def remove_end(s, end): + return s[:-len(end)] if s is not None and s.endswith(end) else s + + +def remove_quotes(s): + if s is None or len(s) < 2: + return s + for quote in ('"', "'", ): + if s[0] == quote and s[-1] == quote: + return s[1:-1] + return s + + +def get_domain(url): + """ + This implementation is inconsistent, but is kept for compatibility. + Use this only for "webpage_url_domain" + """ + return remove_start(urllib.parse.urlparse(url).netloc, 'www.') or None + + +def url_basename(url): + path = urllib.parse.urlparse(url).path + return path.strip('/').split('/')[-1] + + +def base_url(url): + return re.match(r'https?://[^?#]+/', url).group() + + +def urljoin(base, path): + if isinstance(path, bytes): + path = path.decode() + if not isinstance(path, str) or not path: + return None + if re.match(r'^(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//', path): + return path + if isinstance(base, bytes): + base = base.decode() + if not isinstance(base, str) or not re.match( + r'^(?:https?:)?//', base): + return None + return urllib.parse.urljoin(base, path) + + +def int_or_none(v, scale=1, default=None, get_attr=None, invscale=1): + if get_attr and v is not None: + v = getattr(v, get_attr, None) + try: + return int(v) * invscale // scale + except (ValueError, TypeError, OverflowError): + return default + + +def str_or_none(v, default=None): + return default if v is None else str(v) + + +def str_to_int(int_str): + """ A more relaxed version of int_or_none """ + if isinstance(int_str, int): + return int_str + elif isinstance(int_str, str): + int_str = re.sub(r'[,\.\+]', '', int_str) + return int_or_none(int_str) + + +def float_or_none(v, scale=1, invscale=1, default=None): + if v is None: + return default + try: + return float(v) * invscale / scale + except (ValueError, TypeError): + return default + + +def bool_or_none(v, default=None): + return v if isinstance(v, bool) else default + + +def strip_or_none(v, default=None): + return v.strip() if isinstance(v, str) else default + + +def url_or_none(url): + if not url or not isinstance(url, str): + return None + url = url.strip() + return url if re.match(r'^(?:(?:https?|rt(?:m(?:pt?[es]?|fp)|sp[su]?)|mms|ftps?):)?//', url) else None + + +def strftime_or_none(timestamp, date_format='%Y%m%d', default=None): + datetime_object = None + try: + if isinstance(timestamp, (int, float)): # unix timestamp + # Using naive datetime here can break timestamp() in Windows + # Ref: https://github.com/yt-dlp/yt-dlp/issues/5185, https://github.com/python/cpython/issues/94414 + # Also, datetime.datetime.fromtimestamp breaks for negative timestamps + # Ref: https://github.com/yt-dlp/yt-dlp/issues/6706#issuecomment-1496842642 + datetime_object = (datetime.datetime.fromtimestamp(0, datetime.timezone.utc) + + datetime.timedelta(seconds=timestamp)) + elif isinstance(timestamp, str): # assume YYYYMMDD + datetime_object = datetime.datetime.strptime(timestamp, '%Y%m%d') + date_format = re.sub( # Support %s on windows + r'(?<!%)(%%)*%s', rf'\g<1>{int(datetime_object.timestamp())}', date_format) + return datetime_object.strftime(date_format) + except (ValueError, TypeError, AttributeError): + return default + + +def parse_duration(s): + if not isinstance(s, str): + return None + s = s.strip() + if not s: + return None + + days, hours, mins, secs, ms = [None] * 5 + m = re.match(r'''(?x) + (?P<before_secs> + (?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)? + (?P<secs>(?(before_secs)[0-9]{1,2}|[0-9]+)) + (?P<ms>[.:][0-9]+)?Z?$ + ''', s) + if m: + days, hours, mins, secs, ms = m.group('days', 'hours', 'mins', 'secs', 'ms') + else: + m = re.match( + r'''(?ix)(?:P? + (?: + [0-9]+\s*y(?:ears?)?,?\s* + )? + (?: + [0-9]+\s*m(?:onths?)?,?\s* + )? + (?: + [0-9]+\s*w(?:eeks?)?,?\s* + )? + (?: + (?P<days>[0-9]+)\s*d(?:ays?)?,?\s* + )? + T)? + (?: + (?P<hours>[0-9]+)\s*h(?:(?:ou)?rs?)?,?\s* + )? + (?: + (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?,?\s* + )? + (?: + (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s* + )?Z?$''', s) + if m: + days, hours, mins, secs, ms = m.groups() + else: + m = re.match(r'(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$', s) + if m: + hours, mins = m.groups() + else: + return None + + if ms: + ms = ms.replace(':', '.') + return sum(float(part or 0) * mult for part, mult in ( + (days, 86400), (hours, 3600), (mins, 60), (secs, 1), (ms, 1))) + + +def prepend_extension(filename, ext, expected_real_ext=None): + name, real_ext = os.path.splitext(filename) + return ( + f'{name}.{ext}{real_ext}' + if not expected_real_ext or real_ext[1:] == expected_real_ext + else f'{filename}.{ext}') + + +def replace_extension(filename, ext, expected_real_ext=None): + name, real_ext = os.path.splitext(filename) + return '{}.{}'.format( + name if not expected_real_ext or real_ext[1:] == expected_real_ext else filename, + ext) + + +def check_executable(exe, args=[]): + """ Checks if the given binary is installed somewhere in PATH, and returns its name. + args can be a list of arguments for a short output (like -version) """ + try: + Popen.run([exe] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except OSError: + return False + return exe + + +def _get_exe_version_output(exe, args): + try: + # STDIN should be redirected too. On UNIX-like systems, ffmpeg triggers + # SIGTTOU if yt-dlp is run in the background. + # See https://github.com/ytdl-org/youtube-dl/issues/955#issuecomment-209789656 + stdout, _, ret = Popen.run([encodeArgument(exe)] + args, text=True, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + if ret: + return None + except OSError: + return False + return stdout + + +def detect_exe_version(output, version_re=None, unrecognized='present'): + assert isinstance(output, str) + if version_re is None: + version_re = r'version\s+([-0-9._a-zA-Z]+)' + m = re.search(version_re, output) + if m: + return m.group(1) + else: + return unrecognized + + +def get_exe_version(exe, args=['--version'], + version_re=None, unrecognized=('present', 'broken')): + """ Returns the version of the specified executable, + or False if the executable is not present """ + unrecognized = variadic(unrecognized) + assert len(unrecognized) in (1, 2) + out = _get_exe_version_output(exe, args) + if out is None: + return unrecognized[-1] + return out and detect_exe_version(out, version_re, unrecognized[0]) + + +def frange(start=0, stop=None, step=1): + """Float range""" + if stop is None: + start, stop = 0, start + sign = [-1, 1][step > 0] if step else 0 + while sign * start < sign * stop: + yield start + start += step + + +class LazyList(collections.abc.Sequence): + """Lazy immutable list from an iterable + Note that slices of a LazyList are lists and not LazyList""" + + class IndexError(IndexError): + pass + + def __init__(self, iterable, *, reverse=False, _cache=None): + self._iterable = iter(iterable) + self._cache = [] if _cache is None else _cache + self._reversed = reverse + + def __iter__(self): + if self._reversed: + # We need to consume the entire iterable to iterate in reverse + yield from self.exhaust() + return + yield from self._cache + for item in self._iterable: + self._cache.append(item) + yield item + + def _exhaust(self): + self._cache.extend(self._iterable) + self._iterable = [] # Discard the emptied iterable to make it pickle-able + return self._cache + + def exhaust(self): + """Evaluate the entire iterable""" + return self._exhaust()[::-1 if self._reversed else 1] + + @staticmethod + def _reverse_index(x): + return None if x is None else ~x + + def __getitem__(self, idx): + if isinstance(idx, slice): + if self._reversed: + idx = slice(self._reverse_index(idx.start), self._reverse_index(idx.stop), -(idx.step or 1)) + start, stop, step = idx.start, idx.stop, idx.step or 1 + elif isinstance(idx, int): + if self._reversed: + idx = self._reverse_index(idx) + start, stop, step = idx, idx, 0 + else: + raise TypeError('indices must be integers or slices') + if ((start or 0) < 0 or (stop or 0) < 0 + or (start is None and step < 0) + or (stop is None and step > 0)): + # We need to consume the entire iterable to be able to slice from the end + # Obviously, never use this with infinite iterables + self._exhaust() + try: + return self._cache[idx] + except IndexError as e: + raise self.IndexError(e) from e + n = max(start or 0, stop or 0) - len(self._cache) + 1 + if n > 0: + self._cache.extend(itertools.islice(self._iterable, n)) + try: + return self._cache[idx] + except IndexError as e: + raise self.IndexError(e) from e + + def __bool__(self): + try: + self[-1] if self._reversed else self[0] + except self.IndexError: + return False + return True + + def __len__(self): + self._exhaust() + return len(self._cache) + + def __reversed__(self): + return type(self)(self._iterable, reverse=not self._reversed, _cache=self._cache) + + def __copy__(self): + return type(self)(self._iterable, reverse=self._reversed, _cache=self._cache) + + def __repr__(self): + # repr and str should mimic a list. So we exhaust the iterable + return repr(self.exhaust()) + + def __str__(self): + return repr(self.exhaust()) + + +class PagedList: + + class IndexError(IndexError): + pass + + def __len__(self): + # This is only useful for tests + return len(self.getslice()) + + def __init__(self, pagefunc, pagesize, use_cache=True): + self._pagefunc = pagefunc + self._pagesize = pagesize + self._pagecount = float('inf') + self._use_cache = use_cache + self._cache = {} + + def getpage(self, pagenum): + page_results = self._cache.get(pagenum) + if page_results is None: + page_results = [] if pagenum > self._pagecount else list(self._pagefunc(pagenum)) + if self._use_cache: + self._cache[pagenum] = page_results + return page_results + + def getslice(self, start=0, end=None): + return list(self._getslice(start, end)) + + def _getslice(self, start, end): + raise NotImplementedError('This method must be implemented by subclasses') + + def __getitem__(self, idx): + assert self._use_cache, 'Indexing PagedList requires cache' + if not isinstance(idx, int) or idx < 0: + raise TypeError('indices must be non-negative integers') + entries = self.getslice(idx, idx + 1) + if not entries: + raise self.IndexError() + return entries[0] + + +class OnDemandPagedList(PagedList): + """Download pages until a page with less than maximum results""" + + def _getslice(self, start, end): + for pagenum in itertools.count(start // self._pagesize): + firstid = pagenum * self._pagesize + nextfirstid = pagenum * self._pagesize + self._pagesize + if start >= nextfirstid: + continue + + startv = ( + start % self._pagesize + if firstid <= start < nextfirstid + else 0) + endv = ( + ((end - 1) % self._pagesize) + 1 + if (end is not None and firstid <= end <= nextfirstid) + else None) + + try: + page_results = self.getpage(pagenum) + except Exception: + self._pagecount = pagenum - 1 + raise + if startv != 0 or endv is not None: + page_results = page_results[startv:endv] + yield from page_results + + # A little optimization - if current page is not "full", ie. does + # not contain page_size videos then we can assume that this page + # is the last one - there are no more ids on further pages - + # i.e. no need to query again. + if len(page_results) + startv < self._pagesize: + break + + # If we got the whole page, but the next page is not interesting, + # break out early as well + if end == nextfirstid: + break + + +class InAdvancePagedList(PagedList): + """PagedList with total number of pages known in advance""" + + def __init__(self, pagefunc, pagecount, pagesize): + PagedList.__init__(self, pagefunc, pagesize, True) + self._pagecount = pagecount + + def _getslice(self, start, end): + start_page = start // self._pagesize + end_page = self._pagecount if end is None else min(self._pagecount, end // self._pagesize + 1) + skip_elems = start - start_page * self._pagesize + only_more = None if end is None else end - start + for pagenum in range(start_page, end_page): + page_results = self.getpage(pagenum) + if skip_elems: + page_results = page_results[skip_elems:] + skip_elems = None + if only_more is not None: + if len(page_results) < only_more: + only_more -= len(page_results) + else: + yield from page_results[:only_more] + break + yield from page_results + + +class PlaylistEntries: + MissingEntry = object() + is_exhausted = False + + def __init__(self, ydl, info_dict): + self.ydl = ydl + + # _entries must be assigned now since infodict can change during iteration + entries = info_dict.get('entries') + if entries is None: + raise EntryNotInPlaylist('There are no entries') + elif isinstance(entries, list): + self.is_exhausted = True + + requested_entries = info_dict.get('requested_entries') + self.is_incomplete = requested_entries is not None + if self.is_incomplete: + assert self.is_exhausted + self._entries = [self.MissingEntry] * max(requested_entries or [0]) + for i, entry in zip(requested_entries, entries): + self._entries[i - 1] = entry + elif isinstance(entries, (list, PagedList, LazyList)): + self._entries = entries + else: + self._entries = LazyList(entries) + + PLAYLIST_ITEMS_RE = re.compile(r'''(?x) + (?P<start>[+-]?\d+)? + (?P<range>[:-] + (?P<end>[+-]?\d+|inf(?:inite)?)? + (?::(?P<step>[+-]?\d+))? + )?''') + + @classmethod + def parse_playlist_items(cls, string): + for segment in string.split(','): + if not segment: + raise ValueError('There is two or more consecutive commas') + mobj = cls.PLAYLIST_ITEMS_RE.fullmatch(segment) + if not mobj: + raise ValueError(f'{segment!r} is not a valid specification') + start, end, step, has_range = mobj.group('start', 'end', 'step', 'range') + if int_or_none(step) == 0: + raise ValueError(f'Step in {segment!r} cannot be zero') + yield slice(int_or_none(start), float_or_none(end), int_or_none(step)) if has_range else int(start) + + def get_requested_items(self): + playlist_items = self.ydl.params.get('playlist_items') + playlist_start = self.ydl.params.get('playliststart', 1) + playlist_end = self.ydl.params.get('playlistend') + # For backwards compatibility, interpret -1 as whole list + if playlist_end in (-1, None): + playlist_end = '' + if not playlist_items: + playlist_items = f'{playlist_start}:{playlist_end}' + elif playlist_start != 1 or playlist_end: + self.ydl.report_warning('Ignoring playliststart and playlistend because playlistitems was given', only_once=True) + + for index in self.parse_playlist_items(playlist_items): + for i, entry in self[index]: + yield i, entry + if not entry: + continue + try: + # The item may have just been added to archive. Don't break due to it + if not self.ydl.params.get('lazy_playlist'): + # TODO: Add auto-generated fields + self.ydl._match_entry(entry, incomplete=True, silent=True) + except (ExistingVideoReached, RejectedVideoReached): + return + + def get_full_count(self): + if self.is_exhausted and not self.is_incomplete: + return len(self) + elif isinstance(self._entries, InAdvancePagedList): + if self._entries._pagesize == 1: + return self._entries._pagecount + + @functools.cached_property + def _getter(self): + if isinstance(self._entries, list): + def get_entry(i): + try: + entry = self._entries[i] + except IndexError: + entry = self.MissingEntry + if not self.is_incomplete: + raise self.IndexError() + if entry is self.MissingEntry: + raise EntryNotInPlaylist(f'Entry {i + 1} cannot be found') + return entry + else: + def get_entry(i): + try: + return type(self.ydl)._handle_extraction_exceptions(lambda _, i: self._entries[i])(self.ydl, i) + except (LazyList.IndexError, PagedList.IndexError): + raise self.IndexError() + return get_entry + + def __getitem__(self, idx): + if isinstance(idx, int): + idx = slice(idx, idx) + + # NB: PlaylistEntries[1:10] => (0, 1, ... 9) + step = 1 if idx.step is None else idx.step + if idx.start is None: + start = 0 if step > 0 else len(self) - 1 + else: + start = idx.start - 1 if idx.start >= 0 else len(self) + idx.start + + # NB: Do not call len(self) when idx == [:] + if idx.stop is None: + stop = 0 if step < 0 else float('inf') + else: + stop = idx.stop - 1 if idx.stop >= 0 else len(self) + idx.stop + stop += [-1, 1][step > 0] + + for i in frange(start, stop, step): + if i < 0: + continue + try: + entry = self._getter(i) + except self.IndexError: + self.is_exhausted = True + if step > 0: + break + continue + yield i + 1, entry + + def __len__(self): + return len(tuple(self[:])) + + class IndexError(IndexError): + pass + + +def uppercase_escape(s): + unicode_escape = codecs.getdecoder('unicode_escape') + return re.sub( + r'\\U[0-9a-fA-F]{8}', + lambda m: unicode_escape(m.group(0))[0], + s) + + +def lowercase_escape(s): + unicode_escape = codecs.getdecoder('unicode_escape') + return re.sub( + r'\\u[0-9a-fA-F]{4}', + lambda m: unicode_escape(m.group(0))[0], + s) + + +def parse_qs(url, **kwargs): + return urllib.parse.parse_qs(urllib.parse.urlparse(url).query, **kwargs) + + +def read_batch_urls(batch_fd): + def fixup(url): + if not isinstance(url, str): + url = url.decode('utf-8', 'replace') + BOM_UTF8 = ('\xef\xbb\xbf', '\ufeff') + for bom in BOM_UTF8: + if url.startswith(bom): + url = url[len(bom):] + url = url.lstrip() + if not url or url.startswith(('#', ';', ']')): + return False + # "#" cannot be stripped out since it is part of the URI + # However, it can be safely stripped out if following a whitespace + return re.split(r'\s#', url, 1)[0].rstrip() + + with contextlib.closing(batch_fd) as fd: + return [url for url in map(fixup, fd) if url] + + +def urlencode_postdata(*args, **kargs): + return urllib.parse.urlencode(*args, **kargs).encode('ascii') + + +def update_url(url, *, query_update=None, **kwargs): + """Replace URL components specified by kwargs + @param url str or parse url tuple + @param query_update update query + @returns str + """ + if isinstance(url, str): + if not kwargs and not query_update: + return url + else: + url = urllib.parse.urlparse(url) + if query_update: + assert 'query' not in kwargs, 'query_update and query cannot be specified at the same time' + kwargs['query'] = urllib.parse.urlencode({ + **urllib.parse.parse_qs(url.query), + **query_update + }, True) + return urllib.parse.urlunparse(url._replace(**kwargs)) + + +def update_url_query(url, query): + return update_url(url, query_update=query) + + +def _multipart_encode_impl(data, boundary): + content_type = 'multipart/form-data; boundary=%s' % boundary + + out = b'' + for k, v in data.items(): + out += b'--' + boundary.encode('ascii') + b'\r\n' + if isinstance(k, str): + k = k.encode() + if isinstance(v, str): + v = v.encode() + # RFC 2047 requires non-ASCII field names to be encoded, while RFC 7578 + # suggests sending UTF-8 directly. Firefox sends UTF-8, too + content = b'Content-Disposition: form-data; name="' + k + b'"\r\n\r\n' + v + b'\r\n' + if boundary.encode('ascii') in content: + raise ValueError('Boundary overlaps with data') + out += content + + out += b'--' + boundary.encode('ascii') + b'--\r\n' + + return out, content_type + + +def multipart_encode(data, boundary=None): + ''' + Encode a dict to RFC 7578-compliant form-data + + data: + A dict where keys and values can be either Unicode or bytes-like + objects. + boundary: + If specified a Unicode object, it's used as the boundary. Otherwise + a random boundary is generated. + + Reference: https://tools.ietf.org/html/rfc7578 + ''' + has_specified_boundary = boundary is not None + + while True: + if boundary is None: + boundary = '---------------' + str(random.randrange(0x0fffffff, 0xffffffff)) + + try: + out, content_type = _multipart_encode_impl(data, boundary) + break + except ValueError: + if has_specified_boundary: + raise + boundary = None + + return out, content_type + + +def is_iterable_like(x, allowed_types=collections.abc.Iterable, blocked_types=NO_DEFAULT): + if blocked_types is NO_DEFAULT: + blocked_types = (str, bytes, collections.abc.Mapping) + return isinstance(x, allowed_types) and not isinstance(x, blocked_types) + + +def variadic(x, allowed_types=NO_DEFAULT): + if not isinstance(allowed_types, (tuple, type)): + deprecation_warning('allowed_types should be a tuple or a type') + allowed_types = tuple(allowed_types) + return x if is_iterable_like(x, blocked_types=allowed_types) else (x, ) + + +def try_call(*funcs, expected_type=None, args=[], kwargs={}): + for f in funcs: + try: + val = f(*args, **kwargs) + except (AttributeError, KeyError, TypeError, IndexError, ValueError, ZeroDivisionError): + pass + else: + if expected_type is None or isinstance(val, expected_type): + return val + + +def try_get(src, getter, expected_type=None): + return try_call(*variadic(getter), args=(src,), expected_type=expected_type) + + +def filter_dict(dct, cndn=lambda _, v: v is not None): + return {k: v for k, v in dct.items() if cndn(k, v)} + + +def merge_dicts(*dicts): + merged = {} + for a_dict in dicts: + for k, v in a_dict.items(): + if (v is not None and k not in merged + or isinstance(v, str) and merged[k] == ''): + merged[k] = v + return merged + + +def encode_compat_str(string, encoding=preferredencoding(), errors='strict'): + return string if isinstance(string, str) else str(string, encoding, errors) + + +US_RATINGS = { + 'G': 0, + 'PG': 10, + 'PG-13': 13, + 'R': 16, + 'NC': 18, +} + + +TV_PARENTAL_GUIDELINES = { + 'TV-Y': 0, + 'TV-Y7': 7, + 'TV-G': 0, + 'TV-PG': 0, + 'TV-14': 14, + 'TV-MA': 17, +} + + +def parse_age_limit(s): + # isinstance(False, int) is True. So type() must be used instead + if type(s) is int: # noqa: E721 + return s if 0 <= s <= 21 else None + elif not isinstance(s, str): + return None + m = re.match(r'^(?P<age>\d{1,2})\+?$', s) + if m: + return int(m.group('age')) + s = s.upper() + if s in US_RATINGS: + return US_RATINGS[s] + m = re.match(r'^TV[_-]?(%s)$' % '|'.join(k[3:] for k in TV_PARENTAL_GUIDELINES), s) + if m: + return TV_PARENTAL_GUIDELINES['TV-' + m.group(1)] + return None + + +def strip_jsonp(code): + return re.sub( + r'''(?sx)^ + (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*) + (?:\s*&&\s*(?P=func_name))? + \s*\(\s*(?P<callback_data>.*)\);? + \s*?(?://[^\n]*)*$''', + r'\g<callback_data>', code) + + +def js_to_json(code, vars={}, *, strict=False): + # vars is a dict of var, val pairs to substitute + STRING_QUOTES = '\'"`' + STRING_RE = '|'.join(rf'{q}(?:\\.|[^\\{q}])*{q}' for q in STRING_QUOTES) + COMMENT_RE = r'/\*(?:(?!\*/).)*?\*/|//[^\n]*\n' + SKIP_RE = fr'\s*(?:{COMMENT_RE})?\s*' + INTEGER_TABLE = ( + (fr'(?s)^(0[xX][0-9a-fA-F]+){SKIP_RE}:?$', 16), + (fr'(?s)^(0+[0-7]+){SKIP_RE}:?$', 8), + ) + + def process_escape(match): + JSON_PASSTHROUGH_ESCAPES = R'"\bfnrtu' + escape = match.group(1) or match.group(2) + + return (Rf'\{escape}' if escape in JSON_PASSTHROUGH_ESCAPES + else R'\u00' if escape == 'x' + else '' if escape == '\n' + else escape) + + def template_substitute(match): + evaluated = js_to_json(match.group(1), vars, strict=strict) + if evaluated[0] == '"': + return json.loads(evaluated) + return evaluated + + def fix_kv(m): + v = m.group(0) + if v in ('true', 'false', 'null'): + return v + elif v in ('undefined', 'void 0'): + return 'null' + elif v.startswith('/*') or v.startswith('//') or v.startswith('!') or v == ',': + return '' + + if v[0] in STRING_QUOTES: + v = re.sub(r'(?s)\${([^}]+)}', template_substitute, v[1:-1]) if v[0] == '`' else v[1:-1] + escaped = re.sub(r'(?s)(")|\\(.)', process_escape, v) + return f'"{escaped}"' + + for regex, base in INTEGER_TABLE: + im = re.match(regex, v) + if im: + i = int(im.group(1), base) + return f'"{i}":' if v.endswith(':') else str(i) + + if v in vars: + try: + if not strict: + json.loads(vars[v]) + except json.JSONDecodeError: + return json.dumps(vars[v]) + else: + return vars[v] + + if not strict: + return f'"{v}"' + + raise ValueError(f'Unknown value: {v}') + + def create_map(mobj): + return json.dumps(dict(json.loads(js_to_json(mobj.group(1) or '[]', vars=vars)))) + + code = re.sub(r'(?:new\s+)?Array\((.*?)\)', r'[\g<1>]', code) + code = re.sub(r'new Map\((\[.*?\])?\)', create_map, code) + if not strict: + code = re.sub(rf'new Date\(({STRING_RE})\)', r'\g<1>', code) + code = re.sub(r'new \w+\((.*?)\)', lambda m: json.dumps(m.group(0)), code) + code = re.sub(r'parseInt\([^\d]+(\d+)[^\d]+\)', r'\1', code) + code = re.sub(r'\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)', r'\1', code) + + return re.sub(rf'''(?sx) + {STRING_RE}| + {COMMENT_RE}|,(?={SKIP_RE}[\]}}])| + void\s0|(?:(?<![0-9])[eE]|[a-df-zA-DF-Z_$])[.a-zA-Z_$0-9]*| + \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{SKIP_RE}:)?| + [0-9]+(?={SKIP_RE}:)| + !+ + ''', fix_kv, code) + + +def qualities(quality_ids): + """ Get a numeric quality value out of a list of possible values """ + def q(qid): + try: + return quality_ids.index(qid) + except ValueError: + return -1 + return q + + +POSTPROCESS_WHEN = ('pre_process', 'after_filter', 'video', 'before_dl', 'post_process', 'after_move', 'after_video', 'playlist') + + +DEFAULT_OUTTMPL = { + 'default': '%(title)s [%(id)s].%(ext)s', + 'chapter': '%(title)s - %(section_number)03d %(section_title)s [%(id)s].%(ext)s', +} +OUTTMPL_TYPES = { + 'chapter': None, + 'subtitle': None, + 'thumbnail': None, + 'description': 'description', + 'annotation': 'annotations.xml', + 'infojson': 'info.json', + 'link': None, + 'pl_video': None, + 'pl_thumbnail': None, + 'pl_description': 'description', + 'pl_infojson': 'info.json', +} + +# As of [1] format syntax is: +# %[mapping_key][conversion_flags][minimum_width][.precision][length_modifier]type +# 1. https://docs.python.org/2/library/stdtypes.html#string-formatting +STR_FORMAT_RE_TMPL = r'''(?x) + (?<!%)(?P<prefix>(?:%%)*) + % + (?P<has_key>\((?P<key>{0})\))? + (?P<format> + (?P<conversion>[#0\-+ ]+)? + (?P<min_width>\d+)? + (?P<precision>\.\d+)? + (?P<len_mod>[hlL])? # unused in python + {1} # conversion type + ) +''' + + +STR_FORMAT_TYPES = 'diouxXeEfFgGcrsa' + + +def limit_length(s, length): + """ Add ellipses to overly long strings """ + if s is None: + return None + ELLIPSES = '...' + if len(s) > length: + return s[:length - len(ELLIPSES)] + ELLIPSES + return s + + +def version_tuple(v): + return tuple(int(e) for e in re.split(r'[-.]', v)) + + +def is_outdated_version(version, limit, assume_new=True): + if not version: + return not assume_new + try: + return version_tuple(version) < version_tuple(limit) + except ValueError: + return not assume_new + + +def ytdl_is_updateable(): + """ Returns if yt-dlp can be updated with -U """ + + from ..update import is_non_updateable + + return not is_non_updateable() + + +def args_to_str(args): + # Get a short string representation for a subprocess command + return ' '.join(compat_shlex_quote(a) for a in args) + + +def error_to_str(err): + return f'{type(err).__name__}: {err}' + + +def mimetype2ext(mt, default=NO_DEFAULT): + if not isinstance(mt, str): + if default is not NO_DEFAULT: + return default + return None + + MAP = { + # video + '3gpp': '3gp', + 'mp2t': 'ts', + 'mp4': 'mp4', + 'mpeg': 'mpeg', + 'mpegurl': 'm3u8', + 'quicktime': 'mov', + 'webm': 'webm', + 'vp9': 'vp9', + 'video/ogg': 'ogv', + 'x-flv': 'flv', + 'x-m4v': 'm4v', + 'x-matroska': 'mkv', + 'x-mng': 'mng', + 'x-mp4-fragmented': 'mp4', + 'x-ms-asf': 'asf', + 'x-ms-wmv': 'wmv', + 'x-msvideo': 'avi', + + # application (streaming playlists) + 'dash+xml': 'mpd', + 'f4m+xml': 'f4m', + 'hds+xml': 'f4m', + 'vnd.apple.mpegurl': 'm3u8', + 'vnd.ms-sstr+xml': 'ism', + 'x-mpegurl': 'm3u8', + + # audio + 'audio/mp4': 'm4a', + # Per RFC 3003, audio/mpeg can be .mp1, .mp2 or .mp3. + # Using .mp3 as it's the most popular one + 'audio/mpeg': 'mp3', + 'audio/webm': 'webm', + 'audio/x-matroska': 'mka', + 'audio/x-mpegurl': 'm3u', + 'midi': 'mid', + 'ogg': 'ogg', + 'wav': 'wav', + 'wave': 'wav', + 'x-aac': 'aac', + 'x-flac': 'flac', + 'x-m4a': 'm4a', + 'x-realaudio': 'ra', + 'x-wav': 'wav', + + # image + 'avif': 'avif', + 'bmp': 'bmp', + 'gif': 'gif', + 'jpeg': 'jpg', + 'png': 'png', + 'svg+xml': 'svg', + 'tiff': 'tif', + 'vnd.wap.wbmp': 'wbmp', + 'webp': 'webp', + 'x-icon': 'ico', + 'x-jng': 'jng', + 'x-ms-bmp': 'bmp', + + # caption + 'filmstrip+json': 'fs', + 'smptett+xml': 'tt', + 'ttaf+xml': 'dfxp', + 'ttml+xml': 'ttml', + 'x-ms-sami': 'sami', + + # misc + 'gzip': 'gz', + 'json': 'json', + 'xml': 'xml', + 'zip': 'zip', + } + + mimetype = mt.partition(';')[0].strip().lower() + _, _, subtype = mimetype.rpartition('/') + + ext = traversal.traverse_obj(MAP, mimetype, subtype, subtype.rsplit('+')[-1]) + if ext: + return ext + elif default is not NO_DEFAULT: + return default + return subtype.replace('+', '.') + + +def ext2mimetype(ext_or_url): + if not ext_or_url: + return None + if '.' not in ext_or_url: + ext_or_url = f'file.{ext_or_url}' + return mimetypes.guess_type(ext_or_url)[0] + + +def parse_codecs(codecs_str): + # http://tools.ietf.org/html/rfc6381 + if not codecs_str: + return {} + split_codecs = list(filter(None, map( + str.strip, codecs_str.strip().strip(',').split(',')))) + vcodec, acodec, scodec, hdr = None, None, None, None + for full_codec in split_codecs: + parts = re.sub(r'0+(?=\d)', '', full_codec).split('.') + if parts[0] in ('avc1', 'avc2', 'avc3', 'avc4', 'vp9', 'vp8', 'hev1', 'hev2', + 'h263', 'h264', 'mp4v', 'hvc1', 'av1', 'theora', 'dvh1', 'dvhe'): + if vcodec: + continue + vcodec = full_codec + if parts[0] in ('dvh1', 'dvhe'): + hdr = 'DV' + elif parts[0] == 'av1' and traversal.traverse_obj(parts, 3) == '10': + hdr = 'HDR10' + elif parts[:2] == ['vp9', '2']: + hdr = 'HDR10' + elif parts[0] in ('flac', 'mp4a', 'opus', 'vorbis', 'mp3', 'aac', 'ac-4', + 'ac-3', 'ec-3', 'eac3', 'dtsc', 'dtse', 'dtsh', 'dtsl'): + acodec = acodec or full_codec + elif parts[0] in ('stpp', 'wvtt'): + scodec = scodec or full_codec + else: + write_string(f'WARNING: Unknown codec {full_codec}\n') + if vcodec or acodec or scodec: + return { + 'vcodec': vcodec or 'none', + 'acodec': acodec or 'none', + 'dynamic_range': hdr, + **({'scodec': scodec} if scodec is not None else {}), + } + elif len(split_codecs) == 2: + return { + 'vcodec': split_codecs[0], + 'acodec': split_codecs[1], + } + return {} + + +def get_compatible_ext(*, vcodecs, acodecs, vexts, aexts, preferences=None): + assert len(vcodecs) == len(vexts) and len(acodecs) == len(aexts) + + allow_mkv = not preferences or 'mkv' in preferences + + if allow_mkv and max(len(acodecs), len(vcodecs)) > 1: + return 'mkv' # TODO: any other format allows this? + + # TODO: All codecs supported by parse_codecs isn't handled here + COMPATIBLE_CODECS = { + 'mp4': { + 'av1', 'hevc', 'avc1', 'mp4a', 'ac-4', # fourcc (m3u8, mpd) + 'h264', 'aacl', 'ec-3', # Set in ISM + }, + 'webm': { + 'av1', 'vp9', 'vp8', 'opus', 'vrbs', + 'vp9x', 'vp8x', # in the webm spec + }, + } + + sanitize_codec = functools.partial( + try_get, getter=lambda x: x[0].split('.')[0].replace('0', '').lower()) + vcodec, acodec = sanitize_codec(vcodecs), sanitize_codec(acodecs) + + for ext in preferences or COMPATIBLE_CODECS.keys(): + codec_set = COMPATIBLE_CODECS.get(ext, set()) + if ext == 'mkv' or codec_set.issuperset((vcodec, acodec)): + return ext + + COMPATIBLE_EXTS = ( + {'mp3', 'mp4', 'm4a', 'm4p', 'm4b', 'm4r', 'm4v', 'ismv', 'isma', 'mov'}, + {'webm', 'weba'}, + ) + for ext in preferences or vexts: + current_exts = {ext, *vexts, *aexts} + if ext == 'mkv' or current_exts == {ext} or any( + ext_sets.issuperset(current_exts) for ext_sets in COMPATIBLE_EXTS): + return ext + return 'mkv' if allow_mkv else preferences[-1] + + +def urlhandle_detect_ext(url_handle, default=NO_DEFAULT): + getheader = url_handle.headers.get + + cd = getheader('Content-Disposition') + if cd: + m = re.match(r'attachment;\s*filename="(?P<filename>[^"]+)"', cd) + if m: + e = determine_ext(m.group('filename'), default_ext=None) + if e: + return e + + meta_ext = getheader('x-amz-meta-name') + if meta_ext: + e = meta_ext.rpartition('.')[2] + if e: + return e + + return mimetype2ext(getheader('Content-Type'), default=default) + + +def encode_data_uri(data, mime_type): + return 'data:%s;base64,%s' % (mime_type, base64.b64encode(data).decode('ascii')) + + +def age_restricted(content_limit, age_limit): + """ Returns True iff the content should be blocked """ + + if age_limit is None: # No limit set + return False + if content_limit is None: + return False # Content available for everyone + return age_limit < content_limit + + +# List of known byte-order-marks (BOM) +BOMS = [ + (b'\xef\xbb\xbf', 'utf-8'), + (b'\x00\x00\xfe\xff', 'utf-32-be'), + (b'\xff\xfe\x00\x00', 'utf-32-le'), + (b'\xff\xfe', 'utf-16-le'), + (b'\xfe\xff', 'utf-16-be'), +] + + +def is_html(first_bytes): + """ Detect whether a file contains HTML by examining its first bytes. """ + + encoding = 'utf-8' + for bom, enc in BOMS: + while first_bytes.startswith(bom): + encoding, first_bytes = enc, first_bytes[len(bom):] + + return re.match(r'^\s*<', first_bytes.decode(encoding, 'replace')) + + +def determine_protocol(info_dict): + protocol = info_dict.get('protocol') + if protocol is not None: + return protocol + + url = sanitize_url(info_dict['url']) + if url.startswith('rtmp'): + return 'rtmp' + elif url.startswith('mms'): + return 'mms' + elif url.startswith('rtsp'): + return 'rtsp' + + ext = determine_ext(url) + if ext == 'm3u8': + return 'm3u8' if info_dict.get('is_live') else 'm3u8_native' + elif ext == 'f4m': + return 'f4m' + + return urllib.parse.urlparse(url).scheme + + +def render_table(header_row, data, delim=False, extra_gap=0, hide_empty=False): + """ Render a list of rows, each as a list of values. + Text after a \t will be right aligned """ + def width(string): + return len(remove_terminal_sequences(string).replace('\t', '')) + + def get_max_lens(table): + return [max(width(str(v)) for v in col) for col in zip(*table)] + + def filter_using_list(row, filterArray): + return [col for take, col in itertools.zip_longest(filterArray, row, fillvalue=True) if take] + + max_lens = get_max_lens(data) if hide_empty else [] + header_row = filter_using_list(header_row, max_lens) + data = [filter_using_list(row, max_lens) for row in data] + + table = [header_row] + data + max_lens = get_max_lens(table) + extra_gap += 1 + if delim: + table = [header_row, [delim * (ml + extra_gap) for ml in max_lens]] + data + table[1][-1] = table[1][-1][:-extra_gap * len(delim)] # Remove extra_gap from end of delimiter + for row in table: + for pos, text in enumerate(map(str, row)): + if '\t' in text: + row[pos] = text.replace('\t', ' ' * (max_lens[pos] - width(text))) + ' ' * extra_gap + else: + row[pos] = text + ' ' * (max_lens[pos] - width(text) + extra_gap) + ret = '\n'.join(''.join(row).rstrip() for row in table) + return ret + + +def _match_one(filter_part, dct, incomplete): + # TODO: Generalize code with YoutubeDL._build_format_filter + STRING_OPERATORS = { + '*=': operator.contains, + '^=': lambda attr, value: attr.startswith(value), + '$=': lambda attr, value: attr.endswith(value), + '~=': lambda attr, value: re.search(value, attr), + } + COMPARISON_OPERATORS = { + **STRING_OPERATORS, + '<=': operator.le, # "<=" must be defined above "<" + '<': operator.lt, + '>=': operator.ge, + '>': operator.gt, + '=': operator.eq, + } + + if isinstance(incomplete, bool): + is_incomplete = lambda _: incomplete + else: + is_incomplete = lambda k: k in incomplete + + operator_rex = re.compile(r'''(?x) + (?P<key>[a-z_]+) + \s*(?P<negation>!\s*)?(?P<op>%s)(?P<none_inclusive>\s*\?)?\s* + (?: + (?P<quote>["\'])(?P<quotedstrval>.+?)(?P=quote)| + (?P<strval>.+?) + ) + ''' % '|'.join(map(re.escape, COMPARISON_OPERATORS.keys()))) + m = operator_rex.fullmatch(filter_part.strip()) + if m: + m = m.groupdict() + unnegated_op = COMPARISON_OPERATORS[m['op']] + if m['negation']: + op = lambda attr, value: not unnegated_op(attr, value) + else: + op = unnegated_op + comparison_value = m['quotedstrval'] or m['strval'] or m['intval'] + if m['quote']: + comparison_value = comparison_value.replace(r'\%s' % m['quote'], m['quote']) + actual_value = dct.get(m['key']) + numeric_comparison = None + if isinstance(actual_value, (int, float)): + # If the original field is a string and matching comparisonvalue is + # a number we should respect the origin of the original field + # and process comparison value as a string (see + # https://github.com/ytdl-org/youtube-dl/issues/11082) + try: + numeric_comparison = int(comparison_value) + except ValueError: + numeric_comparison = parse_filesize(comparison_value) + if numeric_comparison is None: + numeric_comparison = parse_filesize(f'{comparison_value}B') + if numeric_comparison is None: + numeric_comparison = parse_duration(comparison_value) + if numeric_comparison is not None and m['op'] in STRING_OPERATORS: + raise ValueError('Operator %s only supports string values!' % m['op']) + if actual_value is None: + return is_incomplete(m['key']) or m['none_inclusive'] + return op(actual_value, comparison_value if numeric_comparison is None else numeric_comparison) + + UNARY_OPERATORS = { + '': lambda v: (v is True) if isinstance(v, bool) else (v is not None), + '!': lambda v: (v is False) if isinstance(v, bool) else (v is None), + } + operator_rex = re.compile(r'''(?x) + (?P<op>%s)\s*(?P<key>[a-z_]+) + ''' % '|'.join(map(re.escape, UNARY_OPERATORS.keys()))) + m = operator_rex.fullmatch(filter_part.strip()) + if m: + op = UNARY_OPERATORS[m.group('op')] + actual_value = dct.get(m.group('key')) + if is_incomplete(m.group('key')) and actual_value is None: + return True + return op(actual_value) + + raise ValueError('Invalid filter part %r' % filter_part) + + +def match_str(filter_str, dct, incomplete=False): + """ Filter a dictionary with a simple string syntax. + @returns Whether the filter passes + @param incomplete Set of keys that is expected to be missing from dct. + Can be True/False to indicate all/none of the keys may be missing. + All conditions on incomplete keys pass if the key is missing + """ + return all( + _match_one(filter_part.replace(r'\&', '&'), dct, incomplete) + for filter_part in re.split(r'(?<!\\)&', filter_str)) + + +def match_filter_func(filters, breaking_filters=None): + if not filters and not breaking_filters: + return None + breaking_filters = match_filter_func(breaking_filters) or (lambda _, __: None) + filters = set(variadic(filters or [])) + + interactive = '-' in filters + if interactive: + filters.remove('-') + + def _match_func(info_dict, incomplete=False): + ret = breaking_filters(info_dict, incomplete) + if ret is not None: + raise RejectedVideoReached(ret) + + if not filters or any(match_str(f, info_dict, incomplete) for f in filters): + return NO_DEFAULT if interactive and not incomplete else None + else: + video_title = info_dict.get('title') or info_dict.get('id') or 'entry' + filter_str = ') | ('.join(map(str.strip, filters)) + return f'{video_title} does not pass filter ({filter_str}), skipping ..' + return _match_func + + +class download_range_func: + def __init__(self, chapters, ranges, from_info=False): + self.chapters, self.ranges, self.from_info = chapters, ranges, from_info + + def __call__(self, info_dict, ydl): + + warning = ('There are no chapters matching the regex' if info_dict.get('chapters') + else 'Cannot match chapters since chapter information is unavailable') + for regex in self.chapters or []: + for i, chapter in enumerate(info_dict.get('chapters') or []): + if re.search(regex, chapter['title']): + warning = None + yield {**chapter, 'index': i} + if self.chapters and warning: + ydl.to_screen(f'[info] {info_dict["id"]}: {warning}') + + for start, end in self.ranges or []: + yield { + 'start_time': self._handle_negative_timestamp(start, info_dict), + 'end_time': self._handle_negative_timestamp(end, info_dict), + } + + if self.from_info and (info_dict.get('start_time') or info_dict.get('end_time')): + yield { + 'start_time': info_dict.get('start_time') or 0, + 'end_time': info_dict.get('end_time') or float('inf'), + } + elif not self.ranges and not self.chapters: + yield {} + + @staticmethod + def _handle_negative_timestamp(time, info): + return max(info['duration'] + time, 0) if info.get('duration') and time < 0 else time + + def __eq__(self, other): + return (isinstance(other, download_range_func) + and self.chapters == other.chapters and self.ranges == other.ranges) + + def __repr__(self): + return f'{__name__}.{type(self).__name__}({self.chapters}, {self.ranges})' + + +def parse_dfxp_time_expr(time_expr): + if not time_expr: + return + + mobj = re.match(rf'^(?P<time_offset>{NUMBER_RE})s?$', time_expr) + if mobj: + return float(mobj.group('time_offset')) + + mobj = re.match(r'^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$', time_expr) + if mobj: + return 3600 * int(mobj.group(1)) + 60 * int(mobj.group(2)) + float(mobj.group(3).replace(':', '.')) + + +def srt_subtitles_timecode(seconds): + return '%02d:%02d:%02d,%03d' % timetuple_from_msec(seconds * 1000) + + +def ass_subtitles_timecode(seconds): + time = timetuple_from_msec(seconds * 1000) + return '%01d:%02d:%02d.%02d' % (*time[:-1], time.milliseconds / 10) + + +def dfxp2srt(dfxp_data): + ''' + @param dfxp_data A bytes-like object containing DFXP data + @returns A unicode object containing converted SRT data + ''' + LEGACY_NAMESPACES = ( + (b'http://www.w3.org/ns/ttml', [ + b'http://www.w3.org/2004/11/ttaf1', + b'http://www.w3.org/2006/04/ttaf1', + b'http://www.w3.org/2006/10/ttaf1', + ]), + (b'http://www.w3.org/ns/ttml#styling', [ + b'http://www.w3.org/ns/ttml#style', + ]), + ) + + SUPPORTED_STYLING = [ + 'color', + 'fontFamily', + 'fontSize', + 'fontStyle', + 'fontWeight', + 'textDecoration' + ] + + _x = functools.partial(xpath_with_ns, ns_map={ + 'xml': 'http://www.w3.org/XML/1998/namespace', + 'ttml': 'http://www.w3.org/ns/ttml', + 'tts': 'http://www.w3.org/ns/ttml#styling', + }) + + styles = {} + default_style = {} + + class TTMLPElementParser: + _out = '' + _unclosed_elements = [] + _applied_styles = [] + + def start(self, tag, attrib): + if tag in (_x('ttml:br'), 'br'): + self._out += '\n' + else: + unclosed_elements = [] + style = {} + element_style_id = attrib.get('style') + if default_style: + style.update(default_style) + if element_style_id: + style.update(styles.get(element_style_id, {})) + for prop in SUPPORTED_STYLING: + prop_val = attrib.get(_x('tts:' + prop)) + if prop_val: + style[prop] = prop_val + if style: + font = '' + for k, v in sorted(style.items()): + if self._applied_styles and self._applied_styles[-1].get(k) == v: + continue + if k == 'color': + font += ' color="%s"' % v + elif k == 'fontSize': + font += ' size="%s"' % v + elif k == 'fontFamily': + font += ' face="%s"' % v + elif k == 'fontWeight' and v == 'bold': + self._out += '<b>' + unclosed_elements.append('b') + elif k == 'fontStyle' and v == 'italic': + self._out += '<i>' + unclosed_elements.append('i') + elif k == 'textDecoration' and v == 'underline': + self._out += '<u>' + unclosed_elements.append('u') + if font: + self._out += '<font' + font + '>' + unclosed_elements.append('font') + applied_style = {} + if self._applied_styles: + applied_style.update(self._applied_styles[-1]) + applied_style.update(style) + self._applied_styles.append(applied_style) + self._unclosed_elements.append(unclosed_elements) + + def end(self, tag): + if tag not in (_x('ttml:br'), 'br'): + unclosed_elements = self._unclosed_elements.pop() + for element in reversed(unclosed_elements): + self._out += '</%s>' % element + if unclosed_elements and self._applied_styles: + self._applied_styles.pop() + + def data(self, data): + self._out += data + + def close(self): + return self._out.strip() + + # Fix UTF-8 encoded file wrongly marked as UTF-16. See https://github.com/yt-dlp/yt-dlp/issues/6543#issuecomment-1477169870 + # This will not trigger false positives since only UTF-8 text is being replaced + dfxp_data = dfxp_data.replace(b'encoding=\'UTF-16\'', b'encoding=\'UTF-8\'') + + def parse_node(node): + target = TTMLPElementParser() + parser = xml.etree.ElementTree.XMLParser(target=target) + parser.feed(xml.etree.ElementTree.tostring(node)) + return parser.close() + + for k, v in LEGACY_NAMESPACES: + for ns in v: + dfxp_data = dfxp_data.replace(ns, k) + + dfxp = compat_etree_fromstring(dfxp_data) + out = [] + paras = dfxp.findall(_x('.//ttml:p')) or dfxp.findall('.//p') + + if not paras: + raise ValueError('Invalid dfxp/TTML subtitle') + + repeat = False + while True: + for style in dfxp.findall(_x('.//ttml:style')): + style_id = style.get('id') or style.get(_x('xml:id')) + if not style_id: + continue + parent_style_id = style.get('style') + if parent_style_id: + if parent_style_id not in styles: + repeat = True + continue + styles[style_id] = styles[parent_style_id].copy() + for prop in SUPPORTED_STYLING: + prop_val = style.get(_x('tts:' + prop)) + if prop_val: + styles.setdefault(style_id, {})[prop] = prop_val + if repeat: + repeat = False + else: + break + + for p in ('body', 'div'): + ele = xpath_element(dfxp, [_x('.//ttml:' + p), './/' + p]) + if ele is None: + continue + style = styles.get(ele.get('style')) + if not style: + continue + default_style.update(style) + + for para, index in zip(paras, itertools.count(1)): + begin_time = parse_dfxp_time_expr(para.attrib.get('begin')) + end_time = parse_dfxp_time_expr(para.attrib.get('end')) + dur = parse_dfxp_time_expr(para.attrib.get('dur')) + if begin_time is None: + continue + if not end_time: + if not dur: + continue + end_time = begin_time + dur + out.append('%d\n%s --> %s\n%s\n\n' % ( + index, + srt_subtitles_timecode(begin_time), + srt_subtitles_timecode(end_time), + parse_node(para))) + + return ''.join(out) + + +def cli_option(params, command_option, param, separator=None): + param = params.get(param) + return ([] if param is None + else [command_option, str(param)] if separator is None + else [f'{command_option}{separator}{param}']) + + +def cli_bool_option(params, command_option, param, true_value='true', false_value='false', separator=None): + param = params.get(param) + assert param in (True, False, None) + return cli_option({True: true_value, False: false_value}, command_option, param, separator) + + +def cli_valueless_option(params, command_option, param, expected_value=True): + return [command_option] if params.get(param) == expected_value else [] + + +def cli_configuration_args(argdict, keys, default=[], use_compat=True): + if isinstance(argdict, (list, tuple)): # for backward compatibility + if use_compat: + return argdict + else: + argdict = None + if argdict is None: + return default + assert isinstance(argdict, dict) + + assert isinstance(keys, (list, tuple)) + for key_list in keys: + arg_list = list(filter( + lambda x: x is not None, + [argdict.get(key.lower()) for key in variadic(key_list)])) + if arg_list: + return [arg for args in arg_list for arg in args] + return default + + +def _configuration_args(main_key, argdict, exe, keys=None, default=[], use_compat=True): + main_key, exe = main_key.lower(), exe.lower() + root_key = exe if main_key == exe else f'{main_key}+{exe}' + keys = [f'{root_key}{k}' for k in (keys or [''])] + if root_key in keys: + if main_key != exe: + keys.append((main_key, exe)) + keys.append('default') + else: + use_compat = False + return cli_configuration_args(argdict, keys, default, use_compat) + + +class ISO639Utils: + # See http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt + _lang_map = { + 'aa': 'aar', + 'ab': 'abk', + 'ae': 'ave', + 'af': 'afr', + 'ak': 'aka', + 'am': 'amh', + 'an': 'arg', + 'ar': 'ara', + 'as': 'asm', + 'av': 'ava', + 'ay': 'aym', + 'az': 'aze', + 'ba': 'bak', + 'be': 'bel', + 'bg': 'bul', + 'bh': 'bih', + 'bi': 'bis', + 'bm': 'bam', + 'bn': 'ben', + 'bo': 'bod', + 'br': 'bre', + 'bs': 'bos', + 'ca': 'cat', + 'ce': 'che', + 'ch': 'cha', + 'co': 'cos', + 'cr': 'cre', + 'cs': 'ces', + 'cu': 'chu', + 'cv': 'chv', + 'cy': 'cym', + 'da': 'dan', + 'de': 'deu', + 'dv': 'div', + 'dz': 'dzo', + 'ee': 'ewe', + 'el': 'ell', + 'en': 'eng', + 'eo': 'epo', + 'es': 'spa', + 'et': 'est', + 'eu': 'eus', + 'fa': 'fas', + 'ff': 'ful', + 'fi': 'fin', + 'fj': 'fij', + 'fo': 'fao', + 'fr': 'fra', + 'fy': 'fry', + 'ga': 'gle', + 'gd': 'gla', + 'gl': 'glg', + 'gn': 'grn', + 'gu': 'guj', + 'gv': 'glv', + 'ha': 'hau', + 'he': 'heb', + 'iw': 'heb', # Replaced by he in 1989 revision + 'hi': 'hin', + 'ho': 'hmo', + 'hr': 'hrv', + 'ht': 'hat', + 'hu': 'hun', + 'hy': 'hye', + 'hz': 'her', + 'ia': 'ina', + 'id': 'ind', + 'in': 'ind', # Replaced by id in 1989 revision + 'ie': 'ile', + 'ig': 'ibo', + 'ii': 'iii', + 'ik': 'ipk', + 'io': 'ido', + 'is': 'isl', + 'it': 'ita', + 'iu': 'iku', + 'ja': 'jpn', + 'jv': 'jav', + 'ka': 'kat', + 'kg': 'kon', + 'ki': 'kik', + 'kj': 'kua', + 'kk': 'kaz', + 'kl': 'kal', + 'km': 'khm', + 'kn': 'kan', + 'ko': 'kor', + 'kr': 'kau', + 'ks': 'kas', + 'ku': 'kur', + 'kv': 'kom', + 'kw': 'cor', + 'ky': 'kir', + 'la': 'lat', + 'lb': 'ltz', + 'lg': 'lug', + 'li': 'lim', + 'ln': 'lin', + 'lo': 'lao', + 'lt': 'lit', + 'lu': 'lub', + 'lv': 'lav', + 'mg': 'mlg', + 'mh': 'mah', + 'mi': 'mri', + 'mk': 'mkd', + 'ml': 'mal', + 'mn': 'mon', + 'mr': 'mar', + 'ms': 'msa', + 'mt': 'mlt', + 'my': 'mya', + 'na': 'nau', + 'nb': 'nob', + 'nd': 'nde', + 'ne': 'nep', + 'ng': 'ndo', + 'nl': 'nld', + 'nn': 'nno', + 'no': 'nor', + 'nr': 'nbl', + 'nv': 'nav', + 'ny': 'nya', + 'oc': 'oci', + 'oj': 'oji', + 'om': 'orm', + 'or': 'ori', + 'os': 'oss', + 'pa': 'pan', + 'pe': 'per', + 'pi': 'pli', + 'pl': 'pol', + 'ps': 'pus', + 'pt': 'por', + 'qu': 'que', + 'rm': 'roh', + 'rn': 'run', + 'ro': 'ron', + 'ru': 'rus', + 'rw': 'kin', + 'sa': 'san', + 'sc': 'srd', + 'sd': 'snd', + 'se': 'sme', + 'sg': 'sag', + 'si': 'sin', + 'sk': 'slk', + 'sl': 'slv', + 'sm': 'smo', + 'sn': 'sna', + 'so': 'som', + 'sq': 'sqi', + 'sr': 'srp', + 'ss': 'ssw', + 'st': 'sot', + 'su': 'sun', + 'sv': 'swe', + 'sw': 'swa', + 'ta': 'tam', + 'te': 'tel', + 'tg': 'tgk', + 'th': 'tha', + 'ti': 'tir', + 'tk': 'tuk', + 'tl': 'tgl', + 'tn': 'tsn', + 'to': 'ton', + 'tr': 'tur', + 'ts': 'tso', + 'tt': 'tat', + 'tw': 'twi', + 'ty': 'tah', + 'ug': 'uig', + 'uk': 'ukr', + 'ur': 'urd', + 'uz': 'uzb', + 've': 'ven', + 'vi': 'vie', + 'vo': 'vol', + 'wa': 'wln', + 'wo': 'wol', + 'xh': 'xho', + 'yi': 'yid', + 'ji': 'yid', # Replaced by yi in 1989 revision + 'yo': 'yor', + 'za': 'zha', + 'zh': 'zho', + 'zu': 'zul', + } + + @classmethod + def short2long(cls, code): + """Convert language code from ISO 639-1 to ISO 639-2/T""" + return cls._lang_map.get(code[:2]) + + @classmethod + def long2short(cls, code): + """Convert language code from ISO 639-2/T to ISO 639-1""" + for short_name, long_name in cls._lang_map.items(): + if long_name == code: + return short_name + + +class ISO3166Utils: + # From http://data.okfn.org/data/core/country-list + _country_map = { + 'AF': 'Afghanistan', + 'AX': 'Ã…land Islands', + 'AL': 'Albania', + 'DZ': 'Algeria', + 'AS': 'American Samoa', + 'AD': 'Andorra', + 'AO': 'Angola', + 'AI': 'Anguilla', + 'AQ': 'Antarctica', + 'AG': 'Antigua and Barbuda', + 'AR': 'Argentina', + 'AM': 'Armenia', + 'AW': 'Aruba', + 'AU': 'Australia', + 'AT': 'Austria', + 'AZ': 'Azerbaijan', + 'BS': 'Bahamas', + 'BH': 'Bahrain', + 'BD': 'Bangladesh', + 'BB': 'Barbados', + 'BY': 'Belarus', + 'BE': 'Belgium', + 'BZ': 'Belize', + 'BJ': 'Benin', + 'BM': 'Bermuda', + 'BT': 'Bhutan', + 'BO': 'Bolivia, Plurinational State of', + 'BQ': 'Bonaire, Sint Eustatius and Saba', + 'BA': 'Bosnia and Herzegovina', + 'BW': 'Botswana', + 'BV': 'Bouvet Island', + 'BR': 'Brazil', + 'IO': 'British Indian Ocean Territory', + 'BN': 'Brunei Darussalam', + 'BG': 'Bulgaria', + 'BF': 'Burkina Faso', + 'BI': 'Burundi', + 'KH': 'Cambodia', + 'CM': 'Cameroon', + 'CA': 'Canada', + 'CV': 'Cape Verde', + 'KY': 'Cayman Islands', + 'CF': 'Central African Republic', + 'TD': 'Chad', + 'CL': 'Chile', + 'CN': 'China', + 'CX': 'Christmas Island', + 'CC': 'Cocos (Keeling) Islands', + 'CO': 'Colombia', + 'KM': 'Comoros', + 'CG': 'Congo', + 'CD': 'Congo, the Democratic Republic of the', + 'CK': 'Cook Islands', + 'CR': 'Costa Rica', + 'CI': 'Côte d\'Ivoire', + 'HR': 'Croatia', + 'CU': 'Cuba', + 'CW': 'Curaçao', + 'CY': 'Cyprus', + 'CZ': 'Czech Republic', + 'DK': 'Denmark', + 'DJ': 'Djibouti', + 'DM': 'Dominica', + 'DO': 'Dominican Republic', + 'EC': 'Ecuador', + 'EG': 'Egypt', + 'SV': 'El Salvador', + 'GQ': 'Equatorial Guinea', + 'ER': 'Eritrea', + 'EE': 'Estonia', + 'ET': 'Ethiopia', + 'FK': 'Falkland Islands (Malvinas)', + 'FO': 'Faroe Islands', + 'FJ': 'Fiji', + 'FI': 'Finland', + 'FR': 'France', + 'GF': 'French Guiana', + 'PF': 'French Polynesia', + 'TF': 'French Southern Territories', + 'GA': 'Gabon', + 'GM': 'Gambia', + 'GE': 'Georgia', + 'DE': 'Germany', + 'GH': 'Ghana', + 'GI': 'Gibraltar', + 'GR': 'Greece', + 'GL': 'Greenland', + 'GD': 'Grenada', + 'GP': 'Guadeloupe', + 'GU': 'Guam', + 'GT': 'Guatemala', + 'GG': 'Guernsey', + 'GN': 'Guinea', + 'GW': 'Guinea-Bissau', + 'GY': 'Guyana', + 'HT': 'Haiti', + 'HM': 'Heard Island and McDonald Islands', + 'VA': 'Holy See (Vatican City State)', + 'HN': 'Honduras', + 'HK': 'Hong Kong', + 'HU': 'Hungary', + 'IS': 'Iceland', + 'IN': 'India', + 'ID': 'Indonesia', + 'IR': 'Iran, Islamic Republic of', + 'IQ': 'Iraq', + 'IE': 'Ireland', + 'IM': 'Isle of Man', + 'IL': 'Israel', + 'IT': 'Italy', + 'JM': 'Jamaica', + 'JP': 'Japan', + 'JE': 'Jersey', + 'JO': 'Jordan', + 'KZ': 'Kazakhstan', + 'KE': 'Kenya', + 'KI': 'Kiribati', + 'KP': 'Korea, Democratic People\'s Republic of', + 'KR': 'Korea, Republic of', + 'KW': 'Kuwait', + 'KG': 'Kyrgyzstan', + 'LA': 'Lao People\'s Democratic Republic', + 'LV': 'Latvia', + 'LB': 'Lebanon', + 'LS': 'Lesotho', + 'LR': 'Liberia', + 'LY': 'Libya', + 'LI': 'Liechtenstein', + 'LT': 'Lithuania', + 'LU': 'Luxembourg', + 'MO': 'Macao', + 'MK': 'Macedonia, the Former Yugoslav Republic of', + 'MG': 'Madagascar', + 'MW': 'Malawi', + 'MY': 'Malaysia', + 'MV': 'Maldives', + 'ML': 'Mali', + 'MT': 'Malta', + 'MH': 'Marshall Islands', + 'MQ': 'Martinique', + 'MR': 'Mauritania', + 'MU': 'Mauritius', + 'YT': 'Mayotte', + 'MX': 'Mexico', + 'FM': 'Micronesia, Federated States of', + 'MD': 'Moldova, Republic of', + 'MC': 'Monaco', + 'MN': 'Mongolia', + 'ME': 'Montenegro', + 'MS': 'Montserrat', + 'MA': 'Morocco', + 'MZ': 'Mozambique', + 'MM': 'Myanmar', + 'NA': 'Namibia', + 'NR': 'Nauru', + 'NP': 'Nepal', + 'NL': 'Netherlands', + 'NC': 'New Caledonia', + 'NZ': 'New Zealand', + 'NI': 'Nicaragua', + 'NE': 'Niger', + 'NG': 'Nigeria', + 'NU': 'Niue', + 'NF': 'Norfolk Island', + 'MP': 'Northern Mariana Islands', + 'NO': 'Norway', + 'OM': 'Oman', + 'PK': 'Pakistan', + 'PW': 'Palau', + 'PS': 'Palestine, State of', + 'PA': 'Panama', + 'PG': 'Papua New Guinea', + 'PY': 'Paraguay', + 'PE': 'Peru', + 'PH': 'Philippines', + 'PN': 'Pitcairn', + 'PL': 'Poland', + 'PT': 'Portugal', + 'PR': 'Puerto Rico', + 'QA': 'Qatar', + 'RE': 'Réunion', + 'RO': 'Romania', + 'RU': 'Russian Federation', + 'RW': 'Rwanda', + 'BL': 'Saint Barthélemy', + 'SH': 'Saint Helena, Ascension and Tristan da Cunha', + 'KN': 'Saint Kitts and Nevis', + 'LC': 'Saint Lucia', + 'MF': 'Saint Martin (French part)', + 'PM': 'Saint Pierre and Miquelon', + 'VC': 'Saint Vincent and the Grenadines', + 'WS': 'Samoa', + 'SM': 'San Marino', + 'ST': 'Sao Tome and Principe', + 'SA': 'Saudi Arabia', + 'SN': 'Senegal', + 'RS': 'Serbia', + 'SC': 'Seychelles', + 'SL': 'Sierra Leone', + 'SG': 'Singapore', + 'SX': 'Sint Maarten (Dutch part)', + 'SK': 'Slovakia', + 'SI': 'Slovenia', + 'SB': 'Solomon Islands', + 'SO': 'Somalia', + 'ZA': 'South Africa', + 'GS': 'South Georgia and the South Sandwich Islands', + 'SS': 'South Sudan', + 'ES': 'Spain', + 'LK': 'Sri Lanka', + 'SD': 'Sudan', + 'SR': 'Suriname', + 'SJ': 'Svalbard and Jan Mayen', + 'SZ': 'Swaziland', + 'SE': 'Sweden', + 'CH': 'Switzerland', + 'SY': 'Syrian Arab Republic', + 'TW': 'Taiwan, Province of China', + 'TJ': 'Tajikistan', + 'TZ': 'Tanzania, United Republic of', + 'TH': 'Thailand', + 'TL': 'Timor-Leste', + 'TG': 'Togo', + 'TK': 'Tokelau', + 'TO': 'Tonga', + 'TT': 'Trinidad and Tobago', + 'TN': 'Tunisia', + 'TR': 'Turkey', + 'TM': 'Turkmenistan', + 'TC': 'Turks and Caicos Islands', + 'TV': 'Tuvalu', + 'UG': 'Uganda', + 'UA': 'Ukraine', + 'AE': 'United Arab Emirates', + 'GB': 'United Kingdom', + 'US': 'United States', + 'UM': 'United States Minor Outlying Islands', + 'UY': 'Uruguay', + 'UZ': 'Uzbekistan', + 'VU': 'Vanuatu', + 'VE': 'Venezuela, Bolivarian Republic of', + 'VN': 'Viet Nam', + 'VG': 'Virgin Islands, British', + 'VI': 'Virgin Islands, U.S.', + 'WF': 'Wallis and Futuna', + 'EH': 'Western Sahara', + 'YE': 'Yemen', + 'ZM': 'Zambia', + 'ZW': 'Zimbabwe', + # Not ISO 3166 codes, but used for IP blocks + 'AP': 'Asia/Pacific Region', + 'EU': 'Europe', + } + + @classmethod + def short2full(cls, code): + """Convert an ISO 3166-2 country code to the corresponding full name""" + return cls._country_map.get(code.upper()) + + +class GeoUtils: + # Major IPv4 address blocks per country + _country_ip_map = { + 'AD': '46.172.224.0/19', + 'AE': '94.200.0.0/13', + 'AF': '149.54.0.0/17', + 'AG': '209.59.64.0/18', + 'AI': '204.14.248.0/21', + 'AL': '46.99.0.0/16', + 'AM': '46.70.0.0/15', + 'AO': '105.168.0.0/13', + 'AP': '182.50.184.0/21', + 'AQ': '23.154.160.0/24', + 'AR': '181.0.0.0/12', + 'AS': '202.70.112.0/20', + 'AT': '77.116.0.0/14', + 'AU': '1.128.0.0/11', + 'AW': '181.41.0.0/18', + 'AX': '185.217.4.0/22', + 'AZ': '5.197.0.0/16', + 'BA': '31.176.128.0/17', + 'BB': '65.48.128.0/17', + 'BD': '114.130.0.0/16', + 'BE': '57.0.0.0/8', + 'BF': '102.178.0.0/15', + 'BG': '95.42.0.0/15', + 'BH': '37.131.0.0/17', + 'BI': '154.117.192.0/18', + 'BJ': '137.255.0.0/16', + 'BL': '185.212.72.0/23', + 'BM': '196.12.64.0/18', + 'BN': '156.31.0.0/16', + 'BO': '161.56.0.0/16', + 'BQ': '161.0.80.0/20', + 'BR': '191.128.0.0/12', + 'BS': '24.51.64.0/18', + 'BT': '119.2.96.0/19', + 'BW': '168.167.0.0/16', + 'BY': '178.120.0.0/13', + 'BZ': '179.42.192.0/18', + 'CA': '99.224.0.0/11', + 'CD': '41.243.0.0/16', + 'CF': '197.242.176.0/21', + 'CG': '160.113.0.0/16', + 'CH': '85.0.0.0/13', + 'CI': '102.136.0.0/14', + 'CK': '202.65.32.0/19', + 'CL': '152.172.0.0/14', + 'CM': '102.244.0.0/14', + 'CN': '36.128.0.0/10', + 'CO': '181.240.0.0/12', + 'CR': '201.192.0.0/12', + 'CU': '152.206.0.0/15', + 'CV': '165.90.96.0/19', + 'CW': '190.88.128.0/17', + 'CY': '31.153.0.0/16', + 'CZ': '88.100.0.0/14', + 'DE': '53.0.0.0/8', + 'DJ': '197.241.0.0/17', + 'DK': '87.48.0.0/12', + 'DM': '192.243.48.0/20', + 'DO': '152.166.0.0/15', + 'DZ': '41.96.0.0/12', + 'EC': '186.68.0.0/15', + 'EE': '90.190.0.0/15', + 'EG': '156.160.0.0/11', + 'ER': '196.200.96.0/20', + 'ES': '88.0.0.0/11', + 'ET': '196.188.0.0/14', + 'EU': '2.16.0.0/13', + 'FI': '91.152.0.0/13', + 'FJ': '144.120.0.0/16', + 'FK': '80.73.208.0/21', + 'FM': '119.252.112.0/20', + 'FO': '88.85.32.0/19', + 'FR': '90.0.0.0/9', + 'GA': '41.158.0.0/15', + 'GB': '25.0.0.0/8', + 'GD': '74.122.88.0/21', + 'GE': '31.146.0.0/16', + 'GF': '161.22.64.0/18', + 'GG': '62.68.160.0/19', + 'GH': '154.160.0.0/12', + 'GI': '95.164.0.0/16', + 'GL': '88.83.0.0/19', + 'GM': '160.182.0.0/15', + 'GN': '197.149.192.0/18', + 'GP': '104.250.0.0/19', + 'GQ': '105.235.224.0/20', + 'GR': '94.64.0.0/13', + 'GT': '168.234.0.0/16', + 'GU': '168.123.0.0/16', + 'GW': '197.214.80.0/20', + 'GY': '181.41.64.0/18', + 'HK': '113.252.0.0/14', + 'HN': '181.210.0.0/16', + 'HR': '93.136.0.0/13', + 'HT': '148.102.128.0/17', + 'HU': '84.0.0.0/14', + 'ID': '39.192.0.0/10', + 'IE': '87.32.0.0/12', + 'IL': '79.176.0.0/13', + 'IM': '5.62.80.0/20', + 'IN': '117.192.0.0/10', + 'IO': '203.83.48.0/21', + 'IQ': '37.236.0.0/14', + 'IR': '2.176.0.0/12', + 'IS': '82.221.0.0/16', + 'IT': '79.0.0.0/10', + 'JE': '87.244.64.0/18', + 'JM': '72.27.0.0/17', + 'JO': '176.29.0.0/16', + 'JP': '133.0.0.0/8', + 'KE': '105.48.0.0/12', + 'KG': '158.181.128.0/17', + 'KH': '36.37.128.0/17', + 'KI': '103.25.140.0/22', + 'KM': '197.255.224.0/20', + 'KN': '198.167.192.0/19', + 'KP': '175.45.176.0/22', + 'KR': '175.192.0.0/10', + 'KW': '37.36.0.0/14', + 'KY': '64.96.0.0/15', + 'KZ': '2.72.0.0/13', + 'LA': '115.84.64.0/18', + 'LB': '178.135.0.0/16', + 'LC': '24.92.144.0/20', + 'LI': '82.117.0.0/19', + 'LK': '112.134.0.0/15', + 'LR': '102.183.0.0/16', + 'LS': '129.232.0.0/17', + 'LT': '78.56.0.0/13', + 'LU': '188.42.0.0/16', + 'LV': '46.109.0.0/16', + 'LY': '41.252.0.0/14', + 'MA': '105.128.0.0/11', + 'MC': '88.209.64.0/18', + 'MD': '37.246.0.0/16', + 'ME': '178.175.0.0/17', + 'MF': '74.112.232.0/21', + 'MG': '154.126.0.0/17', + 'MH': '117.103.88.0/21', + 'MK': '77.28.0.0/15', + 'ML': '154.118.128.0/18', + 'MM': '37.111.0.0/17', + 'MN': '49.0.128.0/17', + 'MO': '60.246.0.0/16', + 'MP': '202.88.64.0/20', + 'MQ': '109.203.224.0/19', + 'MR': '41.188.64.0/18', + 'MS': '208.90.112.0/22', + 'MT': '46.11.0.0/16', + 'MU': '105.16.0.0/12', + 'MV': '27.114.128.0/18', + 'MW': '102.70.0.0/15', + 'MX': '187.192.0.0/11', + 'MY': '175.136.0.0/13', + 'MZ': '197.218.0.0/15', + 'NA': '41.182.0.0/16', + 'NC': '101.101.0.0/18', + 'NE': '197.214.0.0/18', + 'NF': '203.17.240.0/22', + 'NG': '105.112.0.0/12', + 'NI': '186.76.0.0/15', + 'NL': '145.96.0.0/11', + 'NO': '84.208.0.0/13', + 'NP': '36.252.0.0/15', + 'NR': '203.98.224.0/19', + 'NU': '49.156.48.0/22', + 'NZ': '49.224.0.0/14', + 'OM': '5.36.0.0/15', + 'PA': '186.72.0.0/15', + 'PE': '186.160.0.0/14', + 'PF': '123.50.64.0/18', + 'PG': '124.240.192.0/19', + 'PH': '49.144.0.0/13', + 'PK': '39.32.0.0/11', + 'PL': '83.0.0.0/11', + 'PM': '70.36.0.0/20', + 'PR': '66.50.0.0/16', + 'PS': '188.161.0.0/16', + 'PT': '85.240.0.0/13', + 'PW': '202.124.224.0/20', + 'PY': '181.120.0.0/14', + 'QA': '37.210.0.0/15', + 'RE': '102.35.0.0/16', + 'RO': '79.112.0.0/13', + 'RS': '93.86.0.0/15', + 'RU': '5.136.0.0/13', + 'RW': '41.186.0.0/16', + 'SA': '188.48.0.0/13', + 'SB': '202.1.160.0/19', + 'SC': '154.192.0.0/11', + 'SD': '102.120.0.0/13', + 'SE': '78.64.0.0/12', + 'SG': '8.128.0.0/10', + 'SI': '188.196.0.0/14', + 'SK': '78.98.0.0/15', + 'SL': '102.143.0.0/17', + 'SM': '89.186.32.0/19', + 'SN': '41.82.0.0/15', + 'SO': '154.115.192.0/18', + 'SR': '186.179.128.0/17', + 'SS': '105.235.208.0/21', + 'ST': '197.159.160.0/19', + 'SV': '168.243.0.0/16', + 'SX': '190.102.0.0/20', + 'SY': '5.0.0.0/16', + 'SZ': '41.84.224.0/19', + 'TC': '65.255.48.0/20', + 'TD': '154.68.128.0/19', + 'TG': '196.168.0.0/14', + 'TH': '171.96.0.0/13', + 'TJ': '85.9.128.0/18', + 'TK': '27.96.24.0/21', + 'TL': '180.189.160.0/20', + 'TM': '95.85.96.0/19', + 'TN': '197.0.0.0/11', + 'TO': '175.176.144.0/21', + 'TR': '78.160.0.0/11', + 'TT': '186.44.0.0/15', + 'TV': '202.2.96.0/19', + 'TW': '120.96.0.0/11', + 'TZ': '156.156.0.0/14', + 'UA': '37.52.0.0/14', + 'UG': '102.80.0.0/13', + 'US': '6.0.0.0/8', + 'UY': '167.56.0.0/13', + 'UZ': '84.54.64.0/18', + 'VA': '212.77.0.0/19', + 'VC': '207.191.240.0/21', + 'VE': '186.88.0.0/13', + 'VG': '66.81.192.0/20', + 'VI': '146.226.0.0/16', + 'VN': '14.160.0.0/11', + 'VU': '202.80.32.0/20', + 'WF': '117.20.32.0/21', + 'WS': '202.4.32.0/19', + 'YE': '134.35.0.0/16', + 'YT': '41.242.116.0/22', + 'ZA': '41.0.0.0/11', + 'ZM': '102.144.0.0/13', + 'ZW': '102.177.192.0/18', + } + + @classmethod + def random_ipv4(cls, code_or_block): + if len(code_or_block) == 2: + block = cls._country_ip_map.get(code_or_block.upper()) + if not block: + return None + else: + block = code_or_block + addr, preflen = block.split('/') + addr_min = struct.unpack('!L', socket.inet_aton(addr))[0] + addr_max = addr_min | (0xffffffff >> int(preflen)) + return str(socket.inet_ntoa( + struct.pack('!L', random.randint(addr_min, addr_max)))) + + +# Both long_to_bytes and bytes_to_long are adapted from PyCrypto, which is +# released into Public Domain +# https://github.com/dlitz/pycrypto/blob/master/lib/Crypto/Util/number.py#L387 + +def long_to_bytes(n, blocksize=0): + """long_to_bytes(n:long, blocksize:int) : string + Convert a long integer to a byte string. + + If optional blocksize is given and greater than zero, pad the front of the + byte string with binary zeros so that the length is a multiple of + blocksize. + """ + # after much testing, this algorithm was deemed to be the fastest + s = b'' + n = int(n) + while n > 0: + s = struct.pack('>I', n & 0xffffffff) + s + n = n >> 32 + # strip off leading zeros + for i in range(len(s)): + if s[i] != b'\000'[0]: + break + else: + # only happens when n == 0 + s = b'\000' + i = 0 + s = s[i:] + # add back some pad bytes. this could be done more efficiently w.r.t. the + # de-padding being done above, but sigh... + if blocksize > 0 and len(s) % blocksize: + s = (blocksize - len(s) % blocksize) * b'\000' + s + return s + + +def bytes_to_long(s): + """bytes_to_long(string) : long + Convert a byte string to a long integer. + + This is (essentially) the inverse of long_to_bytes(). + """ + acc = 0 + length = len(s) + if length % 4: + extra = (4 - length % 4) + s = b'\000' * extra + s + length = length + extra + for i in range(0, length, 4): + acc = (acc << 32) + struct.unpack('>I', s[i:i + 4])[0] + return acc + + +def ohdave_rsa_encrypt(data, exponent, modulus): + ''' + Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/ + + Input: + data: data to encrypt, bytes-like object + exponent, modulus: parameter e and N of RSA algorithm, both integer + Output: hex string of encrypted data + + Limitation: supports one block encryption only + ''' + + payload = int(binascii.hexlify(data[::-1]), 16) + encrypted = pow(payload, exponent, modulus) + return '%x' % encrypted + + +def pkcs1pad(data, length): + """ + Padding input data with PKCS#1 scheme + + @param {int[]} data input data + @param {int} length target length + @returns {int[]} padded data + """ + if len(data) > length - 11: + raise ValueError('Input data too long for PKCS#1 padding') + + pseudo_random = [random.randint(0, 254) for _ in range(length - len(data) - 3)] + return [0, 2] + pseudo_random + [0] + data + + +def _base_n_table(n, table): + if not table and not n: + raise ValueError('Either table or n must be specified') + table = (table or '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')[:n] + + if n and n != len(table): + raise ValueError(f'base {n} exceeds table length {len(table)}') + return table + + +def encode_base_n(num, n=None, table=None): + """Convert given int to a base-n string""" + table = _base_n_table(n, table) + if not num: + return table[0] + + result, base = '', len(table) + while num: + result = table[num % base] + result + num = num // base + return result + + +def decode_base_n(string, n=None, table=None): + """Convert given base-n string to int""" + table = {char: index for index, char in enumerate(_base_n_table(n, table))} + result, base = 0, len(table) + for char in string: + result = result * base + table[char] + return result + + +def decode_packed_codes(code): + mobj = re.search(PACKED_CODES_RE, code) + obfuscated_code, base, count, symbols = mobj.groups() + base = int(base) + count = int(count) + symbols = symbols.split('|') + symbol_table = {} + + while count: + count -= 1 + base_n_count = encode_base_n(count, base) + symbol_table[base_n_count] = symbols[count] or base_n_count + + return re.sub( + r'\b(\w+)\b', lambda mobj: symbol_table[mobj.group(0)], + obfuscated_code) + + +def caesar(s, alphabet, shift): + if shift == 0: + return s + l = len(alphabet) + return ''.join( + alphabet[(alphabet.index(c) + shift) % l] if c in alphabet else c + for c in s) + + +def rot47(s): + return caesar(s, r'''!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~''', 47) + + +def parse_m3u8_attributes(attrib): + info = {} + for (key, val) in re.findall(r'(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)', attrib): + if val.startswith('"'): + val = val[1:-1] + info[key] = val + return info + + +def urshift(val, n): + return val >> n if val >= 0 else (val + 0x100000000) >> n + + +def write_xattr(path, key, value): + # Windows: Write xattrs to NTFS Alternate Data Streams: + # http://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29 + if compat_os_name == 'nt': + assert ':' not in key + assert os.path.exists(path) + + try: + with open(f'{path}:{key}', 'wb') as f: + f.write(value) + except OSError as e: + raise XAttrMetadataError(e.errno, e.strerror) + return + + # UNIX Method 1. Use os.setxattr/xattrs/pyxattrs modules + + setxattr = None + if callable(getattr(os, 'setxattr', None)): + setxattr = os.setxattr + elif getattr(xattr, '_yt_dlp__identifier', None) == 'pyxattr': + # Unicode arguments are not supported in pyxattr until version 0.5.0 + # See https://github.com/ytdl-org/youtube-dl/issues/5498 + if version_tuple(xattr.__version__) >= (0, 5, 0): + setxattr = xattr.set + elif xattr: + setxattr = xattr.setxattr + + if setxattr: + try: + setxattr(path, key, value) + except OSError as e: + raise XAttrMetadataError(e.errno, e.strerror) + return + + # UNIX Method 2. Use setfattr/xattr executables + exe = ('setfattr' if check_executable('setfattr', ['--version']) + else 'xattr' if check_executable('xattr', ['-h']) else None) + if not exe: + raise XAttrUnavailableError( + 'Couldn\'t find a tool to set the xattrs. Install either the python "xattr" or "pyxattr" modules or the ' + + ('"xattr" binary' if sys.platform != 'linux' else 'GNU "attr" package (which contains the "setfattr" tool)')) + + value = value.decode() + try: + _, stderr, returncode = Popen.run( + [exe, '-w', key, value, path] if exe == 'xattr' else [exe, '-n', key, '-v', value, path], + text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + except OSError as e: + raise XAttrMetadataError(e.errno, e.strerror) + if returncode: + raise XAttrMetadataError(returncode, stderr) + + +def random_birthday(year_field, month_field, day_field): + start_date = datetime.date(1950, 1, 1) + end_date = datetime.date(1995, 12, 31) + offset = random.randint(0, (end_date - start_date).days) + random_date = start_date + datetime.timedelta(offset) + return { + year_field: str(random_date.year), + month_field: str(random_date.month), + day_field: str(random_date.day), + } + + +def find_available_port(interface=''): + try: + with socket.socket() as sock: + sock.bind((interface, 0)) + return sock.getsockname()[1] + except OSError: + return None + + +# Templates for internet shortcut files, which are plain text files. +DOT_URL_LINK_TEMPLATE = '''\ +[InternetShortcut] +URL=%(url)s +''' + +DOT_WEBLOC_LINK_TEMPLATE = '''\ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +\t<key>URL</key> +\t<string>%(url)s</string> +</dict> +</plist> +''' + +DOT_DESKTOP_LINK_TEMPLATE = '''\ +[Desktop Entry] +Encoding=UTF-8 +Name=%(filename)s +Type=Link +URL=%(url)s +Icon=text-html +''' + +LINK_TEMPLATES = { + 'url': DOT_URL_LINK_TEMPLATE, + 'desktop': DOT_DESKTOP_LINK_TEMPLATE, + 'webloc': DOT_WEBLOC_LINK_TEMPLATE, +} + + +def iri_to_uri(iri): + """ + Converts an IRI (Internationalized Resource Identifier, allowing Unicode characters) to a URI (Uniform Resource Identifier, ASCII-only). + + The function doesn't add an additional layer of escaping; e.g., it doesn't escape `%3C` as `%253C`. Instead, it percent-escapes characters with an underlying UTF-8 encoding *besides* those already escaped, leaving the URI intact. + """ + + iri_parts = urllib.parse.urlparse(iri) + + if '[' in iri_parts.netloc: + raise ValueError('IPv6 URIs are not, yet, supported.') + # Querying `.netloc`, when there's only one bracket, also raises a ValueError. + + # The `safe` argument values, that the following code uses, contain the characters that should not be percent-encoded. Everything else but letters, digits and '_.-' will be percent-encoded with an underlying UTF-8 encoding. Everything already percent-encoded will be left as is. + + net_location = '' + if iri_parts.username: + net_location += urllib.parse.quote(iri_parts.username, safe=r"!$%&'()*+,~") + if iri_parts.password is not None: + net_location += ':' + urllib.parse.quote(iri_parts.password, safe=r"!$%&'()*+,~") + net_location += '@' + + net_location += iri_parts.hostname.encode('idna').decode() # Punycode for Unicode hostnames. + # The 'idna' encoding produces ASCII text. + if iri_parts.port is not None and iri_parts.port != 80: + net_location += ':' + str(iri_parts.port) + + return urllib.parse.urlunparse( + (iri_parts.scheme, + net_location, + + urllib.parse.quote_plus(iri_parts.path, safe=r"!$%&'()*+,/:;=@|~"), + + # Unsure about the `safe` argument, since this is a legacy way of handling parameters. + urllib.parse.quote_plus(iri_parts.params, safe=r"!$%&'()*+,/:;=@|~"), + + # Not totally sure about the `safe` argument, since the source does not explicitly mention the query URI component. + urllib.parse.quote_plus(iri_parts.query, safe=r"!$%&'()*+,/:;=?@{|}~"), + + urllib.parse.quote_plus(iri_parts.fragment, safe=r"!#$%&'()*+,/:;=?@{|}~"))) + + # Source for `safe` arguments: https://url.spec.whatwg.org/#percent-encoded-bytes. + + +def to_high_limit_path(path): + if sys.platform in ['win32', 'cygwin']: + # Work around MAX_PATH limitation on Windows. The maximum allowed length for the individual path segments may still be quite limited. + return '\\\\?\\' + os.path.abspath(path) + + return path + + +def format_field(obj, field=None, template='%s', ignore=NO_DEFAULT, default='', func=IDENTITY): + val = traversal.traverse_obj(obj, *variadic(field)) + if not val if ignore is NO_DEFAULT else val in variadic(ignore): + return default + return template % func(val) + + +def clean_podcast_url(url): + url = re.sub(r'''(?x) + (?: + (?: + chtbl\.com/track| + media\.blubrry\.com| # https://create.blubrry.com/resources/podcast-media-download-statistics/getting-started/ + play\.podtrac\.com| + chrt\.fm/track| + mgln\.ai/e + )(?:/[^/.]+)?| + (?:dts|www)\.podtrac\.com/(?:pts/)?redirect\.[0-9a-z]{3,4}| # http://analytics.podtrac.com/how-to-measure + flex\.acast\.com| + pd(?: + cn\.co| # https://podcorn.com/analytics-prefix/ + st\.fm # https://podsights.com/docs/ + )/e| + [0-9]\.gum\.fm| + pscrb\.fm/rss/p + )/''', '', url) + return re.sub(r'^\w+://(\w+://)', r'\1', url) + + +_HEX_TABLE = '0123456789abcdef' + + +def random_uuidv4(): + return re.sub(r'[xy]', lambda x: _HEX_TABLE[random.randint(0, 15)], 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx') + + +def make_dir(path, to_screen=None): + try: + dn = os.path.dirname(path) + if dn: + os.makedirs(dn, exist_ok=True) + return True + except OSError as err: + if callable(to_screen) is not None: + to_screen(f'unable to create directory {err}') + return False + + +def get_executable_path(): + from ..update import _get_variant_and_executable_path + + return os.path.dirname(os.path.abspath(_get_variant_and_executable_path()[1])) + + +def get_user_config_dirs(package_name): + # .config (e.g. ~/.config/package_name) + xdg_config_home = os.getenv('XDG_CONFIG_HOME') or compat_expanduser('~/.config') + yield os.path.join(xdg_config_home, package_name) + + # appdata (%APPDATA%/package_name) + appdata_dir = os.getenv('appdata') + if appdata_dir: + yield os.path.join(appdata_dir, package_name) + + # home (~/.package_name) + yield os.path.join(compat_expanduser('~'), f'.{package_name}') + + +def get_system_config_dirs(package_name): + # /etc/package_name + yield os.path.join('/etc', package_name) + + +def time_seconds(**kwargs): + """ + Returns TZ-aware time in seconds since the epoch (1970-01-01T00:00:00Z) + """ + return time.time() + datetime.timedelta(**kwargs).total_seconds() + + +# create a JSON Web Signature (jws) with HS256 algorithm +# the resulting format is in JWS Compact Serialization +# implemented following JWT https://www.rfc-editor.org/rfc/rfc7519.html +# implemented following JWS https://www.rfc-editor.org/rfc/rfc7515.html +def jwt_encode_hs256(payload_data, key, headers={}): + header_data = { + 'alg': 'HS256', + 'typ': 'JWT', + } + if headers: + header_data.update(headers) + header_b64 = base64.b64encode(json.dumps(header_data).encode()) + payload_b64 = base64.b64encode(json.dumps(payload_data).encode()) + h = hmac.new(key.encode(), header_b64 + b'.' + payload_b64, hashlib.sha256) + signature_b64 = base64.b64encode(h.digest()) + token = header_b64 + b'.' + payload_b64 + b'.' + signature_b64 + return token + + +# can be extended in future to verify the signature and parse header and return the algorithm used if it's not HS256 +def jwt_decode_hs256(jwt): + header_b64, payload_b64, signature_b64 = jwt.split('.') + # add trailing ='s that may have been stripped, superfluous ='s are ignored + payload_data = json.loads(base64.urlsafe_b64decode(f'{payload_b64}===')) + return payload_data + + +WINDOWS_VT_MODE = False if compat_os_name == 'nt' else None + + +@functools.cache +def supports_terminal_sequences(stream): + if compat_os_name == 'nt': + if not WINDOWS_VT_MODE: + return False + elif not os.getenv('TERM'): + return False + try: + return stream.isatty() + except BaseException: + return False + + +def windows_enable_vt_mode(): + """Ref: https://bugs.python.org/issue30075 """ + if get_windows_version() < (10, 0, 10586): + return + + import ctypes + import ctypes.wintypes + import msvcrt + + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + + dll = ctypes.WinDLL('kernel32', use_last_error=False) + handle = os.open('CONOUT$', os.O_RDWR) + try: + h_out = ctypes.wintypes.HANDLE(msvcrt.get_osfhandle(handle)) + dw_original_mode = ctypes.wintypes.DWORD() + success = dll.GetConsoleMode(h_out, ctypes.byref(dw_original_mode)) + if not success: + raise Exception('GetConsoleMode failed') + + success = dll.SetConsoleMode(h_out, ctypes.wintypes.DWORD( + dw_original_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) + if not success: + raise Exception('SetConsoleMode failed') + finally: + os.close(handle) + + global WINDOWS_VT_MODE + WINDOWS_VT_MODE = True + supports_terminal_sequences.cache_clear() + + +_terminal_sequences_re = re.compile('\033\\[[^m]+m') + + +def remove_terminal_sequences(string): + return _terminal_sequences_re.sub('', string) + + +def number_of_digits(number): + return len('%d' % number) + + +def join_nonempty(*values, delim='-', from_dict=None): + if from_dict is not None: + values = (traversal.traverse_obj(from_dict, variadic(v)) for v in values) + return delim.join(map(str, filter(None, values))) + + +def scale_thumbnails_to_max_format_width(formats, thumbnails, url_width_re): + """ + Find the largest format dimensions in terms of video width and, for each thumbnail: + * Modify the URL: Match the width with the provided regex and replace with the former width + * Update dimensions + + This function is useful with video services that scale the provided thumbnails on demand + """ + _keys = ('width', 'height') + max_dimensions = max( + (tuple(format.get(k) or 0 for k in _keys) for format in formats), + default=(0, 0)) + if not max_dimensions[0]: + return thumbnails + return [ + merge_dicts( + {'url': re.sub(url_width_re, str(max_dimensions[0]), thumbnail['url'])}, + dict(zip(_keys, max_dimensions)), thumbnail) + for thumbnail in thumbnails + ] + + +def parse_http_range(range): + """ Parse value of "Range" or "Content-Range" HTTP header into tuple. """ + if not range: + return None, None, None + crg = re.search(r'bytes[ =](\d+)-(\d+)?(?:/(\d+))?', range) + if not crg: + return None, None, None + return int(crg.group(1)), int_or_none(crg.group(2)), int_or_none(crg.group(3)) + + +def read_stdin(what): + eof = 'Ctrl+Z' if compat_os_name == 'nt' else 'Ctrl+D' + write_string(f'Reading {what} from STDIN - EOF ({eof}) to end:\n') + return sys.stdin + + +def determine_file_encoding(data): + """ + Detect the text encoding used + @returns (encoding, bytes to skip) + """ + + # BOM marks are given priority over declarations + for bom, enc in BOMS: + if data.startswith(bom): + return enc, len(bom) + + # Strip off all null bytes to match even when UTF-16 or UTF-32 is used. + # We ignore the endianness to get a good enough match + data = data.replace(b'\0', b'') + mobj = re.match(rb'(?m)^#\s*coding\s*:\s*(\S+)\s*$', data) + return mobj.group(1).decode() if mobj else None, 0 + + +class Config: + own_args = None + parsed_args = None + filename = None + __initialized = False + + def __init__(self, parser, label=None): + self.parser, self.label = parser, label + self._loaded_paths, self.configs = set(), [] + + def init(self, args=None, filename=None): + assert not self.__initialized + self.own_args, self.filename = args, filename + return self.load_configs() + + def load_configs(self): + directory = '' + if self.filename: + location = os.path.realpath(self.filename) + directory = os.path.dirname(location) + if location in self._loaded_paths: + return False + self._loaded_paths.add(location) + + self.__initialized = True + opts, _ = self.parser.parse_known_args(self.own_args) + self.parsed_args = self.own_args + for location in opts.config_locations or []: + if location == '-': + if location in self._loaded_paths: + continue + self._loaded_paths.add(location) + self.append_config(shlex.split(read_stdin('options'), comments=True), label='stdin') + continue + location = os.path.join(directory, expand_path(location)) + if os.path.isdir(location): + location = os.path.join(location, 'yt-dlp.conf') + if not os.path.exists(location): + self.parser.error(f'config location {location} does not exist') + self.append_config(self.read_file(location), location) + return True + + def __str__(self): + label = join_nonempty( + self.label, 'config', f'"{self.filename}"' if self.filename else '', + delim=' ') + return join_nonempty( + self.own_args is not None and f'{label[0].upper()}{label[1:]}: {self.hide_login_info(self.own_args)}', + *(f'\n{c}'.replace('\n', '\n| ')[1:] for c in self.configs), + delim='\n') + + @staticmethod + def read_file(filename, default=[]): + try: + optionf = open(filename, 'rb') + except OSError: + return default # silently skip if file is not present + try: + enc, skip = determine_file_encoding(optionf.read(512)) + optionf.seek(skip, io.SEEK_SET) + except OSError: + enc = None # silently skip read errors + try: + # FIXME: https://github.com/ytdl-org/youtube-dl/commit/dfe5fa49aed02cf36ba9f743b11b0903554b5e56 + contents = optionf.read().decode(enc or preferredencoding()) + res = shlex.split(contents, comments=True) + except Exception as err: + raise ValueError(f'Unable to parse "{filename}": {err}') + finally: + optionf.close() + return res + + @staticmethod + def hide_login_info(opts): + PRIVATE_OPTS = {'-p', '--password', '-u', '--username', '--video-password', '--ap-password', '--ap-username'} + eqre = re.compile('^(?P<key>' + ('|'.join(re.escape(po) for po in PRIVATE_OPTS)) + ')=.+$') + + def _scrub_eq(o): + m = eqre.match(o) + if m: + return m.group('key') + '=PRIVATE' + else: + return o + + opts = list(map(_scrub_eq, opts)) + for idx, opt in enumerate(opts): + if opt in PRIVATE_OPTS and idx + 1 < len(opts): + opts[idx + 1] = 'PRIVATE' + return opts + + def append_config(self, *args, label=None): + config = type(self)(self.parser, label) + config._loaded_paths = self._loaded_paths + if config.init(*args): + self.configs.append(config) + + @property + def all_args(self): + for config in reversed(self.configs): + yield from config.all_args + yield from self.parsed_args or [] + + def parse_known_args(self, **kwargs): + return self.parser.parse_known_args(self.all_args, **kwargs) + + def parse_args(self): + return self.parser.parse_args(self.all_args) + + +class WebSocketsWrapper: + """Wraps websockets module to use in non-async scopes""" + pool = None + + def __init__(self, url, headers=None, connect=True): + self.loop = asyncio.new_event_loop() + # XXX: "loop" is deprecated + self.conn = websockets.connect( + url, extra_headers=headers, ping_interval=None, + close_timeout=float('inf'), loop=self.loop, ping_timeout=float('inf')) + if connect: + self.__enter__() + atexit.register(self.__exit__, None, None, None) + + def __enter__(self): + if not self.pool: + self.pool = self.run_with_loop(self.conn.__aenter__(), self.loop) + return self + + def send(self, *args): + self.run_with_loop(self.pool.send(*args), self.loop) + + def recv(self, *args): + return self.run_with_loop(self.pool.recv(*args), self.loop) + + def __exit__(self, type, value, traceback): + try: + return self.run_with_loop(self.conn.__aexit__(type, value, traceback), self.loop) + finally: + self.loop.close() + self._cancel_all_tasks(self.loop) + + # taken from https://github.com/python/cpython/blob/3.9/Lib/asyncio/runners.py with modifications + # for contributors: If there's any new library using asyncio needs to be run in non-async, move these function out of this class + @staticmethod + def run_with_loop(main, loop): + if not asyncio.iscoroutine(main): + raise ValueError(f'a coroutine was expected, got {main!r}') + + try: + return loop.run_until_complete(main) + finally: + loop.run_until_complete(loop.shutdown_asyncgens()) + if hasattr(loop, 'shutdown_default_executor'): + loop.run_until_complete(loop.shutdown_default_executor()) + + @staticmethod + def _cancel_all_tasks(loop): + to_cancel = asyncio.all_tasks(loop) + + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + # XXX: "loop" is removed in python 3.10+ + loop.run_until_complete( + asyncio.gather(*to_cancel, loop=loop, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler({ + 'message': 'unhandled exception during asyncio.run() shutdown', + 'exception': task.exception(), + 'task': task, + }) + + +def merge_headers(*dicts): + """Merge dicts of http headers case insensitively, prioritizing the latter ones""" + return {k.title(): v for k, v in itertools.chain.from_iterable(map(dict.items, dicts))} + + +def cached_method(f): + """Cache a method""" + signature = inspect.signature(f) + + @functools.wraps(f) + def wrapper(self, *args, **kwargs): + bound_args = signature.bind(self, *args, **kwargs) + bound_args.apply_defaults() + key = tuple(bound_args.arguments.values())[1:] + + cache = vars(self).setdefault('_cached_method__cache', {}).setdefault(f.__name__, {}) + if key not in cache: + cache[key] = f(self, *args, **kwargs) + return cache[key] + return wrapper + + +class classproperty: + """property access for class methods with optional caching""" + def __new__(cls, func=None, *args, **kwargs): + if not func: + return functools.partial(cls, *args, **kwargs) + return super().__new__(cls) + + def __init__(self, func, *, cache=False): + functools.update_wrapper(self, func) + self.func = func + self._cache = {} if cache else None + + def __get__(self, _, cls): + if self._cache is None: + return self.func(cls) + elif cls not in self._cache: + self._cache[cls] = self.func(cls) + return self._cache[cls] + + +class function_with_repr: + def __init__(self, func, repr_=None): + functools.update_wrapper(self, func) + self.func, self.__repr = func, repr_ + + def __call__(self, *args, **kwargs): + return self.func(*args, **kwargs) + + def __repr__(self): + if self.__repr: + return self.__repr + return f'{self.func.__module__}.{self.func.__qualname__}' + + +class Namespace(types.SimpleNamespace): + """Immutable namespace""" + + def __iter__(self): + return iter(self.__dict__.values()) + + @property + def items_(self): + return self.__dict__.items() + + +MEDIA_EXTENSIONS = Namespace( + common_video=('avi', 'flv', 'mkv', 'mov', 'mp4', 'webm'), + video=('3g2', '3gp', 'f4v', 'mk3d', 'divx', 'mpg', 'ogv', 'm4v', 'wmv'), + common_audio=('aiff', 'alac', 'flac', 'm4a', 'mka', 'mp3', 'ogg', 'opus', 'wav'), + audio=('aac', 'ape', 'asf', 'f4a', 'f4b', 'm4b', 'm4p', 'm4r', 'oga', 'ogx', 'spx', 'vorbis', 'wma', 'weba'), + thumbnails=('jpg', 'png', 'webp'), + storyboards=('mhtml', ), + subtitles=('srt', 'vtt', 'ass', 'lrc'), + manifests=('f4f', 'f4m', 'm3u8', 'smil', 'mpd'), +) +MEDIA_EXTENSIONS.video += MEDIA_EXTENSIONS.common_video +MEDIA_EXTENSIONS.audio += MEDIA_EXTENSIONS.common_audio + +KNOWN_EXTENSIONS = (*MEDIA_EXTENSIONS.video, *MEDIA_EXTENSIONS.audio, *MEDIA_EXTENSIONS.manifests) + + +class RetryManager: + """Usage: + for retry in RetryManager(...): + try: + ... + except SomeException as err: + retry.error = err + continue + """ + attempt, _error = 0, None + + def __init__(self, _retries, _error_callback, **kwargs): + self.retries = _retries or 0 + self.error_callback = functools.partial(_error_callback, **kwargs) + + def _should_retry(self): + return self._error is not NO_DEFAULT and self.attempt <= self.retries + + @property + def error(self): + if self._error is NO_DEFAULT: + return None + return self._error + + @error.setter + def error(self, value): + self._error = value + + def __iter__(self): + while self._should_retry(): + self.error = NO_DEFAULT + self.attempt += 1 + yield self + if self.error: + self.error_callback(self.error, self.attempt, self.retries) + + @staticmethod + def report_retry(e, count, retries, *, sleep_func, info, warn, error=None, suffix=None): + """Utility function for reporting retries""" + if count > retries: + if error: + return error(f'{e}. Giving up after {count - 1} retries') if count > 1 else error(str(e)) + raise e + + if not count: + return warn(e) + elif isinstance(e, ExtractorError): + e = remove_end(str_or_none(e.cause) or e.orig_msg, '.') + warn(f'{e}. Retrying{format_field(suffix, None, " %s")} ({count}/{retries})...') + + delay = float_or_none(sleep_func(n=count - 1)) if callable(sleep_func) else sleep_func + if delay: + info(f'Sleeping {delay:.2f} seconds ...') + time.sleep(delay) + + +def make_archive_id(ie, video_id): + ie_key = ie if isinstance(ie, str) else ie.ie_key() + return f'{ie_key.lower()} {video_id}' + + +def truncate_string(s, left, right=0): + assert left > 3 and right >= 0 + if s is None or len(s) <= left + right: + return s + return f'{s[:left-3]}...{s[-right:] if right else ""}' + + +def orderedSet_from_options(options, alias_dict, *, use_regex=False, start=None): + assert 'all' in alias_dict, '"all" alias is required' + requested = list(start or []) + for val in options: + discard = val.startswith('-') + if discard: + val = val[1:] + + if val in alias_dict: + val = alias_dict[val] if not discard else [ + i[1:] if i.startswith('-') else f'-{i}' for i in alias_dict[val]] + # NB: Do not allow regex in aliases for performance + requested = orderedSet_from_options(val, alias_dict, start=requested) + continue + + current = (filter(re.compile(val, re.I).fullmatch, alias_dict['all']) if use_regex + else [val] if val in alias_dict['all'] else None) + if current is None: + raise ValueError(val) + + if discard: + for item in current: + while item in requested: + requested.remove(item) + else: + requested.extend(current) + + return orderedSet(requested) + + +# TODO: Rewrite +class FormatSorter: + regex = r' *((?P<reverse>\+)?(?P<field>[a-zA-Z0-9_]+)((?P<separator>[~:])(?P<limit>.*?))?)? *$' + + default = ('hidden', 'aud_or_vid', 'hasvid', 'ie_pref', 'lang', 'quality', + 'res', 'fps', 'hdr:12', 'vcodec:vp9.2', 'channels', 'acodec', + 'size', 'br', 'asr', 'proto', 'ext', 'hasaud', 'source', 'id') # These must not be aliases + ytdl_default = ('hasaud', 'lang', 'quality', 'tbr', 'filesize', 'vbr', + 'height', 'width', 'proto', 'vext', 'abr', 'aext', + 'fps', 'fs_approx', 'source', 'id') + + settings = { + 'vcodec': {'type': 'ordered', 'regex': True, + 'order': ['av0?1', 'vp0?9.2', 'vp0?9', '[hx]265|he?vc?', '[hx]264|avc', 'vp0?8', 'mp4v|h263', 'theora', '', None, 'none']}, + 'acodec': {'type': 'ordered', 'regex': True, + 'order': ['[af]lac', 'wav|aiff', 'opus', 'vorbis|ogg', 'aac', 'mp?4a?', 'mp3', 'ac-?4', 'e-?a?c-?3', 'ac-?3', 'dts', '', None, 'none']}, + 'hdr': {'type': 'ordered', 'regex': True, 'field': 'dynamic_range', + 'order': ['dv', '(hdr)?12', r'(hdr)?10\+', '(hdr)?10', 'hlg', '', 'sdr', None]}, + 'proto': {'type': 'ordered', 'regex': True, 'field': 'protocol', + 'order': ['(ht|f)tps', '(ht|f)tp$', 'm3u8.*', '.*dash', 'websocket_frag', 'rtmpe?', '', 'mms|rtsp', 'ws|websocket', 'f4']}, + 'vext': {'type': 'ordered', 'field': 'video_ext', + 'order': ('mp4', 'mov', 'webm', 'flv', '', 'none'), + 'order_free': ('webm', 'mp4', 'mov', 'flv', '', 'none')}, + 'aext': {'type': 'ordered', 'regex': True, 'field': 'audio_ext', + 'order': ('m4a', 'aac', 'mp3', 'ogg', 'opus', 'web[am]', '', 'none'), + 'order_free': ('ogg', 'opus', 'web[am]', 'mp3', 'm4a', 'aac', '', 'none')}, + 'hidden': {'visible': False, 'forced': True, 'type': 'extractor', 'max': -1000}, + 'aud_or_vid': {'visible': False, 'forced': True, 'type': 'multiple', + 'field': ('vcodec', 'acodec'), + 'function': lambda it: int(any(v != 'none' for v in it))}, + 'ie_pref': {'priority': True, 'type': 'extractor'}, + 'hasvid': {'priority': True, 'field': 'vcodec', 'type': 'boolean', 'not_in_list': ('none',)}, + 'hasaud': {'field': 'acodec', 'type': 'boolean', 'not_in_list': ('none',)}, + 'lang': {'convert': 'float', 'field': 'language_preference', 'default': -1}, + 'quality': {'convert': 'float', 'default': -1}, + 'filesize': {'convert': 'bytes'}, + 'fs_approx': {'convert': 'bytes', 'field': 'filesize_approx'}, + 'id': {'convert': 'string', 'field': 'format_id'}, + 'height': {'convert': 'float_none'}, + 'width': {'convert': 'float_none'}, + 'fps': {'convert': 'float_none'}, + 'channels': {'convert': 'float_none', 'field': 'audio_channels'}, + 'tbr': {'convert': 'float_none'}, + 'vbr': {'convert': 'float_none'}, + 'abr': {'convert': 'float_none'}, + 'asr': {'convert': 'float_none'}, + 'source': {'convert': 'float', 'field': 'source_preference', 'default': -1}, + + 'codec': {'type': 'combined', 'field': ('vcodec', 'acodec')}, + 'br': {'type': 'multiple', 'field': ('tbr', 'vbr', 'abr'), 'convert': 'float_none', + 'function': lambda it: next(filter(None, it), None)}, + 'size': {'type': 'multiple', 'field': ('filesize', 'fs_approx'), 'convert': 'bytes', + 'function': lambda it: next(filter(None, it), None)}, + 'ext': {'type': 'combined', 'field': ('vext', 'aext')}, + 'res': {'type': 'multiple', 'field': ('height', 'width'), + 'function': lambda it: (lambda l: min(l) if l else 0)(tuple(filter(None, it)))}, + + # Actual field names + 'format_id': {'type': 'alias', 'field': 'id'}, + 'preference': {'type': 'alias', 'field': 'ie_pref'}, + 'language_preference': {'type': 'alias', 'field': 'lang'}, + 'source_preference': {'type': 'alias', 'field': 'source'}, + 'protocol': {'type': 'alias', 'field': 'proto'}, + 'filesize_approx': {'type': 'alias', 'field': 'fs_approx'}, + 'audio_channels': {'type': 'alias', 'field': 'channels'}, + + # Deprecated + 'dimension': {'type': 'alias', 'field': 'res', 'deprecated': True}, + 'resolution': {'type': 'alias', 'field': 'res', 'deprecated': True}, + 'extension': {'type': 'alias', 'field': 'ext', 'deprecated': True}, + 'bitrate': {'type': 'alias', 'field': 'br', 'deprecated': True}, + 'total_bitrate': {'type': 'alias', 'field': 'tbr', 'deprecated': True}, + 'video_bitrate': {'type': 'alias', 'field': 'vbr', 'deprecated': True}, + 'audio_bitrate': {'type': 'alias', 'field': 'abr', 'deprecated': True}, + 'framerate': {'type': 'alias', 'field': 'fps', 'deprecated': True}, + 'filesize_estimate': {'type': 'alias', 'field': 'size', 'deprecated': True}, + 'samplerate': {'type': 'alias', 'field': 'asr', 'deprecated': True}, + 'video_ext': {'type': 'alias', 'field': 'vext', 'deprecated': True}, + 'audio_ext': {'type': 'alias', 'field': 'aext', 'deprecated': True}, + 'video_codec': {'type': 'alias', 'field': 'vcodec', 'deprecated': True}, + 'audio_codec': {'type': 'alias', 'field': 'acodec', 'deprecated': True}, + 'video': {'type': 'alias', 'field': 'hasvid', 'deprecated': True}, + 'has_video': {'type': 'alias', 'field': 'hasvid', 'deprecated': True}, + 'audio': {'type': 'alias', 'field': 'hasaud', 'deprecated': True}, + 'has_audio': {'type': 'alias', 'field': 'hasaud', 'deprecated': True}, + 'extractor': {'type': 'alias', 'field': 'ie_pref', 'deprecated': True}, + 'extractor_preference': {'type': 'alias', 'field': 'ie_pref', 'deprecated': True}, + } + + def __init__(self, ydl, field_preference): + self.ydl = ydl + self._order = [] + self.evaluate_params(self.ydl.params, field_preference) + if ydl.params.get('verbose'): + self.print_verbose_info(self.ydl.write_debug) + + def _get_field_setting(self, field, key): + if field not in self.settings: + if key in ('forced', 'priority'): + return False + self.ydl.deprecated_feature(f'Using arbitrary fields ({field}) for format sorting is ' + 'deprecated and may be removed in a future version') + self.settings[field] = {} + propObj = self.settings[field] + if key not in propObj: + type = propObj.get('type') + if key == 'field': + default = 'preference' if type == 'extractor' else (field,) if type in ('combined', 'multiple') else field + elif key == 'convert': + default = 'order' if type == 'ordered' else 'float_string' if field else 'ignore' + else: + default = {'type': 'field', 'visible': True, 'order': [], 'not_in_list': (None,)}.get(key, None) + propObj[key] = default + return propObj[key] + + def _resolve_field_value(self, field, value, convertNone=False): + if value is None: + if not convertNone: + return None + else: + value = value.lower() + conversion = self._get_field_setting(field, 'convert') + if conversion == 'ignore': + return None + if conversion == 'string': + return value + elif conversion == 'float_none': + return float_or_none(value) + elif conversion == 'bytes': + return parse_bytes(value) + elif conversion == 'order': + order_list = (self._use_free_order and self._get_field_setting(field, 'order_free')) or self._get_field_setting(field, 'order') + use_regex = self._get_field_setting(field, 'regex') + list_length = len(order_list) + empty_pos = order_list.index('') if '' in order_list else list_length + 1 + if use_regex and value is not None: + for i, regex in enumerate(order_list): + if regex and re.match(regex, value): + return list_length - i + return list_length - empty_pos # not in list + else: # not regex or value = None + return list_length - (order_list.index(value) if value in order_list else empty_pos) + else: + if value.isnumeric(): + return float(value) + else: + self.settings[field]['convert'] = 'string' + return value + + def evaluate_params(self, params, sort_extractor): + self._use_free_order = params.get('prefer_free_formats', False) + self._sort_user = params.get('format_sort', []) + self._sort_extractor = sort_extractor + + def add_item(field, reverse, closest, limit_text): + field = field.lower() + if field in self._order: + return + self._order.append(field) + limit = self._resolve_field_value(field, limit_text) + data = { + 'reverse': reverse, + 'closest': False if limit is None else closest, + 'limit_text': limit_text, + 'limit': limit} + if field in self.settings: + self.settings[field].update(data) + else: + self.settings[field] = data + + sort_list = ( + tuple(field for field in self.default if self._get_field_setting(field, 'forced')) + + (tuple() if params.get('format_sort_force', False) + else tuple(field for field in self.default if self._get_field_setting(field, 'priority'))) + + tuple(self._sort_user) + tuple(sort_extractor) + self.default) + + for item in sort_list: + match = re.match(self.regex, item) + if match is None: + raise ExtractorError('Invalid format sort string "%s" given by extractor' % item) + field = match.group('field') + if field is None: + continue + if self._get_field_setting(field, 'type') == 'alias': + alias, field = field, self._get_field_setting(field, 'field') + if self._get_field_setting(alias, 'deprecated'): + self.ydl.deprecated_feature(f'Format sorting alias {alias} is deprecated and may ' + f'be removed in a future version. Please use {field} instead') + reverse = match.group('reverse') is not None + closest = match.group('separator') == '~' + limit_text = match.group('limit') + + has_limit = limit_text is not None + has_multiple_fields = self._get_field_setting(field, 'type') == 'combined' + has_multiple_limits = has_limit and has_multiple_fields and not self._get_field_setting(field, 'same_limit') + + fields = self._get_field_setting(field, 'field') if has_multiple_fields else (field,) + limits = limit_text.split(':') if has_multiple_limits else (limit_text,) if has_limit else tuple() + limit_count = len(limits) + for (i, f) in enumerate(fields): + add_item(f, reverse, closest, + limits[i] if i < limit_count + else limits[0] if has_limit and not has_multiple_limits + else None) + + def print_verbose_info(self, write_debug): + if self._sort_user: + write_debug('Sort order given by user: %s' % ', '.join(self._sort_user)) + if self._sort_extractor: + write_debug('Sort order given by extractor: %s' % ', '.join(self._sort_extractor)) + write_debug('Formats sorted by: %s' % ', '.join(['%s%s%s' % ( + '+' if self._get_field_setting(field, 'reverse') else '', field, + '%s%s(%s)' % ('~' if self._get_field_setting(field, 'closest') else ':', + self._get_field_setting(field, 'limit_text'), + self._get_field_setting(field, 'limit')) + if self._get_field_setting(field, 'limit_text') is not None else '') + for field in self._order if self._get_field_setting(field, 'visible')])) + + def _calculate_field_preference_from_value(self, format, field, type, value): + reverse = self._get_field_setting(field, 'reverse') + closest = self._get_field_setting(field, 'closest') + limit = self._get_field_setting(field, 'limit') + + if type == 'extractor': + maximum = self._get_field_setting(field, 'max') + if value is None or (maximum is not None and value >= maximum): + value = -1 + elif type == 'boolean': + in_list = self._get_field_setting(field, 'in_list') + not_in_list = self._get_field_setting(field, 'not_in_list') + value = 0 if ((in_list is None or value in in_list) and (not_in_list is None or value not in not_in_list)) else -1 + elif type == 'ordered': + value = self._resolve_field_value(field, value, True) + + # try to convert to number + val_num = float_or_none(value, default=self._get_field_setting(field, 'default')) + is_num = self._get_field_setting(field, 'convert') != 'string' and val_num is not None + if is_num: + value = val_num + + return ((-10, 0) if value is None + else (1, value, 0) if not is_num # if a field has mixed strings and numbers, strings are sorted higher + else (0, -abs(value - limit), value - limit if reverse else limit - value) if closest + else (0, value, 0) if not reverse and (limit is None or value <= limit) + else (0, -value, 0) if limit is None or (reverse and value == limit) or value > limit + else (-1, value, 0)) + + def _calculate_field_preference(self, format, field): + type = self._get_field_setting(field, 'type') # extractor, boolean, ordered, field, multiple + get_value = lambda f: format.get(self._get_field_setting(f, 'field')) + if type == 'multiple': + type = 'field' # Only 'field' is allowed in multiple for now + actual_fields = self._get_field_setting(field, 'field') + + value = self._get_field_setting(field, 'function')(get_value(f) for f in actual_fields) + else: + value = get_value(field) + return self._calculate_field_preference_from_value(format, field, type, value) + + def calculate_preference(self, format): + # Determine missing protocol + if not format.get('protocol'): + format['protocol'] = determine_protocol(format) + + # Determine missing ext + if not format.get('ext') and 'url' in format: + format['ext'] = determine_ext(format['url']) + if format.get('vcodec') == 'none': + format['audio_ext'] = format['ext'] if format.get('acodec') != 'none' else 'none' + format['video_ext'] = 'none' + else: + format['video_ext'] = format['ext'] + format['audio_ext'] = 'none' + # if format.get('preference') is None and format.get('ext') in ('f4f', 'f4m'): # Not supported? + # format['preference'] = -1000 + + if format.get('preference') is None and format.get('ext') == 'flv' and re.match('[hx]265|he?vc?', format.get('vcodec') or ''): + # HEVC-over-FLV is out-of-spec by FLV's original spec + # ref. https://trac.ffmpeg.org/ticket/6389 + # ref. https://github.com/yt-dlp/yt-dlp/pull/5821 + format['preference'] = -100 + + # Determine missing bitrates + if format.get('vcodec') == 'none': + format['vbr'] = 0 + if format.get('acodec') == 'none': + format['abr'] = 0 + if not format.get('vbr') and format.get('vcodec') != 'none': + format['vbr'] = try_call(lambda: format['tbr'] - format['abr']) or None + if not format.get('abr') and format.get('acodec') != 'none': + format['abr'] = try_call(lambda: format['tbr'] - format['vbr']) or None + if not format.get('tbr'): + format['tbr'] = try_call(lambda: format['vbr'] + format['abr']) or None + + return tuple(self._calculate_field_preference(format, field) for field in self._order) + + +# XXX: Temporary +class _YDLLogger: + def __init__(self, ydl=None): + self._ydl = ydl + + def debug(self, message): + if self._ydl: + self._ydl.write_debug(message) + + def info(self, message): + if self._ydl: + self._ydl.to_screen(message) + + def warning(self, message, *, once=False): + if self._ydl: + self._ydl.report_warning(message, once) + + def error(self, message, *, is_error=True): + if self._ydl: + self._ydl.report_error(message, is_error=is_error) + + def stdout(self, message): + if self._ydl: + self._ydl.to_stdout(message) + + def stderr(self, message): + if self._ydl: + self._ydl.to_stderr(message) diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/networking.py b/python/lib/python3.10/site-packages/yt_dlp/utils/networking.py new file mode 100644 index 0000000..ba0493c --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/networking.py @@ -0,0 +1,163 @@ +import collections +import random +import urllib.parse +import urllib.request + +from ._utils import remove_start + + +def random_user_agent(): + _USER_AGENT_TPL = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36' + _CHROME_VERSIONS = ( + '90.0.4430.212', + '90.0.4430.24', + '90.0.4430.70', + '90.0.4430.72', + '90.0.4430.85', + '90.0.4430.93', + '91.0.4472.101', + '91.0.4472.106', + '91.0.4472.114', + '91.0.4472.124', + '91.0.4472.164', + '91.0.4472.19', + '91.0.4472.77', + '92.0.4515.107', + '92.0.4515.115', + '92.0.4515.131', + '92.0.4515.159', + '92.0.4515.43', + '93.0.4556.0', + '93.0.4577.15', + '93.0.4577.63', + '93.0.4577.82', + '94.0.4606.41', + '94.0.4606.54', + '94.0.4606.61', + '94.0.4606.71', + '94.0.4606.81', + '94.0.4606.85', + '95.0.4638.17', + '95.0.4638.50', + '95.0.4638.54', + '95.0.4638.69', + '95.0.4638.74', + '96.0.4664.18', + '96.0.4664.45', + '96.0.4664.55', + '96.0.4664.93', + '97.0.4692.20', + ) + return _USER_AGENT_TPL % random.choice(_CHROME_VERSIONS) + + +class HTTPHeaderDict(collections.UserDict, dict): + """ + Store and access keys case-insensitively. + The constructor can take multiple dicts, in which keys in the latter are prioritised. + """ + + def __init__(self, *args, **kwargs): + super().__init__() + for dct in args: + if dct is not None: + self.update(dct) + self.update(kwargs) + + def __setitem__(self, key, value): + if isinstance(value, bytes): + value = value.decode('latin-1') + super().__setitem__(key.title(), str(value)) + + def __getitem__(self, key): + return super().__getitem__(key.title()) + + def __delitem__(self, key): + super().__delitem__(key.title()) + + def __contains__(self, key): + return super().__contains__(key.title() if isinstance(key, str) else key) + + +std_headers = HTTPHeaderDict({ + 'User-Agent': random_user_agent(), + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-us,en;q=0.5', + 'Sec-Fetch-Mode': 'navigate', +}) + + +def clean_proxies(proxies: dict, headers: HTTPHeaderDict): + req_proxy = headers.pop('Ytdl-Request-Proxy', None) + if req_proxy: + proxies.clear() # XXX: compat: Ytdl-Request-Proxy takes preference over everything, including NO_PROXY + proxies['all'] = req_proxy + for proxy_key, proxy_url in proxies.items(): + if proxy_url == '__noproxy__': + proxies[proxy_key] = None + continue + if proxy_key == 'no': # special case + continue + if proxy_url is not None: + # Ensure proxies without a scheme are http. + try: + proxy_scheme = urllib.request._parse_proxy(proxy_url)[0] + except ValueError: + # Ignore invalid proxy URLs. Sometimes these may be introduced through environment + # variables unrelated to proxy settings - e.g. Colab `COLAB_LANGUAGE_SERVER_PROXY`. + # If the proxy is going to be used, the Request Handler proxy validation will handle it. + continue + if proxy_scheme is None: + proxies[proxy_key] = 'http://' + remove_start(proxy_url, '//') + + replace_scheme = { + 'socks5': 'socks5h', # compat: socks5 was treated as socks5h + 'socks': 'socks4' # compat: non-standard + } + if proxy_scheme in replace_scheme: + proxies[proxy_key] = urllib.parse.urlunparse( + urllib.parse.urlparse(proxy_url)._replace(scheme=replace_scheme[proxy_scheme])) + + +def clean_headers(headers: HTTPHeaderDict): + if 'Youtubedl-No-Compression' in headers: # compat + del headers['Youtubedl-No-Compression'] + headers['Accept-Encoding'] = 'identity' + + +def remove_dot_segments(path): + # Implements RFC3986 5.2.4 remote_dot_segments + # Pseudo-code: https://tools.ietf.org/html/rfc3986#section-5.2.4 + # https://github.com/urllib3/urllib3/blob/ba49f5c4e19e6bca6827282feb77a3c9f937e64b/src/urllib3/util/url.py#L263 + output = [] + segments = path.split('/') + for s in segments: + if s == '.': + continue + elif s == '..': + if output: + output.pop() + else: + output.append(s) + if not segments[0] and (not output or output[0]): + output.insert(0, '') + if segments[-1] in ('.', '..'): + output.append('') + return '/'.join(output) + + +def escape_rfc3986(s): + """Escape non-ASCII characters as suggested by RFC 3986""" + return urllib.parse.quote(s, b"%/;:@&=+$,!~*'()?#[]") + + +def normalize_url(url): + """Normalize URL as suggested by RFC 3986""" + url_parsed = urllib.parse.urlparse(url) + return url_parsed._replace( + netloc=url_parsed.netloc.encode('idna').decode('ascii'), + path=escape_rfc3986(remove_dot_segments(url_parsed.path)), + params=escape_rfc3986(url_parsed.params), + query=escape_rfc3986(url_parsed.query), + fragment=escape_rfc3986(url_parsed.fragment) + ).geturl() diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/progress.py b/python/lib/python3.10/site-packages/yt_dlp/utils/progress.py new file mode 100644 index 0000000..f254a38 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/progress.py @@ -0,0 +1,109 @@ +from __future__ import annotations + +import bisect +import threading +import time + + +class ProgressCalculator: + # Time to calculate the speed over (seconds) + SAMPLING_WINDOW = 3 + # Minimum timeframe before to sample next downloaded bytes (seconds) + SAMPLING_RATE = 0.05 + # Time before showing eta (seconds) + GRACE_PERIOD = 1 + + def __init__(self, initial: int): + self._initial = initial or 0 + self.downloaded = self._initial + + self.elapsed: float = 0 + self.speed = SmoothValue(0, smoothing=0.7) + self.eta = SmoothValue(None, smoothing=0.9) + + self._total = 0 + self._start_time = time.monotonic() + self._last_update = self._start_time + + self._lock = threading.Lock() + self._thread_sizes: dict[int, int] = {} + + self._times = [self._start_time] + self._downloaded = [self.downloaded] + + @property + def total(self): + return self._total + + @total.setter + def total(self, value: int | None): + with self._lock: + if value is not None and value < self.downloaded: + value = self.downloaded + + self._total = value + + def thread_reset(self): + current_thread = threading.get_ident() + with self._lock: + self._thread_sizes[current_thread] = 0 + + def update(self, size: int | None): + if not size: + return + + current_thread = threading.get_ident() + + with self._lock: + last_size = self._thread_sizes.get(current_thread, 0) + self._thread_sizes[current_thread] = size + self._update(size - last_size) + + def _update(self, size: int): + current_time = time.monotonic() + + self.downloaded += size + self.elapsed = current_time - self._start_time + if self.total is not None and self.downloaded > self.total: + self._total = self.downloaded + + if self._last_update + self.SAMPLING_RATE > current_time: + return + self._last_update = current_time + + self._times.append(current_time) + self._downloaded.append(self.downloaded) + + offset = bisect.bisect_left(self._times, current_time - self.SAMPLING_WINDOW) + del self._times[:offset] + del self._downloaded[:offset] + if len(self._times) < 2: + self.speed.reset() + self.eta.reset() + return + + download_time = current_time - self._times[0] + if not download_time: + return + + self.speed.set((self.downloaded - self._downloaded[0]) / download_time) + if self.total and self.speed.value and self.elapsed > self.GRACE_PERIOD: + self.eta.set((self.total - self.downloaded) / self.speed.value) + else: + self.eta.reset() + + +class SmoothValue: + def __init__(self, initial: float | None, smoothing: float): + self.value = self.smooth = self._initial = initial + self._smoothing = smoothing + + def set(self, value: float): + self.value = value + if self.smooth is None: + self.smooth = self.value + else: + self.smooth = (1 - self._smoothing) * value + self._smoothing * self.smooth + + def reset(self): + self.value = self.smooth = self._initial diff --git a/python/lib/python3.10/site-packages/yt_dlp/utils/traversal.py b/python/lib/python3.10/site-packages/yt_dlp/utils/traversal.py new file mode 100644 index 0000000..462c3ba --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/utils/traversal.py @@ -0,0 +1,254 @@ +import collections.abc +import contextlib +import inspect +import itertools +import re + +from ._utils import ( + IDENTITY, + NO_DEFAULT, + LazyList, + int_or_none, + is_iterable_like, + try_call, + variadic, +) + + +def traverse_obj( + obj, *paths, default=NO_DEFAULT, expected_type=None, get_all=True, + casesense=True, is_user_input=False, traverse_string=False): + """ + Safely traverse nested `dict`s and `Iterable`s + + >>> obj = [{}, {"key": "value"}] + >>> traverse_obj(obj, (1, "key")) + "value" + + Each of the provided `paths` is tested and the first producing a valid result will be returned. + The next path will also be tested if the path branched but no results could be found. + Supported values for traversal are `Mapping`, `Iterable` and `re.Match`. + Unhelpful values (`{}`, `None`) are treated as the absence of a value and discarded. + + The paths will be wrapped in `variadic`, so that `'key'` is conveniently the same as `('key', )`. + + The keys in the path can be one of: + - `None`: Return the current object. + - `set`: Requires the only item in the set to be a type or function, + like `{type}`/`{func}`. If a `type`, returns only values + of this type. If a function, returns `func(obj)`. + - `str`/`int`: Return `obj[key]`. For `re.Match`, return `obj.group(key)`. + - `slice`: Branch out and return all values in `obj[key]`. + - `Ellipsis`: Branch out and return a list of all values. + - `tuple`/`list`: Branch out and return a list of all matching values. + Read as: `[traverse_obj(obj, branch) for branch in branches]`. + - `function`: Branch out and return values filtered by the function. + Read as: `[value for key, value in obj if function(key, value)]`. + For `Iterable`s, `key` is the index of the value. + For `re.Match`es, `key` is the group number (0 = full match) + as well as additionally any group names, if given. + - `dict` Transform the current object and return a matching dict. + Read as: `{key: traverse_obj(obj, path) for key, path in dct.items()}`. + + `tuple`, `list`, and `dict` all support nested paths and branches. + + @params paths Paths which to traverse by. + @param default Value to return if the paths do not match. + If the last key in the path is a `dict`, it will apply to each value inside + the dict instead, depth first. Try to avoid if using nested `dict` keys. + @param expected_type If a `type`, only accept final values of this type. + If any other callable, try to call the function on each result. + If the last key in the path is a `dict`, it will apply to each value inside + the dict instead, recursively. This does respect branching paths. + @param get_all If `False`, return the first matching result, otherwise all matching ones. + @param casesense If `False`, consider string dictionary keys as case insensitive. + + The following are only meant to be used by YoutubeDL.prepare_outtmpl and are not part of the API + + @param is_user_input Whether the keys are generated from user input. + If `True` strings get converted to `int`/`slice` if needed. + @param traverse_string Whether to traverse into objects as strings. + If `True`, any non-compatible object will first be + converted into a string and then traversed into. + The return value of that path will be a string instead, + not respecting any further branching. + + + @returns The result of the object traversal. + If successful, `get_all=True`, and the path branches at least once, + then a list of results is returned instead. + If no `default` is given and the last path branches, a `list` of results + is always returned. If a path ends on a `dict` that result will always be a `dict`. + """ + casefold = lambda k: k.casefold() if isinstance(k, str) else k + + if isinstance(expected_type, type): + type_test = lambda val: val if isinstance(val, expected_type) else None + else: + type_test = lambda val: try_call(expected_type or IDENTITY, args=(val,)) + + def apply_key(key, obj, is_last): + branching = False + result = None + + if obj is None and traverse_string: + if key is ... or callable(key) or isinstance(key, slice): + branching = True + result = () + + elif key is None: + result = obj + + elif isinstance(key, set): + assert len(key) == 1, 'Set should only be used to wrap a single item' + item = next(iter(key)) + if isinstance(item, type): + if isinstance(obj, item): + result = obj + else: + result = try_call(item, args=(obj,)) + + elif isinstance(key, (list, tuple)): + branching = True + result = itertools.chain.from_iterable( + apply_path(obj, branch, is_last)[0] for branch in key) + + elif key is ...: + branching = True + if isinstance(obj, collections.abc.Mapping): + result = obj.values() + elif is_iterable_like(obj): + result = obj + elif isinstance(obj, re.Match): + result = obj.groups() + elif traverse_string: + branching = False + result = str(obj) + else: + result = () + + elif callable(key): + branching = True + if isinstance(obj, collections.abc.Mapping): + iter_obj = obj.items() + elif is_iterable_like(obj): + iter_obj = enumerate(obj) + elif isinstance(obj, re.Match): + iter_obj = itertools.chain( + enumerate((obj.group(), *obj.groups())), + obj.groupdict().items()) + elif traverse_string: + branching = False + iter_obj = enumerate(str(obj)) + else: + iter_obj = () + + result = (v for k, v in iter_obj if try_call(key, args=(k, v))) + if not branching: # string traversal + result = ''.join(result) + + elif isinstance(key, dict): + iter_obj = ((k, _traverse_obj(obj, v, False, is_last)) for k, v in key.items()) + result = { + k: v if v is not None else default for k, v in iter_obj + if v is not None or default is not NO_DEFAULT + } or None + + elif isinstance(obj, collections.abc.Mapping): + result = (try_call(obj.get, args=(key,)) if casesense or try_call(obj.__contains__, args=(key,)) else + next((v for k, v in obj.items() if casefold(k) == key), None)) + + elif isinstance(obj, re.Match): + if isinstance(key, int) or casesense: + with contextlib.suppress(IndexError): + result = obj.group(key) + + elif isinstance(key, str): + result = next((v for k, v in obj.groupdict().items() if casefold(k) == key), None) + + elif isinstance(key, (int, slice)): + if is_iterable_like(obj, collections.abc.Sequence): + branching = isinstance(key, slice) + with contextlib.suppress(IndexError): + result = obj[key] + elif traverse_string: + with contextlib.suppress(IndexError): + result = str(obj)[key] + + return branching, result if branching else (result,) + + def lazy_last(iterable): + iterator = iter(iterable) + prev = next(iterator, NO_DEFAULT) + if prev is NO_DEFAULT: + return + + for item in iterator: + yield False, prev + prev = item + + yield True, prev + + def apply_path(start_obj, path, test_type): + objs = (start_obj,) + has_branched = False + + key = None + for last, key in lazy_last(variadic(path, (str, bytes, dict, set))): + if is_user_input and isinstance(key, str): + if key == ':': + key = ... + elif ':' in key: + key = slice(*map(int_or_none, key.split(':'))) + elif int_or_none(key) is not None: + key = int(key) + + if not casesense and isinstance(key, str): + key = key.casefold() + + if __debug__ and callable(key): + # Verify function signature + inspect.signature(key).bind(None, None) + + new_objs = [] + for obj in objs: + branching, results = apply_key(key, obj, last) + has_branched |= branching + new_objs.append(results) + + objs = itertools.chain.from_iterable(new_objs) + + if test_type and not isinstance(key, (dict, list, tuple)): + objs = map(type_test, objs) + + return objs, has_branched, isinstance(key, dict) + + def _traverse_obj(obj, path, allow_empty, test_type): + results, has_branched, is_dict = apply_path(obj, path, test_type) + results = LazyList(item for item in results if item not in (None, {})) + if get_all and has_branched: + if results: + return results.exhaust() + if allow_empty: + return [] if default is NO_DEFAULT else default + return None + + return results[0] if results else {} if allow_empty and is_dict else None + + for index, path in enumerate(paths, 1): + result = _traverse_obj(obj, path, index == len(paths), True) + if result is not None: + return result + + return None if default is NO_DEFAULT else default + + +def get_first(obj, *paths, **kwargs): + return traverse_obj(obj, *((..., *variadic(keys)) for keys in paths), **kwargs, get_all=False) + + +def dict_get(d, key_or_keys, default=None, skip_false_values=True): + for val in map(d.get, variadic(key_or_keys)): + if val is not None and (val or not skip_false_values): + return val + return default diff --git a/python/lib/python3.10/site-packages/yt_dlp/version.py b/python/lib/python3.10/site-packages/yt_dlp/version.py new file mode 100644 index 0000000..6b4a207 --- /dev/null +++ b/python/lib/python3.10/site-packages/yt_dlp/version.py @@ -0,0 +1,11 @@ +# Autogenerated by devscripts/update-version.py + +__version__ = '2023.10.13' + +RELEASE_GIT_HEAD = 'b634ba742d8f38ce9ecfa0546485728b0c6c59d1' + +VARIANT = 'pip' + +UPDATE_HINT = 'You installed yt-dlp with pip or using the wheel from PyPi; Use that to update' + +CHANNEL = 'stable' diff --git a/lib/python3.11/site-packages/yt_dlp/webvtt.py b/python/lib/python3.10/site-packages/yt_dlp/webvtt.py similarity index 100% rename from lib/python3.11/site-packages/yt_dlp/webvtt.py rename to python/lib/python3.10/site-packages/yt_dlp/webvtt.py diff --git a/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/INSTALLER b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/zipp-3.15.0.dist-info/LICENSE b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/LICENSE similarity index 100% rename from lib/python3.11/site-packages/zipp-3.15.0.dist-info/LICENSE rename to python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/LICENSE diff --git a/lib/python3.11/site-packages/zipp-3.15.0.dist-info/METADATA b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/zipp-3.15.0.dist-info/METADATA rename to python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/METADATA diff --git a/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/RECORD b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/RECORD new file mode 100644 index 0000000..7026b8e --- /dev/null +++ b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/RECORD @@ -0,0 +1,11 @@ +zipp-3.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +zipp-3.15.0.dist-info/LICENSE,sha256=2z8CRrH5J48VhFuZ_sR4uLUG63ZIeZNyL4xuJUKF-vg,1050 +zipp-3.15.0.dist-info/METADATA,sha256=el77dlVTqXoMRoTxqwIdoMNmNAkERCn9v9-XlKjJfAU,3735 +zipp-3.15.0.dist-info/RECORD,, +zipp-3.15.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +zipp-3.15.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +zipp-3.15.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5 +zipp/__init__.py,sha256=ZNjHuOKaFmgrSPvtIlHYFNCvENHqSYuqEVktBgj9cu8,10676 +zipp/__pycache__/__init__.cpython-310.pyc,, +zipp/__pycache__/py310compat.cpython-310.pyc,, +zipp/py310compat.py,sha256=HQG4If-eI5v4RT82Uagk7PuLsbnJ7HKgj0aQKGRAp8M,309 diff --git a/lib/site-packages/pip/_internal/operations/__init__.py b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_internal/operations/__init__.py rename to python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/pip-22.3.1.dist-info/WHEEL b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/pip-22.3.1.dist-info/WHEEL rename to python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/WHEEL diff --git a/lib/python3.11/site-packages/zipp-3.15.0.dist-info/top_level.txt b/python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/zipp-3.15.0.dist-info/top_level.txt rename to python/lib/python3.10/site-packages/zipp-3.15.0.dist-info/top_level.txt diff --git a/lib/python3.11/site-packages/zipp/__init__.py b/python/lib/python3.10/site-packages/zipp/__init__.py similarity index 100% rename from lib/python3.11/site-packages/zipp/__init__.py rename to python/lib/python3.10/site-packages/zipp/__init__.py diff --git a/lib/python3.11/site-packages/zipp/py310compat.py b/python/lib/python3.10/site-packages/zipp/py310compat.py similarity index 100% rename from lib/python3.11/site-packages/zipp/py310compat.py rename to python/lib/python3.10/site-packages/zipp/py310compat.py diff --git a/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..07806f8 --- /dev/null +++ b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright (c) Alex Grönholm + +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/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA new file mode 100644 index 0000000..64f91d3 --- /dev/null +++ b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA @@ -0,0 +1,138 @@ +Metadata-Version: 2.1 +Name: APScheduler +Version: 3.10.1 +Summary: In-process task scheduler with Cron-like capabilities +Home-page: https://github.com/agronholm/apscheduler +Author: Alex Grönholm +Author-email: apscheduler@nextday.fi +License: MIT +Keywords: scheduling cron +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Requires-Python: >=3.6 +License-File: LICENSE.txt +Requires-Dist: setuptools (>=0.7) +Requires-Dist: six (>=1.4.0) +Requires-Dist: pytz +Requires-Dist: tzlocal (!=3.*,>=2.0) +Provides-Extra: doc +Requires-Dist: sphinx ; extra == 'doc' +Requires-Dist: sphinx-rtd-theme ; extra == 'doc' +Provides-Extra: gevent +Requires-Dist: gevent ; extra == 'gevent' +Provides-Extra: mongodb +Requires-Dist: pymongo (>=3.0) ; extra == 'mongodb' +Provides-Extra: redis +Requires-Dist: redis (>=3.0) ; extra == 'redis' +Provides-Extra: rethinkdb +Requires-Dist: rethinkdb (>=2.4.0) ; extra == 'rethinkdb' +Provides-Extra: sqlalchemy +Requires-Dist: sqlalchemy (>=1.4) ; extra == 'sqlalchemy' +Provides-Extra: testing +Requires-Dist: pytest ; extra == 'testing' +Requires-Dist: pytest-asyncio ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-tornado5 ; extra == 'testing' +Provides-Extra: tornado +Requires-Dist: tornado (>=4.3) ; extra == 'tornado' +Provides-Extra: twisted +Requires-Dist: twisted ; extra == 'twisted' +Provides-Extra: zookeeper +Requires-Dist: kazoo ; extra == 'zookeeper' + +.. image:: https://github.com/agronholm/apscheduler/workflows/Python%20codeqa/test/badge.svg?branch=3.x + :target: https://github.com/agronholm/apscheduler/actions?query=workflow%3A%22Python+codeqa%2Ftest%22+branch%3A3.x + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/apscheduler/badge.svg?branch=3.x + :target: https://coveralls.io/github/agronholm/apscheduler?branch=3.x + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/apscheduler/badge/?version=3.x + :target: https://apscheduler.readthedocs.io/en/master/?badge=3.x + :alt: Documentation + +Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code +to be executed later, either just once or periodically. You can add new jobs or remove old ones on +the fly as you please. If you store your jobs in a database, they will also survive scheduler +restarts and maintain their state. When the scheduler is restarted, it will then run all the jobs +it should have run while it was offline [#f1]_. + +Among other things, APScheduler can be used as a cross-platform, application specific replacement +to platform specific schedulers, such as the cron daemon or the Windows task scheduler. Please +note, however, that APScheduler is **not** a daemon or service itself, nor does it come with any +command line tools. It is primarily meant to be run inside existing applications. That said, +APScheduler does provide some building blocks for you to build a scheduler service or to run a +dedicated scheduler process. + +APScheduler has three built-in scheduling systems you can use: + +* Cron-style scheduling (with optional start/end times) +* Interval-based execution (runs jobs on even intervals, with optional start/end times) +* One-off delayed execution (runs jobs once, on a set date/time) + +You can mix and match scheduling systems and the backends where the jobs are stored any way you +like. Supported backends for storing jobs include: + +* Memory +* `SQLAlchemy <http://www.sqlalchemy.org/>`_ (any RDBMS supported by SQLAlchemy works) +* `MongoDB <http://www.mongodb.org/>`_ +* `Redis <http://redis.io/>`_ +* `RethinkDB <https://www.rethinkdb.com/>`_ +* `ZooKeeper <https://zookeeper.apache.org/>`_ + +APScheduler also integrates with several common Python frameworks, like: + +* `asyncio <http://docs.python.org/3.4/library/asyncio.html>`_ (:pep:`3156`) +* `gevent <http://www.gevent.org/>`_ +* `Tornado <http://www.tornadoweb.org/>`_ +* `Twisted <http://twistedmatrix.com/>`_ +* `Qt <http://qt-project.org/>`_ (using either + `PyQt <http://www.riverbankcomputing.com/software/pyqt/intro>`_ , + `PySide6 <https://wiki.qt.io/Qt_for_Python>`_ , + `PySide2 <https://wiki.qt.io/Qt_for_Python>`_ or + `PySide <http://qt-project.org/wiki/PySide>`_) + +There are third party solutions for integrating APScheduler with other frameworks: + +* `Django <https://github.com/jarekwg/django-apscheduler>`_ +* `Flask <https://github.com/viniciuschiele/flask-apscheduler>`_ + + +.. [#f1] The cutoff period for this is also configurable. + + +Documentation +------------- + +Documentation can be found `here <https://apscheduler.readthedocs.io/>`_. + + +Source +------ + +The source can be browsed at `Github <https://github.com/agronholm/apscheduler/tree/3.x>`_. + + +Reporting bugs +-------------- + +A `bug tracker <https://github.com/agronholm/apscheduler/issues>`_ is provided by Github. + + +Getting help +------------ + +If you have problems or other questions, you can either: + +* Ask in the `apscheduler <https://gitter.im/apscheduler/Lobby>`_ room on Gitter +* Ask on the `APScheduler GitHub discussion forum <https://github.com/agronholm/apscheduler/discussions>`_, or +* Ask on `StackOverflow <http://stackoverflow.com/questions/tagged/apscheduler>`_ and tag your + question with the ``apscheduler`` tag diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD rename to python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD diff --git a/lib/site-packages/pip/_internal/operations/build/__init__.py b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_internal/operations/build/__init__.py rename to python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/setuptools-65.5.1.dist-info/WHEEL b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/setuptools-65.5.1.dist-info/WHEEL rename to python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL diff --git a/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt new file mode 100644 index 0000000..0adfe3e --- /dev/null +++ b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt @@ -0,0 +1,23 @@ +[apscheduler.executors] +asyncio = apscheduler.executors.asyncio:AsyncIOExecutor [asyncio] +debug = apscheduler.executors.debug:DebugExecutor +gevent = apscheduler.executors.gevent:GeventExecutor [gevent] +processpool = apscheduler.executors.pool:ProcessPoolExecutor +threadpool = apscheduler.executors.pool:ThreadPoolExecutor +tornado = apscheduler.executors.tornado:TornadoExecutor [tornado] +twisted = apscheduler.executors.twisted:TwistedExecutor [twisted] + +[apscheduler.jobstores] +memory = apscheduler.jobstores.memory:MemoryJobStore +mongodb = apscheduler.jobstores.mongodb:MongoDBJobStore [mongodb] +redis = apscheduler.jobstores.redis:RedisJobStore [redis] +rethinkdb = apscheduler.jobstores.rethinkdb:RethinkDBJobStore [rethinkdb] +sqlalchemy = apscheduler.jobstores.sqlalchemy:SQLAlchemyJobStore [sqlalchemy] +zookeeper = apscheduler.jobstores.zookeeper:ZooKeeperJobStore [zookeeper] + +[apscheduler.triggers] +and = apscheduler.triggers.combining:AndTrigger +cron = apscheduler.triggers.cron:CronTrigger +date = apscheduler.triggers.date:DateTrigger +interval = apscheduler.triggers.interval:IntervalTrigger +or = apscheduler.triggers.combining:OrTrigger diff --git a/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt new file mode 100644 index 0000000..d31d10d --- /dev/null +++ b/python/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +apscheduler diff --git a/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE new file mode 100644 index 0000000..33b7cdd --- /dev/null +++ b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +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/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA rename to python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD rename to python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD diff --git a/lib/site-packages/pip/_internal/resolution/__init__.py b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_internal/resolution/__init__.py rename to python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL rename to python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL diff --git a/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt new file mode 100644 index 0000000..a111e9c --- /dev/null +++ b/python/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_brotli +brotli diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py new file mode 100644 index 0000000..402a3d7 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +# +# Cipher/AES.py : AES +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +from Cryptodome.Util import _cpu_features +from Cryptodome.Random import get_random_bytes + +MODE_ECB = 1 #: Electronic Code Book (:ref:`ecb_mode`) +MODE_CBC = 2 #: Cipher-Block Chaining (:ref:`cbc_mode`) +MODE_CFB = 3 #: Cipher Feedback (:ref:`cfb_mode`) +MODE_OFB = 5 #: Output Feedback (:ref:`ofb_mode`) +MODE_CTR = 6 #: Counter mode (:ref:`ctr_mode`) +MODE_OPENPGP = 7 #: OpenPGP mode (:ref:`openpgp_mode`) +MODE_CCM = 8 #: Counter with CBC-MAC (:ref:`ccm_mode`) +MODE_EAX = 9 #: :ref:`eax_mode` +MODE_SIV = 10 #: Synthetic Initialization Vector (:ref:`siv_mode`) +MODE_GCM = 11 #: Galois Counter Mode (:ref:`gcm_mode`) +MODE_OCB = 12 #: Offset Code Book (:ref:`ocb_mode`) + + +_cproto = """ + int AES_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int AES_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int AES_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int AES_stop_operation(void *state); + """ + + +# Load portable AES +_raw_aes_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aes", + _cproto) + +# Try to load AES with AES NI instructions +try: + _raw_aesni_lib = None + if _cpu_features.have_aes_ni(): + _raw_aesni_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aesni", + _cproto.replace("AES", + "AESNI")) +# _raw_aesni may not have been compiled in +except OSError: + pass + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + use_aesni = dict_parameters.pop("use_aesni", True) + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect AES key length (%d bytes)" % len(key)) + + if use_aesni and _raw_aesni_lib: + start_operation = _raw_aesni_lib.AESNI_start_operation + stop_operation = _raw_aesni_lib.AESNI_stop_operation + else: + start_operation = _raw_aes_lib.AES_start_operation + stop_operation = _raw_aes_lib.AES_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the AES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def _derive_Poly1305_key_pair(key, nonce): + """Derive a tuple (r, s, nonce) for a Poly1305 MAC. + + If nonce is ``None``, a new 16-byte nonce is generated. + """ + + if len(key) != 32: + raise ValueError("Poly1305 with AES requires a 32-byte key") + + if nonce is None: + nonce = get_random_bytes(16) + elif len(nonce) != 16: + raise ValueError("Poly1305 with AES requires a 16-byte nonce") + + s = new(key[:16], MODE_ECB).encrypt(nonce) + return key[16:], s, nonce + + +def new(key, mode, *args, **kwargs): + """Create a new AES cipher. + + Args: + key(bytes/bytearray/memoryview): + The secret key to use in the symmetric cipher. + + It must be 16 (*AES-128)*, 24 (*AES-192*) or 32 (*AES-256*) bytes long. + + For ``MODE_SIV`` only, it doubles to 32, 48, or 64 bytes. + mode (a ``MODE_*`` constant): + The chaining mode to use for encryption or decryption. + If in doubt, use ``MODE_EAX``. + + Keyword Args: + iv (bytes/bytearray/memoryview): + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 16 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 16 bytes long for encryption + and 18 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + nonce (bytes/bytearray/memoryview): + (Only applicable for ``MODE_CCM``, ``MODE_EAX``, ``MODE_GCM``, + ``MODE_SIV``, ``MODE_OCB``, and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key (except possibly for ``MODE_SIV``, see below). + + For ``MODE_EAX``, ``MODE_GCM`` and ``MODE_SIV`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CCM``, its length must be in the range **[7..13]**. + Bear in mind that with CCM there is a trade-off between nonce + length and maximum message size. Recommendation: **11** bytes. + + For ``MODE_OCB``, its length must be in the range **[1..15]** + (recommended: **15**). + + For ``MODE_CTR``, its length must be in the range **[0..15]** + (recommended: **8**). + + For ``MODE_SIV``, the nonce is optional, if it is not specified, + then no nonce is being used, which renders the encryption + deterministic. + + If not provided, for modes other than ``MODE_SIV``, a random + byte string of the recommended length is used (you must then + read its value with the :attr:`nonce` attribute). + + segment_size (integer): + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + mac_len (integer): + (Only ``MODE_EAX``, ``MODE_GCM``, ``MODE_OCB``, ``MODE_CCM``) + Length of the authentication tag, in bytes. + + It must be even and in the range **[4..16]**. + The recommended value (and the default, if not specified) is **16**. + + msg_len (integer): + (Only ``MODE_CCM``). Length of the message to (de)cipher. + If not specified, ``encrypt`` must be called with the entire message. + Similarly, ``decrypt`` can only be called once. + + assoc_len (integer): + (Only ``MODE_CCM``). Length of the associated data. + If not specified, all associated data is buffered internally, + which may represent a problem for very large messages. + + initial_value (integer or bytes/bytearray/memoryview): + (Only ``MODE_CTR``). + The initial value for the counter. If not present, the cipher will + start counting from 0. The value is incremented by one for each block. + The counter number is encoded in big endian mode. + + counter (object): + (Only ``MODE_CTR``). + Instance of ``Cryptodome.Util.Counter``, which allows full customization + of the counter block. This parameter is incompatible to both ``nonce`` + and ``initial_value``. + + use_aesni: (boolean): + Use Intel AES-NI hardware extensions (default: use if available). + + Returns: + an AES object, of the applicable mode. + """ + + kwargs["add_aes_modes"] = True + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + + +# Size of a data block (in bytes) +block_size = 16 +# Size of a key (in bytes) +key_size = (16, 24, 32) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi new file mode 100644 index 0000000..a694b0f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi @@ -0,0 +1,154 @@ +from typing import ByteString, Dict, Optional, Tuple, Union, overload +from typing_extensions import Literal + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_ccm import CcmMode +from Cryptodome.Cipher._mode_eax import EaxMode +from Cryptodome.Cipher._mode_gcm import GcmMode +from Cryptodome.Cipher._mode_siv import SivMode +from Cryptodome.Cipher._mode_ocb import OcbMode + +MODE_ECB: Literal[1] +MODE_CBC: Literal[2] +MODE_CFB: Literal[3] +MODE_OFB: Literal[5] +MODE_CTR: Literal[6] +MODE_OPENPGP: Literal[7] +MODE_CCM: Literal[8] +MODE_EAX: Literal[9] +MODE_SIV: Literal[10] +MODE_GCM: Literal[11] +MODE_OCB: Literal[12] + +# MODE_ECB +@overload +def new(key: ByteString, + mode: Literal[1], + use_aesni : bool = ...) -> \ + EcbMode: ... + +# MODE_CBC +@overload +def new(key: ByteString, + mode: Literal[2], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +@overload +def new(key: ByteString, + mode: Literal[2], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +# MODE_CFB +@overload +def new(key: ByteString, + mode: Literal[3], + iv : Optional[ByteString] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +@overload +def new(key: ByteString, + mode: Literal[3], + IV : Optional[ByteString] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +# MODE_OFB +@overload +def new(key: ByteString, + mode: Literal[5], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +@overload +def new(key: ByteString, + mode: Literal[5], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +# MODE_CTR +@overload +def new(key: ByteString, + mode: Literal[6], + nonce : Optional[ByteString] = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ..., + use_aesni : bool = ...) -> \ + CtrMode: ... + +# MODE_OPENPGP +@overload +def new(key: ByteString, + mode: Literal[7], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +@overload +def new(key: ByteString, + mode: Literal[7], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +# MODE_CCM +@overload +def new(key: ByteString, + mode: Literal[8], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + assoc_len : int = ..., + use_aesni : bool = ...) -> \ + CcmMode: ... + +# MODE_EAX +@overload +def new(key: ByteString, + mode: Literal[9], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + EaxMode: ... + +# MODE_GCM +@overload +def new(key: ByteString, + mode: Literal[10], + nonce : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + SivMode: ... + +# MODE_SIV +@overload +def new(key: ByteString, + mode: Literal[11], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + GcmMode: ... + +# MODE_OCB +@overload +def new(key: ByteString, + mode: Literal[12], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + OcbMode: ... + + +block_size: int +key_size: Tuple[int, int, int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py new file mode 100644 index 0000000..4dc1bb8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# +# Cipher/ARC2.py : ARC2.py +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with ARC2: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` +:var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` +:var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` +:var MODE_OPENPGP: :ref:`OpenPGP Mode <openpgp_mode>` +:var MODE_EAX: :ref:`EAX Mode <eax_mode>` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_arc2_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_arc2", + """ + int ARC2_start_operation(const uint8_t key[], + size_t key_len, + size_t effective_key_len, + void **pResult); + int ARC2_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ARC2_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ARC2_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + effective_keylen = dict_parameters.pop("effective_keylen", 1024) + + if len(key) not in key_size: + raise ValueError("Incorrect ARC2 key length (%d bytes)" % len(key)) + + if not (40 <= effective_keylen <= 1024): + raise ValueError("'effective_key_len' must be at least 40 and no larger than 1024 " + "(not %d)" % effective_keylen) + + start_operation = _raw_arc2_lib.ARC2_start_operation + stop_operation = _raw_arc2_lib.ARC2_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(effective_keylen), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the ARC2 cipher" + % result) + + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new RC2 cipher. + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 128 bytes; the actual search space + (and the cipher strength) can be reduced with the ``effective_keylen`` parameter. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **effective_keylen** (*integer*) -- + Optional. Maximum strength in bits of the actual key used by the ARC2 algorithm. + If the supplied ``key`` parameter is longer (in bits) of the value specified + here, it will be weakened to match it. + If not specified, no limitation is applied. + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: an ARC2 object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(5, 128 + 1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi new file mode 100644 index 0000000..178c3c0 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, Optional, ByteString + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +ARC2Mode = int + +MODE_ECB: ARC2Mode +MODE_CBC: ARC2Mode +MODE_CFB: ARC2Mode +MODE_OFB: ARC2Mode +MODE_CTR: ARC2Mode +MODE_OPENPGP: ARC2Mode +MODE_EAX: ARC2Mode + +def new(key: ByteString, + mode: ARC2Mode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py new file mode 100644 index 0000000..543a323 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# +# Cipher/ARC4.py : ARC4 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr) + + +_raw_arc4_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._ARC4", """ + int ARC4_stream_encrypt(void *rc4State, const uint8_t in[], + uint8_t out[], size_t len); + int ARC4_stream_init(uint8_t *key, size_t keylen, + void **pRc4State); + int ARC4_stream_destroy(void *rc4State); + """) + + +class ARC4Cipher: + """ARC4 cipher object. Do not create it directly. Use + :func:`Cryptodome.Cipher.ARC4.new` instead. + """ + + def __init__(self, key, *args, **kwargs): + """Initialize an ARC4 cipher object + + See also `new()` at the module level.""" + + if len(args) > 0: + ndrop = args[0] + args = args[1:] + else: + ndrop = kwargs.pop('drop', 0) + + if len(key) not in key_size: + raise ValueError("Incorrect ARC4 key length (%d bytes)" % + len(key)) + + self._state = VoidPointer() + result = _raw_arc4_lib.ARC4_stream_init(c_uint8_ptr(key), + c_size_t(len(key)), + self._state.address_of()) + if result != 0: + raise ValueError("Error %d while creating the ARC4 cipher" + % result) + self._state = SmartPointer(self._state.get(), + _raw_arc4_lib.ARC4_stream_destroy) + + if ndrop > 0: + # This is OK even if the cipher is used for decryption, + # since encrypt and decrypt are actually the same thing + # with ARC4. + self.encrypt(b'\x00' * ndrop) + + self.block_size = 1 + self.key_size = len(key) + + def encrypt(self, plaintext): + """Encrypt a piece of data. + + :param plaintext: The data to encrypt, of any size. + :type plaintext: bytes, bytearray, memoryview + :returns: the encrypted byte string, of equal length as the + plaintext. + """ + + ciphertext = create_string_buffer(len(plaintext)) + result = _raw_arc4_lib.ARC4_stream_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + ciphertext, + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with RC4" % result) + return get_raw_buffer(ciphertext) + + def decrypt(self, ciphertext): + """Decrypt a piece of data. + + :param ciphertext: The data to decrypt, of any size. + :type ciphertext: bytes, bytearray, memoryview + :returns: the decrypted byte string, of equal length as the + ciphertext. + """ + + try: + return self.encrypt(ciphertext) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + +def new(key, *args, **kwargs): + """Create a new ARC4 cipher. + + :param key: + The secret key to use in the symmetric cipher. + Its length must be in the range ``[1..256]``. + The recommended length is 16 bytes. + :type key: bytes, bytearray, memoryview + + :Keyword Arguments: + * *drop* (``integer``) -- + The amount of bytes to discard from the initial part of the keystream. + In fact, such part has been found to be distinguishable from random + data (while it shouldn't) and also correlated to key. + + The recommended value is 3072_ bytes. The default value is 0. + + :Return: an `ARC4Cipher` object + + .. _3072: http://eprint.iacr.org/2002/067.pdf + """ + return ARC4Cipher(key, *args, **kwargs) + + +# Size of a data block (in bytes) +block_size = 1 +# Size of a key (in bytes) +key_size = range(1, 256+1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi new file mode 100644 index 0000000..96bf6e2 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi @@ -0,0 +1,14 @@ +from typing import Any, Union, Iterable, ByteString + +class ARC4Cipher: + block_size: int + key_size: int + + def __init__(self, key: ByteString, *args: Any, **kwargs: Any) -> None: ... + def encrypt(self, plaintext: ByteString) -> bytes: ... + def decrypt(self, ciphertext: ByteString) -> bytes: ... + +def new(key: ByteString, drop : int = ...) -> ARC4Cipher: ... + +block_size: int +key_size: Iterable[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py new file mode 100644 index 0000000..536cbc8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# +# Cipher/Blowfish.py : Blowfish +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with Blowfish: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` +:var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` +:var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` +:var MODE_OPENPGP: :ref:`OpenPGP Mode <openpgp_mode>` +:var MODE_EAX: :ref:`EAX Mode <eax_mode>` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, c_size_t, + c_uint8_ptr) + +_raw_blowfish_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_blowfish", + """ + int Blowfish_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int Blowfish_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int Blowfish_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int Blowfish_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a smart pointer to + a low-level base cipher. It will absorb named parameters in + the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect Blowfish key length (%d bytes)" % len(key)) + + start_operation = _raw_blowfish_lib.Blowfish_start_operation + stop_operation = _raw_blowfish_lib.Blowfish_stop_operation + + void_p = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + void_p.address_of()) + if result: + raise ValueError("Error %X while instantiating the Blowfish cipher" + % result) + return SmartPointer(void_p.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new Blowfish cipher + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 56 bytes. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a Blowfish object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(4, 56 + 1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi new file mode 100644 index 0000000..961f07e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +BlowfishMode = int + +MODE_ECB: BlowfishMode +MODE_CBC: BlowfishMode +MODE_CFB: BlowfishMode +MODE_OFB: BlowfishMode +MODE_CTR: BlowfishMode +MODE_OPENPGP: BlowfishMode +MODE_EAX: BlowfishMode + +def new(key: ByteString, + mode: BlowfishMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py new file mode 100644 index 0000000..84eb88e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# +# Cipher/CAST.py : CAST +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with CAST: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` +:var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` +:var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` +:var MODE_OPENPGP: :ref:`OpenPGP Mode <openpgp_mode>` +:var MODE_EAX: :ref:`EAX Mode <eax_mode>` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_cast_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_cast", + """ + int CAST_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int CAST_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CAST_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CAST_stop_operation(void *state); + """) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect CAST key length (%d bytes)" % len(key)) + + start_operation = _raw_cast_lib.CAST_start_operation + stop_operation = _raw_cast_lib.CAST_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the CAST cipher" + % result) + + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new CAST cipher + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 16 bytes. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a CAST object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(5, 16 + 1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi new file mode 100644 index 0000000..5dcd20c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, Optional, ByteString + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +CASTMode = int + +MODE_ECB: CASTMode +MODE_CBC: CASTMode +MODE_CFB: CASTMode +MODE_OFB: CASTMode +MODE_CTR: CASTMode +MODE_OPENPGP: CASTMode +MODE_EAX: CASTMode + +def new(key: ByteString, + mode: CASTMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size : Iterable[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py new file mode 100644 index 0000000..648d692 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py @@ -0,0 +1,287 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, VoidPointer, + SmartPointer, c_size_t, + c_uint8_ptr, c_ulong, + is_writeable_buffer) + +_raw_chacha20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._chacha20", + """ + int chacha20_init(void **pState, + const uint8_t *key, + size_t keySize, + const uint8_t *nonce, + size_t nonceSize); + + int chacha20_destroy(void *state); + + int chacha20_encrypt(void *state, + const uint8_t in[], + uint8_t out[], + size_t len); + + int chacha20_seek(void *state, + unsigned long block_high, + unsigned long block_low, + unsigned offset); + int hchacha20( const uint8_t key[32], + const uint8_t nonce16[16], + uint8_t subkey[32]); + """) + + +def _HChaCha20(key, nonce): + + assert(len(key) == 32) + assert(len(nonce) == 16) + + subkey = bytearray(32) + result = _raw_chacha20_lib.hchacha20( + c_uint8_ptr(key), + c_uint8_ptr(nonce), + c_uint8_ptr(subkey)) + if result: + raise ValueError("Error %d when deriving subkey with HChaCha20" % result) + + return subkey + + +class ChaCha20Cipher(object): + """ChaCha20 (or XChaCha20) cipher object. + Do not create it directly. Use :py:func:`new` instead. + + :var nonce: The nonce with length 8, 12 or 24 bytes + :vartype nonce: bytes + """ + + block_size = 1 + + def __init__(self, key, nonce): + """Initialize a ChaCha20/XChaCha20 cipher object + + See also `new()` at the module level.""" + + self.nonce = _copy_bytes(None, None, nonce) + + # XChaCha20 requires a key derivation with HChaCha20 + # See 2.3 in https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + if len(nonce) == 24: + key = _HChaCha20(key, nonce[:16]) + nonce = b'\x00' * 4 + nonce[16:] + self._name = "XChaCha20" + else: + self._name = "ChaCha20" + nonce = self.nonce + + self._next = ("encrypt", "decrypt") + + self._state = VoidPointer() + result = _raw_chacha20_lib.chacha20_init( + self._state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + nonce, + c_size_t(len(nonce))) + if result: + raise ValueError("Error %d instantiating a %s cipher" % (result, + self._name)) + self._state = SmartPointer(self._state.get(), + _raw_chacha20_lib.chacha20_destroy) + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("Cipher object can only be used for decryption") + self._next = ("encrypt",) + return self._encrypt(plaintext, output) + + def _encrypt(self, plaintext, output): + """Encrypt without FSM checks""" + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = _raw_chacha20_lib.chacha20_encrypt( + self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with %s" % (result, self._name)) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("Cipher object can only be used for encryption") + self._next = ("decrypt",) + + try: + return self._encrypt(ciphertext, output) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + def seek(self, position): + """Seek to a certain position in the key stream. + + Args: + position (integer): + The absolute position within the key stream, in bytes. + """ + + position, offset = divmod(position, 64) + block_low = position & 0xFFFFFFFF + block_high = position >> 32 + + result = _raw_chacha20_lib.chacha20_seek( + self._state.get(), + c_ulong(block_high), + c_ulong(block_low), + offset + ) + if result: + raise ValueError("Error %d while seeking with %s" % (result, self._name)) + + +def _derive_Poly1305_key_pair(key, nonce): + """Derive a tuple (r, s, nonce) for a Poly1305 MAC. + + If nonce is ``None``, a new 12-byte nonce is generated. + """ + + if len(key) != 32: + raise ValueError("Poly1305 with ChaCha20 requires a 32-byte key") + + if nonce is None: + padded_nonce = nonce = get_random_bytes(12) + elif len(nonce) == 8: + # See RFC7538, 2.6: [...] ChaCha20 as specified here requires a 96-bit + # nonce. So if the provided nonce is only 64-bit, then the first 32 + # bits of the nonce will be set to a constant number. + # This will usually be zero, but for protocols with multiple senders it may be + # different for each sender, but should be the same for all + # invocations of the function with the same key by a particular + # sender. + padded_nonce = b'\x00\x00\x00\x00' + nonce + elif len(nonce) == 12: + padded_nonce = nonce + else: + raise ValueError("Poly1305 with ChaCha20 requires an 8- or 12-byte nonce") + + rs = new(key=key, nonce=padded_nonce).encrypt(b'\x00' * 32) + return rs[:16], rs[16:], nonce + + +def new(**kwargs): + """Create a new ChaCha20 or XChaCha20 cipher + + Keyword Args: + key (bytes/bytearray/memoryview): The secret key to use. + It must be 32 bytes long. + nonce (bytes/bytearray/memoryview): A mandatory value that + must never be reused for any other encryption + done with this key. + + For ChaCha20, it must be 8 or 12 bytes long. + + For XChaCha20, it must be 24 bytes long. + + If not provided, 8 bytes will be randomly generated + (you can find them back in the ``nonce`` attribute). + + :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Cipher` object + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter %s" % e) + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(8) + + if len(key) != 32: + raise ValueError("ChaCha20/XChaCha20 key must be 32 bytes long") + + if len(nonce) not in (8, 12, 24): + raise ValueError("Nonce must be 8/12 bytes(ChaCha20) or 24 bytes (XChaCha20)") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return ChaCha20Cipher(key, nonce) + +# Size of a data block (in bytes) +block_size = 1 + +# Size of a key (in bytes) +key_size = 32 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi new file mode 100644 index 0000000..ba2f699 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi @@ -0,0 +1,23 @@ +from typing import Union, overload, ByteString, Optional + +def _HChaCha20(key: ByteString, nonce: ByteString) -> bytearray: ... + +class ChaCha20Cipher: + block_size: int + nonce: bytes + + def __init__(self, key: ByteString, nonce: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + def seek(self, position: int) -> None: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> ChaCha20Cipher: ... + +block_size: int +key_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py new file mode 100644 index 0000000..b2923ed --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py @@ -0,0 +1,336 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Cipher import ChaCha20 +from Cryptodome.Cipher.ChaCha20 import _HChaCha20 +from Cryptodome.Hash import Poly1305, BLAKE2s + +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Util.py3compat import _copy_bytes, bord +from Cryptodome.Util._raw_api import is_buffer + + +def _enum(**enums): + return type('Enum', (), enums) + + +_CipherStatus = _enum(PROCESSING_AUTH_DATA=1, + PROCESSING_CIPHERTEXT=2, + PROCESSING_DONE=3) + + +class ChaCha20Poly1305Cipher(object): + """ChaCha20-Poly1305 and XChaCha20-Poly1305 cipher object. + Do not create it directly. Use :py:func:`new` instead. + + :var nonce: The nonce with length 8, 12 or 24 bytes + :vartype nonce: byte string + """ + + def __init__(self, key, nonce): + """Initialize a ChaCha20-Poly1305 AEAD cipher object + + See also `new()` at the module level.""" + + self._next = ("update", "encrypt", "decrypt", "digest", + "verify") + + self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20) + + self._cipher = ChaCha20.new(key=key, nonce=nonce) + self._cipher.seek(64) # Block counter starts at 1 + + self._len_aad = 0 + self._len_ct = 0 + self._mac_tag = None + self._status = _CipherStatus.PROCESSING_AUTH_DATA + + def update(self, data): + """Protect the associated data. + + Associated data (also known as *additional authenticated data* - AAD) + is the piece of the message that must stay in the clear, while + still allowing the receiver to verify its integrity. + An example is packet headers. + + The associated data (possibly split into multiple segments) is + fed into :meth:`update` before any call to :meth:`decrypt` or :meth:`encrypt`. + If there is no associated data, :meth:`update` is not called. + + :param bytes/bytearray/memoryview assoc_data: + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() method cannot be called") + + self._len_aad += len(data) + self._authenticator.update(data) + + def _pad_aad(self): + + assert(self._status == _CipherStatus.PROCESSING_AUTH_DATA) + if self._len_aad & 0x0F: + self._authenticator.update(b'\x00' * (16 - (self._len_aad & 0x0F))) + self._status = _CipherStatus.PROCESSING_CIPHERTEXT + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = ("encrypt", "digest") + + result = self._cipher.encrypt(plaintext, output=output) + self._len_ct += len(plaintext) + if output is None: + self._authenticator.update(result) + else: + self._authenticator.update(output) + return result + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = ("decrypt", "verify") + + self._len_ct += len(ciphertext) + self._authenticator.update(ciphertext) + return self._cipher.decrypt(ciphertext, output=output) + + def _compute_mac(self): + """Finalize the cipher (if not done already) and return the MAC.""" + + if self._mac_tag: + assert(self._status == _CipherStatus.PROCESSING_DONE) + return self._mac_tag + + assert(self._status != _CipherStatus.PROCESSING_DONE) + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + if self._len_ct & 0x0F: + self._authenticator.update(b'\x00' * (16 - (self._len_ct & 0x0F))) + + self._status = _CipherStatus.PROCESSING_DONE + + self._authenticator.update(long_to_bytes(self._len_aad, 8)[::-1]) + self._authenticator.update(long_to_bytes(self._len_ct, 8)[::-1]) + self._mac_tag = self._authenticator.digest() + return self._mac_tag + + def digest(self): + """Compute the *binary* authentication tag (MAC). + + :Return: the MAC tag, as 16 ``bytes``. + """ + + if "digest" not in self._next: + raise TypeError("digest() method cannot be called") + self._next = ("digest",) + + return self._compute_mac() + + def hexdigest(self): + """Compute the *printable* authentication tag (MAC). + + This method is like :meth:`digest`. + + :Return: the MAC tag, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* authentication tag (MAC). + + The receiver invokes this method at the very end, to + check if the associated data (if any) and the decrypted + messages are valid. + + :param bytes/bytearray/memoryview received_mac_tag: + This is the 16-byte *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ("verify",) + + secret = get_random_bytes(16) + + self._compute_mac() + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, + data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, + data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* authentication tag (MAC). + + This method is like :meth:`verify`. + + :param string hex_mac_tag: + This is the *printable* MAC. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext): + """Perform :meth:`encrypt` and :meth:`digest` in one step. + + :param plaintext: The data to encrypt, of any size. + :type plaintext: bytes/bytearray/memoryview + :return: a tuple with two ``bytes`` objects: + + - the ciphertext, of equal length as the plaintext + - the 16-byte MAC tag + """ + + return self.encrypt(plaintext), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag): + """Perform :meth:`decrypt` and :meth:`verify` in one step. + + :param ciphertext: The piece of data to decrypt. + :type ciphertext: bytes/bytearray/memoryview + :param bytes received_mac_tag: + This is the 16-byte *binary* MAC, as received from the sender. + :return: the decrypted data (as ``bytes``) + :raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext) + self.verify(received_mac_tag) + return plaintext + + +def new(**kwargs): + """Create a new ChaCha20-Poly1305 or XChaCha20-Poly1305 AEAD cipher. + + :keyword key: The secret key to use. It must be 32 bytes long. + :type key: byte string + + :keyword nonce: + A value that must never be reused for any other encryption + done with this key. + + For ChaCha20-Poly1305, it must be 8 or 12 bytes long. + + For XChaCha20-Poly1305, it must be 24 bytes long. + + If not provided, 12 ``bytes`` will be generated randomly + (you can find them back in the ``nonce`` attribute). + :type nonce: bytes, bytearray, memoryview + + :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Poly1305Cipher` object + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter %s" % e) + + self._len_ct += len(plaintext) + + if len(key) != 32: + raise ValueError("Key must be 32 bytes long") + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(12) + + if len(nonce) in (8, 12): + chacha20_poly1305_nonce = nonce + elif len(nonce) == 24: + key = _HChaCha20(key, nonce[:16]) + chacha20_poly1305_nonce = b'\x00\x00\x00\x00' + nonce[16:] + else: + raise ValueError("Nonce must be 8, 12 or 24 bytes long") + + if not is_buffer(nonce): + raise TypeError("nonce must be bytes, bytearray or memoryview") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + cipher = ChaCha20Poly1305Cipher(key, chacha20_poly1305_nonce) + cipher.nonce = _copy_bytes(None, None, nonce) + return cipher + + +# Size of a key (in bytes) +key_size = 32 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi new file mode 100644 index 0000000..f4b2a42 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi @@ -0,0 +1,26 @@ +from typing import Union, Tuple, overload, ByteString, Optional + +class ChaCha20Poly1305Cipher: + nonce: bytes + + def __init__(self, key: ByteString, nonce: ByteString) -> None: ... + def update(self, data: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: ByteString) -> None: ... + def hexverify(self, received_mac_tag: str) -> None: ... + def encrypt_and_digest(self, plaintext: ByteString) -> Tuple[bytes, bytes]: ... + def decrypt_and_verify(self, ciphertext: ByteString, received_mac_tag: ByteString) -> bytes: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> ChaCha20Poly1305Cipher: ... + +block_size: int +key_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py new file mode 100644 index 0000000..026b491 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# +# Cipher/DES.py : DES +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with Single DES: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` +:var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` +:var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` +:var MODE_OPENPGP: :ref:`OpenPGP Mode <openpgp_mode>` +:var MODE_EAX: :ref:`EAX Mode <eax_mode>` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_des_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_des", + """ + int DES_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int DES_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES_stop_operation(void *state); + """) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) != key_size: + raise ValueError("Incorrect DES key length (%d bytes)" % len(key)) + + start_operation = _raw_des_lib.DES_start_operation + stop_operation = _raw_des_lib.DES_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the DES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new DES cipher. + + :param key: + The secret key to use in the symmetric cipher. + It must be 8 byte long. The parity bits will be ignored. + :type key: bytes/bytearray/memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*byte string*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*byte string*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a DES object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = 8 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi new file mode 100644 index 0000000..dc18713 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +DESMode = int + +MODE_ECB: DESMode +MODE_CBC: DESMode +MODE_CFB: DESMode +MODE_OFB: DESMode +MODE_CTR: DESMode +MODE_OPENPGP: DESMode +MODE_EAX: DESMode + +def new(key: ByteString, + mode: DESMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py new file mode 100644 index 0000000..3b2828e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# Cipher/DES3.py : DES3 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with Triple DES: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) <ecb_mode>` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) <cbc_mode>` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) <cfb_mode>` +:var MODE_OFB: :ref:`Output FeedBack (OFB) <ofb_mode>` +:var MODE_CTR: :ref:`CounTer Mode (CTR) <ctr_mode>` +:var MODE_OPENPGP: :ref:`OpenPGP Mode <openpgp_mode>` +:var MODE_EAX: :ref:`EAX Mode <eax_mode>` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string, bchr, bord, bstr +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t) + +_raw_des3_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_des3", + """ + int DES3_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int DES3_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES3_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES3_stop_operation(void *state); + """) + + +def adjust_key_parity(key_in): + """Set the parity bits in a TDES key. + + :param key_in: the TDES key whose bits need to be adjusted + :type key_in: byte string + + :returns: a copy of ``key_in``, with the parity bits correctly set + :rtype: byte string + + :raises ValueError: if the TDES key is not 16 or 24 bytes long + :raises ValueError: if the TDES key degenerates into Single DES + """ + + def parity_byte(key_byte): + parity = 1 + for i in range(1, 8): + parity ^= (key_byte >> i) & 1 + return (key_byte & 0xFE) | parity + + if len(key_in) not in key_size: + raise ValueError("Not a valid TDES key") + + key_out = b"".join([ bchr(parity_byte(bord(x))) for x in key_in ]) + + if key_out[:8] == key_out[8:16] or key_out[-16:-8] == key_out[-8:]: + raise ValueError("Triple DES key degenerates to single DES") + + return key_out + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level base cipher. + It will absorb named parameters in the process.""" + + try: + key_in = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + key = adjust_key_parity(bstr(key_in)) + + start_operation = _raw_des3_lib.DES3_start_operation + stop_operation = _raw_des3_lib.DES3_stop_operation + + cipher = VoidPointer() + result = start_operation(key, + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the TDES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new Triple DES cipher. + + :param key: + The secret key to use in the symmetric cipher. + It must be 16 or 24 byte long. The parity bits will be ignored. + :type key: bytes/bytearray/memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a Triple DES object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = (16, 24) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi new file mode 100644 index 0000000..d5eac4d --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Tuple, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +def adjust_key_parity(key_in: bytes) -> bytes: ... + +DES3Mode = int + +MODE_ECB: DES3Mode +MODE_CBC: DES3Mode +MODE_CFB: DES3Mode +MODE_OFB: DES3Mode +MODE_CTR: DES3Mode +MODE_OPENPGP: DES3Mode +MODE_EAX: DES3Mode + +def new(key: ByteString, + mode: DES3Mode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Tuple[int, int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py new file mode 100644 index 0000000..7525c5d --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Signature.pss import MGF1 +import Cryptodome.Hash.SHA1 + +from Cryptodome.Util.py3compat import bord, _copy_bytes +import Cryptodome.Util.number +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Cryptodome.Util.strxor import strxor +from Cryptodome import Random + +class PKCS1OAEP_Cipher: + """Cipher object for PKCS#1 v1.5 OAEP. + Do not create directly: use :func:`new` instead.""" + + def __init__(self, key, hashAlgo, mgfunc, label, randfunc): + """Initialize this PKCS#1 OAEP cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + hashAlgo : hash object + The hash function to use. This can be a module under `Cryptodome.Hash` + or an existing hash object created from any of such modules. If not specified, + `Cryptodome.Hash.SHA1` is used. + mgfunc : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). + label : bytes/bytearray/memoryview + A label to apply to this particular encryption. If not specified, + an empty string is used. Specifying a label does not improve + security. + randfunc : callable + A function that returns random bytes. + + :attention: Modify the mask generation function only if you know what you are doing. + Sender and receiver must use the same one. + """ + self._key = key + + if hashAlgo: + self._hashObj = hashAlgo + else: + self._hashObj = Cryptodome.Hash.SHA1 + + if mgfunc: + self._mgf = mgfunc + else: + self._mgf = lambda x,y: MGF1(x,y,self._hashObj) + + self._label = _copy_bytes(None, None, label) + self._randfunc = randfunc + + def can_encrypt(self): + """Legacy function to check if you can call :meth:`encrypt`. + + .. deprecated:: 3.0""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Legacy function to check if you can call :meth:`decrypt`. + + .. deprecated:: 3.0""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Encrypt a message with PKCS#1 OAEP. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) + minus 2, minus twice the hash output size. + For instance, if you use RSA 2048 and SHA-256, the longest message + you can encrypt is 190 byte long. + :type message: bytes/bytearray/memoryview + + :returns: The ciphertext, as large as the RSA modulus. + :rtype: bytes + + :raises ValueError: + if the message is too long. + """ + + # See 7.1.1 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + mLen = len(message) + + # Step 1b + ps_len = k - mLen - 2 * hLen - 2 + if ps_len < 0: + raise ValueError("Plaintext is too long.") + # Step 2a + lHash = self._hashObj.new(self._label).digest() + # Step 2b + ps = b'\x00' * ps_len + # Step 2c + db = lHash + ps + b'\x01' + _copy_bytes(None, None, message) + # Step 2d + ros = self._randfunc(hLen) + # Step 2e + dbMask = self._mgf(ros, k-hLen-1) + # Step 2f + maskedDB = strxor(db, dbMask) + # Step 2g + seedMask = self._mgf(maskedDB, hLen) + # Step 2h + maskedSeed = strxor(ros, seedMask) + # Step 2i + em = b'\x00' + maskedSeed + maskedDB + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext): + """Decrypt a message with PKCS#1 OAEP. + + :param ciphertext: The encrypted message. + :type ciphertext: bytes/bytearray/memoryview + + :returns: The original message (plaintext). + :rtype: bytes + + :raises ValueError: + if the ciphertext has the wrong length, or if decryption + fails the integrity check (in which case, the decryption + key is probably wrong). + :raises TypeError: + if the RSA key has no private half (i.e. you are trying + to decrypt using a public key). + """ + + # See 7.1.2 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits,8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + + # Step 1b and 1c + if len(ciphertext) != k or k<hLen+2: + raise ValueError("Ciphertext with incorrect length.") + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + # Step 2b (RSADP) + m_int = self._key._decrypt(ct_int) + # Complete step 2c (I2OSP) + em = long_to_bytes(m_int, k) + # Step 3a + lHash = self._hashObj.new(self._label).digest() + # Step 3b + y = em[0] + # y must be 0, but we MUST NOT check it here in order not to + # allow attacks like Manger's (http://dl.acm.org/citation.cfm?id=704143) + maskedSeed = em[1:hLen+1] + maskedDB = em[hLen+1:] + # Step 3c + seedMask = self._mgf(maskedDB, hLen) + # Step 3d + seed = strxor(maskedSeed, seedMask) + # Step 3e + dbMask = self._mgf(seed, k-hLen-1) + # Step 3f + db = strxor(maskedDB, dbMask) + # Step 3g + one_pos = hLen + db[hLen:].find(b'\x01') + lHash1 = db[:hLen] + invalid = bord(y) | int(one_pos < hLen) + hash_compare = strxor(lHash1, lHash) + for x in hash_compare: + invalid |= bord(x) + for x in db[hLen:one_pos]: + invalid |= bord(x) + if invalid != 0: + raise ValueError("Incorrect decryption.") + # Step 4 + return db[one_pos + 1:] + +def new(key, hashAlgo=None, mgfunc=None, label=b'', randfunc=None): + """Return a cipher object :class:`PKCS1OAEP_Cipher` that can be used to perform PKCS#1 OAEP encryption or decryption. + + :param key: + The key object to use to encrypt or decrypt the message. + Decryption is only possible with a private RSA key. + :type key: RSA key object + + :param hashAlgo: + The hash function to use. This can be a module under `Cryptodome.Hash` + or an existing hash object created from any of such modules. + If not specified, `Cryptodome.Hash.SHA1` is used. + :type hashAlgo: hash object + + :param mgfunc: + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). + :type mgfunc: callable + + :param label: + A label to apply to this particular encryption. If not specified, + an empty string is used. Specifying a label does not improve + security. + :type label: bytes/bytearray/memoryview + + :param randfunc: + A function that returns random bytes. + The default is `Random.get_random_bytes`. + :type randfunc: callable + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + return PKCS1OAEP_Cipher(key, hashAlgo, mgfunc, label, randfunc) + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi new file mode 100644 index 0000000..b54cd3f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi @@ -0,0 +1,35 @@ +from typing import Optional, Union, Callable, Any, overload +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + +class HashLikeClass(Protocol): + digest_size : int + def new(self, data: Optional[bytes] = ...) -> Any: ... + +class HashLikeModule(Protocol): + digest_size : int + @staticmethod + def new(data: Optional[bytes] = ...) -> Any: ... + +HashLike = Union[HashLikeClass, HashLikeModule] + +Buffer = Union[bytes, bytearray, memoryview] + +class PKCS1OAEP_Cipher: + def __init__(self, + key: RsaKey, + hashAlgo: HashLike, + mgfunc: Callable[[bytes, int], bytes], + label: Buffer, + randfunc: Callable[[int], bytes]) -> None: ... + def can_encrypt(self) -> bool: ... + def can_decrypt(self) -> bool: ... + def encrypt(self, message: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer) -> bytes: ... + +def new(key: RsaKey, + hashAlgo: Optional[HashLike] = ..., + mgfunc: Optional[Callable[[bytes, int], bytes]] = ..., + label: Optional[Buffer] = ..., + randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS1OAEP_Cipher: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py new file mode 100644 index 0000000..17ef9eb --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1-v1_5.py : PKCS#1 v1.5 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['new', 'PKCS115_Cipher'] + +from Cryptodome import Random +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.Util.py3compat import bord, is_bytes, _copy_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + c_uint8_ptr) + + +_raw_pkcs1_decode = load_pycryptodome_raw_lib("Cryptodome.Cipher._pkcs1_decode", + """ + int pkcs1_decode(const uint8_t *em, size_t len_em, + const uint8_t *sentinel, size_t len_sentinel, + size_t expected_pt_len, + uint8_t *output); + """) + + +def _pkcs1_decode(em, sentinel, expected_pt_len, output): + if len(em) != len(output): + raise ValueError("Incorrect output length") + + ret = _raw_pkcs1_decode.pkcs1_decode(c_uint8_ptr(em), + c_size_t(len(em)), + c_uint8_ptr(sentinel), + c_size_t(len(sentinel)), + c_size_t(expected_pt_len), + c_uint8_ptr(output)) + return ret + + +class PKCS115_Cipher: + """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption. + Do not instantiate directly. Use :func:`Cryptodome.Cipher.PKCS1_v1_5.new` instead.""" + + def __init__(self, key, randfunc): + """Initialize this PKCS#1 v1.5 cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + randfunc : callable + Function that returns random bytes. + """ + + self._key = key + self._randfunc = randfunc + + def can_encrypt(self): + """Return True if this cipher object can be used for encryption.""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Return True if this cipher object can be used for decryption.""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Produce the PKCS#1 v1.5 encryption of a message. + + This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and it is specified in + `section 7.2.1 of RFC8017 + <https://tools.ietf.org/html/rfc8017#page-28>`_. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) minus 11. + :type message: bytes/bytearray/memoryview + + :Returns: A byte string, the ciphertext in which the message is encrypted. + It is as long as the RSA modulus (in bytes). + + :Raises ValueError: + If the RSA key length is not sufficiently long to deal with the given + message. + """ + + # See 7.2.1 in RFC8017 + k = self._key.size_in_bytes() + mLen = len(message) + + # Step 1 + if mLen > k - 11: + raise ValueError("Plaintext is too long.") + # Step 2a + ps = [] + while len(ps) != k - mLen - 3: + new_byte = self._randfunc(1) + if bord(new_byte[0]) == 0x00: + continue + ps.append(new_byte) + ps = b"".join(ps) + assert(len(ps) == k - mLen - 3) + # Step 2b + em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message) + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext, sentinel, expected_pt_len=0): + r"""Decrypt a PKCS#1 v1.5 ciphertext. + + This is the function ``RSAES-PKCS1-V1_5-DECRYPT`` specified in + `section 7.2.2 of RFC8017 + <https://tools.ietf.org/html/rfc8017#page-29>`_. + + Args: + ciphertext (bytes/bytearray/memoryview): + The ciphertext that contains the message to recover. + sentinel (any type): + The object to return whenever an error is detected. + expected_pt_len (integer): + The length the plaintext is known to have, or 0 if unknown. + + Returns (byte string): + It is either the original message or the ``sentinel`` (in case of an error). + + .. warning:: + PKCS#1 v1.5 decryption is intrinsically vulnerable to timing + attacks (see `Bleichenbacher's`__ attack). + **Use PKCS#1 OAEP instead**. + + This implementation attempts to mitigate the risk + with some constant-time constructs. + However, they are not sufficient by themselves: the type of protocol you + implement and the way you handle errors make a big difference. + + Specifically, you should make it very hard for the (malicious) + party that submitted the ciphertext to quickly understand if decryption + succeeded or not. + + To this end, it is recommended that your protocol only encrypts + plaintexts of fixed length (``expected_pt_len``), + that ``sentinel`` is a random byte string of the same length, + and that processing continues for as long + as possible even if ``sentinel`` is returned (i.e. in case of + incorrect decryption). + + .. __: https://dx.doi.org/10.1007/BFb0055716 + """ + + # See 7.2.2 in RFC8017 + k = self._key.size_in_bytes() + + # Step 1 + if len(ciphertext) != k: + raise ValueError("Ciphertext with incorrect length (not %d bytes)" % k) + + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + + # Step 2b (RSADP) + m_int = self._key._decrypt(ct_int) + + # Complete step 2c (I2OSP) + em = long_to_bytes(m_int, k) + + # Step 3 (not constant time when the sentinel is not a byte string) + output = bytes(bytearray(k)) + if not is_bytes(sentinel) or len(sentinel) > k: + size = _pkcs1_decode(em, b'', expected_pt_len, output) + if size < 0: + return sentinel + else: + return output[size:] + + # Step 3 (somewhat constant time) + size = _pkcs1_decode(em, sentinel, expected_pt_len, output) + return output[size:] + + +def new(key, randfunc=None): + """Create a cipher for performing PKCS#1 v1.5 encryption or decryption. + + :param key: + The key to use to encrypt or decrypt the message. This is a `Cryptodome.PublicKey.RSA` object. + Decryption is only possible if *key* is a private RSA key. + :type key: RSA key object + + :param randfunc: + Function that return random bytes. + The default is :func:`Cryptodome.Random.get_random_bytes`. + :type randfunc: callable + + :returns: A cipher object `PKCS115_Cipher`. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + return PKCS115_Cipher(key, randfunc) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi new file mode 100644 index 0000000..b69f509 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi @@ -0,0 +1,20 @@ +from typing import Callable, Union, Any, Optional, TypeVar + +from Cryptodome.PublicKey.RSA import RsaKey + +Buffer = Union[bytes, bytearray, memoryview] +T = TypeVar('T') + +class PKCS115_Cipher: + def __init__(self, + key: RsaKey, + randfunc: Callable[[int], bytes]) -> None: ... + def can_encrypt(self) -> bool: ... + def can_decrypt(self) -> bool: ... + def encrypt(self, message: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer, + sentinel: T, + expected_pt_len: Optional[int] = ...) -> Union[bytes, T]: ... + +def new(key: RsaKey, + randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS115_Cipher: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py new file mode 100644 index 0000000..79e6701 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# Cipher/Salsa20.py : Salsa20 stream cipher (http://cr.yp.to/snuffle.html) +# +# Contributed by Fabrizio Tarizzo <fabrizio@fabriziotarizzo.org>. +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, VoidPointer, + SmartPointer, c_size_t, + c_uint8_ptr, is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._Salsa20", + """ + int Salsa20_stream_init(uint8_t *key, size_t keylen, + uint8_t *nonce, size_t nonce_len, + void **pSalsaState); + int Salsa20_stream_destroy(void *salsaState); + int Salsa20_stream_encrypt(void *salsaState, + const uint8_t in[], + uint8_t out[], size_t len); + """) + + +class Salsa20Cipher: + """Salsa20 cipher object. Do not create it directly. Use :py:func:`new` + instead. + + :var nonce: The nonce with length 8 + :vartype nonce: byte string + """ + + def __init__(self, key, nonce): + """Initialize a Salsa20 cipher object + + See also `new()` at the module level.""" + + if len(key) not in key_size: + raise ValueError("Incorrect key length for Salsa20 (%d bytes)" % len(key)) + + if len(nonce) != 8: + raise ValueError("Incorrect nonce length for Salsa20 (%d bytes)" % + len(nonce)) + + self.nonce = _copy_bytes(None, None, nonce) + + self._state = VoidPointer() + result = _raw_salsa20_lib.Salsa20_stream_init( + c_uint8_ptr(key), + c_size_t(len(key)), + c_uint8_ptr(nonce), + c_size_t(len(nonce)), + self._state.address_of()) + if result: + raise ValueError("Error %d instantiating a Salsa20 cipher") + self._state = SmartPointer(self._state.get(), + _raw_salsa20_lib.Salsa20_stream_destroy) + + self.block_size = 1 + self.key_size = len(key) + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = _raw_salsa20_lib.Salsa20_stream_encrypt( + self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with Salsa20" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + try: + return self.encrypt(ciphertext, output=output) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + +def new(key, nonce=None): + """Create a new Salsa20 cipher + + :keyword key: The secret key to use. It must be 16 or 32 bytes long. + :type key: bytes/bytearray/memoryview + + :keyword nonce: + A value that must never be reused for any other encryption + done with this key. It must be 8 bytes long. + + If not provided, a random byte string will be generated (you can read + it back via the ``nonce`` attribute of the returned object). + :type nonce: bytes/bytearray/memoryview + + :Return: a :class:`Cryptodome.Cipher.Salsa20.Salsa20Cipher` object + """ + + if nonce is None: + nonce = get_random_bytes(8) + + return Salsa20Cipher(key, nonce) + +# Size of a data block (in bytes) +block_size = 1 + +# Size of a key (in bytes) +key_size = (16, 32) + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi new file mode 100644 index 0000000..cc56808 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi @@ -0,0 +1,24 @@ +from typing import Union, Tuple, Optional, overload, ByteString, Optional + +class Salsa20Cipher: + nonce: bytes + block_size: int + key_size: int + + def __init__(self, + key: ByteString, + nonce: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> Salsa20Cipher: ... + +block_size: int +key_size: Tuple[int, int] + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..451d359707bb1f98ab6c8a231f3eeaa98b7cc774 GIT binary patch literal 21016 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 CAhy;3 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py new file mode 100644 index 0000000..c1c3249 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py @@ -0,0 +1,131 @@ +# =================================================================== +# +# Copyright (c) 2019, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, c_size_t, + c_uint8_ptr, c_uint) + +_raw_blowfish_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_eksblowfish", + """ + int EKSBlowfish_start_operation(const uint8_t key[], + size_t key_len, + const uint8_t salt[16], + size_t salt_len, + unsigned cost, + unsigned invert, + void **pResult); + int EKSBlowfish_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int EKSBlowfish_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int EKSBlowfish_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a smart pointer to + a low-level base cipher. It will absorb named parameters in + the process.""" + + try: + key = dict_parameters.pop("key") + salt = dict_parameters.pop("salt") + cost = dict_parameters.pop("cost") + except KeyError as e: + raise TypeError("Missing EKSBlowfish parameter: " + str(e)) + invert = dict_parameters.pop("invert", True) + + if len(key) not in key_size: + raise ValueError("Incorrect EKSBlowfish key length (%d bytes)" % len(key)) + + start_operation = _raw_blowfish_lib.EKSBlowfish_start_operation + stop_operation = _raw_blowfish_lib.EKSBlowfish_stop_operation + + void_p = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + c_uint8_ptr(salt), + c_size_t(len(salt)), + c_uint(cost), + c_uint(int(invert)), + void_p.address_of()) + if result: + raise ValueError("Error %X while instantiating the EKSBlowfish cipher" + % result) + return SmartPointer(void_p.get(), stop_operation) + + +def new(key, mode, salt, cost, invert): + """Create a new EKSBlowfish cipher + + Args: + + key (bytes, bytearray, memoryview): + The secret key to use in the symmetric cipher. + Its length can vary from 0 to 72 bytes. + + mode (one of the supported ``MODE_*`` constants): + The chaining mode to use for encryption or decryption. + + salt (bytes, bytearray, memoryview): + The salt that bcrypt uses to thwart rainbow table attacks + + cost (integer): + The complexity factor in bcrypt + + invert (bool): + If ``False``, in the inner loop use ``ExpandKey`` first over the salt + and then over the key, as defined in + the `original bcrypt specification <https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node4.html>`_. + If ``True``, reverse the order, as in the first implementation of + `bcrypt` in OpenBSD. + + :Return: an EKSBlowfish object + """ + + kwargs = { 'salt':salt, 'cost':cost, 'invert':invert } + return _create_cipher(sys.modules[__name__], key, mode, **kwargs) + + +MODE_ECB = 1 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(0, 72 + 1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi new file mode 100644 index 0000000..49c8448 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi @@ -0,0 +1,15 @@ +from typing import Union, Iterable + +from Cryptodome.Cipher._mode_ecb import EcbMode + +MODE_ECB: int + +Buffer = Union[bytes, bytearray, memoryview] + +def new(key: Buffer, + mode: int, + salt: Buffer, + cost: int) -> EcbMode: ... + +block_size: int +key_size: Iterable[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..a303d911a4b77471b48fa845c0ded098329a5318 GIT binary patch literal 27016 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py new file mode 100644 index 0000000..9bf067f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py @@ -0,0 +1,79 @@ +# +# A block cipher is instantiated as a combination of: +# 1. A base cipher (such as AES) +# 2. A mode of operation (such as CBC) +# +# Both items are implemented as C modules. +# +# The API of #1 is (replace "AES" with the name of the actual cipher): +# - AES_start_operaion(key) --> base_cipher_state +# - AES_encrypt(base_cipher_state, in, out, length) +# - AES_decrypt(base_cipher_state, in, out, length) +# - AES_stop_operation(base_cipher_state) +# +# Where base_cipher_state is AES_State, a struct with BlockBase (set of +# pointers to encrypt/decrypt/stop) followed by cipher-specific data. +# +# The API of #2 is (replace "CBC" with the name of the actual mode): +# - CBC_start_operation(base_cipher_state) --> mode_state +# - CBC_encrypt(mode_state, in, out, length) +# - CBC_decrypt(mode_state, in, out, length) +# - CBC_stop_operation(mode_state) +# +# where mode_state is a a pointer to base_cipher_state plus mode-specific data. + +import os + +from Cryptodome.Cipher._mode_ecb import _create_ecb_cipher +from Cryptodome.Cipher._mode_cbc import _create_cbc_cipher +from Cryptodome.Cipher._mode_cfb import _create_cfb_cipher +from Cryptodome.Cipher._mode_ofb import _create_ofb_cipher +from Cryptodome.Cipher._mode_ctr import _create_ctr_cipher +from Cryptodome.Cipher._mode_openpgp import _create_openpgp_cipher +from Cryptodome.Cipher._mode_ccm import _create_ccm_cipher +from Cryptodome.Cipher._mode_eax import _create_eax_cipher +from Cryptodome.Cipher._mode_siv import _create_siv_cipher +from Cryptodome.Cipher._mode_gcm import _create_gcm_cipher +from Cryptodome.Cipher._mode_ocb import _create_ocb_cipher + +_modes = { 1:_create_ecb_cipher, + 2:_create_cbc_cipher, + 3:_create_cfb_cipher, + 5:_create_ofb_cipher, + 6:_create_ctr_cipher, + 7:_create_openpgp_cipher, + 9:_create_eax_cipher + } + +_extra_modes = { 8:_create_ccm_cipher, + 10:_create_siv_cipher, + 11:_create_gcm_cipher, + 12:_create_ocb_cipher + } + +def _create_cipher(factory, key, mode, *args, **kwargs): + + kwargs["key"] = key + + modes = dict(_modes) + if kwargs.pop("add_aes_modes", False): + modes.update(_extra_modes) + if not mode in modes: + raise ValueError("Mode not supported") + + if args: + if mode in (8, 9, 10, 11, 12): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["nonce"] = args[0] + elif mode in (2, 3, 5, 7): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["IV"] = args[0] + elif mode == 6: + if len(args) > 0: + raise TypeError("Too many arguments for this mode") + elif mode == 1: + raise TypeError("IV is not meaningful for the ECB mode") + + return modes[mode](factory, **kwargs) diff --git a/lib/site-packages/pip/_internal/resolution/legacy/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi similarity index 100% rename from lib/site-packages/pip/_internal/resolution/legacy/__init__.py rename to python/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..f1f1fa1e46a37331db3d5b605415fe31b383af57 GIT binary patch literal 30624 zcmeHw3v^UfmiD=Ib1MZ2RTUC2fJzaAfI^Z2R6rh8P=N{r<&j`)z#=3S5(z1+RCu%x zlmN>zqWJo|*Nol8Ot;gI)lTblFJ+wRHUS&x7N4!QW4GP3zYl0_8=r&Pn*ZD9o_(w8 zRzQ1Zt$+Rhnp`+{@BN*<_t|HkbDz2Q){g4hg$_*<yy#-CAZef1L;|Y97gG#KK+F(B zur3qhq;6iiDu)X=O^B&beyI(Es+4S}pSVmrrd&^UvOS+!FKjgIFma}tb`;9#DQ5lY zIoWiXvTIP3?MNg$Z-uGvotsUcrGT(7Rbk5*Db5+npPiOVD<PQ5J^@?yMxvQ`ug_Gl z(~t=Zrfjzyb}H3M<LrdfzCyKkro6aR{7hAMW&cXhgpRW4ih5CSne*jU`KQbF&RTuZ z`WrrWe)oG1ET;&lJ|BhbD85^75uz_IR6`i$Y6wdH7Ym>J*S+t#cmClwp7*aFechja z{TH|EfcE3J{(0<ms2*^E8!>!<nvuYK1K@4I2GXav2GXB;2D}z{8H#;*0KjljAl8+d zHFqk7CW)h$oN$Hjk$8c4mIB5ygaW~`8io8U8zDteuW&LSE(*md<=?CoVzbhJNclNm zReVF?$Imf=n-nf0kqw(-9g)sNV>}Uwh)7FYN1KS$)GduPN8`~AZJmi|yl&}&_E<-> zu5o>P)T|r0CepO6ksLI(w|zY-npzw2e`-|(9uuOevAsRklm?rlor!pCyJ(3=GgPA; zP4VrUq0P3P(db6e%A#m*TfaHc8jm(MS9HcIsz`1k?ozR+wr2i<$kd9d6_-%gXquW+ z)q%N|`OoY)A&-OQVdxs&hCy+NUz*i|_XoWF28vXL+TIx#3U}FXmXFUf?P#v6O-BMJ zGH~8zsp3=yF87C08~dpYJafA)4VVhNO(}KZ%fN>+2s$wXFU-KJGH}{Pd6^L~Ir5(w zXCMR5jK|a-Tn}boFav`b7|g(61_m=Qn1R6z{Qr`HaQ8c|aF6k7r4ZrWy$Rz4U4VqU zpKu*Ad(eN$YpCiU|2o#5u>o)-w^HTF<Na91zd|xyrJQ_L%FmNbr@kk9rTi<B=@j$i zLsC9SGM!qU+%M(FNTyTYllvft_s)43KzOh5Ln1RzCq^K=ONmE#L;8<<#@-BFaY#|< z-y-!d`8ttFUxbsV!hP?~3-_JY!`k8Sb6+G%;J{E0T>ZyeJYz#?`<v$kQ6;)6>%-l1 z-lU8CaPo~rA>96HvJfZMBBT?oSRFP-K~G!D?J_-iJt|u&JY#oJRAOK7s^F?%eXy=R zocw6z2cFniPto}xF>k1+BAmRT{6whdnmkWYhZo=uU(Yq(a57PT%2RZc55R`1o|}B0 zqL!+jEhV9zrRAZXYFE$FQqQF3@&i5fGeSMliO@bC>Zvd6>6#wux$)edQ2BvSPuJ|8 zO_Ps=%3r55f3tr<?bV=mG~_=K@*nK$_4Xa~YDa?F3;xeS{y+8|D(vek%+_#eNBo~5 zz5_islppUqlpoZf`TM@Z-k|ng$p1{=5$KzU%S1xS+VZ1)NAmj)x~jELtNkwpwa?K& zbrR}-4EFVT`}*=j+EYR8$)Nu)A^*!kxIiFM_c_$NP+9FiNt#g5eo?I*gGzqL|CVg) zbJSHQpAPk)m0;gtwDF;=$_K2S4r;H2{D(vS=MnL7M0@~&QWyU-s69tr^Y@4RPg2v= z=%GS1ZyNRWx=cIm7x0PD{U?=8zOq3G=zVv4`Rkfz_oH86Y=fSTURu3RtIt|I9nIy( ziG8ZYv;Hu|=V~zsryx8-=pTUmIgF@Jw0PQ&LO6t)U!y!hweJD=eb7_nLghgMUZB+% zKmuM=9f979C~%8vPsj6A;RDkfPQusv-=G|-ozzR!;qKlgR9zMBKJE7GIfjwP3>t@W z9p=<g&^DS<S68)ozBtz6i5>P7)zp3v^u)G#J(Jdy9{_yBQxsf7&}Os|`vs80o=J)F zqk!894v_63NH-h_glTq%djbJ8=Sob%y08lyR-*hw&%&xCW?^@)mRwksn7Z2EyEeEc zxHfoAFmkA6U#?2mt33;+TNcy1o?d-`rfu3tZl582Qco~1lx(XF>Vdpua9K~#1<sWW z*7XDn!4)Qh4Lw0GIBznzrYBeet|S>;*ApxSSDFkq_XN)ccWyG++7tAF^Cg4r!Ja_5 z9xP7=H-np~2PY<j32>A3;N)a*8@MVxSd|Rk0B*V-oSwYpW`qV|h8~=eyoI)L2($Iz z?Bp%CLO`NV9;ZoS?Eu2N`#rlZ!|pIxUz2<a`+=2m54-!9o?ZVS4L%C*{@AnYLE^hV z^?7!G2V8Bkw<h`5+T@{d_wmnUf(wHO=n6dC{h7C`{^$F^K2E#X6Aymc-(Qo=E62{z zv+ETg7~-Ya<YUG(B+*k8ru|C2*HZ+3nGfcLo?Uk-M~Uk#r>?{z+Q)~Iy{l#3F-g@9 zjNsq_YHKxW%}Uzun>bzhXX7<J^~l1q8R29@pxWPyi4u^_WjZH&nonyHR72I<FOaP4 zrU!fKUCCv$-+o-}&&{^c^r7GZc@U|i{cBc!6UCI$6Y)>_`~AK0P~{mbWXPCrwD+w^ zzNiu(pk&{BaOv(pd+zOZ9rWyefr3kZCP(Qg@jX`sRHk1;=0A0LcJ~0TNj@E>A-fTL z&!TWm@<SXI<h<-Y9Y|cCJn~ooH9x0Sc+#hn4%g0nKj>NXaq_+0A1CGqJ&)v-PYqpO z8@#pJjH~+#Em3Cfmy-wem0`~#b;Y&8sU>;ATk8y@wpR<!?CW~HXF<3|J65ATrJYKG zo%D3qU9y7#bC819(DsykH=O*#iTlv`-Mw9}!Q^BIGK4e)%u!R@5g(t>(?n-|@+sNL zmDKg_cf#SGD+A%=GvV&HAojbuE;>+vo^*dcZ!4zEC$7XrNL$y4<jSgW@=a=Og4vp$ z+!#hf;ni!?^94I6+EYD^JyTzc=cNTzZ$ByX#N&Y`e~l)WnFA5t{aZN@UF&L+pHOHG z;pBVay*HG*9`hlB+T_#019XS(!~_3{K4Hi1BBcf4y@_(~iGMhanc#_q%CW1A)s_cj zy{Aa`6fN<d*hL22Pb~BIu141bX5I-P5yyKuncjXE$;SCk`t$~E4K9Nj7|g(61_m=Q zn1TO!8HjG%+}P3Vn>KaI`t6CRZ=*IwzZ{24`8Qkdss8?T-~;dV_tV*K;G_Qj*FpDx z+}}@E{Jo$zgFcI6@5`XeaDe8&6Vu;@Y0<vELTKB(+L*$8*FNZ!13MSx`+w>0r@vha zw|Aktbg`#ktLtVlZ}jCCO)D=WxB-RYcnC3kOm`3FyS;Zh=DSPp(C52-d-LYIC*E!Z z-Bo*>A@_{#eElQGP<Pb=_e4}e3Ci=`t_20n02gM13k$@}aJL_&?!*3m`S;Z&Ztq@4 zwY&6oJ?QrB$qTwCb{ipgmE#*j-4jD@UyvOxE(ifx<o1OasU86Nn$4=Zpw;a<bokg) zi``Y-#-6;}^}P;3`6)*}s*qFpH`^MwcZu62>VVG%J_ES?n=ra^2laceUhVeXPO<Hw zes`nan;nPIKOl%YqtmNppEEJ|#LWzGFZ`Z@U-`G-g>LU2N7!B3tuJz~+cDH#8gzSu zZr9?11`1Y8g#HuI4`7V%1TRqC?SQJIb*S6B!0oCor~v~DBy?~Y%)np<1~V|2fx!$6 zW?(P_gBcjiz+eXcpU!~we537oMx64?<;RM${J4?}73Bvhhbft#OC6<Tex7oSl3j|9 zRuqq!%Z085Y2o^hzUYsUypC@EW8r5aPti3X7Jl|{zpAG{9ntclN$}*Xx$tAM$_y7W zCa%l`{YixuzD}jTw$P#;mlY4Gh8cG$ndAJvsV<*iCYIa7AA@B4C-O`M+?$s&=Mk5) zQa-Heac5o1R-DT3|1HALv)kLdly1XgS*YkLMOzfzqUat)7cE#Y%Qq2Ef=}}KtME{+ z-#4{ts=vxVt;#oXMYP!$ZcM0(DSrPXc{yqhg_+Q0Y8s|E-)8I9`u7-jGh;68XFv;S z9xXu`$k6c!D)i^hnMuTz-+<ifn(KO!9QofNl9#_$f=>DakM1xYgOrzNv~?t4V9<54 z;nFqdF6qFylXPAAD?yyDJAmaot|f!2(f|b4ome?uC1Bb)R}iott0DWe2}Ax2W@xL> zCb@|d1wpK|iwdWJ1PY=gRJzF`Tu=jZ%|GmO2(_YcKM1kIs0SWVNG%M5hLq<C$3Do~ zRQ+KP_fLQu7rCzkKNGBn7|*S=qGp8mHh|98v|+VeDT-zRcm7(FHgq3HYMSc9>6%}= zK=U?1$Nnt4cK>#aS@Fi`c2b#00&fl_-y*wm6HLJNT9lF`R@!*2YzH(y0)G-^L@|LA zwBp?W^}D{mV<ZwZQIi?c?|Nv*IlsV`_G7g<X~G9do30r?XqWyD!VWZaBTDJ>5WWZI z0TeOn@0CRf&=t@ft<{tB(ORAUfmT0STkdfAMr$h|)Q#2}w161JZJdjFwNYBsQTt-d zG3DwgO*p6P@8z0?!0DnvIQMd_v`=M*>`&Kg_s_<Ld>%b~uYEe1diVmAe}!^h6<K{Y znMSl0_(GKP=;oRBSBZTa@;3?FPT1!YXj*&-`A;b4#|i5nLSsTt(zKvZ)&ys5|BkVf zRM6BL^xe^kHTtuE2Lhf%;rvDhY=7NAyPpiqfPYg-0pADbJt)4m4xznVNrOBJD)}hB zSXV-5|1pV%^ApH#5!N1s-YXMnvb}`d{|aSXFDlM|nu7k{!>J<?Y`tqy%G!kXx<qb+ zv=ik5bmNWTv~}or?b|W#6dB6io+xSp_zqP5gfjNu)P6audyXwo!ELlMYH5EV8Sw5v z-ZF%&-G2}+&HnA5Nc}6u9>#;>L(BVTQ0;O^OHe4ff0Wx}FQofX#*zE7&aO>D`|0rg z;1fe|XAWgNP10jDld<Sx83pj@5IH}0;|RGHMb6Lr+<3GI1&h<QAM11J{+{+tITrR; zHnjU`@|v-JQ;tOecCH4>*q^JnJ7^21nT;te#Dz5TwK>w4wiTum<fb)e3h@)=RyubI zjo*Y$YINRs8lwr{B0gZ^LE?iFpVZnZv;}gboP<1tWF8PSrR*Z83CESC`$6>Ykn_zD zXOZhkTZLn}n<~V`s1Oc+iB7qh2;4uJvP-)Dxuh#DeiH#Z#+T@CDIeo6rl~}_<L45F z_I`x*WXgm61sLuA((!=XkdCWRO8pRK<EU{FO6eR3L-2af=OolX_$LVWqLkJ{xCMFH zfHI{K!jyKb##0O59f7vwavbv=iIi@>g)@S0ph(M)!MsBP`Ak5+6-72}U_?G4fr9#9 z5N<;mM~*6}l?yOm$DmYDYqx;efim_dszurtV;D6*wo!*`pNv5((#E@s3v~Awcab(c z-wS=mNTIuD6<l60v!Djy>*b=LU@kOpq){w(zlH}WGDn28@-Kut*M)-kA;nrjf$2bl zICK~eW9)ARj0yl)4G>VMX*I>9I&2&qR045VX!Ay~(u7ep#j{6Iy~mIZc&%DvX2FC} zW?fM>$R@+>Fm*Ff`i=S0VX<Mx20t~$j&mNJkN#tjWXqY@i0PRac6uWLP^U~K0Oy>i z`HNR*2j&~~=QI>tZCq7A0hb!W&wfWGcWOwtU-oqLZ96sLD7|YwOvj)?Pz5$rD_Ufq z`kfW+c`7nFGAi2hRb-jiSZ)dX8`Z(g>Tv~HJ^ERux{z6QK^BJC$}6<YVaN(+e0G-$ zuEM}wXzzee=3zo+<k<Eyqr&E#*($cJ>^4mg7iWSdG`Rvfvm(MaHXX^v<R_xCBmNcp zL|r_J$*F0dxrbq`VJi?QT4%gTRK_+ZD&wt{&CxB1SggG>nwa9Rs*J~CiOR0dcqQKZ zs@%}jRJm=&rIAagPl-pHTN@Ko+S@w1wpBu}t)r>Et2rv9E(_L6Wfe`-Otho9t+6B8 z*;zq{PSKfYZjQEq#~uhgPW`}R^Tk_gZ5<n!Z$`r=FAPl#aq#g)->+$gQCwnZPLE+c zX=r~mjC&02QNvjMn6uXKXwKP&@k7Uj!;K-rk*7Ofq4jK9VX{Fkq4g|U&9ykEtk0-& zR#2VYpz16JU#SJ@(Dd3(zG{r|L=drzwU~soqn0lhO^2qJmol8B8#+5@_FJ}#;mFfx zn&Hse3{zHJPVyXD4HU4gg>?MR5o97=;>?+yFD5pl%FMlVlAx*#dpT5b0;T;F;%2Fo zEjD{ARcsNYMOy})ZRDYzR!$j4Mq3*Qt)!LgXu8WYvm2BNNw;9*oU*!$+(-}7p`2`L ziphG}LIx_Gn5Ij}R8~nPyQZm>fo9B8n`_y$+5P~t%og`o6`iu_%m0>?oY}SMWws%w ziM~a{@f4lM#!bYj8AF`9+wq8|l@#YWj1v9bn@}|(PczPU>UUrtP~vI;Zs_mdv~w}g z5l+1as0Vh%b_=g*aej+Y!ZwS)qD@JQ;oYg)Y52-E%D~o$G0GT?ei_a!#&DvGjUuOB z_!vS*Z(cVveOQB0IM&cA3BT6DM>wxGMnR?Y+fW(NVEFWQAGneR%24EWduK~zXJ@Mr zW`9}CraA{a`%5yJrJWemruq0kF()m5(>(d_XlweNJ6t{-@o~s^VJpyXH(bZC4gE|? z#V$YieMT{AE?#VSHy9U34Q%e$wP4RMTr<j@T0?_@?aFX2kp_nIp5o$SjM+%Tt#5BI zN|HqPp?*H?JB*R2!g<9~*N?D?&D3`KDk{Ehc=d;OEQb7yXn6_3Po;27w9s~1_mWei zt;eZv&`R`1P4{WYO_6?%#&}BxKE|n!M6Gid!n;tDVN+y<&JyFCS#Yuir!~b1A6g~f z@dox$li{OCzr^w#&cZLX@I_hpWfs0L3!kAGW1McI=pUW>rWS6hAxq^#%k-)Y9Nic% zyTL}QvMVQ0Wf#W9t1rQjQR2Y<8|BTZ9~CZ)N3j}?ubC%uOR<wHq~WdH>D1@!q<YO+ zWQ={o7>}WJy6!Q?q1L;^7<ZN7T5J?JpTs`&K4WCtPTC7@*Jyf>{SfCm8gyfH!YFSr zM&r!Nd6!X4c!e<xnJz)yc;^ul(g1y6Q~<)xbiDILg)TPEUt^4#X%vz5++rMXv<9@O zchI?Ip+2GlQPQk(>YE!%jFB)O=6n#d4%6+5*$wFK5Jaj+X~v9cXmNfwWAfIaFAJcG z-s#&K3{TP+w|F*n$Z)nv*mV`y)iO6job9ShtBq1PH=Oefx1<lM+$~kdlesi&8hnUW zkA1rs5f!2REv|$Nz!@^z*D%uO?J*|GbY9^+ijc`0jfHddeoWyK{k<E}3XVp37^S@q zOl$pv8zJa-NdA4v-zj-$0^cY3Q<A?+@_&*1-I9M-^7lyo&%`_RdmWF#={q+zBuq)8 z(JwX%YmiYNVs5AGl_0lXY{8CvT&lFk8k-|sGZL|BQzPwdi3C22v3X^pF%cEGcByPq zAFsf52D1_C!xrXeFgju#P0^L~m5j>G@z}M|ri@Qs@Ru>VI-|`?qT5#{@VSdk0{3sE zepg3l+lCI@L5J(O=<HfgH+FE50v-B@2SSj(MQ3X)p72@PbSt|P?L`vwc^2OS|7Bn0 zzPxYBrq0gjRFFhhM|94HXh$^O)&#LJ-qbn=7hh8@o$i~m!8hf~X}&2fTjPzJw}39I zS&;5{Q!E}8>+$K2jgi*24Xx=4`DG94mDxXhU}S?&uCik8Lf|tHbUfPG)t(TsmKIzJ zDu3;<t>))L(zeu1*?<3~>6Ya8M>a(_HEl+wWLiiq{ZSDsh`LyPXH-y=7}td8nl?2N zo52Gt@5*51#f?B(7AvZWdS-ViC{N&qT#BW=X+>uF&l;wp>2IJlw-vBl)G^C#YGMVm z+#q?a8=(2Rfts&N4b(7W9KiWj0Lz)}wxE^FW(Kg_3gGUvBD41>h$3B{Vu`b&iIv<w zQ%#R36Q+3rH|KL=&(#~i89T-6nYfos%a0VrSTg&D1+8TEEd`mQ#*&`y9<y!>syF@H z*WB*QRwH%HvRiWySxS4Xv->jTT#w5K^0+*e>v8$O9tmZyKd|Cl!R(tBw2E1FO`)%_ z8semAVimLL-mJ)JTl){?__)=;vK%D~xEZ%oY5A?97(ixMS@tWLy+%Ri0J5|-t;lTB zf(9Bux=|%>R+(+*#!$yG=$4-~%#K!&E^g3LEHHJ78}J3EG7G;<DZ5Pk0xiYJY*oV+ zi<Nw(qMBHf+rKrr{TpaHouPmCSvg+LEO$y1YnkP)==iIg)ei=p;>I)dPvQgi&$QtF zt+x8NmixCS4Kd5(M+3b)XD5MSvxYBs@K*5PRa<_qVRos4oZ==C7w4u}PG|iZj*3&Q ziEEhUsIbd6XHMq&bCun+tDK>ccSsRAt9n&54pEh2o-^$bek=Ratd1;WmZy;}Hfsaq zXQQ%+r!6yMwe#~8fUS>N{)3xNyJ@?Awp?Rb*D?Eb3tGi&hQk9n4zWQxzGM*#mCv1u zQr5z_!Ar{uMG0g6Y76tHm~XPMsVU|+S=h7`^II)!dW!j5EbNjL^Yn*RS{&li6!Y{4 zR};G|#eB-bW~7+^frZUXG5-?_o0VezXBKvOiuofJHao@q3l=sf#rz*FY;KDAcP(sQ zig_L!hX~}%CWoMz{nd(Hi^pe)YI7*fCg;6*H)0>j<FrcE6^gqK>~LO?cW)l;K^f(d zb6d4>Xp~tay3X>v&2?{H9HlJ97>}?fmN9#6TD=hJC}k<ec<`alY$C1hg*r-EiZPxS zP-ph0w0a5DQOZ(`@sxo&v$v+zOQDWZmST)&6V#c#JFR{$)KSV(jPXQ+I<xnu)qPM$ zDN8ZNa}esx{*$F1FTXc$8%kM<F`k}KXZE4A`b4Osl%*KsnG1DhdEyQg@ySp}DYGW? z6KPjfs6#1BF~*Y{u9$r~tv(&<C}k<ec-}*u+25wsXFwgLEX5da5>RLML|T0|)KSV( zjPce2b#oI>uXQ}gM*o<aQttW&{B?>JdOU;{r+EK*{88PKAGYBvAGP5uzhuM1Dtz9! z*gwm>IWf*MZy$`a%o_sZEc1+KoMoQcjI+#hm~obQvNFyx&q~Hw=IO^c%RJ8*XPM_6 z<1F)JVw`23HH@>&(}QuAc}g%Y2Q_2$W%I#4UU?#ZOjx@{9vz_13Tv0gV*~UBk#iUW z`m)G5kOBRj$T^e&JuY$%W<XyTIfpZ#Cq&Kx4d^=}=a2^Ul*l=#0sT<q9M*uI7S_Ii z#{uYHMb4oO=*?Qr!42pxE$8qC^wxn+jc9PzsdKeWisHP7*)9c{ml!PFlvd0b+%vJX zL1Vc_QFv$erxvt^*+&&*HptRDmSR1#MOF-Jn5Cy)XfbVBnweH)cCiK3Gh1&#YfL9+ zU8``ew!*4o_FpV$6|>w43ac)~68A$Bb<E<a6S?5hl3DJAY0DD#1B%RYKj4npbeC3r zmCmfUB45rd$4ad)A0YDO963i}Dze0ZXkt0D9FwVd*09V<6%<E=YYk=}vEp6JY-YSG z28eeB$BV~t<bn%5W;wSM*@_fP+!ZJ?%Uz*6Rmu(b3R+*GORS>ezryNA1G5iX&`M@A zyVhWJ?N^p!1G6tEi2BixV(GQCBD0(eQ;{XNm6?^yaxP3omN*@_A;s)M%eH}8&X8%# zQaWF`cgAFP>QuNtP*fK#Uy4KI<|Jr$DM8L~F10&G^z4?q3y4|n>lu4)Z~d%y=kP|h z>JCrgjM>aR#T4RzcxL`BlQcJ=v(88ki1%LDdoY_0XcY&<JEgy6|CAfhS$9Sp5Fa5j z4i@Qv)^I?)<Hy}0W;2JZet^w*O>RJE+~GIbW+6^=x#eNjRA0s|^0b6jZW}pg$eJUm zyfdYXb^C<1pC9viGM@)C<?~;rd>(8+pR%9#@);GMLowy^TBdwH%aqS!nezE7Q$BBH z%IB+0`8<^=pPw@2^HQdK9>kQ-Lz(jVCsRHTJySk8uYaem7dWqW`k<=kJlp9Ls-E+1 zr_ZZ;`*`rUTw%LD;qhT=zwGDnVrsv%=ka4|zn16mWSUUz^SIin{c4@Zo9V5}p2yuz z?^g9Z5A4)_0nYP-sr`zZ=L=K&B{t6=rjM!ic^=uR{kodx7t^PeJ<l^cwO={&{9}4T z*`H}X^6rlJZS;ZwEnh~RYWIW3e&zDtrFc$OE@z@us-9^;$@U$c=_S3Umsn`w+uiHb z4OqT~Y}TgNFDw1yin4x8*`+m2j{kaQryJE@tTrpURZ+YBS!Es1(em$_WGd>ozqw9r z*x9%)_78~X34XsXTi+1;o?JHW6#RZ&Hl8nBDlyr(%X*(L8^^00-b}>gbum=<2E+@j z-^Iza(g*lm4yxD1Fd=-InkKIcx9|>#dql&4xYzo9icD`h{TPLMk1`t{F8KE-vhiXu z(EENm-h$-ct;p8L`wD?f#N>4`QpnFd+NyNx?aAy4-FiFHj*rR)l%$K%XTbSw((Gzo zeo-hJBS{zM<$@BIU);&6!(S9|S^Qpq76<`Ptz$Oljyt{7LwK)ko{UpC4Nc~983ZjO zZ`2+w3sCURLC!eR`*Y+!VDqy@>gUdf`+yG=|9<6%A6(}<_h;(wKTH1}5h?>?TL$v~ z@6gfk%QW`+_DhN9&bQ~K&)oU{hSVRCGq2uLxP2bxqXYCiIrbOYN+m8E$y!|m+?R!z z!b0W8{<=|}#B+ad=W9ye{_@sFh1=hm?2>qH!%5%+#q-TG;Qs=AfFTiA03S|oA=~C5 zy?sadvA>}xn&OGhL>IoO+9c9H_!CKNiZtP=nrJ6}AE-GN+0Y(a-`E~$PQ>D!k;blV zqA9j%b9*!qZN_i#45&dr1Jo92jK>?d<JqS~oPOx1aZ@zX+_h=bc9>*H^7nzVRQahX z#KdewK1URZEL;&>S{<prB1FGc6lv~^MOyK_GCY4330-|faB0l~pm@M3QXN*R;m`^| z_yr?2T2y=G{9tY5%7qJ8R@X)9g7a&uBk5-NIW78GqCg<?M}^Mzn@Coa@=+t%_q0oX zo-6&pQImWK%;w(qJ52NoOkd$wma?5#ama_OL`CQJO^L?!pozFiTbb*KC88A@I=U*> zceS-QPibowQfh7NY!wyF+dE)s(nQ>>*%FO+w#7QKgb3>5(e_3%P~2ubq*WoaP?3mk z122D1sv;h1ZcH?aifF4E`POFGvSeDAQ^2%fo~)<|IFR8qZfa{n2r)RuszSE5zOz$Q zU_x%fJcCkneb)w<H+F2m>{Vi0M+@1TRqNNsqgz<QD??G{ksD^|r>c~`@|3&D{+AFs zV$r#kLs|3r64P><S9N}Cp%vip3APy9uTu=ufYMaw(bfyu>|h2MybWfxzhBuirB_#J zp>~Po7rODrnOp)`lW%UH&(oN`D7Dfn<<0`a;OH9&Y|rO&O!@l{96#$Zt%p5*Q-NhZ z?_=syE!pE&uxJKDb!^Y)hfKe(6uEtS|2vfZe5J?Vg<!fb!yac#Ir-ZLjB;X~pYwiN zQTv$=#hSTvLddk|^HQdpGnK*H+~c{GY<vD)N2U?(u=2z9>~@#Up1<?K6i1${#UB4{ z${z3Hnu{-++S_B9>D^GL{`2^Gl|9pta>vBp{(e+s+VlA}(^FKLvDnffeuz3c*W>xY z-!<XiOSJ2=%=8i1dNS;-^L5&=v9O*grDetsqJl!?_W3-^^(FS~?-?*O_t>7#|M~YU zpH=<mym7mn|CeE#**;$<9IrH6@R`I~vpv&SQIlye0!p>Yq+um8VLPU8qJnsipRYT@ z%AWPuUUi2>@isWZl)8npz3PUAvpv%fmA$2)n61j8-7nj*KHgxI?X%4Ed&=-NYsX;L z*zG-Muuswj1(xHyVVGi0Tj!m@zHOFi@H4u=$yn^|Pg3^weqOl9H2TnHz#`M>%08nB z$&Riukq7YpbLPT!jLkcP{p0IQ4gS+C>)Y)~wxvj_`dUnjXVv`zA4ES2&nG_q(f*C+ f9$0HRwb5jMXKT<V%FDok?2m0S?U&jNY@+x-Guol- literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py new file mode 100644 index 0000000..94d02e7 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py @@ -0,0 +1,293 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Ciphertext Block Chaining (CBC) mode. +""" + +__all__ = ['CbcMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_cbc_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cbc", """ + int CBC_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + void **pResult); + int CBC_encrypt(void *cbcState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CBC_decrypt(void *cbcState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CBC_stop_operation(void *state); + """ + ) + + +class CbcMode(object): + """*Cipher-Block Chaining (CBC)*. + + Each of the ciphertext blocks depends on the current + and all previous plaintext blocks. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.2 . + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv): + """Create a new block cipher, configured in CBC mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be unpredictable**. Ideally it is picked randomly. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + """ + + self._state = VoidPointer() + result = raw_cbc_lib.CBC_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the CBC mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_cbc_lib.CBC_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + That also means that you cannot reuse an object for encrypting + or decrypting other data with the same key. + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + Its lenght must be multiple of the cipher block size. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cbc_lib.CBC_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 3: + raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) + raise ValueError("Error %d while encrypting in CBC mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + Its length must be multiple of the cipher block size. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cbc_lib.CBC_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 3: + raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) + raise ValueError("Error %d while decrypting in CBC mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_cbc_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CBC encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for CBC. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + if kwargs: + raise TypeError("Unknown parameters for CBC: %s" % str(kwargs)) + + return CbcMode(cipher_state, iv) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi new file mode 100644 index 0000000..526632e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi @@ -0,0 +1,25 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CbcMode'] + +class CbcMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py new file mode 100644 index 0000000..ec2e4f4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py @@ -0,0 +1,650 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Counter with CBC-MAC (CCM) mode. +""" + +__all__ = ['CcmMode'] + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import (byte_string, bord, + _copy_bytes) +from Cryptodome.Util._raw_api import is_writeable_buffer + +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + + +def enum(**enums): + return type('Enum', (), enums) + +MacStatus = enum(NOT_STARTED=0, PROCESSING_AUTH_DATA=1, PROCESSING_PLAINTEXT=2) + + +class CcmMode(object): + """Counter with CBC-MAC (CCM). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + This mode requires a nonce. The nonce shall never repeat for two + different messages encrypted with the same key, but it does not need + to be random. + Note that there is a trade-off between the size of the nonce and the + maximum size of a single message you can encrypt. + + It is important to use a large nonce if the key is reused across several + messages and the nonce is chosen randomly. + + It is acceptable to us a short nonce if the key is only used a few times or + if the nonce is taken from a counter. + + The following table shows the trade-off when the nonce is chosen at + random. The column on the left shows how many messages it takes + for the keystream to repeat **on average**. In practice, you will want to + stop using the key way before that. + + +--------------------+---------------+-------------------+ + | Avg. # of messages | nonce | Max. message | + | before keystream | size | size | + | repeats | (bytes) | (bytes) | + +====================+===============+===================+ + | 2^52 | 13 | 64K | + +--------------------+---------------+-------------------+ + | 2^48 | 12 | 16M | + +--------------------+---------------+-------------------+ + | 2^44 | 11 | 4G | + +--------------------+---------------+-------------------+ + | 2^40 | 10 | 1T | + +--------------------+---------------+-------------------+ + | 2^36 | 9 | 64P | + +--------------------+---------------+-------------------+ + | 2^32 | 8 | 16E | + +--------------------+---------------+-------------------+ + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g. AES but not TDES). + + See `NIST SP800-38C`_ or RFC3610_. + + .. _`NIST SP800-38C`: http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf + .. _RFC3610: https://tools.ietf.org/html/rfc3610 + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, msg_len, assoc_len, + cipher_params): + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """The nonce used for this cipher instance""" + + self._factory = factory + self._key = _copy_bytes(None, None, key) + self._mac_len = mac_len + self._msg_len = msg_len + self._assoc_len = assoc_len + self._cipher_params = cipher_params + + self._mac_tag = None # Cache for MAC tag + + if self.block_size != 16: + raise ValueError("CCM mode is only available for ciphers" + " that operate on 128 bits blocks") + + # MAC tag length (Tlen) + if mac_len not in (4, 6, 8, 10, 12, 14, 16): + raise ValueError("Parameter 'mac_len' must be even" + " and in the range 4..16 (not %d)" % mac_len) + + # Nonce value + if not (nonce and 7 <= len(nonce) <= 13): + raise ValueError("Length of parameter 'nonce' must be" + " in the range 7..13 bytes") + + # Create MAC object (the tag will be the last block + # bytes worth of ciphertext) + self._mac = self._factory.new(key, + factory.MODE_CBC, + iv=b'\x00' * 16, + **cipher_params) + self._mac_status = MacStatus.NOT_STARTED + self._t = None + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # Cumulative lengths + self._cumul_assoc_len = 0 + self._cumul_msg_len = 0 + + # Cache for unaligned associated data/plaintext. + # This is a list with byte strings, but when the MAC starts, + # it will become a binary string no longer than the block size. + self._cache = [] + + # Start CTR cipher, by formatting the counter (A.3) + q = 15 - len(nonce) # length of Q, the encoded message length + self._cipher = self._factory.new(key, + self._factory.MODE_CTR, + nonce=struct.pack("B", q - 1) + self.nonce, + **cipher_params) + + # S_0, step 6 in 6.1 for j=0 + self._s_0 = self._cipher.encrypt(b'\x00' * 16) + + # Try to start the MAC + if None not in (assoc_len, msg_len): + self._start_mac() + + def _start_mac(self): + + assert(self._mac_status == MacStatus.NOT_STARTED) + assert(None not in (self._assoc_len, self._msg_len)) + assert(isinstance(self._cache, list)) + + # Formatting control information and nonce (A.2.1) + q = 15 - len(self.nonce) # length of Q, the encoded message length + flags = (64 * (self._assoc_len > 0) + 8 * ((self._mac_len - 2) // 2) + + (q - 1)) + b_0 = struct.pack("B", flags) + self.nonce + long_to_bytes(self._msg_len, q) + + # Formatting associated data (A.2.2) + # Encoded 'a' is concatenated with the associated data 'A' + assoc_len_encoded = b'' + if self._assoc_len > 0: + if self._assoc_len < (2 ** 16 - 2 ** 8): + enc_size = 2 + elif self._assoc_len < (2 ** 32): + assoc_len_encoded = b'\xFF\xFE' + enc_size = 4 + else: + assoc_len_encoded = b'\xFF\xFF' + enc_size = 8 + assoc_len_encoded += long_to_bytes(self._assoc_len, enc_size) + + # b_0 and assoc_len_encoded must be processed first + self._cache.insert(0, b_0) + self._cache.insert(1, assoc_len_encoded) + + # Process all the data cached so far + first_data_to_mac = b"".join(self._cache) + self._cache = b"" + self._mac_status = MacStatus.PROCESSING_AUTH_DATA + self._update(first_data_to_mac) + + def _pad_cache_and_update(self): + + assert(self._mac_status != MacStatus.NOT_STARTED) + assert(len(self._cache) < self.block_size) + + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + len_cache = len(self._cache) + if len_cache > 0: + self._update(b'\x00' * (self.block_size - len_cache)) + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + In CCM, the *associated data* is also called + *additional authenticated data* (AAD). + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._cumul_assoc_len += len(assoc_data) + if self._assoc_len is not None and \ + self._cumul_assoc_len > self._assoc_len: + raise ValueError("Associated data is too long") + + self._update(assoc_data) + return self + + def _update(self, assoc_data_pt=b""): + """Update the MAC with associated data or plaintext + (without FSM checks)""" + + # If MAC has not started yet, we just park the data into a list. + # If the data is mutable, we create a copy and store that instead. + if self._mac_status == MacStatus.NOT_STARTED: + if is_writeable_buffer(assoc_data_pt): + assoc_data_pt = _copy_bytes(None, None, assoc_data_pt) + self._cache.append(assoc_data_pt) + return + + assert(len(self._cache) < self.block_size) + + if len(self._cache) > 0: + filler = min(self.block_size - len(self._cache), + len(assoc_data_pt)) + self._cache += _copy_bytes(None, filler, assoc_data_pt) + assoc_data_pt = _copy_bytes(filler, None, assoc_data_pt) + + if len(self._cache) < self.block_size: + return + + # The cache is exactly one block + self._t = self._mac.encrypt(self._cache) + self._cache = b"" + + update_len = len(assoc_data_pt) // self.block_size * self.block_size + self._cache = _copy_bytes(update_len, None, assoc_data_pt) + if update_len > 0: + self._t = self._mac.encrypt(assoc_data_pt[:update_len])[-16:] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + This method can be called only **once** if ``msg_len`` was + not passed at initialization. + + If ``msg_len`` was given, the data to encrypt can be broken + up in two or more pieces and `encrypt` can be called + multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of plaintext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(plaintext) + self._start_mac() + self._next = ["digest"] + + self._cumul_msg_len += len(plaintext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + self._update(plaintext) + return self._cipher.encrypt(plaintext, output=output) + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + This method can be called only **once** if ``msg_len`` was + not passed at initialization. + + If ``msg_len`` was given, the data to decrypt can be + broken up in two or more pieces and `decrypt` can be + called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of ciphertext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(ciphertext) + self._start_mac() + self._next = ["verify"] + + self._cumul_msg_len += len(ciphertext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + # Encrypt is equivalent to decrypt with the CTR mode + plaintext = self._cipher.encrypt(ciphertext, output=output) + if output is None: + self._update(plaintext) + else: + self._update(output) + return plaintext + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + return self._digest() + + def _digest(self): + if self._mac_tag: + return self._mac_tag + + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + if self._msg_len is None: + self._msg_len = 0 + self._start_mac() + + if self._cumul_msg_len != self._msg_len: + raise ValueError("Message is too short") + + # Both associated data and payload are concatenated with the least + # number of zero bytes (possibly none) that align it to the + # 16 byte boundary (A.2.2 and A.2.3) + self._pad_cache_and_update() + + # Step 8 in 6.1 (T xor MSB_Tlen(S_0)) + self._mac_tag = strxor(self._t, self._s_0)[:self._mac_len] + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + self._digest() + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return plaintext + + +def _create_ccm_cipher(factory, **kwargs): + """Create a new block cipher, configured in CCM mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` (like + `Cryptodome.Cipher.AES`). + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + + Its length must be in the range ``[7..13]``. + 11 or 12 bytes are reasonable values in general. Bear in + mind that with CCM there is a trade-off between nonce length and + maximum message size. + + If not specified, a 11 byte long random string is used. + + mac_len : integer + Length of the MAC, in bytes. It must be even and in + the range ``[4..16]``. The default is 16. + + msg_len : integer + Length of the message to (de)cipher. + If not specified, ``encrypt`` or ``decrypt`` may only be called once. + + assoc_len : integer + Length of the associated data. + If not specified, all data is internally buffered. + """ + + try: + key = key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + nonce = kwargs.pop("nonce", None) # N + if nonce is None: + nonce = get_random_bytes(11) + mac_len = kwargs.pop("mac_len", factory.block_size) + msg_len = kwargs.pop("msg_len", None) # p + assoc_len = kwargs.pop("assoc_len", None) # a + cipher_params = dict(kwargs) + + return CcmMode(factory, key, nonce, mac_len, msg_len, + assoc_len, cipher_params) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi new file mode 100644 index 0000000..4b9f620 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi @@ -0,0 +1,47 @@ +from types import ModuleType +from typing import Union, overload, Dict, Tuple, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CcmMode'] + +class CcmMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + msg_len: int, + assoc_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> CcmMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py new file mode 100644 index 0000000..1b1b6c3 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_cfb.py : CFB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +""" +Counter Feedback (CFB) mode. +""" + +__all__ = ['CfbMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_cfb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cfb",""" + int CFB_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + size_t segment_len, /* In bytes */ + void **pResult); + int CFB_encrypt(void *cfbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CFB_decrypt(void *cfbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CFB_stop_operation(void *state);""" + ) + + +class CfbMode(object): + """*Cipher FeedBack (CFB)*. + + This mode is similar to CFB, but it transforms + the underlying block cipher into a stream cipher. + + Plaintext and ciphertext are processed in *segments* + of **s** bits. The mode is therefore sometimes + labelled **s**-bit CFB. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.3. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv, segment_size): + """Create a new block cipher, configured in CFB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be unpredictable**. Ideally it is picked randomly. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + + segment_size : integer + The number of bytes the plaintext and ciphertext are segmented in. + """ + + self._state = VoidPointer() + result = raw_cfb_lib.CFB_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + c_size_t(segment_size), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the CFB mode" % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_cfb_lib.CFB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cfb_lib.CFB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting in CFB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cfb_lib.CFB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + raise ValueError("Error %d while decrypting in CFB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_cfb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CFB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for CFB. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + segment_size : integer + The number of bit the plaintext and ciphertext are segmented in. + If not present, the default is 8. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + segment_size_bytes, rem = divmod(kwargs.pop("segment_size", 8), 8) + if segment_size_bytes == 0 or rem != 0: + raise ValueError("'segment_size' must be positive and multiple of 8 bits") + + if kwargs: + raise TypeError("Unknown parameters for CFB: %s" % str(kwargs)) + return CfbMode(cipher_state, iv, segment_size_bytes) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi new file mode 100644 index 0000000..228e464 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi @@ -0,0 +1,26 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CfbMode'] + + +class CfbMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer, + segment_size: int) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py new file mode 100644 index 0000000..9ce357f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ctr.py : CTR mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +""" +Counter (CTR) mode. +""" + +__all__ = ['CtrMode'] + +import struct + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.py3compat import _copy_bytes, is_native_int +from Cryptodome.Util.number import long_to_bytes + +raw_ctr_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ctr", """ + int CTR_start_operation(void *cipher, + uint8_t initialCounterBlock[], + size_t initialCounterBlock_len, + size_t prefix_len, + unsigned counter_len, + unsigned littleEndian, + void **pResult); + int CTR_encrypt(void *ctrState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CTR_decrypt(void *ctrState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CTR_stop_operation(void *ctrState);""" + ) + + +class CtrMode(object): + """*CounTeR (CTR)* mode. + + This mode is very similar to ECB, in that + encryption of one block is done independently of all other blocks. + + Unlike ECB, the block *position* contributes to the encryption + and no information leaks about symbol frequency. + + Each message block is associated to a *counter* which + must be unique across all messages that get encrypted + with the same key (not just within the same message). + The counter is as big as the block size. + + Counters can be generated in several ways. The most + straightword one is to choose an *initial counter block* + (which can be made public, similarly to the *IV* for the + other modes) and increment its lowest **m** bits by one + (modulo *2^m*) for each block. In most cases, **m** is + chosen to be half the block size. + + See `NIST SP800-38A`_, Section 6.5 (for the mode) and + Appendix B (for how to manage the *initial counter block*). + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, initial_counter_block, + prefix_len, counter_len, little_endian): + """Create a new block cipher, configured in CTR mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + initial_counter_block : bytes/bytearray/memoryview + The initial plaintext to use to generate the key stream. + + It is as large as the cipher block, and it embeds + the initial value of the counter. + + This value must not be reused. + It shall contain a nonce or a random component. + Reusing the *initial counter block* for encryptions + performed with the same key compromises confidentiality. + + prefix_len : integer + The amount of bytes at the beginning of the counter block + that never change. + + counter_len : integer + The length in bytes of the counter embedded in the counter + block. + + little_endian : boolean + True if the counter in the counter block is an integer encoded + in little endian mode. If False, it is big endian. + """ + + if len(initial_counter_block) == prefix_len + counter_len: + self.nonce = _copy_bytes(None, prefix_len, initial_counter_block) + """Nonce; not available if there is a fixed suffix""" + + self._state = VoidPointer() + result = raw_ctr_lib.CTR_start_operation(block_cipher.get(), + c_uint8_ptr(initial_counter_block), + c_size_t(len(initial_counter_block)), + c_size_t(prefix_len), + counter_len, + little_endian, + self._state.address_of()) + if result: + raise ValueError("Error %X while instantiating the CTR mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_ctr_lib.CTR_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(initial_counter_block) + """The block size of the underlying cipher, in bytes.""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ctr_lib.CTR_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 0x60002: + raise OverflowError("The counter has wrapped around in" + " CTR mode") + raise ValueError("Error %X while encrypting in CTR mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ctr_lib.CTR_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 0x60002: + raise OverflowError("The counter has wrapped around in" + " CTR mode") + raise ValueError("Error %X while decrypting in CTR mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ctr_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CTR encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + nonce : bytes/bytearray/memoryview + The fixed part at the beginning of the counter block - the rest is + the counter number that gets increased when processing the next block. + The nonce must be such that no two messages are encrypted under the + same key and the same nonce. + + The nonce must be shorter than the block size (it can have + zero length; the counter is then as long as the block). + + If this parameter is not present, a random nonce will be created with + length equal to half the block size. No random nonce shorter than + 64 bits will be created though - you must really think through all + security consequences of using such a short block size. + + initial_value : posive integer or bytes/bytearray/memoryview + The initial value for the counter. If not present, the cipher will + start counting from 0. The value is incremented by one for each block. + The counter number is encoded in big endian mode. + + counter : object + Instance of ``Cryptodome.Util.Counter``, which allows full customization + of the counter block. This parameter is incompatible to both ``nonce`` + and ``initial_value``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + + counter = kwargs.pop("counter", None) + nonce = kwargs.pop("nonce", None) + initial_value = kwargs.pop("initial_value", None) + if kwargs: + raise TypeError("Invalid parameters for CTR mode: %s" % str(kwargs)) + + if counter is not None and (nonce, initial_value) != (None, None): + raise TypeError("'counter' and 'nonce'/'initial_value'" + " are mutually exclusive") + + if counter is None: + # Cryptodome.Util.Counter is not used + if nonce is None: + if factory.block_size < 16: + raise TypeError("Impossible to create a safe nonce for short" + " block sizes") + nonce = get_random_bytes(factory.block_size // 2) + else: + if len(nonce) >= factory.block_size: + raise ValueError("Nonce is too long") + + # What is not nonce is counter + counter_len = factory.block_size - len(nonce) + + if initial_value is None: + initial_value = 0 + + if is_native_int(initial_value): + if (1 << (counter_len * 8)) - 1 < initial_value: + raise ValueError("Initial counter value is too large") + initial_counter_block = nonce + long_to_bytes(initial_value, counter_len) + else: + if len(initial_value) != counter_len: + raise ValueError("Incorrect length for counter byte string (%d bytes, expected %d)" % + (len(initial_value), counter_len)) + initial_counter_block = nonce + initial_value + + return CtrMode(cipher_state, + initial_counter_block, + len(nonce), # prefix + counter_len, + False) # little_endian + + # Cryptodome.Util.Counter is used + + # 'counter' used to be a callable object, but now it is + # just a dictionary for backward compatibility. + _counter = dict(counter) + try: + counter_len = _counter.pop("counter_len") + prefix = _counter.pop("prefix") + suffix = _counter.pop("suffix") + initial_value = _counter.pop("initial_value") + little_endian = _counter.pop("little_endian") + except KeyError: + raise TypeError("Incorrect counter object" + " (use Cryptodome.Util.Counter.new)") + + # Compute initial counter block + words = [] + while initial_value > 0: + words.append(struct.pack('B', initial_value & 255)) + initial_value >>= 8 + words += [b'\x00'] * max(0, counter_len - len(words)) + if not little_endian: + words.reverse() + initial_counter_block = prefix + b"".join(words) + suffix + + if len(initial_counter_block) != factory.block_size: + raise ValueError("Size of the counter block (%d bytes) must match" + " block size (%d)" % (len(initial_counter_block), + factory.block_size)) + + return CtrMode(cipher_state, initial_counter_block, + len(prefix), counter_len, little_endian) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi new file mode 100644 index 0000000..a68a890 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi @@ -0,0 +1,27 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CtrMode'] + +class CtrMode(object): + block_size: int + nonce: bytes + + def __init__(self, + block_cipher: SmartPointer, + initial_counter_block: Buffer, + prefix_len: int, + counter_len: int, + little_endian: bool) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py new file mode 100644 index 0000000..44ef21f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py @@ -0,0 +1,408 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +EAX mode. +""" + +__all__ = ['EaxMode'] + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import byte_string, bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Hash import CMAC, BLAKE2s +from Cryptodome.Random import get_random_bytes + + +class EaxMode(object): + """*EAX* mode. + + This is an Authenticated Encryption with Associated Data + (`AEAD`_) mode. It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, + and it will still be subject to authentication. + + The decryption step tells the receiver if the message comes + from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - + including the header - has been modified or corrupted. + + This mode requires a *nonce*. + + This mode is only available for ciphers that operate on 64 or + 128 bits blocks. + + There are no official standards defining EAX. + The implementation is based on `a proposal`__ that + was presented to NIST. + + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + .. __: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/eax/eax-spec.pdf + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, cipher_params): + """EAX cipher mode""" + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """The nonce originally used to create the object.""" + + self._mac_len = mac_len + self._mac_tag = None # Cache for MAC tag + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # MAC tag length + if not (2 <= self._mac_len <= self.block_size): + raise ValueError("'mac_len' must be at least 2 and not larger than %d" + % self.block_size) + + # Nonce cannot be empty and must be a byte string + if len(self.nonce) == 0: + raise ValueError("Nonce cannot be empty in EAX mode") + if not is_buffer(nonce): + raise TypeError("nonce must be bytes, bytearray or memoryview") + + self._omac = [ + CMAC.new(key, + b'\x00' * (self.block_size - 1) + struct.pack('B', i), + ciphermod=factory, + cipher_params=cipher_params) + for i in range(0, 3) + ] + + # Compute MAC of nonce + self._omac[0].update(self.nonce) + self._signer = self._omac[1] + + # MAC of the nonce is also the initial counter for CTR encryption + counter_int = bytes_to_long(self._omac[0].digest()) + self._cipher = factory.new(key, + factory.MODE_CTR, + initial_value=counter_int, + nonce=b"", + **cipher_params) + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._signer.update(assoc_data) + return self + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + ct = self._cipher.encrypt(plaintext, output=output) + if output is None: + self._omac[2].update(ct) + else: + self._omac[2].update(output) + return ct + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + self._omac[2].update(ciphertext) + return self._cipher.decrypt(ciphertext, output=output) + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + + if not self._mac_tag: + tag = b'\x00' * self.block_size + for i in range(3): + tag = strxor(tag, self._omac[i].digest()) + self._mac_tag = tag[:self._mac_len] + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + if not self._mac_tag: + tag = b'\x00' * self.block_size + for i in range(3): + tag = strxor(tag, self._omac[i].digest()) + self._mac_tag = tag[:self._mac_len] + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + pt = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return pt + + +def _create_eax_cipher(factory, **kwargs): + """Create a new block cipher, configured in EAX mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` (like + `Cryptodome.Cipher.AES`). + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + There are no restrictions on its length, but it is recommended to use + at least 16 bytes. + + The nonce shall never repeat for two different messages encrypted with + the same key, but it does not need to be random. + + If not specified, a 16 byte long random string is used. + + mac_len : integer + Length of the MAC, in bytes. It must be no larger than the cipher + block bytes (which is the default). + """ + + try: + key = kwargs.pop("key") + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(16) + mac_len = kwargs.pop("mac_len", factory.block_size) + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + return EaxMode(factory, key, nonce, mac_len, kwargs) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi new file mode 100644 index 0000000..cbfa467 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi @@ -0,0 +1,45 @@ +from types import ModuleType +from typing import Any, Union, Tuple, Dict, overload, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['EaxMode'] + +class EaxMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> EaxMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py new file mode 100644 index 0000000..a01a16f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ecb.py : ECB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +""" +Electronic Code Book (ECB) mode. +""" + +__all__ = [ 'EcbMode' ] + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, create_string_buffer, + get_raw_buffer, SmartPointer, + c_size_t, c_uint8_ptr, + is_writeable_buffer) + +raw_ecb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ecb", """ + int ECB_start_operation(void *cipher, + void **pResult); + int ECB_encrypt(void *ecbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ECB_decrypt(void *ecbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ECB_stop_operation(void *state); + """ + ) + + +class EcbMode(object): + """*Electronic Code Book (ECB)*. + + This is the simplest encryption mode. Each of the plaintext blocks + is directly encrypted into a ciphertext block, independently of + any other block. + + This mode is dangerous because it exposes frequency of symbols + in your plaintext. Other modes (e.g. *CBC*) should be used instead. + + See `NIST SP800-38A`_ , Section 6.1. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher): + """Create a new block cipher, configured in ECB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + """ + self.block_size = block_cipher.block_size + + self._state = VoidPointer() + result = raw_ecb_lib.ECB_start_operation(block_cipher.get(), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the ECB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher + # mode + self._state = SmartPointer(self._state.get(), + raw_ecb_lib.ECB_stop_operation) + + # Memory allocated for the underlying block cipher is now owned + # by the cipher mode + block_cipher.release() + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key set at initialization. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + The length must be multiple of the cipher block length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ecb_lib.ECB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 3: + raise ValueError("Data must be aligned to block boundary in ECB mode") + raise ValueError("Error %d while encrypting in ECB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key set at initialization. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + The length must be multiple of the cipher block length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ecb_lib.ECB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 3: + raise ValueError("Data must be aligned to block boundary in ECB mode") + raise ValueError("Error %d while decrypting in ECB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ecb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs ECB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + All keywords are passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present""" + + cipher_state = factory._create_base_cipher(kwargs) + cipher_state.block_size = factory.block_size + if kwargs: + raise TypeError("Unknown parameters for ECB: %s" % str(kwargs)) + return EcbMode(cipher_state) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi new file mode 100644 index 0000000..936195f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi @@ -0,0 +1,19 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = [ 'EcbMode' ] + +class EcbMode(object): + def __init__(self, block_cipher: SmartPointer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py new file mode 100644 index 0000000..9914400 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py @@ -0,0 +1,620 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Galois/Counter Mode (GCM). +""" + +__all__ = ['GcmMode'] + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr) + +from Cryptodome.Util import _cpu_features + + +# C API by module implementing GHASH +_ghash_api_template = """ + int ghash_%imp%(uint8_t y_out[16], + const uint8_t block_data[], + size_t len, + const uint8_t y_in[16], + const void *exp_key); + int ghash_expand_%imp%(const uint8_t h[16], + void **ghash_tables); + int ghash_destroy_%imp%(void *ghash_tables); +""" + +def _build_impl(lib, postfix): + from collections import namedtuple + + funcs = ( "ghash", "ghash_expand", "ghash_destroy" ) + GHASH_Imp = namedtuple('_GHash_Imp', funcs) + try: + imp_funcs = [ getattr(lib, x + "_" + postfix) for x in funcs ] + except AttributeError: # Make sphinx stop complaining with its mocklib + imp_funcs = [ None ] * 3 + params = dict(zip(funcs, imp_funcs)) + return GHASH_Imp(**params) + + +def _get_ghash_portable(): + api = _ghash_api_template.replace("%imp%", "portable") + lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_portable", api) + result = _build_impl(lib, "portable") + return result +_ghash_portable = _get_ghash_portable() + + +def _get_ghash_clmul(): + """Return None if CLMUL implementation is not available""" + + if not _cpu_features.have_clmul(): + return None + try: + api = _ghash_api_template.replace("%imp%", "clmul") + lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_clmul", api) + result = _build_impl(lib, "clmul") + except OSError: + result = None + return result +_ghash_clmul = _get_ghash_clmul() + + +class _GHASH(object): + """GHASH function defined in NIST SP 800-38D, Algorithm 2. + + If X_1, X_2, .. X_m are the blocks of input data, the function + computes: + + X_1*H^{m} + X_2*H^{m-1} + ... + X_m*H + + in the Galois field GF(2^256) using the reducing polynomial + (x^128 + x^7 + x^2 + x + 1). + """ + + def __init__(self, subkey, ghash_c): + assert len(subkey) == 16 + + self.ghash_c = ghash_c + + self._exp_key = VoidPointer() + result = ghash_c.ghash_expand(c_uint8_ptr(subkey), + self._exp_key.address_of()) + if result: + raise ValueError("Error %d while expanding the GHASH key" % result) + + self._exp_key = SmartPointer(self._exp_key.get(), + ghash_c.ghash_destroy) + + # create_string_buffer always returns a string of zeroes + self._last_y = create_string_buffer(16) + + def update(self, block_data): + assert len(block_data) % 16 == 0 + + result = self.ghash_c.ghash(self._last_y, + c_uint8_ptr(block_data), + c_size_t(len(block_data)), + self._last_y, + self._exp_key.get()) + if result: + raise ValueError("Error %d while updating GHASH" % result) + + return self + + def digest(self): + return get_raw_buffer(self._last_y) + + +def enum(**enums): + return type('Enum', (), enums) + + +MacStatus = enum(PROCESSING_AUTH_DATA=1, PROCESSING_CIPHERTEXT=2) + + +class GcmMode(object): + """Galois Counter Mode (GCM). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + This mode requires a *nonce*. + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g. AES but not TDES). + + See `NIST SP800-38D`_. + + .. _`NIST SP800-38D`: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, cipher_params, ghash_c): + + self.block_size = factory.block_size + if self.block_size != 16: + raise ValueError("GCM mode is only available for ciphers" + " that operate on 128 bits blocks") + + if len(nonce) == 0: + raise ValueError("Nonce cannot be empty") + + if not is_buffer(nonce): + raise TypeError("Nonce must be bytes, bytearray or memoryview") + + # See NIST SP 800 38D, 5.2.1.1 + if len(nonce) > 2**64 - 1: + raise ValueError("Nonce exceeds maximum length") + + + self.nonce = _copy_bytes(None, None, nonce) + """Nonce""" + + self._factory = factory + self._key = _copy_bytes(None, None, key) + self._tag = None # Cache for MAC tag + + self._mac_len = mac_len + if not (4 <= mac_len <= 16): + raise ValueError("Parameter 'mac_len' must be in the range 4..16") + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._no_more_assoc_data = False + + # Length of associated data + self._auth_len = 0 + + # Length of the ciphertext or plaintext + self._msg_len = 0 + + # Step 1 in SP800-38D, Algorithm 4 (encryption) - Compute H + # See also Algorithm 5 (decryption) + hash_subkey = factory.new(key, + self._factory.MODE_ECB, + **cipher_params + ).encrypt(b'\x00' * 16) + + # Step 2 - Compute J0 + if len(self.nonce) == 12: + j0 = self.nonce + b"\x00\x00\x00\x01" + else: + fill = (16 - (len(self.nonce) % 16)) % 16 + 8 + ghash_in = (self.nonce + + b'\x00' * fill + + long_to_bytes(8 * len(self.nonce), 8)) + j0 = _GHASH(hash_subkey, ghash_c).update(ghash_in).digest() + + # Step 3 - Prepare GCTR cipher for encryption/decryption + nonce_ctr = j0[:12] + iv_ctr = (bytes_to_long(j0) + 1) & 0xFFFFFFFF + self._cipher = factory.new(key, + self._factory.MODE_CTR, + initial_value=iv_ctr, + nonce=nonce_ctr, + **cipher_params) + + # Step 5 - Bootstrat GHASH + self._signer = _GHASH(hash_subkey, ghash_c) + + # Step 6 - Prepare GCTR cipher for GMAC + self._tag_cipher = factory.new(key, + self._factory.MODE_CTR, + initial_value=j0, + nonce=b"", + **cipher_params) + + # Cache for data to authenticate + self._cache = b"" + + self._status = MacStatus.PROCESSING_AUTH_DATA + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + In GCM, the *associated data* is also called + *additional authenticated data* (AAD). + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._update(assoc_data) + self._auth_len += len(assoc_data) + + # See NIST SP 800 38D, 5.2.1.1 + if self._auth_len > 2**64 - 1: + raise ValueError("Additional Authenticated Data exceeds maximum length") + + return self + + def _update(self, data): + assert(len(self._cache) < 16) + + if len(self._cache) > 0: + filler = min(16 - len(self._cache), len(data)) + self._cache += _copy_bytes(None, filler, data) + data = data[filler:] + + if len(self._cache) < 16: + return + + # The cache is exactly one block + self._signer.update(self._cache) + self._cache = b"" + + update_len = len(data) // 16 * 16 + self._cache = _copy_bytes(update_len, None, data) + if update_len > 0: + self._signer.update(data[:update_len]) + + def _pad_cache_and_update(self): + assert(len(self._cache) < 16) + + # The authenticated data A is concatenated to the minimum + # number of zero bytes (possibly none) such that the + # - ciphertext C is aligned to the 16 byte boundary. + # See step 5 in section 7.1 + # - ciphertext C is aligned to the 16 byte boundary. + # See step 6 in section 7.2 + len_cache = len(self._cache) + if len_cache > 0: + self._update(b'\x00' * (16 - len_cache)) + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + + ciphertext = self._cipher.encrypt(plaintext, output=output) + + if self._status == MacStatus.PROCESSING_AUTH_DATA: + self._pad_cache_and_update() + self._status = MacStatus.PROCESSING_CIPHERTEXT + + self._update(ciphertext if output is None else output) + self._msg_len += len(plaintext) + + # See NIST SP 800 38D, 5.2.1.1 + if self._msg_len > 2**39 - 256: + raise ValueError("Plaintext exceeds maximum length") + + return ciphertext + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + + if self._status == MacStatus.PROCESSING_AUTH_DATA: + self._pad_cache_and_update() + self._status = MacStatus.PROCESSING_CIPHERTEXT + + self._update(ciphertext) + self._msg_len += len(ciphertext) + + return self._cipher.decrypt(ciphertext, output=output) + + def digest(self): + """Compute the *binary* MAC tag in an AEAD mode. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + + return self._compute_mac() + + def _compute_mac(self): + """Compute MAC without any FSM checks.""" + + if self._tag: + return self._tag + + # Step 5 in NIST SP 800-38D, Algorithm 4 - Compute S + self._pad_cache_and_update() + self._update(long_to_bytes(8 * self._auth_len, 8)) + self._update(long_to_bytes(8 * self._msg_len, 8)) + s_tag = self._signer.digest() + + # Step 6 - Compute T + self._tag = self._tag_cipher.encrypt(s_tag)[:self._mac_len] + + return self._tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, + data=self._compute_mac()) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, + data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : byte string + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return plaintext + + +def _create_gcm_cipher(factory, **kwargs): + """Create a new block cipher, configured in Galois Counter Mode (GCM). + + :Parameters: + factory : module + A block cipher module, taken from `Cryptodome.Cipher`. + The cipher must have block length of 16 bytes. + GCM has been only defined for `Cryptodome.Cipher.AES`. + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + It must be 16 (e.g. *AES-128*), 24 (e.g. *AES-192*) + or 32 (e.g. *AES-256*) bytes long. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + + There are no restrictions on its length, + but it is recommended to use at least 16 bytes. + + The nonce shall never repeat for two + different messages encrypted with the same key, + but it does not need to be random. + + If not provided, a 16 byte nonce will be randomly created. + + mac_len : integer + Length of the MAC, in bytes. + It must be no larger than 16 bytes (which is the default). + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter:" + str(e)) + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(16) + mac_len = kwargs.pop("mac_len", 16) + + # Not documented - only used for testing + use_clmul = kwargs.pop("use_clmul", True) + if use_clmul and _ghash_clmul: + ghash_c = _ghash_clmul + else: + ghash_c = _ghash_portable + + return GcmMode(factory, key, nonce, mac_len, kwargs, ghash_c) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi new file mode 100644 index 0000000..8912955 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi @@ -0,0 +1,45 @@ +from types import ModuleType +from typing import Union, Tuple, Dict, overload, Optional + +__all__ = ['GcmMode'] + +Buffer = Union[bytes, bytearray, memoryview] + +class GcmMode(object): + block_size: int + nonce: Buffer + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> GcmMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py new file mode 100644 index 0000000..1295e61 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py @@ -0,0 +1,532 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Offset Codebook (OCB) mode. + +OCB is Authenticated Encryption with Associated Data (AEAD) cipher mode +designed by Prof. Phillip Rogaway and specified in `RFC7253`_. + +The algorithm provides both authenticity and privacy, it is very efficient, +it uses only one key and it can be used in online mode (so that encryption +or decryption can start before the end of the message is available). + +This module implements the third and last variant of OCB (OCB3) and it only +works in combination with a 128-bit block symmetric cipher, like AES. + +OCB is patented in US but `free licenses`_ exist for software implementations +meant for non-military purposes. + +Example: + >>> from Cryptodome.Cipher import AES + >>> from Cryptodome.Random import get_random_bytes + >>> + >>> key = get_random_bytes(32) + >>> cipher = AES.new(key, AES.MODE_OCB) + >>> plaintext = b"Attack at dawn" + >>> ciphertext, mac = cipher.encrypt_and_digest(plaintext) + >>> # Deliver cipher.nonce, ciphertext and mac + ... + >>> cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + >>> try: + >>> plaintext = cipher.decrypt_and_verify(ciphertext, mac) + >>> except ValueError: + >>> print "Invalid message" + >>> else: + >>> print plaintext + +:undocumented: __package__ + +.. _RFC7253: http://www.rfc-editor.org/info/rfc7253 +.. _free licenses: http://web.cs.ucdavis.edu/~rogaway/ocb/license.htm +""" + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes, bchr +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Util.strxor import strxor + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_buffer) + +_raw_ocb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ocb", """ + int OCB_start_operation(void *cipher, + const uint8_t *offset_0, + size_t offset_0_len, + void **pState); + int OCB_encrypt(void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OCB_decrypt(void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OCB_update(void *state, + const uint8_t *in, + size_t data_len); + int OCB_digest(void *state, + uint8_t *tag, + size_t tag_len); + int OCB_stop_operation(void *state); + """) + + +class OcbMode(object): + """Offset Codebook (OCB) mode. + + :undocumented: __init__ + """ + + def __init__(self, factory, nonce, mac_len, cipher_params): + + if factory.block_size != 16: + raise ValueError("OCB mode is only available for ciphers" + " that operate on 128 bits blocks") + + self.block_size = 16 + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """Nonce used for this session.""" + if len(nonce) not in range(1, 16): + raise ValueError("Nonce must be at most 15 bytes long") + if not is_buffer(nonce): + raise TypeError("Nonce must be bytes, bytearray or memoryview") + + self._mac_len = mac_len + if not 8 <= mac_len <= 16: + raise ValueError("MAC tag must be between 8 and 16 bytes long") + + # Cache for MAC tag + self._mac_tag = None + + # Cache for unaligned associated data + self._cache_A = b"" + + # Cache for unaligned ciphertext/plaintext + self._cache_P = b"" + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # Compute Offset_0 + params_without_key = dict(cipher_params) + key = params_without_key.pop("key") + + taglen_mod128 = (self._mac_len * 8) % 128 + if len(self.nonce) < 15: + nonce = bchr(taglen_mod128 << 1) +\ + b'\x00' * (14 - len(nonce)) +\ + b'\x01' +\ + self.nonce + else: + nonce = bchr((taglen_mod128 << 1) | 0x01) +\ + self.nonce + + bottom_bits = bord(nonce[15]) & 0x3F # 6 bits, 0..63 + top_bits = bord(nonce[15]) & 0xC0 # 2 bits + + ktop_cipher = factory.new(key, + factory.MODE_ECB, + **params_without_key) + ktop = ktop_cipher.encrypt(struct.pack('15sB', + nonce[:15], + top_bits)) + + stretch = ktop + strxor(ktop[:8], ktop[1:9]) # 192 bits + offset_0 = long_to_bytes(bytes_to_long(stretch) >> + (64 - bottom_bits), 24)[8:] + + # Create low-level cipher instance + raw_cipher = factory._create_base_cipher(cipher_params) + if cipher_params: + raise TypeError("Unknown keywords: " + str(cipher_params)) + + self._state = VoidPointer() + result = _raw_ocb_lib.OCB_start_operation(raw_cipher.get(), + offset_0, + c_size_t(len(offset_0)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the OCB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + _raw_ocb_lib.OCB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + raw_cipher.release() + + def _update(self, assoc_data, assoc_data_len): + result = _raw_ocb_lib.OCB_update(self._state.get(), + c_uint8_ptr(assoc_data), + c_size_t(assoc_data_len)) + if result: + raise ValueError("Error %d while computing MAC in OCB mode" % result) + + def update(self, assoc_data): + """Process the associated data. + + If there is any associated data, the caller has to invoke + this method one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver shall still able to detect modifications. + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["encrypt", "decrypt", "digest", + "verify", "update"] + + if len(self._cache_A) > 0: + filler = min(16 - len(self._cache_A), len(assoc_data)) + self._cache_A += _copy_bytes(None, filler, assoc_data) + assoc_data = assoc_data[filler:] + + if len(self._cache_A) < 16: + return self + + # Clear the cache, and proceeding with any other aligned data + self._cache_A, seg = b"", self._cache_A + self.update(seg) + + update_len = len(assoc_data) // 16 * 16 + self._cache_A = _copy_bytes(update_len, None, assoc_data) + self._update(assoc_data, update_len) + return self + + def _transcrypt_aligned(self, in_data, in_data_len, + trans_func, trans_desc): + + out_data = create_string_buffer(in_data_len) + result = trans_func(self._state.get(), + in_data, + out_data, + c_size_t(in_data_len)) + if result: + raise ValueError("Error %d while %sing in OCB mode" + % (result, trans_desc)) + return get_raw_buffer(out_data) + + def _transcrypt(self, in_data, trans_func, trans_desc): + # Last piece to encrypt/decrypt + if in_data is None: + out_data = self._transcrypt_aligned(self._cache_P, + len(self._cache_P), + trans_func, + trans_desc) + self._cache_P = b"" + return out_data + + # Try to fill up the cache, if it already contains something + prefix = b"" + if len(self._cache_P) > 0: + filler = min(16 - len(self._cache_P), len(in_data)) + self._cache_P += _copy_bytes(None, filler, in_data) + in_data = in_data[filler:] + + if len(self._cache_P) < 16: + # We could not manage to fill the cache, so there is certainly + # no output yet. + return b"" + + # Clear the cache, and proceeding with any other aligned data + prefix = self._transcrypt_aligned(self._cache_P, + len(self._cache_P), + trans_func, + trans_desc) + self._cache_P = b"" + + # Process data in multiples of the block size + trans_len = len(in_data) // 16 * 16 + result = self._transcrypt_aligned(c_uint8_ptr(in_data), + trans_len, + trans_func, + trans_desc) + if prefix: + result = prefix + result + + # Left-over + self._cache_P = _copy_bytes(trans_len, None, in_data) + + return result + + def encrypt(self, plaintext=None): + """Encrypt the next piece of plaintext. + + After the entire plaintext has been passed (but before `digest`), + you **must** call this method one last time with no arguments to collect + the final piece of ciphertext. + + If possible, use the method `encrypt_and_digest` instead. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The next piece of data to encrypt or ``None`` to signify + that encryption has finished and that any remaining ciphertext + has to be produced. + :Return: + the ciphertext, as a byte string. + Its length may not match the length of the *plaintext*. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + if plaintext is None: + self._next = ["digest"] + else: + self._next = ["encrypt"] + return self._transcrypt(plaintext, _raw_ocb_lib.OCB_encrypt, "encrypt") + + def decrypt(self, ciphertext=None): + """Decrypt the next piece of ciphertext. + + After the entire ciphertext has been passed (but before `verify`), + you **must** call this method one last time with no arguments to collect + the remaining piece of plaintext. + + If possible, use the method `decrypt_and_verify` instead. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The next piece of data to decrypt or ``None`` to signify + that decryption has finished and that any remaining plaintext + has to be produced. + :Return: + the plaintext, as a byte string. + Its length may not match the length of the *ciphertext*. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called after" + " initialization or an update()") + + if ciphertext is None: + self._next = ["verify"] + else: + self._next = ["decrypt"] + return self._transcrypt(ciphertext, + _raw_ocb_lib.OCB_decrypt, + "decrypt") + + def _compute_mac_tag(self): + + if self._mac_tag is not None: + return + + if self._cache_A: + self._update(self._cache_A, len(self._cache_A)) + self._cache_A = b"" + + mac_tag = create_string_buffer(16) + result = _raw_ocb_lib.OCB_digest(self._state.get(), + mac_tag, + c_size_t(len(mac_tag)) + ) + if result: + raise ValueError("Error %d while computing digest in OCB mode" + % result) + self._mac_tag = get_raw_buffer(mac_tag)[:self._mac_len] + + def digest(self): + """Compute the *binary* MAC tag. + + Call this method after the final `encrypt` (the one with no arguments) + to obtain the MAC tag. + + The MAC tag is needed by the receiver to determine authenticity + of the message. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = ["digest"] + + if self._mac_tag is None: + self._compute_mac_tag() + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + Call this method after the final `decrypt` (the one with no arguments) + to check if the message is authentic and valid. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = ["verify"] + + if self._mac_tag is None: + self._compute_mac_tag() + + secret = get_random_bytes(16) + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext): + """Encrypt the message and create the MAC tag in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The entire message to encrypt. + :Return: + a tuple with two byte strings: + + - the encrypted data + - the MAC + """ + + return self.encrypt(plaintext) + self.encrypt(), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag): + """Decrypted the message and verify its authenticity in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The entire message to decrypt. + received_mac_tag : byte string + This is the *binary* MAC, as received from the sender. + + :Return: the decrypted data (byte string). + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext) + self.decrypt() + self.verify(received_mac_tag) + return plaintext + + +def _create_ocb_cipher(factory, **kwargs): + """Create a new block cipher, configured in OCB mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` + (like `Cryptodome.Cipher.AES`). + + :Keywords: + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + Its length can vary from 1 to 15 bytes. + If not specified, a random 15 bytes long nonce is generated. + + mac_len : integer + Length of the MAC, in bytes. + It must be in the range ``[8..16]``. + The default is 16 (128 bits). + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + try: + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(15) + mac_len = kwargs.pop("mac_len", 16) + except KeyError as e: + raise TypeError("Keyword missing: " + str(e)) + + return OcbMode(factory, nonce, mac_len, kwargs) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi new file mode 100644 index 0000000..a1909fc --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi @@ -0,0 +1,36 @@ +from types import ModuleType +from typing import Union, Any, Optional, Tuple, Dict, overload + +Buffer = Union[bytes, bytearray, memoryview] + +class OcbMode(object): + block_size: int + nonce: Buffer + + def __init__(self, + factory: ModuleType, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> OcbMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py new file mode 100644 index 0000000..8c0ccf6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py @@ -0,0 +1,282 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ofb.py : OFB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +""" +Output Feedback (CFB) mode. +""" + +__all__ = ['OfbMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_ofb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ofb", """ + int OFB_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + void **pResult); + int OFB_encrypt(void *ofbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OFB_decrypt(void *ofbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OFB_stop_operation(void *state); + """ + ) + + +class OfbMode(object): + """*Output FeedBack (OFB)*. + + This mode is very similar to CBC, but it + transforms the underlying block cipher into a stream cipher. + + The keystream is the iterated block encryption of the + previous ciphertext block. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.4. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv): + """Create a new block cipher, configured in OFB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be a nonce, to to be reused for any other + message**. It shall be a nonce or a random value. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + """ + + self._state = VoidPointer() + result = raw_ofb_lib.OFB_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the OFB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_ofb_lib.OFB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ofb_lib.OFB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting in OFB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext is written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ofb_lib.OFB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + raise ValueError("Error %d while decrypting in OFB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ofb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs OFB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for OFB. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + if kwargs: + raise TypeError("Unknown parameters for OFB: %s" % str(kwargs)) + + return OfbMode(cipher_state, iv) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi new file mode 100644 index 0000000..d28608e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi @@ -0,0 +1,25 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['OfbMode'] + +class OfbMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py new file mode 100644 index 0000000..d86ed19 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py @@ -0,0 +1,206 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +OpenPGP mode. +""" + +__all__ = ['OpenPgpMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Random import get_random_bytes + +class OpenPgpMode(object): + """OpenPGP mode. + + This mode is a variant of CFB, and it is only used in PGP and + OpenPGP_ applications. If in doubt, use another mode. + + An Initialization Vector (*IV*) is required. + + Unlike CFB, the *encrypted* IV (not the IV itself) is + transmitted to the receiver. + + The IV is a random data block. For legacy reasons, two of its bytes are + duplicated to act as a checksum for the correctness of the key, which is now + known to be insecure and is ignored. The encrypted IV is therefore 2 bytes + longer than the clean IV. + + .. _OpenPGP: http://tools.ietf.org/html/rfc4880 + + :undocumented: __init__ + """ + + def __init__(self, factory, key, iv, cipher_params): + + #: The block size of the underlying cipher, in bytes. + self.block_size = factory.block_size + + self._done_first_block = False # True after the first encryption + + # Instantiate a temporary cipher to process the IV + IV_cipher = factory.new( + key, + factory.MODE_CFB, + IV=b'\x00' * self.block_size, + segment_size=self.block_size * 8, + **cipher_params) + + iv = _copy_bytes(None, None, iv) + + # The cipher will be used for... + if len(iv) == self.block_size: + # ... encryption + self._encrypted_IV = IV_cipher.encrypt(iv + iv[-2:]) + elif len(iv) == self.block_size + 2: + # ... decryption + self._encrypted_IV = iv + # Last two bytes are for a deprecated "quick check" feature that + # should not be used. (https://eprint.iacr.org/2005/033) + iv = IV_cipher.decrypt(iv)[:-2] + else: + raise ValueError("Length of IV must be %d or %d bytes" + " for MODE_OPENPGP" + % (self.block_size, self.block_size + 2)) + + self.iv = self.IV = iv + + # Instantiate the cipher for the real PGP data + self._cipher = factory.new( + key, + factory.MODE_CFB, + IV=self._encrypted_IV[-self.block_size:], + segment_size=self.block_size * 8, + **cipher_params) + + def encrypt(self, plaintext): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + + :Return: + the encrypted data, as a byte string. + It is as long as *plaintext* with one exception: + when encrypting the first message chunk, + the encypted IV is prepended to the returned ciphertext. + """ + + res = self._cipher.encrypt(plaintext) + if not self._done_first_block: + res = self._encrypted_IV + res + self._done_first_block = True + return res + + def decrypt(self, ciphertext): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + + :Return: the decrypted data (byte string). + """ + + return self._cipher.decrypt(ciphertext) + + +def _create_openpgp_cipher(factory, **kwargs): + """Create a new block cipher, configured in OpenPGP mode. + + :Parameters: + factory : module + The module. + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + IV : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + + For encryption, the IV must be as long as the cipher block size. + + For decryption, it must be 2 bytes longer (it is actually the + *encrypted* IV which was prefixed to the ciphertext). + """ + + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing component: " + str(e)) + + return OpenPgpMode(factory, key, iv, kwargs) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi new file mode 100644 index 0000000..14b8105 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi @@ -0,0 +1,20 @@ +from types import ModuleType +from typing import Union, Dict + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['OpenPgpMode'] + +class OpenPgpMode(object): + block_size: int + iv: Union[bytes, bytearray, memoryview] + IV: Union[bytes, bytearray, memoryview] + + def __init__(self, + factory: ModuleType, + key: Buffer, + iv: Buffer, + cipher_params: Dict) -> None: ... + def encrypt(self, plaintext: Buffer) -> bytes: ... + def decrypt(self, plaintext: Buffer) -> bytes: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py new file mode 100644 index 0000000..4a76ad6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py @@ -0,0 +1,392 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Synthetic Initialization Vector (SIV) mode. +""" + +__all__ = ['SivMode'] + +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Protocol.KDF import _S2V +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + + +class SivMode(object): + """Synthetic Initialization Vector (SIV). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + Unlike other AEAD modes such as CCM, EAX or GCM, accidental reuse of a + nonce is not catastrophic for the confidentiality of the message. The only + effect is that an attacker can tell when the same plaintext (and same + associated data) is protected with the same key. + + The length of the MAC is fixed to the block size of the underlying cipher. + The key size is twice the length of the key of the underlying cipher. + + This mode is only available for AES ciphers. + + +--------------------+---------------+-------------------+ + | Cipher | SIV MAC size | SIV key length | + | | (bytes) | (bytes) | + +====================+===============+===================+ + | AES-128 | 16 | 32 | + +--------------------+---------------+-------------------+ + | AES-192 | 16 | 48 | + +--------------------+---------------+-------------------+ + | AES-256 | 16 | 64 | + +--------------------+---------------+-------------------+ + + See `RFC5297`_ and the `original paper`__. + + .. _RFC5297: https://tools.ietf.org/html/rfc5297 + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + .. __: http://www.cs.ucdavis.edu/~rogaway/papers/keywrap.pdf + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, kwargs): + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self._factory = factory + + self._cipher_params = kwargs + + if len(key) not in (32, 48, 64): + raise ValueError("Incorrect key length (%d bytes)" % len(key)) + + if nonce is not None: + if not is_buffer(nonce): + raise TypeError("When provided, the nonce must be bytes, bytearray or memoryview") + + if len(nonce) == 0: + raise ValueError("When provided, the nonce must be non-empty") + + self.nonce = _copy_bytes(None, None, nonce) + """Public attribute is only available in case of non-deterministic + encryption.""" + + subkey_size = len(key) // 2 + + self._mac_tag = None # Cache for MAC tag + self._kdf = _S2V(key[:subkey_size], + ciphermod=factory, + cipher_params=self._cipher_params) + self._subkey_cipher = key[subkey_size:] + + # Purely for the purpose of verifying that cipher_params are OK + factory.new(key[:subkey_size], factory.MODE_ECB, **kwargs) + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + def _create_ctr_cipher(self, v): + """Create a new CTR cipher from V in SIV mode""" + + v_int = bytes_to_long(v) + q = v_int & 0xFFFFFFFFFFFFFFFF7FFFFFFF7FFFFFFF + return self._factory.new( + self._subkey_cipher, + self._factory.MODE_CTR, + initial_value=q, + nonce=b"", + **self._cipher_params) + + def update(self, component): + """Protect one associated data component + + For SIV, the associated data is a sequence (*vector*) of non-empty + byte strings (*components*). + + This method consumes the next component. It must be called + once for each of the components that constitue the associated data. + + Note that the components have clear boundaries, so that: + + >>> cipher.update(b"builtin") + >>> cipher.update(b"securely") + + is not equivalent to: + + >>> cipher.update(b"built") + >>> cipher.update(b"insecurely") + + If there is no associated data, this method must not be called. + + :Parameters: + component : bytes/bytearray/memoryview + The next associated data component. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + return self._kdf.update(component) + + def encrypt(self, plaintext): + """ + For SIV, encryption and MAC authentication must take place at the same + point. This method shall not be used. + + Use `encrypt_and_digest` instead. + """ + + raise TypeError("encrypt() not allowed for SIV mode." + " Use encrypt_and_digest() instead.") + + def decrypt(self, ciphertext): + """ + For SIV, decryption and verification must take place at the same + point. This method shall not be used. + + Use `decrypt_and_verify` instead. + """ + + raise TypeError("decrypt() not allowed for SIV mode." + " Use decrypt_and_verify() instead.") + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + if self._mac_tag is None: + self._mac_tag = self._kdf.derive() + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + if self._mac_tag is None: + self._mac_tag = self._kdf.derive() + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + self._next = ["digest"] + + # Compute V (MAC) + if hasattr(self, 'nonce'): + self._kdf.update(self.nonce) + self._kdf.update(plaintext) + self._mac_tag = self._kdf.derive() + + cipher = self._create_ctr_cipher(self._mac_tag) + + return cipher.encrypt(plaintext, output=output), self._mac_tag + + def decrypt_and_verify(self, ciphertext, mac_tag, output=None): + """Perform decryption and verification in one step. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + You cannot reuse an object for encrypting + or decrypting other data with the same key. + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["verify"] + + # Take the MAC and start the cipher for decryption + self._cipher = self._create_ctr_cipher(mac_tag) + + plaintext = self._cipher.decrypt(ciphertext, output=output) + + if hasattr(self, 'nonce'): + self._kdf.update(self.nonce) + self._kdf.update(plaintext if output is None else output) + self.verify(mac_tag) + + return plaintext + + +def _create_siv_cipher(factory, **kwargs): + """Create a new block cipher, configured in + Synthetic Initializaton Vector (SIV) mode. + + :Parameters: + + factory : object + A symmetric cipher module from `Cryptodome.Cipher` + (like `Cryptodome.Cipher.AES`). + + :Keywords: + + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + It must be 32, 48 or 64 bytes long. + If AES is the chosen cipher, the variants *AES-128*, + *AES-192* and or *AES-256* will be used internally. + + nonce : bytes/bytearray/memoryview + For deterministic encryption, it is not present. + + Otherwise, it is a value that must never be reused + for encrypting message under this key. + + There are no restrictions on its length, + but it is recommended to use at least 16 bytes. + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + nonce = kwargs.pop("nonce", None) + + return SivMode(factory, key, nonce, kwargs) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi new file mode 100644 index 0000000..2934f23 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi @@ -0,0 +1,38 @@ +from types import ModuleType +from typing import Union, Tuple, Dict, Optional, overload + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['SivMode'] + +class SivMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + kwargs: Dict) -> None: ... + + def update(self, component: Buffer) -> SivMode: ... + + def encrypt(self, plaintext: Buffer) -> bytes: ... + def decrypt(self, plaintext: Buffer) -> bytes: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2f8b59f42d0df2aec432b85b28ea82afc0ed61a8 GIT binary patch literal 35688 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 WM0uI!W`FmMragTD(SA5Y@&5qL5Z+Dz literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b37dd95134811f9abd88100ecab29e4d210df2ee GIT binary patch literal 106808 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 !0K5zUDgppc0B`~T z3<LnR0KjhmpcMdk2msUt06PJ|H2`oC0DK7mW&(g30H7=Y2nPUh0H84dcm@DO0DwpU z&<y~53joRkfVTlaA^;cy0OkUKHUOXj09XhBIs<@@0l>2Wzy|<K1pr?GfcXI60|4+e z0C*Gt><0h|03Z+mYytp(0D!dsU<v?u3;;9)0ObI{G63)(0LTCU?*M=a03ZYaYy<#L z0)R09;Cle@5dbIz08ascW&pq&089n|uLFR40Kj4ZFcbj13jp>4fI|S_7ywub0FDEI zE&$+n0PraQSO)+)0RVRZ@D>1=0|2T4fUW@GM*z?i0OSGyI{>Hx01g9yUI3s202l-S zd;vfZ0Eh(uwE@5$0Pr0ESPuZc1^_t#;2;2K4gd}SfL8!O76AAH0Q>>~b^w4T0H7@Z z*bV?{0)Qj{@Hhal0Dw0Dz-a)m6#&ct02=^6e*lmM0FeJ(k^c`N|0^N?TO$8kA^)o( z|5qdbQ;`2*$p6=n|8tQ4zajrqk^dhe|7#)t-$MR>h5WCH{EtWe4?zBJNB&Pm{?9}H zk3{}kk^jNS{|}J=k0bv-LH_qf{wE>-=Oh2~kpI6T|Cb^EYa{>PNB&<x{_jElKZyL# zK>mM+{9l6nAB_B8kNkfJ`F{iX|0nW)Eb@N=@_#Y%zZ>%ZRpfs*^8Z`p|4`)r>&X8I z<o_(>{}JSWB=Y|r<i8v8|7Ya?Bgp@kkpI6R|2rf9Gm-xu$p4R#|2vTXO_2Z3BL7w7 z|MSRyALM^q<o~_M|M!spt&#svApcJw|2rZ77a{-eNB+Ab{|6%fD<c0tMgBXH|HF{~ z>yZDR$p0UZ{}Yk_&mjLNBmXbU`A7bHBmWyC|EnVZM<M^OBmZs4|2X7-Gvt36<o|Hw z|5M2SaOA%)^8Yd9|C`AF%E<pI$p1me|GvooP~`t9<o_1re=PF99P-~E`F{!d-w^p9 zg#1rK{;x&;pF{pXhy4Eo`QIP;??C?dL;mL@|MwyPHz5BvA^$%^{<lN^2O|GxApd6~ z{|_Vo*C79QA^)o&|Gz~3`yv0wBme6o|6fM_mqq?}K>n{n{;x#-_d@>HK>p80{(p}A zpNsroiu`{O`Tqj)|2Xo$4f4MM^1lo6|32h@59I&v$p3}N|3=9FX~_Qq<o^ide-`rp zBjo>X<bMG2zYzKV1@iv@@_!8S|19!<I`aQ}<o_$k|LVy9^T_|r$p2*I|BuN3y2$@1 z<bOTn|4!t8Q{;ax^8Xt0|0ME18u@<_`EN)5KaBjZfczha{BMu^-;ex1jr?DM{O^eT z--`TCK>k0C{I?+guOR=gBLCk&{y&QRKZE=qjr@NS`QIG*-v{~s6Y~Ec@_!@p{~P50 zB;@~c<bO}(e+cqF2l?L}`Jayb{~Gx}0r|fd`TsWZzXkGt8}h$A^8a1re;wq15%NC< z`R|4NKZg7tg8Y8~`F|AopNRZFBsKxD;fc*a>~Lc15xbDsUBm_>_CT>2iA_lC3}QnO z+n?C0#I`2(Cb9d8O+)MnVw)2?iP&|-RwT9{v7w3mP3%x&_YixU*xke?Beor}nTcIQ z>=j~r6#JFfy~N%o_Cv8niVa2VL}DWndzsi~#I7cG53$vVy-;j|VjB{hl-SC|_9M0& zvEPWzMr=`HOA#B6*apQ8CALqosfZ0tY*1oT61$Yxhr~7`_EE9Th&@H@Zep7fd#Bhq z#eOHY7_lYF*%iB=*qp>BC3YjRJBnRZ?3`k+5*w-5g~XmI_B^qviTzIOKw{Std#cz; z#SSF4D6yZ3olop%V#^a7lh_!=4kWfDu~~`jNo=!XqZRv~*d)caD7IU%A&D(fY?We* z6uXbuvBWkjHe9iji7iZQL1Gg$ZCYaU6I-p=mc(8wHcPQBi9J?qq+$aVJD1r1#Qr5V zVX+&E%}{KBV!sl*rr6TN?kP50v0I7_N^HMk6BS#o*yY6bC3au2LyEmqY_ww66#K2% zT*VeFwotJ#iVaX~m0}APo2c0M#NH@2GO;g;ZC7loV#gNSu-N0oJ}dS?vGs{PQ*5_l zixWGW*p9_sCN@E_1&bY7?2}@H78|G762)dI_Cc|4imgy=jABa_8?x9?#r7+<N3r>d z{aNh5VrLb5ve+xdMklsVvHgloSnSJUlNCFs*we*6C-!HtH;WBcY;|J47Mr=)#KoR2 zwq3EMi_KhYuwug#JGa<S#a=A7Z?Tn%y;1D-Vw)8^x!AGArYp8Wu|tYYSZs=7a~FG} z*td7SkdbkD#^lN8mW?0(`@9DpDDt~>>C^W{j{ItUR@R~(AAUHnOJt-QR^x*&4;$9& z!TR-osCeVXTZ2FQtkd_ezIyh_apM-m@7-JN>1orPZTIZCGW)>?&j(+*^7>DG`pn<c zp~F?53m5EXUwiG1VV``Ge*M{J<9}Sc_MQ)xFYo@x^Ut4tB0Kx3ep|NWZQHo<o6zgm z<JLU(SjYQn)f&~eS+j@iZQA_i_QxO7Q}^#5-oHtcuD`zU!pBX%`|eM#ix*ElcK`ja z<{UdVxO-Goy*9zYUcT<`k9XU(D<Siqd!D{``}W8>AtBA5dE$vOHdT#y>&Ykmy*)j{ zo0Th9`Kc*WzK%O}>OifZe(F4;cI}4`y#D%+1$lYpDtmiZSuuTj@7x9rnl!3ZsaeCy zmA`y_%$PUN_3hj5>dKYR|K6?JxK6EFZ5;IJrw<-{<Be_))UA7>^|#;Ndw)bk;F1|L zUi__l_qT`Z=YMO1pMP#UFf8obYS*q!+`WGNhM)WO`{e!m?wgmeZ{M)b-+w<lB_?L^ zSINmsKk3+UU19IuGm}61=$(;=4t-ef{Q1=HUU}u`@>j3U`mlZbCqL`dX=u;r=(3Av z&V1yf`1mscfBxz2;pTQ@>cbDOywIh~1V?Oa&CLY`Dc`PI_3STQyAHVV+;da5v~8<C zvS2}**B*Ve`nyj*JvOmLi;M2R{g(0dyYG(Qx?#iGyyM5)WmK;o78wxmU8SO;>;Av| z^1<lCho^Qta3Cbe*SA*Fz`*ShXV1R>O?rCMXO}FQv)|!p6jPzXV`)2f^t|-aOV_47 z^w6XZadEp>4;ixghXDf`*RNRd`^R%~wyYdDu;S9GQ&)VPn)=+sUw-KrTBAmfhw9a9 z_3FZfKGWySnY%Y3VOQOA=SCjcw5d*PP|!;gzxwLkQ}^CmzKV~}YvTYwtCJ^(^lIEV zw{y#uK~>9?dGw2<B;PU~9*LvE!#ADo-@jnMwr%f?IdY`^`PHj;yf}Dp%&J9;qMm>J z@gvPopT3koapKX&Km3s2e)sM%eVR8vzH#(u%iMYM)(<&)bot@Vos&+!{PM9kM~zy2 zrB|<CJb(T5qnbbdxOZ)4=CAW7P3mxF&6<D^FR!eln>SyWGhsq<R?V9Ivl}&P5gr<v zcJaj*b9TM?=8~>Ecka8Vu<)75Cr%VD&&_RJy;`*=PNbv^`trT^{AT6n+h#uU$jOCc z$4+k7y7m1#-g;~QD?^7aJeHW~p<1nfSbqOKw4A^Hw&w;7x-Y$H(=~slrHwfB_S+Q} z&6>5W_tvc~YgegK`|TAgK5y~OH$MelzFhx}rAuo>mo0nvoe?8m9{c&{p3eF6qhDIQ zxZ#GUo{FtewQBIAvuE!KJ9B1s(!qnT6!q-cWkQ`gFHHLSYwLo!bNgI=<{9rPPG_YG zetwz9KltFYsPDg@v9n#fLz{*VpSIm@ue)y9vcBURHmq9KW_w`Yx^=6r_2@DB(|6u! z(6W5_3;-}00E`C!4*-Bm0AM5l$N~T#0)R*WU;zNb06={Ja038*1^`|K0OJ6_UH~u+ z0PFz(4+4NI0H6;5=l}pN0D#v3z$XCUSpcvW04xUp&jWyL0I&rBYy<$;0l;GbpcVjV z1_0UsfIk4hegMz}0K5PIz5@Uk0l@tL;1~di0sz4Pz#RbW0s!{_fb9Sv1OPk%08{|* zBmnRP0ObI{6aa7v0Q>|1Y6F1R0YDxA@CE?W0YC!)PzeB31^{CKKwki`5&(1q0IdMP zrvTs$08keId<y^~0Kg0Y&>aAL3;?wI9{_{_fNKC?Jpkwj0PX_-`vAcE03ZecBm;ns z0H8Mj_y_<T0s!X$z$*aYDgbB?06GDHXaF!10K@};KLLOn0C*SxbO8Xd0H6Q>tO5XC z0l;$rpe+Dc0015Z08aye769Nk0PrpV*Z=^I1AyuPAOHXq0f1isz+nJz008&`fIt9n z767CJfF%IH0RSohfE@tfB>?ac0EhzsLjb@408kMC<N$zy0AMNrNCg020)QF-pdJ8N z2ms~)fCK<=4ghQd06_rYD*$jW0Pq0-UjTrU0H84dXbAwy0DvR_-~j-_0YHBMunhnl z0RXE3z+eEd2mm||08Rsdi2&dS0I(YXGzS2q0l+)}a1;P^1^_PufKdRT7XbJb0Q?95 zG6BFO0I&uCcmaUT0AK<Ds0jcX0f0~d@FD<s69DW40EGbH1OUhd0M!6M3IKQy0OSLJ zM*zTB0MHr$yafP;0)RvSU<Clb0|0*jFbDuN1psLP;B5df3jk~d0963M3IOm80JsbQ zmI8pX0AK_F_#6Pt2LOu!z*7LADgc-b0L}n_g8-l>0H^~1z6Jnu0l+f=zzG2S0Kf+T z;Clej4gd@X0CoVd3;;9)05$-y4gmB30Pg^R@&F(M089n|;{m_}0N@e;7zqHf0KkU; zAQAvr0KhN+P#*x?005r>fL8&)H~_F0089e_djJ6HfA$ps&<6l?000*Nz-s{D69Dim z09XqEmIHw20YEkY*a84H0)XoP;4uJD3jj0&0Br!k9{^xK0B8aLUH|~!0f37D;C=wW zx8*re03a9uxC4M)0N@?~upIz|0Dva|fC>Pf1OT1@pd0|00su|{fS&+BZ2<5(0LTLX z-T+`a0B8UJDgl7X0ALIN=nDW=0)TD+pcMf46ac&d0O|sOZvj9A0GI&)x&wfZ0f4Um zw>Ag^0M`J(dH~Q50Ne)v_5pzR0YD4@NCp5M0YGm6@DTtw1OUzhfL8#(RRGW)0CWNX z(Ewm30Eh<we*yqE0PrvX=mG#@0YCu&SOoyO0)XcLKwAK?002A+0G<W_Edao80N`B! zumJ!Z2LROpKmY(J0sy}NfWrXb008g>0D%DDEC5Ic080RX0{~P206PG{O90>@01yWN zh5PH7iO$N>NY0l-uMkO~041OPPvKs^Ak5CF^p00{u#901q^0D=I(R{-E%0N?`v zz5oCx0YGB_&=LTY0RTw=zykn;1AzVjU>g890svM6fWZJ@5de4`0GtK@69K>v0AM!& zXbu2I1Aut|;3xp-3;<pR0HXjvF97f>0QeCAWCDOm0ALLO@B#pv0l)+RP!j+&0sx@^ z;6(uNCIHw8015%X2>_4_0IC6i6aerZ0LTXbj{tzN0H8Ghcnbgw1ptWvzzP6<2LS#6 zU=RRk3INgoz}o;|768}^0IC3h6#(EH0B{)qECm2%0l)|V@HqgO4*(VefTsXJRRAy> z0Gt5;2LV7&08j@2d<_8R0)S@#fD-`t0e}wx!1n;49RL^(0PFx@831Sq0BitY9RTP7 z0Nw!r<pBWle<$+)GV=c%^8a__e-ZNkQ{?|w$p1yi|AEMVH{}08<bN;Z{}0Ijw~+sx zkpE|q{|k`+)sX*A<o^}q|9Ry9>&XB4$p5Rze>?L34dj11@;@H=e-HA%JM#ZD^8YF1 ze;)Gx8{~f+^1mbUe-!fnA>{vW$p7ic|KZ60uE_t7k^g@p|4$+RUq${8M*i1B{(B++ zA4mQtApf66{zoGJn<M|rApawf|NhATaO8hw<p0;m{{zVX&dC3Vk^es;|H~o&t04b- zBmbKq|C=HIzeN7OiTv+}{C^(#KMwi75&8ch^1mDM{{-^?UgUou^8ZET|J!o@k^ftf z|80@~-y;7fBL6oa|35+g&qMwXL;hzY{}&_wmm>eyA^&G0|KCCWe~A1~MgISc{GWyV ze-imW6!~8k`Tq#={|xfq9r=F)`M(nRKLPn)6ZxNl{C^htKLGhZ1^KTc|Jxw{t0Vu% zBL6QU|1*&P<B|Vsk^k+G|6$1g?~wo3k^dhc|ED7VLy-TqkpJ6}|L-IJn<D?`ApaX7 z{~tsC_eB0*L;g=f{_jTqZ$|z%M*e?~{NIB7uZa9#f&70C`R_pf_dx!)LjL<8|K}qA zcOm~rBLC|k|6fA>zl;1YkNkfP`Tqs-e+cqF7x^EA{C^br?~D9TME-9={udzs-$VYl zNB-|X{>LEyqmchckpGvE|3{Jk`N;n<$p7QWe+%+|J@S7!@;?dre+>D*8u|YV^8X{` z|6b((ugL!n$o~N3e-`rp0`fl@`QIP;-varchWyV#{x3oP??e7SgZwW<{<lW{KY{!o zg#7nI{@alMCz1b?k^lE2|Mw&R7b5>XkpF)m|3i`g+mQeFA^+DP|3@JID<J=uA^%$< z|7#=vKS%!mg#53M{I7xhKaBi;8Ts#t{EtTdH$?u&BL9Pt|9g=CvyuO=Apg4{|6f4< zTao{LkpJGu|4PXJOyvJ($p0D0|3k?CX~_S&$p5~`|EkFU2ax}(kpH8R{|zjat*v6& zyB@qwzEo7yo6ifYii)Q2IrjCUqWyd><ny$|e^68u%TF6FJWy05zn&?MUv<!&Wl}fA zG9kcH+1Jxce$O+USbi@;nL?diB!_=Mf`3S|&1byV6s1k2R`sI8Ye;k=F9)yTv^m)u zPdopBxo#c&LuOg+{$bPI-Nuyh4{`VhwDb3B=VPtqPROo>I`~+3TV0`ee%nXu%R)Yv zuP-XnzD!T@4@mL%QhE@#ir4eR_vW84P!jzE7P!Uxhs?Le`-jbQkN2-LS8eYfIm^TD z-(tF_HQ29=e`I_AI_><!9R4A6DBj;I(Z}u|nV`kB)8gom)T=Po)$bP-t-OnR``@PC zq}$Xxglc<J@2~rciX8kZkdopbFkj|mo|P`mb$9sJnWfU5=^k#6m+`N|Jh{4*;$w|> zBd&dkxOP5W{JpmC+<)L;7b!DKo$Ef&I$wTb^gs9C4E#3(|4+?;`S+A={`*M=j+Mp6 zXw2~QMp%ALN^|nl;W)vSIP>pS@f-1)Gyi^*{Lr{K`GInA{F4QmGyjg0uw9&){@aZr z`N!Fnfd*I1zqPbd_=S`EMch&&UH%<pahvrI{?eB2__aFC8O8LUU?;}J)j&Pjb??aE zCKJamf@`je(Xbi6&|Qx=`?*CA%3tu(oY@|~cBb`ztdXCuNVKpyj~9$^UnBibBkby@ zQQ!aR5A*NY-P~?7W1SO>&tAsoP~)>h`}Qrv>hPD}>V`!{^7p=?!Wu_5j*5(mjtr~Q zEptd%;-Fk3p<z^1U8Mo_>r0?dWMo;r!PESsKeuxa@sGahGv#GD#vJ<cuTE+1b_Ly} z68DcQ#PDJD@@y|37OyOdS=~I(OUT_bQH%7rUyD>{^WpBUju?|m0rf%BR4=Q=V}hi5 zsS_lxmuG7}+#K{;jSOjv-(!wMyhR>0x<Y4(SSAtt+gXZ-mu&+do?h?r?v=sYabDiq zTWtz>H`LyUBTo(dWn}+^d6Wr|fR6`n9zMaZNV?DSym|O)0WY8TCB@Gtk&ghM)so`x z+mMeC#p5I&o?dcZJ-wu7TC?rQ=q+zVp48r>3Ao8=@vvDX#-lS4zIiPaOWj~8=8>+2 zqZ=!h`oS_F51BYWf8I`8EDgP6y#ARZ6-y&;@hbj9@JDF=3%0F9SR%b;z$YzAfRy}@ zS6Nw!R!YDF_>Y?5BE>_}%Js;MR4mQPNxZkU?GSR}h>b%3nXv=4NQtFeo6Xq%uGnbB za?Okt#fb~-k=aDCw6U1cnz)kaAv8DD72U<mJ%skQyP`X~qG?cdGb@o@gQF5!Omsy% zT+uZ7h%36S9<2>~Kl?_T25-gVUHn0_NVM#CD<=uwR>jC0?B!;y=j{gtd}ISz>j%j4 zC_Wv@Wo-~Lg+Q3%_8=eDhSowN%g6ENdBoy>KiQg6&Re#F_NG+G!RvX-;+H7#l0gYc zlZu80$O_&3CkidgeSlrXk(m?8(NwmnakiC8yUA`H+Fq(Y$m@Mxl`2Umh7Oc6bMa2* zRrwW(8y--BxX|p(9K||9+Y7NY+LBk5$H8`I<9COwN*6-b2|mZ%6{YG{{P&SXcwhBR z0^j5LQUWg#7|Z~A^QtCA!VdCwg3u9O)$4mH%3DU27MHIYCB<1fx~uO>{k_Q64Nn&d zBoUa1Cr<)#1m48+I<K${0$<?yOafU1Dl?R_yuv0CSd3@B1ZEQW2G7^LYHT-Je~id` zEIr+Fc<<r%An#q>Cew!+X7}_AC6knJPor=}#_~IjQh_Ck^42o^E`E)%Myf2VR6UOB zJiVkpo?fy^JiTOlgai?7?WZm3&3|9gvU~)&E4`!Th?0dV!|b{9s_}j$B5_9L)?X|= z`G?zA5@U_`&EUhbf$X)kq6t;SUwgzD#hTDWwnpu&JXo1v7m(F@hBs?MC)pmA1xnUL z4N7#cFDW(MBsoH_(wmm`DkF=lj4V-QWQi&xOH|odud)t(R4jem{Vc7isqP^?6d{3n z^o|sVbg!Otk3d)HAN`oZN1Z{uS$a@(qN`{R_u`^GN*3*56s@yI3U#57>|MRRF7A=i zo>E_UZfWbTkL(Lcm&qcgzSbW(Nd)ZDp}NUZPg{3wL=8G;E0%Wd+SyR*bd{8SRzJ%m zL`J=AaJtW0UGqz}ebyLRi+UN1XP-4;isTuq`Mb`--yjE^?YDXhY8&Lhu>Dp)-4D3- zTg&QxXtm!Otod`b{1tV-mcNSb*Ya1_{aXH-;%DyU!_(_N?OiU1I@;doMTh0=X&vrW zqQkw64ofF{86B3+_p%muIITp7(@JzWtwe{@N_05QTHN6@YjKCuti>Hpv+5nLFIT9g zkyT$6IdfVU8(G6;PV34)c|odOCbI5GFhL+qZf|W-BCOh?G#J61X7!VSHn>l`+SzJ& zRLVx`eODSalXi}|Y3-OYL^C-^uH{v@(IaFrkGW|L&tiM@;uWcN;Fz1%fdYEBh*zZ6 zkz;OJM^Y#m$193XeD0?8ry>{j8KN3%Jvi>BE%!)Yh{{W;xrm;)rG?0CZEa7s+G7be zmu(k4UUBQ=F9}MMCnQ%wkTp|s5T8(2^N}~9mE>iSC1aDvd2?$SWSwW!)Uu8oA}P_b zmBf+n1>T#!3lR<(4AIOWL|T^n(xYYvNV4>-`Z*sHZHjU~ud1gBoWyfX0v8B$;CgAp ztNAqoEu^+0qc$qSfebC*I`XXIrPWXlp%}nRt2+iyQwd0W_v6Xp#lH>-p{33z2`%Q; z!oj?^FrGl%lr2(sOYf>9i7h1gdtO!33Hb4cfqi&Y?M9$6o=9FXbJ-|nVRuD9V(I0s zR(+r7KBT8ff!7H<glDn@UL^1wo@XTRB!T^ScJrzxg~Rp|QzH-t^9uWvz~Fnh6nTZ6 zB5+R~MY&#^z&Qd9+A4|%udpiwmZtNUk$HuAuwhb%Fn7Gd$`Lr1sVIkeg;gbxK8h4x zEl09ciM1Fj&Z5ZQv9`QnRfqFnRCO9jkLN1NW4x+PAn*a6_ju{0wzx`7ky4wj>I$>e zX)>KMOZn%Cax_aN&}(rPWu27TYE?fmOEo1^G%u~KbUXv3RE+d+qpOr+rPOY#s`YLb z8D^Lz*5O$rC3M$HZnQ||Nt|XU<I}Rd*(9RbbhG$4LGGhcd=UW$w`MG_s!tPm70+|L zn!ik-h18U8)TAhF=>b=tmM>^LW8<aOFb+?y1f=e#@hp>ow09KG5nk1#Y?#z}gV1GO zE##(KYSitfT#&lEcvp=iwj&P|$-JtD6SyBwmINvgcmmI2UNLf+n1$Vyl?Ve%KQ^5o z``|s&-;n|q0;lktl)!Hk@SMn_2(PMV2t?v(z^j@R4y#DsMTAE13ad%L`G}&7<`ou2 z;JF3-V>!IS;s_jlNm1V56_!L`+b%^}!7HpMfrI-MWdpCUK?JrS1fS&<Hk!b|qZnFw zX`Aj$w6-#eMH$F^Sn9Z|C;aG?Y`RzZ2Yg=UrEP?xc#iPWOATpamRcyKBHYzLf1}hD zGF>)Hg@48I;iZ@Q*;Q(blxpU#CYhyD$dtrOYby^=j+D|i-MvlCwgQ+bOB^#Ry<1L( zC(RN&@$8TihO?Bl)btPZvHDl`FKa318BhU8mRGF)Eqz+~#P}p}n62T8k56lIaJCIE z=TWs0%Q3E{NFGlKiN`D0QoCYOparkDswI^Pv{?OpeDwMx-p8**^)0Bwm-f7h+w;>3 zsKo{RDd0+%0=7~$FhKzpi{570>a-a_mU2x>lyM8;*~W-aWl$0kM1+je6%ib0@hQ=2 z`9_vD70nznrr3(o`wFF_^~excBy%QtWh&c-ENQ0|si>ChONEW?nBz*sx#rkSkE?9- z$e8!gQbW+QRH<T#3hZXt)K2YLp|?*TpEMuoQ&m-o3N$LI=40te{b5atqpG_KNw+Ab z>cwg}r&(D3C~COpk!cpiEo4zUCMMjBma1zuV)gW;ka2}+?bRyTd9Kis<3mRoMVQ#y z74-sjjRM+SBV3FEMzDU#0%jWxO0JipG%UGViqfcbky6tgQL=VpRw7Gwz=(?~*@6+* zxMVX%T(ptTSe7OwXG9-f(?(2UsXjE*R)ooHF6#g_T}xoD8%MTu9E-x?za>r<p;f8+ zIk<c8;aDoW@mVZaIUe$p=Mv!moa_uGB5Q1JME3BAA(`WHv$96zWac)Eij2t4%F2z% z%gK)5@7PBS%gBhB(4tv-vnCC*GlvWxl-qFBh%tE+BFHylOvb3ZA(@Jn*9<83`0kA| zq=n2eLq-f5lbMs#Xt)FikIKpznVyj~dUVzpJws0JkRh2vN#(l4kMRjV*My#P@SvPb zy(DS$L{C%Hfr_`AsWz>jsTNfY3=DF2vtFNM39^p0xLeeL9@crPWwX1Rs(M&wJkW?J z9}nvk$?6e7&TD#3YuVm<%2X{Sj+Co<ibt%6wX9KWnk(_jO~t0`DXN!;RBSD`kP3b< z^W^GPKcVGGA?5p<QkLi`X6c~a<oWofJgZ%$59ujX>g!?sLXFkOwqcSng4arP#bT|p zTlMy^Zhm;7>K7QO273hOsxc{Q@DR0roEr0*8XBwCC#JU=8l#d_KUs}gtJZI+#;j2* zw`rvYS|>G9{XE*KF&+VG<q>LND?)K<WsgAJOHCerYGA6w2CFt}wng=}Xf4(E2sZ2Q zt;Qs4_4iim$Eq=pslhEZ&!c7&u@vv3H!)rfY@}9>YtUK^Y#^0Nm;I8|z$Sm$f@=hH zt*si`Tn$bxJrt_5PAb_<gi$|3v8aI&YGrL;fu+a5Y)MB$Q`Gvslhl|zH8evFW)Mu$ zUk+k|8rV|$OXX#0S)Vi4M5Wx^NRYM`i?p>EYR=Wr;$|39{T6Br)1?hVUl7+4NGlfB zvYxDupNGC8bn%Xh!Z29$l8f?h$HTg`lO{_KNL%@TI2wI>#g$qV1|~C?a=S&L$NJv= zt6@Ym)Hbjz`y_pLu`sf$hOw#qnV?MZ-&B2xeOqEzg|;fSr7EYY_3NrJ<BSz4*+N4# zu%Xt3Y%IMgKVuUGHkOFelNIVwp45_?tMmy8X~)hTH<W^-WS!Zz9FJkzAOcm3hc(us zR<=5%1H&ZP$`U5Wz4MAvr@elr8dIQ#Hd5>B+pE4B%=Xe7YM@0vs#b|qgRGO1si>V= zh2tG0qlnYJNrtz)8q`9(!FsezpKLelIE$Q-Agj0ZBMuCVErkI&Kgnro=yEkUPGu(R zQ|M`;QZm&l2OFv}E!8S*TSZWQf|S>qx5u?oLnR#4R;|)m4YrQgk6}`r8q`-B2@DLT zkJ=Qc+|ppoFu_gCcr`dfJ4I_X-ZA!$Y88iC-#U(=k5jAkjc6!i*3VNFj}V;@GUkxx zb{G<`26fijf&w1a@%kVg#H6U9T9^^bgxx&i^2K9K)}flxDo?Fq_1SElNXs(ZmTFL} zS|zTDG)Y&hG@~QA+UNsmUN%mgM%K_cwSFtcEDcp*=B(qB)t~{=g<xo2a-w6{NTK!B zm?$;0ry9%wcP%d-mbYV{XjdDqCRk_&8d^^pXrxvdqy`UC%_ck1iX0AolJiQpCZ{Ac zTMdrT)|0+YrNKDX^LaI<K6|Nks|Y)l=E#sn$!-~`FDKKlFKcV9c2dgA;<6i4lGGqO zk$J9l%_}uN?Od|13~_|EuCDR1uG;pEX`oh#a;>PeYOLrm@oFoYMW4!WHOPsQ9oxnj zBg;9#q6T%7_HQ2O?N>8osaj>ODor+4gIG~cpSA8ZHOAUQhCH0b(U(y>m9;Gkb7iAg zv%Qi7**ihnEfT8+@6nctO~NvBLSk~&P_EwA@-COm8Z{_`Vs@=AHjL~FskVgI&!aEX zG~76EYB^)?$ZiO*GqsbZNlkJBsXkAdlkEXD+o<)q@rmaEa!~Xed8JyVHB;m|5~VSq z6G7h(acTffg)DNn3U)r6bQ<Ml$d`Ty6N~kdr-d}tx`2tbpb^wmk3Q%X0uj>y)HL!3 zkziB9+NhQoH7rWr>)!NUzmZzEAEmxl)k><3!m7uks;_*Aw5w=++G}C*ip{%e2<V+2 zFOh!MC%woJglEb_cmhMn>*is-HqlgsULMw^9@D(a>9Xn1iBc-e!#Y)~K2Fbl)s>r+ z$30@zvYph_*xZ|nOw)>_=tZu$ij<WGXqxX3lGRk}{D+1P)eBzM+M@m0B-faxdgZEN z2@J-lfv$*XwU(tvlEs4xEO2AqL&<8hWYvpaq^QkWsb%9-uOum^HlrS*rK+K76|zXi zIJE{DT51`}k|8xVMJ<~IZB(yTYK>eeUL%RD>?J-@)YO@(SAyO^Ua4x!j#HbpR8cTm zWgXRiRMsq3O>HEZ`_Zia4#@B%OXvEva&@b0teI<?+AsH(EUDC0RvQ+bO{IL2jDp&0 z#2R%~NlsGxX}#;$La(Ys@A}2&N*sObCj;%M%0P)ojn(Hsn-y)!=%hX|bdT|yvqtxr zteYp!$WUU|WGb~;WBO{ek}^!6%$u<!xvm<$^e(X+GNB#RvK`HNlT~8UWVj5DA?9i` zVh;4*Oj>H(?Pl!e3DY~LEgNIi+N+|?8=atg#?)!uBf=Pwu`%y{(*DoxHf^8(?QUa+ zOK!-&+il#=x9+wa*V6uj-KOny*(G=0ZMpj9(KeQB$G_ffTwb@F(&C;Oo38kbYUe;Z zqfCIY-SlJnKb$z%j??iW1mGY{<%njg%~rFmOKdjt6ziKUwT;?OI}U%n-?VADY1%Z> z7=UADZ^}}7RXNZaLy8Y7tICN@$q_Jk#pY$Y){`2U8ksv4*({Ij-X3evTNbrDtZbPi z`l)5CnjWjx%2m^I)#^jlbS~)>HN6!%$w5xC5LauOmQJpc>D?tgS#3#roZ3BEO;3`H z)L2U^6r874NAjnqsNKh_=?RiAUAkvholeJy3vR8Zw<NNo)-xiy$Ev<st-jQhtjarm z!=ttBTdHrw(d6y3l;~cBR%wauNnLvPe3>{J^)1;mU+EdWh}HTkx49n^SCP*&Ca!go zS}|5_9jj)<s`YZ!j9j(mP&Ff2t(c-_Xisu#YjTo>xO&sHbaItUPm}aywKeH+YFe_I zkt7+Zv7T0_VxC%)iOWb))5fbA36d{Ex+jWUs?MN$#8qsqX2|n*N3CZ>q{XTMTCD-p zl&s1-eZ!-*9Z;%o#L?vKvy|vwgjQ*Z?nzyG_X3zW8VxAfvjFKCy@+MUbyEH5D~#~( zE!Vb+>BA4XRy|gY(3aCLO*UKvtI$d<m!wu7ruyZm5gpa)E!BwDYPlG-Izx_F-G-8_ z(G@|~*%J{P6|}+nwvJOPc2Ip=%dLo)hJ1&iZ>n4W@JJ@JuXWBu?VtvVg7UClB7-y@ zk*rqlt<rKt++8<2<qplJlx+5f(d^Vx&Hj0Fv!w>y=jH+XS<A$#<*eiAB(y0x^gmIT zHxHfRma|UxjMavFbwV;Tp>@fOSN*W=F%#EGs+gor&MYJMl?f#$XNo5i$K?1;RU?L} z)zgxaI_9tv<I&FM)L*)_{f@fw(xyJn-O4jHtyLU=My+d|nA}^MPM0pp3TV2OX_S-X z&3gIqS=}SXkhmUCAhLPNAE5?RQ7utwK#ca@LAA75p$1s9!;snjy*<3b|5vp1T(5<> zD>kpt`}CWkrJbghzEDz2v*8TuDq41)=QOV{MkVG|Q%nEOI8={3T^P?YWo;~Tjhz0Y zWa3O$RjB59On7Q6rqkleh`mPsunuzP4bv;6nPQzRsX}n1oZL((JnM91x0m($LqpZF z#_gG;rlycEjf7?-kW5zIi}fJtNF*JXjOHo6hi-q#=t5QQd65os%S<(Hnc}-yzm&Nf z@t|<M5*dLZqBRwX?lTm$)+(Bedx|m0)v9+)+U6Q(X#E<AYNT&kE);Ww+E3~;)q_@) zYgd<rrpBi%52o@i%J5aK=GYP{S~^CRi85~dT8*eyT4nq^Xvob=$I*tvv`2;%L-{h9 zH$8x8T0^qaNlKK|KX*BS)F4giDncZwYx<;pdX=cAuK9~eWFdH}5lzCoOeIrMdKQ`1 zyP8FF4*TV5yQd$P30V@OYnqzQEv2Sq>Ud6KZS^IV5i<p@9Vr`&y=XjdX?yX1efs|2 z*?*;0n0a#@kpHXO?|(9X|0`RstZXywe9Pk@R57IWiqboeBUa)$?)E#6t*3#+cwWs@ zoALAy)@b3TlgoMdpPk&;e=e{!X={pS42ZQ_iO?3&DUvveWJC8Nk2y#!HPwyWB~$lt zYOO>ON~mp3G;1<c*X?R8tjd^&B^5m@x}7_lx>KIk^TIt-V56+j(&>q6%Un%mCz8@p zyM)pBEnBI+jYMB#l;cqV$?lu1bq;CVJw^2`uI8^~cnOWoBLH>$uV`#d-J1HjVuV_+ zm1u3zouZ19NH(M|3YocUtqE@wFPYNDsr3?(&my={r^JYA)}^~z4<B<UsYqIp?!(lY z)Xm&!d6_#?V<WDS(;10s>s(D}Cz8@pGX^5_TengJ8i~ZN$UoUhO`^NC&Y_OeQq+Lr zYW_-zmyp>!1yINTs?5d^`?knjzEu>-t;y_&&qP;8v{B2oY?vau#*g=8jP?<k#ai#t zTeaS;GW)Ej$UR@{W2Kbj4+tAg<I}jVv5}O;ZMM2&oB4NWvy{gE#b|SGsW#7<ZL-o@ zn||q56z}cEeCPIO+@^g^M_)D+^Q@cnHSwmto>Q!^uNt{$mg?beE`7~9aB^=au&?vA z%S{6RW`P|bGhWe})mxL;HeF&{@8=IXln~jre<8A0mk`-j{}rfgOxB`~EOXU>Xw}kP z^;%3LKgjOq??>=B$2OP8F3F>MJjRy*6+OzTmB*_UA67%Xf>a-T@oFf~rJ7LSCl%<G zbvM(X1_gO|Ep)efSl?pCy#uFfmVC?pWNor{dtzSq=%@0?z~?ZJX=>FtRn763PU%w* z634e;Y8fr@S1nUz54mNjd>UkXN2{xDuIiu5SBSA{T@pCyjq%3fmFEsYXt|+k1D;8T z7U#+RS9!u)sKIU3a<SCbqOIy5d%OB-c(hO}%UF<k9!~l6`jn1%O;<xaf>Ie3-;)9B z3Ka+k;_Iw^hFb6E+pjiB^7TkS8#O3R4QQ!GcT_{CssVX?EhgVvumaJ2)Sx+Pw0xNv z+DQ%2z7PX9dd48_8^{2@`$^@yw=S$O-@r+UNk$1Cv)agaBsOav<gxlBi;qgJepIJ5 z6xvU|1`X}32DH#hb}4SFO;0tn4+XOLn#GDiHJY#Proz3<K5Dd7G-et*;(}UM8#>F) z1KjpW7Md9?&vJqCQzokQL(hemND8p7Vk;0UKh{ysy32F5JevhrUzuRxH<m1xh_TsO z_hs_4<mv6?hiTgJ6EgDSHt9LJS!2_)#%5*@${mq4M#&j5DKkA+X+L7@@XYK~SM;c? zF~h>Nx4bbqBZiIPm(t|-z4V{98IqZiJ&~VS&mM8#m?48QN5zlP!$Y$(GnL|!QXo5n zHZruzQ}_Y@yy(WcSuN5Bj~J%)#jHrLc2wpVMShTnE)L4gRI;=3#tg|(_`QI1Ny*6^ zHB`yX96i?P#E3B?aut3qDMJ4lqMYGb*|}k*IxC~iG`gm@pjSM$TV_t)sN(L^vF@3< zd1D=!8LlCjaSTm*ARRDAOEzuvdX;7au9h=~56adC*IgTh-Y=PoQCWkAr02EB&5CZU zO~8;rxr4Nk=@rSyl{_+%oU07U%*oBp%gD{jHikQN#F#;&SSy9!8VqY6)%<RLaWJgm z=$xF)#(d=FjmeA~mN_Ofdqf7oLD?C@<M=_XhRvFUH5?Y!Ff}@?;n4BfgT{{IvrAHY zC1cPiHjUPu7W8J&s9{;gs_0v2P<C#KJ;VgH8<Cr1{Oo7($I5Wsf57;(C_PPYr<!__ zMHygvdl^yg3cp)ZV1}}4xiXsGwYBvqJ);@gY{XKd>D}py>S=n-UzsGAUdf%`&E6k& z^}dJcHM?w4x|?3JztX85uHHZB8fJIXYxY;qXok!#Q={oMyKGT<nBL;vcfWJL^%S%B zpSpVA)%13Cb*jJVE!q37uHNSqXEeQLf2H?b3(Sz&WsB0^^qO6^C|yl&aqo@aMJzdn z7Dij<e7Y$u3QDGnpC9)#Tva2tS&C^hhhWY#QKr}I<{hWp?BQ|OhPh>a|Elc)X4~ct zWp|n0l5O|A&4dlOwe4GW=3lkl(`<W&Yq5HoUb7EYWn9>8nsyzE;$inRC)oT{O^<T( zl)EXBu8opuv@LO_-|PgxO<~S~xi=)+&BK;BS6hb1qRccZHb=q+yEPL(j(<zGJIw#B zh0UTb+<EDx(Bno6%Z*P)WqOPI*5lUdiP3(D)-3;`QC@~?`U6~u>uP!<jVP;f|KtKQ z(4sh>={4JSQ=)E}J-unOmsMPayO>_HUaK<J-PK51alV^J!(Z+;dT%ywQF`B+Nn)n( z3j*S_-+<y1@|)hrjU+jYJqygx3L}<`TEWt9^6xKOt@19P;*)6==kD(2#y^lnSe!Q1 zx>r&7wGz!y<->;eN^z9w9VkEIjI%0v0R?7YS8-%mff<N28X;$7ff-n4M7k?^Ta*Gb zbfY--kWyfV`Wxq%yeE|cGjy;x_JUGihB~<G-6HQ4OMw}Br8st>rN9i;SM|IM)by@5 zqUdW#ff;D%q36>EU<O_@B57#1QecKEc)FUWt7ho2;@Hbdff=&#dmG}YflisB$;Gj& zECpsL--xBFrgy0kMXv@Hm;sBi9f)jOU<Pc(kpm0NfcZOwT28$qfA?<uZX27jhv^+` zl(8t?Os~0T^h?7G%`VPpdd+3fGn%1|#!^wE={38mXZ*Wf>gm3&_PUzh;(guM^qRes zn!6U5p?6$e=xch-b<i`Kq1mog>1%pR_O)xl&3$Ei%i)uwr+?}`iIu~tr^qJ-C9hfD z?61(z?4@}SCC>Dl=TNX_`pskLrZm3gNV+M}x12~frO7Sl(M@T3%V~5|n%#01-IV6H zoJ0{M<~e-9m{~U^roi-@3-6}1be+r!#xaz!nf}*YaZv@Pzp`-%Wo)M3Jc=?l(;r|Q zKpC6qm*2P)Cu1}H?#6=3*i8R;S6uS~({FA78Jp=hkD&DV=9A~E<O#Jyy~0A9)^r`g z;l{airM8t+y;sHW>;wKPfHrs!5Alg#{;_$<qQ@(4?%Kr4pB0c;Pll$aNZ8239-}IA z_nen}IMkl$H8+u)lILss%}qo$(>u%9mE7c}_YqfAAJbdB>+%|yev|!FW_nHVTa-Sg z*Q7qVOmDP-dYUx7<}E-$(`#M<6g0gTT?M<E-rrnNeN3;pJ3--Giy25ZwkkT@^uFkd z>TY_?%}dec7BgU8CfxF-H__O<)Mk1+x}y4-Uh~3X1sa(ChQ=1BGSl1671h=BCb**d znqG77)3q-ZGw`!3Usuy>UQ*=yRWSqi7>9%Yn%-KjsP3lMyvekQGXoc0`FfjP^KK*G z^A<A@?t*7`(_6<C)!X!%r;DQRTFfJ6esV{+ye=Ko-QDn-D7GlQ^u2!T`${A0RafaA zrdRvdYqSG0!1R7oUavvFhs@ArBbHn7)&}$#vzb?2&2%-rX5AL0pXoI#*6$iKRNPFz zziZ~atC?=5*R0#BEL!)l88EAshPoA)q2h+R-L4@y>K_>mn6<MGrgyzD8(KqKjKCh( z6m>VfW@}o$TiY>PFtaf|w`MBth`DI2f$23Hx~;+D*6MGko@w!zG1Bi`Q`*J!nzP7Z z4Ke*@cNx_tleDgWqrv50M8a)$&BraHx?QGQo@;N-#PJBb<>o-*|9ykE%XCYF?)pFG zMAwHHH8R50w~P=zx|)1DNE@m=AA}W{f#QMR@;IvJzSDcS(d=`^CyY0}&G|)5arKl3 zmBsFfk-=_>!Pd~4UPYCH-NLJvFBe(2j)&4Bw0y*OMS<l5^THOp*Df&2#2MO<>P+u2 zBWkzxuB%I|=_`Mn=KpK&T7cucs`Fh*Bnk<bkc1?(1jP}FOQ_-)xmH?3<Y(+)JB#Hk zT8*OBO1qX6>y_2YL?kAThc_wX2{5LRnbiyik`4nYX<j_0CO9NeN=&IqN*)lPAx)ZT z+)0Z|I=JWm@A>ZDd;eedm8M<EcXwx`bN;jUb?&+6anIe|`{rfMMX~rZ4ZF^87{)tj z7&OFX&4r-KC6i0(->wFSip^B8J>YIx^9^CuU5yU4mQbzJjy5lAu5ag=4|<*J!0mdj zBhVRM88GZBFq2`|X^Jwe58wcG?mp!<%dR8Wdu$Clbe$`cW!EJYW!Y@UwRf9c*D2T8 zZ420S9k@A6*V&D-8>N(>(W9){U-DD4$3tsi3(j@^?Ru^YMHhIbR9bSX_w27OOI}Uw zaFvZM(}k?WlFv|kC0c^IPSzaqaRZtllCUN1x<Ygvs+9H`5r{qjf0fu^*?(O&*o|?> z(CEMO+acdlH4a&FS{=G9dG%k3C7+@8O0)!Zy@!5hEqKwU`D*$Vvf!0jBq5PrVDuRM zmSXTCQt%6j!D~PLI$`jlgdEWO6e+ptEcxzxIB`IwfL^Ca$@9*UrM56kh#pBe{{JgD zZ*VRr3lgFmXn#3>;2I#6Q0K4Mf>CooUo0Cn*XC^R?YjHX6|PcyOSu;2I%2z?>+VG7 zv{IQ8$*JD+!7yXs8e7@Cx~>Mj$4YIXC9kGYbCr$Fr|bOad{!#<lzi$&4eELcTQbt* zDMk+}qt<;s8?)=#l2NJeGkPYQEh3FDifkv5_Oh9JWOn8%V$AA#*?@gRB|v+C-m6F{ zpbwU9nyWZUsIx-Zv>u>;u1G1MNUBhp)U^kDp)6#Ds6Sqs)OFxC!wcE28w~5J`DkeL zd^83I%ckvfm6R=E*J;uxxKjSiU^ix028~AEh0>%xYPQTS*@E*?r6s5OQu9}rC9nP~ zvE(z<UWvw~NqtmX!+KSN_8JUVhY}ks`>)FeyD<(KY0`f$XB2$Y?D&j=j}AGSQSjFx z$7K|JjH;s<1*q%goF=X9kmEmy)f{tf>AFI6e^{x^r(v%30r;!L2Fo>v42@pSnqAu= zTc52w*;Kl=Lw5VTti9h_$Z4+V4jJnDkUF>Q0s62ar4Dn}KdrL<JwUq^DK*3g0rl!2 zpr?tCFz-}HnLUs2LBKWY+_L9Q{E_eSC!izemi*O>NbcVtsDps-tE_(-=noYs1N0~5 zg8)~dl~CtemGw^pMUIeS8rSCRwd1;l(LHRXj)x3?H`jsN^;~x{I>VJZ_cIvQ2k@gX z>+c$l*(|%R4ZX*CNrRg)jjN<=c3r1QXLnwr)|ey%G+N90yGqZVhJ~!z(ksk$#CAQ` zg`x|*QYsydY5dh?$*ccL9F1w9uE-JA9CCb;VM$DqVIga8%^`<2lfT*KDk<AOpUe&! z8jUm}B^i8l$njZ!*AT)Mxa&fh4~HDh`uppU<Ffv)vaw~lkd@de>+hr58ve<an2*|P zFsz#of0fu^+5h0$U^ixmjI964a@OBR&93c`T^){X_FPwkZapfM?W*1#GSu}dR@>SR zxwb>regfuXQewkH)f_T3I_<YZuI-S0bja1aLx#HkOr5!>f&N^PGB5El{0G#TdwMUQ zxxZDNxu@Frto@)mbMN>CpSkZ)XYL&zjhwlsjkEL<KJ4NH^@94=a3|0YDN+*X-!SRd z?mt9!(t4p1nEf_0{gj_f%lNqjF27ezA_lVw{v3#>B9<1p1TNc^E$aL@qaRb>4ekW` zc|}S#v89?&KX}mjJw^{Ji`5DAw~Cb9!N%)m^$p@qpr2Bt<Qv(Zy<Pog<P1L@U$$mn zVYBs=vQb??-%*yOzj@gbxa?K3?7E-Pqe^gHTUc-(R)Xs~!sr_1SJL|!eL;yN{caXX zR*7U*e&u&8o}EfODWI^b<U+hprpCDtADN!nh4{#=u~#j@g}k$Dc6?--T?n|uXR4|~ zi^1#;zeUVi3@(4q+|rK}oys2NHsx7TUu4g+M0u9fYWDm8to(o1i|ko;E6>t(JA0N_ z)z5`=0X?QjnX;#M!(PvhX0LKMX`q_JaZO{}dlpxP*3;kf@`2tshvOsDGdmm~xjmu7 z@sa779gdIOnj(h7!ABrzTk0dzti|9G9}A<H!bfgR5rf%JmtzVanPx2pmuIWpYWf0> zCGJu&MfzJDQ>;)iMH=W|C{m`A!;Ak^VMfO>4m0jhVMfQ7Im~EP8`uszl1S9ymloSO z@Hj>M2fkHg6pogRxvV2mhhIW_u-x3^yb-pVvrE>Cn;If_TO{i6jjF4e2^!yT;v2L} zQiF{#4ch5qYVb&WgLX-3@Qg@<imP)a*29qQC;^&Rr0alwtXY<pcg)}kmy#amjv2vi zovzw^FHp2iasi5l<sCD4Dt8mPm&E2~tLkPeP_!Lh>4FC|E$^7YQ@Nw9s$mTY?wGlZ zJ3#An#|+R;o};j%0e%=~NWV7<6upJzwB{K_4=5J1Y=e?02BB&4Lr1Z9%%EPm`D>$N z2q<mL=>|2WNuZd;;EoyKXpgvxyJH5$vT8mevaG9%7K&W?5-l{t9W&9kA{{okbl4!! z(sMi!#9{m$Gbs4J#d1c28x-qGcq(%~%S&d;;`um_;NtTnjecboXsaS6fqsigm%5#S z?5(3OC6rL<;qz4&K!2)8Nua-D(o=4CSA<>I8#R}N?`MLs={vRQfZ!Bz+!2&CKb_#R zHT+yqjX!p`K~BYDqRe^lc17ng=v?m)xpp~!4rkir+9gy8Co9UeK8Cx)F*rA7^X)u% zz0a?PeL7E>$+z?Rit=qX<lMi_v-4!>Jl`4e>^yjLsLrz-<vB_zLCgQZ+Ww%&+AjAu zwgjEUU{`crGrH(2sOFMgy>rj?TQY2Fi?fhy=`M7|mdu74EzuHG_>4D8pH_3+$GMX) zj5=(YJ1-VpsVb<^_3c`?qL0CI#Wwh^68$!Kj&a=3@*dW9pB=Z%TG`s_t>c#LR*`;7 zhO0!eC9|PMOSA+P&i#?vmjf**Qu4nUt$&Lu1@ufsO5VZf{tHwopx;oW<odVDcQ-bv zQb6CQNXZu%ed$6~3h1kflzfmgA}=s>ydFn3Da5Ba?{R}la&!Z|MUj#~e_PIbIIDjN zl@e?!6QUdFB1K99{YcrMI(K24riC6z$b~oOQQH+4daNwj)eY+3&Mw<xGwi%D^gb(? z*OCmI2Gv<eHnYwN2c6jprgbE<x<Q2se_dJ6ZlK>$q~zQFSlXa1%6fJK?N+4ZK}KK8 zCX<ZE4UB$`?IV%SVS9*#Fp*j>lFjEC&eAT5y1UsjE>>o+1L(UrTSMtzXH!!`rSGa- zZwF9hfoRL<+@8HmoY$AWOy(;SHs`_H6&Jd47~2Sa<{y|{4$|h^d70>a&evAiG=$C~ zvw2?VR^O0y%$5;ajzke{8J)#w&&5L5c9|2K^Qi5L&TB?r?iKWbl3l%X&-Gg}TqTMv znGH2sqH(!iZ&leaYqnxK+abH+Lf2@6>nc)ggYPQQZ-eI;$BkU?UzSr7-fDY%YQkGJ zkESL(cieHQ31?eu8}Wr6kw;S#P~nGJm1{fh;~dh4A6c?x?z~uZr&+;J+%V?)7(7>O zgYTN-UQC}TEJ4eEPz8=#?o4cL_11AqcB@FgCBs#s*pgX&#|;(kRR;(i@8<)AV+`qg z0I%aS)@gOt+VNdJEm)^c3sQMLE%;Y;ikkWkpAwWmN!}xm56b^fcv+7+F<7Hc4AMZ; z<r4#El`NssuhfY_8Yps!6u&sPXWNF8%9GD|@OH(89<v<(@uE4o?ic-FO;&n`X{g zWVWoGCrh8_`8p+uNjyNywG#txwLLz5akf#m=$+S$F8T_7L?9Z!c&^`Z@r$#NZ0Rm^ z#g4`=P+{Z}YmWOkiHGnjR<_KY7t1_pwBf+?F?g=n2H!Qu9VQ;2<w!TuQNOp2JO0GL zTgM$eG4Nc!<4z2mZLw{{7rNtiIx+B8l?_vFi_Tk(Hn^@iZc3c*@>ahMS;y?Sabob( z@`-`B+Fsjn`<+p%@*Ou+_?hxizqhJvn6;YY_B<jtq+Q!_hdXX)`72f6xNAFZza4j# z@3^7Dx2mK5^gce~Z&F_jOt<n8{{eN>pL&{)`t$0jzvEUu;y+D&JG!HVe<rVd)SoUN z^1EZN@Ye%>tq%KBK#wR=66kV1!he1iKNx5Gapz5$zK5;gk(S|>O5nJiIe*q;&Sj)s z0;^l9PT1i1wki;|w9X~4x`zV}x)%WGUPVe?$~Npm^%<oU(90Al`9nqzDD##AdRUQ? z!))m?>Z{OQK>HLabru`HdiCL^E}*9<QtEz2Z&2Tk?gDy~A|+j|;n{5P*0A^!q6_GI z6)6eyp7J7bHfgpkJUQ~nC9wLuS`l4ac}46};_m|bNkvK?VRWVPZe6!C`iPQs8t7p~ zO0Hn>?@+Q%1D#T&<dcjxs-KKayUJRY+rbh)s$5+sP#Au4b<R?<#p}FL*InIweVIMZ z)p^VL%&yK`md&^ZuI~P_74w#Jc6DGCA4jVm%?8J>R)Mftv%%`)%4K!l#V+g5lz-~n zz+uU`%0G2J$LP(<8Fd1^MUhgsv43h(&ZraUMT(SK%G<S{s92<PcK+#;?3Yeq!6if* zsOF!X-Hh#@oX<ja|1@7;f{OD`-f}*(fAW^)6Z$7_IiJ}-dCRgXZ1^X9x|EVE-g3^G z4Oa0HI|@d;W!V%qIDR{OW}k)4nhjR>sbD1i0}e*ks$e8N$ic{CDp!*J9}Y(LsK}#Z znj?>kRhZGSmcxuERhSWTD-wQS^I0xTmjqqO_cj?ZNutg!8FRf%q7J`HcOCah&25Tr z&MrB_tw{Ll+L3aD>G%fik~7?jWGBdJgxljAv`fa`iuBlNa+(_XW~DbUywHNp{Co++ z<rchxp8+@WGhi=213t#LL>*%Ij|>kpe4OEv44+|W2$de5wZ;!V04v4M7kPYlGW;sT z`xt(cp*?<#6Y&3Pyzk=qUSr8&CV4<EIW9j}esD|Ka=un<B}3d=X7i8B#lFVn?q!H; z$?WpDJM3bfPh7)(IX|~CyprL1hPai?ZVy+7&6Qu=DmBOlPU8&sSP(ZD-NtnMvM*qX z>45lsOTe9+3w%GrDTX&Q{2;?U3_r}!=64nMgYnw%|7-kL^LVad*un5RhB)uD$6KlK zJ;d|!D8pYd#NAhO9Y4Iz&)7db%@F>|<`-^dEBlKyLpUV6JiNv~a5?PBpWx?TFno^T zOAO(U?DpU^=F0B{Z<8&yG3;fy{}M^Ro8bY5hZz2xp*@}xKi7+dXse5ss~2^mH<n&6 zJ{L=G5YzQ>?Yu^GHN??R5#zD+Q^np`dZS3bCaxWFVSHnx{%*Z^t!Rp+pDxB@>1T+u zuh3hNc)g(TpgoTMdeJ@@M_(j%$I{;*UfvZ~{!DQ+mQEL4elV{5S)wtPezthxmbmid z5_ZSY-z3^%>8!d|m3qNhrwE<1P!T$ZwGleUxDh(Xyb(GFz7aY{!5Te5c!M}{Oe2M8 zaPMlJh{`><jx?Z8Tk9bRq67LbE&2+gCq#MPg8qWn8v09!s2r~+deBZ2Utb!O4PHCx zFF}jeUJsuodffQGK=h!UrQFWV9JPHtZ0B{NeH$Uci}mInLKE7$T@t=2!~+C_b`G&< zIyv$^$mQFSh~#!21wF?NF#SiM_nP!Wpm&?}f1<~5{5+6p?)R4{zt$}O8_<&`{dv$g zne=}HeS=AV8T59OKGQmRB`m*4tPBKaz2f9jM-3%JR8JR$^r)Vm7cQ8n-MBO?e@;Xn zS1?`dHV3nr=+tZEl_7dlget^MVfm<iyLE<kK08A@`@{0IewNEl*0Q~Sfa!Phx`Jl@ z{S58=3(*(Hj59%g<&7f7p7$4u6UE8x+gtiYE?>wG3{4dCg-mfI(?2{mnx7DvOl~YQ zFg(_m9nR#6V}*%KcJfBiKQ=NxoG<2cElcA|WVR2D4rQ{1LUt;XA1xN9#P&jVB%jGm zj*LuE740cQC5uMURqHxvIEA6>M|0Wy@O$!89r@zq_`1=4u`S;!3jJfFf{IYP{e`LV zA`#z7e@p4_a{5~qzL(4MdpUY9NAKn6z1%YTYo*@TZ(X%{U1r^uwV6yX{E4y5V0JV& zoEMq3=`E`^Z(KvvtF~O5S+{|UZdkjONZU5AL8YrUU9)=Crpz_#*LSSjmf5yy^`><h zVlkg@Z@+5O#?@;w%UYJTEEk!L+csy)^GXc_v$`$Y7xWcOk?7A350CX*wK4-EW22dg zVzyAE5eB?Ud~7^l$QFl~|B2$*c&1DW`+@|`o-+M6W`pjs!$TjiM;Oe$5G@l^BgJeV z!D2zeL13d}#eB=a=wwUZ<j`>LPls|Md>YJ742qWA)F{=Iuvn1q?93M?f-#20_#s2@ z74pN`paNs#!$r{&_TEy=-$-~kA1#HkT(+1ME%`xSB!fAsizit_t`=DXcu*_of*J^i zlN}lAry-0{!}PBu?5%HNLbTA@9ib&jh4Ouq15`abIzS7ZABRS_2leG!eSL-ePCN|{ zjpl*V+yEu%0p*rr)Nj_Lz>}X!e+UN=M*=omEjC!sE%f|f$BvDmelH_{ty~^qWusNU zjh;`ZKh#HD3fM??CU^z?1}N$yl4&Pe&^GELeg*s{y{EspIYkQG%`t8Kh;spX^BndO zR6;+1*AndyT7AUBfK5RqdfDTbR3UQw9@<0P40wPG+VcngN4frLE{FIUuve>3QDkKP zZX{YTC+gRu5HB&bBS2gJ6IOl1>ws|oR4ja1&4=N!-aq1c!2L^5)2t8bhX~Q@BmM{E zFbl;IUa99#aDB|bXy>;Wwp;x-@!J5m6B6`~`q)nZu0%nG_WVr~U9XRQ2jGF=P3?vC z57J)~62!n*ABaa^9+4&N@^}WkkBTkQ>SG^s)Up0UR5utR`d9m%U}4e={m7^2^JDZz zu=Y?N`=Um!e~9_VyrDg;qbI1Y-aqzFPmIYPmq?)gqdwr%R(-LXi;hd!#*YA~2lyPl z5#Sg<_G4{aALUTr5~p~P-Uw(*QGg-pUuMx!A5g}-Rv~&E;QsA)Q4clhiD1)$_x5r9 zJ;CDAUUpd-Cu;>5J)ifn_hMq0Zr6Xy4E_IjkF4<Hi_Es|`hUXpZ9eb#vaB}&#kBfI zJFPSHzvwPm;l*c;-~W{})c^fQWe?NJu*!DOFIo+rts#bQO@B(3Jizsvi282&!+L`K m5A2&Y#Y7RJH`oBs>r|_8yZ>N28drZ{pDY>dQ}mbhDE=2tNX{w% literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..5f08fe70a46570491e98266c72677761392723d7 GIT binary patch literal 106384 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%0A9q8YtDfLK~utaep{6PqTGn;|c|MI*fy!bmi& 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2287d2ebaf45bbface2591f26a3de725bfe2a40a GIT binary patch literal 46464 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 F{|AoK46y(J literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..ad77ccb14d1faf1bf9cbc289bbb6bbfbff4484df GIT binary patch literal 78640 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 ZZc(5`QeevkCH`opSlT*TFjypo{|B?PrRe|w literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..730e178e024a73529fed764615ae91fcaa08e6a7 GIT binary patch literal 57408 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..847d82408ba99a771be4c806ceab31bf6f88699e GIT binary patch literal 23000 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 bxY^)dGj(WU@rx$Ae)CpCe}hTE#ESm`IH3}L literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2c9b852c4dc9ceeb168d0812b4187c228a422c40 GIT binary patch literal 26864 zcmeHwdw3MrmFKOlu2zedx+Nr_!Pqod5DB9e!q}E<VI(1-S_qJYWQz@?tw-zO=;iJf zh8P=$hld`b1TwZWNjz>gJ5Gq>+3{rK=T2gb9lyroXT}*j8=GWfuaxXyCzCkjWzFy0 zx~E@i&60oi+iyQzeO2du?z!jQx>eP6t8`#v(<Ymy2`;+0UJ!Mvz~a;@!RSp20jL#K zA{YB*VyV=%Cq>h+GY*TzP$<7the0AmXTqm)EIWoQCp%f6&ytG_xY%a#8K&A%C>P2t z`Gs}qutVA1q#)Z7Np=N(OTXayboeR-gu>8ikupY#vr75Pge6Lkp==X)&F@8f2p{!X z3YoCRVhe_B*8)40YNhcX15SIZs&A&eI92=%RdZ$gicy7*ZS%Hv@rT%|r)$;@ef9A# zzgql-1--lM>mPcFA|Ux3Y-C6A`R=z1o1<AHo(r2B+m^Q<{94}GZ<!6|H;+9&{tNfd z-uS@%@R9pDmC%@8z693X>1?qWJYN?6D0tcQzc2%z;`L$6ECXO<^V2y4zY2UGw#?EB z#<EN%=m)UPMP`~8SVA@I#2t$N&^(LZMFFBbf{pYKD*dY^*E+1`;wa^Dtk`0{)Xx)- zDShVOC;2YnQ~VVy2nPFxMuvltXlFPY42s~u@IX`qdjUi+(6%+$6AFj=1|rc=xNYl( z!I9xmTW8l`$dYB31iSZkl7r5{fzO1*P-tjqWRHa1qx(cK*cpk0P*rc|z@XT$sb1AQ zG8zhZMh8ZQMR(`m;7GUV4TnNf9vbcr?;DLuyeE{zBhiu3VA5=GpldYR9}ac)_#-3! z)dF-kVONXIO@aCi!8QKMwFz{M|0=YfhQ3Yib%kpp`DZ0agXArsd_3KC@*WIxUHnhQ z8(TDhPOypdmb&11hX;3ap%SQhh4}@F@66yceQv#FN5_;pL?vS)g)iq<<^IDIKG#8_ z3n_dAnke2{3#DmT4K>N|rSR$4=2BW~VWiJ<5^+}7(q0JSr^ZuNOI(XjZQxQ{Yhk2M z8yB<I!ibj|C(CEyYzAgCFq?td49sR=HUqO6n9ab&WxzcAzn$iB<3|-jm`Be<jfpL= zGY>!GeA=>~y6PtoO)dW^_MRoRz=-ZA;pDj~l;v*|O_zw1uS)uLqUn-!@{FWkB$_T2 zCm)jZS)%C@aq^U;pCFnp4JS`X`ddWPCE?^j(B}BMZ-8Nr8($?*eIYsz;jSPY;pR@A z^DH?CUGcPn(BCKZuL=_=``C<qXg+m*z4_Dy-PE2nU;8*(3<tl)eHA%yPMz!ZENMvE zA6!=rJ26(#ZXRCuCf$9RvG<~RaQpTuAtrVsq=|m)o;3=gr|sr?8BX2?VXxn_<OoG2 zPSo8Ph)vbq5Qx28*Iw7wz61F-&Eq+N<J$|&;|H7#v4#@6dA!!U_4sC=8QWjtG{Gq~ zt6%XP`Wce8_2@^QBYTidv+P2zXXL8Cb_)@R{mP8JL3#yXm46wmWQFGO2KcCc-gBf? zT0L*ZzDK-*rt!tjt;cWl2CC0*8L#mMJe$rR-d|$ZwvMlwvo$v9Ir2K`AN^O)kv{_x z7;h-i%-Gv?|NS@A31w%^!@qNz<Lwt}JzspbsrqftJ!fl=yy-deYpL5bhjh)d7fH)= z=Q;8;-achfHZ-Hx^bB9<4S0rsYL0KvDqlBalf9n7|3&N{N}2i8q`mSCc<-uyM9ZGR z_C~Mg`|q2F&uafx=NYN7gY!H%?_m39;xrfn=s)#(K6uVkXxGidX9~>f*KR#4{YTz* z_Ie_3InBdA{&4GfQ$8A1oELl99Jjm7>VNVaxs76v{VY)S;@0v1G!;1fd&iz?IK3k; zkM<4uqG`Mf9zJ-g*Yl>`)f9Wp9Pc1!7XsP~ruL$#J+HkSsD9CNgzmxXJdfnAnF9+A zTG}z^_%@9yx%11Ac^+xh>ed7_NNteXj+xr{Hk(;J894y6fNf2q4I&*P{g`PR-=@QI zPY;RoHH|t%c8Ki9OnrQtokRf=+1E7MAu=E`j+yrHZ3c<_Br?`C8W1@kavU>_@of$g z6_LoXrqKaW4n#S}Oa}&r{pcCbk<TGYIV82oKx}(KpzOTo=(qkjHC1^AQ-S%(-F3U_ zcGrEXF8K6`0FB)ny-gT>*gb0=Z^CGeJvUWw^vu{BP4MS6j}Kx59&alt2#l{SZHhf- z#@b4J6GeZRnhHF(S>7i%9p6>rt9*e*@BhG$K!8_00~m;%ncRt5X`V4-@0hWl$!g59 z^Aq3uJ*;ue$QnrhF3Ya`UO*F3mz}4;JxBk5Y9=>g%<_CdPTn_TO(j+2Y;_ZYLEwXk z=oa|IfNw&m-X^reM}BLR-v;s<dyeW`O^vMb9GxK7Z+>jW_XN#&KQ~Tb$Z4KOOpNuX z(Z@~mrUJ2Nj%}GTF<LNck@s7FG<gqfFwo4{zcj^uQu#vVN0WD>l^FMTyn$olj+Z9K zpkR*YpT>`3PuvQ>=J-`Tz%l6z0ZjbW@2E~|LaDp4?gpAk0<rJQ$;4}7hPdnOR`lXs zXPjp}M}J86u|Jwer#weq0p3*I=k*-@k>vhkp!y}xp-IAzzTi1>4oD#O(Ua7a@0Mb> zHTJ!U>rh!Bwh@BoFhMFGvG=9Y#AQ;r*%!d1Lc*tDg!EcM%@QIaNa9lR6AXdNnqnUW zVijiD+kse6PH#>g2NUOiJ2gcqb~eR++!XuBJid|6Jzg{R!6%zyXA{FtPSRHUAERJN zCuLB|@d6fPHj#}_KjNhDAH#t!e*OgFnkc6LVp9{#0WJ1_=}k_io+U`sM|H@odGvMc z>zrrC+{kP+cVp$5$)#xT2^r7RNt0>%^GUz3PU=lkd#&@0vO7W2E81~JpgzNK)Qr=@ z?Y@b-FJMF*zui0WSwax#5x~kbyPvk~C<QogCr{I8&}^B_z-$I)GccQh*$m8PU^W96 zmw`yQyCU3qYp}bw%ij$Xz#Y-fXsG=9u}G+AOK9JYD4v-O`D)hrBB8#a&~P+37#bGx zX<IbhIUKPbxFss%=U@yyO2SaPM8A%nUDFNzLmx~{bpU?&;ndVYz}jC=O}$F|kEW)2 zaGiG!a4%p1?m<6G*L^7T%$bVznO33gEzmB>%W<B7tOPuI_S+1f2LXk<V3XV1=yBcZ zJSf&Lx^Cr_CCiB2gslNvKk78?K<eEEpSNvvdq1adbo<8b_3qNo8g=f~cRK3aRflsL z+y^!NA=?~x6?k>-(t5YA-tC1=z1vxjTLf_e+g;@ES5s5+nXL2&ozLmeRsI@M{59LY z4{zW!q<h=q3S_NiqpJb@P19<hiC^cE&mv2alLq8-1!AK@{ZRwnP2l+@M+h%qGkE*K zlh2JexeM;J4Y-|k&nk^sFq?td49sR=HUqO6n9aa!24*ubn}OL3{Qr;vUU!(e&Jec) zvb>-m)3nBsN}dH03m)?o&Fe`QDw@|hUZQATbGV4@)w)KyXQRUMUw=F`LiA1a8$AlI z8T8S;8VcPvQaPpMcs?S_?-ZnaGAeX$Lj?~Xtx{_NWhPE5Hs4S3T0>qI>s1voe^dp+ zak4$HMdbSMBuB<ytMu_CO46K1+;&QOk&@$qfTR;~s<{4d0bb9ZS>M&_27Z%*Hz?Sv z;2s6<RPY`JH*eT*t*;a-!pnS>tNmD1>szyWP37v!D_8qUTSGlQvoop$<&~9X0?*X( zY=(-J*qhX{*BiK>r7XGoSEyMd!KwWK?7WrORbk6!C>`5gTTl(T?#wxkKF~GiCkfbc zzC=uW4*hnZYmVKLY2?DhZZ`&oqcAYu1JiIqN<T(8A~48ten$E-&XK+|=T3keC%JOk z{+d{;y|o}5U&hY%TQKZS&!fO|oZrDdmwsTO=W}!9j&9NC_-QBKNyu?t4%~GfJD+_{ z0TFpSu(P}7eG@h!?;-5$d6IDEHIO9V6#yv6yNx97JaXd|jvoW$IKL+M6o{;L0~F`b z4kAloEeP8O*x5Zgaq>&GvfQtM&MQI|w3P*fi@e9M(^g5}&b*yOR7#>CZ$ISPm2PT* zH}6`qSt|)2s@M*ut)6&S>6CEyYT!BcZDil$_yIVcqripd8RCcnnkEdt`xb!TKsbkx zIe$qznVUkIW*iOqUU->vfY@?J?j$A(UWApgQaYelEixU<{UPKzKhg5Huuv3T4(psZ zG-=aEY^uttuXq6J+A{^zVVNuIwR>NJ@;sUtv}Y;_=Q&~iSJdo55zPOa6k@@HDTG&R zx9y?2oe!dxg%6UWe~?vWF8bH*eGl`(yc1GmB~>*9v=7^&fnlM2=L#A^Pl9}$SR-Rm zp?!Bb^+zE#7q)rL5NJ<cPA%&OO~d?>3pjwdCL1HA(4e9{mAAMGbJO2L^Y5@NUIpSU zApcB+55#<gF&Eq7c_4NG*-k_*h!a3Qi|tY@%Mh0~({2}bmxWd1HzQ|gy#8-myH{%i zX!B|<04-jv6`<9tb!e4{VIhqk?b|XXneQWL_fq&)O1>>q@(OBv0h>(8!!jjHk+n;( zSt)r$rX&J-h_WeD@~BM7_dq|1O{RovvN7VLe4uELTPZ0*#f8{pO0ENP4H1-*y+EQw zP)Z&K^7lkgN`49CJhse~tp5{IvKlcgsiQ!8^STK<0mnW$D0<6iP%Ndv(6^EX!%{g2 z`b%gK_+(25mQm;XUZa%WypkRtFO$dWpgdNW(bS<0$s>B1Jk*CJemM=Y7g0~HUgZOd zQnGwNXt&L!V{X|Z)T-?-AkWKQ!A`q<F4ee9P6@X!CcI?X<5cCrLJApW1<jn~@e|cR z+`>VvSa?6_TqAor^UW6R-a3qzd2%wkrh+D;>tJyOwnYPbgjThN+WT9Oli22!QAE{O zP(<Isx#R2D=E?S4D|wH>)dS>?egoC6yOLaY<G9^{trWP>))i4I7vp?hjIC@Qy(oi1 z^Tkm(!?@KdF=}njQc<=hMflZJ;eJ?dPZ2(uDLkZv@1fpFOK7_t&fAPTL_{pZ@nGx+ zvRJJAy3#C0bkhzR`^m=+IIN?lMU?3&lglbg9ZtmpR|=md9hx(9oYc%K=pf=#ru-Qk zBFr|3N)FqDNWorgazGon#(I|s8tVTI7g#5;$%EkXd}I`xoH3pSau(YvI{IyHAwDL8 zW`TMTRoGV1Z16OY$FY^)27<~rQ0c1uAX+>)q_C~J6U0b?5TC}j>I)#g0pxxn?gL@q z65(AC<qv?k2@ZzH!8bvC4KHT>4K{y3UDa)X1i7`J{41F)`^nP>9Ad$clG0fSX;IR) z9Mak&`@nwk1QbQtH<c#k<#U!VBO>;Q#poxR!WT@XDA3^84~J4B7MxZuYSHNowdCpr zKE#Rwy<A=RBresRx1uML$C(fnbTT`G4OMD|+H!Z1OLt%5F4X4c6rf9O^M&rd)^(k$ z+7&3mHAjhXxvqx>&g2S(o#6o&=gbv?baIFy#JK|X=FZbTu`p1ifu3VXxvNOi-7c5q zl=yl1DRorAQGSt@DtFsqaJ`G1CXGC$Fj@@d0>8F?A;(Bn)hr~Zh3V`+*A`lQ%pFSI zsCIoqF^kff?4vlrM)S!vWu?}8Pra-G^DkE$D6%bhv>xf2A3LPsgjk6H763&;3HAO3 zxHj*}dM{?7>^{F}`NWmF?&NeUpO;(;C#~9J^)9Nu!?n|OBOMclsN`BNT?-uNKC8yN z>lYHW#E-05t|)Y$i?V{FikZ|yOH-@El)5%edO4ASqO}Wch`WSN@yo$UgokNX)2yET z#8UKZ1)?fV^`PP}<3vyZD-$sib%h^Ivy!S3u!@?Z49i`Rwl5$>zhy>fg<q^kw+*|k zhG2+2hWSMouL0Av-@Eg%m+u%OUJXwiMa9Tyv?APJ(G%Je9T^#ngren@t1H4IBhiYn zNVo#;=2i4{cUSDKx;l9E+VXIyr@u2=J~%KuwzmR$1H;{eV?7}ub(s*!r<kZE67A^; z_4@ni<^nh_=z-%*--TBPKOOAqjD$c-z3{+rpCz+iJhX7wAP5Vu=^7gtjFt}!Teqx6 zp2)TF+^N4OG>2vw4n4oa$aCls&G6{?KQ)Y6qj0m4r-vJf?lAJ3jKYB7xe=N>i;4}` zUmE!iec_23+w!?au0!wFionf-r$zc@ZyKfjV2&G?g7$7P3a>Z3rjfVJDB1z`Sh1y8 z<hU7>cEVV$M{T<`TghB<ng0Zsg+}ofqqNs3JY*C%8l_R%FL(TzQKT99w)!IAnlZoE zD1H#w=Ox$q1EUyBvT3xm%ZX3C+#2{jX^9Ud#Mh;Xcm6*o&Ydr_nd|s&k+IaFJ!rTb zdXwg;L6=<9YiJd3QnI%Bi;c@D7t}=OE~5ZA<*?CMLD+r93UnM&_p*_%f5!Qyquz1C zp%-f8(8#YbmL8&guH%!k3d5y0H5yCxwa!LDA=cN{0Hu1#YpK)cfGF4TpN)LyqehWq zJ$2tNPr!*|i_D*u`qB=gxCR{~Go0(FX}r(r!+6qLwI`y{4nuQb^zo&Vz7azY14nas zjLV(#jFr6@U(UM>CjvBt&8|6KG8RjSf#lrQ(E)Ld;e~WQp<93!8qRe<?=t3tTl~D_ z&S&o3mafH>PW9Xq#*!MtXf%qd4P(9Gy%rXqFDfz?QI(FvJ7wCn_l&%Np{+CWmSFGm zHyU~6Mu8rD(9rZ{9fuwS-qi^FvW`Z=dkJ6E(FpX@Xd;dWm;dl#*&Uige@7r~MiF}M zZx5gjFC8f~f>%YIhhX<24!{eR{QgY&FCl*&@}nfD__Z62IVFg**HPnGck<+6E7}Sl zYToBFw4e>I_i7QmmK=;?+Q2f1jQ5fGWo7jaa{A(liqY`M&7p4VP2`ld5j~yJPPu3z zZAAq<H@9wVYug#z)V^&)TVVS(yj^WgPqe_IVIaIwz1Yl4GDM_*BpmgP4Mzt0hVfGh z{YpVENb^h2sp~Uf-k{!vR&07p-?yRinv3~a##cUsm$26WM8}3h>-s{&q3}RA$j)$g z|2oXd<yWuumG}9|w_oWi@4YqLIl2e1Ij}*DwuT~OgHh2FibTU>-O-V7+B@2b*t`2X zElI{(+MnhHCjzgM_xa>5VMGlc!>$UwlkLs$uvK?3C@1WJ;UKz;-YM@H2%}r*-EsNS zc+xXD4A#>rp&n-hv0-4eKNQ}cc+=d<Hz{>XiAY4(Hqs9LfjzQYk!$6CIJ7q!#LdZu z-ma}9Jt4V}#=6eK-iIqnDisQ9qMgz03DymaHY=80;BGn26#py+TgzGI{zF^_Qz=Y% zY-e<Cnn$KCODbBHnfvJ;+p>9Vi%<91mg&o)r+aM4=CLJ<$Ciur*qY5_YZj069fq`G z6C58m$R;Y|X(}LaS&`7=sx&b}trurJLlQ2|c!oZ?IO7?HNT#txpHU<19R)EI8GTo= ztTD^f`$@%%_1KopV_ST>#~DW0^cY*Rd2GqzafT5#-D7JukF8leW*K4ZjT>YWtFw+U z*5j%$!Wd;!%602S8qbh~%wD0fJ-y}``sCt_XBZ-x#+h_8?joq1RuE&2(RGPYbpxZD z60CMcH>ZtArrMK=jP|4{GIdu{k<o7@ST|U)&AjL6|27eQ8>1T%UOvSrhpdS<Mmb*U z<F+_c95NIc<#;VcrZ{9MGMbG3Q!~e%D&aQtCEC!!==ww(b}`C<W1KR|QB!Cwi8ky` z+A_*fTZ&ALB^4Q^pNgnhicF0s6&dA5TZ&92Q?SeOGt-`%{_RB5TN$lRRJMcB)ONNe z+Q}V+gfPl2qo`WrOmTEjWHcG*j+sJa{`62gIMlZi(eGw7HPntQp>|{owIfTY9USUc z68YH8C`V7t?3gw`ao~@u=w3@i+05w1gwG&X^Q8o<nNhAr6G8Sl6I`MMm_!(TnWj1v zSTjmb6R1$!?Qy0OKatK*4gI*0ZG$sNQcADFaZFAq$uAYuL<^(#L|nTVEl@07++vF} zu_UR-=oLvlJ<bIE;7>&pyBOV+)U(H#Xiw@f+L_cd;!KPt^%&is)N{m{IG)sF^ovQo zoH!HrCH3CLk2F+%s-P}LwKx+_HB2P4Oc6DSvD3yVcNcYH+l+(HswiWxBC)v1-fH3A z`Y6#`&5UwyXkrJW#fesq+Tu)bZ$OXHilm+%XM%eJdW<$E_3UvbxHq83Xeg;?#F^mU zfF7d<lX{Lg6WklnWArOYy_`4`$==$*eQ;Hx4_X*a?SqzVeIS1jlt)dX3+O2@70iN+ zKA<Ad#HSdQ?`cBIfsdl$xA-{I-%YCWal1v0B3LtevtqF|(;P2UWehXyXu$#%O>{8I zmby53<bWkj?kT3L6`34P9h|t$iNtjzZ89;o-=YMXXl9gM8sdO(T<&F(-6N#a2bf6K z)y!y0=%=TJo}9Tj0CtZllu>q$nvNxE+K^~fJEL5qO&oACo>Kd<X|<!R^rLaIP$uP= z`L8Msl`25GdgjCPLgMgjV|0NU7P^RPaVFLznYK6+Ta!#Z&V>Aw1!{!3J<i18q^1#P zf{zPmI^s+)1T!a2&zh<5BuA0+-1eKqgm=q<I1?Wy#&3&L<#dsP+3p#r@uy`Cc%fT` zsEHfaDlgnuU@4^pAZ50ERB_SE`;_H<i8!+V?vU&y!c@)Djdhe~@x7C);cnE#Ztg{f zn%K!Gp9giZPm43bCp|E2aVGc-2c{lpf=_2)+T%>{xeH7q&IF&Rz;wi!NcQ5socQ#l z?Bx7#2cs>FzM@ix1LV{JCU^iqk5L{64sp8(i)D#%!F;E<1(IczixUza9At3|ESTnz z!k(Dsk%LMT{hmN3Rj1`8db&9wQ;4bH!%Fp41-C1c9tHap<e7C?(FYaeVK|fjQ6(r= z$1*K-qQdo6DL)qXPuT02wP|TiW}&Y;-jtQEC)OFJ+UU4C^r^!zoo@(U*O$(Bh+1{+ zn$FJ=qgnY*!Rrsx_3;!QPrfsYjxVhGvhrPt@A#(L=vc+c>owE)cw+BM<yg3m<r<?| z`5y65R(?U^JC~{6bWteqdEseA#}`cbyOya!T@;CI>l1an1<2pOOxMRV_u5pBh3ok0 zX>(RS9uH?JdSdlxx=<Gj(;14=#iAMbd=--}*5#Xu={%xzap`oX<X<+8PsfB^{9-Co zkOzhh--A7sF&?lwK=NPB;4f8tUI)znt^uN@<V_ueVuR#Q@5h^!A6{3?e)dTH>Eq#U z@Uz7qSAO^bD_<i#EdAsQUX6rxBC^bshkum%9^qZ46jMO9df$@z)5qcal0SVMejxo# zKQ8bD33;10ZM?Y^KXZJRfR80B)5_K0`=)V)XqEcYkKYc-cL{zp*ae!(pyXS4>i*AX z;D1H=;YDyOl+oA0_oX^e_#-p;d0__rJCZ;Bd&R#{d|r>}SN{J9eztn)LM}_!iYvj- z_T6LA9gaq#WB9mBHy%#$hlzvHp<p+Cv^avtaXll!zQK{M&cR?0o?AtNonw1N_sG!b zU?>{u!54$GYRE4k2Rp;z&V50=939?=XH1<#p<vJ0&=7siIE9j*PEJ!zE?J<*S;<F+ z{!x5vS=Ko15uxO6YOUM4F}QJC1AUM=*b^BE_ID2V&{vlmc5bWNisx{_ARhMxH=039 z)of@53m<4^qs>j*>+70=+c$06v9T@KR#)G&F({vo)z<Rokm(!9|KS&&<u{<SJ%>yC zhI6_@>%nO{k6iFaoHM>QZ9TwCs^b&Q>Je;`M{!zFq<!z1So~yEHiP>-{WH~RAEQop zYJKWj_#^v<qMcoU(Xa*k85<snhWvfQV}5$z*i$~xBP7+|8R-}Po_)ixv|u!BN%n-o z5qb_O)f5qgEF2o_Bm;$w;t8r>erVet#Un-Gm#OxLN9a+q@Q3=<u<GxDEmM|-HNGqh z#>tARfCCv$=g>emLKuN#?EJE}u1G}qG1}=3e<+2z#`<91IoyXsLy-f+y<~5Ry1K%l zJxpO`PKa^jhEe)Vx6)UhvP>X<B8$$bv|ba3xh#A=$FM~48Dw6j(Y%7s3XHJ*O$uRH zqYU{P6HDpRN);$9s!G&<O4&0!i1~^N)k`SbW4V?rwb+wyuAi?X8U9XcC3nhQf<YJI z^iB!e^Ytb}pVH*`S&t#zztKA?O!IXq!_~?@Gk(PuJwQmt_I&-y@U&9o`ZL=<tnBNR z9$)7&Otr_=+_e1d1&?y#Q1*%IVRc=Tc_l`%rj`hZRC~T|W_U1F88}}qF}x$g{*)3h zoKJ%@rLY~djsQumpRdCi;tD^lWXAs&%AWHtd`exxQAIMytp5uTQ2lJr*Yyl}{Ih*# z{iibQAM#n64C#6!wQ&D4?*SlmEz0AA-xK5iKar`=G{Z+=OV@sEpSYh;7YwWi6<L^O zcotj=k?r}u!}))(x4a4Q3J@B5Y|r;6{Qp7t|A27bxL)pue}Qdk{d^yDuEMIpXMx0? z?HT?El2m(9t5jE8uvw7|*p4Ax&l1k@^L<gXvS&TE&*)C^a|np1)LBiiy=q2+&-M&| zrR)<53OS%0X8L72*4M$v<dN*}l;JNj8jz{$nZf=Py_JCSC?6OWIjycsXRyCf9XS8M z9Y2G8nX=DpXHlJHuziO5VI~W`wZ*t%Nzk>yqF%_jnaI>#KZE@h>L<ZdsZN1s+7q1- zqO^Eb+4DT^19uHJ?hZcx(fr0^4``xHsHd^j8O}57FN8%l`=vq4)z%Dy3{w0%lVbgx literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..761cd3627f793e119868f6fd5c2e4f2b14d5e493 GIT binary patch literal 31336 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 RP!r0Z=&__~V+3MQ@t>gs81n!C literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..7f1f8246c45e5e8d893b35997b8bd06dd7fbb2a8 GIT binary patch literal 71560 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b475c52c6c9233431af8ce533664230f918c5a60 GIT binary patch literal 72520 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..91e81262dc37862f0250fa1ce3941f5b92834ea0 GIT binary patch literal 19016 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 MH|!RNfrDlL0T9n0a{vGU literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..c3c45d52cf35fe5b98fcf1445bf4492691c306fd GIT binary patch literal 181192 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..9685971ee4ed724d1fcc0d4cc96304ea0b3fd0df GIT binary patch literal 45856 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 WZ22_3#>-##w^sh8F&Sc_+J6A}>|PZB literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..a4a629a8e70deddb7c744c0b21ecd36eb761570e GIT binary patch literal 22128 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py new file mode 100644 index 0000000..85da887 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py @@ -0,0 +1,247 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_blake2b_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2b", + """ + int blake2b_init(void **state, + const uint8_t *key, + size_t key_size, + size_t digest_size); + int blake2b_destroy(void *state); + int blake2b_update(void *state, + const uint8_t *buf, + size_t len); + int blake2b_digest(const void *state, + uint8_t digest[64]); + int blake2b_copy(const void *src, void *dst); + """) + + +class BLAKE2b_Hash(object): + """A BLAKE2b hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 64 + + def __init__(self, data, key, digest_bytes, update_after_digest): + + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + + # See https://tools.ietf.org/html/rfc7693 + if digest_bytes in (20, 32, 48, 64) and not key: + self.oid = "1.3.6.1.4.1.1722.12.2.1." + str(digest_bytes) + + state = VoidPointer() + result = _raw_blake2b_lib.blake2b_init(state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(digest_bytes) + ) + if result: + raise ValueError("Error %d while instantiating BLAKE2b" % result) + self._state = SmartPointer(state.get(), + _raw_blake2b_lib.blake2b_destroy) + if data: + self.update(data) + + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (bytes/bytearray/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_blake2b_lib.blake2b_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing BLAKE2b data" % result) + return self + + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(64) + result = _raw_blake2b_lib.blake2b_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while creating BLAKE2b digest" % result) + + self._digest_done = True + + return get_raw_buffer(bfr)[:self.digest_size] + + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = new(digest_bits=160, key=secret, data=mac_tag) + mac2 = new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + def new(self, **kwargs): + """Return a new instance of a BLAKE2b hash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`BLAKE2b_Hash.update`. + digest_bytes (integer): + Optional. The size of the digest, in bytes (1 to 64). Default is 64. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (8 to 512, in steps of 8). + Default is 512. + key (bytes/bytearray/memoryview): + Optional. The key to use to compute the MAC (1 to 64 bytes). + If not specified, no key will be used. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + + Returns: + A :class:`BLAKE2b_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if not (1 <= digest_bytes <= 64): + raise ValueError("'digest_bytes' not in range 1..64") + else: + if not (8 <= digest_bits <= 512) or (digest_bits % 8): + raise ValueError("'digest_bits' not in range 8..512, " + "with steps of 8") + digest_bytes = digest_bits // 8 + + key = kwargs.pop("key", b"") + if len(key) > 64: + raise ValueError("BLAKE2b key cannot exceed 64 bytes") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return BLAKE2b_Hash(data, key, digest_bytes, update_after_digest) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi new file mode 100644 index 0000000..d37c374 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi @@ -0,0 +1,32 @@ +from typing import Any, Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class BLAKE2b_Hash(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + data: Buffer, + key: Buffer, + digest_bytes: bytes, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> BLAKE2b_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, + data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2b_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2b_Hash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py new file mode 100644 index 0000000..43be5c4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py @@ -0,0 +1,247 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_blake2s_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2s", + """ + int blake2s_init(void **state, + const uint8_t *key, + size_t key_size, + size_t digest_size); + int blake2s_destroy(void *state); + int blake2s_update(void *state, + const uint8_t *buf, + size_t len); + int blake2s_digest(const void *state, + uint8_t digest[32]); + int blake2s_copy(const void *src, void *dst); + """) + + +class BLAKE2s_Hash(object): + """A BLAKE2s hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 32 + + def __init__(self, data, key, digest_bytes, update_after_digest): + + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + + # See https://tools.ietf.org/html/rfc7693 + if digest_bytes in (16, 20, 28, 32) and not key: + self.oid = "1.3.6.1.4.1.1722.12.2.2." + str(digest_bytes) + + state = VoidPointer() + result = _raw_blake2s_lib.blake2s_init(state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(digest_bytes) + ) + if result: + raise ValueError("Error %d while instantiating BLAKE2s" % result) + self._state = SmartPointer(state.get(), + _raw_blake2s_lib.blake2s_destroy) + if data: + self.update(data) + + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_blake2s_lib.blake2s_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing BLAKE2s data" % result) + return self + + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(32) + result = _raw_blake2s_lib.blake2s_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while creating BLAKE2s digest" % result) + + self._digest_done = True + + return get_raw_buffer(bfr)[:self.digest_size] + + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = new(digest_bits=160, key=secret, data=mac_tag) + mac2 = new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + def new(self, **kwargs): + """Return a new instance of a BLAKE2s hash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`BLAKE2s_Hash.update`. + digest_bytes (integer): + Optional. The size of the digest, in bytes (1 to 32). Default is 32. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (8 to 256, in steps of 8). + Default is 256. + key (byte string): + Optional. The key to use to compute the MAC (1 to 64 bytes). + If not specified, no key will be used. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + + Returns: + A :class:`BLAKE2s_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 32 + if digest_bytes is not None: + if not (1 <= digest_bytes <= 32): + raise ValueError("'digest_bytes' not in range 1..32") + else: + if not (8 <= digest_bits <= 256) or (digest_bits % 8): + raise ValueError("'digest_bits' not in range 8..256, " + "with steps of 8") + digest_bytes = digest_bits // 8 + + key = kwargs.pop("key", b"") + if len(key) > 32: + raise ValueError("BLAKE2s key cannot exceed 32 bytes") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return BLAKE2s_Hash(data, key, digest_bytes, update_after_digest) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi new file mode 100644 index 0000000..374b3a4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi @@ -0,0 +1,26 @@ +from typing import Any, Union + +Buffer = Union[bytes, bytearray, memoryview] + +class BLAKE2s_Hash(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + data: Buffer, + key: Buffer, + digest_bytes: bytes, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> BLAKE2s_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, **kwargs: Any) -> BLAKE2s_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2s_Hash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py new file mode 100644 index 0000000..e831700 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +# +# Hash/CMAC.py - Implements the CMAC algorithm +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 binascii import unhexlify + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes +from Cryptodome.Random import get_random_bytes + + +# The size of the authentication tag produced by the MAC. +digest_size = None + + +def _shift_bytes(bs, xor_lsb=0): + num = (bytes_to_long(bs) << 1) ^ xor_lsb + return long_to_bytes(num, len(bs))[-len(bs):] + + +class CMAC(object): + """A CMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = None + + def __init__(self, key, msg, ciphermod, cipher_params, mac_len, + update_after_digest): + + self.digest_size = mac_len + + self._key = _copy_bytes(None, None, key) + self._factory = ciphermod + self._cipher_params = cipher_params + self._block_size = bs = ciphermod.block_size + self._mac_tag = None + self._update_after_digest = update_after_digest + + # Section 5.3 of NIST SP 800 38B and Appendix B + if bs == 8: + const_Rb = 0x1B + self._max_size = 8 * (2 ** 21) + elif bs == 16: + const_Rb = 0x87 + self._max_size = 16 * (2 ** 48) + else: + raise TypeError("CMAC requires a cipher with a block size" + " of 8 or 16 bytes, not %d" % bs) + + # Compute sub-keys + zero_block = b'\x00' * bs + self._ecb = ciphermod.new(key, + ciphermod.MODE_ECB, + **self._cipher_params) + L = self._ecb.encrypt(zero_block) + if bord(L[0]) & 0x80: + self._k1 = _shift_bytes(L, const_Rb) + else: + self._k1 = _shift_bytes(L) + if bord(self._k1[0]) & 0x80: + self._k2 = _shift_bytes(self._k1, const_Rb) + else: + self._k2 = _shift_bytes(self._k1) + + # Initialize CBC cipher with zero IV + self._cbc = ciphermod.new(key, + ciphermod.MODE_CBC, + zero_block, + **self._cipher_params) + + # Cache for outstanding data to authenticate + self._cache = bytearray(bs) + self._cache_n = 0 + + # Last piece of ciphertext produced + self._last_ct = zero_block + + # Last block that was encrypted with AES + self._last_pt = None + + # Counter for total message size + self._data_size = 0 + + if msg: + self.update(msg) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag is not None and not self._update_after_digest: + raise TypeError("update() cannot be called after digest() or verify()") + + self._data_size += len(msg) + bs = self._block_size + + if self._cache_n > 0: + filler = min(bs - self._cache_n, len(msg)) + self._cache[self._cache_n:self._cache_n+filler] = msg[:filler] + self._cache_n += filler + + if self._cache_n < bs: + return self + + msg = memoryview(msg)[filler:] + self._update(self._cache) + self._cache_n = 0 + + remain = len(msg) % bs + if remain > 0: + self._update(msg[:-remain]) + self._cache[:remain] = msg[-remain:] + else: + self._update(msg) + self._cache_n = remain + return self + + def _update(self, data_block): + """Update a block aligned to the block boundary""" + + bs = self._block_size + assert len(data_block) % bs == 0 + + if len(data_block) == 0: + return + + ct = self._cbc.encrypt(data_block) + if len(data_block) == bs: + second_last = self._last_ct + else: + second_last = ct[-bs*2:-bs] + self._last_ct = ct[-bs:] + self._last_pt = strxor(second_last, data_block[-bs:]) + + def copy(self): + """Return a copy ("clone") of the CMAC object. + + The copy will have the same internal state as the original CMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`CMAC` + """ + + obj = self.__new__(CMAC) + obj.__dict__ = self.__dict__.copy() + obj._cbc = self._factory.new(self._key, + self._factory.MODE_CBC, + self._last_ct, + **self._cipher_params) + obj._cache = self._cache[:] + obj._last_ct = self._last_ct[:] + return obj + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + that has been authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bs = self._block_size + + if self._mac_tag is not None and not self._update_after_digest: + return self._mac_tag + + if self._data_size > self._max_size: + raise ValueError("MAC is unsafe for this message") + + if self._cache_n == 0 and self._data_size > 0: + # Last block was full + pt = strxor(self._last_pt, self._k1) + else: + # Last block is partial (or message length is zero) + partial = self._cache[:] + partial[self._cache_n:] = b'\x80' + b'\x00' * (bs - self._cache_n - 1) + pt = strxor(strxor(self._last_ct, partial), self._k2) + + self._mac_tag = self._ecb.encrypt(pt)[:self.digest_size] + + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=None, ciphermod=None, cipher_params=None, mac_len=None, + update_after_digest=False): + """Create a new MAC object. + + Args: + key (byte string/byte array/memoryview): + key for the CMAC object. + The key must be valid for the underlying cipher algorithm. + For instance, it must be 16 bytes long for AES-128. + ciphermod (module): + A cipher module from :mod:`Cryptodome.Cipher`. + The cipher's block size has to be 128 bits, + like :mod:`Cryptodome.Cipher.AES`, to reduce the probability + of collisions. + msg (byte string/byte array/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to `CMAC.update`. Optional. + cipher_params (dict): + Optional. A set of parameters to use when instantiating a cipher + object. + mac_len (integer): + Length of the MAC, in bytes. + It must be at least 4 bytes long. + The default (and recommended) length matches the size of a cipher block. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + Returns: + A :class:`CMAC` object + """ + + if ciphermod is None: + raise TypeError("ciphermod must be specified (try AES)") + + cipher_params = {} if cipher_params is None else dict(cipher_params) + + if mac_len is None: + mac_len = ciphermod.block_size + + if mac_len < 4: + raise ValueError("MAC tag length must be at least 4 bytes long") + + if mac_len > ciphermod.block_size: + raise ValueError("MAC tag length cannot be larger than a cipher block (%d) bytes" % ciphermod.block_size) + + return CMAC(key, msg, ciphermod, cipher_params, mac_len, + update_after_digest) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi new file mode 100644 index 0000000..acdf055 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi @@ -0,0 +1,30 @@ +from types import ModuleType +from typing import Union, Dict, Any + +Buffer = Union[bytes, bytearray, memoryview] + +digest_size: int + +class CMAC(object): + digest_size: int + + def __init__(self, + key: Buffer, + msg: Buffer, + ciphermod: ModuleType, + cipher_params: Dict[str, Any], + mac_len: int, update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> CMAC: ... + def copy(self) -> CMAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + +def new(key: Buffer, + msg: Buffer = ..., + ciphermod: ModuleType = ..., + cipher_params: Dict[str, Any] = ..., + mac_len: int = ..., + update_after_digest: bool = ...) -> CMAC: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py new file mode 100644 index 0000000..165dd83 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py @@ -0,0 +1,213 @@ +# +# HMAC.py - Implements the HMAC algorithm as described by RFC 2104. +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord, tobytes + +from binascii import unhexlify + +from Cryptodome.Hash import MD5 +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Random import get_random_bytes + +__all__ = ['new', 'HMAC'] + + +class HMAC(object): + """An HMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + def __init__(self, key, msg=b"", digestmod=None): + + if digestmod is None: + digestmod = MD5 + + if msg is None: + msg = b"" + + # Size of the MAC tag + self.digest_size = digestmod.digest_size + + self._digestmod = digestmod + + if isinstance(key, memoryview): + key = key.tobytes() + + try: + if len(key) <= digestmod.block_size: + # Step 1 or 2 + key_0 = key + b"\x00" * (digestmod.block_size - len(key)) + else: + # Step 3 + hash_k = digestmod.new(key).digest() + key_0 = hash_k + b"\x00" * (digestmod.block_size - len(hash_k)) + except AttributeError: + # Not all hash types have "block_size" + raise ValueError("Hash type incompatible to HMAC") + + # Step 4 + key_0_ipad = strxor(key_0, b"\x36" * len(key_0)) + + # Start step 5 and 6 + self._inner = digestmod.new(key_0_ipad) + self._inner.update(msg) + + # Step 7 + key_0_opad = strxor(key_0, b"\x5c" * len(key_0)) + + # Start step 8 and 9 + self._outer = digestmod.new(key_0_opad) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + self._inner.update(msg) + return self + + def _pbkdf2_hmac_assist(self, first_digest, iterations): + """Carry out the expensive inner loop for PBKDF2-HMAC""" + + result = self._digestmod._pbkdf2_hmac_assist( + self._inner, + self._outer, + first_digest, + iterations) + return result + + def copy(self): + """Return a copy ("clone") of the HMAC object. + + The copy will have the same internal state as the original HMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`HMAC` + """ + + new_hmac = HMAC(b"fake key", digestmod=self._digestmod) + + # Syncronize the state + new_hmac._inner = self._inner.copy() + new_hmac._outer = self._outer.copy() + + return new_hmac + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + frozen_outer_hash = self._outer.copy() + frozen_outer_hash.update(self._inner.digest()) + return frozen_outer_hash.digest() + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=b"", digestmod=None): + """Create a new MAC object. + + Args: + key (bytes/bytearray/memoryview): + key for the MAC object. + It must be long enough to match the expected security level of the + MAC. + msg (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`HMAC.update`. + digestmod (module): + The hash to use to implement the HMAC. + Default is :mod:`Cryptodome.Hash.MD5`. + + Returns: + An :class:`HMAC` object + """ + + return HMAC(key, msg, digestmod) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi new file mode 100644 index 0000000..b577230 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi @@ -0,0 +1,25 @@ +from types import ModuleType +from typing import Union, Dict + +Buffer = Union[bytes, bytearray, memoryview] + +digest_size: int + +class HMAC(object): + digest_size: int + + def __init__(self, + key: Buffer, + msg: Buffer, + digestmod: ModuleType) -> None: ... + def update(self, msg: Buffer) -> HMAC: ... + def copy(self) -> HMAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + +def new(key: Buffer, + msg: Buffer = ..., + digestmod: ModuleType = ...) -> HMAC: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py new file mode 100644 index 0000000..afd91c4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py @@ -0,0 +1,179 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes, is_bytes +from Cryptodome.Random import get_random_bytes + +from . import cSHAKE128, SHA3_256 +from .cSHAKE128 import _bytepad, _encode_str, _right_encode + + +class KMAC_Hash(object): + """A KMAC hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, key, mac_len, custom, + oid_variant, cshake, rate): + + # See https://tools.ietf.org/html/rfc8702 + self.oid = "2.16.840.1.101.3.4.2." + oid_variant + self.digest_size = mac_len + + self._mac = None + + partial_newX = _bytepad(_encode_str(tobytes(key)), rate) + self._cshake = cshake._new(partial_newX, custom, b"KMAC") + + if data: + self._cshake.update(data) + + def update(self, data): + """Authenticate the next chunk of message. + + Args: + data (bytes/bytearray/memoryview): The next chunk of the message to + authenticate. + """ + + if self._mac: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + self._cshake.update(data) + return self + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message. + + :return: The MAC tag. Binary form. + :rtype: byte string + """ + + if not self._mac: + self._cshake.update(_right_encode(self.digest_size * 8)) + self._mac = self._cshake.read(self.digest_size) + + return self._mac + + def hexdigest(self): + """Return the **printable** MAC tag of the message. + + :return: The MAC tag. Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = SHA3_256.new(secret + mac_tag) + mac2 = SHA3_256.new(secret + self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + def new(self, **kwargs): + """Return a new instance of a KMAC hash object. + See :func:`new`. + """ + + if "mac_len" not in kwargs: + kwargs["mac_len"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new KMAC128 object. + + Args: + key (bytes/bytearray/memoryview): + The key to use to compute the MAC. + It must be at least 128 bits long (16 bytes). + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`KMAC_Hash.update`. + mac_len (integer): + Optional. The size of the authentication tag, in bytes. + Default is 64. Minimum is 8. + custom (bytes/bytearray/memoryview): + Optional. A customization byte string (``S`` in SP 800-185). + + Returns: + A :class:`KMAC_Hash` hash object + """ + + key = kwargs.pop("key", None) + if not is_bytes(key): + raise TypeError("You must pass a key to KMAC128") + if len(key) < 16: + raise ValueError("The key must be at least 128 bits long (16 bytes)") + + data = kwargs.pop("data", None) + + mac_len = kwargs.pop("mac_len", 64) + if mac_len < 8: + raise ValueError("'mac_len' must be 8 bytes or more") + + custom = kwargs.pop("custom", b"") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return KMAC_Hash(data, key, mac_len, custom, "19", cSHAKE128, 168) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi new file mode 100644 index 0000000..8947dab --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi @@ -0,0 +1,33 @@ +from typing import Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class KMAC_Hash(object): + + def __init__(self, + data: Buffer, + key: Buffer, + mac_len: int, + custom: Buffer, + oid_variant: str, + cshake: ModuleType, + rate: int) -> None: ... + + def update(self, data: Buffer) -> KMAC_Hash: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, + data: Buffer = ..., + mac_len: int = ..., + key: Buffer = ..., + custom: Buffer = ...) -> KMAC_Hash: ... + + +def new(key: Buffer, + data: Buffer = ..., + mac_len: int = ..., + custom: Buffer = ...) -> KMAC_Hash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py new file mode 100644 index 0000000..82da062 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py @@ -0,0 +1,74 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import is_bytes + +from .KMAC128 import KMAC_Hash +from . import cSHAKE256 + + +def new(**kwargs): + """Create a new KMAC256 object. + + Args: + key (bytes/bytearray/memoryview): + The key to use to compute the MAC. + It must be at least 256 bits long (32 bytes). + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`KMAC_Hash.update`. + mac_len (integer): + Optional. The size of the authentication tag, in bytes. + Default is 64. Minimum is 8. + custom (bytes/bytearray/memoryview): + Optional. A customization byte string (``S`` in SP 800-185). + + Returns: + A :class:`KMAC_Hash` hash object + """ + + key = kwargs.pop("key", None) + if not is_bytes(key): + raise TypeError("You must pass a key to KMAC256") + if len(key) < 32: + raise ValueError("The key must be at least 256 bits long (32 bytes)") + + data = kwargs.pop("data", None) + + mac_len = kwargs.pop("mac_len", 64) + if mac_len < 8: + raise ValueError("'mac_len' must be 8 bytes or more") + + custom = kwargs.pop("custom", b"") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return KMAC_Hash(data, key, mac_len, custom, "20", cSHAKE256, 136) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi new file mode 100644 index 0000000..86cc500 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi @@ -0,0 +1,10 @@ +from typing import Union + +from .KMAC128 import KMAC_Hash + +Buffer = Union[bytes, bytearray, memoryview] + +def new(key: Buffer, + data: Buffer = ..., + mac_len: int = ..., + custom: Buffer = ...) -> KMAC_Hash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py new file mode 100644 index 0000000..44d935f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py @@ -0,0 +1,262 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Util.py3compat import bchr + +from .keccak import _raw_keccak_lib + + +def _length_encode(x): + if x == 0: + return b'\x00' + + S = long_to_bytes(x) + return S + bchr(len(S)) + + +# Possible states for a KangarooTwelve instance, which depend on the amount of data processed so far. +SHORT_MSG = 1 # Still within the first 8192 bytes, but it is not certain we will exceed them. +LONG_MSG_S0 = 2 # Still within the first 8192 bytes, and it is certain we will exceed them. +LONG_MSG_SX = 3 # Beyond the first 8192 bytes. +SQUEEZING = 4 # No more data to process. + + +class K12_XOF(object): + """A KangarooTwelve hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, custom): + + if custom == None: + custom = b'' + + self._custom = custom + _length_encode(len(custom)) + self._state = SHORT_MSG + self._padding = None # Final padding is only decided in read() + + # Internal hash that consumes FinalNode + self._hash1 = self._create_keccak() + self._length1 = 0 + + # Internal hash that produces CV_i (reset each time) + self._hash2 = None + self._length2 = 0 + + # Incremented by one for each 8192-byte block + self._ctr = 0 + + if data: + self.update(data) + + def _create_keccak(self): + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(32), # 32 bytes of capacity (256 bits) + c_ubyte(12)) # Reduced number of rounds + if result: + raise ValueError("Error %d while instantiating KangarooTwelve" + % result) + return SmartPointer(state.get(), _raw_keccak_lib.keccak_destroy) + + def _update(self, data, hash_obj): + result = _raw_keccak_lib.keccak_absorb(hash_obj.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating KangarooTwelve state" + % result) + + def _squeeze(self, hash_obj, length, padding): + bfr = create_string_buffer(length) + result = _raw_keccak_lib.keccak_squeeze(hash_obj.get(), + bfr, + c_size_t(length), + c_ubyte(padding)) + if result: + raise ValueError("Error %d while extracting from KangarooTwelve" + % result) + + return get_raw_buffer(bfr) + + def _reset(self, hash_obj): + result = _raw_keccak_lib.keccak_reset(hash_obj.get()) + if result: + raise ValueError("Error %d while resetting KangarooTwelve state" + % result) + + def update(self, data): + """Hash the next piece of data. + + .. note:: + For better performance, submit chunks with a length multiple of 8192 bytes. + + Args: + data (byte string/byte array/memoryview): The next chunk of the + message to hash. + """ + + if self._state == SQUEEZING: + raise TypeError("You cannot call 'update' after the first 'read'") + + if self._state == SHORT_MSG: + next_length = self._length1 + len(data) + + if next_length + len(self._custom) <= 8192: + self._length1 = next_length + self._update(data, self._hash1) + return self + + # Switch to tree hashing + self._state = LONG_MSG_S0 + + if self._state == LONG_MSG_S0: + data_mem = memoryview(data) + assert(self._length1 < 8192) + dtc = min(len(data), 8192 - self._length1) + self._update(data_mem[:dtc], self._hash1) + self._length1 += dtc + + if self._length1 < 8192: + return self + + # Finish hashing S_0 and start S_1 + assert(self._length1 == 8192) + + divider = b'\x03' + b'\x00' * 7 + self._update(divider, self._hash1) + self._length1 += 8 + + self._hash2 = self._create_keccak() + self._length2 = 0 + self._ctr = 1 + + self._state = LONG_MSG_SX + return self.update(data_mem[dtc:]) + + # LONG_MSG_SX + assert(self._state == LONG_MSG_SX) + index = 0 + len_data = len(data) + + # All iteractions could actually run in parallel + data_mem = memoryview(data) + while index < len_data: + + new_index = min(index + 8192 - self._length2, len_data) + self._update(data_mem[index:new_index], self._hash2) + self._length2 += new_index - index + index = new_index + + if self._length2 == 8192: + cv_i = self._squeeze(self._hash2, 32, 0x0B) + self._update(cv_i, self._hash1) + self._length1 += 32 + self._reset(self._hash2) + self._length2 = 0 + self._ctr += 1 + + return self + + def read(self, length): + """ + Produce more bytes of the digest. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + custom_was_consumed = False + + if self._state == SHORT_MSG: + self._update(self._custom, self._hash1) + self._padding = 0x07 + self._state = SQUEEZING + + if self._state == LONG_MSG_S0: + self.update(self._custom) + custom_was_consumed = True + assert(self._state == LONG_MSG_SX) + + if self._state == LONG_MSG_SX: + if not custom_was_consumed: + self.update(self._custom) + + # Is there still some leftover data in hash2? + if self._length2 > 0: + cv_i = self._squeeze(self._hash2, 32, 0x0B) + self._update(cv_i, self._hash1) + self._length1 += 32 + self._reset(self._hash2) + self._length2 = 0 + self._ctr += 1 + + trailer = _length_encode(self._ctr - 1) + b'\xFF\xFF' + self._update(trailer, self._hash1) + + self._padding = 0x06 + self._state = SQUEEZING + + return self._squeeze(self._hash1, length, self._padding) + + def new(self, data=None, custom=b''): + return type(self)(data, custom) + + +def new(data=None, custom=None): + """Return a fresh instance of a KangarooTwelve object. + + Args: + data (bytes/bytearray/memoryview): + Optional. + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + custom (bytes): + Optional. + A customization byte string. + + :Return: A :class:`K12_XOF` object + """ + + return K12_XOF(data, custom) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi new file mode 100644 index 0000000..8b3fd74 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi @@ -0,0 +1,16 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class K12_XOF(object): + def __init__(self, + data: Optional[Buffer] = ..., + custom: Optional[bytes] = ...) -> None: ... + def update(self, data: Buffer) -> K12_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, + data: Optional[Buffer] = ..., + custom: Optional[bytes] = ...) -> None: ... + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> K12_XOF: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py new file mode 100644 index 0000000..47ecc05 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py @@ -0,0 +1,166 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md2_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._MD2", + """ + int md2_init(void **shaState); + int md2_destroy(void *shaState); + int md2_update(void *hs, + const uint8_t *buf, + size_t len); + int md2_digest(const void *shaState, + uint8_t digest[20]); + int md2_copy(const void *src, void *dst); + """) + + +class MD2Hash(object): + """An MD2 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 16 + # The internal block size of the hash algorithm in bytes. + block_size = 16 + # ASN.1 Object ID + oid = "1.2.840.113549.2.2" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md2_lib.md2_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + self._state = SmartPointer(state.get(), + _raw_md2_lib.md2_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_md2_lib.md2_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md2_lib.md2_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = MD2Hash() + result = _raw_md2_lib.md2_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD2" % result) + return clone + + def new(self, data=None): + return MD2Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`MD2Hash.update`. + :type data: bytes/bytearray/memoryview + + :Return: A :class:`MD2Hash` hash object + """ + + return MD2Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = MD2Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = MD2Hash.block_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi new file mode 100644 index 0000000..95a97a9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class MD4Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD4Hash: ... + def new(self, data: Buffer = ...) -> MD4Hash: ... + +def new(data: Buffer = ...) -> MD4Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py new file mode 100644 index 0000000..668fa65 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py @@ -0,0 +1,185 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +MD4 is specified in RFC1320_ and produces the 128 bit digest of a message. + + >>> from Cryptodome.Hash import MD4 + >>> + >>> h = MD4.new() + >>> h.update(b'Hello') + >>> print h.hexdigest() + +MD4 stand for Message Digest version 4, and it was invented by Rivest in 1990. +This algorithm is insecure. Do not use it for new designs. + +.. _RFC1320: http://tools.ietf.org/html/rfc1320 +""" + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md4_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._MD4", + """ + int md4_init(void **shaState); + int md4_destroy(void *shaState); + int md4_update(void *hs, + const uint8_t *buf, + size_t len); + int md4_digest(const void *shaState, + uint8_t digest[20]); + int md4_copy(const void *src, void *dst); + """) + + +class MD4Hash(object): + """Class that implements an MD4 hash + """ + + #: The size of the resulting hash in bytes. + digest_size = 16 + #: The internal block size of the hash algorithm in bytes. + block_size = 64 + #: ASN.1 Object ID + oid = "1.2.840.113549.2.4" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md4_lib.md4_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + self._state = SmartPointer(state.get(), + _raw_md4_lib.md4_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Repeated calls are equivalent to a single call with the concatenation + of all the arguments. In other words: + + >>> m.update(a); m.update(b) + + is equivalent to: + + >>> m.update(a+b) + + :Parameters: + data : byte string/byte array/memoryview + The next chunk of the message being hashed. + """ + + result = _raw_md4_lib.md4_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that + has been hashed so far. + + This method does not change the state of the hash object. + You can continue updating the object after calling this function. + + :Return: A byte string of `digest_size` bytes. It may contain non-ASCII + characters, including null bytes. + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md4_lib.md4_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been + hashed so far. + + This method does not change the state of the hash object. + + :Return: A string of 2* `digest_size` characters. It contains only + hexadecimal ASCII digits. + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :Return: A hash object of the same type + """ + + clone = MD4Hash() + result = _raw_md4_lib.md4_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD4" % result) + return clone + + def new(self, data=None): + return MD4Hash(data) + + +def new(data=None): + """Return a fresh instance of the hash object. + + :Parameters: + data : byte string/byte array/memoryview + The very first chunk of the message to hash. + It is equivalent to an early call to `MD4Hash.update()`. + Optional. + + :Return: A `MD4Hash` object + """ + return MD4Hash().new(data) + +#: The size of the resulting hash in bytes. +digest_size = MD4Hash.digest_size + +#: The internal block size of the hash algorithm in bytes. +block_size = MD4Hash.block_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi new file mode 100644 index 0000000..a9a7295 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class MD4Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD4Hash: ... + def new(self, data: Optional[Buffer] = ...) -> MD4Hash: ... + +def new(data: Optional[Buffer] = ...) -> MD4Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py new file mode 100644 index 0000000..8f573a9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md5_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._MD5", + """ + #define MD5_DIGEST_SIZE 16 + + int MD5_init(void **shaState); + int MD5_destroy(void *shaState); + int MD5_update(void *hs, + const uint8_t *buf, + size_t len); + int MD5_digest(const void *shaState, + uint8_t digest[MD5_DIGEST_SIZE]); + int MD5_copy(const void *src, void *dst); + + int MD5_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t first_digest[MD5_DIGEST_SIZE], + uint8_t final_digest[MD5_DIGEST_SIZE], + size_t iterations); + """) + +class MD5Hash(object): + """A MD5 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 16 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.2.840.113549.2.5" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md5_lib.MD5_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + self._state = SmartPointer(state.get(), + _raw_md5_lib.MD5_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_md5_lib.MD5_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md5_lib.MD5_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = MD5Hash() + result = _raw_md5_lib.MD5_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD5" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-1 hash object.""" + + return MD5Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`MD5Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`MD5Hash` hash object + """ + return MD5Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = 16 + +# The internal block size of the hash algorithm in bytes. +block_size = 64 + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert len(first_digest) == digest_size + assert iterations > 0 + + bfr = create_string_buffer(digest_size); + result = _raw_md5_lib.MD5_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations)) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assis for MD5" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi new file mode 100644 index 0000000..d819556 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class MD5Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD5Hash: ... + def new(self, data: Buffer = ...) -> MD5Hash: ... + +def new(data: Buffer = ...) -> MD5Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py new file mode 100644 index 0000000..c03f522 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# Hash/Poly1305.py - Implements the Poly1305 MAC +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + + +_raw_poly1305 = load_pycryptodome_raw_lib("Cryptodome.Hash._poly1305", + """ + int poly1305_init(void **state, + const uint8_t *r, + size_t r_len, + const uint8_t *s, + size_t s_len); + int poly1305_destroy(void *state); + int poly1305_update(void *state, + const uint8_t *in, + size_t len); + int poly1305_digest(const void *state, + uint8_t *digest, + size_t len); + """) + + +class Poly1305_MAC(object): + """An Poly1305 MAC object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = 16 + + def __init__(self, r, s, data): + + if len(r) != 16: + raise ValueError("Parameter r is not 16 bytes long") + if len(s) != 16: + raise ValueError("Parameter s is not 16 bytes long") + + self._mac_tag = None + + state = VoidPointer() + result = _raw_poly1305.poly1305_init(state.address_of(), + c_uint8_ptr(r), + c_size_t(len(r)), + c_uint8_ptr(s), + c_size_t(len(s)) + ) + if result: + raise ValueError("Error %d while instantiating Poly1305" % result) + self._state = SmartPointer(state.get(), + _raw_poly1305.poly1305_destroy) + if data: + self.update(data) + + def update(self, data): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_poly1305.poly1305_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing Poly1305 data" % result) + return self + + def copy(self): + raise NotImplementedError() + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + if self._mac_tag: + return self._mac_tag + + bfr = create_string_buffer(16) + result = _raw_poly1305.poly1305_digest(self._state.get(), + bfr, + c_size_t(len(bfr))) + if result: + raise ValueError("Error %d while creating Poly1305 digest" % result) + + self._mac_tag = get_raw_buffer(bfr) + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + +def new(**kwargs): + """Create a new Poly1305 MAC object. + + Args: + key (bytes/bytearray/memoryview): + The 32-byte key for the Poly1305 object. + cipher (module from ``Cryptodome.Cipher``): + The cipher algorithm to use for deriving the Poly1305 + key pair *(r, s)*. + It can only be ``Cryptodome.Cipher.AES`` or ``Cryptodome.Cipher.ChaCha20``. + nonce (bytes/bytearray/memoryview): + Optional. The non-repeatable value to use for the MAC of this message. + It must be 16 bytes long for ``AES`` and 8 or 12 bytes for ``ChaCha20``. + If not passed, a random nonce is created; you will find it in the + ``nonce`` attribute of the new object. + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to ``update()``. + + Returns: + A :class:`Poly1305_MAC` object + """ + + cipher = kwargs.pop("cipher", None) + if not hasattr(cipher, '_derive_Poly1305_key_pair'): + raise ValueError("Parameter 'cipher' must be AES or ChaCha20") + + cipher_key = kwargs.pop("key", None) + if cipher_key is None: + raise TypeError("You must pass a parameter 'key'") + + nonce = kwargs.pop("nonce", None) + data = kwargs.pop("data", None) + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + r, s, nonce = cipher._derive_Poly1305_key_pair(cipher_key, nonce) + + new_mac = Poly1305_MAC(r, s, data) + new_mac.nonce = _copy_bytes(None, None, nonce) # nonce may still be just a memoryview + return new_mac diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi new file mode 100644 index 0000000..f97a14a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi @@ -0,0 +1,24 @@ +from types import ModuleType +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class Poly1305_MAC(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + r : int, + s : int, + data : Buffer) -> None: ... + def update(self, data: Buffer) -> Poly1305_MAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + +def new(key: Buffer, + cipher: ModuleType, + nonce: Buffer = ..., + data: Buffer = ...) -> Poly1305_MAC: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py new file mode 100644 index 0000000..35ad576 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.RIPEMD + +"""Deprecated alias for `Cryptodome.Hash.RIPEMD160`""" + +from Cryptodome.Hash.RIPEMD160 import new, block_size, digest_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi new file mode 100644 index 0000000..cfb2252 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi @@ -0,0 +1,3 @@ +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py new file mode 100644 index 0000000..f959027 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py @@ -0,0 +1,169 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_ripemd160_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._RIPEMD160", + """ + int ripemd160_init(void **shaState); + int ripemd160_destroy(void *shaState); + int ripemd160_update(void *hs, + const uint8_t *buf, + size_t len); + int ripemd160_digest(const void *shaState, + uint8_t digest[20]); + int ripemd160_copy(const void *src, void *dst); + """) + + +class RIPEMD160Hash(object): + """A RIPEMD-160 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 20 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.3.36.3.2.1" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_ripemd160_lib.ripemd160_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating RIPEMD160" + % result) + self._state = SmartPointer(state.get(), + _raw_ripemd160_lib.ripemd160_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_ripemd160_lib.ripemd160_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating ripemd160" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_ripemd160_lib.ripemd160_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating ripemd160" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = RIPEMD160Hash() + result = _raw_ripemd160_lib.ripemd160_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying ripemd160" % result) + return clone + + def new(self, data=None): + """Create a fresh RIPEMD-160 hash object.""" + + return RIPEMD160Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`RIPEMD160Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`RIPEMD160Hash` hash object + """ + + return RIPEMD160Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = RIPEMD160Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = RIPEMD160Hash.block_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi new file mode 100644 index 0000000..b619473 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class RIPEMD160Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> RIPEMD160Hash: ... + def new(self, data: Buffer = ...) -> RIPEMD160Hash: ... + +def new(data: Buffer = ...) -> RIPEMD160Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py new file mode 100644 index 0000000..95f8745 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + +from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi new file mode 100644 index 0000000..7d01a5f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi @@ -0,0 +1,4 @@ +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + +from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py new file mode 100644 index 0000000..dea51bc --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha1_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA1", + """ + #define SHA1_DIGEST_SIZE 20 + + int SHA1_init(void **shaState); + int SHA1_destroy(void *shaState); + int SHA1_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA1_digest(const void *shaState, + uint8_t digest[SHA1_DIGEST_SIZE]); + int SHA1_copy(const void *src, void *dst); + + int SHA1_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t first_digest[SHA1_DIGEST_SIZE], + uint8_t final_digest[SHA1_DIGEST_SIZE], + size_t iterations); + """) + +class SHA1Hash(object): + """A SHA-1 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 20 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.3.14.3.2.26" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha1_lib.SHA1_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + self._state = SmartPointer(state.get(), + _raw_sha1_lib.SHA1_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha1_lib.SHA1_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha1_lib.SHA1_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA1Hash() + result = _raw_sha1_lib.SHA1_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA1" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-1 hash object.""" + + return SHA1Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA1Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA1Hash` hash object + """ + return SHA1Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA1Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA1Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert len(first_digest) == digest_size + assert iterations > 0 + + bfr = create_string_buffer(digest_size); + result = _raw_sha1_lib.SHA1_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations)) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assis for SHA1" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi new file mode 100644 index 0000000..d6c8e25 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA1Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA1Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA1Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA1Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py new file mode 100644 index 0000000..fca7622 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha224_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA224", + """ + int SHA224_init(void **shaState); + int SHA224_destroy(void *shaState); + int SHA224_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA224_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA224_copy(const void *src, void *dst); + + int SHA224_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA224Hash(object): + """A SHA-224 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 28 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = '2.16.840.1.101.3.4.2.4' + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha224_lib.SHA224_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA224" + % result) + self._state = SmartPointer(state.get(), + _raw_sha224_lib.SHA224_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha224_lib.SHA224_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA224" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha224_lib.SHA224_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA224 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA224Hash() + result = _raw_sha224_lib.SHA224_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA224" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-224 hash object.""" + + return SHA224Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA224Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA224Hash` hash object + """ + return SHA224Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA224Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA224Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha224_lib.SHA224_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA224" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi new file mode 100644 index 0000000..613a7f9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA224Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA224Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA224Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA224Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py new file mode 100644 index 0000000..c1a81b1 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha256_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA256", + """ + int SHA256_init(void **shaState); + int SHA256_destroy(void *shaState); + int SHA256_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA256_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA256_copy(const void *src, void *dst); + + int SHA256_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA256Hash(object): + """A SHA-256 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 32 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.1" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha256_lib.SHA256_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA256" + % result) + self._state = SmartPointer(state.get(), + _raw_sha256_lib.SHA256_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha256_lib.SHA256_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA256" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha256_lib.SHA256_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA256 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA256Hash() + result = _raw_sha256_lib.SHA256_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA256" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-256 hash object.""" + + return SHA256Hash(data) + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA256Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA256Hash` hash object + """ + + return SHA256Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA256Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA256Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha256_lib.SHA256_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA256" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi new file mode 100644 index 0000000..cbf21bf --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi @@ -0,0 +1,18 @@ +from typing import Union, Optional + + +class SHA256Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Union[bytes, bytearray, memoryview]]=None) -> None: ... + def update(self, data: Union[bytes, bytearray, memoryview]) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA256Hash: ... + def new(self, data: Optional[Union[bytes, bytearray, memoryview]]=None) -> SHA256Hash: ... + +def new(data: Optional[Union[bytes, bytearray, memoryview]]=None) -> SHA256Hash: ... + +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py new file mode 100644 index 0000000..711aa73 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha384_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA384", + """ + int SHA384_init(void **shaState); + int SHA384_destroy(void *shaState); + int SHA384_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA384_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA384_copy(const void *src, void *dst); + + int SHA384_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA384Hash(object): + """A SHA-384 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 48 + # The internal block size of the hash algorithm in bytes. + block_size = 128 + # ASN.1 Object ID + oid = '2.16.840.1.101.3.4.2.2' + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha384_lib.SHA384_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA384" + % result) + self._state = SmartPointer(state.get(), + _raw_sha384_lib.SHA384_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha384_lib.SHA384_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA384" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha384_lib.SHA384_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA384 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA384Hash() + result = _raw_sha384_lib.SHA384_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA384" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-384 hash object.""" + + return SHA384Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA384Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA384Hash` hash object + """ + + return SHA384Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA384Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA384Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha384_lib.SHA384_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA384" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi new file mode 100644 index 0000000..c2aab9e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA384Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA384Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA384Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA384Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py new file mode 100644 index 0000000..34888c5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_224_Hash(object): + """A SHA3-224 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 28 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.7" + + # Input block size for HMAC + block_size = 144 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/224" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data)) + ) + if result: + raise ValueError("Error %d while updating SHA-3/224" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/224" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-224" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-224 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_224_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_224_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_224_Hash.digest_size + +# Input block size for HMAC +block_size = 144 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi new file mode 100644 index 0000000..2180821 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_224_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_224_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_224_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_224_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_224_Hash: ... + +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py new file mode 100644 index 0000000..024962f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_256_Hash(object): + """A SHA3-256 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 32 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.8" + + # Input block size for HMAC + block_size = 136 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/256" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data)) + ) + if result: + raise ValueError("Error %d while updating SHA-3/256" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/256" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-256" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-256 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_256_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_256_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_256_Hash.digest_size + +# Input block size for HMAC +block_size = 136 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi new file mode 100644 index 0000000..88436bd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_256_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_256_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_256_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_256_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_256_Hash: ... + +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py new file mode 100644 index 0000000..26eeb79 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_384_Hash(object): + """A SHA3-384 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 48 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.9" + + # Input block size for HMAC + block_size = 104 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/384" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHA-3/384" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/384" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-384" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-256 hash object.""" + + return type(self)(data, self._update_after_digest) + + + def new(self, data=None): + """Create a fresh SHA3-384 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_384_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_384_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_384_Hash.digest_size + +# Input block size for HMAC +block_size = 104 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi new file mode 100644 index 0000000..98d00c6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_384_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_384_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_384_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_384_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_384_Hash: ... + +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py new file mode 100644 index 0000000..99b1c37 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_512_Hash(object): + """A SHA3-512 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 64 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.10" + + # Input block size for HMAC + block_size = 72 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/512" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHA-3/512" + % result) + return self + + def digest(self): + + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/512" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-512" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-521 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_512_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_512_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_512_Hash.digest_size + +# Input block size for HMAC +block_size = 72 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi new file mode 100644 index 0000000..cdeec16 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_512_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_512_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_512_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_512_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_512_Hash: ... + +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py new file mode 100644 index 0000000..5066197 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py @@ -0,0 +1,204 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha512_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA512", + """ + int SHA512_init(void **shaState, + size_t digest_size); + int SHA512_destroy(void *shaState); + int SHA512_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA512_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA512_copy(const void *src, void *dst); + + int SHA512_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA512Hash(object): + """A SHA-512 hash object (possibly in its truncated version SHA-512/224 or + SHA-512/256. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 128 + + def __init__(self, data, truncate): + self._truncate = truncate + + if truncate is None: + self.oid = "2.16.840.1.101.3.4.2.3" + self.digest_size = 64 + elif truncate == "224": + self.oid = "2.16.840.1.101.3.4.2.5" + self.digest_size = 28 + elif truncate == "256": + self.oid = "2.16.840.1.101.3.4.2.6" + self.digest_size = 32 + else: + raise ValueError("Incorrect truncation length. It must be '224' or '256'.") + + state = VoidPointer() + result = _raw_sha512_lib.SHA512_init(state.address_of(), + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while instantiating SHA-512" + % result) + self._state = SmartPointer(state.get(), + _raw_sha512_lib.SHA512_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha512_lib.SHA512_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA512" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha512_lib.SHA512_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA512 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA512Hash(None, self._truncate) + result = _raw_sha512_lib.SHA512_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA512" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-512 hash object.""" + + return SHA512Hash(data, self._truncate) + + +def new(data=None, truncate=None): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA512Hash.update`. + truncate (string): + Optional. The desired length of the digest. It can be either "224" or + "256". If not present, the digest is 512 bits long. + Passing this parameter is **not** equivalent to simply truncating + the output digest. + + :Return: A :class:`SHA512Hash` hash object + """ + + return SHA512Hash(data, truncate) + + +# The size of the full SHA-512 hash in bytes. +digest_size = 64 + +# The internal block size of the hash algorithm in bytes. +block_size = 128 + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha512_lib.SHA512_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA512" % result) + + return get_raw_buffer(bfr) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi new file mode 100644 index 0000000..f219ee9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi @@ -0,0 +1,22 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA512Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, + data: Optional[Buffer], + truncate: Optional[str]) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA512Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA512Hash: ... + +def new(data: Optional[Buffer] = ..., + truncate: Optional[str] = ...) -> SHA512Hash: ... +digest_size: int +block_size: int diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py new file mode 100644 index 0000000..5bde2b6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py @@ -0,0 +1,129 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHAKE128_XOF(object): + """A SHAKE128 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + """ + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.11" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(32), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHAKE128" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + self._padding = 0x1F + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._is_squeezing: + raise TypeError("You cannot call 'update' after the first 'read'") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHAKE128 state" + % result) + return self + + def read(self, length): + """ + Compute the next piece of XOF output. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + self._is_squeezing = True + bfr = create_string_buffer(length) + result = _raw_keccak_lib.keccak_squeeze(self._state.get(), + bfr, + c_size_t(length), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while extracting from SHAKE128" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE128 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE128_XOF` object + """ + + return SHAKE128_XOF(data=data) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi new file mode 100644 index 0000000..f618881 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi @@ -0,0 +1,13 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHAKE128_XOF(object): + oid: str + def __init__(self, + data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> SHAKE128_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py new file mode 100644 index 0000000..8c37f6a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py @@ -0,0 +1,130 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHAKE256_XOF(object): + """A SHAKE256 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + """ + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.12" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(64), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHAKE256" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + self._padding = 0x1F + + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._is_squeezing: + raise TypeError("You cannot call 'update' after the first 'read'") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHAKE256 state" + % result) + return self + + def read(self, length): + """ + Compute the next piece of XOF output. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + self._is_squeezing = True + bfr = create_string_buffer(length) + result = _raw_keccak_lib.keccak_squeeze(self._state.get(), + bfr, + c_size_t(length), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while extracting from SHAKE256" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE256 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE256_XOF` object + """ + + return SHAKE256_XOF(data=data) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi new file mode 100644 index 0000000..029347a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi @@ -0,0 +1,13 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHAKE256_XOF(object): + oid: str + def __init__(self, + data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> SHAKE256_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py new file mode 100644 index 0000000..5c910e4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py @@ -0,0 +1,138 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord, is_bytes, tobytes + +from . import cSHAKE128 +from .cSHAKE128 import _encode_str, _right_encode + + +class TupleHash(object): + """A Tuple hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, custom, cshake, digest_size): + + self.digest_size = digest_size + + self._cshake = cshake._new(b'', custom, b'TupleHash') + self._digest = None + + def update(self, data): + """Authenticate the next byte string in the tuple. + + Args: + data (bytes/bytearray/memoryview): The next byte string. + """ + + if self._digest is not None: + raise TypeError("You cannot call 'update' after 'digest' or 'hexdigest'") + + if not is_bytes(data): + raise TypeError("You can only call 'update' on bytes") + + self._cshake.update(_encode_str(tobytes(data))) + + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the tuple of byte strings. + + :return: The hash digest. Binary form. + :rtype: byte string + """ + + if self._digest is None: + self._cshake.update(_right_encode(self.digest_size * 8)) + self._digest = self._cshake.read(self.digest_size) + + return self._digest + + def hexdigest(self): + """Return the **printable** digest of the tuple of byte strings. + + :return: The hash digest. Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + def new(self, **kwargs): + """Return a new instance of a TupleHash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new TupleHash128 object. + + Args: + digest_bytes (integer): + Optional. The size of the digest, in bytes. + Default is 64. Minimum is 8. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (and in steps of 8). + Default is 512. Minimum is 64. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`TupleHash` object + """ + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if digest_bytes < 8: + raise ValueError("'digest_bytes' must be at least 8") + else: + if digest_bits < 64 or digest_bits % 8: + raise ValueError("'digest_bytes' must be at least 64 " + "in steps of 8") + digest_bytes = digest_bits // 8 + + custom = kwargs.pop("custom", b'') + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return TupleHash(custom, cSHAKE128, digest_bytes) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi new file mode 100644 index 0000000..3b1e81e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi @@ -0,0 +1,22 @@ +from typing import Any, Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class TupleHash(object): + digest_size: int + def __init__(self, + custom: bytes, + cshake: ModuleType, + digest_size: int) -> None: ... + def update(self, data: Buffer) -> TupleHash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def new(self, + digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... + +def new(digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py new file mode 100644 index 0000000..9b4fba0 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py @@ -0,0 +1,73 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from . import cSHAKE256 +from .TupleHash128 import TupleHash + + +def new(**kwargs): + """Create a new TupleHash256 object. + + Args: + digest_bytes (integer): + Optional. The size of the digest, in bytes. + Default is 64. Minimum is 8. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (and in steps of 8). + Default is 512. Minimum is 64. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`TupleHash` object + """ + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if digest_bytes < 8: + raise ValueError("'digest_bytes' must be at least 8") + else: + if digest_bits < 64 or digest_bits % 8: + raise ValueError("'digest_bytes' must be at least 64 " + "in steps of 8") + digest_bytes = digest_bits // 8 + + custom = kwargs.pop("custom", b'') + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return TupleHash(custom, cSHAKE256, digest_bytes) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi new file mode 100644 index 0000000..82d943f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi @@ -0,0 +1,5 @@ +from .TupleHash128 import TupleHash + +def new(digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..40cf664bb6b7068a84f1a19a28269813270449dc GIT binary patch literal 27424 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..04a1ace0a89d2c21f112ede4c0ae7d97f319e7d4 GIT binary patch literal 26952 zcmeHwd3apKm2XwwzTH=9sk^n<mbbVKZDSc(QhNaz+gL5P<dzX$Wm}Gg+ge(Sk<~_O zd0`A*gc%wkz>~}*`2sOB6TWdWPM&#>Fb)Ys!o+qM2u@f+2)r1=Vm}jO!V(8E=>1OJ zs#dGJO)~F~_s#c>O5d%s)H$b4om*A6?$V__l{Hls&Y4OYyPgrX*KKmjWx=V<5&<Y@ zWh?{v6>O@IwGJ1hV4H0wOF<^>QXM)KNje#ZGfX`NRXOR2`aEViOM*{ZOumANdgRKb zS!VgAMI&KQ>aCPe=@ChK?qXBkef>yynjAt>&@f5iBl%e-?IlC6lv7Z&3A~kWN1F*B z@R$P0FkrHof=X`{^kk@|#1{h<_SLe!%f-cz{wpY(E83TjDl{BRm#<}aH=myQaZT^x zC40)eNAG_0&7VH!6ID<-#f0?8KjSV-DbuSs@v?9@am=1zb+^6v+U|<4ee!1CZvJrn zYkzw4hy5Qo&%f|K6{k&if}5MBWGr}|H2gO3(#exw>Et7qk)M4T`5N%Az>%D`gOSS| zjFDqVD(?RRocKq_2{!vzas;Ul2l3rfex2Yl_I1hMCi!Jjexu~GF;Y<S8wDSONL46{ ziOfah>&Hum0-;dr)<|clJKE3{4TV^!rM<JAg{o_B3^j+l!maJy(QsGojY~Qro#EPs z#*VOAmcAs^w6lQ>G<3Az8fJ|h4L65pcZXmw%9<KFIwDPMYj|tZwq5a}=5TkkE3%8V zbcKiIn<5DkJ=>ZaqQhm)?X6H@9qo<VqHSH_hUVh#NO39AO@v*;mey2PED6mn_RWo> zvy10ZW2r;aK|Rxgewp}3{nWxvphSi3s|Wu9-Bx3#C9h{fJA!IqzX452%_C~um*$v! zOrs(x{zYlfNa8E{%wkiX#t3<*(%A&Q8tYVcF@aAyDqTw8+Z7YApxh*gC%cGXcoO&& z5tU|?n;6L_)?1pu7xT9%#>x`-iS^3jQ7{^T(Flx2U^D`w5g3iYXaq(h@LwbX!QS_b zV4wba31h(n15y3#0yq}zecCu~Iyf}%O%x4HdkeX1N;xp1>28XhJ2Qkd?Ny>_NqO$H zpnpj;En&|M2>KbKX=!=xsGy%BnwFI39s(WgU-UyTg8lmcBryL{bPU|7A{_2y44rXJ z*$Y{ATtdjlg#5hy1PVV7#x4d2FDwoYUebd6MDQ1%NAqD|j5J^jooR7R2@LD+T~v)C z)>E=J*t_Txx~UJw-i~I$?59PHoxKSzooz#QLZ1pbev_(K!E=9u!j@v!lsm{PcE5jp zb?k$Ef7r9yx$4Q<>ATPP*X{e@o;LlP$Nu%#y;J;8j(_gVM*mv>6I~y6F0AQabT95_ z{k8rdU-$8fhu5w_?A;%_A`!R0_Ywy(#T7UajP3Rg{N%v*TYuy#?C`$QSMNR37xlgt z3wV#k>b*xmzvU{d_ukdl;k}EHQ-QvK_t^mWFUF$Y!;n1<xuZX7eJ5iJS-30ESBnf~ zk5<MmRL0)+$6llJ=yyFf#ouTBMu4A=9p~pkM!4_Q!Kd7QZPIuA{KZP&oBqLPvI6`C zaGx>!{nq?IU$ghH-}e-JxeJvZL%BT=tM&f4()HMS%aXpLg8>fn|EH2a1<q0};QPhk zpnIv7zpuY&ejxU)@BP8&v;6#1;{VJD^arvTT5%-cI~jn<Z<CI7@Ok^vKJPxlbw7X4 z&p(P?2>8wn4!HgNM8NmS;Lo#`YTkX|6ZaJSDzZ^*;Qvxv0IfgjyHMF@-8cAidnLbE z$&XWb9<B7f;)jV!{?kg|g+S~g%<r%do`R`Kj}UJ7`EkfB0m(n}!z?8IrcS_jwyHm> zQ@kP>gQx5P-yf+J2vUF10>AI9DSd)k@F>b+pFwa>=HS2EaTX3&YWY8`?6=M)o+IFU z3gNBPtUv7A?Y+y-UkdmxpgDeikxCF^$+6>H9f8J<tV+%Mh`)cX)%OA780h!9$WFFs zI6Rn3cD~I|p!8=@eir=LaY!t6nzbKApZIa5Hff(YSNt~t-z$g#Kk56-AA1#YAs3xs z2z;Zu_atKT0tuWl_(_T<#^ZiGp7HxWrL$Z!|B~y#Gyj2(?{{_nrp49y9F7x}u{Vf5 zQyF`&#npJcGWIdRv&4FjvX_EzV4%g-aSFnJMA1v+2$c-diFy<regR6(q2vT0P8~QK z-B5Ungx&$~bc^f#LBMAq^P=eXKv4JlC&Aq9Jq%eCb=G>1xN<a7dJ5$zYkXN)5z6l$ zcjYW`V@7jtyvbkhzsbMJA38offc@+J>o7oT#b`8w2ZmgC{0!r|I`(n!z$dOdo)h?s z!QM|juD=}s5$yL51!K?opQPuL!QM+#c5JDR4L#Wb>L)Y_o<0BR&`@>E9*iBw1m?Qq ztKbD<Z=5W*(wMIFeG)uIa{)~NgKrqY*b*anj3y77Gknj1b_d1OK@-Qmk6Yg{ZU(O) zcJ+-1-s;Jtc^Ta|p&|DN`~Rk>CiZ4c?84cDsQKg)apQjeB{f0$pCqr&|8$t9rv>MK z;D3^)==0yB`Ty)y(DV(6SsxLI-hie@t8g~#t{fY{3b!j~In7k-J+7Q}9w4DoSI(wV zAg$%DoR)GRk(I8T&XvKwrJIAXs?B{%+hSF1zJcTSAEW9M;w>UP1<ZKhgRz%rCJY7- z{4%<$I`&7Q0S|ie;ZQK4tzsT0sWp8|XH>`j?0=#hw&isJlbgQ~!|=o4{PWv&f9yi+ zd`;~0>i*r<qG0URVBza$yZ$sZgy8wLfOkeU|E(Y0d`9o3^62E?f#3H~<Ac6|5w-1w zbzFshAN`#lJ=gQ0-xUdXiwM+s7ZRxT))1)o*7vV0_xII!y{<y5*N-XD<0`E2x?P0= ztM``ne!6%^X73>P#~>6f494E6^bOR+-aY#SobnC$Pr?_f?c6+ET|_(0xE;$R=0~3s z)4bq_`28*7w<d_T?tAa3@DV+ABX|^kahj0Xajc+|7E<S_)=PzvmAD|ZxpD&D@?h)^ z??ceX*>dI7cvpfv4APZT@7?Cg`L=hjAdYzN2c#C%9xDgdzpMz(7oHCGN3+U%FBz`= z$G{Et-)_VPgD1tasNl(f^AeaCAn#tnHJV@SJ#z`7UAch1pT&OOJ80Cztk=#T?D`Nc zMZF!!cYAjuzr%YE^fc4gd%O>TKwz5@)6K4&xn5V!Zp0PNqbJsQOS_#2st6JS+Z>&N zzy|wwd&~VId}l+KhK69X)=NFK-n-H_;L6E!<!p2Z_dQL4+j#u`!`7Y(8mB#U&9||` z7S|nHfW`)W11+(D^Ye4{;*2n<A?$8U=+EYPiVd0#N4x(FyX@R_Xrc93TMaLzs9-dW zMqo4oqY)U5z-R>iYeaxsG^=j28yT67tZb*tnQ1jLT-i3B#ViiHt~rb>rdwRunNH1S z=NVRehQ_nA98QZ(&$Kd^k->Dk#hU4Iaz~cU(6TLAwoK+QG;6k92Qwo}=PqZqHIvzG zT871NWIOE6EUsnf%w;ufmQ0(=nc>iwk!8uYb8DuaX)&yJ8`oWq45yZrja%?9_K#20 z7U1@t(L1Nj?+*=a2HbmbXy`7$@{fjwUL^SO(2xhqqm_VVfJXsq055(rH1sSWC3=@l ziQl@K@ttlyG0Se;k1{WKlW<(RVA^I*ca^hXnai=m*vl4ASTJ*r_X^Sr;vhdR!iUG` zX-9?AeV=8ev*2EBjnmU_UE!Q@kG|AddZ*3rEbFxgoI&ko%~|GmminDDDx97QX8|-S zoQAYTYp&)Gv4|l5ge^$it3k5gT0yp;8Mjq#`R7b$Ss=w$g+sLKHJB(sEZl%B;B?=B zS_uCLhZ}tLj(Im|1NGH|M{!~|P#e<K8!+3jm#;&;scoooSn5%*B*mei!?M$996#~w zb3cE+%DI>K+V8a8qxW0y)$YUXNGYnk3-wOI`4R8KmpR?NmSxTXuFdC}PPgA_R5&7Z z0*o7uSApG2_b{VrGy<a$7>&Sa1V$q;8iCOWj7DHI0;3W5OA%1tDJFlHNXvdokC`C; zt>6hs<E4<9#LWa_xI+_3eNU=BD^=e`PL$<zUqfkv37GmmlJ2c2sq&9MABqsYSuX9> zH-?6lxaK#+1Rs*+^njewyC$G7ZAB`OF#b(rxyev>3_E4Hy6;opEXvPu*;!e!;+IQW z`FU9C(`z6~sy;lb7yi4YJe~s!TE!K&rh>jG+k@x-f{y!Xn*0BjtMA#9E4)UY-zo{$ zN!TLcb_tg*S#q6c2EG6<^!Q4P@x85QcIj+isc%lHXU6JqvnSXPl?AhWzCu=nddyQ` z2C`g!E;~`hHOY^D#NUjR!5>Eqvu=|D=@cz=GPPffn@_;7mlEK{Y^Z4#`$?j#cKQTZ z<F>hish0y-t$KTB6bkxAl<5Xa7l3W+CP_o5n`0Qe8o+LR1-W6Fjuu!;#TT`<uYzOQ zLT2WSTMpdzFfq;})344Y+(siQ;}K-P!jVb7*_n;JakOt|dg(Y~XLaxy8Ktn2-Nty~ z7{ZwIyU6*>F{JNtewB!;1>tpm2P|HcOZCmjZtQ7cd{z!MrHEyaG@-Jh4DxTKq8BsE zA4#=Xdl$e)e3#uyW_YP{Hz+sx$=p964zp0-=A|VKD9Bj_-2Nud{w9drTR^b9w~*Op zI*Is^;^y{)%AJLb<xfGF>@RR3@GBA^wpljD0-C?)ZUQIy3wZv(D^MKU)(wGDLe=NZ z<1$I<_tXD3c=b?RjiX>P@!oe+Q?!G7_l$36{GyXu^a755$1$M-;{1aQs*1V-#dcyd zh>yUZbR#;~J~?(bgGq@GIe&t($vr5W+)mjhWMA5gOglJm`;>ctO!+!8&l^(ne}S0F z*OCKMc`XS|<#pVLUj*EQ{(F=hz_YW-Q4o{2AVXY?diY^C==5aVij2Gw=gi4$Zvh`u zOj;*Igp$Ac=MVT%p@`6lnS{2$);b(x+dCOQIcq6cS3o@<$JmZAc&DaO>`#LJHyl@% zgBTxeV*Hn)5A|U3iQt&92!;HYV<~)3gMJc+cQ5QtgF!QnZ{#$ga4hIt9MdR#)8v$C zAxZwbvC}DTD{(BxF`eSK9Y>T1isOSgzKP>X5|=^UyXPtj>N_|Fa9l;f?Z;_v#o_6d z_GOSQyAf){m_l90X^b<^g|P$}JAl}t(6R^lDhmx@gqXU9-FOK2j5Xxp;Vfzb|7X-u zNS*9(359TG1u?%flj2m^7-jss#WWzUrt1Vhl0(uCG19)5PvLc-pM78SGjqt1bK>;5 zSkc!>r8`^AP~vGIu^#BfHDTPJMd?h!KZd&>;267=@n~rboH>{VXW<wp#(vLC8qEhl z?;)O;0=5g@Z$bYW$5`@oM<IDyhS53~N5LRfaO;GJVJ<^s9#BXH4?~3CCEB6JNlf^^ z13I_hxRS)iBOYHXpa#AH*6TPZcI1WKcnW#OL&(UoXsbiE*mfT{W2R9J8%2k8%k!}g z(v<iE=O8hwy9-@zV=;|szIIkKe!sytE~en~S~i9j3Vf|lPyVe8e_$>;g6QvSuO|7) zxayC`;mME{(NjYjfFJU;@T8AS%{EPqq56>^Aix6|2)KC?X3r$N5q8$$7<+Sg7vpn^ zsPP|yeiz5MWz?p*Ug{KgI2hZBV_XjL<_TUNRzn#$##2AKHium62YG;4=pbbx!2bd2 z9FF3((ifU6&!RzanER-^8Xe5@yeu@k@LEfE5tZB~Ix;<%wHsu8MmKaVD+(S4N1F%l z3%7y1PV~qf%(BW!1*~KzN%``%^&|nluSj5!^<7W0uttI<caq$+d~J`kH0^4dTS;Tu z^~8hRBgjkNLiQ>S^f;cwr#bT+nscHvhv(Ye7@U@|Omkl6Sm2oNsLq35UgmII4+&fo zB?>*=1uo|D>5OFTL=j?4huI9ytMfRh%&90XftX`1uDQb|v+}sZVUi@4ot;ox25~1C zaSw>$vhwR4RKu{6dj@1Cp)9AEFCH(%_4$sg#xERCCUbS+S6;jfjk#)kb)H$8A7={{ z#U2x9OKFNodBN8zgvqgbf|r(Y|5kxejRP<4sN@x(t;0NAQN|}WUJ6YZA!HhxNWAL2 zxma>fn#_H9RC}FcgJZpeS~OW_K7cRH1+c*C6hbg$V*5GHA)!<6-j9oX!NCfYUO@)d zj)S_s9x=Mo!PmlFF99+(jfz+EV-*e|gDNnaQw7q!t3)lPTQiEeY7a%wBfKe03<hS~ z#5iD<O>7;OF^LvN#B^4o8ERFrY7Ti>lBj3aTUyK(;}mx~O_$Kw?#85M{+x^R&(Lu= z64*F6%}*tfZPAjhwvy)X_Gl#1(H)M?@|Bi!MIzCXp6;#^{J^ZFwW+COXW2EOYv#`C z3OBbkL}zuhclPWofn0lMQ%6s8m<d@$$X~e?WAbAx+}YgT&>8OTF2+iavF>PdbGQXK z#vO1hM1kY7D}OU*>fpC=?VYV=0fgX#i7#yIY43>6YVS0EQ>Js4VNq8d?God<o~Jo^ zUcT<)I=5+^Tz6{Y>U5)B=UPi0h=O9>Xd~hXmc0{-2|E?XTJ#((uSGXPfV-CI#wsda zNX2!;snc~^J!~7c{X{-)z?L!IEHNI|GnmDy*$gj%e9H1DdyBGfQ5KD73kj>EjO(*a zAe4oIEr&QaP_~}3?UV&6J4l($@DMmcnXtH@Fk!KUF!XN-ZJ@lGvR=y8o7LDBnobTo zmZU5U3JbzxoABa6vQQ!nrZFQbeVj^#4=)pD>Iv^{f@@nu?64?X7MHaNKe~w)<qxJY zFPs_9L~X)L5!ZyqswPGgnkZT)B4v6c0%Ce33=KzZp;`5}5|mGoU*aSQk5kMP$IHzo zijb%CLU=0b6Dlw3I%(Rpo@HijnnP4z`XwTXZY)K(5{b&#MD>YOr1ju^F(FEn>k~EC z{kr><K5?P$t`qq(k-w}@tkd0(>vkJxyk@3C2%2nTzbHk?GTr?LeX4B%jU0QPDQPSN zXP-Hi@?W-T_wPA^0frI4ZBE^I6~o~P3<j=GFg5~@>TX+}ZiIn;1$w-$PS2{-r!EA& zNQk+>&&boK=8(nzXQbSgujgK;XK9&HJy+YlP%nRoX!k36Zjs2FQF%30p^t$_05+ef zo^R4KY)0YR`WT9W)?ws+9HU7hXFnPRBuCe8ux$X6XWKy>YME~PCp}X@OGTcZMT%8A zzsaV(!zdJ{-TNT+q#2WX-Mv>gzKnTea$U=Q-C@&OTlAT>dfnNA%6~dWcfv%5tyM1o zbW+FR)Wx_tFs-%{-3`(z2dcGB&n9w_=mpjVqKNvLHBTQS2>3*BpDBPin{2b&SZ$lk zVjGPU7=t^vh<R~5PEEDWON#ZYP{OtCf6%jS8}bp<O0;<_PH~=jj%?g&LF=?bdw9Oq zz%>uI!nXEX%(PS8qavem!9=0GiQbS?t4}nJ>SM3R<?z-zef)CbWZ2%8-9#T}j+G1y zuv~QgESeQ|zNY8cih&#iC)=h?<$&m;TQSOP+O6NhD4K#10Mw)B+qAW!>&`PgGzW>x zFc^Kh@dzw@1!B;(OdqFbSAqs}GTF@5bz_BIu)*-0f@6>EvCQL`^2YvyK0c`DRFU9p z<yeVuEPs)nwI2K}#@sv`CWpnCXUCdj;Gb@%&Yz|Ijz3Ne?ZMlNqhN6DEzb1<Z5#RP zw#=Zpr7a4)pw2_+5rL9`$1(<Muaa$DkuBk-C>A`Crkg|2UE9K}8=D4%h+}RWp!Np9 z&I7F;k@a+Tx3_lU;UYb^>kRJ*VQYYfPy<#{&E^gQ!=fY+3awmSSzEgyRJC^blG^GO z%dx!yZsm6{toKTW7h0-5u}y(VG=`cYTeo##wMGh|NK+GA4)v<)<^GybMa_yOH^AA} ztqrWZEz%YBjPNTI605WJ&d`Xx4njL3UCpemp}UQ?T1ef|z}(m%L@{8|@YZc1+*&Hn z#D)m*N}Adlx@5)FO5DDhTFP}qwh5lYjh2>h7wdu0oY{zLN2H-S)KeCXfa++EMzNJc z&z#xONSUG{EiGtwPbW5f2(`7hwlTPTGfU)lM0U`oAD$(?YyX<3zMffIySu})0ir#f z;YF?C&Tv<I6Uc_HrnW^`O3%7xu4h)OXV!{2o>?tBx*E1^2V7abMC}$qzLzC*3Aq_W zN4O=*aCUk+qFBLG+J@U|N?COCip1Gkh5kgctPBqc4k=1KcZQ&;kuFzOhop7RY8Coe zyrMPABt6xk#Mv5!+HeDGvT7ANT=5#SY&hrgiT4Y#x-Z8KuKGubs%kB)G~SfAhs9DW zSv73l#4IeGtz@ZWx)hIbDAh}duqpIr$ui@ssC~nN3OyBP)hqPZBXkwDCLZp3g>H(o z)+)3u&Z1|+UyxFLuT{QpiMtd^b-Xs!@ldLZp;Q-ZQ(X*Q&Of>ZrIhOAD&=Hj+{tyR zPOef;erH(f`w~4p%u4lpU8>)!QvFsB@=Pb=`8TCybsjm}lv=~4RCAl+7DgcVN^{?c zJG@DuswNC7g?>*;+1PDt8=G`!geedd(&e&qs7BIwNp{D=u1nFi@VBLPWq~x4Ye<#C zhpgp)g%}s_FGiTNyWQi*Uvb6NSI?chXi-(wiWPNr4Gmkiba(IGeSja}_u>ypd8MGn zb{8E|go0p}ren@c$1F?7T$sYNvfTqL9rx+9+*4_}&!**`PRo5UE%%kQ+}F}_&!pwP zHO!qZI|tf!mK{=*I^p2H$5PIvk&`oF!j)GR70sJ>{q;+iu3WicLu2F3H%Ftl-F7Fx zli!Cw%W$_)XM{SB!WFbIUmD)*G`u-!c&X>o!sexsyCx0q+BCe>ZeU^a)5u+yhPNOM zFSQ3**rGIY*T;D({uZ`4<y=@;>ZnQ_JztgtE=LMgZ(THY@Y3yxvZ=UylZ^?ZR-vEc zaU3PiHYijXr0ZL4O2070RgR~lB5}4#p^r*d2D^o2(GNbaI;2>MmRJ1+%Xs7|Ew5In zGLy-=Sk67a`1@COr8m9$3r*h{H(aOCM8E1%l*Rlg!^Bufs#8x_4xN&vF181cG(D!o zq`A`$se-o?1>6Y&(pVgjT(VWpLdwn$@W7Ok#`bJW@skSZr6Q$M5~80d^t5D|%NA2C zeLf&-aSt0&=+-zZq|iMh>?(?0Y*K>r3OyEQtyQRU7gDBp`dm5Wh+C*tsPcldn-r>C zF#E5flot?GsPY2CL7~GA-IU%HldBxck2|zVp~?$f`4p;LAcs~RQk3!nf(lh$U^FRo z*r6|2^rgD9TDe27rYUi@PNAwca%c4+MX3roTdmOHx-YXT!uJKz{DOEjD;26*kA+NX zlh>ryvC?!jA=fmUEh8f<%jL?=9WzF}yzt6;6r@q8a0Tglqi_W+Y<3#noHV?-X?XL} z@UDsTTBJ`FcI_dBtHxVcS;`3~UP3DcdQ39ZW}a%m|4L3A^tO_cnn+A)IPZ~*xZ@I@ zkx*TO|GPr9#z|fZ4@b_#{=3E}x!r$lywolA_vEek|46!BPmb?jpf$`-YTwvIQ4Mbk zH_NU+lCQ<TiyX<fGWGrBNWRW4%3(T^Z)0vbR7UdcOnnDAl5fPnmmJB*yH>TNN+{4+ zCiA4_JL3BeCx|mG-F~GI(CF(^PokuWYuHtGAT8g;jH&75-SK@q6H7Ig6aP+iBtMs_ zeLF|;^H{p?DK-2GPwnqHQXU_DlqYgbT*C)2<!SlyQ>Y{rE&lcC$O4V2uW^(46Gk#5 zr7`uj?#N<I`~q?$k0^~zPGt)Ims0o~94q@^D7gS1#-KN+o_BmbBKSv>`U#yrl2_j? zD|^=h;R$i0`Y0{I!PA__E#Q+K^&K?HQreD#qtmMImjx5q-{VN<KV7rPj(YE|7R^V& z=L!9D05qk`#ept$oVnP*6+&!8mag6tLO!)0z99Ii{qQwmF?C$LFXYFh^taC>Ke>O> z*H7v8GoC8=qLLBW94Vjtm1hO`o)MBJu}R3M?oZq-?IeF%c8lPr8ae=eI{WkyUAlds z|3&Z}Ecsi@$0R>_f92!gr?dY$_-RfddqUVrGaoi}MZ2STM2}BBhBsOcMYo2UXshLJ zyuE0SgjzcyjSU^4=4hm=JJis#lhJ#Lj&L;Gj7^WzN{IcNLk(SB4ZA|&&S)3yt=zCR z9BS^_x^)*+5-71T^9WJ-!T~O+mkIIrAmV+8sI+Re|HjHt<?;aS79DEtj)dA8I-6-@ z=)i{M{u}Z1J`}=Bf>32JWQqm@tHHt^(n@J*&58=VNLf);wWhK*RO_#(sl=O^q}M*Q zC3JbY+RmBwaE?oudq98T9@SzOYo#FGpO_m^kF=Py_qF-LW>^G!NGlUb+fa*lMZ$r< zVk7KfgJLJ@;_h8rqYaI$7@zl;uuWl|k!ZNMwX>&~ULiHlYHwzOqPIq@xOrD6G))-o zGE26HySm#Wog;`4%DTcG4WuBkZFo^qEPO7GhIaxN;VJHl&<iwH9Bz}{qOBRaiZV6K z{$Xk;oV2J47!d9>Y;A9X3lSJbRxE03#JjU%^q#Hggb)fh_OwF1p%dG8E3&<_h4js$ z#>TGjc17X4s<6Tl8->ya;!<8(N*(|ISq@$KXtidMifY}Zpf|~2^0KKI<=9RjqVzXQ zM8R^YFCQYrfA6BqmI0w>MN0o6i6|&`SVTG1i>V~8ubu*xgGaWNzFO}o_%6y46WK^i zK@jv?6{WA%g$k-Gy7FJiDM+u+=(jJ5R_jLvOJ!xr{wp7vfl!&!SL;j#4@*H+zkH(> zU-@)O{R%0ke!rvO&IEm|x>Djt<rEY7On7+RD%T&$D<<+aF?EAT)K}|U1ve)O16Ru$ z1?d@OqW)f4px|#*gQXp%r_A1wq_2LDr68_6BT};ecT0U0f98?m5)MdG0m)V*`#WId zztSI&0tyD=k|vT||3hFW>Z^6Sf<LChgp?Ex_Fa_Gno;!+wSH6o*CJV7(F#5WT~~s> z`h6OsfsLf(Olp``{HIVrE~@&~{ekfp^p(Bmfl%L5`szMH{oj$(vi&M<s$SI(UV(06 z{px<>Oo>^8#{}_Q=_~j;N)q*1xfCrmp&}(W9uKAe4hjfY{+COIa;dN6l)h|^BH4Lh z#FOH2zS5V?i1U@cf*(o!xPU|=(qOV(rKjZasi>%5(Fz`tiU;Mbyy7S8yDp<&T4rht zs(~R5B<qXcF)8B-@Pq42;@+eIoUC6c>rZay9y#!;FH^s=LqCX9ctZ8;RFz4+gj?;z zlq|dWGWrkJnp$TrQ@^rF_L4+I(cbk^LQc#ckh5{9{!}1~DLkt0NtOV6<rC{aB{`f# T(j8)2{ax}A{EbNpNhJHf++y|{ literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..1573ca3db330eeb133e24ed6a7fcbfac3fb9c90b GIT binary patch literal 23136 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 OU8nok#yP}^?7smg1Zsu= literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..8f41e31d7be2f6bdecedfe668370977caca220df GIT binary patch literal 27192 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b22cf365e3d0a6bad52864a2c54bc8e2c60ce348 GIT binary patch literal 32008 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 Mu`P@dh{<aI4e)&K2mk;8 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..78faa00b25874f94d59d072c8838bd83d0941ab8 GIT binary patch literal 60728 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 GY5iZnBQc%; literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..acd08adca11a51c5032d564d013d6e2632d65a49 GIT binary patch literal 72064 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..9cf3ef6de1034b0309a98b92536d46dee7bde02b GIT binary patch literal 45768 zcmeHw3w%`7wf8wQnaPAaCLsX=Mw!7;ph}Vf6cEr1OkjdR^MoLfNgxSCLlTn-LVeU4 zu|18c*lT-jOO0)9>-BnXwc6HtttFs<SRQJ5_yY9$2%<d2pjPtz*FJmgnM?+?z4i9{ zeIEzT?EhYS?Y-9CYwgE*?2~Wg7tXTiy2gi9yIiB#BdI1OPbLH&k^n)THd#x+?<mbJ zc;muJ1JIawlf<DW%Ox2$N|N#D@C}cdk3&wUd_rEHnGQ9~Lxx8!W|YIoe0C(Anro(? zTHHUZlKGa)kn>TL@}*v7@~2kz4|mF@<IrIy3mr+%$+EoYP*zXlP}B+hMQ?{{2sh{9 z2S;>RW|B1yIbSjIk)B`n;ASt8^3K#Q4yiwfvbv&v84za0Is2+|E&sK5KCRvH-kS@q zyQp;ct;Q><KbiX)=|bs)a8f?fFYXS9!!^{`PP7!9X*e%`>ObcF=r_%umL%w%s|OXn zG-L2J6C19I>-<CKv6MqE9U-<e9vw&-93yooXs#Ia`#_7uzwiw7wlmPFJ}#Wm#}W`? zl|LSIS2Q!?g*ZpWpl<?gu$HJj;x!X5q=v+?7AMiy=7^{^jugT1Bu=6iNq*_3+QX8* zK9{&O?G7{0ZbC@>x5{$ZAL=DNRnnJB{w6_B2=`Y>r+kC8ByI0RN#GzDT(+XAG1wZa zZV3g0TClFZv0e)nl+6v+)V9<vt8Wd}wv^4C+0fKjTUNcKq1H@`of2HSs+tO@Zm9oy zt+t|eMQd${f~C!?wbFoZ{P>AMlpfNSRyQ;>EoD+oZEL8dX|-0@Qd`Tkw&t4Z5M%|b zTU%?PSY35}1E<y0FGCKFEo}-H-n`_xn!549<twU}Qby>mHPkO@4lQq~t**&#ZOYE2 z_)<cbYO@OqX3PwZ&-PAKaD4V9)GXAMEaIQpFD&R4{r^!vv1muZ$M(4A?jNArShY_i zt!+d-j9}4h((XKt@wih(9f}U=08DpDx+99t@dH6K8}(7y<prT9f=+3C9F3r}3`#o{ zL5HI1$gDCUO$SnSL2yOT6HONJJ0^lIU0=|1Bj`N#QNrX1x|mmph$F8`1RBYW)IShG zms6BrEQ+8<>Ms({{+w-rvn_D81<tm>*%mn40%u#`|A7_=w7>5Nbl6_MTGIk+)`x68 z*P&8@_GcU$&C2y%@+Ok{E_e&S&XIXQ6c<+o2M_e&xZo9v(~|DsP7!~R;<SW3xL(A! zQk<4>2Okmf4HT!P+rj%q{7H(_lI`GH5&sRvX{mPbRuO-Q;<Q9N*o=6fbNWv~2z1(h zM8T9(p&?LzC}F6d(09N&@>cL_8)XRo>jnQM*HSR{big<o=stW!p!<|Hpl=Gia5|KM z0^Y{uJr&^SJ5c8w=?~|>b-EY%w6>h`K>PGfbQ2(8yd6qHv0HKJ*0UHY^(@EFCR+md z^u;Wf!-F>>u`b&=@^;cnTkD%&V4U*J^OgI`%1Z;^e19#7b<QT+<Jp>a!r2sb;pggH z{LIe{boxD80-g7GzAboO-3#inJp42jA;-}==c`-loY%kTsB<oRnR2;6f%ez$0_FM_ zh`g1`0rRUn5qXm$d5C<7<i8M)$hr$<^?-T^gqJAOYapPQS2y5%gSid^h$4}4WIYvK z=XW-}1lA7;JXhyjz85D_n?3`_iy&5Q0Rd+fG_5)X+(SfY()0`pI{{Jk8z}F~^s}+f z*>W@$sQwlD*-+<mUVq$Cm+x$P1Mtv#;(4~tS^cJ&>a2bb05Ko3WfE;G5?=xTp^cR3 z6~wlxjGKs;%B@D7>W>rqi_Wor&l4hhDnx&TpVqx35BVW#KlnZ|b2(djGpVHG#C#$X z%payw{9~Y#nUn(!CeCeUcITm95T5swgl{{?7J42;mA5#@hCKH=N5aOp6g?AYUytfH zK^xMv=}i>%(qQ}?O+ij-ioe90Ni8RaBle=zlz_Hy9udiDNPZa+l+f~0IwCIs98U%t znFJ{<C!F|sVUU^e2&hNk47U_LQRh6}4G@6Rr_pAoVW8cCQ-LWvoolM$srem&R9{C$ zmaij_k>8Q(H@5hVt@#}lalVdbNB7pm?k#q|`?-8XygQNNcklBXd%8Eo`;A@RogHPK zZ+G64es9iqW}u8Doj7`5^qpUn>D}6yWbqp>`i-64TavrCTJ-0=8z{1VkawrAqsZa+ zzT$Vk=sgZGnfeA}ufElIxqC}u_j7iivB%qO?CoA3@9pmJd+zMK-F~-!()E60yAHB@ zU++%e`FR=MqsDH;clz}0-P<jG_kQ;-2=Z<+MQnm7zjv>Dr}vcK=+%#Q??~(jdDiNv z+%bsoehg~&=6LVNzK&HHoli~L@#*^C`i+nD9lg7am;LTze)o3o_RgfsjZMa86yLog zIluGbL~pOLse98PZ?E6j?cMF(<UQ;+KG0A5jU(OL?9c;33O)Du+?%~ekkI{Xy!VK& z^WlVFy!zXNe&eA2S?>!F>qhxUygQ6z`Vr$~_j8u+Z7ADwnRgpB>mG#Q1#dSLfNI8O z9r@nYq3pX5fa1NM5rp1HIvPCpcCNc<;f8rrh~?AXUC_esKIwPA>pfy@)Ax68vvg)% zW^C==n(Teg*yeNhc0W4^=vnVc_cp)xGas5|m+^|vy+i-Z*x$WX6#oejO5X#!uFLOy zeCV;XV++8epYDYr-}SrSbMN==G2Zj*y|AdibK+#9hZ=pS@m}`^*wr}h-RgeN@BPGQ z?9gHDqxvV*&Ray;WC)-82$jDXX1zbZ^I_Wqw_Wi)u=&t5JB|H*_W{4V*Si^}(~op- zfq;uIH+FY#4_npP;_Y$6u%~>+5&fv&IIN@8Bi-8*yLZ^hDu=r_#d}Y8+~j#6zw?1< zyDGE(9mziZ!`?kGt{Valdrupi{rWrIJ5ajEYjk%%m+bu*Hr_nQ=iUQ!#Jk76+3)Rx z6Y4ws#v3rEj)LFmelD?lyWP7Tr0(u`?=g7OgPrRp-1|`cUZm>J_wI&;{qB$a?l-*0 zjMMtd#;4>r&nN5KyeEv)<TWSYG@IO~{od1L*?q<#eY<h6`+0JC@5{y^pS!PnW4!ly zxX{CB`xJd)`(PBQpXhxd-+0IGKIn5F_IbA($9(!exXp~ttntQivhG&Xakd)W-jAi@ z^yx1culV(2K4Tv&>q7(i(bJ55KD3X|yBp?x1kFF>=`~)D@k+ja5`ES<?03KEbMHek z`oDe{2A<V<ajvn&H1Jj!7(N6Wf8ssv-YRU|OE&I-2l@5m`DptsQqoaGOi7zy=*MA- zxQ#a_m4i1Qrq~HR+&%eJ8Fbcs*kTJLc_v|0*^x}fry*jqan!p-T6zZ=`CY$`VqrHa zqZbh&!@b8REdE62!_z~HpKcMXCwuom2lxJb_d7^6Hv3SY9cZ$PFGUB2KY;{`BiIpP z?p`#3-iwBSq0J`y2obX)AHm*F!QQ7I-FGXoo#@>yjB;2Q<s;)X8D%>e#cO;_J_R2j zn;$cF({K<r`*!1H7}~F+XjoCoAv>9Jw!`}CVVdM$*<bsy@iLj_1z{REB1{A8lWCqK z(|oS={nSa1kx`WSl~Kt2&%l<jOGfC}kGsK3c7Y4*bH69-B0S(7;Q^k09x%}S2ZZfm zLs=CvQrPxe(8s&$fBcr;0N=^pon(}~!YD938D$F@C5GwYRAK9*3%mEg{$v_ue`Ol# z?tkuFH}#I$PanY$2-Cp!=r70w7Zb+cCybx<`NrQTj1Mb@jW3Nt#@`8}T(apW-A-d4 z8D%$#$3Ox9BD=r=$S&K-E(07O()u(==pT_?l<k#W$o7AMQIh`r(<BcV$tW=XKKDUk z6k&UeL)2Mf+MfK1W({<Hzk#mYD?9*ZlodiBm8KyN*o*$(bn(G)U?tPMNTzv3m<HA- z(`+Tve6ID49vGjDqKvPMLLL9L&UMy@ZV$~Nwi9G~7zLvR+HHsE`qX8}{#h~XA7T9c z!tyYotOk0hv<q4O0PHgTwSRkLk+GlbvIiPq3KT|x>B%TN$S5&QPhMq?^fYylIdu#x z5#3*zhCJXcm}cTD-~M<dc*!(yfqm}7!ZgDC?+Ei_PKoOO{muV|Fh9&FYlA*2jY8({ zLC-HKzWiRyGGr7C{D<8ylTqA#a_Fbd54*&40JgsIo@snCjWWJ64H^Ia&UNW4HhCYU zQQ`#I9;QJi^cP`#Od4dD&o};FbKplSMA~1PhU|Y7rm<}qZGFVpOQylN57QhFrV#@_ z^?sP<bFEK{8XEW`I=(Urng2r=W!mO%Ecg=`$tbY@KKBt}6zcizJv6_N2Y6z7K-m0f zV$=LEqcjb=sWc6l{}lTFiNpg~SiVE1!SH|By-)NPG5S;Ihh09``Ua+ObLfxg{>m<7 z|G##wOPqc8uXcS^^L~a0HW^a9bgTVyrhPaM%<{R${}R)F94r&JZ0y*Kf7G;(iC(N@ z)XXoYeFwV#nnAxG{nbtTNtpI0yU)q~oM|7v6Km#=?D=0j?We*t$$wpO@!WsZwD0bf z3qRFksOx9IE*a^`lS{wCX+IMkzpQmo?U$MMF^ZgF(f7sEeio+v{~C1d%75InPosdB z)@I>lp9^-mB>TAy-we<E|L|!a-SUB?H5a$wV(80F`xr>*VsUH#HUF2G_Q#<A|Fq{% zKl_JI`<T?l#RZN07h~qXvTnqK17?0&@&7}n{ahGjdUMB>8~%oApDysCR{URL+Mfv1 zO#FFq!{)DM+7}Z$M*hj@{KI>`hm~8@%x_-teYt60T=AW0&Yy-k-(&yb?!R%)$7~RJ z!DoEow4Vpl*w$Q<^5IuF?fYqF$IRb+|FyVd6=UZA($l_J@||hU51{7{?S5eR-#q7I z7*QAcxXAyaX}=KDzN2B%d0*AEU*;)-QHB)W5Evbv_i2sj{(>w1f!BMq<frABTJo#O zg*tv2j1u?TryiO3cTD=UoTM8&=H))E&ChVfFXsIU^#8|_vT*YYcLu(a%l$=|_vbvc z_o@N&zI(H{;5+jbfB$*^bFcNQV3*{px2{|GcTD=^RqA?AF8RqcYRRumL-T$OOp|e< zDSP=>IPWh<&p&+IT_Mc-xPt7(-QW-0d;RXWX^wxE?&_WN;eOs03)Usc`Vnyvh?_kW zM%?WYmwTu69^*4wzTm#6&wJST3^!B#-jjYT#2aRHK0cvo=`U6ppOTQ5aQoBmKIHz) z`?|4FNZ8c<yeR>fGy9B<-5VicpYgo+CHF@1D(|Pbw};CfpYaj8seZ^f2|4!eZHXl3 zWLQq~Z1nz&Ra<WN8K?dF2R`t*Kl1hN%6Gq=??pxS`9MTPu<9Rcyo}2-x<Y#yvoeKr z5BFvB9<Dhk`}Ko9gZOcAu`My*dsxJtjYm;bsnBf9G7ih;JE2v+{yru4?((@m6PL^T zg}m+g`r9NA*D_zD+q#g4i#56}hj4@U6?sz*m&<ga@7LeUH;6wG^6Zc&VoKgBG~%RB z`kr2k{)3BTx^DUacZ6Un?`H-snuMWth-UQbJ#-so58Wa~xZk@2D{<<pxJSA}+%wrE zI_nXi@oa=V5mWMRg1k!)H55HyY$9>EdU~5~1U&2Wo}^nR5O*3EP*gp?en@mL+&!ak zJMOcaw@hI(TA2BDG~Mg{1R*8`J?^;`PtG9glHQ+x{Iu~p$=XGlpsSD@zV7pWV4M{4 zKEe%hQ{F*oc*r}9hZ>*ZCOX|7$CVn?+Ad7L4V+=aA*STfLq4+I@m1Gvf_B1oxY@p4 znD1F(INU9G+h@FwA|UY3$@$(7&1=3v0-Z)J#pU`|pS2>B>}_p!_^hjveEOk$+$y#P zGJMv&ET2)4nXjYWD&jD=`HW@<>gLl?xm8K|MsB{bJk@7_)yT^VeDfK4#<*~?Z;@}Y zuhJLXSQmaAS+_PYWqz}B&315<2aJ=Y0pn9V5gyYqzp68C7l@j5c8xK+rgc#J?B%-i z_Ip9;oS_>tt2X)5UAI1&hxphHc%0?(89UoQiFe+y29!cL;75VZY1W?8Z{Ue-$IP05 zu|MG45-?^~^nCheUtfnc&{5hPFy09mN1R)XI8VpSID~#rT*pj@0FI8CNdhEw%uE#^ zwPR+602v)KGX==(n3*L&R?jAq)Benuh2iI~P=ZwOe$=y?5{>;m--P5RT+nax%qsk9 zz9;hVd+@4$4``pDC)t5DeW7`!Pp=|qeEKIM^~@BdSm`10G(2OorQ?Ol&3WQMcwn>n zmZ39Eqm%@sfYh9YY|ga2RPXwQcxWdd0B?MP9*r-=<6-lGFg<_o`4yg|d)JGn?hx&~ zy$>w(ptx5(D5j_MYd&(`z6~iIv#Sb>zqX&c!uc(F#X4Z@^8GOnKs>h&togus`}Yu| z;eIUcPn-x$In;uuXomyFp+e(yLFY|zu7L4Mfxf?IEyU9E7OUS=6&U-v4+f}eKb6<^ zUxmiIJ*B9x50iL}Z!^d!5U=Y)bz-WS-iIc+!Q*T9dzR~MS)}+A^g?%plX3k}Eoii+ z5sgf2Xp68T()$D=FEwx!UD#n`pfkC{iI<zJ!4c@Z<Z56%d9Oy$^Dq1R`tUrJOm*WE z^rj|xa>&8Y-SKFh9-HHtcRW2CPo;<7^lUwt8!*Z|%|P-|x-%`#gV+sK0pnd~TA?S^ znO5d;Inx$-a-C^4o;+t-gQv)u7V=c}?EI@R(>I@?lF6iaPr%eO+@naJQkW`q6$*`a zrr8l(jWVw?HE^cQGqrH0Rnk-bWhlQc51<J$8jApKsB)&QtO|6@M*o=A>|Nhq&RS7l zDu1PKK6yt0tZ%+aP(f|9=Ecz5fbo1_&2yprxog%JqHjInfVQFY3a4C+5^wT23XN@| zz1k8Br(6Y6$dekHf>DC<_cOw+$Y<8?5T5Hxe~qqhp|Le!>?rK4@#Gd7hkK^)qrUbY zAo)-ZVuc-Xp2Chrp437tI~)b=r!b7ng(C$z^TBzr5dP%yi7pmsf8%HX(J=v|r?4~R zDKZK@Spj2PVdul1olvFF__)B>EZ^%m;d3?(rk`t43yn_#U`?gi5?4XTjOIe)okF9R z;@9TVZ%dwYELOb)zb<}Ds+?mNd8&wTr68Q+99!dQc8-16b1NhfeQ7HFUgvU-ecVF> zD8*WHonxQ!+%ID{qSSjlkH}bQRUsV9;T*e8DC->ifad^`sK}!teB47XK2rgyBD~Y% z65&0bT!aDRcF%h76?Dvm`dJ=|=Yihy<JZuJ#wTW#dggu-jveXwMnu|?9xu}7u0exm zp~0a_02h*}&f8x=se$&JJY!Ovcf1M=AG6|h06+P+wP4B-=k31+6{`-kb<bS1@!0Ny z&eiCxefE{3X$ZyZ0)=sK)?4sW!jW#gFA!g7><F~Kdn%xx(oYvm`8agF(d+!(P1ADo za;I54XXyn~Hm|G%Ax;u3M3@^vfY{9|r$rFrh;UH^!A67;5d=FC5}dyaQK1v9f%a}a zFr^S3b<Oe5s8=4mjDn8<reLU{8e_x^zs7_bo;}XCz}Xf!+X81>;A{(=ZGp2baJB`` zw!qmIXl+@Vv%I=>d64$e21B(gnj5e|HhZbIymj2=OWRr+Y8zeCT$ifdy>h#)+((O@ z0a5?<-e>EM-*wZa!(MOBow6XM*PFP$FKtN0@?YKcam@o)fAX|`j&&;SU8gJdM|Sk} zHIoTm=<B09OKU&q>w62~{fGPdGI8ybdZe#!8bTMsGK57(k&f^HLb?}`cdV~310fx> z7o86M>m{1LDpfxxDc-RbydKc#M$BZ$qRTifC3RLx<{W3@4USv2D@IKH+62!iA_s8d za$c+2+1J-j8D^xU-et*8$^5Q$MvAL5Zbr(OJ8iy{+&k>Pl*#S!vs1R{)|#x8$sqYs z#(-r;N+z<*NWs;1F0zxX2j1`NvqJ~%%9PYQEdG?tcI)hvJj)X)nZA@%Uy38Jag#44 zuibhF>fi#~GdOQW8!SgidD<<OD^nbEHiEm|GAqSFb?m|UXYiyFk3S_94BDN9A?F#; z#eQ(){T$u>(BZy8DU)XnP`x1WYS3p6pywz0W3lIN-1O&d+jq=D9pdk>-)ZZN`>ypa z)Fl(@P}|qQj(3o5!IZVS<r-=lv9I}Ir0qo-?@_M-eLZL%*jemzFC_iZpt9}rquYM1 z)shEA2ey46u_(o1YE_i7*4ke!(&X%Mwgt|%z}Xf!+X81>;A{(=ZGp2baJB{hzia{i zPEhoBfv^l0#{n5~{HTm4$&f!#lq}=?{ioqF&fg_EN5*OGPsa!|P~Rt_OD#G${p9Js zCW=?d>pK3HPemM2!{6|EP^QykXFAfPqKRfyT!Rp#jpyR1G6R`STW?0ybt8WRXqcpn z9q7PJUoRD5Js*^O{EZ;G=Aq+spQ-;^$&ZIoqCTn}W&B#1{;`ZJJ<VeN*M9kXcF_Va z6&ILzdq#%yWLPJ|l`_0ThCh(uFJ(A;=FH1nWAJ6Tu`X|JHok`C8lOAfo9msB>l#y1 zTjL5;hh)MyuXn6=G31-3F&ns9ey*zS{Ak6@_zL))=@Ab74YY029NEC@*}yWNg$!hU zVHkaY%j$?Ppg?!50=Lx?|0c!a;%QgERkwd#5N&rLh>Nq;H-?bG_6?-j97z2p$aXSi zykjNtJ8WMULA+nkzK>srg&u6j<z`Mp#Qp>PSbjx?O&B(Z2*1Kl!ejW^f^!fl6tCHz zK#&;F92X2Ds^yR1*C!1oR{I|OB>XpiPT>^%S7`Pg;G`=x-8X`$nogUoX+Jb=S*D%E zv;~;<>C#?W+VM(TQfcofZSJIPm$WI8wk^_*LfY;}`|)V69BpQ!oo2KNjJ9dfCMw$A zMEj3uZxHR=p`A6f>4o;B(5?~M&q2E_Xg>sPRiJ$Y^rAn#gio)?(<|)sb~(NLO>bw@ zd(-q*Grf0AuLRTky7WRVz3fVFqtdIQ^cE+*XGw2C())?@0wKNLN3Y(|8*%iO8ofD2 zZ*<XHR>_Z`#a8M6nmP|npRybcl14~NS<+Ug=|4=aL&W90n40xRDP)E!=PT51KTcbT zlp5#dl(H^qENIPI0yR11kk&~c8xo&veUVOgYeXEMYWof4{)sgKBs<Ylrz3;y@{|<_ zevfz>fwUm~kOVC?0~u^z6X|<Y`duo0@H#-dKlv1;-AH8dLwXCOrMCgbzo{oDV!#lk zYZ<e^9RHFo3LQ;k5@pI8vJg<;uBVa;(Vr63*L{XAG_)Mq!Q!I`kETOkrHXCWuOVUw z@_rNN&~-%Ip-;DB>`DT*;2cT=wZ2oIlmH@iom+@F0YCZ+`X!{v5#YCpD4P03lSqw9 z4Lyv83;i!T?vJ5Q-M#+iVKtQXFM5_F+>%+Z>AQ4cplnpmgLBw9#IsvZc0#80?)z^Z zz81NE4^=a-)$|^HFtyj?VEh@*5x<y#7>-(eQ{*b}oTHapZozMv<tF?VThPNtJSKUb zPSCWLGw^grl=B10b94W4vUWt2Lvo_hwGpNC9Y`G4VElSj7SbvTA=Y9GhL)`A2p$wd z6(nsH14f|lp}z5spP`_52l=RQ)RAZn;h5)WL+JLK{s+_U(Vv9W*Hwe_T-^C3mI-8H zz5Lu7eAEz8Kc(qqD3=T{WEp<+2hDP#KOw2F>jm#nn&H8636;~1^Jbhw8_j$H@`_y` z>>#3WfCu&Y<Q1cl;Kn&@C}n?$9pLCKS-D<NaF8uT^^e|yma(4Di#6@M`BbmfdJ_4w zUJi?nT;58A3rKC(b7tyzlIjxDR_j-gH1|T%=SE$O0HfehH|iPWByM^+M!!i<rlQPN zBsUSQI8r<Ruavsbti8UCr7hHRNZLp-!YtHhP<I%K`{cxW6-g5xY<V5*3D(>^#Bp3O zYDoyqU1R#DsZNb9<^{09>KgG2xyhQHL=EwPsF$0<qrcLrugk^4#BBO<J(twE0cR`D zEF*^mV%9*Fsr^pq<tXi0Q1lDT(xSiZsjvGtRoVr5HbtI7Nsr*nq~^UyPa_FM(8`aK zdgR4=0-4}FMEBy%8YhL)umqvHmps<7iu{wZUbvks^Xp`u*2Num(rDcqnD0lEkYA4` z#@|5pf8rcdt?7@Z(Qupvh906U0VRVdaaiNMh>>ax8uZa&L~)}x9l^?UObsX_i1HcM z56|NqQwz$uMEO4Mo>$`>gK6PW7g7EU*Si<zm}Q`xPn6S{pyC{ZdF0UxiE=Ky`w-Tw zW9Mu7Z_-Fv8l=Xc1s)R(ka#Z4hx2Ozcq`Wq+TzfEpL)>(P-$tSjav%zwZ;ghL0TT@ zmW8&9)_|IQBYwOnC<iAUVyZa?dBP{I&~lon1-neg9|7iEYP2plHJZ0oq<KkUZTtlk z`EG`lH1eJVMgQ(-O37^onoM0I5$dlM>T5Z_MT%v9=C2S~Nj-2`=1(G*PP{?0EJ&dQ zZTyqOH7moqmN-D4HC7<-&YDWRFf%cZe~9=l%dpZ5hE&pJV@Mw5xNNF;=`h~$7+5CI zz@g!bM|6lMBnaUPFl=@L+-WHqVFAwUA&Be;*hP_1h%7iy(~5D9%Ryw^H2Rs1pNZ5` z!)1Zy!xz0>Pq+<UlAR1){)jC9g)^I$gYN*mh4T{1G)84&ggoLvV~f0rBVi4kBJV_i z@i;Z@QmVsvnOoP^gG2+9&~hO-=2I5ZzYE}BDMB^VU7GeOA{VdMG;I=9q6CyVI44nM zwgCJN=VYps<?g(RKY+eVln{+f`$OG!E;ZDDAnChqO}i6k_RkUd9l+x_wTa{(?W$tA zI&%F~PpG3@6Oi;im|nw~JsOe6N8v#g&Wnj{(sZJnkA)FV%!@3#79H$nWJj;obF~p| zvg}{O)4wms<(5{kZ<TbK-5!(lm6Qop(MG&0Q>n16s<5mh5rtvspn`Brpm8|*BggtW zDmnWGBptsHM#P!jj>z{%<F$00*=rH`E5L_1r%(y&sqPrT&!v2nS~mulo;XFmKLc#Q zc@dR(G4WpZ2v90U&Pk5~(A+T<=cK0*xe=fZr|`9la)p*Kh*<wL>uHBE{s@109z4(C z6#mi+a15vLwP`YwrZIAurBKHfdGo)fX)|$(yiEYt;Y7oVM~VPceLGHCDxjUR&XpyS zA*k(c66Iz6QIcti337sUc%DcgQzTe56)Cn3s@BiZOTzOM>Pt)1K{yk%snd~b0?q_9 zVw!$IN_wI-<(!oAVQG5mF!<+C&6;vq;?%?`i3RBxK0I1t;^pAL2rVJ1XLEuIr7zTo zC!S&i92Zitx?Yg3BR0s5)EuxSPQ-;(xX7f)XcnfH<aFJdl9*_6P|lR(hzyfaf)fO# z6cJLh^(%%mY4q@d^l8H>W13AUG`N52xAfs=a=N11rX-G*#Ekw#E^0_LIZYoNpO^Ws zGlZa_Hd7&#Q;=>M_WK!VxnZamDQVI$;bh8+Mluag)XRsFsw0fsbTq$LG}SrZxeeDH znRm}Xt}IT#JOwG#aH_=fve8l|fhz4vq>`{g40CCkD^fMgqLEtRtK^Y7Y1;YGwKR+L zP^N<PiNh^W=z>J}&4p4j++y_beocWjU)Z{`DaJ@C!igkpY(E;x{o1*xeTn|W3|slI zio^wp^I_MEY?>EUx|muCv%o|V%O;{MB_~o3Zh_oL6)-=_7LYDHJ~E40zX{n8-LDoC z`zvFcFPioeMI~ld@=`?=ih~z}38^Y|oGdVEIE5IQhfH-@q9C9@W@}f#{~A+FA4a$7 zKo7HO?*i%ir|1AW4vOGEt?6@`nnO7)%X4aKSB9FJ8t|#~ao*gVmZqjqPFrhB4n9<# zvux?ooK=%A4PH8NTuW`u^6JpIhWf^~RXO0RZ(Q2YR#U49UXExn-w=Vo+Qypt>c-mE z)@-bpu>K6y)YR4iW84A8EfipMTYQJTzHym}%@40Ly$0%-*nF`BFP@;BX-nGb8$#pi z8!tz_Fox(_f`u1X)?e$o&6b{?KE&qKZ3*dd7F(wE{%?SmkzvcQUI#ENPPgfH>)V=+ z#39xnf5S1&HpucH`e56TIkvHLY&jLSK>!uDoH;f>qH`#kvzGAK+bC7>%&4$U2XloD z0Q`gM2>6i^zsR-LR>H(VyKOV(RM>2GYnpD$v0IyTVg=ufwa_NT`o30S8)BaiouSio zyY>6fc*b!ms{}dm3rV7MfEg7si({=VL9@hJ?2dX{ssJd8Ld)H#OqQU`w<S`DYTsjv zw-2@1zGaKI-Y^H6Ot+5!TvZ2nCE6=JJ;Q$A^n&)OmtW=>Y(Ku+?)Z;!w)5=SXiWR< zm)R|22UpmajdLuRn$s%DmYl)ha!<{vWrBC`lY%gnGdi}|9TjzU$K6wN<|`U_DnfS0 zvZ*<W&oXMT-BA}sbf9#iAu~&`ivsTxLX>unx9pCPnU`qONMp<SD3FLE^T;To5Y5C3 zBqxaDY)mA5WcK-r$Yu7+eqlKKRK*!HI}`f}qB8H}inDYU)KB@C*@-B#hn0_+or(RF zkH{XbW`v+HF=lomO6j!&>JCBS>=9*#^%O)H6P)4fF$JC3MrQV~pqSbJhc=3todtcd zjbbVvGdmOe*(hdqZcj-6YU@ra{d4_uEyj!KQ>Rns5`&TG+S5Q>Hg!6=jUYOXL(SXl zj&_sL90RE3wnP)hfH()klFV&#j+R6z$0U9Y#M{8xk4V|?(`_R$pjwAw7P*#2?-7pU zmm^*?2RL)ul>y-TX~5@9D=e^nea`fP%L92+XVaLAVb+#nM`rt#9GV3E%C)v6yLGqb zz$}rGo?&x<E9r+|v|{!_%1Rv**`V79uDb;aX4n$!);BTPWmxaK<vuFg%woUDW*cG4 zkTOt89c6ieW<_hNZX1S#b7;(8Xd5JW+EC7wHpf&UX>B@~p}-vb0?b1h)}P*tY{Q_m zU5`U$_gZuSi{1K*n{^P0^r~eJI0spOc5~evOiNIApG9A2&b^4`LKEwuo1YZZub7Z+ zS!ptLAQ%CSvg}il4uFi`#k^%^%CLTLGc`=c8S|>r%t8vz7Lp!r>i_H8#5Uv_m|Rb< zaNS0Jz1(F>#hjfmC)>WDT{tsb?ML5m9H*t-Fr=m19P@3ub#;Z!V@-6y(QdPO?0SXG zNoy>#C&0ziZG-LB4Bd8twc$2fYAbnX`fZ?P*oHiWNIN?hdt}Dn1qKUeC5J=j8D`US zT=&^htu-#_msR1i{|j`+dNa*tyVAY@Al-fgQK*0Gci9|{bS%y6b+*K(Fdz(h*p}!- z1Kgb<Mu!CZGTU(QIj2>iF;FkjC>6Hk>9&Na_66ypWs=cAQ<1tL1LAdCve{zR-`qk2 z#&)zxvi)vblJ(b!W6&@MhAuf)Tpu1QmYEt^cj(#3_w_k8y)v7QwYEfS1AcXC$fN>P zFFU)g0u@{a7VB_<-ZBw(fXC_9Yh4sPNk1X+LyPS#+HI(`IjY(0i<AXdzzp9YhBh68 zNMZ<4M;k^aw3Z{sHVC7V<2ke%RZP!;(3QK1Ihp)G=xek8Opargd>XrSTk4%QeX-p- zn8t9dY0X-Z9zV2QPJzP*8Gjb!)HZn0ctoFMeJ&!7Y}DqQhqpjl<&(#ON0Coi>mRmH zn?8S<eZgKbv<;FHEuO)SEw&8DTwB7g?KhikoA6Ux#!}0u^nZWu5AC(|Z-HfU8mwb_ zaf1EB1+VPcYfHzaiLjOB{B$uSkFswjqSL<CHtfo2Fd42%Xs8}#cZ{TjWVp%sh!4vK z=`Ny>Arpvmfn@w&q*g$Q0w@6$&b3=xbga5bce<*8k66<mw&6Pm8QGS2Tzuv<w=`W_ zyELS=;*WC$Lt1@fV{MDrNuaeZuPzPI-`kSA2KX;>1%u)Ouf8!T|CSg23fMB2_-Siw ztzXuN7X;|}yUZ5j&u@vp=@rgJ%)ww$Nq$+`g5a$3t7euJTzwV&)v<nm=c{eP_)yd2 z;F9`fT0>KHO|WfpsA<A@5tow0Ul9`*yP*}$TBs?sq(0P&YBaTkT>Ug_Y+JFUwuKc` ze^o4^TJ*Qc8me1E;;)8j&26FJl3LB&P@&c1Z=Y3%>YEx{HS>>-1*z>c+KZtsgVA>3 zKY7;Fh8$*_R@c-(V`!!HS-QNsMd}#QXyWge)z!DK25m?~WkVV?qWvED!)!1Nq>K;V z(9}|c1R@h5xU^|Sa|<r&H6fP%yq{~PchZ-6kHa-?1^%wucm$!g#@gx2YT*j?OA)PZ zS-N~WZaIv*bfRnAGS|4PC%DGd-Oy6qyb@ti!Awp5={C}GGCPshP+J$$ph;VU@&)-v z+QfYU@xxEG<K<IRT`OleT$186JOk_E*sL%k!$&2_s@;9+CXVc$XbLfNhXqEXfeMtx zQlLyJaFtS^j3LW}0=M4Gkw^u~x}wE~;{z2aW(6{osKpGq8K_#tN~f8Mv6vx?*R{oA zS^d#K$t5f~QcQ^wQ=-I_Fbs<+?O%9gY@ncuSb{2I2&!N~+^lHhqcM$K@i}d5Dl<@x z1+mmvpwzfj)pr5IpDWTlhOC*c6*1f-oln<-47Wx2<AN@Zg_|!J*<gfmBTXLsMgf;@ z(Y#&HOFbT#U^3}i3B&)Al7u&Mgw+6Fv~0o0vN(iv+?EXg!#e;{(s3DDwA`*)QdF_3 zZyCb{N{f)*wM0g)4HGS0tuk_Bm}u>~T}JK<6XUwRFC#w*6K!3;l#$26MEihtB_+8^ z{X>2oBFAgeG4L?FOp?r@gJZM8jQvaE*uWCYVwG6dHL%1oE~9@qu*Bk6B^JjhvABOp zW{lrM__lo9k2*8tXLVmRT;hq0%seJs2*Wx>DrLA#lFV{BcD-UOXLy4ml`>q_FK?_0 zF^%6}s8xj&F=Rz7TC2vG)v(gc!V0Vm=Vi!>P+rEYl*r5SIn?9g;^PMmN={BqO-~;> z6g?;?OXZLpk}-$WpBZy#(Z<K1O^8987=w064BDlNwp8k5(I#~<<|eUdlVf%mzJKq} zFzX7}VR&L3lPb6!{?5>X2M^kLQo_Fu;bO00c$nTc!l7%6Y<Ox!#{?PbS{cK8@j!+S zsK_u4?|_)3MPnr_QKU+S&(gb4ICQO;p$~5^n50GYMgtwUDN-fFQ+OSL4k*E}*(E5X z>bE6)RFNtfjvmEaMGSu;9^H#N{#L@b6seNo{0lf^3B#TAOcn<u_DGn9=jbM>lHu)m zUT%`g8EWDowaAz$p-+)289s9nXDnuTjWYbAHVHYzs)OMJGHI!{QX8L<G4gzuCkd}r z_l+1f)C`AS;9jXsKSRpsmD*()8PPdV$OZ1vZCXe}`Una~j2?BfHmd7CrLaHBaQ;7B zD5Ts1L1tt8PkzTpKcA}nd?CZN%Fh@7O2QqARL(G4`FRn;hvfVFX#Ncn9#W)AhSkc? zOBn9SV(TtGBH?*qKWBKi^7C?rc9+U{o`iE1sgmJ(H**y;oT8k1aj}G7SENdYAJA)b zIMA~g)+;|>{7nfTQlv_TF6HM%41a(ZIn1&a|EGknD^exHGUewb4Br>;fRPgOY|^jB z%McCC@I6JEXUYlxhL>_-+UFy74jyAITAPD$u5yJ+hO;E;PnOl1YgOhwaU)h`+!MDN zy<)X?=^1*~YP>5FyEh`!q%-xoQLB>fi5s;l3qN?14!`H$yZ^y^;?6AOpQ6s^)a;+4 z&l#KZpJXl<xyOiql5ld%QL7x}M)1^8cRwTC=x*b6Bfg6rxl#FeIm74GOkd2<r^dF@ z1rmNskt!K}s%H8!hS#g%uJld`A6KMGh8L;fu883SBh7xRYo$*~_?9A7GQ36&cO?v8 zQZs$&AqmsN!yUu#sNt@hp{B;R(o6|wDN-fFC)G?}%rIAtZKYRA*s4gC3~yCqTiN#| z+@MH{8S)&CVK{o+q9xnkcElLll6Y)eEhj~bwknD73u=NaW%#Znt<wHUKHS9`q=y}q z;eItQ&+C<NWY{Yi{)_U;a)wUjg7Zd8c(o!`GTfx*<zj|cC>NYZ@2%2tn<7;*Jn0fC zG?y~GPI=|Lb_pL<q)LVtD6cGHc%NE-&ikE&`xL2?VTtm}5{BE=ygct62~)ye$uLd1 zVEKg-E>NV!3?Ec8Zn;^r@UJxtzZ}A)8vEsV>4UhR!>~iS-~xt^DN;GZBsD^nFkG#C zVbR?ZKB-8R40Dw)6fyjzTB9v`TEY($sghxp@`VzHyVanz=$M4(hJAtIT`sd(aE-*! zp$xysC1HUgRWf`^4O+zvCo97*Dw1%uB2_Xxq6V!phPBEU7Tql2!-`bNaHP5xDPnk^ zTB9v`O2UJRw3s1ZfZ%eD;SZ(9*tP35x?G6%jksvSmx#05T%z2jgdvY=SiNO19w+?< zBU}dKYm_gQF#Jz7u9Pu!D#uwoTEcmXRLSr;HPjR{yh1t7;%g*qSENdYAE}|HjA4uN zrN!To@G(WIWH`oUwi5aa!=I`NaPc1`d{dDs8CED?Dq*-?4K<73k#I=Zml%Fq`BFK< z(`u+$JY4$FjIb{;{H+>liWz#tj#DV%>M)7nZ`4pz673SUXu=o9*<;ux;2xQbw@EL8 zdt@>`9ri4SbCr7(F??8!K9$c%_<oqguu8c{3B%Xa=u`Tkgjr$tVE8Y}J<1s-DPJh{ zNO-j(RWjVDMxSDala()&7D;%EB2_Xxu123ShSw?gC~cSU-xaBn;Yj5kMGSwe+@tg{ z313yDN`@uMJxUlpuSTEJ{Su}s_n61<C(1nrJO#0Tp*ut~uzM_2W-n!UUD!La82?bQ zl`#B3jVHwni<K*sE|c(1MJi!PJE-Wu5`kezdB?mvC45qmDj8-g?<ivUfSQ};{Yk?2 z6seM7rSgsvhPz!t2fExoEaA|wcQE{p@{V$bcI685&XaJKB2_Z{qZ&_&8BS2HFz-qU zS1VE_!w=MWQpRwp@{V~oOZZ@z#PD~@JBrMjg@0{!zOl+-tS1(O)ZVlMgU!5l?f4^( za51q^wn;3LA!d4pI~1vu;R}*v-lpf+%Zjm_p<Uf2AK>W`O2~XH5bnfqrz&zDLzYIe z%epxBreZ8(7?wRRLRNn$bMa;}%>4|xU=mZT#Bja9$dJXDjQxwJ7#GO9$81<kOz;d? zOAKU$38G8Gs#9wGg{4I^#wd+;baOepnaixjm#rH*9S$yojTT`)E*71W%VhI_iy=25 zxT0%}c!ZW=3CcUe5=vP@xVRWjCp6alvKhk#7Bj4tNeP-Gul0a-Ph3_P7yOz`g7q1` zqevCes^jTS|3l}Uba%*1)Oi`-rD)zR#`h}P_%6mjRkR6Rj2}|8iCv5zQ?yIE7(b<G zmv%9JR?#MPG3GXn^>jzKFOfMojMG|sv;qDclW*@pKI|Up_m6ina=YMhb6!`66v+(( zqQC1NN#vFRG0^oBN#v#hv9RlxlE`fXVo}$xC6OBk#Imj@B#~PO#EPzNN#y1ManXSK z_OFFziLM7d6pXG0XmQcC0L>9y3DA<F>i}A6bQM6$h^_%>nb8#hO-{gJpS9ZU2?<F_ zx^DT$Ag(`$<m-$%q$in-Iix3<jM)b)+62{4!nBFXEx27t24fCM24fCM24i+9lEIim zi#Abt8QY0uFy@eCFy@eCFlG-W8H_n38EkJ3Nd{vMNd{vMNd{wfc#^@GLz2P%!y(CF z%pu8O%pu8O%>9RCFy@eCus?E0G8l76G8l76G8l7rBpHl3BpK}A9Fh#i9Fh#i9Fh#i z+`CBzV-86M_ZJRH24fCM24fCM24fy9NCsmLNk+Km#X|gk#q(<YRL-ziZuiB5TZR>q zM3Z-U7suMdj0|t;$H=iK6k|C<-ct-AvD72lKo!eaMJ|~1DeL0cqe@H}!?2j(mlsnU zOH8p6^N<o#%#g*LX^AG*7}~S4t+{y2@(dGIne$R5ygE$c25$|MV%LV&9s{MQX8Tkb zJIJt4k;-^i_<SWL$bxSSlVS<}Ko(N2*eW^abzxGhocJDt%=?~Fq>>>Qi-#KwSzSAB zmo;ly1Dssfcq=^%j>A`oEHU^<8|Gy<|3Z)FLSuNXu6E&b)niL0xzl8$e4$)ojy(9H zjKka0%+yozGVC)ME=Z5e6~>&8L(b2aaU6cx@`lTW3y0^+I4{`4l1;>PUfI=2{;e|P zbucfmqw{k<4jW{?W*J8FN6+)ob8__j89moU&r8vBNc4CgJvK+{!+p~)9UvgXxiYMh zA^TaAj9)LqGnKbfcAl4I_(kO}IYW8pO8O`natGn^qUAp^-lY6~q8UcN${Eeie#ftw zMyG#n+=>ge$(DgER;-MxV$!V|f7dZGmldD-<L^KAr`t6Cj$(hhUE}XB_NT{d{2j;s zbce>@d+bk7z}t$E6cbx9Lb+nn6SYTT(v!5kvcV%uvueqjmKRCk@>8_tm~^MMB_=&p z<L_-omS)v3+EhkTOl;K#YmS)obS>8RAg%aH=7AW~u~oxu!m3#157jDS(&Y`qs4Q0X zwa)$tR!!b(?oY-S1?2t10d#rSc>sODwT<AgYVvmC0DgHBI)Y9Ub)0srFM=ds5`Hb( zK)a_%`hh5aa7#LWcU2UEpGi1%E!=MAO$mGrM$iY^@mkPHE`P@rQE{xquMVe;_J{9- z9!vlGK&NuJqw|-!{$0|eztZ$4QGT+Pn+Je{>Pg3$+Gm$Yb87F;5N!Q^V(IhWf`6cY z9u@R~{`s*eabSO;?-T0q&uBlSzbiuYXur({eK6V4YpN*z4h3L9&`nz8?=_&iA_)?& z6#N7G`%QwLsMg5h?{px~cLaT4LBBWy{SUI7BB>{L<7dyn|1#*VfyHY*XW;)-&=WO& z)0^FQ5XNh2AAY0!4q0X<=&{NlFZomD1h-uBUk>`H82ZpWF_=Cy!~&UTX-lXz)P}!V zyi}{HZK+*W-zv63tq3l~_OIGjZ1JjT3NCACT2kE*tO+%>v<9o&R%x__si8JhTa%p| zn}haN)d#CvTB=tEYa2r?tF^k8>J_!Ynzj`yRwGM9EJ(Y;`my%gq@{LCMef+ju5WFr z7P1FyN)yysCBC`&!ThWIVv|};YZEqQHP$rLYC->kt9)~@Au1TezN=t<AZW4%{3Rfj z&7H}aW*1&P!&ex*de*Gc{IXz~Z$@E$koTjVVZ&Tr-t5AH88d_9@jc#4v|vHm++es# zQ8YDZS@jaqf?9`5Q@h*DPqzf?s_Ps27iI3^>razA>cloQb8}b!^k8t=il#=|hSm~7 zBcKTEm<zLbC$f0nG$;#{8^DD2><;~OmwaL?Uog0IRd^d+xOA$&mfgB~MW}iS!cdDD zE@#x(guj8btg$VdHuTkutFO^SOze=$u36oPoSFzjEoREf+Ll)A=j#^<BCVyip_&*a zYQ{#kY@u0psCE^wXy@#frkd(dwU%AGT>9Pe8sz1enZtBIGY4bJMIumuP^WrD{ZgpV zgo5#tEu<~MKE7=D=n8l_m}-}_EkpL|#%1U`GFsnQNBPa9B}-arS8@!W1*&C?wqe-N z1TiMREQx#T-yPD-9gh>kfH-*F$f0};CsS!I>wnPo#7Fp+Hs`OBfJ47zx5_a3+1F&y z6LE5WUWal>pBbiu<Pzlk@_DD02O5>l`FXv{A%CA7EaH&Gaa8>MDf(78=jU}Thg^Tw zpZPc}M@jVUagOu)m&05sDO!J4pay`_I6tqGIebtuvi#`!H_H4oBp<J*Ib0u+AG7a( z_FDxSwTXJ#&GUc^qgQ;SYvj?2NMwFqpL4i2k{LLvc<q*`{Jf6m@Ip`j0ysZYZ;#5) z>wOL}v-LZo_5Y5{&+V_}Np=}F%P0rY^1p`!sz2xF>jw_YIHL@s<=+o_WPZNR;BX8V zEc3JdWmJ0zfYyTSAH4oNHP_^b=I1zvzXO{yBEPzBx$4X1-vBn!pXKxQjpGaQo26rO zA^`aw=jZF7RGEJ#6^?`3jrC?b>_u9ne7;^faJ9&$xy(TQa()h9M@nRVtxB>MnPG*D za=`gGd<O}HS$|&lR>=I!$N6P-II0~2B3iDZn1J)kWt>Xo{2YFW6vm1P;9F9Dbh**I zRuH0TRL<{Z{_An69C<|ZI?s@Qj9eghaKp$#qVu17hWw9Jn;GsR=Z-j{^N*GJqw6`N z+04`y)qglYhZAM~2oVDQzQv^Qt00`t`8a;X8S)2zVsacfgM7|U<wdcGq`do0jw(4Y vyAYj#ll_V3KN{bnniv#KyZ@IW(5{IpJX(KT;l|AW$%AJ8xltLSqT2rfm;PP^ literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..6dffb17891dd4c0e14702b76464c1c7f6629b5aa GIT binary patch literal 45832 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 Wx1Ua9BgtR+U%LFvFoCeF@_zyFBYFe? literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..7c72fd09c9f497c295df96b5948e242ace07e567 GIT binary patch literal 54160 zcmeHw349bq_J8+GdKePOBqWdo&`e;Epb`=U3<8>P_P|6E2oQuggj|FTnV3vCyg&hU z7Ew@F-4zWUyRs|mvFa|XE*n4rQ4u^4@xnVSD3<~rEC27SuGce}45I#!-~a#lGtgb% zdR6b$t5>g%o~i20AK@8kQB{RMR^?)aVvolelpL85_mTt%a+GYPE$-cvG?6zdnA8fT zw=qZ@DpD?$p;3~IhllDAgO5W_Cq7YLzLBnkh2L8YI)|ZrHY6P@HqwvHY8g(Gd^2Ro zd=w?VxXX?FaWyT&ZPIic+KptPBk7qf<%NeXnU6zJC(!ag^_LM|ChHX*7D_%2nXdqR zq~}llu-V7S@=jzIyVRdUSzS@TL=<MlHR{p{%KWb{99Xgbzr7!P*xupMRaf;IwsrIb z(uLBaaS<QsH~jjW7BofW+(@)oT=BTp?<s%gzTDi~o*C^N_4%g{Kla+K-ACyeN4EcS z>A~2&ukWX9C;TiyN{0xkoj`L&px*~tr2JD(KyNq!o$BMn75<qHLL~WpL3f5{M%;s| zTLk(t&^jnFO6CY7aR?QN&uUymuN^6(N`|CABk3zg8T7SAplp=%X}UqUQ#wqQq%Rw8 z&~GvV<!VWH%5vFHe1hIK*k5ISO7EbwQ;tzZLO)(_<t$%~x87e;=l6OQZ$(v2mEv_5 z=6TD?>&h#u>iy+)g?YoOeKqBUCDW_RjkL%q-qN`xB%q|a>dJCuR{5;@az6#7weytm zdhP|;{k)LwS4vB&t9_+RDl4z|*ZJlt6?Nt1OlznuEAgW&Z%KW9ITWiXsjB9*vZ_jO zaIDl96ka?1H)R!ly)$N&loBI!SE{R~*ZODFm6w!d)cZ0rDPBrwfHKPC9y-k1HzTW` z3HxUBC(}?@vWS01zp$WJwERc?#G)KPKDPTE%kM<Du`1t6T0`e5G=fFZWV`b?#^cU3 z>QMBN;}p}Kl5P*9b9^^7Fh0~rWtSK6<`6oi@#jDYoy(xKV<B`XYJQSy4M@|0R9z69 zA#@rm_>&$&=P{1bGDGNM{*VmWA@oo^b3*8HDiR!e2%W|v{^W<yL-ptMGvOHvoUy<e z3!JgQ84H}Tz!?ktzit72;Xb>*M0?MxDEi_izt&6-Li)nz?Hi1m9q<1Ul8*QI1b0Vj z4iLp>P~x85$MNa0i{iAT+p|r?U!yoJA@?+i_!f%O(r(Y=BEFvDw4~d!QpBI3I4$M& zEEDm+QJj`=dlrcJUnovXw>`Cp>r02+4}!i_`vV07kNG=7{Z53Te%s@_9jObDSJ@y# z<iA4X??01*UO(u81NyozFVWW>v+C+beftmoL<sm4kM|_NetdU@BNfj?%)ekr7WkBg zJ`?nXLpIWv0D9n4e>;fXGF4HUi=k5U4BR$qZIMqcW<C!0T!qAn3`goB(n?vDJ1KW! z?u6XJ3FGza_DzFXDjYuT9~Udi;o%P7sGP$N-`ITICgtl(7rBaHR(<Imt|H1e-0@Bm zWg0sT>2szb?%P)3cxQ8k<BHepAU(VQ@)0&JLx|MMb%>13A->H(|6WOC#}zy5VA>7B zV}bxFsPPrsLA~O2N;+2IsN90&NwuK7X{Ta#g1n6+O8N-LJKHOACDUtQsyqaSyF|H^ z(^2^m#TOU_iVUxV(D=9@yaRES-v#5M*vh@I!%hfADkN{S<6gO|VgzbI8c^xJ&A7eu z7TsQkYHyLoZ`diz79)$J@^c6|Mj5t4;~$VNs)ZUu_qRlvqjD?414#Zau0uu@QJ;^1 zgrY}fwl@(rlRn=d-(J!Q$&mauLDO25`;F{Gfx>UgVo~A<$Nm?o*w5*<!^nklArJ<B zXFaa3ND?ZFbg~H4^?~gB8sr&!jJoAIrX2(cy2y;rBjaXJpzi*r3P;s$aQjdT-<OVF zWv*3V^?g#|C}~F00jMzJL!_5bsnb5Bv^PNWeLvjM%kR>Ob06}OX{*R+CC!drg{~q9 zdy7;+y&)c)+mZij*BZ)?Vyh^B$!-$#6_H@_s$-O4GZpY1C(a-{P5TC{Wv&@AU&%31 zJYrSHgv_}VCzh(6#7D&ETsOf<0H(T#=6i=!c^mnr(ara<ky)}KRkFf>b%&El2&oK6 z0&XIBG+78sCT{Yl8QX<0Q9iX<-B-!DLz2*fc;jG{oq{RdU_#0^%6SMWl#Eg+z0h?x zrEepl>j-^^+ceQJ4v^$44hi{3<0x$x$=@bQ&Bpx>*WJ_?1UnL%Smtn7GoWuB*k`<G z%A_t(Ld<u#R!O$al<iHTZ>DU*ID$rbs|b~le~_;Xcdc^t^0?r3@JPo@$}k=MW9A+R zyxFye1m-&G4`o+4>c7rLBKjFItwHi4*Jhb~5XoS5)E~%1mc2$6+=VzFiUJ4q-1-CQ zoY9HsUaA?A?hZ2D1W1x_1=EiaCe3^vVF4j_CRqSfkqwo6fjIZzHl1koUuROyMfKMc zCwXoCK~hgt?;C>|S+)}2L88A%Sq=%sz95!rSGr&l_aoHYdtsUSqfSbEiK5iHzUK{I zS@7N;5S{rUWqHalpU~1VQ#69$T2EXUaQ5ye&h3={8$wk6-ghZVdH0HOi~0xf2gv;% z%(xG!zN=k!qHU(^@bT$XY2PBlXB@sC9KBY!nyFzNK4SR~a-g@?AI_w#qE&ZNDtJ7u zxv(_G5a{ceDe5NL8I4qbgwR*u+4~*JfeXPjpzr+*QYdoRDO5rd*$Rf28KEf@qCBYN zdsIp_jT+D%S-%AMfWR@C3yQ%Cj=eO5QW-PfcJx~9I%c>PBpc<Bz`d_i7P7+|1a?zi zp*Z}Fx+g|2kUzr>IT58XOt!=GMhZ-Z5p?>8lw})LE}OcH9g`@mM4iQVvlw0w^ShF% zzNkHnExi6Y;p^n{x?tG*5ea>RxTseOr}CjDXi4hMNP{_rA;_$U(<vjAC-)ML5>g)w zn?6hdWL4psXpg<5&ffQtu-fR;RBMOtQ(QCwP(i4N(R5^+cZmqXUKkk4uL2S}?4U;Y z8nQ$q)7a+QNA8hKbpXrzlmr3P{=z{-N1sj_2y=_}gKks-7>t^niW0ey!{IZAQN!Xi zCOh`R-F$_Z52!w<sc6r1VKP(>tmHRjS=8?}k#)0CZSpSBcDTKUR0yGAL39rxUuGxI zfk}N^D7WYWTWFxlMiGuwTHxg0q%UlW6FI0Q#I#gTYnOT&rS`rA@P-O9lIjm%g4=6t zM74xZ?H9=jNJd@uZ$awoLl7Z%Ib=mPsxwmR5BJ7xo6TU{59)rn)*G~>($@goL~BtZ zIC|wA&<Cz}EG`AXvt*Q0Uot1%v&7+9GRf`<G<gE+J!u>DC1d0Cbz3^<>o&)FmUxpr zOMG#9);5v2-4l38U$;KV6L<wA{h4l$roVM}pWhDEt#`Pn8|&6d*}A$Ovh<_d^zNfF z^{fM)z*b!a`xbrO)~;Ya+pTWUvvvr=`V>9u5R{1XfRMIT&)Vt<tkYE_?!tQ46WGa$ zxC2Lp4!fvyQS>Y2`@1h6e&H2V^lqc*Oi|7*{pf3Y_etrVw6{HJuj^S`^uR&rB$m=I zLV+eI@TQ)%P7s=)z-CY2MNigtJ?)^L^|mLlS6A100?qommxKv)6_wtlXYE9aC+$D_ zx(z6Qr~Yi8L3#UL{jTY0-D-?)y49Pms~d>(=r&JU6Df&0t2=cv*%lPM;q1JnE{mSE zOHekT<k!gvX<xh3UL`Z6ZPBy-;|YABtGhgbk3DIh3QO*WBC%+T4(`AXJqz-8yVq?z z8`Xds8}v2Ly%V_ZkMBIaN4G9=9e^1;YLn1nx6opzp4BW=cpXx@x|g1>da@2f5JaR1 zbi|#t)t$B@FY5<);8l-`v@b>ez3z2eQT>-<MXoR1X>Wlgi6U#WpVkjgSwC^0$NH2Q z8uQe{d4bQ|>N|R1uRHBa{pjnSw7r6Dqep#*l=Up_dbS?eNbT>*I^qs&G>Qk>>dxBX zPTMGof6JpD$qT%%tA{;-_l@GWqIjYiWgl^`P1&aX{b2mT$y7FdGoPn^4UOIE*I>y@ zdtW~aFZxWB@xDj>lFD|cZSpKVKT8k1t*?6##UFGFai~4e4tLf@ciQ`+_)Q-5U>;<p zeW0uG!aartFG2%B7PUX<UVG2jl*b;r{*v2B0~)OJ)UQZE^<}W+QSISJdxY>K9`!?` z_O56>aEN@slXb`)IAYWuXrnvpeRtXsQTzuU^$?jc?Wl0LkBs8Cpm;$R#UFC7O}=i{ zt~W35`Un*thvGfz*HBtl-}D4N%1iqUuJ1|PC5qXqtN)?m^`+;>>4DAgAQXRqOfK3U z=zTXDBW<fF{-{R<1%l8|nvJs2`zb$J5e<L9y>_U@`rzGvX|t2crXgE4eA=tjp}|G9 zhvzp7wjCaIr#tXEY2b$I!6)-f&l9MH=Rp+o5iIbStsTG;D{_gZ&x4tsUF)kIp-x%Y z!Gr$h6s5m6c4^lPci=tJ@#ve>j%lCfWx*jf=Be*d!IvVvmEXaYg@Z(JJ@OUx%RERF zD!c*}U|p%g*Y349|Lv1Y*DlU-kpXBDLEA&?Jar#f;C(`gFN6k1^3+ca4P3ow_+i(R zZEw1s(e{Sxedba3<ORU?N~|b9?WidJGqOJkUHj2f$KTv=O}hzHd?vR&jP?b%(DtJE z_eAkq-Rc)q{OG0UpG$)fyPj-&!}UVj9+WRV@RtDC$oit{vh79LzQ9$7{KaeQsBD_t zFjT->J?dU!NhAB`r5R<TKf@t}{YNkDnyv@7nXV^?9XM5s#uu)KdNfm8h87>R{1bO} z8uY^x?=PU@bA;t-q{^e>-$TQT;(tQhhc-O?AavL{S=;yTu&Kwxws-F#4QS2vE4968 zd>RY5;qN%7>Q(>2d)86e`6wHMgy{FDsqJ4Ieek|@Rrh>C#TT8V?N8M3@ChDvBD6jA z$scR}k9&;GzG2kb{iMOPQ`7vRZO@&aJKiSI@q*s>^qV&?*?8|d2Ngf#G`D^Eiq&&o zzQ3Iqb83b0X-G0Uz3lPm`eLl0vHeu{`v%K-lYQs!=}lFi`wQDXtl=>}2;*b9Ats@d zwEe<Q{#5gqMgGyG!Gd3}?L#`A+3;zb+-u+XF85#W{`v8#RQye+x$U1GAHQ(dP2bF> zvX_Omed_@~WU!~Pp9Tq9Zv5z&kGA;HVgHd2D!v?7aPi%w!QH2(`9s@2q|?&^Q_ec3 z{ny6zeX94YjajRx_?4%(?blwC_TAl^ds-i-vR8#Qyy$pe(3GD>V+H23|H*tG;(Ea` z|C8ALYd6iG{BJ7$@sqawPnqnGhOG5yzCT&pufKKGki#*%H<AWxe$}>b(ePqk#%ia> z!_l{oTK@2xRD9EEZhPPL*4+iATWnPJ=CHPJz0kXKskz8AI^HH@{cp^8k=J@+3OAN} z5u3lZCN{dVSFc3UVB0Baesi7wQ`-LfKCg{j9Q}`;RQ%4<*Y;wmdCrUHOwCT~l0jwf zj?nNJDQLC%Gnadj=KB!K2gjT*&VBx}?`NH#N5wavwC$<EL)yPp!($4eN6Z%M{FAl) z2T%U)-h}qq<4J=9r@rkY4)|hyW;|xRU;5aR!usfPD*o7MZu?b#n=|;?=$T^1qn&-? zx$sBV`4}!DKIVlk^+VhKWb6FT9{ple#*6E(quSFp;#0iNKUv!k>VJLW;`8go*9&nd z{&cSM%d7`I_c#Ch0jhekC|i87Lra86k9j9r>W3}&PB7oM81qHHS2Kq`H>RSqnCzWD zsqG^+JUvU$mrTFl`F{Cb$F|ij8MB@Ykbdgh{$$VhnQIGe4;EB!qT(}8bK576+rJ~F z`L^v;HtqgD&CmC7e=eWkvi*Js6`%9V+dj16#X17tYRaz_PuB0xbzU)PasSw_NCW-X zYx|HXC%D#Iv;En=wJT@FQQ7$@TMQDx$Gp}{{hzYjYcbzP9P|0>h0WVuThnRXLn%~z z(Mj6=M4kSB_IyA7k=z1%^@V4X2GdSW^M{W4CwspC{oY$X@XXQ0YKJxho#HW{`+dZ= zU!~vk;nUAO-jAwYD~um(_|x!wUwYY#FFe_<tN1d1?k{ZnumS&PKHtCe+uV;w|7GW; zWPk;~UfYKl-(2g_^L_otrE|t^Suur*zv(o${ex@%w&SobV+NJIEUfKYcluxB`TqOA z?JxfF`dj^^!QH2(`A;z4M|{4Y)+cG0uk?>|srZ$rx9!)~J#ygw#JQUnQQ51)8vZmq z-|rh(*4b{^bTbwI_(|LTrwsT%_xV2k?9%Sv9$&kRG+6Viwtb7W9zWmj`PcRD@2$>% zh>CAI&28Ut-p0Qjeej#LRQBeuwm&`3_vekT`}ok@E5w&8+fGUIx0vrw_TA2kl5_sE z_2Qme$N)P}U)zgyew+18X`9yEAeNfDBQ*T4{Ct1*-rcY4xMtUXsOrrpZTny2`F`&9 znlI;%z2<Au;J~SG`-p43kmvhnd`WeGsXQRQ+&Xre+x|~?Z+_r~Yf7W3>U7%n^grJ} z+WwohQFmVwPa4>T2B-8l+><@ucNx_+p?}O3U8wjt6n{FO?-yMY)&1)^@1#@N$)fDj z_k91Q`(L-aHsxIP$d<ky>uQ%%Sbp!=rRSgR4!lEOMjw4${DA+l_|+dj;Nu&I7pU{$ zSAnh`6<ajucYP32<owa{`CjY;!4KM-1mo8&enqC=+>LLxo?H83$LO{94JHGmhqk>t zfIT=z<g71#^AGtx-(zkaG4=ukw~k<{5UZVtzu)JjeE_9Hf5!E+k6ZD4<yph1_)Mei z@yo$4{QaKxM2Ni`c>&rw0ux5;_oC`B{@;gQ{L<PtUht6dvqjl^^I&{z*@1@GvO}9U z(hiGVJJ`8_-9PjL(yQ1xlN{*>d@@9feM1Mt&Y8EcbqKqp$og{Y5Rst*_POZKo_lTi z_bYnMpG+I3a-f2)zVBYzb$|z1u<_*R4(y)c%{v>BrUy2V7GmELwgl1U5z+nvg?+gL zKc=5zz~zBAg%&T?`oyw!-?uw1dc^mVm#nWFjZfOC?}7yl2^;8g+Y*}OV|U;yVS{xq zW9!P>d07}F#NG{ojBP{mJ6-XxxK*&cZ1~;F*f)aw^urtc?ko4&q@q!yZ%!FrO-1LU zX!H5rjh$ZDEr-1#ftS&mp1>r#`{)~aY5Rl#>?+!))0POb0(t>;0jduiP;`c@Bf51? z9Ce$lAM(_LZfqaHjwAIAPr#uE=EUjNQOUY>EV{clQx5<y8I|n`R66wlXlk=3AjsMJ zb<fkujw!{tQ*(=RFVFRE2p#~Lpa;GluLr)vxf^}ST}{|twsfc(xRJod;Ym3Qo>>6Y zYdv;2=Hv#pE&SHuxZyESuvJiBI@p?Zr1_qgaR_F~!fhbxfe&=YW<9Ww4px9ho3#xB z?don`{tD%^>hQ+EetpU9VmBe>k8<fthS^2V;Vzv185SpT9B{J4sN688#Msn0EM4Ms z;7o}#fwLvfZq6dj7Cx^}DaMw%^}4zV+J5m8Xn_x!HR!S?2U_K>S%CYdg-y8AXHPfU zNEx&b{Vax)ILH07$FJQ@F!0^KiPZe0kYuGpI#V|-Xab2o*q7Plh+iPKspBBcwK3q> zw18@wiOUgBJAbvgpgQ7nXv?T}wSlom)u$~maAsE16dczv4(M#4b-NOb)A^|8HYhu* zNt}v;YK}z?Xp}n%8z{}QJamd`@e#+O_rSbFw5B`o{la7O9XIX)MGw50`>zE670dL+ zUpN*$05~G>Wp1yH!vlx)fqUz0x#+Lh3>o;rz4Yp+96hkht$xtFd&}|T!vhC$u@A8c z9D1+!asvh&vH<ahCq04Bn;(I0?j^=f{oGAPG7=SCqjz+;!64jX$Z>e&oHX~sMJ{q3 zwV@MLXAK>F5B1Y!s3tUAd^uW$GQc!JFQ)Tff{Pj?j4s-3gTA!=J2*A}ObK%6OZzth z<D}FR2%2Ai@%VA<-xc;tMe-UDaenJAYAb(R)BgH(`)F%B_SshE;MNA$*f`uKIdSu5 z;^xbD#Fx2p3@al(XPP5E$_4OnlfgK@))DV<5z~ze49cy`5IW)uUCwp8t)SnvQpBga zNS-*B<cP0!<s<SK8OIU-kYR8bo{Z;+_q$NY)h-BL<XRvoH@gg(ceqxH_zKtKB3v!Z zt4p)jqvsd~M~7C4O7a_`F+xx+H^3jzgw5Xx_hOnje`eT|{006-BY<$PKLJ3?Hd#%M zcpJdjI7j@YRMSaLNBl&?M2`5&salmej`#{PA=#^j>PCi|Jq>^ibZsqwu#Y4Dh6RRL zX{KAKW=NG*x^txwm3F$1>WNfgZAbi{nvAG4+@n-KG^Wx*{~O_nbnp!$zIpa7+al|9 zk#N&D^u@0^7G((hs=oL|$D(e)p1^Qd@)|p2<}Ge=EJ_3k143Tl72!Refwz+PI2L~o z-}Vf=#fa>u2zKZNUe%XYyK+2%&zkSrguU4TYy_r}usML3zVK>nxO6Of3YpzYM;y<6 z4lW7V!(C3XQMoyaa3<k}yAKdf$2C}AI^0!DF*_a4%Lfld;*c#b@LxBU4FQ@{sh=Fi z=KCbNd69ZZ4}3|u(n)t;Cf(=c(0zVB9VDuyE&B_g0Ffq5qq`ThhlGz&>|sv4wF$W# zI6<)zA*DP<jpgWtZ#*R7ACy7|shT9=-;_cJA*gAH<t_qL;%*{1d|jxd0|qXQBUy2% z7>RI-@Mf_!k|gAa_zF>RVwxu6tHr)y2>Oi^w|a8Et8#D~Lryn-8g5finbodZ<VNJd z1x8ViEJH}8Ef7+k6Z>(H{^Uv{{n^Jw`psgSioOJAVvx9`Nf7T48#oZZo$JyhgghjE z*{8yGi@5P?FI7c>yU{U%I1%3Aaw2TL^#%CFAY=DoLqGJ?OmJa{pq<~@fYf0rtdG$# zZsq`~{`Nu@G-z|yG58Vmk`3IPE2X7Fw2($+NomP|B#lBt8Yv*9#gVj+j~+jsM^i`# zDj4qRjCI^_F)%gR2u$yAN6dD^T{*dqc*GYTQ)j1(G|X!t=My;&WQ#vukTJ!9JdMa0 zh2X&Mfg9oQu-_8DYj9rRkh|A<_tGoT6^`3xr(@pH&^p(8qR@2L;=siIbrp^sZ9IXu z^o5@v)74|@5AK2A`sW6YI{tq3;GEn{WM4W`h0NJyphPjnLX>f#6f043LMc&1$q1!r zMClqzu@NQO@pnH-_G^lJ;q$6zV3{k~vH1S)X}H`Q9ULbyoYHU-G9}><?;_MxQL>I? zHSKX=Hk0Rpjd6)Aj2Rmf+y;^B%<YT?{{OT<eO+mv871{Iym*gRU$4J>R&6z2kd;xY z%&6~uacM(cb$N|*ursS~wlt4?-Ijch7TydH_HXBX+PdO<pM9y#n^zAwx7Q!0C%spj zd6_zS`M}AsM|bY)(=jWi>3HQi7gWY~EShoS=%;RZ_||XA+Gn(T=b^FRu02bCdX(D5 zI*8tFN2|kS|2}@a7U6EZNZ@V?4;?@L2}0$o<Hu==T86M6!j%X;2zP&d{P?>F<1mzd zk8m488iVOW@2aDZdgVApog1fiY1hWS40&9jb;Xs8vS>n5V&g`}CXaT+%&{*}F6lhz z+zVXYh^*rpjw=Vc9LWM08XI@3WoT^jE!Ls2&ZSX9W7BWea$_@Zu;s>PFKja^_U<;; zU0Jc&AmzrUBMY*EWoRrGGwEQbvc5Wa{CG#`pybBJ-C!9Wo4n9EDt4OXt?1ZfP;z7K zxiN|p$<N_xM%`~hsEmn?TWGOV$J*T+kZGZ1WUQU)wi{RBVbm9)GCVeJ3<|m#@E9%+ z=;Hlx;Jwu{;zT+RkIk_>6&;&BvX#oiV#b0#tQCDk%<xFrM{L;m@+(_k9T}Umu+0s& zo3*7;w^(mQJCL1e!|(UdN4&SLGWLLK`7AotJ}jmH`jYOnFSH%naV;=?$QNjBwgxou z?mAHiVfPUc?S3H2IyMU0wl@6enEY6~p_&kV=61#cXDo2W0%t66#sX(7aK-{>EO5pG z|KC`E-xD1EUSKS>#b>t+IetLK+sTk$P~2X|`Tfr+9GCA`?;_)P>=B>NGUWFY(=!2m zIQ{D%j*B-4Pm|AW{EpwEC?g-g+n4s2(TCsN8!r{bPdeh0EJJ+1YkX>rK(Z-KlFZMA z{BGbRNf&RR17>=YRD|_hCG*j9Dt)-TAC4RPFO&K4&6B8)X-65KDbv4^aZ^u2+-bY> z`|QID93UPf6=kFhC(5uwhO=dOgADJK;h$tUYS^%goauNod@pBKW(MAd?d+S`H!Cyi zf=p-nxbiZmUgDPty|c1<Dd(enqiGBS*UHyb-!Ld#F(dvGiZMLGu6_vHwmVB2_&}H; zE#1Ii-JV1*;I`V^Or=1zUxD0KOPi-C7S*Oi5N-8>sLe+Z6{S_x_`#sfMVe-}s<taZ zwoy~IvCpRbcCB6nZ6*oY?{K$Url1Z{naP6@vE7NAr5A2d7j~i2Z4cwt_DS3}<BBFy z8^yK;L5!~0dn6In@-LL4dOJ{7+grG`{TR1nxJ3T3ime&A-55o!>P*xH7Jgj}zq^Is zp~5dQ;a7|BYd-j88~oM_egg%+3xZ$Bz;8z2w-oT}0{GBAAE4)x?0lY_4|ek*Yd-DF zXO8*sFCWC^<FI@#mCuOsVNE_V$!8b&93h|P<70Jv#Es9I@rf@!dd0_}_%ITm3gQzw zd{l-HtnkSZKE=VuDfmzWA28sZ{=DCwH@@>Gblwfld$M_RG;dVq?ZUiom-o=}W>(%( z%6mI`pC#{h<ZXw%1(5gR@s2p&n#SA2c(WGon&KTyyp_n@&?9%&@GckLYQlRycmqcJ zJK(Xq)w|+$pyS2PP}IBQ2`RDD8!8m__w7GJB*)Q--1-l(qmj_$SdF`SPy7+2Y<Bdg zlojo$pX^lHlFJi^>>X{X4^ci5pKqkw(C<YYugbrZxbL+Fki|yyxO^~Z7st}%b0OmK z1mfuhp7B(I61NjK?Oc&Q$xOf1Oz%M5*fzZVTuQr&$l^wN3#25_>+{=uq_$te+)Cm| zbow^0t3v3*M5dyQ@;V*>RJW>eq{1{EH+=X{FsLiK+ZCl#DcF%Emm+fTR64yw72B#_ zM#Qb)p|8U_1&H{nI;0nf^gY_uxH{Dk`!@B$J|H@Q=?l+J=Tgq?YJbvX7YJL4C`|pD zL2Q7<N^vF8-=$FBP~*sY*5wPXPAVqWH`J~MVfQu3Rf_tiDjH}o@(jS0^Z_yLP}}!M znbzgou1cZpF7IKgOrEKz&1wg-*WJi?1Fp{Rw?*bLpx}eQb|4Yncq%^XmulNaOzK_Q zVkR%eq*#Kh%lF{93E&2b96;o8fJbq4?SyPyyVETLx3gZudL+gaz6@%p3)Qw)lE5#K z^e$L-kc^KJ$p!TiTxSzgPstQSF|1KzJHcCptd%5)c<%xDJuXE_y+m?0V(H^lCqym3 z`zo7LEws#5(x?uWYmrG*daS7zBeT+n)wXxQT%yt&Aa)&<LzQj@_>3Y{={RJG#TBX2 zlTG1GveG^hNR=K8Fn}VY`27HlxJ0EJBolt0lqe>w(k~+GCg%MP;2T`1^irAMtn|v( zmF~uE>wy`b0bfh&IMo8OO)49Ma)}(KD49d)wnsPAT7&+el3%M6Ec0<Mv|NpQf#n*A zIU14&>EwnjGGLzW0QYNSe*m)D*l8pY!^sH96T?RzrQ;Li>;E)*XZRmZQCHlEoZa#J z2xYl|I-)wEdl~-p2cp9%O)Z36>LwlY(7n`EhMe#}%%ZNK4$x@`%14&|B&R2?G+dnu z4L+Uv?mS%eL=@e0l{%>xI9>wb1zbtl#QqoVrpvB%k<hzFf+{|{Nzl`(CLF2@l9F%< zhbjUnqzF0G?YNfX>OuJ<c@<046xvNmUFl!MOJ4OXz&|NMUbPS4Ke&WfO&i5(FzO@; zYGb=|h*$6=qP;udLfhRWIixpPmoK|k^d0MAwSY48%%_H#r?#VEQymPZ^cnR;=s|Yx z^`ep5m(12nm}{PTNiSqQw~Fj=l`1Bh^DuB-r6!Ih`hz6rYPCIyGTeZ?Pq@J)%K7vR zpiVKGPko9@o1*ri($d95Hbosuqi#BW4x_A>Qfa-f!|i!wZ)?q@c?X}2^QQaZFJ;CM zXsA=BCXE(}ZD%8({G#0Uij9ium`jzJU=$wyM|ac}N$8-4?@UlLNu7(qa}lo8UL%B1 zg{CU<|HJA8NQ)+EJq&5#f7(Y~vCNd#L(QPbLP(l}E1ArDo*GXjP?0gXXy89zrMFru zPaxWeEA_9#jY4VmL!oLGbvgTP>R`m$XDb!|SbJW*iyz9sp{`gDFUX`q9_vXN)d^W8 ziuy!6&G%0tsR38kbWjqB@~A^m{J64U$|sVDlG;I0KE)$JRv9RriINW=OT?8`4$4_X zNyDS(=gFX8-SLEzD0kxFvj|sKB`DpAl5sYEbvp|bEL5I2hbRv?u`3T(-${!4w|G+1 zy1ePiEY$r;QT6@Z6y*zC7xcn#&-KFChL8G>xN|N7wFgDI4hOnmY)GbPWhLmAC$w`a zK<zRWw~pNvB>@+G#9D`DBH;~Vm3}kGc8!M1e+PPhGFM|7nQK6`NXsIHl?(Uarrwfh zC5;Ab5|N&i(!UnuZ0Zy-P=A?FU+H&0SS^1|ei#|7q#klv{(2!fbIcsY@>nb-C>Q>T za{VsRdIjYG{dc_tLf+pEqP%Ee%6K9Aykc3LX#KsEv^bs0BaX#`h=zRhgp*CfQ|&My zd^$olebg0~pi#v@Gy+B#f=dihj{-b|Yaq?-=epooxCYW3|17|taa}}ny><D@`C@## z4hEl(>#R8_@abVvxFW`k->ce1v5<QUk{&^xKjZ4M2$9zTw&PMd6W5E9%VHw=yopt+ zs$I<zz5~NIETQ{3@G)G<S=2g*qy#*JQQO?Fwta!P5+QstGP!Yeu_Mx>Ck%kA2W1<0 zHYnxkit;8X_`6@M{07W(?}8n@NzGKceIRAui7xk*AWyL1VYA!V;lzdCLXkZIrbG|K zssl`98l_vQOeSgPie!?O`Ws0mX~fY03E4FKh5u<Wbp;9TaygQ^XFzLQU1lP(0pMAR z&`5D^A1H!r5J{l5CJmfd5g(=Afs~tZ3BGRu4&XY6B=(@ZgYN>G1~Bk$fLWP}QiW^a z9})R8z=OENitg<ZqMnMXJWeIls_~vU2&Jjy8{|2POH3)<voJK^64TIr$)qTZP+{>w zuM)gdkaaRH!MhOPI$WsEO36vpFT+Jk4A?vM1xaViT`i=g&KfB~g&rVa(6-i;e1m|N zXlqr>NP#uFM0Kj;g3|+>o*qE9;%ci5p^PL7T}6#od&DNhSYx}yPDqMZ<C4(JIw{uJ zi(&@F42*Fn!24YolrKgOe4ij8I-cebL$&Q3h4Qqa7y&!HPid>F?gSOF=rpAEfiYtG z;cJVa$abO8u2w~9pP*V}V`7XP#2MQ@gdrOe93YrV5g{%^y(EQ6JyYBXgHwnx9vik0 zbZD7+qnctQCzy0?U`$U*Ol(PHQ60m{@oI-QImveo6$N$D422-aonT4&$52=<3H2f+ z4H{;IWLeSBOerzygd|e6^I2+E!Z>x!P>lo^#Z1;F#Sp!Vrev|iuKj@Fn`YJtNx_U~ zn^Y+vW)cjO8n|9Xs}h^@x7XuQHF^0^sFFrFD?#9HoP~<(j*3v*m`b}$v0NBB5h;xh zMXF(yl!4|lSjh5Dp>}$x94wDQ?StMMY8pj3FVrxKa(=j}4UxTx$(_(I#excC#9$oj zBTI&F_DpHf9+|Ru;kA?>e+4h-bFzW@wxA)?1ug3;4A?KU46a@OQ1O`kWbI@hxiFN) z&^<c?P0&Kafz*~#k&6U|0)t2awlg)y;21$bhs{tffrHk>8cvRWbsv(g%I83;`W<?R ziVsEbpB@(a_-g%q>SpvQE1&K6`Ks}k3VUZ|_Nnvv{Cyhg>-ymD1oo*cE$uTmdw_R9 zzutA_Wiv|ry{oHg8s_#vzN(ti>V~p%Mdam(5^;kT3M{WFt177}udmO*dIpaV{<5<2 z3SbPH!1x9e82uW52C=H9(!j>wJ!E<r)G@HJuM7LWAZPIOhN^0R@2VQ(c@=+Zu&src zKGw%nRnrm@5;|%QRco6NWzmwYvq4Hs)Do>_07+4*rrNBXR3vq@&a`*XqAfeD9kh-` z0DTcI)1r&SeTRMdq=l0ve_UyAxOL2=O8enSlkct6QY<4AERz!~7bV;~`8ZhmC0gfM zda7RByQ#CR^NQ>#T8ecZq^zD?EfKgzYpKOrbm6C3O1Tzo#HWC}M}n4GuSGwrrB3=p z(`?obsupdtR;gObCtB(gTJ!`hWug{6Lrc9K%v#E)T56S+@^>wDt(G!DOC<^2A>m#v zdO0L$(e?%rOcwV-Ep@IIy+lhLt3`h&?$#^sL+xX&XN^YXQ><mzYtdtLEoF=rJz3DZ z5Ix#jvFwU5W3&|gvWXA`tw(7oleE;S0-zpLs;j-0IuG2UAe8OaqW>X8bY3PzKy=Dw zTJ%Iwti=T#p`G>0qN~U<sh10^rRGD4D~k-3icFO}TI&5;N{J}CQY3b|PwQyA4lRm2 zsW$6O7-^(Xs8&n8RExeAYCtKd=_abQjA4<5LO07fh6YA#l*n$q5_PF2O-4_?*JIS5 zl!%61CQnB7p>YxE7(H?#Dg#qYA$1L=54F@eTJ#7l^*1Qjs5tX#DV{Q;v9*-@gqC(R z+r1)F(hjYyVu`ZY9@FAPh}NLcvP|uubrlr17DFLC^$x9#t&^sW)!JC+jD~XzK^$b; z7`S&rLZWTiVfXSuo{MajJ{@-0?8^rY8Kj+U8w~HaJqqF_L|iy%$Rm<yxwyk8HhZ5z z$XCv!ksVfxJSL+hvxCik-}N^8ry<fTy@`mNATq1XAR0L%5`!{{eY2rVOXBM5ZE)Wc z2pxo$7L{qK6BC6{Ry33d?WNE#s!=B<wx}o*MMeLI{F{FjrAFH<J%y#hRQ-vSI{iwO zo6RSU+EUYBuld+dBN*y`OQ&DQ`e*#KrAwW-N1w3sd_M4!Qo~O>wiwWYW6%Fne!3ci z>|bd(jo|yiDxJ_yt0Q$Cl8IR)OeT-!Tu^2QEjITO4A<7VgSFV-Xxa$dC#sf;*{YK* zR*SW7MG9ul*qL`^(?ph_#Tqjig`P2^Xi@|0$Uw|;AS4WuDOj?NxxPqiXS425uuihZ zsf24)&0&puMoX&Dx-3IZtO11B2CXgR*@@X2y(|G)q1k9#119%G>%MCs9g9Gl^>&LN zGqLr{YbwNqnm{YBd8!{1HTafUXt9xK-7B&;M#yoyMV(?SGLipcEzyR&hr~ittUR@@ z@iO(7fzGH(SDPC$03iGpEC~$3iPkT!@t^8~CY>pWo)>;zs~K%{#&o~H;ZI;Xt>a~Q zI!h>Wq6=GRIJG!*-L``>Y?BwF4~Pf1Kg_rEKo3nwNJ3(QW}l>~c<9nx))*)H;q{u! zrWR?ABH$sKT?_|PkdgXyqYyz4S*x`UwnVMt0ucYoor-&F;x7UnL?^ZM6wK{xNt)Wn zxlD_*mN}tb*CMCwcBqV+#cSFa+hnSuZ4OaLL-kh8Zco5^-?mJPd5*@x>$MmM46r<r z#zz1=FCugdE`l*oEn$=*t^E+K?I7Fa1W~Q_f7KEPA$4IQhC5YjZ)+fnS^sveiU;7W z>h+*JtF^N}hPZ}DVPw&4Z;9gD+2(6nXGvOaXk>j=%>W;UZ1wVt(HR+owHRx4#xm3; z5hJe~wadt;C_?=zk;9rI&?g4c@bscuXF4f(hHidwqi62T%JryoqHLBs%=Wtrx-2E@ zSp8yL&!^EXAu$R1t}yh)$c*7ub6Uq*itzAf%^GYuw*yA!FRrm%L^W9`YjR$&CU&Fw zRUGZfxbJ$cT|AVA!n1c!IqgXisfQg;r_pGbc6bc#t+lhPP!qJck(yczN1+E0JZc$6 zS%PND)h-qlLz(tV1vzdq`JiTN=IWeB88(CRvTg8?NrP>Zcan=~uz1X&3Ot1krbcWq z+Mw-YT4Jf?E;Yfua1y9^P(;fdT&T6RT#gJAL9*m0PKF(p%%^rUZTDc%G)|lKBUQZ* z#<=fV)GCrGM5AVGhBWIIi+UKmH=GJ_2~<&=^%XP>J=D@X)!t?wqa^`!v%x3{AXLie zaS=l{D<~9DCJ`cqLYm}ujBX(zRq&u|bVuf-3<$lKDCE3t2P5ZXDf={1i=YHm3@V&u zv(~A2l19h0(c?K>*P5^zF6O0v(yd5qYrWErcFEX5;{dujXciUU$MvbL^UW+T^(zen z`uTm?-sx49O3QPL^;K7vdy$T>$OiNSsH&+cuM?*qmHHVa<NY`Ssd&BOYp|*s@2v7! z_!>{C_SIB6#jT;HzN)eYyBKMcU`1Vdc}N<Oyx#nABMJ*Adq+;VbXcK#?4@2WXvSA> z-inf{YU3L{|EyZY@AFTu^4FtSU!C9CLU2vPtm)--E%hj^ou^cn)cd_NW|fpGwGDpn z^m49S?eyQ2RrD1pR8|$XD#%(_)l~Tv<1nW}2R_X&`>OoqbtV2PUroJIR#jOJxnvn; zD+8g<H;+u>t*ELgsirhv19%Kmm6Vmiwou+wyL3iLovey5O;sJM3XSQMX}vIQwXdYi z+mP+|!T2GKQ|d$QP*`8@9A8}-nuS<I>7~9|wRQNO(<oiRwo>P?tP6k2&QfRZS@reh zeG&K@YRZRHmZPDoN)auoE1fX}-@^7D(9hYs(%F0L1<u|TbLvWJXCusa4^v7@s;hma zrY(edgvVsF!zk6|6@CSJHB|fY4RFg3@Ai6EH|VM|fnkB0N#hy*!^0#m!)GNaO2JS2 zjU0Qy%s7GJTP-qjY>%1I%kYRv!d8JF|FHI-nA#UIEHt&hoFS{MD&rZlzNCF&1nmnW zX<yjbTKn;>wJ-cJ-C6UuP0b4!wl_7O$}m*Tf(U9Bu$rs|)u*75V?m1+{FqLZ#(FiI zdW~avsi~KjA)8TEiW!EgIxd2$<5*R;A*nhpf<=p4Yd`MCv~R6>5o^vmS(W9huHp#m zp(;fTLscqjrIO%otyIyEDP^R!R&6q?HpVn+F++A&Rmo?_##NQe8FDqqe3K*Cd2*ym zO>R{wNNioD$>CMPuPylSUN+XsqGUBPX0=phDqE4|f)p+far_z;{D;?zjWO~(AVZ6i z*_bH@g2Cp1P{?q&Bv}=|+IXpqObik&jniagMv!Q2tdo%|gT$!DMKW@8kf=4@DI*UC ziMCe8BPGMDhDymQ@D5Cv_~e<Q6zmNA3Br(X!POD+Q3<@mw4+oYR$1P3%^gt}xZ2@( z$MMdMOg~Ge!@(H#JpoH=#kmmXIFUlUbCvUjD-$jmKNL$HnBzo}d1ofOOho&JXF8F6 zBjnqC%?a$wn^{YP##%W)#J)`bP0+p!7o314+zP6~g)j#ckEl?Cl*svD-xkV*OUCZC zFpkKQ4L;r;dgCY~j%5ME+a!qwo(YW{yDylrb;(3&EwM0?#KH&?PcV_TmRJx;VnGCn z5vM`kRmwtC<plB~Rj@Vl398qcnOWJCXqRQzwsJwu+(+A0n!3HRJU_(y!UYEzt~FaM zl3>jFGW}%v6oq$wrkgvTCNSh}T83MMD-#;$4WFyzjxYEY!#1Ye@eJ*fWXR<hUM(d) z;ANO(lEyPkZowO>LpbIgqc&4WK0{W-qSPylSq&@o0al<>ke4AVLcEMwDZv}AhZ+^t zrcHEo`}T2h2??D#VUm1LT8TrNa~N|-6ER~BElS@Av<o88`bD7ik3bt>(xPNdEy{(B zjM*d>CA*dHhS%~Z$1T_*BKF1-$1v=Or4PnPh8<IxG%-`cerZf9VA#GplP0E1IMpN- zGd#Zs=PF=m>B*#tXGu88Bo#AE>&3YW82<NMCQVE}&wyiPh@~>auDv-|0mHAcfssC{ zGBFN&66rHshG1lvC^iIAt^$T%&<PoQz-Yg~fP-ZSMuzSB8%bbf_|X6+P5iHf7hcGu zViOKzQh_SrdlxZj;xP&P3}R9-!|&;kAwDRP;hV;O9a8mxgsw|CS24q{a+p-W@RgxV zns`V;4zb2$m^jSHH4uHylbD#=J;#;QBduP!G%?YYgjkQXp7n}57{Qkt3Mic^?A){4 z)k?R<&QioVGVJ{mMS=HPup8x{iu+V-3#ZTXU5!vxE@OD-*-V=HgoIB!nKX{!E!~(j z_0JN%XOfB;{?)~~#xcBs_GaP(!`?69n<lB4;UCjE*Eoh(nXW(eP6@Y}q+*7DINxMs zINNmnsmmqYY?6u@{w~vGWLRUm{?vek|1wF%443vZ85vfXu0QoU37<Ae#S9l`n~V&n zn65u{wuFzHq+*6wnyx>N;Y8E*r(Pl9Dw9;qup!4Rk>ObB?`V#h5>A!QiElHE?7_S7 zxE756bi@ufS~{FXX^3N-DBTR>3Bx{;v{s#~I2$r;og30^bJ2_DDi@nQZ>}=b#7Gzw z?0MZ9l5O2^jKS8eA=}oi`vdPj@Xw`(m%K342`QaVr9eZaQ>S2P<xZW{7G^qiVp|wI z4hG*$2G4}SUwP?Yjkn#l{hlitxg9TX8m^)$g$&!7!^M=I5|)^xVul&!2vW$fjX7LQ z=_cVslT^&`9CHLIWO&@1Pp5R2Bgdt|5rpB{<_J>A@GEmZo#K!qhdVfeFibE<kV1z0 z%=vUm8#!|121gKvvE~R;$nbM>KAmEbBgcT?2*S{2jv$2$KQQOhDc?$%5gb7n{$S3h zg$&=I6MFcl%9Q;Q_6m+547cTSuEKp1^0bJiHPV82OA!8S!~@2Qa;Cz7k<9pRbHO%+ z;ggb-r<}_E-N<5>nv1{jk4X4|Nh)Tzy1P+LeE-34vAOsgzf!_oCaIX=!{*{IpWy=2 zS;yZa;j1R8m|>&2_{(QF*L2qLw@bLmBo#Bf%Ut~BGn{2Q>-Z%S{@WxKGrZYc{N*z& zH=T9-0tufnNyQ9rG#7vQ45yjSI{qpNA2UhC4CkB9n$NJvbk_0p5<YB_iW$x^7k~K- z^Q6;aZmW{;!61oYmN^5;!z@AXwFcqOMC{Pn(o^yEFvD#5hylN07;k#l#PcPbW|E2- zW||IHz|dxT*F=|uMJB13VVdc11q^>M2h52n($U5T9gd;XbhrYB-<SjD#6;<6deGq* zCYugd!0@0sU`}i&9W5v5a17&2hbv(CnK@uijFOI)9dtMonhsZ>O8CAxU{3r-!V7{9 z$51gHu7Kg&=8|jTR}!WN9gg8KbHFTMxIM>k6FigblhA28TrtBPLpfK00fP6aAp8Z0 zovvJtq8OwZJ{??%r87PxX>de_|1=k81q^R<8k%6u_*V%(G)ct_pD-u$aSVTJPUchp zDB;^CshHuP&B=Tm!}+FfPQ6#c?Ix+1;UCP&d>q3$rf*KYO~RK=QZd8do0IuChIOWI zPF*VDI+Ik)aJe~|k7GE~^v$V@CH$vJDrOikC-ZR(y{2zYy+*<(Oj0q!E6vG#9K%Vb zZ%(a~aJ5M)W;oCE&2bFJ<tXBVcAO>Q{U)iHVgF&AYn%ascP$8iCSt!FEFBKBdnV&K zl7=UHh8LMmIF6yiX%vZvhVvvW50V)6F`clGVT|c<Q_hj_GLuxy@Lbag3mIBXkDGF~ zgyT$7F~e@A6BaT&W{#OtI!Wgn9dts5olPe!WJsq+>4P;{jC8&cK__JBFrBcF;a+ph zoMMyChqGQ%Rx!h9(+LY1er%4JQ+|+;UwsWjGqjjaSjcdvIc82dBH_6~CuI1oIc63z z+-6SFQ}#(X(Db+|hR(seEeL-$VxN0fj)m~KY{vT~4Fey;XU%!Kkl}K3o}TiUgio52 zaz4XAcSAL-G3Zz~ecm@o#SB-OlX5=8MdqYDzEQ&0O;Rz#2hB-2pW)S}gN?sS!k0`^ zF~fVzNjab46{drYzg5BwCaIX=?dGJM&#=mLu<?r|Tx*hw8Qx@0%J~e-Oa~i3U&1F% zQZd7Y=A@j@aH{kwSaptskC>!lhF6&mmd~)jbg=P02_G~`#SH!Cq@2&N#B{@AqZNa9 z&Bo^eIgIp+ZM6BqgoisByf)>~@^(Qntq{L5;8C;a2@DH|8@W+`h7%>p_yvPwi-Q?k z$u|jH(8Fdyg$yT{{1X|nXey|%kz<#e84DQ(%bsW!Wdc>AyJVSMAjWxyT-mmYeL+K$ zdPh{(MkYNaxhSdLNMc1Mn~D@LoNkhe%<?6`FCi^I3cqjQh%AEI(!^2_{Sso4IM$@~ zZDicpq+QU+_#BhguaR+Ilh(hH@x>->KqKSPChfvT#$4Y>zl5mf>n6AjY|6LvKBmT2 z^*7%c!Eb?xQtG#<KP}(mt@8!nA+bx^5Artu#C&U7=fmmU7XSE76Wk*B6?5hM#{Y6# zNjrhMYJOu|8RJ#~_3`<Q9VM091=Kb38`C6}TL!yuavFO}A~y|)dgDMz<hB7Zzj1^l za^rwl)XIh}Yob`f>q0-@h1Uc$dw4xSiwmy>XvyJq0L>X*1<=yNYXDkicm+U{%gvz2 zSZ%hpZQHeTI68Fb*fBX-RW1L!6t*9S)KeLANIjJ?hxD5zV-79K1rccdBGCFrpbao- z?3eVLC1Vb$r*ivpNIEm-kaT9uA?eJRL(-WshZdz@1X}+Hv;iiKM>5jc#L}TjXZAl1 zNoU3!lFp1dB%K*^NIEm-kaT9up+&*p%ab~AXi)~3H15-+Gh+@(XYL;ylFp1dB%K*^ zNIEm-kaT9uA?eJRL(-Wshom!O9&t!##vGE)+<!SFof&gTIy2^wbY{#U>CBiz(wQ-b zq%&g<NoU499+J+CIV7EVeBqFEX3Qb!%$P&cnK6f?Gh+@(XT}_o&Wt%Eof-3RO*%8? zkaXtpk3-U#F^8lxV-87Y#vGE)j5#Eo8FNTFGv<(VX3Vn*>CBiz(wWC+4oPRm9FoqA zIV7DKb4WTf=8$w|%pvK_m_yQ;F;8}+Gh+@(=itl{3Gq&znh{1S_Si7wR~F%`2!>ro znz<PEFiBGxo-awp8kl1<%#0Hl@>`2gLL}XY)>^+p){g}nD`1Y5n8g$_3>M@4>BSU8 zDyE>3i@D4!rhp+AL;4g%G&`-fXGlY{c&xM;K5DkX#J@|ZnZ-<um9Tq|6uCB$OEJxM zk6DVBVWUYZ<o8asH%swy!RG}@kqTZag~XWIE@w{ml?a<R4N3DQ?{7^-E@#MM@r=cg z)wL<tD78x0R;E@Jepwe69EEqXM@7h|m^s<QBRhL|eO2>)UR=e<B?RC5#re>`!iDkU zDu>s_8#$gzGQ#I%xLt<3WLTGMq+cn+_htB*3>_&(dXfxZm*G1y9NO7PA1%W_%Fv(& z@2nSxtRFu>bNGLYzWfHe=j7wadKvPgRj_6T;>9N~5Y0tg*usYwHsK42@JTv+0t}yA z!UyhfeRzcUR(6ITWN4KgD^7;&+^I62Cc_iStCe!*$?#<IJDflszk==+DTg~7%L^}` zx4d$=U&=is!-=B|j@dF?AVYp5>&fJW^M~gzavPLY9wXc>!viu5&(E9QISk)6AD*8# zadQ~H4Lm$Q_ai>26Q2H~aVx%froSs1{;}e*c3MQbRpGx&5z1p#qLiYjP>O-Ail)re zBGGLM|NV&2R4e{q0RJ6|mUO!^!xl<0u$5jd7#E2itvDmnW0c1u(%UKg_dP<TS(Wy9 z5o;)g%Z*i*MWj2F=7{t-<=Cu9axgmAM51?4>=Ee+N~FJMVZ~p6-0h1brz5t{N1}I9 ziXzhGY!Jp`HUIiY%LJ<;NB@>&ypk>Q=x<fzxA3j<%U^_A(dAe4t?2USq7XVQRHBrF z$3sX0(zme|rFFZ<O8V}&mK<r4&VM(CQ!fNim7v|IJo?alpen7~aVF?g?ld_8Q(pSa z#-+k(!~NlRphwdGKF~>y+0nB=z~>QMf-WZ{ehKYH&{g;?zp<I>NuLwh=UtKJP>!|w z@h`GI{}K6H`{z+XkKmueP_6q*0_dvJv6UaDN_x28_6NNK$_W3A0^J!-M7&hwk5Tx{ zz)dobPtaTU_Xa_4Er|YxYNT=>lJfar1G~|aC&<4EbZ2Yv%8nD{-y`TT<}-`<`=;PO zD(QTNMf{yn&^3(L9pEP`<%G9ZmK6`WQ{vFzJei+Q81f%&7y){>(2NpSiE<;1x21Ld zdVfPj1zxRKR$f<LiDTJxetMR-6i3O+>v6oh%;&AF_DwIT_Llj5b@kqohPetIc&;w@ zmzQN^M$SP8va7r$b#*24yyZ3ix_LN<UNWoPTh=gZ);zF;#JqI;yG2&>{5PHKHqTav z9`nwqEvfToWM)*=*OdqrS{-N?)RE(I^G0|_TsmAFa4)O(;gokxSv3yN51)K#ZXQli zd%ZZU?H!?ejja0caUd1u4P&NJp0Pu7J>Ib+M~)v+=q=10>KWk`N9uEOMtR&rhk5(r zj|cTvyzat0Z_s`aK-McPnU1nT54j7opoEaK_ALb&XZc&wqyRqdZXEn>nZ@g^oaL*b z<Lh;P)D=>25<i#)Z#k7h<R3<6k;bWU858H*MNQZbBGn_pF@CSNbZ+nney~`wjFM45 zZ<fDgIzoS)5zb&#<HMhFuB>Uupf?$m^{y&YL`)p3&nTN$15QPR{yHONc6nVr-UiSj z;ze3rd36b8l&BWx-7~~X1v32QbAibjk>)Ea@s}tW<uj!F%_sve#|#d`4-F2+#6?9w zfKaDoR#hof@If$c8KSi5IQ*XhSDgiCN2c=W4V7RosliJNI9gRxLHtJ2^yziwvpI&> ztCll{Z5Yz=ewklNiqNrtCW&V7Hn=cMh!3wHIdn-n2jR=Y3?v-E-vnd+X%cWKpOdhL zFg|t`B*SckF}RqY*P|Rhj&X`UR4zg0m(Q_E4rnBs`FY*SA^)8<WDy@Jj-!eWM1S*) z`FVZIA=jVv=X@N}6FdD4HIDN-n8Qq2Qn>!CKp6m~F+Z=DIb0<(a{1x)r)4Ga50&|N zUCm*Wq!T|@kFD%C7c{boxg6(-Pln+uKPoHqQ;$d}Kd;j{To#%cI83~9Z5ThV=Q$iH zH>I!`=I8jLFn(V5bBGzP#V1_<-%5VAzxjNSZ?K(6e-?UM7(YKpa9GG0Wf)%m$}oO@ z-rz9NRLl^-?JvbCe*vI1A^QifLyyTl5aIbb&f(v|>j>dDpI<Hq5g*QH#Da0AuSWv4 zKbOzXIrfwAv%FUU$oH6^pNHZk|2ElS*=}4e`@v4|hL+FIO}o8D2~Hz0@66BPdq@f8 zH`l4t43;93(*VrJ;b$NdX8rj&tY})x{6@?ui!p_JaZ&l16bbn-zuetprbu%L9wL5) zi)m&ifE%Y7v2eNJd95IX(}?pQlK)jUv>~olUdIXeZ@9u>Sj~nx0YCj6#7O1$Z7>)f zNRW&t;O`~*!|VCRO$I|lSpVU&IP53+Tb6=9h_S?={7F8aaXRyH{E`#!?|;t75yy@z z8N&G~9;Tv^bDa@PlLNC8QQEM@e#i44jc;Kl21QY(Z4!Y}5+*#ne0rRX#J}!EgFi2f IAuOu=A7NDCvj6}9 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..058653c46c3e0b15ddfa221cebf1dadec06347c5 GIT binary patch literal 54200 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 Hh${aN`FI_Q literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py new file mode 100644 index 0000000..4bda084 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD160', 'SHA1', + 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'CMAC', 'Poly1305', + 'cSHAKE128', 'cSHAKE256', 'KMAC128', 'KMAC256', + 'TupleHash128', 'TupleHash256', 'KangarooTwelve'] diff --git a/lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi similarity index 100% rename from lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py rename to python/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..d13832ca9c5e0446207fc9b2a3897f4fc21d478b GIT binary patch literal 58376 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..555c6fccf45daef5d5d8f33f1cd471a38b8f71d0 GIT binary patch literal 25024 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..4e494b0f7fbd6f9c44ba8c351c4bb93d1bb64098 GIT binary patch literal 41632 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 Q@#IhKRr1AA0#T^=Utza+T>t<8 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..901b8c2c5b990d8b89554b147b370c9eae17f265 GIT binary patch literal 33424 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 W`cIdyspOB)#DGMf42w?*sQACm@+9K` literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py new file mode 100644 index 0000000..7c2f30a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py @@ -0,0 +1,187 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Util.number import long_to_bytes + +from Cryptodome.Hash.keccak import _raw_keccak_lib + + +def _left_encode(x): + """Left encode function as defined in NIST SP 800-185""" + + assert (x < (1 << 2040) and x >= 0) + + # Get number of bytes needed to represent this integer. + num = 1 if x == 0 else (x.bit_length() + 7) // 8 + + return bchr(num) + long_to_bytes(x) + + +def _right_encode(x): + """Right encode function as defined in NIST SP 800-185""" + + assert (x < (1 << 2040) and x >= 0) + + # Get number of bytes needed to represent this integer. + num = 1 if x == 0 else (x.bit_length() + 7) // 8 + + return long_to_bytes(x) + bchr(num) + + +def _encode_str(x): + """Encode string function as defined in NIST SP 800-185""" + + bitlen = len(x) * 8 + if bitlen >= (1 << 2040): + raise ValueError("String too large to encode in cSHAKE") + + return _left_encode(bitlen) + x + + +def _bytepad(x, length): + """Zero pad byte string as defined in NIST SP 800-185""" + + to_pad = _left_encode(length) + x + + # Note: this implementation works with byte aligned strings, + # hence no additional bit padding is needed at this point. + npad = (length - len(to_pad) % length) % length + + return to_pad + b'\x00' * npad + + +class cSHAKE_XOF(object): + """A cSHAKE hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, custom, capacity, function): + state = VoidPointer() + + if custom or function: + prefix_unpad = _encode_str(function) + _encode_str(custom) + prefix = _bytepad(prefix_unpad, (1600 - capacity)//8) + self._padding = 0x04 + else: + prefix = None + self._padding = 0x1F # for SHAKE + + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(capacity//8), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating cSHAKE" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + + if prefix: + self.update(prefix) + + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._is_squeezing: + raise TypeError("You cannot call 'update' after the first 'read'") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating %s state" + % (result, self.name)) + return self + + def read(self, length): + """ + Compute the next piece of XOF output. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + self._is_squeezing = True + bfr = create_string_buffer(length) + result = _raw_keccak_lib.keccak_squeeze(self._state.get(), + bfr, + c_size_t(length), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while extracting from %s" + % (result, self.name)) + + return get_raw_buffer(bfr) + + +def _new(data, custom, function): + # Use Keccak[256] + return cSHAKE_XOF(data, custom, 256, function) + + +def new(data=None, custom=None): + """Return a fresh instance of a cSHAKE128 object. + + Args: + data (bytes/bytearray/memoryview): + Optional. + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`cSHAKE_XOF` object + """ + + # Use Keccak[256] + return cSHAKE_XOF(data, custom, 256, b'') diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi new file mode 100644 index 0000000..1452fea --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi @@ -0,0 +1,14 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class cSHAKE_XOF(object): + def __init__(self, + data: Optional[Buffer] = ..., + function: Optional[bytes] = ..., + custom: Optional[bytes] = ...) -> None: ... + def update(self, data: Buffer) -> cSHAKE_XOF: ... + def read(self, length: int) -> bytes: ... + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> cSHAKE_XOF: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py new file mode 100644 index 0000000..a5b8701 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py @@ -0,0 +1,56 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util._raw_api import c_size_t +from Cryptodome.Hash.cSHAKE128 import cSHAKE_XOF + + +def _new(data, custom, function): + # Use Keccak[512] + return cSHAKE_XOF(data, custom, 512, function) + + +def new(data=None, custom=None): + """Return a fresh instance of a cSHAKE256 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`cSHAKE_XOF` object + """ + + # Use Keccak[512] + return cSHAKE_XOF(data, custom, 512, b'') diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi new file mode 100644 index 0000000..b910bb6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi @@ -0,0 +1,8 @@ +from typing import Union, Optional + +from Cryptodome.Hash.cSHAKE128 import cSHAKE_XOF + +Buffer = Union[bytes, bytearray, memoryview] + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> cSHAKE_XOF: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py b/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py new file mode 100644 index 0000000..f2af202 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py @@ -0,0 +1,181 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +_raw_keccak_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._keccak", + """ + int keccak_init(void **state, + size_t capacity_bytes, + uint8_t rounds); + int keccak_destroy(void *state); + int keccak_absorb(void *state, + const uint8_t *in, + size_t len); + int keccak_squeeze(const void *state, + uint8_t *out, + size_t len, + uint8_t padding); + int keccak_digest(void *state, + uint8_t *digest, + size_t len, + uint8_t padding); + int keccak_copy(const void *src, void *dst); + int keccak_reset(void *state); + """) + +class Keccak_Hash(object): + """A Keccak hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + def __init__(self, data, digest_bytes, update_after_digest): + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x01 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating keccak" % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating keccak" % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while squeezing keccak" % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def new(self, **kwargs): + """Create a fresh Keccak hash object.""" + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`Keccak_Hash.update`. + digest_bytes (integer): + The size of the digest, in bytes (28, 32, 48, 64). + digest_bits (integer): + The size of the digest, in bits (224, 256, 384, 512). + update_after_digest (boolean): + Whether :meth:`Keccak.digest` can be followed by another + :meth:`Keccak.update` (default: ``False``). + + :Return: A :class:`Keccak_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + raise TypeError("Digest size (bits, bytes) not provided") + if digest_bytes is not None: + if digest_bytes not in (28, 32, 48, 64): + raise ValueError("'digest_bytes' must be: 28, 32, 48 or 64") + else: + if digest_bits not in (224, 256, 384, 512): + raise ValueError("'digest_bytes' must be: 224, 256, 384 or 512") + digest_bytes = digest_bits // 8 + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return Keccak_Hash(data, digest_bytes, update_after_digest) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi b/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi new file mode 100644 index 0000000..844d256 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi @@ -0,0 +1,23 @@ +from typing import Union, Any + +Buffer = Union[bytes, bytearray, memoryview] + +class Keccak_Hash(object): + digest_size: int + def __init__(self, + data: Buffer, + digest_bytes: int, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> Keccak_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def new(self, + data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + update_after_digest: bool = ...) -> Keccak_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + update_after_digest: bool = ...) -> Keccak_Hash: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.py b/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.py new file mode 100644 index 0000000..7655368 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.py @@ -0,0 +1,189 @@ +# +# Util/PEM.py : Privacy Enhanced Mail utilities +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = ['encode', 'decode'] + +import re +from binascii import a2b_base64, b2a_base64, hexlify, unhexlify + +from Cryptodome.Hash import MD5 +from Cryptodome.Util.Padding import pad, unpad +from Cryptodome.Cipher import DES, DES3, AES +from Cryptodome.Protocol.KDF import PBKDF1 +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.py3compat import tobytes, tostr + + +def encode(data, marker, passphrase=None, randfunc=None): + """Encode a piece of binary data into PEM format. + + Args: + data (byte string): + The piece of binary data to encode. + marker (string): + The marker for the PEM block (e.g. "PUBLIC KEY"). + Note that there is no official master list for all allowed markers. + Still, you can refer to the OpenSSL_ source code. + passphrase (byte string): + If given, the PEM block will be encrypted. The key is derived from + the passphrase. + randfunc (callable): + Random number generation function; it accepts an integer N and returns + a byte string of random data, N bytes long. If not given, a new one is + instantiated. + + Returns: + The PEM block, as a string. + + .. _OpenSSL: https://github.com/openssl/openssl/blob/master/include/openssl/pem.h + """ + + if randfunc is None: + randfunc = get_random_bytes + + out = "-----BEGIN %s-----\n" % marker + if passphrase: + # We only support 3DES for encryption + salt = randfunc(8) + key = PBKDF1(passphrase, salt, 16, 1, MD5) + key += PBKDF1(key + passphrase, salt, 8, 1, MD5) + objenc = DES3.new(key, DES3.MODE_CBC, salt) + out += "Proc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,%s\n\n" %\ + tostr(hexlify(salt).upper()) + # Encrypt with PKCS#7 padding + data = objenc.encrypt(pad(data, objenc.block_size)) + elif passphrase is not None: + raise ValueError("Empty password") + + # Each BASE64 line can take up to 64 characters (=48 bytes of data) + # b2a_base64 adds a new line character! + chunks = [tostr(b2a_base64(data[i:i + 48])) + for i in range(0, len(data), 48)] + out += "".join(chunks) + out += "-----END %s-----" % marker + return out + + +def _EVP_BytesToKey(data, salt, key_len): + d = [ b'' ] + m = (key_len + 15 ) // 16 + for _ in range(m): + nd = MD5.new(d[-1] + data + salt).digest() + d.append(nd) + return b"".join(d)[:key_len] + + +def decode(pem_data, passphrase=None): + """Decode a PEM block into binary. + + Args: + pem_data (string): + The PEM block. + passphrase (byte string): + If given and the PEM block is encrypted, + the key will be derived from the passphrase. + + Returns: + A tuple with the binary data, the marker string, and a boolean to + indicate if decryption was performed. + + Raises: + ValueError: if decoding fails, if the PEM file is encrypted and no passphrase has + been provided or if the passphrase is incorrect. + """ + + # Verify Pre-Encapsulation Boundary + r = re.compile(r"\s*-----BEGIN (.*)-----\s+") + m = r.match(pem_data) + if not m: + raise ValueError("Not a valid PEM pre boundary") + marker = m.group(1) + + # Verify Post-Encapsulation Boundary + r = re.compile(r"-----END (.*)-----\s*$") + m = r.search(pem_data) + if not m or m.group(1) != marker: + raise ValueError("Not a valid PEM post boundary") + + # Removes spaces and slit on lines + lines = pem_data.replace(" ", '').split() + + # Decrypts, if necessary + if lines[1].startswith('Proc-Type:4,ENCRYPTED'): + if not passphrase: + raise ValueError("PEM is encrypted, but no passphrase available") + DEK = lines[2].split(':') + if len(DEK) != 2 or DEK[0] != 'DEK-Info': + raise ValueError("PEM encryption format not supported.") + algo, salt = DEK[1].split(',') + salt = unhexlify(tobytes(salt)) + + padding = True + + if algo == "DES-CBC": + key = _EVP_BytesToKey(passphrase, salt, 8) + objdec = DES.new(key, DES.MODE_CBC, salt) + elif algo == "DES-EDE3-CBC": + key = _EVP_BytesToKey(passphrase, salt, 24) + objdec = DES3.new(key, DES3.MODE_CBC, salt) + elif algo == "AES-128-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 16) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-192-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 24) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-256-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo.lower() == "id-aes256-gcm": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_GCM, nonce=salt) + padding = False + else: + raise ValueError("Unsupport PEM encryption algorithm (%s)." % algo) + lines = lines[2:] + else: + objdec = None + + # Decode body + data = a2b_base64(''.join(lines[1:-1])) + enc_flag = False + if objdec: + if padding: + data = unpad(objdec.decrypt(data), objdec.block_size) + else: + # There is no tag, so we don't use decrypt_and_verify + data = objdec.decrypt(data) + enc_flag = True + + return (data, marker, enc_flag) diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi b/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi new file mode 100644 index 0000000..2e324c4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi @@ -0,0 +1,10 @@ +from typing import Tuple, Optional, Callable + +def encode(data: bytes, + marke: str, + passphrase: Optional[bytes] = ..., + randfunc: Optional[Callable[[int],bytes]] = ...) -> str: ... + + +def decode(pem_data: str, + passphrase: Optional[bytes] = ...) -> Tuple[bytes, str, bool]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py b/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py new file mode 100644 index 0000000..d02aed9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py @@ -0,0 +1,239 @@ +# +# PublicKey/PKCS8.py : PKCS#8 functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util.asn1 import ( + DerNull, + DerSequence, + DerObjectId, + DerOctetString, + ) + +from Cryptodome.IO._PBES import PBES1, PBES2, PbesError + + +__all__ = ['wrap', 'unwrap'] + + +def wrap(private_key, key_oid, passphrase=None, protection=None, + prot_params=None, key_params=DerNull(), randfunc=None): + """Wrap a private key into a PKCS#8 blob (clear or encrypted). + + Args: + + private_key (byte string): + The private key encoded in binary form. The actual encoding is + algorithm specific. In most cases, it is DER. + + key_oid (string): + The object identifier (OID) of the private key to wrap. + It is a dotted string, like ``1.2.840.113549.1.1.1`` (for RSA keys). + + passphrase (bytes string or string): + The secret passphrase from which the wrapping key is derived. + Set it only if encryption is required. + + protection (string): + The identifier of the algorithm to use for securely wrapping the key. + The default value is ``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``. + + prot_params (dictionary): + Parameters for the protection algorithm. + + +------------------+-----------------------------------------------+ + | Key | Description | + +==================+===============================================+ + | iteration_count | The KDF algorithm is repeated several times to| + | | slow down brute force attacks on passwords | + | | (called *N* or CPU/memory cost in scrypt). | + | | The default value for PBKDF2 is 1000. | + | | The default value for scrypt is 16384. | + +------------------+-----------------------------------------------+ + | salt_size | Salt is used to thwart dictionary and rainbow | + | | attacks on passwords. The default value is 8 | + | | bytes. | + +------------------+-----------------------------------------------+ + | block_size | *(scrypt only)* Memory-cost (r). The default | + | | value is 8. | + +------------------+-----------------------------------------------+ + | parallelization | *(scrypt only)* CPU-cost (p). The default | + | | value is 1. | + +------------------+-----------------------------------------------+ + + key_params (DER object or None): + The ``parameters`` field to use in the ``AlgorithmIdentifier`` + SEQUENCE. If ``None``, no ``parameters`` field will be added. + By default, the ASN.1 type ``NULL`` is used. + + randfunc (callable): + Random number generation function; it should accept a single integer + N and return a string of random data, N bytes long. + If not specified, a new RNG will be instantiated + from :mod:`Cryptodome.Random`. + + Return: + The PKCS#8-wrapped private key (possibly encrypted), as a byte string. + """ + + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # + if key_params is None: + algorithm = DerSequence([DerObjectId(key_oid)]) + else: + algorithm = DerSequence([DerObjectId(key_oid), key_params]) + + pk_info = DerSequence([ + 0, + algorithm, + DerOctetString(private_key) + ]) + pk_info_der = pk_info.encode() + + if passphrase is None: + return pk_info_der + + if not passphrase: + raise ValueError("Empty passphrase") + + # Encryption with PBES2 + passphrase = tobytes(passphrase) + if protection is None: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + return PBES2.encrypt(pk_info_der, passphrase, + protection, prot_params, randfunc) + + +def unwrap(p8_private_key, passphrase=None): + """Unwrap a private key from a PKCS#8 blob (clear or encrypted). + + Args: + p8_private_key (byte string): + The private key wrapped into a PKCS#8 blob, DER encoded. + passphrase (byte string or string): + The passphrase to use to decrypt the blob (if it is encrypted). + + Return: + A tuple containing + + #. the algorithm identifier of the wrapped key (OID, dotted string) + #. the private key (byte string, DER encoded) + #. the associated parameters (byte string, DER encoded) or ``None`` + + Raises: + ValueError : if decoding fails + """ + + if passphrase: + passphrase = tobytes(passphrase) + + found = False + try: + p8_private_key = PBES1.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str = "PBES1[%s]" % str(e) + except ValueError: + error_str = "PBES1[Invalid]" + + if not found: + try: + p8_private_key = PBES2.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str += ",PBES2[%s]" % str(e) + except ValueError: + error_str += ",PBES2[Invalid]" + + if not found: + raise ValueError("Error decoding PKCS#8 (%s)" % error_str) + + pk_info = DerSequence().decode(p8_private_key, nr_elements=(2, 3, 4, 5)) + if len(pk_info) == 2 and not passphrase: + raise ValueError("Not a valid clear PKCS#8 structure " + "(maybe it is encrypted?)") + + # RFC5208, PKCS#8, version is v1(0) + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # + # RFC5915, Asymmetric Key Package, version is v2(1) + # + # OneAsymmetricKey ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] Attributes OPTIONAL, + # ..., + # [[2: publicKey [1] PublicKey OPTIONAL ]], + # ... + # } + + if pk_info[0] == 0: + if len(pk_info) not in (3, 4): + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + elif pk_info[0] == 1: + if len(pk_info) not in (3, 4, 5): + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + else: + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + + algo = DerSequence().decode(pk_info[1], nr_elements=(1, 2)) + algo_oid = DerObjectId().decode(algo[0]).value + if len(algo) == 1: + algo_params = None + else: + try: + DerNull().decode(algo[1]) + algo_params = None + except: + algo_params = algo[1] + + # PrivateKey ::= OCTET STRING + private_key = DerOctetString().decode(pk_info[2]).payload + + # We ignore attributes and (for v2 only) publickey + + return (algo_oid, private_key, algo_params) diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi b/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi new file mode 100644 index 0000000..be716af --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi @@ -0,0 +1,14 @@ +from typing import Dict, Tuple, Optional, Union, Callable + +from Cryptodome.Util.asn1 import DerObject + +def wrap(private_key: bytes, + key_oid: str, + passphrase: Union[bytes, str] = ..., + protection: str = ..., + prot_params: Dict = ..., + key_params: Optional[DerObject] = ..., + randfunc: Optional[Callable[[int],str]] = ...) -> bytes: ... + + +def unwrap(p8_private_key: bytes, passphrase: Optional[Union[bytes, str]] = ...) -> Tuple[str, bytes, Optional[bytes]]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py b/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py new file mode 100644 index 0000000..9ee5385 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py @@ -0,0 +1,435 @@ +# +# PublicKey/_PBES.py : Password-Based Encryption functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome import Random +from Cryptodome.Util.asn1 import ( + DerSequence, DerOctetString, + DerObjectId, DerInteger, + ) + +from Cryptodome.Util.Padding import pad, unpad +from Cryptodome.Hash import MD5, SHA1, SHA224, SHA256, SHA384, SHA512 +from Cryptodome.Cipher import DES, ARC2, DES3, AES +from Cryptodome.Protocol.KDF import PBKDF1, PBKDF2, scrypt + +_OID_PBE_WITH_MD5_AND_DES_CBC = "1.2.840.113549.1.5.3" +_OID_PBE_WITH_MD5_AND_RC2_CBC = "1.2.840.113549.1.5.6" +_OID_PBE_WITH_SHA1_AND_DES_CBC = "1.2.840.113549.1.5.10" +_OID_PBE_WITH_SHA1_AND_RC2_CBC = "1.2.840.113549.1.5.11" + +_OID_PBES2 = "1.2.840.113549.1.5.13" + +_OID_PBKDF2 = "1.2.840.113549.1.5.12" +_OID_SCRYPT = "1.3.6.1.4.1.11591.4.11" + +_OID_HMAC_SHA1 = "1.2.840.113549.2.7" +_OID_HMAC_SHA224 = "1.2.840.113549.2.8" +_OID_HMAC_SHA256 = "1.2.840.113549.2.9" +_OID_HMAC_SHA384 = "1.2.840.113549.2.10" +_OID_HMAC_SHA512 = "1.2.840.113549.2.11" + +_OID_DES_EDE3_CBC = "1.2.840.113549.3.7" +_OID_AES128_CBC = "2.16.840.1.101.3.4.1.2" +_OID_AES192_CBC = "2.16.840.1.101.3.4.1.22" +_OID_AES256_CBC = "2.16.840.1.101.3.4.1.42" + + +class PbesError(ValueError): + pass + +# These are the ASN.1 definitions used by the PBES1/2 logic: +# +# EncryptedPrivateKeyInfo ::= SEQUENCE { +# encryptionAlgorithm EncryptionAlgorithmIdentifier, +# encryptedData EncryptedData +# } +# +# EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier +# +# EncryptedData ::= OCTET STRING +# +# AlgorithmIdentifier ::= SEQUENCE { +# algorithm OBJECT IDENTIFIER, +# parameters ANY DEFINED BY algorithm OPTIONAL +# } +# +# PBEParameter ::= SEQUENCE { +# salt OCTET STRING (SIZE(8)), +# iterationCount INTEGER +# } +# +# PBES2-params ::= SEQUENCE { +# keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, +# encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} +# } +# +# PBKDF2-params ::= SEQUENCE { +# salt CHOICE { +# specified OCTET STRING, +# otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}} +# }, +# iterationCount INTEGER (1..MAX), +# keyLength INTEGER (1..MAX) OPTIONAL, +# prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 +# } +# +# scrypt-params ::= SEQUENCE { +# salt OCTET STRING, +# costParameter INTEGER (1..MAX), +# blockSize INTEGER (1..MAX), +# parallelizationParameter INTEGER (1..MAX), +# keyLength INTEGER (1..MAX) OPTIONAL +# } + +class PBES1(object): + """Deprecated encryption scheme with password-based key derivation + (originally defined in PKCS#5 v1.5, but still present in `v2.0`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt + """ + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES1*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data) + encrypted_algorithm = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(encrypted_algorithm[0]).value + cipher_params = {} + if pbe_oid == _OID_PBE_WITH_MD5_AND_DES_CBC: + # PBE_MD5_DES_CBC + hashmod = MD5 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_MD5_AND_RC2_CBC: + # PBE_MD5_RC2_CBC + hashmod = MD5 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_DES_CBC: + # PBE_SHA1_DES_CBC + hashmod = SHA1 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_RC2_CBC: + # PBE_SHA1_RC2_CBC + hashmod = SHA1 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + else: + raise PbesError("Unknown OID for PBES1") + + pbe_params = DerSequence().decode(encrypted_algorithm[1], nr_elements=2) + salt = DerOctetString().decode(pbe_params[0]).payload + iterations = pbe_params[1] + + key_iv = PBKDF1(passphrase, salt, 16, iterations, hashmod) + key, iv = key_iv[:8], key_iv[8:] + + cipher = ciphermod.new(key, ciphermod.MODE_CBC, iv, **cipher_params) + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) + + +class PBES2(object): + """Encryption scheme with password-based key derivation + (defined in `PKCS#5 v2.0`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt.""" + + @staticmethod + def encrypt(data, passphrase, protection, prot_params=None, randfunc=None): + """Encrypt a piece of data using a passphrase and *PBES2*. + + :Parameters: + data : byte string + The piece of data to encrypt. + passphrase : byte string + The passphrase to use for encrypting the data. + protection : string + The identifier of the encryption algorithm to use. + The default value is '``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``'. + prot_params : dictionary + Parameters of the protection algorithm. + + +------------------+-----------------------------------------------+ + | Key | Description | + +==================+===============================================+ + | iteration_count | The KDF algorithm is repeated several times to| + | | slow down brute force attacks on passwords | + | | (called *N* or CPU/memory cost in scrypt). | + | | | + | | The default value for PBKDF2 is 1 000. | + | | The default value for scrypt is 16 384. | + +------------------+-----------------------------------------------+ + | salt_size | Salt is used to thwart dictionary and rainbow | + | | attacks on passwords. The default value is 8 | + | | bytes. | + +------------------+-----------------------------------------------+ + | block_size | *(scrypt only)* Memory-cost (r). The default | + | | value is 8. | + +------------------+-----------------------------------------------+ + | parallelization | *(scrypt only)* CPU-cost (p). The default | + | | value is 1. | + +------------------+-----------------------------------------------+ + + + randfunc : callable + Random number generation function; it should accept + a single integer N and return a string of random data, + N bytes long. If not specified, a new RNG will be + instantiated from ``Cryptodome.Random``. + + :Returns: + The encrypted data, as a binary string. + """ + + if prot_params is None: + prot_params = {} + + if randfunc is None: + randfunc = Random.new().read + + if protection == 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC': + key_size = 24 + module = DES3 + cipher_mode = DES3.MODE_CBC + enc_oid = _OID_DES_EDE3_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES128-CBC', + 'scryptAndAES128-CBC'): + key_size = 16 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES128_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES192-CBC', + 'scryptAndAES192-CBC'): + key_size = 24 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES192_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES256-CBC', + 'scryptAndAES256-CBC'): + key_size = 32 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES256_CBC + else: + raise ValueError("Unknown PBES2 mode") + + # Get random data + iv = randfunc(module.block_size) + salt = randfunc(prot_params.get("salt_size", 8)) + + # Derive key from password + if protection.startswith('PBKDF2'): + count = prot_params.get("iteration_count", 1000) + key = PBKDF2(passphrase, salt, key_size, count) + kdf_info = DerSequence([ + DerObjectId(_OID_PBKDF2), # PBKDF2 + DerSequence([ + DerOctetString(salt), + DerInteger(count) + ]) + ]) + else: + # It must be scrypt + count = prot_params.get("iteration_count", 16384) + scrypt_r = prot_params.get('block_size', 8) + scrypt_p = prot_params.get('parallelization', 1) + key = scrypt(passphrase, salt, key_size, + count, scrypt_r, scrypt_p) + kdf_info = DerSequence([ + DerObjectId(_OID_SCRYPT), # scrypt + DerSequence([ + DerOctetString(salt), + DerInteger(count), + DerInteger(scrypt_r), + DerInteger(scrypt_p) + ]) + ]) + + # Create cipher and use it + cipher = module.new(key, cipher_mode, iv) + encrypted_data = cipher.encrypt(pad(data, cipher.block_size)) + enc_info = DerSequence([ + DerObjectId(enc_oid), + DerOctetString(iv) + ]) + + # Result + enc_private_key_info = DerSequence([ + # encryptionAlgorithm + DerSequence([ + DerObjectId(_OID_PBES2), + DerSequence([ + kdf_info, + enc_info + ]), + ]), + DerOctetString(encrypted_data) + ]) + return enc_private_key_info.encode() + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES2*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data, nr_elements=2) + enc_algo = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(enc_algo[0]).value + if pbe_oid != _OID_PBES2: + raise PbesError("Not a PBES2 object") + + pbes2_params = DerSequence().decode(enc_algo[1], nr_elements=2) + + ### Key Derivation Function selection + kdf_info = DerSequence().decode(pbes2_params[0], nr_elements=2) + kdf_oid = DerObjectId().decode(kdf_info[0]).value + + kdf_key_length = None + + # We only support PBKDF2 or scrypt + if kdf_oid == _OID_PBKDF2: + + pbkdf2_params = DerSequence().decode(kdf_info[1], nr_elements=(2, 3, 4)) + salt = DerOctetString().decode(pbkdf2_params[0]).payload + iteration_count = pbkdf2_params[1] + + left = len(pbkdf2_params) - 2 + idx = 2 + + if left > 0: + try: + kdf_key_length = pbkdf2_params[idx] - 0 + left -= 1 + idx += 1 + except TypeError: + pass + + # Default is HMAC-SHA1 + pbkdf2_prf_oid = "1.2.840.113549.2.7" + if left > 0: + pbkdf2_prf_algo_id = DerSequence().decode(pbkdf2_params[idx]) + pbkdf2_prf_oid = DerObjectId().decode(pbkdf2_prf_algo_id[0]).value + + elif kdf_oid == _OID_SCRYPT: + + scrypt_params = DerSequence().decode(kdf_info[1], nr_elements=(4, 5)) + salt = DerOctetString().decode(scrypt_params[0]).payload + iteration_count, scrypt_r, scrypt_p = [scrypt_params[x] + for x in (1, 2, 3)] + if len(scrypt_params) > 4: + kdf_key_length = scrypt_params[4] + else: + kdf_key_length = None + else: + raise PbesError("Unsupported PBES2 KDF") + + ### Cipher selection + enc_info = DerSequence().decode(pbes2_params[1]) + enc_oid = DerObjectId().decode(enc_info[0]).value + + if enc_oid == _OID_DES_EDE3_CBC: + # DES_EDE3_CBC + ciphermod = DES3 + key_size = 24 + elif enc_oid == _OID_AES128_CBC: + # AES128_CBC + ciphermod = AES + key_size = 16 + elif enc_oid == _OID_AES192_CBC: + # AES192_CBC + ciphermod = AES + key_size = 24 + elif enc_oid == _OID_AES256_CBC: + # AES256_CBC + ciphermod = AES + key_size = 32 + else: + raise PbesError("Unsupported PBES2 cipher") + + if kdf_key_length and kdf_key_length != key_size: + raise PbesError("Mismatch between PBES2 KDF parameters" + " and selected cipher") + + IV = DerOctetString().decode(enc_info[1]).payload + + # Create cipher + if kdf_oid == _OID_PBKDF2: + if pbkdf2_prf_oid == _OID_HMAC_SHA1: + hmac_hash_module = SHA1 + elif pbkdf2_prf_oid == _OID_HMAC_SHA224: + hmac_hash_module = SHA224 + elif pbkdf2_prf_oid == _OID_HMAC_SHA256: + hmac_hash_module = SHA256 + elif pbkdf2_prf_oid == _OID_HMAC_SHA384: + hmac_hash_module = SHA384 + elif pbkdf2_prf_oid == _OID_HMAC_SHA512: + hmac_hash_module = SHA512 + else: + raise PbesError("Unsupported HMAC %s" % pbkdf2_prf_oid) + + key = PBKDF2(passphrase, salt, key_size, iteration_count, + hmac_hash_module=hmac_hash_module) + else: + key = scrypt(passphrase, salt, key_size, iteration_count, + scrypt_r, scrypt_p) + cipher = ciphermod.new(key, ciphermod.MODE_CBC, IV) + + # Decrypt data + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi b/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi new file mode 100644 index 0000000..a8a34ce --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi @@ -0,0 +1,19 @@ +from typing import Dict, Optional, Callable + +class PbesError(ValueError): + ... + +class PBES1(object): + @staticmethod + def decrypt(data: bytes, passphrase: bytes) -> bytes: ... + +class PBES2(object): + @staticmethod + def encrypt(data: bytes, + passphrase: bytes, + protection: str, + prot_params: Optional[Dict] = ..., + randfunc: Optional[Callable[[int],bytes]] = ...) -> bytes: ... + + @staticmethod + def decrypt(data:bytes, passphrase: bytes) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/IO/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/IO/__init__.py new file mode 100644 index 0000000..85a0d0b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/IO/__init__.py @@ -0,0 +1,31 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = ['PEM', 'PKCS8'] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py b/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py new file mode 100644 index 0000000..c9ff848 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py @@ -0,0 +1,42 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = ["Integer"] + +try: + from Cryptodome.Math._IntegerGMP import IntegerGMP as Integer + from Cryptodome.Math._IntegerGMP import implementation as _implementation +except (ImportError, OSError, AttributeError): + try: + from Cryptodome.Math._IntegerCustom import IntegerCustom as Integer + from Cryptodome.Math._IntegerCustom import implementation as _implementation + except (ImportError, OSError): + from Cryptodome.Math._IntegerNative import IntegerNative as Integer + _implementation = {} diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi new file mode 100644 index 0000000..b0206ca --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi @@ -0,0 +1,2 @@ +from Cryptodome.Math._IntegerBase import IntegerBase as Integer +__all__ = ['Integer'] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.py b/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.py new file mode 100644 index 0000000..33814fa --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.py @@ -0,0 +1,369 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Functions to create and test prime numbers. + +:undocumented: __package__ +""" + +from Cryptodome import Random +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Util.py3compat import iter_range + +COMPOSITE = 0 +PROBABLY_PRIME = 1 + + +def miller_rabin_test(candidate, iterations, randfunc=None): + """Perform a Miller-Rabin primality test on an integer. + + The test is specified in Section C.3.1 of `FIPS PUB 186-4`__. + + :Parameters: + candidate : integer + The number to test for primality. + iterations : integer + The maximum number of iterations to perform before + declaring a candidate a probable prime. + randfunc : callable + An RNG function where bases are taken from. + + :Returns: + ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``. + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + if candidate in (1, 2, 3, 5): + return PROBABLY_PRIME + + if candidate.is_even(): + return COMPOSITE + + one = Integer(1) + minus_one = Integer(candidate - 1) + + if randfunc is None: + randfunc = Random.new().read + + # Step 1 and 2 + m = Integer(minus_one) + a = 0 + while m.is_even(): + m >>= 1 + a += 1 + + # Skip step 3 + + # Step 4 + for i in iter_range(iterations): + + # Step 4.1-2 + base = 1 + while base in (one, minus_one): + base = Integer.random_range(min_inclusive=2, + max_inclusive=candidate - 2, + randfunc=randfunc) + assert(2 <= base <= candidate - 2) + + # Step 4.3-4.4 + z = pow(base, m, candidate) + if z in (one, minus_one): + continue + + # Step 4.5 + for j in iter_range(1, a): + z = pow(z, 2, candidate) + if z == minus_one: + break + if z == one: + return COMPOSITE + else: + return COMPOSITE + + # Step 5 + return PROBABLY_PRIME + + +def lucas_test(candidate): + """Perform a Lucas primality test on an integer. + + The test is specified in Section C.3.3 of `FIPS PUB 186-4`__. + + :Parameters: + candidate : integer + The number to test for primality. + + :Returns: + ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``. + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + # Step 1 + if candidate in (1, 2, 3, 5): + return PROBABLY_PRIME + if candidate.is_even() or candidate.is_perfect_square(): + return COMPOSITE + + # Step 2 + def alternate(): + value = 5 + while True: + yield value + if value > 0: + value += 2 + else: + value -= 2 + value = -value + + for D in alternate(): + if candidate in (D, -D): + continue + js = Integer.jacobi_symbol(D, candidate) + if js == 0: + return COMPOSITE + if js == -1: + break + # Found D. P=1 and Q=(1-D)/4 (note that Q is guaranteed to be an integer) + + # Step 3 + # This is \delta(n) = n - jacobi(D/n) + K = candidate + 1 + # Step 4 + r = K.size_in_bits() - 1 + # Step 5 + # U_1=1 and V_1=P + U_i = Integer(1) + V_i = Integer(1) + U_temp = Integer(0) + V_temp = Integer(0) + # Step 6 + for i in iter_range(r - 1, -1, -1): + # Square + # U_temp = U_i * V_i % candidate + U_temp.set(U_i) + U_temp *= V_i + U_temp %= candidate + # V_temp = (((V_i ** 2 + (U_i ** 2 * D)) * K) >> 1) % candidate + V_temp.set(U_i) + V_temp *= U_i + V_temp *= D + V_temp.multiply_accumulate(V_i, V_i) + if V_temp.is_odd(): + V_temp += candidate + V_temp >>= 1 + V_temp %= candidate + # Multiply + if K.get_bit(i): + # U_i = (((U_temp + V_temp) * K) >> 1) % candidate + U_i.set(U_temp) + U_i += V_temp + if U_i.is_odd(): + U_i += candidate + U_i >>= 1 + U_i %= candidate + # V_i = (((V_temp + U_temp * D) * K) >> 1) % candidate + V_i.set(V_temp) + V_i.multiply_accumulate(U_temp, D) + if V_i.is_odd(): + V_i += candidate + V_i >>= 1 + V_i %= candidate + else: + U_i.set(U_temp) + V_i.set(V_temp) + # Step 7 + if U_i == 0: + return PROBABLY_PRIME + return COMPOSITE + + +from Cryptodome.Util.number import sieve_base as _sieve_base_large +## The optimal number of small primes to use for the sieve +## is probably dependent on the platform and the candidate size +_sieve_base = set(_sieve_base_large[:100]) + + +def test_probable_prime(candidate, randfunc=None): + """Test if a number is prime. + + A number is qualified as prime if it passes a certain + number of Miller-Rabin tests (dependent on the size + of the number, but such that probability of a false + positive is less than 10^-30) and a single Lucas test. + + For instance, a 1024-bit candidate will need to pass + 4 Miller-Rabin tests. + + :Parameters: + candidate : integer + The number to test for primality. + randfunc : callable + The routine to draw random bytes from to select Miller-Rabin bases. + :Returns: + ``PROBABLE_PRIME`` if the number if prime with very high probability. + ``COMPOSITE`` if the number is a composite. + For efficiency reasons, ``COMPOSITE`` is also returned for small primes. + """ + + if randfunc is None: + randfunc = Random.new().read + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + # First, check trial division by the smallest primes + if int(candidate) in _sieve_base: + return PROBABLY_PRIME + try: + map(candidate.fail_if_divisible_by, _sieve_base) + except ValueError: + return COMPOSITE + + # These are the number of Miller-Rabin iterations s.t. p(k, t) < 1E-30, + # with p(k, t) being the probability that a randomly chosen k-bit number + # is composite but still survives t MR iterations. + mr_ranges = ((220, 30), (280, 20), (390, 15), (512, 10), + (620, 7), (740, 6), (890, 5), (1200, 4), + (1700, 3), (3700, 2)) + + bit_size = candidate.size_in_bits() + try: + mr_iterations = list(filter(lambda x: bit_size < x[0], + mr_ranges))[0][1] + except IndexError: + mr_iterations = 1 + + if miller_rabin_test(candidate, mr_iterations, + randfunc=randfunc) == COMPOSITE: + return COMPOSITE + if lucas_test(candidate) == COMPOSITE: + return COMPOSITE + return PROBABLY_PRIME + + +def generate_probable_prime(**kwargs): + """Generate a random probable prime. + + The prime will not have any specific properties + (e.g. it will not be a *strong* prime). + + Random numbers are evaluated for primality until one + passes all tests, consisting of a certain number of + Miller-Rabin tests with random bases followed by + a single Lucas test. + + The number of Miller-Rabin iterations is chosen such that + the probability that the output number is a non-prime is + less than 1E-30 (roughly 2^{-100}). + + This approach is compliant to `FIPS PUB 186-4`__. + + :Keywords: + exact_bits : integer + The desired size in bits of the probable prime. + It must be at least 160. + randfunc : callable + An RNG function where candidate primes are taken from. + prime_filter : callable + A function that takes an Integer as parameter and returns + True if the number can be passed to further primality tests, + False if it should be immediately discarded. + + :Return: + A probable prime in the range 2^exact_bits > p > 2^(exact_bits-1). + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + exact_bits = kwargs.pop("exact_bits", None) + randfunc = kwargs.pop("randfunc", None) + prime_filter = kwargs.pop("prime_filter", lambda x: True) + if kwargs: + raise ValueError("Unknown parameters: " + kwargs.keys()) + + if exact_bits is None: + raise ValueError("Missing exact_bits parameter") + if exact_bits < 160: + raise ValueError("Prime number is not big enough.") + + if randfunc is None: + randfunc = Random.new().read + + result = COMPOSITE + while result == COMPOSITE: + candidate = Integer.random(exact_bits=exact_bits, + randfunc=randfunc) | 1 + if not prime_filter(candidate): + continue + result = test_probable_prime(candidate, randfunc) + return candidate + + +def generate_probable_safe_prime(**kwargs): + """Generate a random, probable safe prime. + + Note this operation is much slower than generating a simple prime. + + :Keywords: + exact_bits : integer + The desired size in bits of the probable safe prime. + randfunc : callable + An RNG function where candidate primes are taken from. + + :Return: + A probable safe prime in the range + 2^exact_bits > p > 2^(exact_bits-1). + """ + + exact_bits = kwargs.pop("exact_bits", None) + randfunc = kwargs.pop("randfunc", None) + if kwargs: + raise ValueError("Unknown parameters: " + kwargs.keys()) + + if randfunc is None: + randfunc = Random.new().read + + result = COMPOSITE + while result == COMPOSITE: + q = generate_probable_prime(exact_bits=exact_bits - 1, randfunc=randfunc) + candidate = q * 2 + 1 + if candidate.size_in_bits() != exact_bits: + continue + result = test_probable_prime(candidate, randfunc=randfunc) + return candidate diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi new file mode 100644 index 0000000..7813483 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi @@ -0,0 +1,18 @@ +from typing import Callable, Optional, Union, Set + +PrimeResult = int + +COMPOSITE: PrimeResult +PROBABLY_PRIME: PrimeResult + +def miller_rabin_test(candidate: int, iterations: int, randfunc: Optional[Callable[[int],bytes]]=None) -> PrimeResult: ... +def lucas_test(candidate: int) -> PrimeResult: ... +_sieve_base: Set[int] +def test_probable_prime(candidate: int, randfunc: Optional[Callable[[int],bytes]]=None) -> PrimeResult: ... +def generate_probable_prime(*, + exact_bits: int = ..., + randfunc: Callable[[int],bytes] = ..., + prime_filter: Callable[[int],bool] = ...) -> int: ... +def generate_probable_safe_prime(*, + exact_bits: int = ..., + randfunc: Callable[[int],bytes] = ...) -> int: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py new file mode 100644 index 0000000..7d78c4b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py @@ -0,0 +1,392 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import abc + +from Cryptodome.Util.py3compat import iter_range, bord, bchr, ABC + +from Cryptodome import Random + + +class IntegerBase(ABC): + + # Conversions + @abc.abstractmethod + def __int__(self): + pass + + @abc.abstractmethod + def __str__(self): + pass + + @abc.abstractmethod + def __repr__(self): + pass + + @abc.abstractmethod + def to_bytes(self, block_size=0, byteorder='big'): + pass + + @staticmethod + @abc.abstractmethod + def from_bytes(byte_string, byteorder='big'): + pass + + # Relations + @abc.abstractmethod + def __eq__(self, term): + pass + + @abc.abstractmethod + def __ne__(self, term): + pass + + @abc.abstractmethod + def __lt__(self, term): + pass + + @abc.abstractmethod + def __le__(self, term): + pass + + @abc.abstractmethod + def __gt__(self, term): + pass + + @abc.abstractmethod + def __ge__(self, term): + pass + + @abc.abstractmethod + def __nonzero__(self): + pass + __bool__ = __nonzero__ + + @abc.abstractmethod + def is_negative(self): + pass + + # Arithmetic operations + @abc.abstractmethod + def __add__(self, term): + pass + + @abc.abstractmethod + def __sub__(self, term): + pass + + @abc.abstractmethod + def __mul__(self, factor): + pass + + @abc.abstractmethod + def __floordiv__(self, divisor): + pass + + @abc.abstractmethod + def __mod__(self, divisor): + pass + + @abc.abstractmethod + def inplace_pow(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __pow__(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __abs__(self): + pass + + @abc.abstractmethod + def sqrt(self, modulus=None): + pass + + @abc.abstractmethod + def __iadd__(self, term): + pass + + @abc.abstractmethod + def __isub__(self, term): + pass + + @abc.abstractmethod + def __imul__(self, term): + pass + + @abc.abstractmethod + def __imod__(self, term): + pass + + # Boolean/bit operations + @abc.abstractmethod + def __and__(self, term): + pass + + @abc.abstractmethod + def __or__(self, term): + pass + + @abc.abstractmethod + def __rshift__(self, pos): + pass + + @abc.abstractmethod + def __irshift__(self, pos): + pass + + @abc.abstractmethod + def __lshift__(self, pos): + pass + + @abc.abstractmethod + def __ilshift__(self, pos): + pass + + @abc.abstractmethod + def get_bit(self, n): + pass + + # Extra + @abc.abstractmethod + def is_odd(self): + pass + + @abc.abstractmethod + def is_even(self): + pass + + @abc.abstractmethod + def size_in_bits(self): + pass + + @abc.abstractmethod + def size_in_bytes(self): + pass + + @abc.abstractmethod + def is_perfect_square(self): + pass + + @abc.abstractmethod + def fail_if_divisible_by(self, small_prime): + pass + + @abc.abstractmethod + def multiply_accumulate(self, a, b): + pass + + @abc.abstractmethod + def set(self, source): + pass + + @abc.abstractmethod + def inplace_inverse(self, modulus): + pass + + @abc.abstractmethod + def inverse(self, modulus): + pass + + @abc.abstractmethod + def gcd(self, term): + pass + + @abc.abstractmethod + def lcm(self, term): + pass + + @staticmethod + @abc.abstractmethod + def jacobi_symbol(a, n): + pass + + @staticmethod + def _tonelli_shanks(n, p): + """Tonelli-shanks algorithm for computing the square root + of n modulo a prime p. + + n must be in the range [0..p-1]. + p must be at least even. + + The return value r is the square root of modulo p. If non-zero, + another solution will also exist (p-r). + + Note we cannot assume that p is really a prime: if it's not, + we can either raise an exception or return the correct value. + """ + + # See https://rosettacode.org/wiki/Tonelli-Shanks_algorithm + + if n in (0, 1): + return n + + if p % 4 == 3: + root = pow(n, (p + 1) // 4, p) + if pow(root, 2, p) != n: + raise ValueError("Cannot compute square root") + return root + + s = 1 + q = (p - 1) // 2 + while not (q & 1): + s += 1 + q >>= 1 + + z = n.__class__(2) + while True: + euler = pow(z, (p - 1) // 2, p) + if euler == 1: + z += 1 + continue + if euler == p - 1: + break + # Most probably p is not a prime + raise ValueError("Cannot compute square root") + + m = s + c = pow(z, q, p) + t = pow(n, q, p) + r = pow(n, (q + 1) // 2, p) + + while t != 1: + for i in iter_range(0, m): + if pow(t, 2**i, p) == 1: + break + if i == m: + raise ValueError("Cannot compute square root of %d mod %d" % (n, p)) + b = pow(c, 2**(m - i - 1), p) + m = i + c = b**2 % p + t = (t * b**2) % p + r = (r * b) % p + + if pow(r, 2, p) != n: + raise ValueError("Cannot compute square root") + + return r + + @classmethod + def random(cls, **kwargs): + """Generate a random natural integer of a certain size. + + :Keywords: + exact_bits : positive integer + The length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >= 2^(bits - 1) + + max_bits : positive integer + The maximum length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >=0 + + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + + :Return: a Integer object + """ + + exact_bits = kwargs.pop("exact_bits", None) + max_bits = kwargs.pop("max_bits", None) + randfunc = kwargs.pop("randfunc", None) + + if randfunc is None: + randfunc = Random.new().read + + if exact_bits is None and max_bits is None: + raise ValueError("Either 'exact_bits' or 'max_bits' must be specified") + + if exact_bits is not None and max_bits is not None: + raise ValueError("'exact_bits' and 'max_bits' are mutually exclusive") + + bits = exact_bits or max_bits + bytes_needed = ((bits - 1) // 8) + 1 + significant_bits_msb = 8 - (bytes_needed * 8 - bits) + msb = bord(randfunc(1)[0]) + if exact_bits is not None: + msb |= 1 << (significant_bits_msb - 1) + msb &= (1 << significant_bits_msb) - 1 + + return cls.from_bytes(bchr(msb) + randfunc(bytes_needed - 1)) + + @classmethod + def random_range(cls, **kwargs): + """Generate a random integer within a given internal. + + :Keywords: + min_inclusive : integer + The lower end of the interval (inclusive). + max_inclusive : integer + The higher end of the interval (inclusive). + max_exclusive : integer + The higher end of the interval (exclusive). + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + :Returns: + An Integer randomly taken in the given interval. + """ + + min_inclusive = kwargs.pop("min_inclusive", None) + max_inclusive = kwargs.pop("max_inclusive", None) + max_exclusive = kwargs.pop("max_exclusive", None) + randfunc = kwargs.pop("randfunc", None) + + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys)) + if None not in (max_inclusive, max_exclusive): + raise ValueError("max_inclusive and max_exclusive cannot be both" + " specified") + if max_exclusive is not None: + max_inclusive = max_exclusive - 1 + if None in (min_inclusive, max_inclusive): + raise ValueError("Missing keyword to identify the interval") + + if randfunc is None: + randfunc = Random.new().read + + norm_maximum = max_inclusive - min_inclusive + bits_needed = cls(norm_maximum).size_in_bits() + + norm_candidate = -1 + while not 0 <= norm_candidate <= norm_maximum: + norm_candidate = cls.random( + max_bits=bits_needed, + randfunc=randfunc + ) + return norm_candidate + min_inclusive + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi new file mode 100644 index 0000000..a42a48b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi @@ -0,0 +1,63 @@ +from typing import Optional, Union, Callable + +RandFunc = Callable[[int],int] + +class IntegerBase: + + def __init__(self, value: Union[IntegerBase, int]): ... + + def __int__(self) -> int: ... + def __str__(self) -> str: ... + def __repr__(self) -> str: ... + def to_bytes(self, block_size: Optional[int]=0, byteorder: str= ...) -> bytes: ... + @staticmethod + def from_bytes(byte_string: bytes, byteorder: Optional[str] = ...) -> IntegerBase: ... + def __eq__(self, term: object) -> bool: ... + def __ne__(self, term: object) -> bool: ... + def __lt__(self, term: Union[IntegerBase, int]) -> bool: ... + def __le__(self, term: Union[IntegerBase, int]) -> bool: ... + def __gt__(self, term: Union[IntegerBase, int]) -> bool: ... + def __ge__(self, term: Union[IntegerBase, int]) -> bool: ... + def __nonzero__(self) -> bool: ... + def is_negative(self) -> bool: ... + def __add__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __sub__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __mul__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __floordiv__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def __mod__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def inplace_pow(self, exponent: int, modulus: Optional[Union[IntegerBase, int]]=None) -> IntegerBase: ... + def __pow__(self, exponent: int, modulus: Optional[int]) -> IntegerBase: ... + def __abs__(self) -> IntegerBase: ... + def sqrt(self, modulus: Optional[int]) -> IntegerBase: ... + def __iadd__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __isub__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __imul__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __imod__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def __and__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __or__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __rshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __irshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __lshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __ilshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def get_bit(self, n: int) -> bool: ... + def is_odd(self) -> bool: ... + def is_even(self) -> bool: ... + def size_in_bits(self) -> int: ... + def size_in_bytes(self) -> int: ... + def is_perfect_square(self) -> bool: ... + def fail_if_divisible_by(self, small_prime: Union[IntegerBase, int]) -> None: ... + def multiply_accumulate(self, a: Union[IntegerBase, int], b: Union[IntegerBase, int]) -> IntegerBase: ... + def set(self, source: Union[IntegerBase, int]) -> IntegerBase: ... + def inplace_inverse(self, modulus: Union[IntegerBase, int]) -> IntegerBase: ... + def inverse(self, modulus: Union[IntegerBase, int]) -> IntegerBase: ... + def gcd(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def lcm(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + @staticmethod + def jacobi_symbol(a: Union[IntegerBase, int], n: Union[IntegerBase, int]) -> IntegerBase: ... + @staticmethod + def _tonelli_shanks(n: Union[IntegerBase, int], p: Union[IntegerBase, int]) -> IntegerBase : ... + @classmethod + def random(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ... + @classmethod + def random_range(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py new file mode 100644 index 0000000..0e23152 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py @@ -0,0 +1,118 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from ._IntegerNative import IntegerNative + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, backend, + c_size_t, c_ulonglong) + + +from Cryptodome.Random.random import getrandbits + +c_defs = """ +int monty_pow(const uint8_t *base, + const uint8_t *exp, + const uint8_t *modulus, + uint8_t *out, + size_t len, + uint64_t seed); +""" + + +_raw_montgomery = load_pycryptodome_raw_lib("Cryptodome.Math._modexp", c_defs) +implementation = {"library": "custom", "api": backend} + + +class IntegerCustom(IntegerNative): + + @staticmethod + def from_bytes(byte_string, byteorder='big'): + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + return IntegerCustom(bytes_to_long(byte_string)) + + def inplace_pow(self, exponent, modulus=None): + exp_value = int(exponent) + if exp_value < 0: + raise ValueError("Exponent must not be negative") + + # No modular reduction + if modulus is None: + self._value = pow(self._value, exp_value) + return self + + # With modular reduction + mod_value = int(modulus) + if mod_value < 0: + raise ValueError("Modulus must be positive") + if mod_value == 0: + raise ZeroDivisionError("Modulus cannot be zero") + + # C extension only works with odd moduli + if (mod_value & 1) == 0: + self._value = pow(self._value, exp_value, mod_value) + return self + + # C extension only works with bases smaller than modulus + if self._value >= mod_value: + self._value %= mod_value + + max_len = len(long_to_bytes(max(self._value, exp_value, mod_value))) + + base_b = long_to_bytes(self._value, max_len) + exp_b = long_to_bytes(exp_value, max_len) + modulus_b = long_to_bytes(mod_value, max_len) + + out = create_string_buffer(max_len) + + error = _raw_montgomery.monty_pow( + out, + base_b, + exp_b, + modulus_b, + c_size_t(max_len), + c_ulonglong(getrandbits(64)) + ) + + if error: + raise ValueError("monty_pow failed with error: %d" % error) + + result = bytes_to_long(get_raw_buffer(out)) + self._value = result + return self diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi new file mode 100644 index 0000000..2dd75c7 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi @@ -0,0 +1,8 @@ +from typing import Any + +from ._IntegerNative import IntegerNative + +_raw_montgomery = Any + +class IntegerCustom(IntegerNative): + pass diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py new file mode 100644 index 0000000..3ab7c59 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py @@ -0,0 +1,762 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import sys + +from Cryptodome.Util.py3compat import tobytes, is_native_int + +from Cryptodome.Util._raw_api import (backend, load_lib, + get_raw_buffer, get_c_string, + null_pointer, create_string_buffer, + c_ulong, c_size_t, c_uint8_ptr) + +from ._IntegerBase import IntegerBase + +gmp_defs = """typedef unsigned long UNIX_ULONG; + typedef struct { int a; int b; void *c; } MPZ; + typedef MPZ mpz_t[1]; + typedef UNIX_ULONG mp_bitcnt_t; + + void __gmpz_init (mpz_t x); + void __gmpz_init_set (mpz_t rop, const mpz_t op); + void __gmpz_init_set_ui (mpz_t rop, UNIX_ULONG op); + + UNIX_ULONG __gmpz_get_ui (const mpz_t op); + void __gmpz_set (mpz_t rop, const mpz_t op); + void __gmpz_set_ui (mpz_t rop, UNIX_ULONG op); + void __gmpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_add_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_sub_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_addmul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_addmul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_submul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_import (mpz_t rop, size_t count, int order, size_t size, + int endian, size_t nails, const void *op); + void * __gmpz_export (void *rop, size_t *countp, int order, + size_t size, + int endian, size_t nails, const mpz_t op); + size_t __gmpz_sizeinbase (const mpz_t op, int base); + void __gmpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + int __gmpz_cmp (const mpz_t op1, const mpz_t op2); + void __gmpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const + mpz_t mod); + void __gmpz_powm_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp, + const mpz_t mod); + void __gmpz_pow_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp); + void __gmpz_sqrt(mpz_t rop, const mpz_t op); + void __gmpz_mod (mpz_t r, const mpz_t n, const mpz_t d); + void __gmpz_neg (mpz_t rop, const mpz_t op); + void __gmpz_abs (mpz_t rop, const mpz_t op); + void __gmpz_and (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_ior (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_clear (mpz_t x); + void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b); + void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d); + void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); + int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); + int __gmpz_perfect_square_p (const mpz_t op); + int __gmpz_jacobi (const mpz_t a, const mpz_t b); + void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); + UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, + UNIX_ULONG op2); + void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_divisible_p (const mpz_t n, const mpz_t d); + int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); + """ + +if sys.platform == "win32": + raise ImportError("Not using GMP on Windows") + +lib = load_lib("gmp", gmp_defs) +implementation = {"library": "gmp", "api": backend} + +if hasattr(lib, "__mpir_version"): + raise ImportError("MPIR library detected") + +# In order to create a function that returns a pointer to +# a new MPZ structure, we need to break the abstraction +# and know exactly what ffi backend we have +if implementation["api"] == "ctypes": + from ctypes import Structure, c_int, c_void_p, byref + + class _MPZ(Structure): + _fields_ = [('_mp_alloc', c_int), + ('_mp_size', c_int), + ('_mp_d', c_void_p)] + + def new_mpz(): + return byref(_MPZ()) + +else: + # We are using CFFI + from Cryptodome.Util._raw_api import ffi + + def new_mpz(): + return ffi.new("MPZ*") + + +# Lazy creation of GMP methods +class _GMP(object): + + def __getattr__(self, name): + if name.startswith("mpz_"): + func_name = "__gmpz_" + name[4:] + elif name.startswith("gmp_"): + func_name = "__gmp_" + name[4:] + else: + raise AttributeError("Attribute %s is invalid" % name) + func = getattr(lib, func_name) + setattr(self, name, func) + return func + + +_gmp = _GMP() + + +class IntegerGMP(IntegerBase): + """A fast, arbitrary precision integer""" + + _zero_mpz_p = new_mpz() + _gmp.mpz_init_set_ui(_zero_mpz_p, c_ulong(0)) + + def __init__(self, value): + """Initialize the integer to the given value.""" + + self._mpz_p = new_mpz() + self._initialized = False + + if isinstance(value, float): + raise ValueError("A floating point type is not a natural number") + + if is_native_int(value): + _gmp.mpz_init(self._mpz_p) + self._initialized = True + if value == 0: + return + + tmp = new_mpz() + _gmp.mpz_init(tmp) + + try: + positive = value >= 0 + reduce = abs(value) + slots = (reduce.bit_length() - 1) // 32 + 1 + + while slots > 0: + slots = slots - 1 + _gmp.mpz_set_ui(tmp, + c_ulong(0xFFFFFFFF & (reduce >> (slots * 32)))) + _gmp.mpz_mul_2exp(tmp, tmp, c_ulong(slots * 32)) + _gmp.mpz_add(self._mpz_p, self._mpz_p, tmp) + finally: + _gmp.mpz_clear(tmp) + + if not positive: + _gmp.mpz_neg(self._mpz_p, self._mpz_p) + + elif isinstance(value, IntegerGMP): + _gmp.mpz_init_set(self._mpz_p, value._mpz_p) + self._initialized = True + else: + raise NotImplementedError + + + # Conversions + def __int__(self): + tmp = new_mpz() + _gmp.mpz_init_set(tmp, self._mpz_p) + + try: + value = 0 + slot = 0 + while _gmp.mpz_cmp(tmp, self._zero_mpz_p) != 0: + lsb = _gmp.mpz_get_ui(tmp) & 0xFFFFFFFF + value |= lsb << (slot * 32) + _gmp.mpz_tdiv_q_2exp(tmp, tmp, c_ulong(32)) + slot = slot + 1 + finally: + _gmp.mpz_clear(tmp) + + if self < 0: + value = -value + return int(value) + + def __str__(self): + return str(int(self)) + + def __repr__(self): + return "Integer(%s)" % str(self) + + # Only Python 2.x + def __hex__(self): + return hex(int(self)) + + # Only Python 3.x + def __index__(self): + return int(self) + + def to_bytes(self, block_size=0, byteorder='big'): + """Convert the number into a byte string. + + This method encodes the number in network order and prepends + as many zero bytes as required. It only works for non-negative + values. + + :Parameters: + block_size : integer + The exact size the output byte string must have. + If zero, the string has the minimal length. + byteorder : string + 'big' for big-endian integers (default), 'little' for litte-endian. + :Returns: + A byte string. + :Raise ValueError: + If the value is negative or if ``block_size`` is + provided and the length of the byte string would exceed it. + """ + + if self < 0: + raise ValueError("Conversion only valid for non-negative numbers") + + buf_len = (_gmp.mpz_sizeinbase(self._mpz_p, 2) + 7) // 8 + if buf_len > block_size > 0: + raise ValueError("Number is too big to convert to byte string" + " of prescribed length") + buf = create_string_buffer(buf_len) + + + _gmp.mpz_export( + buf, + null_pointer, # Ignore countp + 1, # Big endian + c_size_t(1), # Each word is 1 byte long + 0, # Endianess within a word - not relevant + c_size_t(0), # No nails + self._mpz_p) + + result = b'\x00' * max(0, block_size - buf_len) + get_raw_buffer(buf) + if byteorder == 'big': + pass + elif byteorder == 'little': + result = bytearray(result) + result.reverse() + result = bytes(result) + else: + raise ValueError("Incorrect byteorder") + return result + + @staticmethod + def from_bytes(byte_string, byteorder='big'): + """Convert a byte string into a number. + + :Parameters: + byte_string : byte string + The input number, encoded in network order. + It can only be non-negative. + byteorder : string + 'big' for big-endian integers (default), 'little' for litte-endian. + + :Return: + The ``Integer`` object carrying the same value as the input. + """ + result = IntegerGMP(0) + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + _gmp.mpz_import( + result._mpz_p, + c_size_t(len(byte_string)), # Amount of words to read + 1, # Big endian + c_size_t(1), # Each word is 1 byte long + 0, # Endianess within a word - not relevant + c_size_t(0), # No nails + c_uint8_ptr(byte_string)) + return result + + # Relations + def _apply_and_return(self, func, term): + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + return func(self._mpz_p, term._mpz_p) + + def __eq__(self, term): + if not (isinstance(term, IntegerGMP) or is_native_int(term)): + return False + return self._apply_and_return(_gmp.mpz_cmp, term) == 0 + + def __ne__(self, term): + if not (isinstance(term, IntegerGMP) or is_native_int(term)): + return True + return self._apply_and_return(_gmp.mpz_cmp, term) != 0 + + def __lt__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) < 0 + + def __le__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) <= 0 + + def __gt__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) > 0 + + def __ge__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) >= 0 + + def __nonzero__(self): + return _gmp.mpz_cmp(self._mpz_p, self._zero_mpz_p) != 0 + __bool__ = __nonzero__ + + def is_negative(self): + return _gmp.mpz_cmp(self._mpz_p, self._zero_mpz_p) < 0 + + # Arithmetic operations + def __add__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_add(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __sub__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_sub(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __mul__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_mul(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __floordiv__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + if _gmp.mpz_cmp(divisor._mpz_p, + self._zero_mpz_p) == 0: + raise ZeroDivisionError("Division by zero") + result = IntegerGMP(0) + _gmp.mpz_fdiv_q(result._mpz_p, + self._mpz_p, + divisor._mpz_p) + return result + + def __mod__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + comp = _gmp.mpz_cmp(divisor._mpz_p, + self._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Division by zero") + if comp < 0: + raise ValueError("Modulus must be positive") + result = IntegerGMP(0) + _gmp.mpz_mod(result._mpz_p, + self._mpz_p, + divisor._mpz_p) + return result + + def inplace_pow(self, exponent, modulus=None): + + if modulus is None: + if exponent < 0: + raise ValueError("Exponent must not be negative") + + # Normal exponentiation + if exponent > 256: + raise ValueError("Exponent is too big") + _gmp.mpz_pow_ui(self._mpz_p, + self._mpz_p, # Base + c_ulong(int(exponent)) + ) + else: + # Modular exponentiation + if not isinstance(modulus, IntegerGMP): + modulus = IntegerGMP(modulus) + if not modulus: + raise ZeroDivisionError("Division by zero") + if modulus.is_negative(): + raise ValueError("Modulus must be positive") + if is_native_int(exponent): + if exponent < 0: + raise ValueError("Exponent must not be negative") + if exponent < 65536: + _gmp.mpz_powm_ui(self._mpz_p, + self._mpz_p, + c_ulong(exponent), + modulus._mpz_p) + return self + exponent = IntegerGMP(exponent) + elif exponent.is_negative(): + raise ValueError("Exponent must not be negative") + _gmp.mpz_powm(self._mpz_p, + self._mpz_p, + exponent._mpz_p, + modulus._mpz_p) + return self + + def __pow__(self, exponent, modulus=None): + result = IntegerGMP(self) + return result.inplace_pow(exponent, modulus) + + def __abs__(self): + result = IntegerGMP(0) + _gmp.mpz_abs(result._mpz_p, self._mpz_p) + return result + + def sqrt(self, modulus=None): + """Return the largest Integer that does not + exceed the square root""" + + if modulus is None: + if self < 0: + raise ValueError("Square root of negative value") + result = IntegerGMP(0) + _gmp.mpz_sqrt(result._mpz_p, + self._mpz_p) + else: + if modulus <= 0: + raise ValueError("Modulus must be positive") + modulus = int(modulus) + result = IntegerGMP(self._tonelli_shanks(int(self) % modulus, modulus)) + + return result + + def __iadd__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_add_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_sub_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + return self + term = IntegerGMP(term) + _gmp.mpz_add(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __isub__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_sub_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_add_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + return self + term = IntegerGMP(term) + _gmp.mpz_sub(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __imul__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_mul_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_mul_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + _gmp.mpz_neg(self._mpz_p, self._mpz_p) + return self + term = IntegerGMP(term) + _gmp.mpz_mul(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __imod__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + comp = _gmp.mpz_cmp(divisor._mpz_p, + divisor._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Division by zero") + if comp < 0: + raise ValueError("Modulus must be positive") + _gmp.mpz_mod(self._mpz_p, + self._mpz_p, + divisor._mpz_p) + return self + + # Boolean/bit operations + def __and__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_and(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __or__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_ior(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __rshift__(self, pos): + result = IntegerGMP(0) + if pos < 0: + raise ValueError("negative shift count") + if pos > 65536: + if self < 0: + return -1 + else: + return 0 + _gmp.mpz_tdiv_q_2exp(result._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return result + + def __irshift__(self, pos): + if pos < 0: + raise ValueError("negative shift count") + if pos > 65536: + if self < 0: + return -1 + else: + return 0 + _gmp.mpz_tdiv_q_2exp(self._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return self + + def __lshift__(self, pos): + result = IntegerGMP(0) + if not 0 <= pos < 65536: + raise ValueError("Incorrect shift count") + _gmp.mpz_mul_2exp(result._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return result + + def __ilshift__(self, pos): + if not 0 <= pos < 65536: + raise ValueError("Incorrect shift count") + _gmp.mpz_mul_2exp(self._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return self + + def get_bit(self, n): + """Return True if the n-th bit is set to 1. + Bit 0 is the least significant.""" + + if self < 0: + raise ValueError("no bit representation for negative values") + if n < 0: + raise ValueError("negative bit count") + if n > 65536: + return 0 + return bool(_gmp.mpz_tstbit(self._mpz_p, + c_ulong(int(n)))) + + # Extra + def is_odd(self): + return _gmp.mpz_tstbit(self._mpz_p, 0) == 1 + + def is_even(self): + return _gmp.mpz_tstbit(self._mpz_p, 0) == 0 + + def size_in_bits(self): + """Return the minimum number of bits that can encode the number.""" + + if self < 0: + raise ValueError("Conversion only valid for non-negative numbers") + return _gmp.mpz_sizeinbase(self._mpz_p, 2) + + def size_in_bytes(self): + """Return the minimum number of bytes that can encode the number.""" + return (self.size_in_bits() - 1) // 8 + 1 + + def is_perfect_square(self): + return _gmp.mpz_perfect_square_p(self._mpz_p) != 0 + + def fail_if_divisible_by(self, small_prime): + """Raise an exception if the small prime is a divisor.""" + + if is_native_int(small_prime): + if 0 < small_prime < 65536: + if _gmp.mpz_divisible_ui_p(self._mpz_p, + c_ulong(small_prime)): + raise ValueError("The value is composite") + return + small_prime = IntegerGMP(small_prime) + if _gmp.mpz_divisible_p(self._mpz_p, + small_prime._mpz_p): + raise ValueError("The value is composite") + + def multiply_accumulate(self, a, b): + """Increment the number by the product of a and b.""" + + if not isinstance(a, IntegerGMP): + a = IntegerGMP(a) + if is_native_int(b): + if 0 < b < 65536: + _gmp.mpz_addmul_ui(self._mpz_p, + a._mpz_p, + c_ulong(b)) + return self + if -65535 < b < 0: + _gmp.mpz_submul_ui(self._mpz_p, + a._mpz_p, + c_ulong(-b)) + return self + b = IntegerGMP(b) + _gmp.mpz_addmul(self._mpz_p, + a._mpz_p, + b._mpz_p) + return self + + def set(self, source): + """Set the Integer to have the given value""" + + if not isinstance(source, IntegerGMP): + source = IntegerGMP(source) + _gmp.mpz_set(self._mpz_p, + source._mpz_p) + return self + + def inplace_inverse(self, modulus): + """Compute the inverse of this number in the ring of + modulo integers. + + Raise an exception if no inverse exists. + """ + + if not isinstance(modulus, IntegerGMP): + modulus = IntegerGMP(modulus) + + comp = _gmp.mpz_cmp(modulus._mpz_p, + self._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if comp < 0: + raise ValueError("Modulus must be positive") + + result = _gmp.mpz_invert(self._mpz_p, + self._mpz_p, + modulus._mpz_p) + if not result: + raise ValueError("No inverse value can be computed") + return self + + def inverse(self, modulus): + result = IntegerGMP(self) + result.inplace_inverse(modulus) + return result + + def gcd(self, term): + """Compute the greatest common denominator between this + number and another term.""" + + result = IntegerGMP(0) + if is_native_int(term): + if 0 < term < 65535: + _gmp.mpz_gcd_ui(result._mpz_p, + self._mpz_p, + c_ulong(term)) + return result + term = IntegerGMP(term) + _gmp.mpz_gcd(result._mpz_p, self._mpz_p, term._mpz_p) + return result + + def lcm(self, term): + """Compute the least common multiplier between this + number and another term.""" + + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_lcm(result._mpz_p, self._mpz_p, term._mpz_p) + return result + + @staticmethod + def jacobi_symbol(a, n): + """Compute the Jacobi symbol""" + + if not isinstance(a, IntegerGMP): + a = IntegerGMP(a) + if not isinstance(n, IntegerGMP): + n = IntegerGMP(n) + if n <= 0 or n.is_even(): + raise ValueError("n must be positive odd for the Jacobi symbol") + return _gmp.mpz_jacobi(a._mpz_p, n._mpz_p) + + # Clean-up + def __del__(self): + + try: + if self._mpz_p is not None: + if self._initialized: + _gmp.mpz_clear(self._mpz_p) + + self._mpz_p = None + except AttributeError: + pass diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi new file mode 100644 index 0000000..2181b47 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerGMP(IntegerBase): + pass diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py new file mode 100644 index 0000000..0cf8173 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py @@ -0,0 +1,370 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from ._IntegerBase import IntegerBase + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long, inverse, GCD + + +class IntegerNative(IntegerBase): + """A class to model a natural integer (including zero)""" + + def __init__(self, value): + if isinstance(value, float): + raise ValueError("A floating point type is not a natural number") + try: + self._value = value._value + except AttributeError: + self._value = value + + # Conversions + def __int__(self): + return self._value + + def __str__(self): + return str(int(self)) + + def __repr__(self): + return "Integer(%s)" % str(self) + + # Only Python 2.x + def __hex__(self): + return hex(self._value) + + # Only Python 3.x + def __index__(self): + return int(self._value) + + def to_bytes(self, block_size=0, byteorder='big'): + if self._value < 0: + raise ValueError("Conversion only valid for non-negative numbers") + result = long_to_bytes(self._value, block_size) + if len(result) > block_size > 0: + raise ValueError("Value too large to encode") + if byteorder == 'big': + pass + elif byteorder == 'little': + result = bytearray(result) + result.reverse() + result = bytes(result) + else: + raise ValueError("Incorrect byteorder") + return result + + @classmethod + def from_bytes(cls, byte_string, byteorder='big'): + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + return cls(bytes_to_long(byte_string)) + + # Relations + def __eq__(self, term): + if term is None: + return False + return self._value == int(term) + + def __ne__(self, term): + return not self.__eq__(term) + + def __lt__(self, term): + return self._value < int(term) + + def __le__(self, term): + return self.__lt__(term) or self.__eq__(term) + + def __gt__(self, term): + return not self.__le__(term) + + def __ge__(self, term): + return not self.__lt__(term) + + def __nonzero__(self): + return self._value != 0 + __bool__ = __nonzero__ + + def is_negative(self): + return self._value < 0 + + # Arithmetic operations + def __add__(self, term): + try: + return self.__class__(self._value + int(term)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __sub__(self, term): + try: + return self.__class__(self._value - int(term)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __mul__(self, factor): + try: + return self.__class__(self._value * int(factor)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __floordiv__(self, divisor): + return self.__class__(self._value // int(divisor)) + + def __mod__(self, divisor): + divisor_value = int(divisor) + if divisor_value < 0: + raise ValueError("Modulus must be positive") + return self.__class__(self._value % divisor_value) + + def inplace_pow(self, exponent, modulus=None): + exp_value = int(exponent) + if exp_value < 0: + raise ValueError("Exponent must not be negative") + + if modulus is not None: + mod_value = int(modulus) + if mod_value < 0: + raise ValueError("Modulus must be positive") + if mod_value == 0: + raise ZeroDivisionError("Modulus cannot be zero") + else: + mod_value = None + self._value = pow(self._value, exp_value, mod_value) + return self + + def __pow__(self, exponent, modulus=None): + result = self.__class__(self) + return result.inplace_pow(exponent, modulus) + + def __abs__(self): + return abs(self._value) + + def sqrt(self, modulus=None): + + value = self._value + if modulus is None: + if value < 0: + raise ValueError("Square root of negative value") + # http://stackoverflow.com/questions/15390807/integer-square-root-in-python + + x = value + y = (x + 1) // 2 + while y < x: + x = y + y = (x + value // x) // 2 + result = x + else: + if modulus <= 0: + raise ValueError("Modulus must be positive") + result = self._tonelli_shanks(self % modulus, modulus) + + return self.__class__(result) + + def __iadd__(self, term): + self._value += int(term) + return self + + def __isub__(self, term): + self._value -= int(term) + return self + + def __imul__(self, term): + self._value *= int(term) + return self + + def __imod__(self, term): + modulus = int(term) + if modulus == 0: + raise ZeroDivisionError("Division by zero") + if modulus < 0: + raise ValueError("Modulus must be positive") + self._value %= modulus + return self + + # Boolean/bit operations + def __and__(self, term): + return self.__class__(self._value & int(term)) + + def __or__(self, term): + return self.__class__(self._value | int(term)) + + def __rshift__(self, pos): + try: + return self.__class__(self._value >> int(pos)) + except OverflowError: + if self._value >= 0: + return 0 + else: + return -1 + + def __irshift__(self, pos): + try: + self._value >>= int(pos) + except OverflowError: + if self._value >= 0: + return 0 + else: + return -1 + return self + + def __lshift__(self, pos): + try: + return self.__class__(self._value << int(pos)) + except OverflowError: + raise ValueError("Incorrect shift count") + + def __ilshift__(self, pos): + try: + self._value <<= int(pos) + except OverflowError: + raise ValueError("Incorrect shift count") + return self + + def get_bit(self, n): + if self._value < 0: + raise ValueError("no bit representation for negative values") + try: + try: + result = (self._value >> n._value) & 1 + if n._value < 0: + raise ValueError("negative bit count") + except AttributeError: + result = (self._value >> n) & 1 + if n < 0: + raise ValueError("negative bit count") + except OverflowError: + result = 0 + return result + + # Extra + def is_odd(self): + return (self._value & 1) == 1 + + def is_even(self): + return (self._value & 1) == 0 + + def size_in_bits(self): + + if self._value < 0: + raise ValueError("Conversion only valid for non-negative numbers") + + if self._value == 0: + return 1 + + return self._value.bit_length() + + def size_in_bytes(self): + return (self.size_in_bits() - 1) // 8 + 1 + + def is_perfect_square(self): + if self._value < 0: + return False + if self._value in (0, 1): + return True + + x = self._value // 2 + square_x = x ** 2 + + while square_x > self._value: + x = (square_x + self._value) // (2 * x) + square_x = x ** 2 + + return self._value == x ** 2 + + def fail_if_divisible_by(self, small_prime): + if (self._value % int(small_prime)) == 0: + raise ValueError("Value is composite") + + def multiply_accumulate(self, a, b): + self._value += int(a) * int(b) + return self + + def set(self, source): + self._value = int(source) + + def inplace_inverse(self, modulus): + self._value = inverse(self._value, int(modulus)) + return self + + def inverse(self, modulus): + result = self.__class__(self) + result.inplace_inverse(modulus) + return result + + def gcd(self, term): + return self.__class__(GCD(abs(self._value), abs(int(term)))) + + def lcm(self, term): + term = int(term) + if self._value == 0 or term == 0: + return self.__class__(0) + return self.__class__(abs((self._value * term) // self.gcd(term)._value)) + + @staticmethod + def jacobi_symbol(a, n): + a = int(a) + n = int(n) + + if n <= 0: + raise ValueError("n must be a positive integer") + + if (n & 1) == 0: + raise ValueError("n must be odd for the Jacobi symbol") + + # Step 1 + a = a % n + # Step 2 + if a == 1 or n == 1: + return 1 + # Step 3 + if a == 0: + return 0 + # Step 4 + e = 0 + a1 = a + while (a1 & 1) == 0: + a1 >>= 1 + e += 1 + # Step 5 + if (e & 1) == 0: + s = 1 + elif n % 8 in (1, 7): + s = 1 + else: + s = -1 + # Step 6 + if n % 4 == 3 and a1 % 4 == 3: + s = -s + # Step 7 + n1 = n % a1 + # Step 8 + return s * IntegerNative.jacobi_symbol(n1, a1) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi new file mode 100644 index 0000000..3f65a39 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerNative(IntegerBase): + pass diff --git a/lib/site-packages/pip/_internal/utils/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Math/__init__.py similarity index 100% rename from lib/site-packages/pip/_internal/utils/__init__.py rename to python/lib/python3.11/site-packages/Cryptodome/Math/__init__.py diff --git a/python/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..078fa6afad904da2b71d28d4eb0c637e3fc8d025 GIT binary patch literal 207672 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py b/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py new file mode 100644 index 0000000..b6d747e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py @@ -0,0 +1,642 @@ +# coding=utf-8 +# +# KDF.py : a collection of Key Derivation Functions +# +# Part of the Python Cryptography Toolkit +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import re +import struct +from functools import reduce + +from Cryptodome.Util.py3compat import (tobytes, bord, _copy_bytes, iter_range, + tostr, bchr, bstr) + +from Cryptodome.Hash import SHA1, SHA256, HMAC, CMAC, BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.number import size as bit_size, long_to_bytes, bytes_to_long + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, c_size_t) + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._Salsa20", + """ + int Salsa20_8_core(const uint8_t *x, const uint8_t *y, + uint8_t *out); + """) + +_raw_scrypt_lib = load_pycryptodome_raw_lib("Cryptodome.Protocol._scrypt", + """ + typedef int (core_t)(const uint8_t [64], const uint8_t [64], uint8_t [64]); + int scryptROMix(const uint8_t *data_in, uint8_t *data_out, + size_t data_len, unsigned N, core_t *core); + """) + + +def PBKDF1(password, salt, dkLen, count=1000, hashAlgo=None): + """Derive one key from a password (or passphrase). + + This function performs key derivation according to an old version of + the PKCS#5 standard (v1.5) or `RFC2898 + <https://www.ietf.org/rfc/rfc2898.txt>`_. + + Args: + password (string): + The secret password to generate the key from. + salt (byte string): + An 8 byte string to use for better protection from dictionary attacks. + This value does not need to be kept secret, but it should be randomly + chosen for each derivation. + dkLen (integer): + The length of the desired key. The default is 16 bytes, suitable for + instance for :mod:`Cryptodome.Cipher.AES`. + count (integer): + The number of iterations to carry out. The recommendation is 1000 or + more. + hashAlgo (module): + The hash algorithm to use, as a module or an object from the :mod:`Cryptodome.Hash` package. + The digest length must be no shorter than ``dkLen``. + The default algorithm is :mod:`Cryptodome.Hash.SHA1`. + + Return: + A byte string of length ``dkLen`` that can be used as key. + """ + + if not hashAlgo: + hashAlgo = SHA1 + password = tobytes(password) + pHash = hashAlgo.new(password+salt) + digest = pHash.digest_size + if dkLen > digest: + raise TypeError("Selected hash algorithm has a too short digest (%d bytes)." % digest) + if len(salt) != 8: + raise ValueError("Salt is not 8 bytes long (%d bytes instead)." % len(salt)) + for i in iter_range(count-1): + pHash = pHash.new(pHash.digest()) + return pHash.digest()[:dkLen] + + +def PBKDF2(password, salt, dkLen=16, count=1000, prf=None, hmac_hash_module=None): + """Derive one or more keys from a password (or passphrase). + + This function performs key derivation according to the PKCS#5 standard (v2.0). + + Args: + password (string or byte string): + The secret password to generate the key from. + + Strings will be encoded as ISO 8859-1 (also known as Latin-1), + which does not allow any characters with codepoints > 255. + salt (string or byte string): + A (byte) string to use for better protection from dictionary attacks. + This value does not need to be kept secret, but it should be randomly + chosen for each derivation. It is recommended to use at least 16 bytes. + + Strings will be encoded as ISO 8859-1 (also known as Latin-1), + which does not allow any characters with codepoints > 255. + dkLen (integer): + The cumulative length of the keys to produce. + + Due to a flaw in the PBKDF2 design, you should not request more bytes + than the ``prf`` can output. For instance, ``dkLen`` should not exceed + 20 bytes in combination with ``HMAC-SHA1``. + count (integer): + The number of iterations to carry out. The higher the value, the slower + and the more secure the function becomes. + + You should find the maximum number of iterations that keeps the + key derivation still acceptable on the slowest hardware you must support. + + Although the default value is 1000, **it is recommended to use at least + 1000000 (1 million) iterations**. + prf (callable): + A pseudorandom function. It must be a function that returns a + pseudorandom byte string from two parameters: a secret and a salt. + The slower the algorithm, the more secure the derivation function. + If not specified, **HMAC-SHA1** is used. + hmac_hash_module (module): + A module from ``Cryptodome.Hash`` implementing a Merkle-Damgard cryptographic + hash, which PBKDF2 must use in combination with HMAC. + This parameter is mutually exclusive with ``prf``. + + Return: + A byte string of length ``dkLen`` that can be used as key material. + If you want multiple keys, just break up this string into segments of the desired length. + """ + + password = tobytes(password) + salt = tobytes(salt) + + if prf and hmac_hash_module: + raise ValueError("'prf' and 'hmac_hash_module' are mutually exlusive") + + if prf is None and hmac_hash_module is None: + hmac_hash_module = SHA1 + + if prf or not hasattr(hmac_hash_module, "_pbkdf2_hmac_assist"): + # Generic (and slow) implementation + + if prf is None: + prf = lambda p,s: HMAC.new(p, s, hmac_hash_module).digest() + + def link(s): + s[0], s[1] = s[1], prf(password, s[1]) + return s[0] + + key = b'' + i = 1 + while len(key) < dkLen: + s = [ prf(password, salt + struct.pack(">I", i)) ] * 2 + key += reduce(strxor, (link(s) for j in range(count)) ) + i += 1 + + else: + # Optimized implementation + key = b'' + i = 1 + while len(key)<dkLen: + base = HMAC.new(password, b"", hmac_hash_module) + first_digest = base.copy().update(salt + struct.pack(">I", i)).digest() + key += base._pbkdf2_hmac_assist(first_digest, count) + i += 1 + + return key[:dkLen] + + +class _S2V(object): + """String-to-vector PRF as defined in `RFC5297`_. + + This class implements a pseudorandom function family + based on CMAC that takes as input a vector of strings. + + .. _RFC5297: http://tools.ietf.org/html/rfc5297 + """ + + def __init__(self, key, ciphermod, cipher_params=None): + """Initialize the S2V PRF. + + :Parameters: + key : byte string + A secret that can be used as key for CMACs + based on ciphers from ``ciphermod``. + ciphermod : module + A block cipher module from `Cryptodome.Cipher`. + cipher_params : dictionary + A set of extra parameters to use to create a cipher instance. + """ + + self._key = _copy_bytes(None, None, key) + self._ciphermod = ciphermod + self._last_string = self._cache = b'\x00' * ciphermod.block_size + + # Max number of update() call we can process + self._n_updates = ciphermod.block_size * 8 - 1 + + if cipher_params is None: + self._cipher_params = {} + else: + self._cipher_params = dict(cipher_params) + + @staticmethod + def new(key, ciphermod): + """Create a new S2V PRF. + + :Parameters: + key : byte string + A secret that can be used as key for CMACs + based on ciphers from ``ciphermod``. + ciphermod : module + A block cipher module from `Cryptodome.Cipher`. + """ + return _S2V(key, ciphermod) + + def _double(self, bs): + doubled = bytes_to_long(bs)<<1 + if bord(bs[0]) & 0x80: + doubled ^= 0x87 + return long_to_bytes(doubled, len(bs))[-len(bs):] + + def update(self, item): + """Pass the next component of the vector. + + The maximum number of components you can pass is equal to the block + length of the cipher (in bits) minus 1. + + :Parameters: + item : byte string + The next component of the vector. + :Raise TypeError: when the limit on the number of components has been reached. + """ + + if self._n_updates == 0: + raise TypeError("Too many components passed to S2V") + self._n_updates -= 1 + + mac = CMAC.new(self._key, + msg=self._last_string, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + self._cache = strxor(self._double(self._cache), mac.digest()) + self._last_string = _copy_bytes(None, None, item) + + def derive(self): + """"Derive a secret from the vector of components. + + :Return: a byte string, as long as the block length of the cipher. + """ + + if len(self._last_string) >= 16: + # xorend + final = self._last_string[:-16] + strxor(self._last_string[-16:], self._cache) + else: + # zero-pad & xor + padded = (self._last_string + b'\x80' + b'\x00' * 15)[:16] + final = strxor(padded, self._double(self._cache)) + mac = CMAC.new(self._key, + msg=final, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + return mac.digest() + + +def HKDF(master, key_len, salt, hashmod, num_keys=1, context=None): + """Derive one or more keys from a master secret using + the HMAC-based KDF defined in RFC5869_. + + Args: + master (byte string): + The unguessable value used by the KDF to generate the other keys. + It must be a high-entropy secret, though not necessarily uniform. + It must not be a password. + key_len (integer): + The length in bytes of every derived key. + salt (byte string): + A non-secret, reusable value that strengthens the randomness + extraction step. + Ideally, it is as long as the digest size of the chosen hash. + If empty, a string of zeroes in used. + hashmod (module): + A cryptographic hash algorithm from :mod:`Cryptodome.Hash`. + :mod:`Cryptodome.Hash.SHA512` is a good choice. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + The maximum cumulative length of all keys is + 255 times the digest size. + context (byte string): + Optional identifier describing what the keys are used for. + + Return: + A byte string or a tuple of byte strings. + + .. _RFC5869: http://tools.ietf.org/html/rfc5869 + """ + + output_len = key_len * num_keys + if output_len > (255 * hashmod.digest_size): + raise ValueError("Too much secret data to derive") + if not salt: + salt = b'\x00' * hashmod.digest_size + if context is None: + context = b"" + + # Step 1: extract + hmac = HMAC.new(salt, master, digestmod=hashmod) + prk = hmac.digest() + + # Step 2: expand + t = [ b"" ] + n = 1 + tlen = 0 + while tlen < output_len: + hmac = HMAC.new(prk, t[-1] + context + struct.pack('B', n), digestmod=hashmod) + t.append(hmac.digest()) + tlen += hashmod.digest_size + n += 1 + derived_output = b"".join(t) + if num_keys == 1: + return derived_output[:key_len] + kol = [derived_output[idx:idx + key_len] + for idx in iter_range(0, output_len, key_len)] + return list(kol[:num_keys]) + + + +def scrypt(password, salt, key_len, N, r, p, num_keys=1): + """Derive one or more keys from a passphrase. + + Args: + password (string): + The secret pass phrase to generate the keys from. + salt (string): + A string to use for better protection from dictionary attacks. + This value does not need to be kept secret, + but it should be randomly chosen for each derivation. + It is recommended to be at least 16 bytes long. + key_len (integer): + The length in bytes of each derived key. + N (integer): + CPU/Memory cost parameter. It must be a power of 2 and less + than :math:`2^{32}`. + r (integer): + Block size parameter. + p (integer): + Parallelization parameter. + It must be no greater than :math:`(2^{32}-1)/(4r)`. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + By default, only 1 key is generated. + The maximum cumulative length of all keys is :math:`(2^{32}-1)*32` + (that is, 128TB). + + A good choice of parameters *(N, r , p)* was suggested + by Colin Percival in his `presentation in 2009`__: + + - *( 2¹â´, 8, 1 )* for interactive logins (≤100ms) + - *( 2²â°, 8, 1 )* for file encryption (≤5s) + + Return: + A byte string or a tuple of byte strings. + + .. __: http://www.tarsnap.com/scrypt/scrypt-slides.pdf + """ + + if 2 ** (bit_size(N) - 1) != N: + raise ValueError("N must be a power of 2") + if N >= 2 ** 32: + raise ValueError("N is too big") + if p > ((2 ** 32 - 1) * 32) // (128 * r): + raise ValueError("p or r are too big") + + prf_hmac_sha256 = lambda p, s: HMAC.new(p, s, SHA256).digest() + + stage_1 = PBKDF2(password, salt, p * 128 * r, 1, prf=prf_hmac_sha256) + + scryptROMix = _raw_scrypt_lib.scryptROMix + core = _raw_salsa20_lib.Salsa20_8_core + + # Parallelize into p flows + data_out = [] + for flow in iter_range(p): + idx = flow * 128 * r + buffer_out = create_string_buffer(128 * r) + result = scryptROMix(stage_1[idx : idx + 128 * r], + buffer_out, + c_size_t(128 * r), + N, + core) + if result: + raise ValueError("Error %X while running scrypt" % result) + data_out += [ get_raw_buffer(buffer_out) ] + + dk = PBKDF2(password, + b"".join(data_out), + key_len * num_keys, 1, + prf=prf_hmac_sha256) + + if num_keys == 1: + return dk + + kol = [dk[idx:idx + key_len] + for idx in iter_range(0, key_len * num_keys, key_len)] + return kol + + +def _bcrypt_encode(data): + s = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + bits = [] + for c in data: + bits_c = bin(bord(c))[2:].zfill(8) + bits.append(bstr(bits_c)) + bits = b"".join(bits) + + bits6 = [ bits[idx:idx+6] for idx in range(0, len(bits), 6) ] + + result = [] + for g in bits6[:-1]: + idx = int(g, 2) + result.append(s[idx]) + + g = bits6[-1] + idx = int(g, 2) << (6 - len(g)) + result.append(s[idx]) + result = "".join(result) + + return tobytes(result) + + +def _bcrypt_decode(data): + s = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + bits = [] + for c in tostr(data): + idx = s.find(c) + bits6 = bin(idx)[2:].zfill(6) + bits.append(bits6) + bits = "".join(bits) + + modulo4 = len(data) % 4 + if modulo4 == 1: + raise ValueError("Incorrect length") + elif modulo4 == 2: + bits = bits[:-4] + elif modulo4 == 3: + bits = bits[:-2] + + bits8 = [ bits[idx:idx+8] for idx in range(0, len(bits), 8) ] + + result = [] + for g in bits8: + result.append(bchr(int(g, 2))) + result = b"".join(result) + + return result + + +def _bcrypt_hash(password, cost, salt, constant, invert): + from Cryptodome.Cipher import _EKSBlowfish + + if len(password) > 72: + raise ValueError("The password is too long. It must be 72 bytes at most.") + + if not (4 <= cost <= 31): + raise ValueError("bcrypt cost factor must be in the range 4..31") + + cipher = _EKSBlowfish.new(password, _EKSBlowfish.MODE_ECB, salt, cost, invert) + ctext = constant + for _ in range(64): + ctext = cipher.encrypt(ctext) + return ctext + + +def bcrypt(password, cost, salt=None): + """Hash a password into a key, using the OpenBSD bcrypt protocol. + + Args: + password (byte string or string): + The secret password or pass phrase. + It must be at most 72 bytes long. + It must not contain the zero byte. + Unicode strings will be encoded as UTF-8. + cost (integer): + The exponential factor that makes it slower to compute the hash. + It must be in the range 4 to 31. + A value of at least 12 is recommended. + salt (byte string): + Optional. Random byte string to thwarts dictionary and rainbow table + attacks. It must be 16 bytes long. + If not passed, a random value is generated. + + Return (byte string): + The bcrypt hash + + Raises: + ValueError: if password is longer than 72 bytes or if it contains the zero byte + + """ + + password = tobytes(password, "utf-8") + + if password.find(bchr(0)[0]) != -1: + raise ValueError("The password contains the zero byte") + + if len(password) < 72: + password += b"\x00" + + if salt is None: + salt = get_random_bytes(16) + if len(salt) != 16: + raise ValueError("bcrypt salt must be 16 bytes long") + + ctext = _bcrypt_hash(password, cost, salt, b"OrpheanBeholderScryDoubt", True) + + cost_enc = b"$" + bstr(str(cost).zfill(2)) + salt_enc = b"$" + _bcrypt_encode(salt) + hash_enc = _bcrypt_encode(ctext[:-1]) # only use 23 bytes, not 24 + return b"$2a" + cost_enc + salt_enc + hash_enc + + +def bcrypt_check(password, bcrypt_hash): + """Verify if the provided password matches the given bcrypt hash. + + Args: + password (byte string or string): + The secret password or pass phrase to test. + It must be at most 72 bytes long. + It must not contain the zero byte. + Unicode strings will be encoded as UTF-8. + bcrypt_hash (byte string, bytearray): + The reference bcrypt hash the password needs to be checked against. + + Raises: + ValueError: if the password does not match + """ + + bcrypt_hash = tobytes(bcrypt_hash) + + if len(bcrypt_hash) != 60: + raise ValueError("Incorrect length of the bcrypt hash: %d bytes instead of 60" % len(bcrypt_hash)) + + if bcrypt_hash[:4] != b'$2a$': + raise ValueError("Unsupported prefix") + + p = re.compile(br'\$2a\$([0-9][0-9])\$([A-Za-z0-9./]{22,22})([A-Za-z0-9./]{31,31})') + r = p.match(bcrypt_hash) + if not r: + raise ValueError("Incorrect bcrypt hash format") + + cost = int(r.group(1)) + if not (4 <= cost <= 31): + raise ValueError("Incorrect cost") + + salt = _bcrypt_decode(r.group(2)) + + bcrypt_hash2 = bcrypt(password, cost, salt) + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=bcrypt_hash).digest() + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=bcrypt_hash2).digest() + if mac1 != mac2: + raise ValueError("Incorrect bcrypt hash") + + +def SP800_108_Counter(master, key_len, prf, num_keys=None, label=b'', context=b''): + """Derive one or more keys from a master secret using + a pseudorandom function in Counter Mode, as specified in + `NIST SP 800-108r1 <https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-108r1.pdf>`_. + + Args: + master (byte string): + The secret value used by the KDF to derive the other keys. + It must not be a password. + The length on the secret must be consistent with the input expected by + the :data:`prf` function. + key_len (integer): + The length in bytes of each derived key. + prf (function): + A pseudorandom function that takes two byte strings as parameters: + the secret and an input. It returns another byte string. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + By default, only 1 key is derived. + label (byte string): + Optional description of the purpose of the derived keys. + It must not contain zero bytes. + context (byte string): + Optional information pertaining to + the protocol that uses the keys, such as the identity of the + participants, nonces, session IDs, etc. + It must not contain zero bytes. + + Return: + - a byte string (if ``num_keys`` is not specified), or + - a tuple of byte strings (if ``num_key`` is specified). + """ + + if num_keys is None: + num_keys = 1 + + if label.find(b'\x00') != -1: + raise ValueError("Null byte found in label") + + if context.find(b'\x00') != -1: + raise ValueError("Null byte found in context") + + key_len_enc = long_to_bytes(key_len * num_keys * 8, 4) + output_len = key_len * num_keys + + i = 1 + dk = b"" + while len(dk) < output_len: + info = long_to_bytes(i, 4) + label + b'\x00' + context + key_len_enc + dk += prf(master, info) + i += 1 + if i > 0xFFFFFFFF: + raise ValueError("Overflow in SP800 108 counter") + + if num_keys == 1: + return dk[:key_len] + else: + kol = [dk[idx:idx + key_len] + for idx in iter_range(0, output_len, key_len)] + return kol diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi b/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi new file mode 100644 index 0000000..df6c287 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi @@ -0,0 +1,40 @@ +from types import ModuleType +from typing import Optional, Callable, Tuple, Union, Dict, Any, ByteString, overload +from typing_extensions import Literal + +RNG = Callable[[int], bytes] +PRF = Callable[[bytes, bytes], bytes] + +def PBKDF1(password: str, salt: bytes, dkLen: int, count: Optional[int]=1000, hashAlgo: Optional[ModuleType]=None) -> bytes: ... +def PBKDF2(password: str, salt: bytes, dkLen: Optional[int]=16, count: Optional[int]=1000, prf: Optional[RNG]=None, hmac_hash_module: Optional[ModuleType]=None) -> bytes: ... + +class _S2V(object): + def __init__(self, key: bytes, ciphermod: ModuleType, cipher_params: Optional[Dict[Any, Any]]=None) -> None: ... + + @staticmethod + def new(key: bytes, ciphermod: ModuleType) -> None: ... + def update(self, item: bytes) -> None: ... + def derive(self) -> bytes: ... + +def HKDF(master: bytes, key_len: int, salt: bytes, hashmod: ModuleType, num_keys: Optional[int]=1, context: Optional[bytes]=None) -> Union[bytes, Tuple[bytes, ...]]: ... + +def scrypt(password: str, salt: str, key_len: int, N: int, r: int, p: int, num_keys: Optional[int]=1) -> Union[bytes, Tuple[bytes, ...]]: ... + +def _bcrypt_decode(data: bytes) -> bytes: ... +def _bcrypt_hash(password:bytes , cost: int, salt: bytes, constant:bytes, invert:bool) -> bytes: ... +def bcrypt(password: Union[bytes, str], cost: int, salt: Optional[bytes]=None) -> bytes: ... +def bcrypt_check(password: Union[bytes, str], bcrypt_hash: Union[bytes, bytearray, str]) -> None: ... + +@overload +def SP800_108_Counter(master: ByteString, + key_len: int, + prf: PRF, + num_keys: Literal[None] = None, + label: ByteString = b'', context: ByteString = b'') -> bytes: ... + +@overload +def SP800_108_Counter(master: ByteString, + key_len: int, + prf: PRF, + num_keys: int, + label: ByteString = b'', context: ByteString = b'') -> Tuple[bytes]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py b/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py new file mode 100644 index 0000000..6fdc9b4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py @@ -0,0 +1,278 @@ +# +# SecretSharing.py : distribute a secret amongst a group of participants +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import is_native_int +from Cryptodome.Util import number +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Random import get_random_bytes as rng + + +def _mult_gf2(f1, f2): + """Multiply two polynomials in GF(2)""" + + # Ensure f2 is the smallest + if f2 > f1: + f1, f2 = f2, f1 + z = 0 + while f2: + if f2 & 1: + z ^= f1 + f1 <<= 1 + f2 >>= 1 + return z + + +def _div_gf2(a, b): + """ + Compute division of polynomials over GF(2). + Given a and b, it finds two polynomials q and r such that: + + a = b*q + r with deg(r)<deg(b) + """ + + if (a < b): + return 0, a + + deg = number.size + q = 0 + r = a + d = deg(b) + while deg(r) >= d: + s = 1 << (deg(r) - d) + q ^= s + r ^= _mult_gf2(b, s) + return (q, r) + + +class _Element(object): + """Element of GF(2^128) field""" + + # The irreducible polynomial defining this field is 1+x+x^2+x^7+x^128 + irr_poly = 1 + 2 + 4 + 128 + 2 ** 128 + + def __init__(self, encoded_value): + """Initialize the element to a certain value. + + The value passed as parameter is internally encoded as + a 128-bit integer, where each bit represents a polynomial + coefficient. The LSB is the constant coefficient. + """ + + if is_native_int(encoded_value): + self._value = encoded_value + elif len(encoded_value) == 16: + self._value = bytes_to_long(encoded_value) + else: + raise ValueError("The encoded value must be an integer or a 16 byte string") + + def __eq__(self, other): + return self._value == other._value + + def __int__(self): + """Return the field element, encoded as a 128-bit integer.""" + return self._value + + def encode(self): + """Return the field element, encoded as a 16 byte string.""" + return long_to_bytes(self._value, 16) + + def __mul__(self, factor): + + f1 = self._value + f2 = factor._value + + # Make sure that f2 is the smallest, to speed up the loop + if f2 > f1: + f1, f2 = f2, f1 + + if self.irr_poly in (f1, f2): + return _Element(0) + + mask1 = 2 ** 128 + v, z = f1, 0 + while f2: + # if f2 ^ 1: z ^= v + mask2 = int(bin(f2 & 1)[2:] * 128, base=2) + z = (mask2 & (z ^ v)) | ((mask1 - mask2 - 1) & z) + v <<= 1 + # if v & mask1: v ^= self.irr_poly + mask3 = int(bin((v >> 128) & 1)[2:] * 128, base=2) + v = (mask3 & (v ^ self.irr_poly)) | ((mask1 - mask3 - 1) & v) + f2 >>= 1 + return _Element(z) + + def __add__(self, term): + return _Element(self._value ^ term._value) + + def inverse(self): + """Return the inverse of this element in GF(2^128).""" + + # We use the Extended GCD algorithm + # http://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor + + if self._value == 0: + raise ValueError("Inversion of zero") + + r0, r1 = self._value, self.irr_poly + s0, s1 = 1, 0 + while r1 > 0: + q = _div_gf2(r0, r1)[0] + r0, r1 = r1, r0 ^ _mult_gf2(q, r1) + s0, s1 = s1, s0 ^ _mult_gf2(q, s1) + return _Element(s0) + + def __pow__(self, exponent): + result = _Element(self._value) + for _ in range(exponent - 1): + result = result * self + return result + + +class Shamir(object): + """Shamir's secret sharing scheme. + + A secret is split into ``n`` shares, and it is sufficient to collect + ``k`` of them to reconstruct the secret. + """ + + @staticmethod + def split(k, n, secret, ssss=False): + """Split a secret into ``n`` shares. + + The secret can be reconstructed later using just ``k`` shares + out of the original ``n``. + Each share must be kept confidential to the person it was + assigned to. + + Each share is associated to an index (starting from 1). + + Args: + k (integer): + The sufficient number of shares to reconstruct the secret (``k < n``). + n (integer): + The number of shares that this method will create. + secret (byte string): + A byte string of 16 bytes (e.g. the AES 128 key). + ssss (bool): + If ``True``, the shares can be used with the ``ssss`` utility. + Default: ``False``. + + Return (tuples): + ``n`` tuples. A tuple is meant for each participant and it contains two items: + + 1. the unique index (an integer) + 2. the share (a byte string, 16 bytes) + """ + + # + # We create a polynomial with random coefficients in GF(2^128): + # + # p(x) = \sum_{i=0}^{k-1} c_i * x^i + # + # c_0 is the encoded secret + # + + coeffs = [_Element(rng(16)) for i in range(k - 1)] + coeffs.append(_Element(secret)) + + # Each share is y_i = p(x_i) where x_i is the public index + # associated to each of the n users. + + def make_share(user, coeffs, ssss): + idx = _Element(user) + share = _Element(0) + for coeff in coeffs: + share = idx * share + coeff + if ssss: + share += _Element(user) ** len(coeffs) + return share.encode() + + return [(i, make_share(i, coeffs, ssss)) for i in range(1, n + 1)] + + @staticmethod + def combine(shares, ssss=False): + """Recombine a secret, if enough shares are presented. + + Args: + shares (tuples): + The *k* tuples, each containin the index (an integer) and + the share (a byte string, 16 bytes long) that were assigned to + a participant. + ssss (bool): + If ``True``, the shares were produced by the ``ssss`` utility. + Default: ``False``. + + Return: + The original secret, as a byte string (16 bytes long). + """ + + # + # Given k points (x,y), the interpolation polynomial of degree k-1 is: + # + # L(x) = \sum_{j=0}^{k-1} y_i * l_j(x) + # + # where: + # + # l_j(x) = \prod_{ \overset{0 \le m \le k-1}{m \ne j} } + # \frac{x - x_m}{x_j - x_m} + # + # However, in this case we are purely interested in the constant + # coefficient of L(x). + # + + k = len(shares) + + gf_shares = [] + for x in shares: + idx = _Element(x[0]) + value = _Element(x[1]) + if any(y[0] == idx for y in gf_shares): + raise ValueError("Duplicate share") + if ssss: + value += idx ** k + gf_shares.append((idx, value)) + + result = _Element(0) + for j in range(k): + x_j, y_j = gf_shares[j] + + numerator = _Element(1) + denominator = _Element(1) + + for m in range(k): + x_m = gf_shares[m][0] + if m != j: + numerator *= x_m + denominator *= x_j + x_m + result += y_j * numerator * denominator.inverse() + return result.encode() diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi b/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi new file mode 100644 index 0000000..5952c99 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi @@ -0,0 +1,22 @@ +from typing import Union, List, Tuple, Optional + +def _mult_gf2(f1: int, f2: int) -> int : ... +def _div_gf2(a: int, b: int) -> int : ... + +class _Element(object): + irr_poly: int + def __init__(self, encoded_value: Union[int, bytes]) -> None: ... + def __eq__(self, other) -> bool: ... + def __int__(self) -> int: ... + def encode(self) -> bytes: ... + def __mul__(self, factor: int) -> _Element: ... + def __add__(self, term: _Element) -> _Element: ... + def inverse(self) -> _Element: ... + def __pow__(self, exponent) -> _Element: ... + +class Shamir(object): + @staticmethod + def split(k: int, n: int, secret: bytes, ssss: Optional[bool]) -> List[Tuple[int, bytes]]: ... + @staticmethod + def combine(shares: List[Tuple[int, bytes]], ssss: Optional[bool]) -> bytes: ... + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py new file mode 100644 index 0000000..efdf034 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py @@ -0,0 +1,31 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = ['KDF', 'SecretSharing'] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi b/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi new file mode 100644 index 0000000..377ed90 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi @@ -0,0 +1 @@ +__all__ = ['KDF.pyi', 'SecretSharing.pyi'] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..baf83a8478584e1d98561442002e0c6edb23b8eb GIT binary patch literal 26176 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py new file mode 100644 index 0000000..dddd304 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py @@ -0,0 +1,682 @@ +# -*- coding: utf-8 -*- +# +# PublicKey/DSA.py : DSA signature primitive +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['generate', 'construct', 'DsaKey', 'import_key' ] + +import binascii +import struct +import itertools + +from Cryptodome.Util.py3compat import bchr, bord, tobytes, tostr, iter_range + +from Cryptodome import Random +from Cryptodome.IO import PKCS8, PEM +from Cryptodome.Hash import SHA256 +from Cryptodome.Util.asn1 import ( + DerObject, DerSequence, + DerInteger, DerObjectId, + DerBitString, + ) + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import (test_probable_prime, COMPOSITE, + PROBABLY_PRIME) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + +# ; The following ASN.1 types are relevant for DSA +# +# SubjectPublicKeyInfo ::= SEQUENCE { +# algorithm AlgorithmIdentifier, +# subjectPublicKey BIT STRING +# } +# +# id-dsa ID ::= { iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 1 } +# +# ; See RFC3279 +# Dss-Parms ::= SEQUENCE { +# p INTEGER, +# q INTEGER, +# g INTEGER +# } +# +# DSAPublicKey ::= INTEGER +# +# DSSPrivatKey_OpenSSL ::= SEQUENCE +# version INTEGER, +# p INTEGER, +# q INTEGER, +# g INTEGER, +# y INTEGER, +# x INTEGER +# } +# + +class DsaKey(object): + r"""Class defining an actual DSA key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar p: DSA modulus + :vartype p: integer + + :ivar q: Order of the subgroup + :vartype q: integer + + :ivar g: Generator + :vartype g: integer + + :ivar y: Public key + :vartype y: integer + + :ivar x: Private key + :vartype x: integer + + :undocumented: exportKey, publickey + """ + + _keydata = ['y', 'g', 'p', 'q', 'x'] + + def __init__(self, key_dict): + input_set = set(key_dict.keys()) + public_set = set(('y' , 'g', 'p', 'q')) + if not public_set.issubset(input_set): + raise ValueError("Some DSA components are missing = %s" % + str(public_set - input_set)) + extra_set = input_set - public_set + if extra_set and extra_set != set(('x',)): + raise ValueError("Unknown DSA components = %s" % + str(extra_set - set(('x',)))) + self._key = dict(key_dict) + + def _sign(self, m, k): + if not self.has_private(): + raise TypeError("DSA public key cannot be used for signing") + if not (1 < k < self.q): + raise ValueError("k is not between 2 and q-1") + + x, q, p, g = [self._key[comp] for comp in ['x', 'q', 'p', 'g']] + + blind_factor = Integer.random_range(min_inclusive=1, + max_exclusive=q) + inv_blind_k = (blind_factor * k).inverse(q) + blind_x = x * blind_factor + + r = pow(g, k, p) % q # r = (g**k mod p) mod q + s = (inv_blind_k * (blind_factor * m + blind_x * r)) % q + return map(int, (r, s)) + + def _verify(self, m, sig): + r, s = sig + y, q, p, g = [self._key[comp] for comp in ['y', 'q', 'p', 'g']] + if not (0 < r < q) or not (0 < s < q): + return False + w = Integer(s).inverse(q) + u1 = (w * m) % q + u2 = (w * r) % q + v = (pow(g, u1, p) * pow(y, u2, p) % p) % q + return v == r + + def has_private(self): + """Whether this is a DSA private key""" + + return 'x' in self._key + + def can_encrypt(self): # legacy + return False + + def can_sign(self): # legacy + return True + + def public_key(self): + """A matching DSA public key. + + Returns: + a new :class:`DsaKey` object + """ + + public_components = dict((k, self._key[k]) for k in ('y', 'g', 'p', 'q')) + return DsaKey(public_components) + + def __eq__(self, other): + if bool(self.has_private()) != bool(other.has_private()): + return False + + result = True + for comp in self._keydata: + result = result and (getattr(self._key, comp, None) == + getattr(other._key, comp, None)) + return result + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + # DSA key is not pickable + from pickle import PicklingError + raise PicklingError + + def domain(self): + """The DSA domain parameters. + + Returns + tuple : (p,q,g) + """ + + return [int(self._key[comp]) for comp in ('p', 'q', 'g')] + + def __repr__(self): + attrs = [] + for k in self._keydata: + if k == 'p': + bits = Integer(self.p).size_in_bits() + attrs.append("p(%d)" % (bits,)) + elif hasattr(self, k): + attrs.append(k) + if self.has_private(): + attrs.append("private") + # PY3K: This is meant to be text, do not change to bytes (data) + return "<%s @0x%x %s>" % (self.__class__.__name__, id(self), ",".join(attrs)) + + def __getattr__(self, item): + try: + return int(self._key[item]) + except KeyError: + raise AttributeError(item) + + def export_key(self, format='PEM', pkcs8=None, passphrase=None, + protection=None, randfunc=None): + """Export this DSA key. + + Args: + format (string): + The encoding for the output: + + - *'PEM'* (default). ASCII as per `RFC1421`_/ `RFC1423`_. + - *'DER'*. Binary ASN.1 encoding. + - *'OpenSSH'*. ASCII one-liner as per `RFC4253`_. + Only suitable for public keys, not for private keys. + + passphrase (string): + *Private keys only*. The pass phrase to protect the output. + + pkcs8 (boolean): + *Private keys only*. If ``True`` (default), the key is encoded + with `PKCS#8`_. If ``False``, it is encoded in the custom + OpenSSL/OpenSSH container. + + protection (string): + *Only in combination with a pass phrase*. + The encryption scheme to use to protect the output. + + If :data:`pkcs8` takes value ``True``, this is the PKCS#8 + algorithm to use for deriving the secret and encrypting + the private DSA key. + For a complete list of algorithms, see :mod:`Cryptodome.IO.PKCS8`. + The default is *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC*. + + If :data:`pkcs8` is ``False``, the obsolete PEM encryption scheme is + used. It is based on MD5 for key derivation, and Triple DES for + encryption. Parameter :data:`protection` is then ignored. + + The combination ``format='DER'`` and ``pkcs8=False`` is not allowed + if a passphrase is present. + + randfunc (callable): + A function that returns random bytes. + By default it is :func:`Cryptodome.Random.get_random_bytes`. + + Returns: + byte string : the encoded key + + Raises: + ValueError : when the format is unknown or when you try to encrypt a private + key with *DER* format and OpenSSL/OpenSSH. + + .. warning:: + If you don't provide a pass phrase, the private key will be + exported in the clear! + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _RFC4253: http://www.ietf.org/rfc/rfc4253.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + """ + + if passphrase is not None: + passphrase = tobytes(passphrase) + + if randfunc is None: + randfunc = Random.get_random_bytes + + if format == 'OpenSSH': + tup1 = [self._key[x].to_bytes() for x in ('p', 'q', 'g', 'y')] + + def func(x): + if (bord(x[0]) & 0x80): + return bchr(0) + x + else: + return x + + tup2 = [func(x) for x in tup1] + keyparts = [b'ssh-dss'] + tup2 + keystring = b''.join( + [struct.pack(">I", len(kp)) + kp for kp in keyparts] + ) + return b'ssh-dss ' + binascii.b2a_base64(keystring)[:-1] + + # DER format is always used, even in case of PEM, which simply + # encodes it into BASE64. + params = DerSequence([self.p, self.q, self.g]) + if self.has_private(): + if pkcs8 is None: + pkcs8 = True + if pkcs8: + if not protection: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + private_key = DerInteger(self.x).encode() + binary_key = PKCS8.wrap( + private_key, oid, passphrase, + protection, key_params=params, + randfunc=randfunc + ) + if passphrase: + key_type = 'ENCRYPTED PRIVATE' + else: + key_type = 'PRIVATE' + passphrase = None + else: + if format != 'PEM' and passphrase: + raise ValueError("DSA private key cannot be encrypted") + ints = [0, self.p, self.q, self.g, self.y, self.x] + binary_key = DerSequence(ints).encode() + key_type = "DSA PRIVATE" + else: + if pkcs8: + raise ValueError("PKCS#8 is only meaningful for private keys") + + binary_key = _create_subject_public_key_info(oid, + DerInteger(self.y), params) + key_type = "PUBLIC" + + if format == 'DER': + return binary_key + if format == 'PEM': + pem_str = PEM.encode( + binary_key, key_type + " KEY", + passphrase, randfunc + ) + return tobytes(pem_str) + raise ValueError("Unknown key format '%s'. Cannot export the DSA key." % format) + + # Backward-compatibility + exportKey = export_key + publickey = public_key + + # Methods defined in PyCryptodome that we don't support anymore + + def sign(self, M, K): + raise NotImplementedError("Use module Cryptodome.Signature.DSS instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Cryptodome.Signature.DSS instead") + + def encrypt(self, plaintext, K): + raise NotImplementedError + + def decrypt(self, ciphertext): + raise NotImplementedError + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError + + +def _generate_domain(L, randfunc): + """Generate a new set of DSA domain parameters""" + + N = { 1024:160, 2048:224, 3072:256 }.get(L) + if N is None: + raise ValueError("Invalid modulus length (%d)" % L) + + outlen = SHA256.digest_size * 8 + n = (L + outlen - 1) // outlen - 1 # ceil(L/outlen) -1 + b_ = L - 1 - (n * outlen) + + # Generate q (A.1.1.2) + q = Integer(4) + upper_bit = 1 << (N - 1) + while test_probable_prime(q, randfunc) != PROBABLY_PRIME: + seed = randfunc(64) + U = Integer.from_bytes(SHA256.new(seed).digest()) & (upper_bit - 1) + q = U | upper_bit | 1 + + assert(q.size_in_bits() == N) + + # Generate p (A.1.1.2) + offset = 1 + upper_bit = 1 << (L - 1) + while True: + V = [ SHA256.new(seed + Integer(offset + j).to_bytes()).digest() + for j in iter_range(n + 1) ] + V = [ Integer.from_bytes(v) for v in V ] + W = sum([V[i] * (1 << (i * outlen)) for i in iter_range(n)], + (V[n] & ((1 << b_) - 1)) * (1 << (n * outlen))) + + X = Integer(W + upper_bit) # 2^{L-1} < X < 2^{L} + assert(X.size_in_bits() == L) + + c = X % (q * 2) + p = X - (c - 1) # 2q divides (p-1) + if p.size_in_bits() == L and \ + test_probable_prime(p, randfunc) == PROBABLY_PRIME: + break + offset += n + 1 + + # Generate g (A.2.3, index=1) + e = (p - 1) // q + for count in itertools.count(1): + U = seed + b"ggen" + bchr(1) + Integer(count).to_bytes() + W = Integer.from_bytes(SHA256.new(U).digest()) + g = pow(W, e, p) + if g != 1: + break + + return (p, q, g, seed) + + +def generate(bits, randfunc=None, domain=None): + """Generate a new DSA key pair. + + The algorithm follows Appendix A.1/A.2 and B.1 of `FIPS 186-4`_, + respectively for domain generation and key pair generation. + + Args: + bits (integer): + Key length, or size (in bits) of the DSA modulus *p*. + It must be 1024, 2048 or 3072. + + randfunc (callable): + Random number generation function; it accepts a single integer N + and return a string of random data N bytes long. + If not specified, :func:`Cryptodome.Random.get_random_bytes` is used. + + domain (tuple): + The DSA domain parameters *p*, *q* and *g* as a list of 3 + integers. Size of *p* and *q* must comply to `FIPS 186-4`_. + If not specified, the parameters are created anew. + + Returns: + :class:`DsaKey` : a new DSA key object + + Raises: + ValueError : when **bits** is too little, too big, or not a multiple of 64. + + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + if domain: + p, q, g = map(Integer, domain) + + ## Perform consistency check on domain parameters + # P and Q must be prime + fmt_error = test_probable_prime(p) == COMPOSITE + fmt_error |= test_probable_prime(q) == COMPOSITE + # Verify Lagrange's theorem for sub-group + fmt_error |= ((p - 1) % q) != 0 + fmt_error |= g <= 1 or g >= p + fmt_error |= pow(g, q, p) != 1 + if fmt_error: + raise ValueError("Invalid DSA domain parameters") + else: + p, q, g, _ = _generate_domain(bits, randfunc) + + L = p.size_in_bits() + N = q.size_in_bits() + + if L != bits: + raise ValueError("Mismatch between size of modulus (%d)" + " and 'bits' parameter (%d)" % (L, bits)) + + if (L, N) not in [(1024, 160), (2048, 224), + (2048, 256), (3072, 256)]: + raise ValueError("Lengths of p and q (%d, %d) are not compatible" + "to FIPS 186-3" % (L, N)) + + if not 1 < g < p: + raise ValueError("Incorrent DSA generator") + + # B.1.1 + c = Integer.random(exact_bits=N + 64, randfunc=randfunc) + x = c % (q - 1) + 1 # 1 <= x <= q-1 + y = pow(g, x, p) + + key_dict = { 'y':y, 'g':g, 'p':p, 'q':q, 'x':x } + return DsaKey(key_dict) + + +def construct(tup, consistency_check=True): + """Construct a DSA key from a tuple of valid DSA components. + + Args: + tup (tuple): + A tuple of long integers, with 4 or 5 items + in the following order: + + 1. Public key (*y*). + 2. Sub-group generator (*g*). + 3. Modulus, finite field order (*p*). + 4. Sub-group order (*q*). + 5. Private key (*x*). Optional. + + consistency_check (boolean): + If ``True``, the library will verify that the provided components + fulfil the main DSA properties. + + Raises: + ValueError: when the key being imported fails the most basic DSA validity checks. + + Returns: + :class:`DsaKey` : a DSA key object + """ + + key_dict = dict(zip(('y', 'g', 'p', 'q', 'x'), map(Integer, tup))) + key = DsaKey(key_dict) + + fmt_error = False + if consistency_check: + # P and Q must be prime + fmt_error = test_probable_prime(key.p) == COMPOSITE + fmt_error |= test_probable_prime(key.q) == COMPOSITE + # Verify Lagrange's theorem for sub-group + fmt_error |= ((key.p - 1) % key.q) != 0 + fmt_error |= key.g <= 1 or key.g >= key.p + fmt_error |= pow(key.g, key.q, key.p) != 1 + # Public key + fmt_error |= key.y <= 0 or key.y >= key.p + if hasattr(key, 'x'): + fmt_error |= key.x <= 0 or key.x >= key.q + fmt_error |= pow(key.g, key.x, key.p) != key.y + + if fmt_error: + raise ValueError("Invalid DSA key components") + + return key + + +# Dss-Parms ::= SEQUENCE { +# p OCTET STRING, +# q OCTET STRING, +# g OCTET STRING +# } +# DSAPublicKey ::= INTEGER -- public key, y + +def _import_openssl_private(encoded, passphrase, params): + if params: + raise ValueError("DSA private key already comes with parameters") + der = DerSequence().decode(encoded, nr_elements=6, only_ints_expected=True) + if der[0] != 0: + raise ValueError("No version found") + tup = [der[comp] for comp in (4, 3, 1, 2, 5)] + return construct(tup) + + +def _import_subjectPublicKeyInfo(encoded, passphrase, params): + + algoid, encoded_key, emb_params = _expand_subject_public_key_info(encoded) + if algoid != oid: + raise ValueError("No DSA subjectPublicKeyInfo") + if params and emb_params: + raise ValueError("Too many DSA parameters") + + y = DerInteger().decode(encoded_key).value + p, q, g = list(DerSequence().decode(params or emb_params)) + tup = (y, g, p, q) + return construct(tup) + + +def _import_x509_cert(encoded, passphrase, params): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info, None, params) + + +def _import_pkcs8(encoded, passphrase, params): + if params: + raise ValueError("PKCS#8 already includes parameters") + k = PKCS8.unwrap(encoded, passphrase) + if k[0] != oid: + raise ValueError("No PKCS#8 encoded DSA key") + x = DerInteger().decode(k[1]).value + p, q, g = list(DerSequence().decode(k[2])) + tup = (pow(g, x, p), g, p, q, x) + return construct(tup) + + +def _import_key_der(key_data, passphrase, params): + """Import a DSA key (public or private half), encoded in DER form.""" + + decodings = (_import_openssl_private, + _import_subjectPublicKeyInfo, + _import_x509_cert, + _import_pkcs8) + + for decoding in decodings: + try: + return decoding(key_data, passphrase, params) + except ValueError: + pass + + raise ValueError("DSA key format is not supported") + + +def import_key(extern_key, passphrase=None): + """Import a DSA key. + + Args: + extern_key (string or byte string): + The DSA key to import. + + The following formats are supported for a DSA **public** key: + + - X.509 certificate (binary DER or PEM) + - X.509 ``subjectPublicKeyInfo`` (binary DER or PEM) + - OpenSSH (ASCII one-liner, see `RFC4253`_) + + The following formats are supported for a DSA **private** key: + + - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo`` + DER SEQUENCE (binary or PEM) + - OpenSSL/OpenSSH custom format (binary or PEM) + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (string): + In case of an encrypted private key, this is the pass phrase + from which the decryption key is derived. + + Encryption may be applied either at the `PKCS#8`_ or at the PEM level. + + Returns: + :class:`DsaKey` : a DSA key object + + Raises: + ValueError : when the given key cannot be parsed (possibly because + the pass phrase is wrong). + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _RFC4253: http://www.ietf.org/rfc/rfc4253.txt + .. _PKCS#8: http://www.ietf.org/rfc/rfc5208.txt + """ + + extern_key = tobytes(extern_key) + if passphrase is not None: + passphrase = tobytes(passphrase) + + if extern_key.startswith(b'-----'): + # This is probably a PEM encoded key + (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase) + if enc_flag: + passphrase = None + return _import_key_der(der, passphrase, None) + + if extern_key.startswith(b'ssh-dss '): + # This is probably a public OpenSSH key + keystring = binascii.a2b_base64(extern_key.split(b' ')[1]) + keyparts = [] + while len(keystring) > 4: + length = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + length]) + keystring = keystring[4 + length:] + if keyparts[0] == b"ssh-dss": + tup = [Integer.from_bytes(keyparts[x]) for x in (4, 3, 1, 2)] + return construct(tup) + + if len(extern_key) > 0 and bord(extern_key[0]) == 0x30: + # This is probably a DER encoded key + return _import_key_der(extern_key, passphrase, None) + + raise ValueError("DSA key format is not supported") + + +# Backward compatibility +importKey = import_key + +#: `Object ID`_ for a DSA key. +#: +#: id-dsa ID ::= { iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 1 } +#: +#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.10040.4.1.html +oid = "1.2.840.10040.4.1" diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi new file mode 100644 index 0000000..354ac1f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi @@ -0,0 +1,31 @@ +from typing import Dict, Tuple, Callable, Union, Optional + +__all__ = ['generate', 'construct', 'DsaKey', 'import_key' ] + +RNG = Callable[[int], bytes] + +class DsaKey(object): + def __init__(self, key_dict: Dict[str, int]) -> None: ... + def has_private(self) -> bool: ... + def can_encrypt(self) -> bool: ... # legacy + def can_sign(self) -> bool: ... # legacy + def public_key(self) -> DsaKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __getstate__(self) -> None: ... + def domain(self) -> Tuple[int, int, int]: ... + def __repr__(self) -> str: ... + def __getattr__(self, item: str) -> int: ... + def export_key(self, format: Optional[str]="PEM", pkcs8: Optional[bool]=None, passphrase: Optional[str]=None, + protection: Optional[str]=None, randfunc: Optional[RNG]=None) -> bytes: ... + # Backward-compatibility + exportKey = export_key + publickey = public_key + +def generate(bits: int, randfunc: Optional[RNG]=None, domain: Optional[Tuple[int, int, int]]=None) -> DsaKey: ... +def construct(tup: Union[Tuple[int, int, int, int], Tuple[int, int, int, int, int]], consistency_check: Optional[bool]=True) -> DsaKey: ... +def import_key(extern_key: Union[str, bytes], passphrase: Optional[str]=None) -> DsaKey: ... +# Backward compatibility +importKey = import_key + +oid: str diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py new file mode 100644 index 0000000..e9c57ba --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py @@ -0,0 +1,1800 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from __future__ import print_function + +import re +import struct +import binascii +from collections import namedtuple + +from Cryptodome.Util.py3compat import bord, tobytes, tostr, bchr, is_string +from Cryptodome.Util.number import bytes_to_long, long_to_bytes + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util.asn1 import (DerObjectId, DerOctetString, DerSequence, + DerBitString) + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer, c_size_t, c_uint8_ptr, + c_ulonglong, null_pointer) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + +from Cryptodome.Hash import SHA512, SHAKE256 + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Random.random import getrandbits + + +_ec_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ec_ws", """ +typedef void EcContext; +typedef void EcPoint; +int ec_ws_new_context(EcContext **pec_ctx, + const uint8_t *modulus, + const uint8_t *b, + const uint8_t *order, + size_t len, + uint64_t seed); +void ec_free_context(EcContext *ec_ctx); +int ec_ws_new_point(EcPoint **pecp, + const uint8_t *x, + const uint8_t *y, + size_t len, + const EcContext *ec_ctx); +void ec_ws_free_point(EcPoint *ecp); +int ec_ws_get_xy(uint8_t *x, + uint8_t *y, + size_t len, + const EcPoint *ecp); +int ec_ws_double(EcPoint *p); +int ec_ws_add(EcPoint *ecpa, EcPoint *ecpb); +int ec_ws_scalar(EcPoint *ecp, + const uint8_t *k, + size_t len, + uint64_t seed); +int ec_ws_clone(EcPoint **pecp2, const EcPoint *ecp); +int ec_ws_cmp(const EcPoint *ecp1, const EcPoint *ecp2); +int ec_ws_neg(EcPoint *p); +""") + +_ed25519_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ed25519", """ +typedef void Point; +int ed25519_new_point(Point **out, + const uint8_t x[32], + const uint8_t y[32], + size_t modsize, + const void *context); +int ed25519_clone(Point **P, const Point *Q); +void ed25519_free_point(Point *p); +int ed25519_cmp(const Point *p1, const Point *p2); +int ed25519_neg(Point *p); +int ed25519_get_xy(uint8_t *xb, uint8_t *yb, size_t modsize, Point *p); +int ed25519_double(Point *p); +int ed25519_add(Point *P1, const Point *P2); +int ed25519_scalar(Point *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +""") + +_ed448_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ed448", """ +typedef void EcContext; +typedef void PointEd448; +int ed448_new_context(EcContext **pec_ctx); +void ed448_context(EcContext *ec_ctx); +void ed448_free_context(EcContext *ec_ctx); +int ed448_new_point(PointEd448 **out, + const uint8_t x[56], + const uint8_t y[56], + size_t len, + const EcContext *context); +int ed448_clone(PointEd448 **P, const PointEd448 *Q); +void ed448_free_point(PointEd448 *p); +int ed448_cmp(const PointEd448 *p1, const PointEd448 *p2); +int ed448_neg(PointEd448 *p); +int ed448_get_xy(uint8_t *xb, uint8_t *yb, size_t len, const PointEd448 *p); +int ed448_double(PointEd448 *p); +int ed448_add(PointEd448 *P1, const PointEd448 *P2); +int ed448_scalar(PointEd448 *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +""") + + +def lib_func(ecc_obj, func_name): + if ecc_obj._curve.desc == "Ed25519": + result = getattr(_ed25519_lib, "ed25519_" + func_name) + elif ecc_obj._curve.desc == "Ed448": + result = getattr(_ed448_lib, "ed448_" + func_name) + else: + result = getattr(_ec_lib, "ec_ws_" + func_name) + return result + +# +# _curves is a database of curve parameters. Items are indexed by their +# human-friendly name, suchas "P-256". Each item has the following fields: +# - p: the prime number that defines the finite field for all modulo operations +# - b: the constant in the Short Weierstrass curve equation +# - order: the number of elements in the group with the generator below +# - Gx the affine coordinate X of the generator point +# - Gy the affine coordinate Y of the generator point +# - G the generator, as an EccPoint object +# - modulus_bits the minimum number of bits for encoding the modulus p +# - oid an ASCII string with the registered ASN.1 Object ID +# - context a raw pointer to memory holding a context for all curve operations (can be NULL) +# - desc an ASCII string describing the curve +# - openssh the ASCII string used in OpenSSH id files for public keys on this curve +# - name the ASCII string which is also a valid key in _curves + + +_Curve = namedtuple("_Curve", "p b order Gx Gy G modulus_bits oid context desc openssh name") +_curves = {} + + +p192_names = ["p192", "NIST P-192", "P-192", "prime192v1", "secp192r1", + "nistp192"] + + +def init_p192(): + p = 0xfffffffffffffffffffffffffffffffeffffffffffffffff + b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 + order = 0xffffffffffffffffffffffff99def836146bc9b1b4d22831 + Gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 + Gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 + + p192_modulus = long_to_bytes(p, 24) + p192_b = long_to_bytes(b, 24) + p192_order = long_to_bytes(order, 24) + + ec_p192_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p192_context.address_of(), + c_uint8_ptr(p192_modulus), + c_uint8_ptr(p192_b), + c_uint8_ptr(p192_order), + c_size_t(len(p192_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-192 context" % result) + + context = SmartPointer(ec_p192_context.get(), _ec_lib.ec_free_context) + p192 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 192, + "1.2.840.10045.3.1.1", # ANSI X9.62 / SEC2 + context, + "NIST P-192", + "ecdsa-sha2-nistp192", + "p192") + global p192_names + _curves.update(dict.fromkeys(p192_names, p192)) + + +init_p192() +del init_p192 + + +p224_names = ["p224", "NIST P-224", "P-224", "prime224v1", "secp224r1", + "nistp224"] + + +def init_p224(): + p = 0xffffffffffffffffffffffffffffffff000000000000000000000001 + b = 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4 + order = 0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + Gx = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 + Gy = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34 + + p224_modulus = long_to_bytes(p, 28) + p224_b = long_to_bytes(b, 28) + p224_order = long_to_bytes(order, 28) + + ec_p224_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p224_context.address_of(), + c_uint8_ptr(p224_modulus), + c_uint8_ptr(p224_b), + c_uint8_ptr(p224_order), + c_size_t(len(p224_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-224 context" % result) + + context = SmartPointer(ec_p224_context.get(), _ec_lib.ec_free_context) + p224 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 224, + "1.3.132.0.33", # SEC 2 + context, + "NIST P-224", + "ecdsa-sha2-nistp224", + "p224") + global p224_names + _curves.update(dict.fromkeys(p224_names, p224)) + + +init_p224() +del init_p224 + + +p256_names = ["p256", "NIST P-256", "P-256", "prime256v1", "secp256r1", + "nistp256"] + + +def init_p256(): + p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff + b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b + order = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + Gx = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 + Gy = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 + + p256_modulus = long_to_bytes(p, 32) + p256_b = long_to_bytes(b, 32) + p256_order = long_to_bytes(order, 32) + + ec_p256_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p256_context.address_of(), + c_uint8_ptr(p256_modulus), + c_uint8_ptr(p256_b), + c_uint8_ptr(p256_order), + c_size_t(len(p256_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-256 context" % result) + + context = SmartPointer(ec_p256_context.get(), _ec_lib.ec_free_context) + p256 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 256, + "1.2.840.10045.3.1.7", # ANSI X9.62 / SEC2 + context, + "NIST P-256", + "ecdsa-sha2-nistp256", + "p256") + global p256_names + _curves.update(dict.fromkeys(p256_names, p256)) + + +init_p256() +del init_p256 + + +p384_names = ["p384", "NIST P-384", "P-384", "prime384v1", "secp384r1", + "nistp384"] + + +def init_p384(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef + order = 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + Gx = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760aB7 + Gy = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5F + + p384_modulus = long_to_bytes(p, 48) + p384_b = long_to_bytes(b, 48) + p384_order = long_to_bytes(order, 48) + + ec_p384_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p384_context.address_of(), + c_uint8_ptr(p384_modulus), + c_uint8_ptr(p384_b), + c_uint8_ptr(p384_order), + c_size_t(len(p384_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-384 context" % result) + + context = SmartPointer(ec_p384_context.get(), _ec_lib.ec_free_context) + p384 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 384, + "1.3.132.0.34", # SEC 2 + context, + "NIST P-384", + "ecdsa-sha2-nistp384", + "p384") + global p384_names + _curves.update(dict.fromkeys(p384_names, p384)) + + +init_p384() +del init_p384 + + +p521_names = ["p521", "NIST P-521", "P-521", "prime521v1", "secp521r1", + "nistp521"] + + +def init_p521(): + p = 0x000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + b = 0x00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00 + order = 0x000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + Gx = 0x000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 + Gy = 0x0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650 + + p521_modulus = long_to_bytes(p, 66) + p521_b = long_to_bytes(b, 66) + p521_order = long_to_bytes(order, 66) + + ec_p521_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p521_context.address_of(), + c_uint8_ptr(p521_modulus), + c_uint8_ptr(p521_b), + c_uint8_ptr(p521_order), + c_size_t(len(p521_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-521 context" % result) + + context = SmartPointer(ec_p521_context.get(), _ec_lib.ec_free_context) + p521 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 521, + "1.3.132.0.35", # SEC 2 + context, + "NIST P-521", + "ecdsa-sha2-nistp521", + "p521") + global p521_names + _curves.update(dict.fromkeys(p521_names, p521)) + + +init_p521() +del init_p521 + + +ed25519_names = ["ed25519", "Ed25519"] + + +def init_ed25519(): + p = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed # 2**255 - 19 + order = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + Gx = 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a + Gy = 0x6666666666666666666666666666666666666666666666666666666666666658 + + ed25519 = _Curve(Integer(p), + None, + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 255, + "1.3.101.112", # RFC8410 + None, + "Ed25519", # Used throughout; do not change + "ssh-ed25519", + "ed25519") + global ed25519_names + _curves.update(dict.fromkeys(ed25519_names, ed25519)) + + +init_ed25519() +del init_ed25519 + + +ed448_names = ["ed448", "Ed448"] + + +def init_ed448(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff # 2**448 - 2**224 - 1 + order = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3 + Gx = 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e + Gy = 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14 + + ed448_context = VoidPointer() + result = _ed448_lib.ed448_new_context(ed448_context.address_of()) + if result: + raise ImportError("Error %d initializing Ed448 context" % result) + + context = SmartPointer(ed448_context.get(), _ed448_lib.ed448_free_context) + + ed448 = _Curve(Integer(p), + None, + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 448, + "1.3.101.113", # RFC8410 + context, + "Ed448", # Used throughout; do not change + None, + "ed448") + global ed448_names + _curves.update(dict.fromkeys(ed448_names, ed448)) + + +init_ed448() +del init_ed448 + + +class UnsupportedEccFeature(ValueError): + pass + + +class EccPoint(object): + """A class to model a point on an Elliptic Curve. + + The class supports operators for: + + * Adding two points: ``R = S + T`` + * In-place addition: ``S += T`` + * Negating a point: ``R = -T`` + * Comparing two points: ``if S == T: ...`` or ``if S != T: ...`` + * Multiplying a point by a scalar: ``R = S*k`` + * In-place multiplication by a scalar: ``T *= k`` + + :ivar x: The affine X-coordinate of the ECC point + :vartype x: integer + + :ivar y: The affine Y-coordinate of the ECC point + :vartype y: integer + + :ivar xy: The tuple with affine X- and Y- coordinates + """ + + def __init__(self, x, y, curve="p256"): + + try: + self._curve = _curves[curve] + except KeyError: + raise ValueError("Unknown curve name %s" % str(curve)) + self._curve_name = curve + + modulus_bytes = self.size_in_bytes() + + xb = long_to_bytes(x, modulus_bytes) + yb = long_to_bytes(y, modulus_bytes) + if len(xb) != modulus_bytes or len(yb) != modulus_bytes: + raise ValueError("Incorrect coordinate length") + + new_point = lib_func(self, "new_point") + free_func = lib_func(self, "free_point") + + self._point = VoidPointer() + try: + context = self._curve.context.get() + except AttributeError: + context = null_pointer + result = new_point(self._point.address_of(), + c_uint8_ptr(xb), + c_uint8_ptr(yb), + c_size_t(modulus_bytes), + context) + + if result: + if result == 15: + raise ValueError("The EC point does not belong to the curve") + raise ValueError("Error %d while instantiating an EC point" % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the EC point + self._point = SmartPointer(self._point.get(), free_func) + + def set(self, point): + clone = lib_func(self, "clone") + free_func = lib_func(self, "free_point") + + self._point = VoidPointer() + result = clone(self._point.address_of(), + point._point.get()) + + if result: + raise ValueError("Error %d while cloning an EC point" % result) + + self._point = SmartPointer(self._point.get(), free_func) + return self + + def __eq__(self, point): + if not isinstance(point, EccPoint): + return False + + cmp_func = lib_func(self, "cmp") + return 0 == cmp_func(self._point.get(), point._point.get()) + + # Only needed for Python 2 + def __ne__(self, point): + return not self == point + + def __neg__(self): + neg_func = lib_func(self, "neg") + np = self.copy() + result = neg_func(np._point.get()) + if result: + raise ValueError("Error %d while inverting an EC point" % result) + return np + + def copy(self): + """Return a copy of this point.""" + x, y = self.xy + np = EccPoint(x, y, self._curve_name) + return np + + def _is_eddsa(self): + return self._curve.name in ("ed25519", "ed448") + + def is_point_at_infinity(self): + """``True`` if this is the *point-at-infinity*.""" + + if self._is_eddsa(): + return self.x == 0 + else: + return self.xy == (0, 0) + + def point_at_infinity(self): + """Return the *point-at-infinity* for the curve.""" + + if self._is_eddsa(): + return EccPoint(0, 1, self._curve_name) + else: + return EccPoint(0, 0, self._curve_name) + + @property + def x(self): + return self.xy[0] + + @property + def y(self): + return self.xy[1] + + @property + def xy(self): + modulus_bytes = self.size_in_bytes() + xb = bytearray(modulus_bytes) + yb = bytearray(modulus_bytes) + get_xy = lib_func(self, "get_xy") + result = get_xy(c_uint8_ptr(xb), + c_uint8_ptr(yb), + c_size_t(modulus_bytes), + self._point.get()) + if result: + raise ValueError("Error %d while encoding an EC point" % result) + + return (Integer(bytes_to_long(xb)), Integer(bytes_to_long(yb))) + + def size_in_bytes(self): + """Size of each coordinate, in bytes.""" + return (self.size_in_bits() + 7) // 8 + + def size_in_bits(self): + """Size of each coordinate, in bits.""" + return self._curve.modulus_bits + + def double(self): + """Double this point (in-place operation). + + Returns: + This same object (to enable chaining). + """ + + double_func = lib_func(self, "double") + result = double_func(self._point.get()) + if result: + raise ValueError("Error %d while doubling an EC point" % result) + return self + + def __iadd__(self, point): + """Add a second point to this one""" + + add_func = lib_func(self, "add") + result = add_func(self._point.get(), point._point.get()) + if result: + if result == 16: + raise ValueError("EC points are not on the same curve") + raise ValueError("Error %d while adding two EC points" % result) + return self + + def __add__(self, point): + """Return a new point, the addition of this one and another""" + + np = self.copy() + np += point + return np + + def __imul__(self, scalar): + """Multiply this point by a scalar""" + + scalar_func = lib_func(self, "scalar") + if scalar < 0: + raise ValueError("Scalar multiplication is only defined for non-negative integers") + sb = long_to_bytes(scalar) + result = scalar_func(self._point.get(), + c_uint8_ptr(sb), + c_size_t(len(sb)), + c_ulonglong(getrandbits(64))) + if result: + raise ValueError("Error %d during scalar multiplication" % result) + return self + + def __mul__(self, scalar): + """Return a new point, the scalar product of this one""" + + np = self.copy() + np *= scalar + return np + + def __rmul__(self, left_hand): + return self.__mul__(left_hand) + + +# Last piece of initialization +p192_G = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, "p192") +p192 = _curves['p192']._replace(G=p192_G) +_curves.update(dict.fromkeys(p192_names, p192)) +del p192_G, p192, p192_names + +p224_G = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, "p224") +p224 = _curves['p224']._replace(G=p224_G) +_curves.update(dict.fromkeys(p224_names, p224)) +del p224_G, p224, p224_names + +p256_G = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy, "p256") +p256 = _curves['p256']._replace(G=p256_G) +_curves.update(dict.fromkeys(p256_names, p256)) +del p256_G, p256, p256_names + +p384_G = EccPoint(_curves['p384'].Gx, _curves['p384'].Gy, "p384") +p384 = _curves['p384']._replace(G=p384_G) +_curves.update(dict.fromkeys(p384_names, p384)) +del p384_G, p384, p384_names + +p521_G = EccPoint(_curves['p521'].Gx, _curves['p521'].Gy, "p521") +p521 = _curves['p521']._replace(G=p521_G) +_curves.update(dict.fromkeys(p521_names, p521)) +del p521_G, p521, p521_names + +ed25519_G = EccPoint(_curves['Ed25519'].Gx, _curves['Ed25519'].Gy, "Ed25519") +ed25519 = _curves['Ed25519']._replace(G=ed25519_G) +_curves.update(dict.fromkeys(ed25519_names, ed25519)) +del ed25519_G, ed25519, ed25519_names + +ed448_G = EccPoint(_curves['Ed448'].Gx, _curves['Ed448'].Gy, "Ed448") +ed448 = _curves['Ed448']._replace(G=ed448_G) +_curves.update(dict.fromkeys(ed448_names, ed448)) +del ed448_G, ed448, ed448_names + + +class EccKey(object): + r"""Class defining an ECC key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar curve: The name of the curve as defined in the `ECC table`_. + :vartype curve: string + + :ivar pointQ: an ECC point representating the public component. + :vartype pointQ: :class:`EccPoint` + + :ivar d: A scalar that represents the private component + in NIST P curves. It is smaller than the + order of the generator point. + :vartype d: integer + + :ivar seed: A seed that representats the private component + in EdDSA curves + (Ed25519, 32 bytes; Ed448, 57 bytes). + :vartype seed: bytes + """ + + def __init__(self, **kwargs): + """Create a new ECC key + + Keywords: + curve : string + The name of the curve. + d : integer + Mandatory for a private key one NIST P curves. + It must be in the range ``[1..order-1]``. + seed : bytes + Mandatory for a private key on the Ed25519 (32 bytes) + or Ed448 (57 bytes) curve. + point : EccPoint + Mandatory for a public key. If provided for a private key, + the implementation will NOT check whether it matches ``d``. + + Only one parameter among ``d``, ``seed`` or ``point`` may be used. + """ + + kwargs_ = dict(kwargs) + curve_name = kwargs_.pop("curve", None) + self._d = kwargs_.pop("d", None) + self._seed = kwargs_.pop("seed", None) + self._point = kwargs_.pop("point", None) + if curve_name is None and self._point: + curve_name = self._point._curve_name + if kwargs_: + raise TypeError("Unknown parameters: " + str(kwargs_)) + + if curve_name not in _curves: + raise ValueError("Unsupported curve (%s)" % curve_name) + self._curve = _curves[curve_name] + self.curve = self._curve.desc + + count = int(self._d is not None) + int(self._seed is not None) + + if count == 0: + if self._point is None: + raise ValueError("At lest one between parameters 'point', 'd' or 'seed' must be specified") + return + + if count == 2: + raise ValueError("Parameters d and seed are mutually exclusive") + + # NIST P curves work with d, EdDSA works with seed + + if not self._is_eddsa(): + if self._seed is not None: + raise ValueError("Parameter 'seed' can only be used with Ed25519 or Ed448") + self._d = Integer(self._d) + if not 1 <= self._d < self._curve.order: + raise ValueError("Parameter d must be an integer smaller than the curve order") + else: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + # RFC 8032, 5.1.5 + if self._curve.name == "ed25519": + if len(self._seed) != 32: + raise ValueError("Parameter seed must be 32 bytes long for Ed25519") + seed_hash = SHA512.new(self._seed).digest() # h + self._prefix = seed_hash[32:] + tmp = bytearray(seed_hash[:32]) + tmp[0] &= 0xF8 + tmp[31] = (tmp[31] & 0x7F) | 0x40 + # RFC 8032, 5.2.5 + elif self._curve.name == "ed448": + if len(self._seed) != 57: + raise ValueError("Parameter seed must be 57 bytes long for Ed448") + seed_hash = SHAKE256.new(self._seed).read(114) # h + self._prefix = seed_hash[57:] + tmp = bytearray(seed_hash[:57]) + tmp[0] &= 0xFC + tmp[55] |= 0x80 + tmp[56] = 0 + self._d = Integer.from_bytes(tmp, byteorder='little') + + def _is_eddsa(self): + return self._curve.desc in ("Ed25519", "Ed448") + + def __eq__(self, other): + if not isinstance(other, EccKey): + return False + + if other.has_private() != self.has_private(): + return False + + return other.pointQ == self.pointQ + + def __repr__(self): + if self.has_private(): + if self._is_eddsa(): + extra = ", seed=%s" % tostr(binascii.hexlify(self._seed)) + else: + extra = ", d=%d" % int(self._d) + else: + extra = "" + x, y = self.pointQ.xy + return "EccKey(curve='%s', point_x=%d, point_y=%d%s)" % (self._curve.desc, x, y, extra) + + def has_private(self): + """``True`` if this key can be used for making signatures or decrypting data.""" + + return self._d is not None + + # ECDSA + def _sign(self, z, k): + assert 0 < k < self._curve.order + + order = self._curve.order + blind = Integer.random_range(min_inclusive=1, + max_exclusive=order) + + blind_d = self._d * blind + inv_blind_k = (blind * k).inverse(order) + + r = (self._curve.G * k).x % order + s = inv_blind_k * (blind * z + blind_d * r) % order + return (r, s) + + # ECDSA + def _verify(self, z, rs): + order = self._curve.order + sinv = rs[1].inverse(order) + point1 = self._curve.G * ((sinv * z) % order) + point2 = self.pointQ * ((sinv * rs[0]) % order) + return (point1 + point2).x == rs[0] + + @property + def d(self): + if not self.has_private(): + raise ValueError("This is not a private ECC key") + return self._d + + @property + def seed(self): + if not self.has_private(): + raise ValueError("This is not a private ECC key") + return self._seed + + @property + def pointQ(self): + if self._point is None: + self._point = self._curve.G * self._d + return self._point + + def public_key(self): + """A matching ECC public key. + + Returns: + a new :class:`EccKey` object + """ + + return EccKey(curve=self._curve.desc, point=self.pointQ) + + def _export_SEC1(self, compress): + if self._is_eddsa(): + raise ValueError("SEC1 format is unsupported for EdDSA curves") + + # See 2.2 in RFC5480 and 2.3.3 in SEC1 + # + # The first byte is: + # - 0x02: compressed, only X-coordinate, Y-coordinate is even + # - 0x03: compressed, only X-coordinate, Y-coordinate is odd + # - 0x04: uncompressed, X-coordinate is followed by Y-coordinate + # + # PAI is in theory encoded as 0x00. + + modulus_bytes = self.pointQ.size_in_bytes() + + if compress: + if self.pointQ.y.is_odd(): + first_byte = b'\x03' + else: + first_byte = b'\x02' + public_key = (first_byte + + self.pointQ.x.to_bytes(modulus_bytes)) + else: + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + return public_key + + def _export_eddsa(self): + x, y = self.pointQ.xy + if self._curve.name == "ed25519": + result = bytearray(y.to_bytes(32, byteorder='little')) + result[31] = ((x & 1) << 7) | result[31] + elif self._curve.name == "ed448": + result = bytearray(y.to_bytes(57, byteorder='little')) + result[56] = (x & 1) << 7 + else: + raise ValueError("Not an EdDSA key to export") + return bytes(result) + + def _export_subjectPublicKeyInfo(self, compress): + if self._is_eddsa(): + oid = self._curve.oid + public_key = self._export_eddsa() + params = None + else: + oid = "1.2.840.10045.2.1" # unrestricted + public_key = self._export_SEC1(compress) + params = DerObjectId(self._curve.oid) + + return _create_subject_public_key_info(oid, + public_key, + params) + + def _export_rfc5915_private_der(self, include_ec_params=True): + + assert self.has_private() + + # ECPrivateKey ::= SEQUENCE { + # version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + # privateKey OCTET STRING, + # parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + # publicKey [1] BIT STRING OPTIONAL + # } + + # Public key - uncompressed form + modulus_bytes = self.pointQ.size_in_bytes() + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + + seq = [1, + DerOctetString(self.d.to_bytes(modulus_bytes)), + DerObjectId(self._curve.oid, explicit=0), + DerBitString(public_key, explicit=1)] + + if not include_ec_params: + del seq[2] + + return DerSequence(seq).encode() + + def _export_pkcs8(self, **kwargs): + from Cryptodome.IO import PKCS8 + + if kwargs.get('passphrase', None) is not None and 'protection' not in kwargs: + raise ValueError("At least the 'protection' parameter should be present") + + if self._is_eddsa(): + oid = self._curve.oid + private_key = DerOctetString(self._seed).encode() + params = None + else: + oid = "1.2.840.10045.2.1" # unrestricted + private_key = self._export_rfc5915_private_der(include_ec_params=False) + params = DerObjectId(self._curve.oid) + + result = PKCS8.wrap(private_key, + oid, + key_params=params, + **kwargs) + return result + + def _export_public_pem(self, compress): + from Cryptodome.IO import PEM + + encoded_der = self._export_subjectPublicKeyInfo(compress) + return PEM.encode(encoded_der, "PUBLIC KEY") + + def _export_private_pem(self, passphrase, **kwargs): + from Cryptodome.IO import PEM + + encoded_der = self._export_rfc5915_private_der() + return PEM.encode(encoded_der, "EC PRIVATE KEY", passphrase, **kwargs) + + def _export_private_clear_pkcs8_in_clear_pem(self): + from Cryptodome.IO import PEM + + encoded_der = self._export_pkcs8() + return PEM.encode(encoded_der, "PRIVATE KEY") + + def _export_private_encrypted_pkcs8_in_clear_pem(self, passphrase, **kwargs): + from Cryptodome.IO import PEM + + assert passphrase + if 'protection' not in kwargs: + raise ValueError("At least the 'protection' parameter should be present") + encoded_der = self._export_pkcs8(passphrase=passphrase, **kwargs) + return PEM.encode(encoded_der, "ENCRYPTED PRIVATE KEY") + + def _export_openssh(self, compress): + if self.has_private(): + raise ValueError("Cannot export OpenSSH private keys") + + desc = self._curve.openssh + + if desc is None: + raise ValueError("Cannot export %s keys as OpenSSH" % self._curve.name) + elif desc == "ssh-ed25519": + public_key = self._export_eddsa() + comps = (tobytes(desc), tobytes(public_key)) + else: + modulus_bytes = self.pointQ.size_in_bytes() + + if compress: + first_byte = 2 + self.pointQ.y.is_odd() + public_key = (bchr(first_byte) + + self.pointQ.x.to_bytes(modulus_bytes)) + else: + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + + middle = desc.split("-")[2] + comps = (tobytes(desc), tobytes(middle), public_key) + + blob = b"".join([struct.pack(">I", len(x)) + x for x in comps]) + return desc + " " + tostr(binascii.b2a_base64(blob)) + + def export_key(self, **kwargs): + """Export this ECC key. + + Args: + format (string): + The format to use for encoding the key: + + - ``'DER'``. The key will be encoded in ASN.1 DER format (binary). + For a public key, the ASN.1 ``subjectPublicKeyInfo`` structure + defined in `RFC5480`_ will be used. + For a private key, the ASN.1 ``ECPrivateKey`` structure defined + in `RFC5915`_ is used instead (possibly within a PKCS#8 envelope, + see the ``use_pkcs8`` flag below). + - ``'PEM'``. The key will be encoded in a PEM_ envelope (ASCII). + - ``'OpenSSH'``. The key will be encoded in the OpenSSH_ format + (ASCII, public keys only). + - ``'SEC1'``. The public key (i.e., the EC point) will be encoded + into ``bytes`` according to Section 2.3.3 of `SEC1`_ + (which is a subset of the older X9.62 ITU standard). + Only for NIST P-curves. + - ``'raw'``. The public key will be encoded as ``bytes``, + without any metadata. + + * For NIST P-curves: equivalent to ``'SEC1'``. + * For EdDSA curves: ``bytes`` in the format defined in `RFC8032`_. + + passphrase (byte string or string): + The passphrase to use for protecting the private key. + + use_pkcs8 (boolean): + Only relevant for private keys. + + If ``True`` (default and recommended), the `PKCS#8`_ representation + will be used. It must be ``True`` for EdDSA curves. + + protection (string): + When a private key is exported with password-protection + and PKCS#8 (both ``DER`` and ``PEM`` formats), this parameter MUST be + present and be a valid algorithm supported by :mod:`Cryptodome.IO.PKCS8`. + It is recommended to use ``PBKDF2WithHMAC-SHA1AndAES128-CBC``. + + compress (boolean): + If ``True``, the method returns a more compact representation + of the public key, with the X-coordinate only. + + If ``False`` (default), the method returns the full public key. + + This parameter is ignored for EdDSA curves, as compression is + mandatory. + + .. warning:: + If you don't provide a passphrase, the private key will be + exported in the clear! + + .. note:: + When exporting a private key with password-protection and `PKCS#8`_ + (both ``DER`` and ``PEM`` formats), any extra parameters + to ``export_key()`` will be passed to :mod:`Cryptodome.IO.PKCS8`. + + .. _PEM: http://www.ietf.org/rfc/rfc1421.txt + .. _`PEM encryption`: http://www.ietf.org/rfc/rfc1423.txt + .. _OpenSSH: http://www.openssh.com/txt/rfc5656.txt + .. _RFC5480: https://tools.ietf.org/html/rfc5480 + .. _SEC1: https://www.secg.org/sec1-v2.pdf + + Returns: + A multi-line string (for ``'PEM'`` and ``'OpenSSH'``) or + ``bytes`` (for ``'DER'``, ``'SEC1'``, and ``'raw'``) with the encoded key. + """ + + args = kwargs.copy() + ext_format = args.pop("format") + if ext_format not in ("PEM", "DER", "OpenSSH", "SEC1", "raw"): + raise ValueError("Unknown format '%s'" % ext_format) + + compress = args.pop("compress", False) + + if self.has_private(): + passphrase = args.pop("passphrase", None) + if is_string(passphrase): + passphrase = tobytes(passphrase) + if not passphrase: + raise ValueError("Empty passphrase") + use_pkcs8 = args.pop("use_pkcs8", True) + + if not use_pkcs8 and self._is_eddsa(): + raise ValueError("'pkcs8' must be True for EdDSA curves") + + if ext_format == "PEM": + if use_pkcs8: + if passphrase: + return self._export_private_encrypted_pkcs8_in_clear_pem(passphrase, **args) + else: + return self._export_private_clear_pkcs8_in_clear_pem() + else: + return self._export_private_pem(passphrase, **args) + elif ext_format == "DER": + # DER + if passphrase and not use_pkcs8: + raise ValueError("Private keys can only be encrpyted with DER using PKCS#8") + if use_pkcs8: + return self._export_pkcs8(passphrase=passphrase, **args) + else: + return self._export_rfc5915_private_der() + else: + raise ValueError("Private keys cannot be exported " + "in the '%s' format" % ext_format) + else: # Public key + if args: + raise ValueError("Unexpected parameters: '%s'" % args) + if ext_format == "PEM": + return self._export_public_pem(compress) + elif ext_format == "DER": + return self._export_subjectPublicKeyInfo(compress) + elif ext_format == "SEC1": + return self._export_SEC1(compress) + elif ext_format == "raw": + if self._curve.name in ('ed25519', 'ed448'): + return self._export_eddsa() + else: + return self._export_SEC1(compress) + else: + return self._export_openssh(compress) + + +def generate(**kwargs): + """Generate a new private key on the given curve. + + Args: + + curve (string): + Mandatory. It must be a curve name defined in the `ECC table`_. + + randfunc (callable): + Optional. The RNG to read randomness from. + If ``None``, :func:`Cryptodome.Random.get_random_bytes` is used. + """ + + curve_name = kwargs.pop("curve") + curve = _curves[curve_name] + randfunc = kwargs.pop("randfunc", get_random_bytes) + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + if _curves[curve_name].name == "ed25519": + seed = randfunc(32) + new_key = EccKey(curve=curve_name, seed=seed) + elif _curves[curve_name].name == "ed448": + seed = randfunc(57) + new_key = EccKey(curve=curve_name, seed=seed) + else: + d = Integer.random_range(min_inclusive=1, + max_exclusive=curve.order, + randfunc=randfunc) + new_key = EccKey(curve=curve_name, d=d) + + return new_key + + +def construct(**kwargs): + """Build a new ECC key (private or public) starting + from some base components. + + In most cases, you will already have an existing key + which you can read in with :func:`import_key` instead + of this function. + + Args: + curve (string): + Mandatory. The name of the elliptic curve, as defined in the `ECC table`_. + + d (integer): + Mandatory for a private key and a NIST P-curve (e.g., P-256): + the integer in the range ``[1..order-1]`` that represents the key. + + seed (bytes): + Mandatory for a private key and an EdDSA curve. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + point_x (integer): + Mandatory for a public key: the X coordinate (affine) of the ECC point. + + point_y (integer): + Mandatory for a public key: the Y coordinate (affine) of the ECC point. + + Returns: + :class:`EccKey` : a new ECC key object + """ + + curve_name = kwargs["curve"] + curve = _curves[curve_name] + point_x = kwargs.pop("point_x", None) + point_y = kwargs.pop("point_y", None) + + if "point" in kwargs: + raise TypeError("Unknown keyword: point") + + if None not in (point_x, point_y): + # ValueError is raised if the point is not on the curve + kwargs["point"] = EccPoint(point_x, point_y, curve_name) + + new_key = EccKey(**kwargs) + + # Validate that the private key matches the public one + # because EccKey will not do that automatically + if new_key.has_private() and 'point' in kwargs: + pub_key = curve.G * new_key.d + if pub_key.xy != (point_x, point_y): + raise ValueError("Private and public ECC keys do not match") + + return new_key + + +def _import_public_der(ec_point, curve_oid=None, curve_name=None): + """Convert an encoded EC point into an EccKey object + + ec_point: byte string with the EC point (SEC1-encoded) + curve_oid: string with the name the curve + curve_name: string with the OID of the curve + + Either curve_id or curve_name must be specified + + """ + + for _curve_name, curve in _curves.items(): + if curve_oid and curve.oid == curve_oid: + break + if curve_name == _curve_name: + break + else: + if curve_oid: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + else: + raise UnsupportedEccFeature("Unsupported ECC curve (%s)" % curve_name) + + # See 2.2 in RFC5480 and 2.3.3 in SEC1 + # The first byte is: + # - 0x02: compressed, only X-coordinate, Y-coordinate is even + # - 0x03: compressed, only X-coordinate, Y-coordinate is odd + # - 0x04: uncompressed, X-coordinate is followed by Y-coordinate + # + # PAI is in theory encoded as 0x00. + + modulus_bytes = curve.p.size_in_bytes() + point_type = bord(ec_point[0]) + + # Uncompressed point + if point_type == 0x04: + if len(ec_point) != (1 + 2 * modulus_bytes): + raise ValueError("Incorrect EC point length") + x = Integer.from_bytes(ec_point[1:modulus_bytes+1]) + y = Integer.from_bytes(ec_point[modulus_bytes+1:]) + # Compressed point + elif point_type in (0x02, 0x03): + if len(ec_point) != (1 + modulus_bytes): + raise ValueError("Incorrect EC point length") + x = Integer.from_bytes(ec_point[1:]) + # Right now, we only support Short Weierstrass curves + y = (x**3 - x*3 + curve.b).sqrt(curve.p) + if point_type == 0x02 and y.is_odd(): + y = curve.p - y + if point_type == 0x03 and y.is_even(): + y = curve.p - y + else: + raise ValueError("Incorrect EC point encoding") + + return construct(curve=_curve_name, point_x=x, point_y=y) + + +def _import_subjectPublicKeyInfo(encoded, *kwargs): + """Convert a subjectPublicKeyInfo into an EccKey object""" + + # See RFC5480 + + # Parse the generic subjectPublicKeyInfo structure + oid, ec_point, params = _expand_subject_public_key_info(encoded) + + nist_p_oids = ( + "1.2.840.10045.2.1", # id-ecPublicKey (unrestricted) + "1.3.132.1.12", # id-ecDH + "1.3.132.1.13" # id-ecMQV + ) + eddsa_oids = { + "1.3.101.112": ("Ed25519", _import_ed25519_public_key), # id-Ed25519 + "1.3.101.113": ("Ed448", _import_ed448_public_key) # id-Ed448 + } + + if oid in nist_p_oids: + # See RFC5480 + + # Parameters are mandatory and encoded as ECParameters + # ECParameters ::= CHOICE { + # namedCurve OBJECT IDENTIFIER + # -- implicitCurve NULL + # -- specifiedCurve SpecifiedECDomain + # } + # implicitCurve and specifiedCurve are not supported (as per RFC) + if not params: + raise ValueError("Missing ECC parameters for ECC OID %s" % oid) + try: + curve_oid = DerObjectId().decode(params).value + except ValueError: + raise ValueError("Error decoding namedCurve") + + # ECPoint ::= OCTET STRING + return _import_public_der(ec_point, curve_oid=curve_oid) + + elif oid in eddsa_oids: + # See RFC8410 + curve_name, import_eddsa_public_key = eddsa_oids[oid] + + # Parameters must be absent + if params: + raise ValueError("Unexpected ECC parameters for ECC OID %s" % oid) + + x, y = import_eddsa_public_key(ec_point) + return construct(point_x=x, point_y=y, curve=curve_name) + else: + raise UnsupportedEccFeature("Unsupported ECC OID: %s" % oid) + + +def _import_rfc5915_der(encoded, passphrase, curve_oid=None): + + # See RFC5915 https://tools.ietf.org/html/rfc5915 + # + # ECPrivateKey ::= SEQUENCE { + # version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + # privateKey OCTET STRING, + # parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + # publicKey [1] BIT STRING OPTIONAL + # } + + private_key = DerSequence().decode(encoded, nr_elements=(3, 4)) + if private_key[0] != 1: + raise ValueError("Incorrect ECC private key version") + + try: + parameters = DerObjectId(explicit=0).decode(private_key[2]).value + if curve_oid is not None and parameters != curve_oid: + raise ValueError("Curve mismatch") + curve_oid = parameters + except ValueError: + pass + + if curve_oid is None: + raise ValueError("No curve found") + + for curve_name, curve in _curves.items(): + if curve.oid == curve_oid: + break + else: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + + scalar_bytes = DerOctetString().decode(private_key[1]).payload + modulus_bytes = curve.p.size_in_bytes() + if len(scalar_bytes) != modulus_bytes: + raise ValueError("Private key is too small") + d = Integer.from_bytes(scalar_bytes) + + # Decode public key (if any) + if len(private_key) > 2: + public_key_enc = DerBitString(explicit=1).decode(private_key[-1]).value + public_key = _import_public_der(public_key_enc, curve_oid=curve_oid) + point_x = public_key.pointQ.x + point_y = public_key.pointQ.y + else: + point_x = point_y = None + + return construct(curve=curve_name, d=d, point_x=point_x, point_y=point_y) + + +def _import_pkcs8(encoded, passphrase): + from Cryptodome.IO import PKCS8 + + algo_oid, private_key, params = PKCS8.unwrap(encoded, passphrase) + + nist_p_oids = ( + "1.2.840.10045.2.1", # id-ecPublicKey (unrestricted) + "1.3.132.1.12", # id-ecDH + "1.3.132.1.13" # id-ecMQV + ) + eddsa_oids = { + "1.3.101.112": "Ed25519", # id-Ed25519 + "1.3.101.113": "Ed448", # id-Ed448 + } + + if algo_oid in nist_p_oids: + curve_oid = DerObjectId().decode(params).value + return _import_rfc5915_der(private_key, passphrase, curve_oid) + elif algo_oid in eddsa_oids: + if params is not None: + raise ValueError("EdDSA ECC private key must not have parameters") + curve_oid = None + seed = DerOctetString().decode(private_key).payload + return construct(curve=eddsa_oids[algo_oid], seed=seed) + else: + raise UnsupportedEccFeature("Unsupported ECC purpose (OID: %s)" % algo_oid) + + +def _import_x509_cert(encoded, *kwargs): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info) + + +def _import_der(encoded, passphrase): + + try: + return _import_subjectPublicKeyInfo(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_x509_cert(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_rfc5915_der(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_pkcs8(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + raise ValueError("Not an ECC DER key") + + +def _import_openssh_public(encoded): + parts = encoded.split(b' ') + if len(parts) not in (2, 3): + raise ValueError("Not an openssh public key") + + try: + keystring = binascii.a2b_base64(parts[1]) + + keyparts = [] + while len(keystring) > 4: + lk = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + lk]) + keystring = keystring[4 + lk:] + + if parts[0] != keyparts[0]: + raise ValueError("Mismatch in openssh public key") + + # NIST P curves + if parts[0].startswith(b"ecdsa-sha2-"): + + for curve_name, curve in _curves.items(): + if curve.openssh is None: + continue + if not curve.openssh.startswith("ecdsa-sha2"): + continue + middle = tobytes(curve.openssh.split("-")[2]) + if keyparts[1] == middle: + break + else: + raise ValueError("Unsupported ECC curve: " + middle) + + ecc_key = _import_public_der(keyparts[2], curve_oid=curve.oid) + + # EdDSA + elif parts[0] == b"ssh-ed25519": + x, y = _import_ed25519_public_key(keyparts[1]) + ecc_key = construct(curve="Ed25519", point_x=x, point_y=y) + else: + raise ValueError("Unsupported SSH key type: " + parts[0]) + + except (IndexError, TypeError, binascii.Error): + raise ValueError("Error parsing SSH key type: " + parts[0]) + + return ecc_key + + +def _import_openssh_private_ecc(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + key_type, decrypted = import_openssh_private_generic(data, password) + + eddsa_keys = { + "ssh-ed25519": ("Ed25519", _import_ed25519_public_key, 32), + } + + # https://datatracker.ietf.org/doc/html/draft-miller-ssh-agent-04 + if key_type.startswith("ecdsa-sha2"): + + ecdsa_curve_name, decrypted = read_string(decrypted) + if ecdsa_curve_name not in _curves: + raise UnsupportedEccFeature("Unsupported ECC curve %s" % ecdsa_curve_name) + curve = _curves[ecdsa_curve_name] + modulus_bytes = (curve.modulus_bits + 7) // 8 + + public_key, decrypted = read_bytes(decrypted) + + if bord(public_key[0]) != 4: + raise ValueError("Only uncompressed OpenSSH EC keys are supported") + if len(public_key) != 2 * modulus_bytes + 1: + raise ValueError("Incorrect public key length") + + point_x = Integer.from_bytes(public_key[1:1+modulus_bytes]) + point_y = Integer.from_bytes(public_key[1+modulus_bytes:]) + + private_key, decrypted = read_bytes(decrypted) + d = Integer.from_bytes(private_key) + + params = {'d': d, 'curve': ecdsa_curve_name} + + elif key_type in eddsa_keys: + + curve_name, import_eddsa_public_key, seed_len = eddsa_keys[key_type] + + public_key, decrypted = read_bytes(decrypted) + point_x, point_y = import_eddsa_public_key(public_key) + + private_public_key, decrypted = read_bytes(decrypted) + seed = private_public_key[:seed_len] + + params = {'seed': seed, 'curve': curve_name} + else: + raise ValueError("Unsupport SSH agent key type:" + key_type) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + return construct(point_x=point_x, point_y=point_y, **params) + + +def _import_ed25519_public_key(encoded): + """Import an Ed25519 ECC public key, encoded as raw bytes as described + in RFC8032_. + + Args: + encoded (bytes): + The Ed25519 public key to import. It must be 32 bytes long. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032 + """ + + if len(encoded) != 32: + raise ValueError("Incorrect length. Only Ed25519 public keys are supported.") + + p = Integer(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed) # 2**255 - 19 + d = 37095705934669439343138083508754565189542113879843219016388785533085940283555 + + y = bytearray(encoded) + x_lsb = y[31] >> 7 + y[31] &= 0x7F + point_y = Integer.from_bytes(y, byteorder='little') + if point_y >= p: + raise ValueError("Invalid Ed25519 key (y)") + if point_y == 1: + return 0, 1 + + u = (point_y**2 - 1) % p + v = ((point_y**2 % p) * d + 1) % p + try: + v_inv = v.inverse(p) + x2 = (u * v_inv) % p + point_x = Integer._tonelli_shanks(x2, p) + if (point_x & 1) != x_lsb: + point_x = p - point_x + except ValueError: + raise ValueError("Invalid Ed25519 public key") + return point_x, point_y + + +def _import_ed448_public_key(encoded): + """Import an Ed448 ECC public key, encoded as raw bytes as described + in RFC8032_. + + Args: + encoded (bytes): + The Ed448 public key to import. It must be 57 bytes long. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032 + """ + + if len(encoded) != 57: + raise ValueError("Incorrect length. Only Ed448 public keys are supported.") + + p = Integer(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff) # 2**448 - 2**224 - 1 + d = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff6756 + + y = encoded[:56] + x_lsb = bord(encoded[56]) >> 7 + point_y = Integer.from_bytes(y, byteorder='little') + if point_y >= p: + raise ValueError("Invalid Ed448 key (y)") + if point_y == 1: + return 0, 1 + + u = (point_y**2 - 1) % p + v = ((point_y**2 % p) * d - 1) % p + try: + v_inv = v.inverse(p) + x2 = (u * v_inv) % p + point_x = Integer._tonelli_shanks(x2, p) + if (point_x & 1) != x_lsb: + point_x = p - point_x + except ValueError: + raise ValueError("Invalid Ed448 public key") + return point_x, point_y + + +def import_key(encoded, passphrase=None, curve_name=None): + """Import an ECC key (public or private). + + Args: + encoded (bytes or multi-line string): + The ECC key to import. + The function will try to automatically detect the right format. + + Supported formats for an ECC **public** key: + + * X.509 certificate: binary (DER) or ASCII (PEM). + * X.509 ``subjectPublicKeyInfo``: binary (DER) or ASCII (PEM). + * SEC1_ (or X9.62), as ``bytes``. NIST P curves only. + You must also provide the ``curve_name`` (with a value from the `ECC table`_) + * OpenSSH line, defined in RFC5656_ and RFC8709_ (ASCII). + This is normally the content of files like ``~/.ssh/id_ecdsa.pub``. + + Supported formats for an ECC **private** key: + + * A binary ``ECPrivateKey`` structure, as defined in `RFC5915`_ (DER). + NIST P curves only. + * A `PKCS#8`_ structure (or the more recent Asymmetric Key Package, RFC5958_): binary (DER) or ASCII (PEM). + * `OpenSSH 6.5`_ and newer versions (ASCII). + + Private keys can be in the clear or password-protected. + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (byte string): + The passphrase to use for decrypting a private key. + Encryption may be applied protected at the PEM level (not recommended) + or at the PKCS#8 level (recommended). + This parameter is ignored if the key in input is not encrypted. + + curve_name (string): + For a SEC1 encoding only. This is the name of the curve, + as defined in the `ECC table`_. + + .. note:: + + To import EdDSA private and public keys, when encoded as raw ``bytes``, use: + + * :func:`Cryptodome.Signature.eddsa.import_public_key`, or + * :func:`Cryptodome.Signature.eddsa.import_private_key`. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed (possibly because + the pass phrase is wrong). + + .. _RFC1421: https://datatracker.ietf.org/doc/html/rfc1421 + .. _RFC1423: https://datatracker.ietf.org/doc/html/rfc1423 + .. _RFC5915: https://datatracker.ietf.org/doc/html/rfc5915 + .. _RFC5656: https://datatracker.ietf.org/doc/html/rfc5656 + .. _RFC8709: https://datatracker.ietf.org/doc/html/rfc8709 + .. _RFC5958: https://datatracker.ietf.org/doc/html/rfc5958 + .. _`PKCS#8`: https://datatracker.ietf.org/doc/html/rfc5208 + .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf + .. _SEC1: https://www.secg.org/sec1-v2.pdf + """ + + from Cryptodome.IO import PEM + + encoded = tobytes(encoded) + if passphrase is not None: + passphrase = tobytes(passphrase) + + # PEM + if encoded.startswith(b'-----BEGIN OPENSSH PRIVATE KEY'): + text_encoded = tostr(encoded) + openssh_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + result = _import_openssh_private_ecc(openssh_encoded, passphrase) + return result + + elif encoded.startswith(b'-----'): + + text_encoded = tostr(encoded) + + # Remove any EC PARAMETERS section + # Ignore its content because the curve type must be already given in the key + ecparams_start = "-----BEGIN EC PARAMETERS-----" + ecparams_end = "-----END EC PARAMETERS-----" + text_encoded = re.sub(ecparams_start + ".*?" + ecparams_end, "", + text_encoded, + flags=re.DOTALL) + + der_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + if enc_flag: + passphrase = None + try: + result = _import_der(der_encoded, passphrase) + except UnsupportedEccFeature as uef: + raise uef + except ValueError: + raise ValueError("Invalid DER encoding inside the PEM file") + return result + + # OpenSSH + if encoded.startswith((b'ecdsa-sha2-', b'ssh-ed25519')): + return _import_openssh_public(encoded) + + # DER + if len(encoded) > 0 and bord(encoded[0]) == 0x30: + return _import_der(encoded, passphrase) + + # SEC1 + if len(encoded) > 0 and bord(encoded[0]) in b'\x02\x03\x04': + if curve_name is None: + raise ValueError("No curve name was provided") + return _import_public_der(encoded, curve_name=curve_name) + + raise ValueError("ECC key format is not supported") + + +if __name__ == "__main__": + + import time + + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + + point = _curves['p256'].G.copy() + count = 3000 + + start = time.time() + for x in range(count): + pointX = point * d + print("(P-256 G)", (time.time() - start) / count * 1000, "ms") + + start = time.time() + for x in range(count): + pointX = pointX * d + print("(P-256 arbitrary point)", (time.time() - start) / count * 1000, "ms") diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi new file mode 100644 index 0000000..b0bfbec --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi @@ -0,0 +1,66 @@ +from typing import Union, Callable, Optional, NamedTuple, List, Tuple, Dict, NamedTuple, Any + +from Cryptodome.Math.Numbers import Integer + +RNG = Callable[[int], bytes] + +class UnsupportedEccFeature(ValueError): ... +class EccPoint(object): + def __init__(self, x: Union[int, Integer], y: Union[int, Integer], curve: Optional[str] = ...) -> None: ... + def set(self, point: EccPoint) -> EccPoint: ... + def __eq__(self, point: object) -> bool: ... + def __neg__(self) -> EccPoint: ... + def copy(self) -> EccPoint: ... + def is_point_at_infinity(self) -> bool: ... + def point_at_infinity(self) -> EccPoint: ... + @property + def x(self) -> int: ... + @property + def y(self) -> int: ... + @property + def xy(self) -> Tuple[int, int]: ... + def size_in_bytes(self) -> int: ... + def size_in_bits(self) -> int: ... + def double(self) -> EccPoint: ... + def __iadd__(self, point: EccPoint) -> EccPoint: ... + def __add__(self, point: EccPoint) -> EccPoint: ... + def __imul__(self, scalar: int) -> EccPoint: ... + def __mul__(self, scalar: int) -> EccPoint: ... + +class EccKey(object): + curve: str + def __init__(self, *, curve: str = ..., d: int = ..., point: EccPoint = ...) -> None: ... + def __eq__(self, other: object) -> bool: ... + def __repr__(self) -> str: ... + def has_private(self) -> bool: ... + @property + def d(self) -> int: ... + @property + def pointQ(self) -> EccPoint: ... + def public_key(self) -> EccKey: ... + def export_key(self, **kwargs: Union[str, bytes, bool]) -> Union[str,bytes]: ... + + +_Curve = NamedTuple("_Curve", [('p', Integer), + ('order', Integer), + ('b', Integer), + ('Gx', Integer), + ('Gy', Integer), + ('G', EccPoint), + ('modulus_bits', int), + ('oid', str), + ('context', Any), + ('desc', str), + ('openssh', Union[str, None]), + ]) + +_curves : Dict[str, _Curve] + + +def generate(**kwargs: Union[str, RNG]) -> EccKey: ... +def construct(**kwargs: Union[str, int]) -> EccKey: ... +def import_key(encoded: Union[bytes, str], + passphrase: Optional[str]=None, + curve_name:Optional[str]=None) -> EccKey: ... +def _import_ed25519_public_key(encoded: bytes) -> EccKey: ... +def _import_ed448_public_key(encoded: bytes) -> EccKey: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py new file mode 100644 index 0000000..95c219e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py @@ -0,0 +1,286 @@ +# +# ElGamal.py : ElGamal encryption/decryption and signatures +# +# Part of the Python Cryptography Toolkit +# +# Originally written by: A.M. Kuchling +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['generate', 'construct', 'ElGamalKey'] + +from Cryptodome import Random +from Cryptodome.Math.Primality import ( generate_probable_safe_prime, + test_probable_prime, COMPOSITE ) +from Cryptodome.Math.Numbers import Integer + +# Generate an ElGamal key with N bits +def generate(bits, randfunc): + """Randomly generate a fresh, new ElGamal key. + + The key will be safe for use for both encryption and signature + (although it should be used for **only one** purpose). + + Args: + bits (int): + Key length, or size (in bits) of the modulus *p*. + The recommended value is 2048. + randfunc (callable): + Random number generation function; it should accept + a single integer *N* and return a string of random + *N* random bytes. + + Return: + an :class:`ElGamalKey` object + """ + + obj=ElGamalKey() + + # Generate a safe prime p + # See Algorithm 4.86 in Handbook of Applied Cryptography + obj.p = generate_probable_safe_prime(exact_bits=bits, randfunc=randfunc) + q = (obj.p - 1) >> 1 + + # Generate generator g + while 1: + # Choose a square residue; it will generate a cyclic group of order q. + obj.g = pow(Integer.random_range(min_inclusive=2, + max_exclusive=obj.p, + randfunc=randfunc), 2, obj.p) + + # We must avoid g=2 because of Bleichenbacher's attack described + # in "Generating ElGamal signatures without knowning the secret key", + # 1996 + if obj.g in (1, 2): + continue + + # Discard g if it divides p-1 because of the attack described + # in Note 11.67 (iii) in HAC + if (obj.p - 1) % obj.g == 0: + continue + + # g^{-1} must not divide p-1 because of Khadir's attack + # described in "Conditions of the generator for forging ElGamal + # signature", 2011 + ginv = obj.g.inverse(obj.p) + if (obj.p - 1) % ginv == 0: + continue + + # Found + break + + # Generate private key x + obj.x = Integer.random_range(min_inclusive=2, + max_exclusive=obj.p-1, + randfunc=randfunc) + # Generate public key y + obj.y = pow(obj.g, obj.x, obj.p) + return obj + +def construct(tup): + r"""Construct an ElGamal key from a tuple of valid ElGamal components. + + The modulus *p* must be a prime. + The following conditions must apply: + + .. math:: + + \begin{align} + &1 < g < p-1 \\ + &g^{p-1} = 1 \text{ mod } 1 \\ + &1 < x < p-1 \\ + &g^x = y \text{ mod } p + \end{align} + + Args: + tup (tuple): + A tuple with either 3 or 4 integers, + in the following order: + + 1. Modulus (*p*). + 2. Generator (*g*). + 3. Public key (*y*). + 4. Private key (*x*). Optional. + + Raises: + ValueError: when the key being imported fails the most basic ElGamal validity checks. + + Returns: + an :class:`ElGamalKey` object + """ + + obj=ElGamalKey() + if len(tup) not in [3,4]: + raise ValueError('argument for construct() wrong length') + for i in range(len(tup)): + field = obj._keydata[i] + setattr(obj, field, Integer(tup[i])) + + fmt_error = test_probable_prime(obj.p) == COMPOSITE + fmt_error |= obj.g<=1 or obj.g>=obj.p + fmt_error |= pow(obj.g, obj.p-1, obj.p)!=1 + fmt_error |= obj.y<1 or obj.y>=obj.p + if len(tup)==4: + fmt_error |= obj.x<=1 or obj.x>=obj.p + fmt_error |= pow(obj.g, obj.x, obj.p)!=obj.y + + if fmt_error: + raise ValueError("Invalid ElGamal key components") + + return obj + +class ElGamalKey(object): + r"""Class defining an ElGamal key. + Do not instantiate directly. + Use :func:`generate` or :func:`construct` instead. + + :ivar p: Modulus + :vartype d: integer + + :ivar g: Generator + :vartype e: integer + + :ivar y: Public key component + :vartype y: integer + + :ivar x: Private key component + :vartype x: integer + """ + + #: Dictionary of ElGamal parameters. + #: + #: A public key will only have the following entries: + #: + #: - **y**, the public key. + #: - **g**, the generator. + #: - **p**, the modulus. + #: + #: A private key will also have: + #: + #: - **x**, the private key. + _keydata=['p', 'g', 'y', 'x'] + + def __init__(self, randfunc=None): + if randfunc is None: + randfunc = Random.new().read + self._randfunc = randfunc + + def _encrypt(self, M, K): + a=pow(self.g, K, self.p) + b=( pow(self.y, K, self.p)*M ) % self.p + return [int(a), int(b)] + + def _decrypt(self, M): + if (not hasattr(self, 'x')): + raise TypeError('Private key not available in this object') + r = Integer.random_range(min_inclusive=2, + max_exclusive=self.p-1, + randfunc=self._randfunc) + a_blind = (pow(self.g, r, self.p) * M[0]) % self.p + ax=pow(a_blind, self.x, self.p) + plaintext_blind = (ax.inverse(self.p) * M[1] ) % self.p + plaintext = (plaintext_blind * pow(self.y, r, self.p)) % self.p + return int(plaintext) + + def _sign(self, M, K): + if (not hasattr(self, 'x')): + raise TypeError('Private key not available in this object') + p1=self.p-1 + K = Integer(K) + if (K.gcd(p1)!=1): + raise ValueError('Bad K value: GCD(K,p-1)!=1') + a=pow(self.g, K, self.p) + t=(Integer(M)-self.x*a) % p1 + while t<0: t=t+p1 + b=(t*K.inverse(p1)) % p1 + return [int(a), int(b)] + + def _verify(self, M, sig): + sig = [Integer(x) for x in sig] + if sig[0]<1 or sig[0]>self.p-1: + return 0 + v1=pow(self.y, sig[0], self.p) + v1=(v1*pow(sig[0], sig[1], self.p)) % self.p + v2=pow(self.g, M, self.p) + if v1==v2: + return 1 + return 0 + + def has_private(self): + """Whether this is an ElGamal private key""" + + if hasattr(self, 'x'): + return 1 + else: + return 0 + + def can_encrypt(self): + return True + + def can_sign(self): + return True + + def publickey(self): + """A matching ElGamal public key. + + Returns: + a new :class:`ElGamalKey` object + """ + return construct((self.p, self.g, self.y)) + + def __eq__(self, other): + if bool(self.has_private()) != bool(other.has_private()): + return False + + result = True + for comp in self._keydata: + result = result and (getattr(self.key, comp, None) == + getattr(other.key, comp, None)) + return result + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + # ElGamal key is not pickable + from pickle import PicklingError + raise PicklingError + + # Methods defined in PyCryptodome that we don't support anymore + + def sign(self, M, K): + raise NotImplementedError + + def verify(self, M, signature): + raise NotImplementedError + + def encrypt(self, plaintext, K): + raise NotImplementedError + + def decrypt(self, ciphertext): + raise NotImplementedError + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi new file mode 100644 index 0000000..9048531 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi @@ -0,0 +1,18 @@ +from typing import Callable, Union, Tuple, Optional + +__all__ = ['generate', 'construct', 'ElGamalKey'] + +RNG = Callable[[int], bytes] + +def generate(bits: int, randfunc: RNG) -> ElGamalKey: ... +def construct(tup: Union[Tuple[int, int, int], Tuple[int, int, int, int]]) -> ElGamalKey: ... + +class ElGamalKey(object): + def __init__(self, randfunc: Optional[RNG]=None) -> None: ... + def has_private(self) -> bool: ... + def can_encrypt(self) -> bool: ... + def can_sign(self) -> bool: ... + def publickey(self) -> ElGamalKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __getstate__(self) -> None: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py new file mode 100644 index 0000000..7466e3a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py @@ -0,0 +1,833 @@ +# -*- coding: utf-8 -*- +# =================================================================== +# +# Copyright (c) 2016, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = ['generate', 'construct', 'import_key', + 'RsaKey', 'oid'] + +import binascii +import struct + +from Cryptodome import Random +from Cryptodome.Util.py3compat import tobytes, bord, tostr +from Cryptodome.Util.asn1 import DerSequence, DerNull + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import (test_probable_prime, + generate_probable_prime, COMPOSITE) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + + +class RsaKey(object): + r"""Class defining an actual RSA key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar n: RSA modulus + :vartype n: integer + + :ivar e: RSA public exponent + :vartype e: integer + + :ivar d: RSA private exponent + :vartype d: integer + + :ivar p: First factor of the RSA modulus + :vartype p: integer + + :ivar q: Second factor of the RSA modulus + :vartype q: integer + + :ivar invp: Chinese remainder component (:math:`p^{-1} \text{mod } q`) + :vartype invp: integer + + :ivar invq: Chinese remainder component (:math:`q^{-1} \text{mod } p`) + :vartype invq: integer + + :ivar u: Same as ``invp`` + :vartype u: integer + + :undocumented: exportKey, publickey + """ + + def __init__(self, **kwargs): + """Build an RSA key. + + :Keywords: + n : integer + The modulus. + e : integer + The public exponent. + d : integer + The private exponent. Only required for private keys. + p : integer + The first factor of the modulus. Only required for private keys. + q : integer + The second factor of the modulus. Only required for private keys. + u : integer + The CRT coefficient (inverse of p modulo q). Only required for + private keys. + """ + + input_set = set(kwargs.keys()) + public_set = set(('n', 'e')) + private_set = public_set | set(('p', 'q', 'd', 'u')) + if input_set not in (private_set, public_set): + raise ValueError("Some RSA components are missing") + for component, value in kwargs.items(): + setattr(self, "_" + component, value) + if input_set == private_set: + self._dp = self._d % (self._p - 1) # = (eâ»Â¹) mod (p-1) + self._dq = self._d % (self._q - 1) # = (eâ»Â¹) mod (q-1) + self._invq = None # will be computed on demand + + @property + def n(self): + return int(self._n) + + @property + def e(self): + return int(self._e) + + @property + def d(self): + if not self.has_private(): + raise AttributeError("No private exponent available for public keys") + return int(self._d) + + @property + def p(self): + if not self.has_private(): + raise AttributeError("No CRT component 'p' available for public keys") + return int(self._p) + + @property + def q(self): + if not self.has_private(): + raise AttributeError("No CRT component 'q' available for public keys") + return int(self._q) + + @property + def dp(self): + if not self.has_private(): + raise AttributeError("No CRT component 'dp' available for public keys") + return int(self._dp) + + @property + def dq(self): + if not self.has_private(): + raise AttributeError("No CRT component 'dq' available for public keys") + return int(self._dq) + + @property + def invq(self): + if not self.has_private(): + raise AttributeError("No CRT component 'invq' available for public keys") + if self._invq is None: + self._invq = self._q.inverse(self._p) + return int(self._invq) + + @property + def invp(self): + return self.u + + @property + def u(self): + if not self.has_private(): + raise AttributeError("No CRT component 'u' available for public keys") + return int(self._u) + + def size_in_bits(self): + """Size of the RSA modulus in bits""" + return self._n.size_in_bits() + + def size_in_bytes(self): + """The minimal amount of bytes that can hold the RSA modulus""" + return (self._n.size_in_bits() - 1) // 8 + 1 + + def _encrypt(self, plaintext): + if not 0 <= plaintext < self._n: + raise ValueError("Plaintext too large") + return int(pow(Integer(plaintext), self._e, self._n)) + + def _decrypt(self, ciphertext): + if not 0 <= ciphertext < self._n: + raise ValueError("Ciphertext too large") + if not self.has_private(): + raise TypeError("This is not a private key") + + # Blinded RSA decryption (to prevent timing attacks): + # Step 1: Generate random secret blinding factor r, + # such that 0 < r < n-1 + r = Integer.random_range(min_inclusive=1, max_exclusive=self._n) + # Step 2: Compute c' = c * r**e mod n + cp = Integer(ciphertext) * pow(r, self._e, self._n) % self._n + # Step 3: Compute m' = c'**d mod n (normal RSA decryption) + m1 = pow(cp, self._dp, self._p) + m2 = pow(cp, self._dq, self._q) + h = ((m2 - m1) * self._u) % self._q + mp = h * self._p + m1 + # Step 4: Compute m = m' * (r**(-1)) mod n + result = (r.inverse(self._n) * mp) % self._n + # Verify no faults occurred + if ciphertext != pow(result, self._e, self._n): + raise ValueError("Fault detected in RSA decryption") + return result + + def has_private(self): + """Whether this is an RSA private key""" + + return hasattr(self, "_d") + + def can_encrypt(self): # legacy + return True + + def can_sign(self): # legacy + return True + + def public_key(self): + """A matching RSA public key. + + Returns: + a new :class:`RsaKey` object + """ + return RsaKey(n=self._n, e=self._e) + + def __eq__(self, other): + if self.has_private() != other.has_private(): + return False + if self.n != other.n or self.e != other.e: + return False + if not self.has_private(): + return True + return (self.d == other.d) + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + # RSA key is not pickable + from pickle import PicklingError + raise PicklingError + + def __repr__(self): + if self.has_private(): + extra = ", d=%d, p=%d, q=%d, u=%d" % (int(self._d), int(self._p), + int(self._q), int(self._u)) + else: + extra = "" + return "RsaKey(n=%d, e=%d%s)" % (int(self._n), int(self._e), extra) + + def __str__(self): + if self.has_private(): + key_type = "Private" + else: + key_type = "Public" + return "%s RSA key at 0x%X" % (key_type, id(self)) + + def export_key(self, format='PEM', passphrase=None, pkcs=1, + protection=None, randfunc=None): + """Export this RSA key. + + Args: + format (string): + The format to use for wrapping the key: + + - *'PEM'*. (*Default*) Text encoding, done according to `RFC1421`_/`RFC1423`_. + - *'DER'*. Binary encoding. + - *'OpenSSH'*. Textual encoding, done according to OpenSSH specification. + Only suitable for public keys (not private keys). + + passphrase (string): + (*For private keys only*) The pass phrase used for protecting the output. + + pkcs (integer): + (*For private keys only*) The ASN.1 structure to use for + serializing the key. Note that even in case of PEM + encoding, there is an inner ASN.1 DER structure. + + With ``pkcs=1`` (*default*), the private key is encoded in a + simple `PKCS#1`_ structure (``RSAPrivateKey``). + + With ``pkcs=8``, the private key is encoded in a `PKCS#8`_ structure + (``PrivateKeyInfo``). + + .. note:: + This parameter is ignored for a public key. + For DER and PEM, an ASN.1 DER ``SubjectPublicKeyInfo`` + structure is always used. + + protection (string): + (*For private keys only*) + The encryption scheme to use for protecting the private key. + + If ``None`` (default), the behavior depends on :attr:`format`: + + - For *'DER'*, the *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC* + scheme is used. The following operations are performed: + + 1. A 16 byte Triple DES key is derived from the passphrase + using :func:`Cryptodome.Protocol.KDF.PBKDF2` with 8 bytes salt, + and 1 000 iterations of :mod:`Cryptodome.Hash.HMAC`. + 2. The private key is encrypted using CBC. + 3. The encrypted key is encoded according to PKCS#8. + + - For *'PEM'*, the obsolete PEM encryption scheme is used. + It is based on MD5 for key derivation, and Triple DES for encryption. + + Specifying a value for :attr:`protection` is only meaningful for PKCS#8 + (that is, ``pkcs=8``) and only if a pass phrase is present too. + + The supported schemes for PKCS#8 are listed in the + :mod:`Cryptodome.IO.PKCS8` module (see :attr:`wrap_algo` parameter). + + randfunc (callable): + A function that provides random bytes. Only used for PEM encoding. + The default is :func:`Cryptodome.Random.get_random_bytes`. + + Returns: + byte string: the encoded key + + Raises: + ValueError:when the format is unknown or when you try to encrypt a private + key with *DER* format and PKCS#1. + + .. warning:: + If you don't provide a pass phrase, the private key will be + exported in the clear! + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + """ + + if passphrase is not None: + passphrase = tobytes(passphrase) + + if randfunc is None: + randfunc = Random.get_random_bytes + + if format == 'OpenSSH': + e_bytes, n_bytes = [x.to_bytes() for x in (self._e, self._n)] + if bord(e_bytes[0]) & 0x80: + e_bytes = b'\x00' + e_bytes + if bord(n_bytes[0]) & 0x80: + n_bytes = b'\x00' + n_bytes + keyparts = [b'ssh-rsa', e_bytes, n_bytes] + keystring = b''.join([struct.pack(">I", len(kp)) + kp for kp in keyparts]) + return b'ssh-rsa ' + binascii.b2a_base64(keystring)[:-1] + + # DER format is always used, even in case of PEM, which simply + # encodes it into BASE64. + if self.has_private(): + binary_key = DerSequence([0, + self.n, + self.e, + self.d, + self.p, + self.q, + self.d % (self.p-1), + self.d % (self.q-1), + Integer(self.q).inverse(self.p) + ]).encode() + if pkcs == 1: + key_type = 'RSA PRIVATE KEY' + if format == 'DER' and passphrase: + raise ValueError("PKCS#1 private key cannot be encrypted") + else: # PKCS#8 + from Cryptodome.IO import PKCS8 + + if format == 'PEM' and protection is None: + key_type = 'PRIVATE KEY' + binary_key = PKCS8.wrap(binary_key, oid, None, + key_params=DerNull()) + else: + key_type = 'ENCRYPTED PRIVATE KEY' + if not protection: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + binary_key = PKCS8.wrap(binary_key, oid, + passphrase, protection, + key_params=DerNull()) + passphrase = None + else: + key_type = "PUBLIC KEY" + binary_key = _create_subject_public_key_info(oid, + DerSequence([self.n, + self.e]), + DerNull() + ) + + if format == 'DER': + return binary_key + if format == 'PEM': + from Cryptodome.IO import PEM + + pem_str = PEM.encode(binary_key, key_type, passphrase, randfunc) + return tobytes(pem_str) + + raise ValueError("Unknown key format '%s'. Cannot export the RSA key." % format) + + # Backward compatibility + exportKey = export_key + publickey = public_key + + # Methods defined in PyCryptodome that we don't support anymore + def sign(self, M, K): + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def encrypt(self, plaintext, K): + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def decrypt(self, ciphertext): + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError + + +def generate(bits, randfunc=None, e=65537): + """Create a new RSA key pair. + + The algorithm closely follows NIST `FIPS 186-4`_ in its + sections B.3.1 and B.3.3. The modulus is the product of + two non-strong probable primes. + Each prime passes a suitable number of Miller-Rabin tests + with random bases and a single Lucas test. + + Args: + bits (integer): + Key length, or size (in bits) of the RSA modulus. + It must be at least 1024, but **2048 is recommended.** + The FIPS standard only defines 1024, 2048 and 3072. + randfunc (callable): + Function that returns random bytes. + The default is :func:`Cryptodome.Random.get_random_bytes`. + e (integer): + Public RSA exponent. It must be an odd positive integer. + It is typically a small number with very few ones in its + binary representation. + The FIPS standard requires the public exponent to be + at least 65537 (the default). + + Returns: an RSA key object (:class:`RsaKey`, with private key). + + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if bits < 1024: + raise ValueError("RSA modulus length must be >= 1024") + if e % 2 == 0 or e < 3: + raise ValueError("RSA public exponent must be a positive, odd integer larger than 2.") + + if randfunc is None: + randfunc = Random.get_random_bytes + + d = n = Integer(1) + e = Integer(e) + + while n.size_in_bits() != bits and d < (1 << (bits // 2)): + # Generate the prime factors of n: p and q. + # By construciton, their product is always + # 2^{bits-1} < p*q < 2^bits. + size_q = bits // 2 + size_p = bits - size_q + + min_p = min_q = (Integer(1) << (2 * size_q - 1)).sqrt() + if size_q != size_p: + min_p = (Integer(1) << (2 * size_p - 1)).sqrt() + + def filter_p(candidate): + return candidate > min_p and (candidate - 1).gcd(e) == 1 + + p = generate_probable_prime(exact_bits=size_p, + randfunc=randfunc, + prime_filter=filter_p) + + min_distance = Integer(1) << (bits // 2 - 100) + + def filter_q(candidate): + return (candidate > min_q and + (candidate - 1).gcd(e) == 1 and + abs(candidate - p) > min_distance) + + q = generate_probable_prime(exact_bits=size_q, + randfunc=randfunc, + prime_filter=filter_q) + + n = p * q + lcm = (p - 1).lcm(q - 1) + d = e.inverse(lcm) + + if p > q: + p, q = q, p + + u = p.inverse(q) + + return RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + +def construct(rsa_components, consistency_check=True): + r"""Construct an RSA key from a tuple of valid RSA components. + + The modulus **n** must be the product of two primes. + The public exponent **e** must be odd and larger than 1. + + In case of a private key, the following equations must apply: + + .. math:: + + \begin{align} + p*q &= n \\ + e*d &\equiv 1 ( \text{mod lcm} [(p-1)(q-1)]) \\ + p*u &\equiv 1 ( \text{mod } q) + \end{align} + + Args: + rsa_components (tuple): + A tuple of integers, with at least 2 and no + more than 6 items. The items come in the following order: + + 1. RSA modulus *n*. + 2. Public exponent *e*. + 3. Private exponent *d*. + Only required if the key is private. + 4. First factor of *n* (*p*). + Optional, but the other factor *q* must also be present. + 5. Second factor of *n* (*q*). Optional. + 6. CRT coefficient *q*, that is :math:`p^{-1} \text{mod }q`. Optional. + + consistency_check (boolean): + If ``True``, the library will verify that the provided components + fulfil the main RSA properties. + + Raises: + ValueError: when the key being imported fails the most basic RSA validity checks. + + Returns: An RSA key object (:class:`RsaKey`). + """ + + class InputComps(object): + pass + + input_comps = InputComps() + for (comp, value) in zip(('n', 'e', 'd', 'p', 'q', 'u'), rsa_components): + setattr(input_comps, comp, Integer(value)) + + n = input_comps.n + e = input_comps.e + if not hasattr(input_comps, 'd'): + key = RsaKey(n=n, e=e) + else: + d = input_comps.d + if hasattr(input_comps, 'q'): + p = input_comps.p + q = input_comps.q + else: + # Compute factors p and q from the private exponent d. + # We assume that n has no more than two factors. + # See 8.2.2(i) in Handbook of Applied Cryptography. + ktot = d * e - 1 + # The quantity d*e-1 is a multiple of phi(n), even, + # and can be represented as t*2^s. + t = ktot + while t % 2 == 0: + t //= 2 + # Cycle through all multiplicative inverses in Zn. + # The algorithm is non-deterministic, but there is a 50% chance + # any candidate a leads to successful factoring. + # See "Digitalized Signatures and Public Key Functions as Intractable + # as Factorization", M. Rabin, 1979 + spotted = False + a = Integer(2) + while not spotted and a < 100: + k = Integer(t) + # Cycle through all values a^{t*2^i}=a^k + while k < ktot: + cand = pow(a, k, n) + # Check if a^k is a non-trivial root of unity (mod n) + if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1: + # We have found a number such that (cand-1)(cand+1)=0 (mod n). + # Either of the terms divides n. + p = Integer(n).gcd(cand + 1) + spotted = True + break + k *= 2 + # This value was not any good... let's try another! + a += 2 + if not spotted: + raise ValueError("Unable to compute factors p and q from exponent d.") + # Found ! + assert ((n % p) == 0) + q = n // p + + if hasattr(input_comps, 'u'): + u = input_comps.u + else: + u = p.inverse(q) + + # Build key object + key = RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + # Verify consistency of the key + if consistency_check: + + # Modulus and public exponent must be coprime + if e <= 1 or e >= n: + raise ValueError("Invalid RSA public exponent") + if Integer(n).gcd(e) != 1: + raise ValueError("RSA public exponent is not coprime to modulus") + + # For RSA, modulus must be odd + if not n & 1: + raise ValueError("RSA modulus is not odd") + + if key.has_private(): + # Modulus and private exponent must be coprime + if d <= 1 or d >= n: + raise ValueError("Invalid RSA private exponent") + if Integer(n).gcd(d) != 1: + raise ValueError("RSA private exponent is not coprime to modulus") + # Modulus must be product of 2 primes + if p * q != n: + raise ValueError("RSA factors do not match modulus") + if test_probable_prime(p) == COMPOSITE: + raise ValueError("RSA factor p is composite") + if test_probable_prime(q) == COMPOSITE: + raise ValueError("RSA factor q is composite") + # See Carmichael theorem + phi = (p - 1) * (q - 1) + lcm = phi // (p - 1).gcd(q - 1) + if (e * d % int(lcm)) != 1: + raise ValueError("Invalid RSA condition") + if hasattr(key, 'u'): + # CRT coefficient + if u <= 1 or u >= q: + raise ValueError("Invalid RSA component u") + if (p * u % q) != 1: + raise ValueError("Invalid RSA component u with p") + + return key + + +def _import_pkcs1_private(encoded, *kwargs): + # RSAPrivateKey ::= SEQUENCE { + # version Version, + # modulus INTEGER, -- n + # publicExponent INTEGER, -- e + # privateExponent INTEGER, -- d + # prime1 INTEGER, -- p + # prime2 INTEGER, -- q + # exponent1 INTEGER, -- d mod (p-1) + # exponent2 INTEGER, -- d mod (q-1) + # coefficient INTEGER -- (inverse of q) mod p + # } + # + # Version ::= INTEGER + der = DerSequence().decode(encoded, nr_elements=9, only_ints_expected=True) + if der[0] != 0: + raise ValueError("No PKCS#1 encoding of an RSA private key") + return construct(der[1:6] + [Integer(der[4]).inverse(der[5])]) + + +def _import_pkcs1_public(encoded, *kwargs): + # RSAPublicKey ::= SEQUENCE { + # modulus INTEGER, -- n + # publicExponent INTEGER -- e + # } + der = DerSequence().decode(encoded, nr_elements=2, only_ints_expected=True) + return construct(der) + + +def _import_subjectPublicKeyInfo(encoded, *kwargs): + + algoid, encoded_key, params = _expand_subject_public_key_info(encoded) + if algoid != oid or params is not None: + raise ValueError("No RSA subjectPublicKeyInfo") + return _import_pkcs1_public(encoded_key) + + +def _import_x509_cert(encoded, *kwargs): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info) + + +def _import_pkcs8(encoded, passphrase): + from Cryptodome.IO import PKCS8 + + k = PKCS8.unwrap(encoded, passphrase) + if k[0] != oid: + raise ValueError("No PKCS#8 encoded RSA key") + return _import_keyDER(k[1], passphrase) + + +def _import_keyDER(extern_key, passphrase): + """Import an RSA key (public or private half), encoded in DER form.""" + + decodings = (_import_pkcs1_private, + _import_pkcs1_public, + _import_subjectPublicKeyInfo, + _import_x509_cert, + _import_pkcs8) + + for decoding in decodings: + try: + return decoding(extern_key, passphrase) + except ValueError: + pass + + raise ValueError("RSA key format is not supported") + + +def _import_openssh_private_rsa(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + ssh_name, decrypted = import_openssh_private_generic(data, password) + + if ssh_name != "ssh-rsa": + raise ValueError("This SSH key is not RSA") + + n, decrypted = read_bytes(decrypted) + e, decrypted = read_bytes(decrypted) + d, decrypted = read_bytes(decrypted) + iqmp, decrypted = read_bytes(decrypted) + p, decrypted = read_bytes(decrypted) + q, decrypted = read_bytes(decrypted) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + build = [Integer.from_bytes(x) for x in (n, e, d, q, p, iqmp)] + return construct(build) + + +def import_key(extern_key, passphrase=None): + """Import an RSA key (public or private). + + Args: + extern_key (string or byte string): + The RSA key to import. + + The following formats are supported for an RSA **public key**: + + - X.509 certificate (binary or PEM format) + - X.509 ``subjectPublicKeyInfo`` DER SEQUENCE (binary or PEM + encoding) + - `PKCS#1`_ ``RSAPublicKey`` DER SEQUENCE (binary or PEM encoding) + - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII) + + The following formats are supported for an RSA **private key**: + + - PKCS#1 ``RSAPrivateKey`` DER SEQUENCE (binary or PEM encoding) + - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo`` + DER SEQUENCE (binary or PEM encoding) + - OpenSSH (text format, introduced in `OpenSSH 6.5`_) + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (string or byte string): + For private keys only, the pass phrase that encrypts the key. + + Returns: An RSA key object (:class:`RsaKey`). + + Raises: + ValueError/IndexError/TypeError: + When the given key cannot be parsed (possibly because the pass + phrase is wrong). + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf + """ + + from Cryptodome.IO import PEM + + extern_key = tobytes(extern_key) + if passphrase is not None: + passphrase = tobytes(passphrase) + + if extern_key.startswith(b'-----BEGIN OPENSSH PRIVATE KEY'): + text_encoded = tostr(extern_key) + openssh_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + result = _import_openssh_private_rsa(openssh_encoded, passphrase) + return result + + if extern_key.startswith(b'-----'): + # This is probably a PEM encoded key. + (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase) + if enc_flag: + passphrase = None + return _import_keyDER(der, passphrase) + + if extern_key.startswith(b'ssh-rsa '): + # This is probably an OpenSSH key + keystring = binascii.a2b_base64(extern_key.split(b' ')[1]) + keyparts = [] + while len(keystring) > 4: + length = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + length]) + keystring = keystring[4 + length:] + e = Integer.from_bytes(keyparts[1]) + n = Integer.from_bytes(keyparts[2]) + return construct([n, e]) + + if len(extern_key) > 0 and bord(extern_key[0]) == 0x30: + # This is probably a DER encoded key + return _import_keyDER(extern_key, passphrase) + + raise ValueError("RSA key format is not supported") + + +# Backward compatibility +importKey = import_key + +#: `Object ID`_ for the RSA encryption algorithm. This OID often indicates +#: a generic RSA key, even when such key will be actually used for digital +#: signatures. +#: +#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.113549.1.1.1.html +oid = "1.2.840.113549.1.1.1" diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi new file mode 100644 index 0000000..cef70ad --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi @@ -0,0 +1,61 @@ +from typing import Callable, Union, Tuple, Optional + +from Cryptodome.Math.Numbers import Integer + +__all__ = ['generate', 'construct', 'import_key', + 'RsaKey', 'oid'] + +RNG = Callable[[int], bytes] + +class RsaKey(object): + def __init__(self, **kwargs: int) -> None: ... + + @property + def n(self) -> int: ... + @property + def e(self) -> int: ... + @property + def d(self) -> int: ... + @property + def p(self) -> int: ... + @property + def q(self) -> int: ... + @property + def u(self) -> int: ... + @property + def invp(self) -> int: ... + @property + def invq(self) -> int: ... + + def size_in_bits(self) -> int: ... + def size_in_bytes(self) -> int: ... + def has_private(self) -> bool: ... + def can_encrypt(self) -> bool: ... # legacy + def can_sign(self) -> bool:... # legacy + def public_key(self) -> RsaKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __getstate__(self) -> None: ... + def __repr__(self) -> str: ... + def __str__(self) -> str: ... + def export_key(self, format: Optional[str]="PEM", passphrase: Optional[str]=None, pkcs: Optional[int]=1, + protection: Optional[str]=None, randfunc: Optional[RNG]=None) -> bytes: ... + + # Backward compatibility + exportKey = export_key + publickey = public_key + +Int = Union[int, Integer] + +def generate(bits: int, randfunc: Optional[RNG]=None, e: Optional[int]=65537) -> RsaKey: ... +def construct(rsa_components: Union[Tuple[Int, Int], # n, e + Tuple[Int, Int, Int], # n, e, d + Tuple[Int, Int, Int, Int, Int], # n, e, d, p, q + Tuple[Int, Int, Int, Int, Int, Int]], # n, e, d, p, q, crt_q + consistency_check: Optional[bool]=True) -> RsaKey: ... +def import_key(extern_key: Union[str, bytes], passphrase: Optional[str]=None) -> RsaKey: ... + +# Backward compatibility +importKey = import_key + +oid: str diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py new file mode 100644 index 0000000..99b67a4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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 Cryptodome.Util.asn1 import (DerSequence, DerInteger, DerBitString, + DerObjectId, DerNull) + + +def _expand_subject_public_key_info(encoded): + """Parse a SubjectPublicKeyInfo structure. + + It returns a triple with: + * OID (string) + * encoded public key (bytes) + * Algorithm parameters (bytes or None) + """ + + # + # SubjectPublicKeyInfo ::= SEQUENCE { + # algorithm AlgorithmIdentifier, + # subjectPublicKey BIT STRING + # } + # + # AlgorithmIdentifier ::= SEQUENCE { + # algorithm OBJECT IDENTIFIER, + # parameters ANY DEFINED BY algorithm OPTIONAL + # } + # + + spki = DerSequence().decode(encoded, nr_elements=2) + algo = DerSequence().decode(spki[0], nr_elements=(1,2)) + algo_oid = DerObjectId().decode(algo[0]) + spk = DerBitString().decode(spki[1]).value + + if len(algo) == 1: + algo_params = None + else: + try: + DerNull().decode(algo[1]) + algo_params = None + except: + algo_params = algo[1] + + return algo_oid.value, spk, algo_params + + +def _create_subject_public_key_info(algo_oid, public_key, params): + + if params is None: + algorithm = DerSequence([DerObjectId(algo_oid)]) + else: + algorithm = DerSequence([DerObjectId(algo_oid), params]) + + spki = DerSequence([algorithm, + DerBitString(public_key) + ]) + return spki.encode() + + +def _extract_subject_public_key_info(x509_certificate): + """Extract subjectPublicKeyInfo from a DER X.509 certificate.""" + + certificate = DerSequence().decode(x509_certificate, nr_elements=3) + tbs_certificate = DerSequence().decode(certificate[0], + nr_elements=range(6, 11)) + + index = 5 + try: + tbs_certificate[0] + 1 + # Version not present + version = 1 + except TypeError: + version = DerInteger(explicit=0).decode(tbs_certificate[0]).value + if version not in (2, 3): + raise ValueError("Incorrect X.509 certificate version") + index = 6 + + return tbs_certificate[index] diff --git a/lib/site-packages/pip/_vendor/chardet/cli/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi similarity index 100% rename from lib/site-packages/pip/_vendor/chardet/cli/__init__.py rename to python/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..536cd09bac92a0f7f170eae3bdec2076a5d8b7cc GIT binary patch literal 960512 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μgx?rF^+&E$Dp!!jZkOy^hs&vb9!7Qmi^k6ObhX| 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%0D2Ia`@a8(z^#PqK)+Vy$yE9sd_Cxn4lE@F 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[aLz~8 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�pw{P{w){H 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̓k4zGyW*D_6Hg;4=er!RMTHSz%qUD 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⪚u%ys=8WbRjdA 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 Yg<Y#$|AU2{q+fZL>Ywc>I7RQj0DZF*^Z)<= literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..e6fed9617bf662a3edb0e828acd111c0ca0924c5 GIT binary patch literal 220504 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%0D1)}^c};gkDx&Rj98Ys1!YZZC-@`+`9&|k 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 GX8#|azEau% literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..89e7713a76c2e1d6bc4cc59098cdad5bc76fdcc0 GIT binary patch literal 250552 zcmeFadw3K@)(6}@GlU5VGXq8pf;zyUi6YJ*NJc<2FoAC9fp9enl5hzZmrG10fCwu( z3DWO4E~2ZvtGnV}-F0{6)m;=^aS|XQQ6K^3rmKjz9wHDxNkm}2->K@EbO85#|M|Y> z`-A4`RMn|dr%s(Zb?VfmhsW}iktR_T5|3H9N1&9uH;3fv89DW4JthdbLXMD%zrBTC z4A+v(xja(f;IKp}=xM5>17$hs4<0A`n+)Hb#nXw<SdP`VR>!|2+-c|VL})CRf~?lR z@%+|z+lNlQd0B~O>U^4jM&%rT=lG7T?ZXCY2%bb}<w=2fq&J5MTp@IEu#gA|m!ABu zg0m^!u#P1!3s>m%CBj6x@hC@p{$C%xdBOy}zMqndRp&nu>eaKhWuP(=*Ql|Rg||M> zI{#m_lRo;o@{j9JZWuc44==y-4)M|#uMIEpNwRUKHe@;#A@^sUyQZ&Fdfl?hX?;WJ z*Fo$$QS;@b%TB_jhq^Jr<28t1i?<uzOuUJwdm@6c2i}_uX(!^n^|VV5Z`Q+G5N6}O z74L0$Z^zpoFFhW-cj6t0cM#qjymJTTjKA*K^q$+N{L{6w?8Pm+z8bQ!<h56_n)aQv z`8wSj@ASfum9O3JT`P}iTCn?zAuAslwDnKxPS^eEp$EKcAK3isMLm8#aCOUt!Q+pm ze%<Rr)$6XE&3)&Lc-!)eo_}9-`=gb&%=uf#obmg2uUz`;oIzzBq;AK@Y_Z-TrFfUU z7I`Pz_m|HPe7OGh{=ez@^$nl73LabW-0O!wx-jIIeJ7b_lvnk;<JP}_IdS7(Udh@V zIb~biICvx2z2fsMpk1$!^D6rHN^p|3^9uN{`~?1Qpcq%8v;8OFfBgygLezOBIzSh$ z#LtSK;K%b5@Bu$TM*+My-b)`EXI+IfAxesY=N=vi@9J<zE(gpc2JxK2OZbi{EGfK2 zii>AD<0nm6HIb)Dr|FS(It@SL>9ITzuG8^_00-3Sa2gX`g>>N`AswIxxjKF{p9AjD z`T3FIquxmzUZKN3)9XDlhQo*RKp3jSn`waH*`(uZh*P`rpI~4i(Ow$l1b6C#?7w-o z@Tv}P?!y5(IpMTU-%SF?L;XR|RJ=q-(D9ElD8{MYt_EEWCy=IRf=*{64PZPZUwZoM z@aRgO-bn@u&paKz>JgrPkq5$RgjBCv?-!pAe@4eI(HUHn$}`sM_|D}#{ftgOsKc8{ zf$@yj@k@0&8{HgkLz<p96Y!xtU7*wHny5F6!-G2hJ{|5D&EYhz=$Ws}=ZMaKvRyiU zLcnu4y6_1?YVQUe|1KT=few%A{rG2{pO<v{Yai!`@9Fq!b$Ihq4)~W2pO)ZLH>khX z`z55~=j-?{>G<#K`1vC_;GcTEqZ0JTb9lmrTXg)5%Q&3)rspOd?p(mryO5@*gHESJ z*S9A)SXhOyE4&!NsRQ(2ijMD`zyY0gIznOL+=Yu56_y2Olm-h6g~B=W7tI$6<w=3U z*~O*BbLW=@i%Ta3Ml4vosCd$hnG1?}-j#C-XDypS1ZFIlzr0u|o;`42PT`{BrG>K= zFA5ef3ktJlELgC3mVo+#30NVj3$};MDJ?GMkU6D`7Z%QZBv@Rg6Qis|Nh7Fa@%%+W zLxnue>RD92aAt8Sr&m_2SGBNwfgYPNdp6ITUshQBaQTb{I+eM_!NO&a=vj-F6qc0E zU#N2xT-=VQ*^A3bEUdD!@|k*hqRRy^i$uq>XDu#yBmrGmqQ@2$&rQJEvdbW<8Kvl) z8D(X~=$JV(<}VNy7B8HIVjvCvJp*!tGB8{U+Qkd0Wo7eA=FKRZCloI$nXzbgVOeqU zY=NX(I1}&E`HN;RURt=I^fFNC0)ZO42pv>7d;VPD0_hS6aKKRzsvwjsE}Ors5LKd+ z=PnZF&Irx}ly!`bf@&d$!i9@<$?^_l@+k#l=+Z==pgj->%Ypcp7nd$hCXzCP;1>nw z2qopgS@R%~1@mW?1m~3&&zRl6Y;k`#rDsv>E@6}+4<AuDpucBeGCH6?xjKRg|M*{u zQQWLUMB)F9e^jT48ltF*<~4erd*=BRs<&Q;m0v#}gVZE^MC{;6`0eCN($n0Vhl1{x zC*T`(xb+fvB7H<RWT=e!usRh%Gr)Bd&a#>f@bm;S!d3&kvjLtN<%y065+;No&M5sA z1cK{LV(F|X3m80`N7-Mu0dDkna}03uQ4>#Yl*fpELNo-CqV$*7%Q~AUh5RUw5PrhO z5~LtXe>wgwJj(tSMR|ho^{JNu<{9An5{$u13~&pB@IT88aJCNA^Hv$)DLRaTH3m4< zop{zpd5mD>vnQVQQ63|BLMI5aAxeLFyNvz&YLtPQ{5$a|`@7Kqzuo|U+W>bO;86oS zq0^MT(*VDn0Q%Dq<q_hun+~JkV3a2a-it@s-y>0;AUM3G<fBD-l;8=UiXhEV`petf zk4M?x)+kR9zV4cEKvf&OE040jRs-Cq=MDp$)_PZ;s}i^>fvXa@DuJsKxGI6G61XaX zs}i^>fvXa@DuJsKxGI7F|4Bd!eQTA%9sd0?wumaD!4BGOB4VNK)@_{E_@JZ6iue5z zf9*HrB1Y+Xlo>k`$J6&PrBO(THL&zvO4HU>EXvaLl%`$%*hZGFrZjB@#Wt|?7E03= zP;4zrzd>o*`iZS#>Az5#wkcvIEd5(b)0R%Gh^2o;Y1+z(<+JoUO4AljESIJKi_)}J z5_7Zk6O^VcyqJ@vms6UyG-3{xE~T`M(gI6AL}}X6iZx#Zpzlmd)7DPx2unXe=`NIR zVCe~zrmd4$l%+>gnvVNo8(Dfdr86kKfu--JG@TO0*0S^fO4C+QY!yr2O6lt;UBc46 zDV<5_B9^|M(zG=g%V+7Xl%}n!ST0L<qI3^RyII;q>7JB!vh=y%AbkU+9V~sC(l=6C zVCiF&zKPP!7vk}^Sxbjtt8I?`CO=dqGOQ5@QlvvY1>V-+wNR(kzeXJDlo~%`ziAc9 z3fuG$_^&YhLBFCP`=X>aOI0WCm8x3Jl2{`(UJPb{z+|0(HGYKGlPJGx*bI~t%I}yg zg@)Y)EJ0Gg3Z{eX-8lNvhM|YFdH7S)!3#X`!9=-47<&|%bNbtFsvxd}wbI*2<C#0f zH))Q2N!0f*Qsv1LF$7l4u`llY?E=(L>vu8TkyO8{#NNf?vUgEj4tp2B%SnH7DVa~P zBB?SS94o0mZY2eIk4S0tkeZ~LC3Oc$WWJ<+y@fVxCAC(283OjH+X2p!!Yi%X%jba_ zUMXl_Q$#(fJxyWg+f{z`$kYdY)3(i7D}@6PcF>h8MOIoFA?*;57?tuZMqJ;&Xb?6< z=d`ufeiM2n9_%w&QZGp1$E;faM1|$N!UtnL5utIOkQean6~6!>-y~KF=0XY2wFWA` z3<l)zP?y&9V>~X0SGcU&=X%Vc9nfQ$+Aclj)VArdEN!zMb8D|7rl{X&e?o|MJG9^M zNT&8n9&u_<Q3U1)(trSBE0JV+m*CHLpKpq9GMGb;eVfI&{WG|g)w5FNS$hR3h^!uv zD)-teo<UqucLXY<_KHdd-{t!k878T+F1Ruf7JUDrVebp)S`~D(Rq|FXokM+@1t{;! zi^L83l1MmFR0$KFnk7Y+ITZDnf?81$(JE~OP?a#$q%w-m2@Y1&J=#esUQ1O9P3c^( zxxS%=S$ZG)9`sH36{2}uL0JuQ<dIB9{vuJ1oikD{|6>Bhxs~)yQLD9%=)|_V%PTlW z_>ne@V$j%1YRKDlGh-HQVWrSKS>0i;pgR;G$H+om6&0;vlF|Oy4j<B}q+ugNB@_6B z%*5!>9?>OXCA{Z=N9;I&>_{>^#fb8-0VOkua;FhxtO2F1Q4S*t&0~p*vXWGe>#}3K zSPdxdtu)0D*N}8IZ)H?R&LqY^Ms^@v?3Tk1X9m>ykQBrvW3cLC`CL*@YyA^lgABC( za~<hn2W56arW~G3g&@X6Ub&#P{y-Tk9a6YFSx8dPX-5EO9n!wU!%oWlf)^5qVuD(p z=SxYwsO@Cs7<=Uolw~?`XMz|t<|)`D-@n+THXBjc1&)S3)2?r2+*q|PJmS!-Jd&x! zTUeG;JIf<k+HoFnYhNNlyjta2A3JY}rLj7gBX9$&V-+MQ@bN0EAL&C@!Z2m_l``$m zRbwntk{xN;pNm?n%Zp|8JXx&=rLZWe@B7}P@uP&@zVOI&#j7oKOX~MhWQEJEsHa&! zYgRPXr`E!(dL&pTw>ApQQ7lIrMzPR#$*;DOK}`-e!N&$d(-%Z3CrN25TFxkyZ<4|z z;3z39QwfjBRKimoN;pRePjZ0+G+YXoIi;`!HWXKuqQbCEb2$}tk}H$49a?WDAqG1a zP@Ab>CJ}@#e5$Aiw9~o-QI_&q7BP+9-K~AZT7aq)^^~HXAfx#PK#VtgWj9P<66k?( z%B7j(Ii4H)5mSs|23X51<e#AU?F?s*6z-^m7efOVqhaIF4zM-~HKQgP5#b`Y5_ZVy zK`ES%hDvC80oryz3725FOmacLGh7l3V0c*;69#D{+MlHjWvv1R3NzqdMcq#&QOc=Z zJWGrZbtN)kK~HEg21LU-6l5hp_c7?CBs4tGrKm01CjgV)W$Glts8mtwAu~n&j974J z|IJVkOVo0f_0C~UV7wVJU|!K}hqZ552{4!_aavJNf^Tg%G7_+JOgbmEy8$ENC)fpJ z)B(RUpq@qp2xez=+n7~B1I+Bv&VJ9-GRG5br<L%p-bPmm+uEjZ)_>zLs@U{4k|N>j z-X?ED8qzH&Zfn=Ak`x|^?i!1Jy<Q2AMsy1LvJmzIJfIt4#ERUkJ*3xR>VEVj+Kp}o z;$vKMS$|Vs&x2&Ak+!3;AO!{ZR8rH?4X|Y;Ox3frerO4)b`}>CDKHeAI$i5RjYO8- zRn+g)vFE<yU|ra{%3suu0-lsL5UICMT#6ecbA3|VZ@{Hlm~elq;~M&fP{RO|!sH}q zgE0EGUMpqz8A)BlRDM$X_a#JlKh`p6uuY>-XN&effF_70di(~!jN)MBnLHo|Eq;cY z-k#1$EtOGEFhcnlh;eO#fjsIXUDdXN05c?sdbtMg)&9UT&{>HLE|t%;r>II8z)LhO zp=WE`>5r9Z+YeAd88(*uspE)C;TvI++q@zrJVg8IG_~D=4ka(wUP0HlBsJ6EVr&D3 zq;6xmbSVo~j#+E+gYN@VG%dYO)FY3gxjaw1N6&bkXF!wmjJ|rtN}d5F&@<BYjM+Q` zTB&E8LH$(67@h%D)-w+483T9*EbKYv3usk(Mt7D$b2cv_sSjGU-y_qf)>KBzAC$x8 z7&$Codk|oF=573}Na76w9tIuD(*|+8HufeZ@az>oU@*fuO!$8b;cOodj-m-#`*}0O zOe=+Q9&u<3cqCJs#UoDb0UpWH#`B0<lMo@*&qc`G?7=*esrBa(r`DGuK)C^-Tx)TG z1)(Vweu0m7QfRx?uQs<cPMkjpov)oFx{q45&v?Y4?dK8r|2*Q<w)04q_70D@wKov) zZKbtWY%c!j>q7_$)@LONMsu8s$D1mATcIsN>=A}T>lb@P901+z$K*eeY37@N!4$$@ zPg=uk68swMCoNu-@U3LNr0`Nl0HX^o9VVNAs$uqI@|408ky-8lh_cX`r?g2-Qj-BM zgZsze;PI3;l))K(0uI$WrMXCuAfCyH!+B@zg}U50^=(>Z=+4Kssm#D9QghZ)nJg*; z>c_O7lZ@1;Cz?m9dpksc^&DIO=<@>2=fOMqCJtusahRAP1)90*F|Uw2B8N*HS~qax ziPAbMv2HS!pX!^$l33s|VFvG!!YL4>6kY;)m@PVDu?Y1)%J_j~pvI3vDo3?NtTU;{ z9tFQgwdqK6%W_FQ$pyE;zC8Zz8tOAO=$c1UN)hYY53uvY`g0p1vigIh?jx71WHSaK z{BKc;Tq{3FR$`DJfr9CW+{F@PvSs=*ifC`0AhU=plw3ycQws4}`7y!l75@#&C{sWV zzb6_{>xqJs3O4mz8`4AxK7<p?xB|&L%~fPyeLwKw>`$YaX&%e8Z&F+Z_DvZ#?K?+q zT1n`rsP0q3k3d>-CYl1&Nv>s{gL3%Z7Pw3gIi&SUcqV4lhe)pk$#YTaRU>&?Wc6Oj zQx4zTE0fpI2KLGxq{9z8;oYM@ZIY*6>Qyay8YR^xdnTjAILyG4tx3470^p&wg^ZWx z=R^rv1;oQ<?6Jr)l#x^bSebFKUy~h%A^><MW9cB{CGXBa%t6F}KNeYrG9ZQ=Dl-n+ zF*(yv1OU%ui~|`jW<5g=ARq?(vB)x%0WsuI8FEE2=-TQBz%v<Qk@1qF(v|}Vhyi~r zNv$mh#E?T}#$|z6mZ1m$p2-+(GG4eWh8#dZ4ESS_H5ns%l1n02I6sL4vcRFz<J=(Y zPG+DhkeKWSS-iA5F!1OmvcMmUEWJ#F9PTQ4s-*C8bm{dViy7#c?8yVhaO^FtV6K!D zUIw!Te+=dbad>GkS%^5{d4ZgS(KyYOBdKtybQc`s^%P-&+GpDHO*9~Y!Q6pUq{%38 zn5{gfxpK87$Y+k1o=;mD7quc*3XN_nMOJ|M)^MP-Ts=QYbtrs6cp&xKNS1@jc}Wyv z4qRNjomDiDJ6Tw(oRi=<wH~9|p;d``bdTqV4(Glku$j+OuS2<ChqiEk`%Xr=jR^PD zZeUO{!?gSWGO>70OJQK$#e$facm6O4laO+CT-{fLlxQI{kyV?d1S;f!J$NZIL2`G$ z(f$B<qU}KZnqXaY`pM=Hl$IN<F>1d-C^T7r0U)_{5=o{+4x3;-KpKlY7!;V2(a>}Z z5K<9zmV$m}i!^E|DT@TN54|A$V7dX-p{9SvS7=PYXf#`Wey+X1>YA4D%oCcy)=yd5 z{fxa!7HNJ4ymXP)pFv@4Sld6RMv-Scn9&E12{2m}V1~jX4J#3?MKdY@R*tkn(`M+z zxLN?px_=C#g&yIwuvBOM`={CfWF%k^Il1-PZ*;;2e#pz|Xh2PP>SaJRE+ms{vj>m? z^It%nkweq)A#5*5Axs&VDezbFV&8Yk;KYm)YeaV2dW}u2(&O7{s!O;d*xpO}cQmmC z)J9Ab>uKw-ND41-l@Q%!G}9C*;XLX_yel#8^D_fsbbS|0BIx~GXTWn<?sYie*%weV z6;Br>e3KIHnglB9O^T<h621{DI|J}W#RIpe0On-8H3<%=0C>g&ScrE*TZW<n;F$p6 zbiDb-3;;X;gbOh3jc=;~q#PgxU?JWKZ5beij0pfv$D41=0Kfx4xB#sipK0U@?HUhY zA>IjX86bs>2>?#V3$Y{wp{M|ONKV+F2#+^P2msG`01NR>Xv+X8WJ~~XI^KL^1^^xa z!Ub6%m6fam4a@>501NR>Xv+X8WJ~~XI^KL^1^^xa!Ub-SavMpxK?=Z8ZYew(@hYj; zA=$H2QAfdW?~y#C0UwJupHCx)nGXN}jFTtdtzGz%Mh^TV?b)w*Y?-Da=849h#HJh0 z3+Q|=(s|MpLD;ecIta%pdlCi1?m(a&M|s2c(44it$+Ft)n}h`(yuptowVw9Xu@%01 z$uK#4C#oGC>Df`jl(G*c;m%Ii{dV7~p)R33Uk+^-74H}2&E#uxeTOHAeGKf}VGmTw zK7$QPC9>cKxNax4UvL`N!!;|nH+?|o4pL}`D0`0w-&?g(5Q3+O%-e8#<2tSO>r+TM z=qd_Cer^hQ_t>B8j-9~(tx`Y1ia}OClvFT`YA;AFy(Kfa?r2{Z^_;bDib`su9GMcA z#40&#!THU)8Yy)2yuD%*EleZ#L1N3X9Ks|Sh)l!MAhO^?Yhr!Uas;I$7}?N%!2=5W zQMy)c=_9EY7hG&JyiOQtD{3OcZN-_EqQdh&AV}hA3S@I9S?y$BS7qN+Cy9*=M5QlY zk?bs(_XJ%cNu=qR3<ko=i9*subhMRPA*&Q_I@?yO+(IONpfbdBBjdS|^E?Y~1SdYw zl_ZW%Li^h2S8@6i9KeuO1dyIsrMC&x9SOb<2p-gXfU(gs3-b*l%@~GIh`v~>)7=kY zw2}b9HzusnnF(?1B%q{L$)RoV*G9C;p=xKq+hnh-#5N}LTBOi7=cQ0>2PM+;0=evg z$V98`y=Y&34Xx6vzA=xD^!%P@WDFe_>DN;dPm*5A#(v8qPWSsrV9*R*2A6eQGv*=2 zkJ!Khvt3f{2~MFnCf0&bH9Df!8t@(~f03AhWX812?%7IWp~i^&NpND5Y)*sd?CYv! z6_LGwOQ8mQ{&`F`50KRXln8i#SmGKTnRG!I9Z`1SxSht0*(9kZk{&7|*?a5Dn=mS} z43i19&$os40DbS!-aFgMj(tr#ziXAqW2V?V3?LYRSMg2T7SJRk;LWFCm>+?r9iip7 zzMikFD^D}5mwoqn&ibY#Z9&yh3k|8zx0zZsO35l3`J-sB2!X1sYII5z>G^LYz!0t2 z)?(w&Q^(F1(66MlEwjIeP|(qP(Kbs9Mj|?(g)~zN)rgY!%+e3(JkBLYGKSE3rMeTH zWj3+(AL$mPL88DKvHT0DhbV`ltOFG9zVdaF__3$XgT@G$ts??fRds=|zYd+!Ah#Tq zRSb{=IB@ptRm2u_g;b^8J2sM$tEjCqq6#`%Y>>UxKKl#Rl6cmGUb>iv&QjD`)^P(d zVjE<Y2zEIjg{n-F_x<u;V%=JvhAzoOm(bB2Bz+gYTHJCT?T4iIjAfEOfk6BDXYI@_ z?XTP?t1ZdBj9p}H3#9N%uC-K{ED#+<xuuAu2f0cPB?AAS$q}Qu>WD?I`VuG0@Iuss z<01olg^q{;@w+vC*BxxMAHnH5_T;?#?G@)?8_9a)kX3SeXxBNQ?$R!N3e5<?bTjY9 zUeQEoH27hj^E}5Dbv90#)demI6M~{1573l=)0sB^hGqvjtQ?0u2hDFF?c>&oaE>t% zV3Mb;?(7(Bx=9;>n(m)24e949eSg&o*Bz)4v;*of@^~bBr5UD|YIaIyoDQ-!Nwp9H zhvq22a^!iik2Tws6Hw2~>Pbocw-kzsirPe(m=eMES}A;I0Q(=9p(OQ`Y=3<h6i9Bl zMX|qLrI>MoL+1Fb+yx^V2iaJDgtj>*2kfu!V7vyhKL_6??S+5G;{^{WLtL)X*BP%8 z)q#o?^@6>!dy>;oj%a`K3q6UxNk530%wBO5G~ct=6J>TMJhTd@fI9?rKg_U_T_t;4 zNxQtK$OcQ<r(`vKdn)*dieweM+m`O)QizO+d*WL$aN(5-26>15y9C*5se?k=Ux>nn zRim8WzUiRf(;)7Jh47~y#wJFu)7W8952ixh>!nakl(HL$IJS~PaZx>Ne?ID|^QT7b z&tWdxEwy~wcx;YjU$lFUeL-Dtl)9JMT1;mc?|i@MjL*Kfr-lAnMBIyLoMZoN-yHkL zRdei3)wmJS5e;xi-iGo6lITaLV`3GzhrSSl-Q+$VYEULIA@_li^<ce)5xc#>V8IOS zi&&WXP$FYY7|Lgf5jci^Q!6%eI<~@|MCBG&i_wCRC1EB6<^$FQ7UVFxfji#zJnT5{ z4Z4#4Hpa9$oklZGE^0~Y%&-8b{43d8Wq-m!(@2{d($FyKV$eoIk&S^Eot!f5z~~}h zi`#3Ih2ldWmB<LR07}8y<2gGzvclR5J-mbADKM7*yD2=>z9DtN9{-X5Xz3)*I}~&2 zSj7y35i0|0%#LEAbBGPnJ=%f8*mUg%)#B_|K8dNq&}gzJ`q+#0Mse*eI=P8-#_x6r zTlUe2j10OJ-=Smv=#M~q73320hpe9VP4cN{q^hrTCd;9tt-jC~9Vbd*lPsRY9+*{* z<hM#K)i`;J+bfI7+HAq6x%jsCkp;Bd_ilM{SxNE2#bwfa_*D0inX`+7(mSEWvlq=M zT|8UzR4bluB#)+eVES7f!Oqe<_<EM*0Tl2y2Fv6-y;7u~S*qIBSq@cUyq}Y*Y8{fN zN%9<!s&+Uf@vs!}4}+_)tqXFll{~eQXP;D6jhurFds}B-Vw+SI#V!&Q`Y=O=$HMUU zQ4!$Fclufbn2jS+<n}2L!`NBMuQ8v;eDTjAZ%iAbQ{<}8-Ad|iig!RfOOL~9f9}-d zX2dh~xCwEG9v2a}@^~i%*erx5!PIjesYPf`w6o&bDZ|)SRXJr5PF}TKRedesT>{v1 z@-#3uBSXbNB)u!c#=!QV8P!;B)uS~iR0Wrf6@ZyQS<u5aB&eX}=X{$_ptDKR@6nFC zZ1*!i64go`T-vI^@(9vF@oKPhj@&!cOpXmPfqFcrSsfUYk&G0oUycm)vQ-V^jEfmV zxrUcJ$EZ@5fMgB&1M@Sg5-;j4xg4MMN3#JRxKxDoIIqKVIei%n5q-}A*;6HZPRX7h z6g8EaX|MbM?Hu@Ts*`Bw9DoLwr4q5+jkdTMzpU~GMOTK%K&TXP%Ue<7#4?JU`l=ep zW<RIYMUD(b*&4J^XAVw32@S;{D#C=&Aii2O9(<$yz$KYtXIL)+L@EMYDh6cgPhc@t zfk?tf(;yUBxbfDho+!>1$R&AE!r;A^58ld=Z15J0!r*P%-_9lR-6yH7zA5mGth5y5 z*EBGkL*M4Wt+)o6$a3VafmKHOTD%z?mN^IBN*AQB!`qF+oY)kho0bAV-SNV8q2gJH z_P~qHP9#s}0OTf$Hvx77-ky}WQ3{>2+gE3hJ&p`-hA)E6e1{Y|(yZY6Te=dNo#J42 z?U0Wh_^=JRmaP`lh9xA;>sm9K2Hyp@M7}6L;0t|a$3a?oH%vV_hN&lcFA<ymQUv>l zj0C4i=LhL9o7x{i$**d@&;@JhWM(Pl2wnLIecno^p2&h*Wk!6GrB%-UU_`{<S5UIQ z2pwq+wOUIf2yq9@6IH9pSq%?_7zcLodykZ!h%F*RNd9~1D@*wRY%f(zBgm#}d}}gX zubS)?0ZP6#$$W8+57aNlhOq*0w!e$fc~JNopPJ!9<>x8;eC$TR3=8_TGKu(evx>8Z zy)b;<xM#0VbxSQRa&2xpEfxZ5ex_$HIr3O7x3uJ`l7$v`xG?A6?^E-w+YHnoZ_p!J zjhKfb{yjLHB3eFGvifv-J~h`eI^s{o+91~fN|%%mk4q2V=fEPPD}49bQH+Jn#D{vH z!;j4;pIWDc@5@woGS|oFeP3<NvyXfqCe+f&pS@G9Qb(ox_Gx~#Zr|5_^-#-xU$16= zb{&pCf;WI-UiKm1z9XRJi^x_V3UyV-rSH>xsnKvpbrjApFXhLNla##5I(x;l;2}IJ zoqB+-JAw&EcrfE^3q%^vt^x}t-@aD$)V`zYsg}LIUJc%6^|XCtLv~|!LvS$o!m_2e zZ!=;0_I-}ZJNa4~eZA_`#_ZE#H9+cp>3OL;84qpeVQ`CdG5Dzwa6pfVZ<9b2w4&*+ zd7da0$j1n-!qRQaL&(AO+c=z!;C~~~viC9PgRkEV=WDc*P=hWj24M~zIj%aFYk$%L zZ&g-zVTon0XvWy`sUM!L7VVW^B5vP=#p%U>S_=mtLmwB7+N)ylT!KWX6{uA}eLEKf z;h$zA@MDY(JbM~0s4tQi7Y~wS>)G3K2KK<smZBgxRNJ<fmWw!6<QD`6fe$}+Z-%nd zU3Oms2$Gry*S&^a5?F$2#zZpiqOIURHbT=UxrWk!l(tgcRYy}a0SyOjwkdlruxU3) zQq*$333NLkaK<v``0R^z`4Mx^u`i1HBg^2a&4k~&KhMEVRZoLj@&qui;!AtQ5kM0D z3>)lz`2KDmt_4Q=5y^o*)b8D8AGys_r`Gz^DxbP7bi@?;#sY5oq1jmme>RL3!H2aD zx4)H<g|WZKzNv<ml;YQ+og!8xVuQa|tNrzDSbQpCvoG|6)gF2Q44_OF&blkVKpYAh z>|)>4ZH)s$=!c<M`4ym8fQnwlm9g|i!)|o;G}k~8_dc*GJ#+~!{gewaFBCHA|0a48 z&B(dL3CA9@RqNS6y>L>?KuEagCZTDsu|3_CNUl|eNt0B^=<uW)TSu#tGFz4GsFYpf z7k6@-XMbWkYGwC~0PyTp573%DoPH0MJ2~F!(vx&<nwek?iXHBzI);PV`Qe~;o?Xpn zelo;1>Bft52zoKr2{aQ-#qOqNVLy<mVjj#IzXz;-<k>sXAD-jD0k%IpHpAEQ9r`HZ zi;JzaSOQ+?TM>2+9)Fpvp27HH^~m9gunzlSS0wRMzjx0_`&<2nOZJg_{OU1`{Nwgb z`$P5UuaErVu{?E$zt>S;)mJI@*AFPPgL4hKt!&`gDogoNbX7W*W4HR(^gml=Dt`?7 z6QVEs2cLM(?~N{9-)`nXyKxsmQTzMUU1P(+TU*Df!TzmEWD(^16-0VMJSAnH#v}vs zrJE39FGf8Zs<Dm@4;?U0T`@@T?k+vv^b+i{KYXiS?H``h>AX70cD_kX=r6?A>Eax~ zF2+hBu(jC9xj=UYy7K$qyU|H>v7|3WaK$>-6A^>OH|)16(8!zsUBA#s`P3h=!%CJ! z{T|zCSnkHzK2IRr^8<{TT|yo<5+eh50TnahL1oCaT>`dMY7}n+x?!7=jeQi$&b-t! zw4)M9_n>PO5hqe2gndRbr_f?p6(i$BX-EoN;O$YoKa{@W3!M@D>Ny~Ntf+^imP35q zTF2I{!&EG~X~_zCu=T3Q)~mQobJ=>;oLsN6rD{~d&AHGwV$dP?f$W>aK%efi=Y2)( z!5yf!d!i(}Axwz49;co7fXUCPeZ?bg?GqkxX#031N2{j@iM9%nwe6?FT)NK^Ov8pn z;=Y8Z-2{dGd*t6nOW2zyLgZ@8R+<{@uP?V~rMo~E1{wF!r*@CR{(wYo;vQGq{4zzR zorijI<}R>1{JSQqXSA<Sn16X-n~IC)ZTC+C;e`UW2VSR3#VvFj^EPl@`El@2IAHPY z#W0evT>ytdj$ltCbWtq7nXh{>_e%P9jkptAaVL#r(I1!PH$BP69j=*>PSJfW83(kq zeP4h$noO?fp5*O*bsxVS%q|7nD_y{0H~D)Yk{6z53E;q!W}@##NBYI!=-DfJQ4X%o zc)o;oVh?f^>0&}Bu_0)-V0E4`nDzq1Pi1T?GOa@-5FWZa4@cHRFk96?`IPL7ikGa% zb_H8$>!M0FBpTc$_*0MgBG~V+Z#p7lm&v<p=_{dT5mjx9rZ&J*e|N>*m3!N?6yyJl zeetvo^w-kyQZ@BqU!_e?C2<Ele_7n-iJtYlz7vDDN__^iot-}TBE)lQ>Vw!=PTpuv z+IzMQVlX-^ZP?%SM4LW0j(64>*THEwZcNgyWG1>Mct5&@>C^j$&M3bP9TB|Q7s|2N zpZw%~C>HJ@MXsGWgsj8`X_n;)jPb;GJbYV*Z<e-Qzs5KK=u%#}U%bqcDu;7%c2<P- z*#&$^MM`h4{2M-@k|O^@`=kMHi@jn#KJk(wk65KzbUR(_!S<z8`}i74;K8{;tCao2 z<5g6kDrP<-y{4!xS3vzvrdzBF;LKw?ku7wr<HG)Ltz*LJ-(uK4l<M0|A9K-Oq55ec zJ0@c@6C0Wit+Xy4FZ312SQC`jDe9Sk`Zdmju=9ic(6PBn*oA{2+Ip1CBXT8mL@wL! z1BAAs=i)#bzSh3ck&KSmo5s03L_`NIwAVdC0=mTax<Ozr)}dG@Hq(wdDlm`8M|M6@ z11VO;+{`v=04O3htUpUon+PXxVgXSDDXc3&3LArL|DC9n6-jDYkxmU5S^tUDJdm2F zlXB~%m~n1qe3wubm@7##mIG>%dH~JDP$I^XTrK0c6PKaRTq%-%4?9MJ3>t7O5MIT4 z3{jOw$tz!vZ~V5<cYaMci{p0AQ-{sseV~NJ3qqU=h;VGnzrfNl&AxgrkYgk8C!t3v zG9Ah?Jz9#-*d(TJq%D%S+FqGQAcI0VS^5%%A}y-*6`+g&Z3<NtaaEF391}`vKiqcs z9-kh8KiXd&OPk@?iH7csrY-V^Qhb|fIgDMnq#|LNnq7+_bHDEaXi`c!j>!7q4iAy5 z9Z>{i$lz1vq;UUU3ESA6HM#1jGa%O6e;HM<7>i5UIFf^6xm+}#sUI<=vOzL9nw*W@ zeDNes+;EIRN|fiRBd0_%kHiXzL^l%JxQ`W|O?PnUkOYo*cLh5ba7t;DoX%=SV)0Eo ztq7s9w4IC%=xV?-*<3v`Q|eNGNsg1}I02Tr?3Ca@XJd=I0sGdHc}f<YW~o!Mkh2*# z>|pVuLDyQf9_-OBN+e?+j(s?TCV0B6vjXT{Z2H$=j&4n{SDs}1mX8)m*weN@dB{QT z)Ck<0%5dd*KE_Q=oEnVD#Tpdmb&MN3;0nAuHRME>2VkDjHO**;%smpu-C;?6HVfHw zZ_9yFuMw`4-6(sv;d_sKFpe1jJXQNs8)UT}Es(SEvCy+_pef;rQUJpr*Fg6NvQJ3f zo$ydlLiRSIKq@N75(!Q+2E?;DdL2&CR=mwhxU2w}I70;O9sX1eeifs=Ls4JL1#Uq7 zK5*Lt+(+~7WEA%?ib)iSP=?^*D7urJEaI%r?>P-O38&qAv7!tN!S)6bNA@;MVPYLQ zwSLb*1V8#yPvwd5aHDyt7jSgo>-AADG%ywzg1dRtSiKBT_wo`=dF-SiFZCEh-%IF? zfg#v#20C#-RREnT*+)f0niKO<u^Mj7gD;X=ACcnf&Rz{Nn8r~#tAPvx&7FHu=zVdo zKee97?hT+feQINXw5=+Vk%|iZo=-uW&bdKoY`j;MC)%qX_@Q$m&NWh7F$qg82kATm z#~ttt@h)z_VZ}}yT6}~9i+W1iy98+3eUrM5^dlFU`#Dk)fmGlfl0PBj1K~j1kw>00 zHV8L;^1?+HK0VEI_(JC`_R8<^EwMgDQ7rOs5u2a>g^^E2VUGPIhAbwN&+J`9AKPHC zck$t4QXjr0^|>E{BZKjXE1y`pJG9Q*uxh3cI3kZas1&YdTQF9Dlj-B525Vl2_H{K( z$W-5S*o<6cW0Za-g$GNu9eJWzZYhSgW2iSsSW++>I}QN6h?5l^g+V<ENBlq`<V>SA z9*46VGR5OE{p#l!rR9#MtoHteS`Yir2P`-1G+^n3_H!TZgV6CfL}RsA(m6CnXf8%C z#%otd1OpTY{cvEyk7kjOoeHL=Y?z8r6s+TpB)G)9jX{b7FEEFtbDfmETT<WLNzDwG zxdXU`ijprfe9Xex`|#bS6dsd<fg*Vi=tJ)?^p6j{1}dl4%ePI=RJ;d))Hb4%I0vcj zApt1=3)@NG)T7YJFFp10kaFCAfaa~EB|LO}n?EukPKpRih}{$MY-&x!l8SvPPouxr ze)xyLPHm2ikNbP=m4~ckcQin>nhY})!zNKZ3hnmP_1d3WBZu<@g+_RlSV!TysNaM8 z6q~Re7!92iQ%TRy^{P)j%@rNTcmGM#aXgn)WK!VYQOilj*a!LSLxUnaVhhgFCgdvQ z)7P&SQd5~e@={OB>Y@Aqyf1Ci=QtAeL?4LdGF<FeF0*uO^ULlb?~D0m%R3<!`JY!o zi|PG|4wSy)G&+weWYcKLfAGlo`hs{OmyG#lm=YiA=-W)2T5!=YE|SwJ{IbLE(Lpnt zOmV}oy<3KhRtC4s4PV7gT|r(H&7MZL>~cpc2i{K(^*s<Bmpf9qaHN=%$4UK1pG*QN z=HY=<!Y4C0Qsmu{Bb5(Q#2a_ZuIxxL*N$8~VBwxXdq-*vrbZgN2+4&ih3(ivHle9= zVt;^5tK5%rvk~Us=QjFLsrJ=FQA+#AA-+$|@V9LyKa5*3?Z2>7i!UZ}@qwg-VVsX4 z4VM!uq$=#|r((DlVZAsQ-}oawvE=ciaoAG{Ct5h|t2&tq&U0D5ngM5g9|$dzQZaMZ z$yG6AzDd6<LHTmk7lUCHN?74N_zYUEI+n^aG~m6n3>k829R~h91x_QSXrUTQRZ<VZ zyOFED<|I%mklHM%;k7^sq#jnnFRo&339SJDQ~7#=tN)g(no{MeukhLSi?32fDlXZ= zDI>qad?#k`4FHk>0E@Ju2*7KTz29SO*I?TQKr$h?WnrFbh3Pm;{YjS>aKxyF)*}l= z;lA&nNgY>*PSBJoW6RD8dlbn2-j})!6aNw54Ubsvfy)o;Ttic;=PamwjKd)^Rq8t% zfI%(?vM+)nRV{n5=kY?V?7fhSK*|2pk4?o?S~g^YD-8t_q&^0zxGbImDM*aQtNyXe zZq}~si?X)`q;@FYJ)G1<Ke7L2GcbLr7nsNI<PEEnMVjt$T_m)Tu>@xWZWriOVed!w z?jQmI?>3Ob;#q?XT7l+Itwr-}U@a@b6HV&4Q%5|Zi{930VNJ4=Xa%s3<b~aQp+@$; z4=X8Ww_?MQtS4x=QMrIl0UkNHB5dp?+(>yg%7|e17Y;6G2-89h2|VC!Aikt*s6)t# zqW;v+z)&h9hk*{e%V^QkObzYS>EwV{PNzn~y7Pr<*&9W(@Jkk{)l?dnnp|{+1ryhs z4iLpSz+3?WWPa)Eo?M!(NIejSNq2Aw1REVv_5sP;j82xkxDoYECTj}ZMkb1CiM~r| zIZQrH^(7w7Wp<uAnP_i7sGE9tKFPU&`L!f}!lCX04!k1rj+*M>6*&Qalf;4WohZv+ zjJ(fqH{|15;8fYW<hi9jA>vT#^DH%s4ky*TTwFTsjSr1BlZDZZ!$KUMz$qyK1d^bI zjBm38@udGCh3}DS$^FOl5f{lQV7?DE#%bA-$(AW}Q;@Ac;D)gE2NbzM%5F`rKb%ay zBb|KxVa&l21Ck#J_0rcLQuevz`oqm6JH<^a6D&P)xM57!=fStpI_4Q!u;T;A!-DI2 ze0BL1Tol^vhC}+~U+Dq^UygLNSGt*d^Rp7nJ#cS!Q(pMd99oXRQNfPD7zvGo5rm1H zS^%de07BuiBFK3Rv?`R3DrM};Td|QYdC$?}O2tUni!}lULjlW$iw*P_87kbQAtRu{ zU}Zn9+3B7R{17N3Ei#H&3HrV!d%ptz2?NF(4X6j9W2tCSGjpYOqT+da#ZEaJ-q2pE z*t;98PR0Dml$SA3!mzN&pzkQMPjTl7izit4d8}@DRmr-S0U5ueAm2uxtb1YqUO<zo zsAg2F^G8NHFa#r$%mS+Ot2HnpQO|DXVr@DbIw1zUw5Wk^wGPJQg&JB$&|RlizXwKb zr+(e(oPOQOm)a1(7h6s=6#NiPEQ0Kt4tuJ3xzt0E;qhLldexw4zzex>!i3JKHh2;g z_ktp=J8+2#^?)kGPEBBBtH`i`ZoLPt8v=joZk*xus_6x<b40E$wK-wPfeofX9E_Y6 z(Q?n(UORCTDSL4c_W~TnyU2R_J@rHoEWmdJe>-uW3C9i&^7AMc^`-9cg}%onH%$&5 zPcCczHxoczPiiF@$3Mn48~fCe$Sf<sGKdEDE)47%ePBDKJ|pHSeO{x!kv%&+QAJ(o zjw#<_RMWacAJs2x!u_GO_|ldwL3H2~1RO;l+C@5Vx&@BL3edn&rEoI^!%7fnKL-x7 zU!d$qdG_ahS++#kg*<x=Wl!hX)jYc!W#{s2nX<ERFa_ej<JrS0yBE*Cp0cO%><XUU zfIu_x>>q);<sF_~%(FA7^cVkRtff=wZ^;}*294y|>!|d0p8YPBrXx#a-@>zRqwGKM z?A?^z#7kRwwnEvfdG;?ToBl@=l#aP57&eHq=kn|#%6@=n*YoU$DO=*%GbsC7p8Xon z9!%NU$ZoTzI4>AMTebJl4mxc><D~bwsLxte-jB9vZ-FE2ASXY7FEB8#=HprswvHOL zS^q%$u?b6`rudV;JJ5FigRcQ-8#s%0=;>!Vj?)4)Q{RoJ|8+%H@rfmN@_Qrh4==Q^ zlM1@!UkA#vx}ABT4<U1OWZ-d#NO-R!{%EhUTz=#`iTXUeGKbEQ*>aU`d_*j@O+DJ$ zNB76zDLL#FB4NX_haKws5gC>5#p(IGL>bR2B$su<_q2`2<;stOt+bL1m%|B&YxkqZ zBt5zkQcRaNUqqo~>0BHE$y*p9kixxI+--*0gQl~ukg#{8jUai^<wSf~Mw>}WpN!g| zk8an(^XJI;zALWv03Ip{zKE-?V5aE}E?*!02SS)T=y!iK!~Q(@WS@)0wKv|xczO_1 z3hNJc8TT7)<r`Q*<BO_tgqVr3&xmtW$2-7^OK;=HO5!9_DV!n3PGfJ(_b#+WX!>tG z+zNc(ee^3={E`AcF!da#lO^drq5*7Cdi+}nyumnh{sn0n&a;c8_mIPW4$YqZ6uX;D z*{fLg0@pmLb_bQFybZvkynpoKMN4RJeVJ5S;c7;X2rP<|`#~k<s86}vsElAobeKK6 z!nF!<3I*g*=+Hx_9&Tj$Pr0HxUIRjQ^>!s9xEe!y58a!}sJ*xYg0BrRdmj@kqUBE9 z@5Ro<-tuqQ51HY^ENZJk{=T!83^90ArlYM9L&e}hcH4kmW6%T$9j9&j6^6?3DHtY9 zz;Cymk2Ala=}$@hG8C`+A4Borj#{t^W<wX<_KN)-(9YFS3rpwNE0-W9MV@m}J2&Ux z5Bnhn`iO8E9mioQHyxF;eeKBfj()W~osG7tCbNEhR(%ln^gqLG3T+IlH4kH*U%Y5Q zRoJWfH&ss8z)xyFY&47q_8pJC^4E-&?YLckLM(4$#6eHH2voZK>V~_A10nG7IFYNR zeiD*c2N_nLGco8N1P-<~q{vWKD``{?i1<UTW_yL1nyMb89~~efxYUjhb^Mt1EBJ3a z@aw=*qzo0)J@km*(u(U-I9&0=vx!*rk3FVYS_6?4mS*@hbeY3S&665&$MzsylgD=n zlo6r}@fWD16G>c_$HxmM$?nGm#3SZFB*PMj1VJ4>7(TWGSMZWxX|RgCm)()KSJ2%s zDia({8;fKovD#W}G1K349N^VNaXGrC4u8s;=}+UmbL=1Dt_k4!X`Y5#(povzsrXXY zyTauRc9Fw4m%#N*?OwD7D}IyQh&>8e?Mf%vda_OQpMl}>giF5=PW=u?k=+CTfV(<a zk-%FZ-)N`b6V)A~dfhR)>>l{RQo03hUrlOFcSo!uwHaS|k=!fKvt4zPHGO;z1KV;C zAGq_~1BLE6sx@0k?PU-4C>jIeSzqXDd`Mn{+xBPKTBZiKoUx>7{3!s>u0r;1DZ3u2 z(}?0;K01|cA^jJmjB7kuNrigy@1%D4A{yODN|(-D>!2%#Pa*S=jbjUzbqbt?R=E7o ztRF~fw3Ve|g2PwKv5D;Wz+jZ=H&t@A$8pu6;DPXie5NAxzKPdEOFTyGJ66w1+>evO z3mv#yfP?Uryx;M?zz*zQX5jiy19mHvZ0u0i!=Y5X*#D+wFHT{ixMN;}eQ7C@E2497 z|Gs=@;=2G8tx>`~QM?heuabQz;N8cH*P%GhN$Pl6EMKbhZv#M?&KX;@NB+vb@5{xn zozeXO=*NR-DJKlQ7`h$T<^Rv$8yqa%6?=tU5wD;jL-uI6y>cUo4)%v^_U7UEvz7jk z{rLokRp^4s3e;Yk$NuY_*fPWu`$;J8v{#m}^7u`M%}y#zf2i=wdf`#LFpc-v5LOuK zjUVDj*d@Y!6RnhL^Rk#x(2Yav7&ztfmm^bPCve;Kgjw=_YJc*6kbxd{v{wv734VbN z3;T#-DIj}LfU0m&4fm@q;(pa&p!m+#V6%QXV(^M^Zn0^oD|d|-H!c~B#zO(V32epZ zG`Q+{ZL4I*N(uJj1O@{Ah+Ja)V|BM3r|{TF$BCL92Vh;WyHFmB)d7dbDM@h^>fY?e zpRM$V8uxq+m*PFZf)pVwAvOSU^yk}%x0zEm@j&&V$hbL5_WaS;*jPx|^U5EAj!jVQ z&A-51Scnq|E+2A4@U0JoN>0ce6pD3)@Zb+|<5KZg2#hwI<!p;9_A(NXm8-zV#$2op zCIEb4915{tfo9XiWdDXOE+yi_&!u3Fq&r~Zn6Q5!?tu9{tx$R&Hgx3d`otx$e}WF( z|Eg2>;4*$7oPKwJ?tfL4o{as9{1aF~)$0qdu$)&{i05Og31)w5g#|a3R)`m4OOVEL z!QBIn?^J4MWY8P<rBk@g3-JS|nj1}ihx8+M8+go%{Jd=@^i`cSV>jjkGSTfTEq>gc zp{s?TX+uy5f=tM-B8ocl=%U>>aGyLM#~dI<qwJbLLu9|>47`row#?uRcsK(?iGkOF zW4JuQ`kP$f#|RZZ`10^r3+{tGifc2WR@0J4aK~P4r30YGV{}ak$DC`i5W~4@)PeOE zR^1KdCuvcp;)JT~kTrDlA}!0*{n+;Tc@)!U3%+pZ9w`;2w2t20W%f|DNlF`K^)@cC zAasz)dXCnNxCkV$k7n_Eq0Aq_oe|I8rkW&wFLVCv70;7+!Xqto5t98rrZ18U>p0d; zc6jw_%2lgL)lb%OmWf}Bh(8(ZiyvfQJF00XasCxJ#~L2#vV%J7JBjg~zOzv=*b9aZ z8z`f30dn-6_>L~M+3&3`OT(<zDBYQU0DHbh_HmDi+{5<#zsvc@@&k*Sy|nVEvRA&u zngW@#`@5qdZrl_AjENj=Scf={rwmQt<Ad7Kk=l{MrEh2lNq=z_6Fyo3`%W#C;UTcr zC}OQ5)}SMLDB+H1k#c8>k{b2aQ(LB3r91DlN~sNPZPDA2ypLt*kM}NbPk9mD_nI1} zb_B<>Hkg-8lOp&PH*allA~l5f0~*2YHMJwf_yN`lwH~Zv)&|3L)kCZWuPGA!pif6! zF5~sL`Kt*#hBX6b^9=S$6i%7TPd4pk{!QXOv8;YDSzrHQJ&6uLH?R(P5d)ClDYRGo zg5vzp@oh|<7z6m()wv7-Ul8DQwxW^}5v3c3wWV8=9riA?4Ih2JZ?E_nL#vju53d>` z1T`PlH5jj0Sh1f=!ltPGi5q~D2a}dqTDEA5{>TP1Tz>8tybnvtEEtX8@yJYgz4TkS z?9*`eJppW^b*%0>>id1D)LwZL@jwh=u~2?o#w`r|OzGIfcX&)5QrPl7HhA!LZsPkp zZ19lZ)!=WpeMH~i;p02(43&Mrd@WjEDryb)ST_BESc4QX?C8hPeE7}`9?LjZKOMf& z582S?S|@x{Fq^aAlVlFB_5oH}>{~^AN24wNJ=v<0+FXQmI7iD#!&-*v7eK7fFM+eK zb7RlLzVY!uWSk(wq>U*9j;~d-1AsXgoU^Oc)~4UAl_I5>cUy3DW2VoppEy7kQf&ww z=@@)$3whnN_ZU$!GHKS$q=ITSzJaiZev9a<m~qLaz)IZ#k)`?9q@JzDjC%?&ny|3L z`!znCK8P825N2F9o09M<9%gnp*xHKkJ7F%_bZbpax6S3p*iT>61eVEW{-!6A<AZsA z_$?4HNiBMpBu1)5;&cCwi!Tcy_O7>5CE;t7$auJnAJeyMG@H|R9neGEp2=>EWLV|w z_mL4gXSF{u8WxIC1;A5>4;L`SjR{-Q#;BG~-p0}s%%_gIfaMRT`PEc^Sh?oBUsbxC zkJ$-me@nUM;v528j9o<C)CIr(ExG^-A;gve!ecilW3v&vWWJ$mdIyr1B-#E9#%DF% z)1_ZewO6J=r*QR?ZOz0%IPAk0E#K2e+&FD`k|s!h*q0bl_>EtZ(sd9>V)2%Tfy{o! zmT4~bZg!xEpnV5M85lYY-`ie6|8aU~2$Yz%O~~!WQ65%NV=&QH`LN?XB8zREe4};3 zl?J%oQ!V68=VBu%I0Qdo!<V9qKou*zPcTU)zDGxY(}njHjH(7dt4S<BhO@M$G;W{x z&%t82&wPbM_>J}eLcXuk+D_-Wz4S4Us_D}Neg1Q@O}i6miGCFcKQ!}=whp|+CZnVH zxW`9hbf|fNj%4k1_yPtW)Zk!|U2%sOiWM=wDm$5l@5r4vy3EA!qyuM&RxBQK%4g+P zoV8azhMvf+fTux5Fs}kmbeKi3(xd-vIIjZDe1Szi#sVA>#wz<Q!iv4+H^UKn3^x(C zSdjxq=wWs}ZP;=I+AV1Edo=iPC<poY-oqI@aMC}Myu0jAd<LzNvUlNE!v|)nKgf|u zw+o>-M&v6%$~{|)F?laYV#1*@nc`n#!o78S<vmml?qP)>b6R7lpyD};@rN$JhqfX5 z*#l&$d)ADOqv1KZYnEf2>_HUYaxKR(4n?yN#Z?!IIuZSmM>7#U&!hN~Y&jO>gkVMV zBEH@&e<^kY>Pp<#4cnB+1l;$c(bx&QU4s!ScjFHhO^vt;BL2WW!fK`uC!QFC?$WQx zpTe=sxNuMFIJIXd+>$>Ly90SlhuJS0#`d9(_ppf~@ShjlPD$)j2wQ35ijm{`9=X5l zYp~cKDM=Yy2_^OdC25pyB?7TENczJme$^BX+Rm%NPUmCQ0NLLP+Th3rJ6(*uiKLH} zh|Pc(4)x+G?Qg$<l8rU2zi7V2M>wqO>CX1|^jj<+vZ>eV4=+!La%#(7Mu*bWL4GFf zEiR{@U}eAA#Wp&2XwL%!w+!JZ&%uv8d!pL+sK<wi1m8CWZ}EJrL~hSV2K+?qUaBWC z<=Hm{I}qXrgosm=^rc@hEz)`bfZ>FmKG`;$V&DHdF)onR2H%GDD10%tzS4h~J;^<D z2L1+)$r|CJE#35{?@J|Ywb?8FiWu6LFhp_fS=5_Y)RW!9uZhC=Fo&Mcp{2x_zNz&A z5cD}T#7OFMC~ObJfZr#;&9wW_P&SupYqpXFA{U`Qnn8=Fn-OAp-@Yw;+yi!{`BMs) zy0yi+Y});pYGOXcjsx3X8x5qUbqV`|-&XRR)mBrzpxmw?tB?C<#M`=;5);5|XfB@$ z9zcvF2J4E_+tAdj&s7OrmB3XAT$R9830#%HRS8^`z*PxcmB3XA{9h%2Rerk%3yj2b zks@WKv+kHVf9|64h5cs<^PNM7IfF|D0xm3H5S(AK;E}?+1|la|xO8#p>@w#)!<;h; z7cF((<{Ti*no(N%h;!I5r<)g8yeLSRQwQ9-Xz7DQ$;04f^GoK<D4T~YMt1S+;$<a; z<-z$2$^e?V^!9sZ&JUIqE-0Q8blw9}AP$lPg@tYkJ)oC0;MReYZ}Vi|?$N1ol)EPD zIPPU`{&*7MWJTfS?z%!buU^Gq;UQu&%QNWq`PqWUd9!l{<FI(q?D;bm6_=IupC^>e zC=Je^v4Anww@m2k9>5M7A<?YG<-rBTi-^aZZ0Cv<P6NPmSGJI~?A93|>0UPSk_WtH z^OmuG>4;lv0^aX%$xFlg3El?0bRX?)y!kl9UWIRNvv9O}WP3cm3~4Gjf6<cS(z4>a z@E`THdlsS>3aRf3i)RlUm?N~MO9l<_2*&iCIVfz%A28@HL15in7+hR9^O0b2nJ{Da zY!EZl(1t%3zv@*wf0iMSqH~Lbg^P-p1q)}-pF2NTSehuSYk^Sqa5;VtOwb8?2IO2) zKB1g?$aFM;LNKw1c?exR><?gmBpzRnc+oH7@o!TF!M!#fk0R}SCLX8XLCHr*cPyF_ zDhN0H68H$6FT~?tB0RD_9v_HZpWGMY@ihpKVAcL1!e*@KbFn$(ei{1+2sa>HgV2HF zz=H^L5q^vC2*Mm}80G#g9<M;S5!VZ%2v^}|mm51rxo^eeMF<_6<MF>DEJ7GXxB=mZ z2;E!I=Lm&&(5JZA)%-5{8=><(@QE-V;Xe=-MdR^Sgc}iNU>mRjVHQG1751eNZbbMT z!d&dUS|A7E5a?lxFdt!0gwBuSarz%KSA7|e@1!(-K=>1cM-Vn6-1s%h;RB!iZ{qPx zgw4m$UWCyT&^d&waOpEQo%aI1%4Uzae1ae@bBI0CJ6hL5<}N^c;@udI#~qNZU~`PL zWsbI|Ew!!^?!A7<t#`V5Q^8!ke!TOZj>nH86cn4|DbpBR=4!Lg<_uZ<whf}`zdG5R zep{x`<`{0Xj!2tnO#0FUI(ArtHv|2iO*BT@9IH+D*VrI~EF^!AHw$_HO?hL8zK`gS zvN=uVwoHEw$bLY$60#fcz69Jqqu+($Hpeea!)=*Qn}^$+5zBB})>9pPHuvfjpDicU z(Qhj<{i~BL$8U4{Y+1knCQ5)sIgQck2{{PQ#^XT>FQJupDXmqaX~`9d`O_2>p9dNP zpNq#g5iPXgKk`*#ep0mMjJS-ik=trM*tL64K1k5M)9<1G)2VM}{x9@aiRSA~S0d== z1VMsimkwGRF_wN!G%soIWwOgPr<<<WUO8<ZiWh)}<yY~zO>ghh)DIErho>x%_UaCh zdMM?APPQzlNmB4*(o7+MMjAlAG~XqV5oz;mR>nB$A^qKsx?V+H_aH9FHpg5jLqA06 zXQdkepF{9bq&HCE)n-5Gr75Y85=cR9fsziLalm#gqA~ZM+ds+{70pd45CHV)673m{ zAtpHRP6Ivn@8j`4hzow3gJfI+m;%_#1VbGWQ=TpJDdK6hWt1%|L~?;1kyN1MK!7@q zOna2cBnd!KqV+G(+5lPw2>%y;q3h-!slP5~H!qEBwiWj8AAgF+XHtJnAbo;>o~ALZ z^EJknYraOjgfm~-0-*a*R(ln;2qEVKZMtmC`T3YzE1EXi){Em|7w$*svjGr6L;_%n z4loy?qARdECXMy$KTwYZ8~smecOLbtMExpLznYhuJJ~WvFuB3BFgbk*e7fVfo!Z9w zmGK8Hi&!oh$D?c|ruVN{x0J^E)Q$OI8t#=22Pt}}pZ$QX2W$X?a99Cg+W~t*hmoEx z04x`CNiD%luiB_A=^f2At$?3^zW%TMxK=dxzH&!WbD1svkobWQa!0bgqp#2(dDI`K z7du_1zaxnb+2o#>%T{5|b0IFkc&|21Co?PL;>|(cbI9wQtm7x`tf|H39?{;wa{4Pk zqX-u+e4xi|evsLGlFNFck39T-2z!VhnsYY*2DgUU(2!}W%{qD;li^O}ZATs*+mj5R zCY^|w^V-{+anN53wWPfnk!Biw3CN!&kWOb}e$K$WUP0}9kjBH6behd0=HAd&G6JY9 zNqKbI$jb!l)6F*tes#)I9U_*e&A&jOM^VKZ)He|R!&}!P!RCjbtj}-DH=!X{7$13Q ze!wrUI4{i<v=xlC6+LJx7;eiq_b}NCCfJIm^3>O6Tfq!l(Q=*|jl40oqS3a35vXTH zqL>fG3Pj!R?ip#zZ{GyL3AX8J??<#pqkhf8yPz^2hnvD4>emV=RV)19u>>i$Whypj zequh~fV_Tt;_+SoQO|VSQe+-ahU4-H-Iq2Eq`w8NjScbm_@sS@pK_U<8bRGN$+pUD z`u2)K_NAHknQd##qit)=6A}7=%E!C{x*Or6(H$pxsJ%si4Lux>|BFF5EC`qe*arsK z8o+)JzmDlI;G}~u0p|WB9)ISi>^mCT=F6C8i?(?ITgg1zyb-n{QiLnn`kzveNvJO! zol^7}?0B-i|Dc0KCY4o}Z=2_XBQ^7ia+jIhXM^s+qd0=4_A>j+Y{lrL{WZ2D*R=AA zq(-NqlP_=4Mv&YN`Z-_dbJvx8tM>F4+oTD${INF4XUm;(MKO*1$#E0_{^fqzsI)m( z0_*PDNL%hDgN5X9^|>m6s}i^>fvXa@DuJsKxGI6G61XaXs}i^>fvXa@DuF9Vpt&~( zZq!5TR-UG95qjtgP<j&SsGd&eU>p+h2!7&_J^u*t5MRf!r}bSP_R!PVDq#;ko8ymO zADs!&lgR)6Vtg^Bi}d=i^~jzq>|M}<Z8`Qd(4GRG#J<nxIzH_+(nI?|^yp}OQw(Vx zEt!!xufld2d#=;N0=;1g_(r|q2|i!d@pQJ5_2EF0@xMyPkL&4#9GmrYCq4fMJ)PuJ zr~Cg^;L!Ww()#Xla>z(MoT7(w^l*tDuGYin_3)2+xJeId^l-l(eyxXR^)RKEz@Bb; zc(WefrH3Q+aEczz(ZeNrxLOaN*TX;R;U+z-(Zl_E__ZFM)x(tDdi{EMvmTBbG2(7# z)~K<Qvz;Dy{{j6y&H?TL9=GRCw=-)(@oc9wBdBNG?(t-^V+5{Rx`OoKWIs*lAx|d% z4n@o)RN|DH;~yEqv-XbSp<8Doq29@YdgO7Gq|*_U7e}Mw^lR{EE~T$fv1yoy+8VF( zBHL{3_)iK%>wKu3+0>B^HqDlf^wo}8O!*lDcGw1L7E6cui-IW7p%ukDSdm*wxz-M6 zkOm#vDl<Jzad&1e;wftgK!*<I!9A$16gpt-m;yjY3+=^P(rh0iu+pb~g7xqCD_Uv% zn5<7QiVqNuVCqPfr_K5cQmFy_$+dKL(0>NfX(Xz**t!r6q0>5828-Rs=ytjr5Q~E) ztetFx)`ca~JADs>Vd-k89~*L{EnZYCSgv7-%ucreWXWI&XWBxyV7b;t{AP6;PW5+V z8SYL?iSl(Ukt3vhgH*be&`d3am1!nO%HtrFx(C(fbm-_fiA35A2#ggH(q<xh4b^W= zn}z6goR!&#_Mm8HS}~$GQPi0>2hlzh&Fb_D$aP5NTnHvIcO5#J*C8vF{=-2>hjd3T zgq@zCjLuytE~J5|jg_#1OJd4I*BCn3%|9ZZatq?A2k<AWLxy7&!cKVrceu72#f7w` zB|?X8*RDp~nzl^nz}xIddqn7v$!KP#Ef+d;XHh4}-wDKYD>c@15YZ0Tn{yDPJcU1< zcj1ra_71Z^mVSZ8MlG_j7%3Kt{ek_B0NnWuqL!N(?wR(uZADqB&Y3{B+`=%gL901c zMw;he51^$t%g>>F_UCqxZ&x)bY3B_@svkq0PN=M^HU^pPxAbB8bn(N`fJ>PoF<4v- z^Ns(ESxXJgVwiiAn50TJ&VD83-^lV$Q$G7c>TPR95<;V<rdw$w*cIZxM~VX`z{a}X zF$Z=e<*3-X4}l&AzR=l?KbBsMphQqckj0o#^sac0P_s~j<$8v?h)~&|Br0m9O1hK) zHD#a3$gd?dMu+|gT{Zj>e`a#bqOcyB*N7+r$So|f5)~kEZv%2NW(AiC;zCoV&H<@R zx^+GNUi&=SB~Is5qPUGj4?BfND86(DhJ3etLb#cTCR~B*7`-AB8w7OjFadAoF}-*l z=nB`qPR#f@;f*91JnSj~Lh+>qAl04m>o@fy7M}!|Mt*n3x8LL^;3zOR2rsX1B(IO| zI9Tyshv6fRGO_V95@|9b*V7mlB@-JnG{{!q?eS--QZ}WMq<UuPT#}Z3h34HLPB8r( ze+x`2k=xIZYX*<)bNz<gUYF%gGvwZTS?(e|_a4-HAIlw2HQxAJ1N;V&!Gx}NQ!~2h zeOm|YYgTYbHYIK<o`t4&GYw~bTZ&6zVkU204<^0trY_W5yw|ViQga?5Aq+N&=y=M! zmVN|E?98hu(a*ivwF$y|>Bla-<2#$O2|Efg(*M-m{VrZ=2x;oQU}-Sk?q=exvuQNx z<=+s08E>~j0u|C|n*>}1Z?9>+1mSmjRicm!dSX{ohu&d;>7&0*czZvFL_c&(Z+gp- zcomV~Qer+57ZCX#Zyze`dI1pgGaDas{gy@Eeys1`5LpZf&A{7tGZMFU<OjihcOcOL zBlZUXZf-<^wBw8eXnT=ZkDRCR-f{$qsds{D_B0TSW-)a!vU-cX(G8e9JLB!$0=#*M z%%;R~Bz}*`2E2W!OyADH{S>KB@b>MFgdJ{$h_`PaB;G*e_msFDiOKMvN8#-|7>RR; z9AggkEyIy~c~F9rToQ4Lm^!~R>Qj;RS9r63!P|Q!5{-!Lp+p%HXA$|15_6Hb0r)+r z%v2=&hzzI1I73b!BHj0wfcy+uM8EF_B-SDFG$md`;sZqLDX|HOQ;3|TL=_U<Y|t~j zeLp~A7$ROu96+KRkupjgMdDY8tf$0rB&ra3mlCZ={D?>kCCq&=*71epop}4&kSIdr z0ZMd7;_rz3l@cx_K0;(4CGJ4tJR;{PaW@iu(4oEX_B^Ibjz;+*bixhdWXm(HKTqK! ztZh`60k;#ojerAu;8H&^+=GNWDN#lb6PAKXISr+JiBdaRDbr)1G2XPqU_GcruAxME zqC|sU&)UZrZ!0b-^MGE4=FC4Q%0vydT!FJPLzzRo4C81L<7m9;(mK`{`05PhW9{d4 zSe{|wcvjxn`VEFMbZZ4=cpa8!m<+~So?$IBmf2(|Q)Vo~<z;zBqjnif?9xlnjPfVF z1W6VB!uir`GnV<nQ09=a3~&7v_&R4O(HR4$UHh3HT;6{BU_LTQXYS=?7=2yFI)6sK zZa0*8_(~-%YyAkl1oi#z^b(|5X#G!cHB~P`@;acGpx#Ca)*I**);mVN7905Lh+$1V z$;z<5m$!V40pEK${^h-R<F5@Ri26#-(Umm|<2SF5AXMvRV5iY~F-=VEy#!zhV|ygt z-VY(M5RsozVmcDfA+nYd6AXzyRJiXGfb2%r2YCBNkRY>viW2LQxSnP@ynTO%#3V!} zP~z`MJc0=QuQh!)Be4OImng9viBAwYNQpg2bn6Neh_~-yB!(d}gc4sNF&mMYlxRjm zMdV3J{D{OxME*{R6c@}HBKz?6OwHj+MIHVeY$8)cZitxB5+;SZr@%xe<rcjJsbPJh z1XCn*ISbL{x?;7J8fqwYK2eGfc)cF#q6tg^cs&ygCHlkIGR~MPC5#F;c5QXcH?(CY zFTvcb%ZF}T8P!nB`a~@W1IblhSA8RIFYBd9>Ff2H*f3%BwHczedj4rBLDL5*B`?7Y zchW?(mDp`4(I1*)P-8A-R+o{hqlUIjH<r*POf?zte=yXrPRGBpscYk^v$xF%RU6Cb zhMwG7LmfBXY`{0_7U3lZdXhRwGjHfudLcN0P%`mavBN@WeinH{%nLdX&27cYyr8?T z!5uifeF!(3yddWN%mwIvyv+OQgbl#+lpybi{!g)&@iOmc0&dO?#|y<iG=MiPexo4# z0ri1h^7LTJQq88dJP%B#nuTOyg6P4#ua~3sMNOjI+f<I3WTEFaecNX(oXt-e0%@?2 zxl4y{xdDj-h6L)mmah7WXGFHt+ISnUon6}|_)BB2gAbey?E?y1CRw{-iH^5>e-6Bd z{PYI^n1q+FWxf~L+UZpQ{)o31d3&Auamx4%faqQjJ1|dg7xLf7%RIf)h%{4zJiYFy z_*%To)0>RQcuJ6`w+@k~DM6mz9z@>9+lR<9Pp?xZmQZ;6lBahEBDYh5JiRH1OrQjL zdg~B*niAyc?Lp*yN|2|Q-W>$+GEXlLkr9+2Pwyc_=23z?y=M@KP=Y+YU5M0Cf;_#B z*V6_D66ERiN2DJm$kUsQ$V5tzr?&!;<&+>#?-fK|rUZF<I}zEAx922XYGeX;K&_Z! zze?T|x_l#rh9S^%u>t$X1UB=%fXzz5V6f0wYPF%%9ne-*$0}Aw!mC(+X-&T|l$n(% zvxb+^&CG^N%e<kNp$XtwUWOY@eL!DoH0llbwK~2&yE1;zmdon+)WBCuyE?cTxYYE2 zZ@|9|gA;8}%-~D{sDri2C@;260cE2;dC*vf8$Zi4Z(rK-KDPrM4;k@a=p~r>OBiuh zm$447p+r@?5>)O=T#Yl7IHQ-KHlyct@B7lW&(cd!JNjVMQQJ9Jtd7f!{^JJx$(Q3> zp1Dj*UeHTWk3XrG(0lMFc>24c74PUJNH5R|)(>d;WwNR^@YQ52!#!`-D@NIVY{0(( zmV?^;|FHMw@l{pV|Mxlf+;ek71`-k=fdGL^0yj)y1_?7LBupYm0xBSrD3i>h42om5 z3R<lLD&pK)L9IijDk=`t3AIjDE7qyjp*XbtYPEgdpLNc?+@SqF-{156UeEK-@9<hT zYwf+(+G|g1uf5NJm63|n53fhtuQMgI*Rq*6CFs4w_0!MI^|5*P{lKLjOj_SN_mQT{ z-Ii!gT*bN5`>q{7L?QphWDk7jhk@^$OyVTK;>9*qfheJs6nu*BRJ^!`{8fO(i`zi1 z7NL0YagawuC|=ZiQr|%&By92GAW{Yb7B9{MIYETt#q&Tmi%`7yD99rs6fb@V^1cYg zi+QXg*?`51V?joXP`tPq<V+EY7k>eAn+U~=FM_-vLh<5%fqX4O@nSEQ!D_(b#Rib6 zK-t`|(i%K_an0tIY{E|oCYlY_%#J-Pl+b|wwy{L$Dt^pm{5(UdD<0g+37lqF&fyd1 zR~Zr~q$F(6{HJ(vZ$@1%4I~2BmztbEGI>7ADCOx?DM9`J8)xo>3%Fd(w_!=a;5G;N zBQCQvLqhA+52k~anc2?0G9*q2CBkWK6XWO~xQ-)33H8jynG#_OAMW~(&nV%skl$R> zf74#4W|Z+|rcAiJsQwwXX#0~4e(Q5v7*mt_FpHQu&4=;h?g=LKvd$1(_Uavf-E9i3 zT5t}%$E_SdEw5q-Ujno^O-a3!)Vv*cMSvE($E(B|d6i2@I8TXo>bb`~M$y!Nk?=WC zwRVl;KIYnauL8uX(~K_F$-T!i6L^fr1COz!ocIK2X-B4eT{{rIkA$0mE(aWpeA9K` z2@UU5*pc(F&^0;EEM>ps`bE^D^Hj1r=x0TH$2k?~FdO1Z5Zx8+Pz&)8$ZiosA>Iek z(PD=_5ak3zWk81{#Bm_?BHBV+4RQsLP+=8|NqH6OC7@yrL_vbc3n*I>TBX}Jx8reA z15(4vDZ4n#)lhmT$PFhCYlIEeFxU@=O1-4o{xU<#Iy;C}QWMEM|Kv;wN_stPD&1Y_ zPrD!&M(J)(Z7I-O@^Q#h5QX?EgDC3|mMG~}DQSz<)6!)Rhdf2_Tov$yrxSt8k>zh? z@Tet%6*`^oblv09b+@{O<+P!$tAalaNo_BJadoTPT?gG-4aNZ7&Vsjp$bSf%oRZw- z`i~*oLH}RFlkn?Qpu1#h(lRM*d`f0|p0R%d>&HOJ=#bS~W@0AMkV(wRBs3;;nT*Cn znm99qXnR2hp(Z&)Y$cawq?TNhN!*k{^tdO3P>+7)PUUvfel)lXg1PNp$<!-a<5@~K zyCuQAKFRH&+XC&F&kIA;=JCmHC(Yv`-TQP;aeHoJ)E3(mTpUcnV%^DE;@X{@Vw>el z-HbaJ%Yxb4+V1U~8qD?JcE$~^>vVllYA3seS~PWqqk-Q24l7Ho)X8oS5hc_tA1H}r zRIwx{B>qKxdK72mq${5r*PYzv-=W>@6f{BVuK%B`OwzXvZ%=8XWK1WwyND}L^%J0# znUHh~WJ2c(Ml2BcpsJt&c93wT679ZPm!Q5ymD~UXs&&`Q?dldyL#Ma(z=rAqCG<`u zY~L8Tt~%E}KWu`s`6040%1)`=CZ^`p6nB_Yc4nA2fxORxykN>mw`Og8fK#$HWU_H~ zbx5dz%64Srw8Nrc#yM@D3e$Bv)Y9UV=izTcmE3ny{d@k522)LX4Fu`$#Et^*eIc6N zKj(S!k$u|H*6yEsXgc;i#c@CGrBT(_hSFcEG?MyGTFCP7N#FgX_nTbpxS!c*={LEj z<9=>ve|=@%{i{8Z(0{k#EhnhFj?#TFS6T-2<1-hI`>$rozy^Jv*L^Y1(^kCiY|wUQ z!HHnz8v2-?7mqMKgQe$XdwikaJg{Q<lz#KUS{k+htd(I49ryP^5xw=cue&49(*b8t z%N<=+MxWnE+l{?cpFa9HrhAj&edjvv&DFa9-FM|;rpPVTdRCyX4U$`XKMvk+Emgj~ zxmfz02KtKtT?hKh0A1V5aqkEjKz|i7fZiE0^mg2xwtn_I4Rlw4t^>U*Kv&YhcZVo? z?+H;f{5nM8y*EVrIPQHR+ShUK56~5k`+#9i?_<;i>+`(Aj;SVCA9S>J>H4G81VLpt z^gdMC4Rz_tZVKyyC1-|p0X^$bT{Z`0sxD^-sOoY~fT}L%hA3j^g(!77KSbfZAVjIl zPePQsTo|C#<s!qJ-fSW9XL+97e&4kSp3+NUM_(0v$}mIKJ&Oid52||>9ciiRo<&m( zwSHYZ;80bU46>>+{+6W+JT)xveT~rRd7fN%U-``GT_xxY+$u}@m5A_OSEdb-egjRF z7zdbd?PpGRpoKk09FPp3zaFGDa1TPd^k|YUciVE@Xoo^3>~LIAf1pEK2>oYV_lQVB z4D5uz1UmGA*bVYa5yK%?v&=67k`o|mX7J<GEU@2|_Isv&+pFMzg$1inie-H<1)n4Q zXTVgC#FYLrM}@u!@{9<XQ_cpU6<~%g1z89%xrmok^0QD602Q*}7J}KEfC?G%BFH`w zvS$z{96f;wnRPG7UBKXrAr|73b#+pU|1%_9r<x@9BDd*ts_z|SeTKj%Kteec50FxV zhiL{>JPvUx$ZTNn3lN1=OIKMF+EJH$^kQ(Fruk_3-?AgZOvOf*2AQ@Im|~%k1!Ydz zf()knQ%rKZAro5-r|c&gOmC%_3JzoXRR)twt>nPhmmJ2lKZB_<#Z-P6(^nZxbt$IK zhcT6tp-Z(}mSU<FQ-3?UVV~iYv<Mrjfc7bAmq~QaBzk5NM`RKsGl_8-1dZP->`XQO zUjhrl#_#Nu9Uo?DDQkrstr63KMncVIJ2yS1!CooohZ6mlak{j@DZ4*Icv_~gn$x1_ zM#5!pg#2oYO_}@|Evxn@OO3y~VZ7cLQ~hk&lfyPu)c=TOhg-RDuq@5U*A^$e)eH0W zUjXWo{J(!Be|tuLJ0{@a@(+diI*b_lBl)jq<TqG;eNb}S&%&G`NT$0VO9tr>zo5HW z<y<RA$K`H&fSJ@`16c{ON`Vd+LfimyIWR<@9oU$>ncw8y{Ir*nfn=DlQ!W?EgEc18 zvj<FoX}bbs3y_!vONF$20rd`0A!YY5weJKfq_jm(W;ZbS5s2-u=rSj9Lb{|~DycG3 z@IG$FoWvvq#sLZCn3K2&>RiB_#0Ma+0Olly$&qlCEe`c*oL-76Yvd#@2s1Tw?hP`z zE0~&Vj5VUQ43^hZENK^EEW0yU{+VJ)I|yU>eFjTg>Ld5CBJCcG<+BWy;VG8#Mz+Ml zhLX8+Q!HuMU|QN`u$-4-NjnCyl#B_R#@xcunZ)!=VooNpD3e%~No>d<=t3>!H-$E^ zV^<dri1>Hl+HLE$mAgwn1#G8xdzvqW9Tjw%)@Wn@9js3SC3lCcX7lb$Vs9q#Tqf~q zCZS=d%M|=MgJ^p&gD|fxwz9ggH#BVaVf~?DgL|t9Mbr<U2APr7jXV69kVUgD%6wA{ zui-Q|LsXkOmAJa`KsY@^bZCa?MH!+erbHVJkdkjg7OQ0>qi0HTGKjLG4C02ACU#ZZ z!*m%P8cbUZ-9j5U^n$MW!5_RxhaDvUjpWaO4m%-^>&*>1Ao*K}VUj8frCg^)hz&`} z^W3EgJ%Ye)z|?&M@;4x%&uvvmP0v1rNI+SyP=RclO6SNvHsxg_GSW5I!}PY3Gt$E} z6@A=d`onpajtd_`KhX~!Lf?hwNL}9-aQiWM=sZ%8wFVAPkE3V5*b=wvMEmm-2_8m| z1P`M}f``!~!Ncg0h&_z%2M?o1PZ4|YM0zX^%W?{jZXz)&ejdMM>EU$B+hu9D@EiB^ zjCzymk}(j`Tlw({;w1Den<#ulHhAxr$0~EL67&Fjlm4yEx>rcZj**ZR6+=!=eoN`H z2iTj~1ME!@cOp&f0rn=-!K03+2iS9R=6ooL@%#+S$t$=Ux!fbMHYdMOI-FcRz@F1I z-wMt>Lc9e=#B=k-R%k?St{z~|Y1UNo1$laaJ*UWsl3YE&o>Oc@c^(h2=QPiky`6LQ z>}gI5%c#y>Bh4+17(gqD!~2IAO1uOLqWbVxq#*iM7Js7A75Wp8zRMr)AVbDa7X1Z= z{7Vu0J4jR4@q7&TtI8rMu`Oplh|)jCQonCeE2WFSGDt6YQ2YZe-Hj?SN5i>1Hy*zX zB6m4NZWF651U-|R7c@%V$^}kts!e`}^4y}ZO*YWzxh;$+$m4U7+yO3@t`aJEkLvqR ziY&=3i~l)YK%2}0+6D#WKBv;!84=I@rR*p-A~*M9mC)Xl7C1Srp-OUl7F5wOx!1~) zUO5{m$H~>a&F$S(8S&gH%IRYo3UZH=hQ3A=W7Y$3du2-N=gF#QH6n$*urqIXu1582 z=w{nNf*;Kbr>GnKkbkmk45x|VB2tT;!cUQFT5ic#DcOD`(#+(t;<B!}o(V7Dnee;C zV)hm-BfWq}xJ5m$<U>M*&&!x9%lbSe(QG@6fzrZvscYU4%g+Zjjm>0wkl*4+<O@gT z^-!Md41P4e4Rc!RwSY*{_a)=1+e`RJrcz2Zx=UsY?QZGXF+z-53sdPrC(^~YhNK<e zMK&wG7yee;`H8d&)a_bJI@hzoA6%+NX=_xr@)J^d0)B4_(E3Cr^;6QDkS{99N^9kh zQ)$Qcb({%68Kss5rS5@z0BCbN$|G%jn`M>#7{Y+lDnYMDaso3Bt_jNjZQ6_#n9&w9 za{Trx)14ZWmgDzVX=~7MDxlKxg3_LWd|XK@RxNfS`9Wzt=%%E)s?|XBMZSw#8%_#K z+m<fvqp;H7MLVdpa}ikw1Z92~9iTFc2Qa1pmHDrzwd+Zcvy^0I{yS<le3pbK0X7|s zhREEY%!BxRUG~i*{<_<~%A)}5$hpx95d%3()4N9P<hqa>sHu4$9_}Wf-MI`(6341G z=M19yK>5GrcINYHPCm0_>w)#<OH|F1qeUGpVbg~4^%7eaEz%Rc-qwQ~%D0Q-v}n-; zOW3uc&7I=d6g5w`u!hGrfHLdaGo#JE!LGG~xkU?<>EI!9Ry14VuwW=t5@>$_BJy?A z-MIpUt3#aVvtVgJP=Rh_Z;592!_q`4S+xj_0XlZf;ESdu0y)~JG%wK?j?-XW1E6>k zZR3Ys$M#){ABp-?Fh6k?S@*$p3y@d?aq=+21R!w=#2p~pMa+g6Hk?y7ph5~NFD9i@ z4@XtrqMy6<^ILv8sj$C=wQ!yN@Mi5PvT`0mcqb5)GlFM=04t}*NCW{Z=Q5BBfeOiX zRyp3**ViXi);~!8E09!~Ge;3i07;eoN03)V$cCY#*+&3XS@J$yy%%$XOM7~Lr?}N! zcs^o<)4QYPb$GWu<052qomt&!ofo6o`|zBJXa^buMJED@Z{d3$<Vg{qL-ab5B7h3X zB%8u}HPppGQqR2iKZ-(ut`!j5#Zn3K3MnrF$zBjeV^}(XZkHxuIo0gp=YVWDuWYSM zxR0D`VYvoK+yU_z$Q}_pAU*>50H}~i@=;O>#u6?7$>$(ug3J){2E^4MSBQ8I;w_Mu zfUciG6cBhOKL?prON<31zlFE~<QjmhdvEAra7E6~>oFI+$8`Nn($6S<DwLO83Kps3 zw!Ji*25~dQwLtP5h^6BkXAWRjhauFya(PHO%cT0HXwk+d)JxB7eFx*$K!tLW4Wyhr z9`k_eJ*xvLtq3FFr(d(Z&Rc^-x;NXKza>R*m_MV7J2~5XJ<NBihKKV&;wHNGKZ?$7 zEXqVuGjs{3E00>p>c2+)?_{-F<%$VBxC$iHI=exBBSNio0OXG%)LK~+8PY(76j-Z` zh8hf5tK9~&Lxfsw&?H7LKrF4o*M^15m+6WejQV<m;>SA0G+&48m4Ipf4CEsb(!Akl z)B#R)^-|O2Xw_bhGMdHhNlQlJ!<_1+8JU+Hp84xA^O$^2e}YWHdJ`SMB;#i22HH?3 zdet9f=y@$<T_IMN%wEe5S@8AYne`c&g}G)P+x$@S_HYcz_U?ygKAn*{KFD<YBgg|- z>tjy!zr*Z1%eliI%5Icm9^Y9X!+xvFWb+yv)@)K*gKp|p7lz%SQg1rE)ceCsy$1B# zFjGQ(RtA++V|^5+hmAGD8tY)tSR<V3Q!`kb<pos^S<8*}z<O)fa;N&*kaY+y?ubm* zR3!pWSG{i4q0;AN@<rnEhu+prLFv^_^}QjhYIkP9YU4pY^<0=YvyA)5p&BM+^<Tnt znek|t-l#3ZHvd~Vd!_r2Az!L9tJ;KfQ!OWVt(Y+@u9cK<*2Ur8LxNUpO$Dc&6a6<? zmZ(+R5_>q&VsJ~;%590mooF(ZsMXsN`#aGg;C;S`F^!IjT4?LuN=o0Ca1Eq%QWVj5 zUqJNHjO+WGxaEwuoOiGiw&}|0cdgjQMssaqwt9-BNc%8mItzm9L@J=m-Igp!#V_rn zB??5}VH!RKv?c~^AFX@^u7i{D(LfMLwU5>)kb37B_<%CqHi;yH$m7pb-~@tjBoS>c zjjN~PF@fr9!_w8>6PgCiYW<?ld^jU>agZ6zkBwR!tN$y^*8JES%GwG_$7m*~-y@q< zCr)J1e|yNI!QLbz{n0R8{KLa^#q4ibx*Y^m&(BEz{s(0RJnKRpt>(qFp<F<<Q*~WN zQK?bWs)R;}yyaQcTD~Z-(Z0Y5>TWA-mg<4GytZnu$gw<ALwhNHf6MEpq%%lb2?Rax zmN!y8@IDD|0d2HjiTu&CV0PLx9smZ)bVD`rj%UH_pnAMA(B`!)I1hLhCH|g-CzWWS z<GVrPX$`!`0koN>(e<Ywu{}HcLLdko-}5YVe3^t7f%XTeMWiU|{*so^RlOjrqPn?n zVbIM%utPVWlaZ-6JmlZa4X(Ft{zsUtsk<nY-H6V?q4H;GtZiX>;Dj`QbRZ@lq@hr6 zLt$P9|MO`*bdtGI9<1Z3*Txdpg%T?H)59d3>U+Xm4Xr3PsBh08;@X{&p6>6jXobkW zpuhK@VvXWV2>#IDszR`1*yq`d`;J!pJD~pF=XKN8Wx@=?Ye4(8ecmu7ZHK&CNjBg1 zdE+%Mz9!*QC0eAv&zq-l(Qq8$KTwqyHs-wvGguFg&;tCKA}9Nmdo-=ZpUG@kdPgvM zM_{sBR+QSD?(ou^(;Z&0ImMzK-f&q|VwUXiCdiT!vtWleUlus6RNKgwK;I@Dg08b+ z)8%g4*#eVo)3haMf_pIcW<X7_C1`^B<7oy!O|T_sf>$7)Qj!(CC1`>(PT;;35H!J- zpb7G4(oI1BSSLd9uzcE(iba0r`H5*HUqJq5Afa1he*^hU#88NnW)a>2iQW*;fIKB4 z36V7$^MOP=hz5{jL=-{X2C@UFP#MV+N%<Gl*FbU+#F`TcI)UU`h&MrA5pg!evN`N= zfKFQ>CNk}Hxz0h<xS#lm=Sh8!?0130V-U^evVjE>4?xTXnJ(f^h`)pUMZ^w>Tjn{= zbwGs_CI3K5^ZCU1K=MO~As_=pd<k(a$mJrwgUDS#%nl^8IuqxC^bpYu;y93c5p5u@ z1i3<lZU8<6vRg!Nh(CcG0J=TZhnl4;G^>~j-PUAXa}0cgoUD`B2Lk;+%3$-HWw7~c zBTW*qzHA7{uL2U^z>^}-JQ{LSsJV%=9T9g|{!VG0OU}_qOqA3#h;<-q0cXGs8A6e? zxHY$0{LcLMq~IR7u805HAIQXhD6=!aB_r8n_QC&@WV)4Pl#}lqEJpWT`QyabpPaAY z`2t8(L2wA+v;v%NpY-M}gRn*sryNV%yYo+zP!sru!!s1<@jYx#r{yH2m}AZ)G2fG& z_$jILVVVmhHbGnnasd!rEn9gE{yE_k*OTOZ$7ESbnTQfS(?fQb{;>BwhaU)YJi*MK z<IU2{?q@5=ykK4EXDi42fGD+dg$2RlK#X)NDq2-bPf1W_`8o)$t=OT<-S!P`B5(sG zUb%>eu=XCHomp1m^-*lo|70o-v^EP%JbM-MS`sc(qPd+CZ-$KPg0F1{wE2gs+A6T? zQ4;P^qFLTLNL++xtOtU%uPjI$k1y9c6D)IWf|_J6;Z1iE2OhxW$VAVz1B_3?y0}gO zRg4_r`CpgN>N>!<27#@B9W1n1N^}6&!NO3Gfg*H(u?6IOph61%`vZ)x(}it<H+6vV z9m1bVn+{4IT*mnbVC76Zl{o-dIk$mmGhZRu@Brh1jdp+$UyhRm>;R({WQYhIV7v<Q zdl5Ro_zvV-K-UpE8z?_LAP!-p!i30RFZ<R~O4dO^`xW#CU<U<9f{YTOgMw2)76Nug z@H3E$Md*y+J&<=q=!~H4N=6W1X9OpJ919H689{YuLHDp+J1_VXxqlS9&I=N&=v)Ba z$HL}QII<Vxf@NCq8sW%08JX`Mp1Ce8Mv_|6(y_`0i&cIdX5U$ka|*I84$%YuiY>I2 zXbA4BS3er^Dt<UJ;0<&3W#s7bbeXpvvkT6U^+7PZIwQS(M!FtO7ym~1zY5b8%-)?& zSHvT0f}qtwaZ2a20Z(W}JR|4*L#0(+mXRJ>#@yC|->OF5<J*WuwFiy~6kikkVQzof zIyJYyjU+U;H_;obfp(__ay^fQ*ImuhtHi&>P1*2QNW7fH3xHs5e;b*uxt&}?hXTRm z{4QcK=tCsjr9=*MzmHh_TelWh3A8a6@~?=6x^I#25>Wlm&`w$R8W2=Tjik=fJH1X- z#gw2Dr!rxbub@(mNR(u5@$;a{Zr8F@l=OL|Of~FlHTyhLbu7Gr*Ze$UhxksbW>g{a zhe*6XS(`#5ih^=zENx)hnkV~1q*ArzDc>4><tFk>B<7y3f-Lu$NQE|_&fu<Ut|^f` z@3J;2Bc?<;SsX?LH6>DG@fnfRl*mLw@$FM0CmPDVGVmp8=^%n5CN{|>Ym{N{l<Tg; zu@T!qma>hQ7Bpkv@25qI#9q3xmomzQ_d7w=s}Fi$NE?V7u`Am<xHYKa(9%<!$nr=t zmD%s|Y<QPPni~-dh%zJoEVsQPU@JXYXsM;wYs9P!#ZQkJ(ONk}OP4Jtpo?VFRl0he z$B&A(O?6Wzs^%Gdhr~P5Skv348mnWZGSyfeBZE?n)iE+5)mR-Pv(t^$F|t^N1&!4) za(cS4I!4Y@f2xHlGh3)KY$49sE5in|#iugT(OT<v^<HJ9iwJA2lQAsYb1p@hE~|#p ztQz@FRE7_}Kowu?=6Sztm#W5MH(iazZn_$a-E=h;yN9Z=*v+WMV)sxr7P~<;=<}s+ zy3d!nHg$qNU*;a_^JQ*EpP%a5tjnlHL0F5S>cQ9CW||EBtY=?$Z2)L2yb++mSa`$D z7z=N>!C0_9|3k=Tef|g6`h3_0RNwmjT{r0WVb`QmJ`7WWaq(G55kJk*_<TFhldB$K z8;`fG<wh`D-nNDt!DM;c+HC}L<!x)W5t=G*TdR$*Eyvr|Xd^UH-nKRyNt?Z6EijTn zaKKt@lto1ctieWVk{q!18fA0j-NT!!JhQp_WHwjdL(SFK&6o)NG8?5|*eKUgF>90& zjhbM>p(fa%CfJ_mJ=;Fj1lyAufNFy6Lp0dc1lx}`j3(GV*Dy7~_GKFXK@)7>U_xqw z?LX1zR}<{8QKKffF{24?Jk$g?W;DS~hnnCmY{~W}rJ7*mDHOKb2Fb`%dV;o4xg%FD z6y8esC>s{L+Zk@7Vs~fZ!>&csNI8Q?gE3K6I+A3rzw`~f_=;un;_~IeVL?N-K0$Ma zQ<fma3}&3Hu^CtBMAb^e|EwlkoagEOz-T>h5Lw(Vs6ANkbUQ2_oN9-q)()fem|J9- z;X_AFl=nH^rol*N#2E!*CJ1<4PGDN0toPPXfcjxtN0B2rd26t98=F?=k(qJRz?_59 z%+zcrD&eC#tCXR!EoVwM4;==7SX#9AA2Uw|4Q+c7sh6C_4JKfWtz|>)R&f400zqJ` zEiyxo)e7`e=*>W_t)s*9wMS@jx~k$hb#(a%>%}Ed^MUFI!h#hlB`K1HGdQ;2Nai2H zOl|v*2{Kt})gQs(O%N^-zf^w`a_Vt_wE<_gR~xP(K?ge3#b*Vz6VsMZ-Fk#8!t}9( z>$e8!?h($oL1D5&FK7IfKCA1u!BO1gKu?|<{B^hKv|y~<gZphub??hm?KxoVY*M;v zK2%_3J76rYB78ekDQlok1;*%pulwy}rR{@$TxoLq?zi)#s}vKP17qa<-EUVZ?O5o^ zzyzj~`|Vj88Ii4OUiUj|-k+0q2~aEl>3(l%-$H+_v@GfVzPbEs?FOa>P}|hf+9~ZL z=y!qsI#<{kR+V#wLZtX`gdHplpm+KKcCc^)$Z;Zcuy7&BnId$s(0UW+e}Ek<+zxUB zP$5lruuyU)PhkRfurM5CkO&<tTn%!m2pueB(+^pI9V~PQ=_*183k@JsMd)DRa*)eJ z=wRVNkOxHQVBsB*w*fm?*pseNc{6HsTa%Y7Fi-~z(ap3XU<V5+HqWVsEq$<%B)=12 z2MZ|z%{o|kJ=EO9nI+A;^5c~->R@3465}MLgM~F9tAOBOAte+^i<4s)2MaY)po4{N z@L&A{nb;3ycIGcj$vg@FUdh<OLaLm6`)myd3pa~T2MY(``5dr=h0?PfrzH>^EPNW) zDB>JYjqc8WNkTeU7y?fXka4h(Vvacl1gNQlg*h<I2JB$re2{YiUBh3|gxa6yX_(p4 z>h2GmBy(neA6rA1EBlWUHrnRM{^^F>+}OWZ^I){iiT&$^Yjt(^r<NA?B^&gkYy!L- z;5P7Iwt+v&2K>uyHQ=2i@1+R$TDy7T4Q0Rt=3Lv})MC!H=IvPK+-t|030jifYo|(j zv>r%vuRT$7aMa)k`1R(3N3~S?4OTKsoqL0oJ90TMuk6UvvtJ{Z^9IR|!T{yvl^x9k zlowBSlm;j-uk2_OpuD`YqrFgP_`xg`pPlDjBujBQXIrz4R`lSW-8E(N*<(^oc=im# z)I4X;lbJH-Tw7(F;pY)YyT|8wZQ1)u+3|KKVFdqMv3q=HF|)k5$J@4G#B3!VX^Fhj zb^I~5=Adh)=?a>9)}i&MJ1Voip_ihBYp5;3?p#}?M`;Om=LWI3mS1;%qflI;woJwN zwkP<+6{~3cVTEdNPe%zs4-HEXm|^JwGt35z4TfPyr)oPQu+Rp;$Y3zo02o<f17P9; zUjOPC^uL~88NrK?9ot!}@g8KyUg`GhSR;)=H&+IFZYRO*l<wxvRuT)g+qtQDhmN{I z{nFLe@ln6fnCRNt3U!Xumm1xcW`d{3VN`6(q*~QEvRHY|g1lj2UNZ|>oTKzyd;F`| z!K1~=qcp)E*6ded9P_^Awio`u+1%d;2K?&?Tw6Gq-84oKcE$gZeGlA;oI$KM=imT< zNjV|At$veI!lI5Y&d6fD*6jg2bX<?-9o0jnzY^OsDNx;miK)xo_GXuGiHyHe#OmUV zrjWrvVDBqc%D)5pCZ%mQEd$j~Md$K#2~fL{VIP0Z8hR!4a;5!=wvE4TX;(r2Txq*} z(%!JNhoOI~w3{XS2TS`1`dxs<GXAEe^goaDYM@rLH~yBTodbO)P_c`}sy0_DKWwH@ z=1~%N19eMJobSXxvThx6K6hXNH9`%IF#g~C#J5<iuz$SL@vxe@T<*40IeZ%PUQ8UV zgr9N&kGKG1^g+@1mTqfE^M1mCuhR5vWPHoeTakR4v<HDPdPFk5#m4r!3%NrIjL|Vj ze9JtIok2uvU4U8}2$vRWAbbt|snV<wFS9C6`6;~&1daGJOS=gACrYzMyxh|6hrSC? zgI!@Mxfioo0(B>oVsr8gsO3P=gg-Z~FQGpNCKu3ztGbbC&G=hu#;Qv=R0M*adB~cv z0s0uAVip2*E1dY_Ei?drLDEe?(BgY7ZQ>S&8c;WP#Y!jsL<{xI(5;GDB)NPJX?8e$ z3eIN^phb|u{fh}g=>%tg0qu2X`@dsWqAxk$!1NCwk%Z`Y8K){hg}9Q#Nx1;(JRmt9 z;!cn|fT}&AIz3{ldBD9vg_`kU>=p91-m&p#(S99s`I7y=TTy29;*eXBZnN%(B3*Zk zQ+;tpUXLIzI6iWFIn^nvb*?lq%(VD7y20t$(V0{{$tq=cudB*32pvMLCNC?lF_0DC z4nDq6BWg|)b3x++!KZ>hj7_~&F!sbXF!U7q3blL@sM8UBe4ce{!Oysj1k|luKvI$P z420|r)V?9z^X#GU3!%>gY$p<I*OpmF&~8tK<))urx_(Pw0j-zqU6dwx@abgEL$ke< zq$+V06KVXdDrmG-V%fMr_N;UzuEO#Os>JA?Lfxr#D;W?+ne~rj(xWofJj_ux?*0P( zA%OA$QeLXL)W5k3st%R+N-OuP8Khbd;{Ahz$SGs>Bz3&MJx<Z_a?ZAaW8$WxK`Vee zxlYCmES18O$ea#1<1ZFR$L1>WKwY4IM7k7pbx=yjMx}JLQl7bjTSmYbE2X2A;{TkI z04uAqRBFdT4gs8_K37>;v4Yy506hk*%iVTUPqaK?xwaM$x{}jKU`$*MoK+=9eL3`b zN}FhWgZh)!>nfsfU`n4X__Fh)$J@GX<CO0u*Cg-PMsMFJpOKTl7m1(4eL66CdjSh5 z*;7ssYgu8y%11w{!dBQzrp=~pnoVvWCX?PkXCUaa6x?}shcTVEv7%ia*2i;Zp)_8c z&Fi_u%j7(EHD4nJ61PLdu3_;5oT>w<1_+7>r<h8x4J9Y<Z1zomFL_*<W>JXe7%j_; zZt9HxGZl~ZG#5YVNO-yI|3T(2>u_(T5wEw$dY0)%)C3A20gSl@&mHU8Z6r)@Lcaox zJ%yB!;_9-Etp#BF$XGA)X(vI?1;$L3WUtPWydC-mpl)@w6YFE)R<~<eBZ0crJ)Kxz zOM2xxHg7=P>RwK)pCvuEojXTB-Rj;>tiL7I+{lR_P{#pEY=9-bcN3c>ppJu-*g#9_ zbu*8p0d<R=*b$bp2<jxI%v&<oi4C#`{_lXk38;OUaT2R(x*S`}Z{ds`s5{Y#4K~Sn zP%{AY3m?)>+1~k~Ul_2C&iZ}~Vq95iETB=j%5Q)_u@$b5(C`6}I1i$bzG|xeG6laI z8wkXl6qZ)7Df{Y_f`0J#0ZhRxkQ1b!$`1!f+B4N}4W!L8ZP=0`@JvI^Go@?~Pl8k- z8zEUvRD)pZ(Rd2K(03KNd%D3}GIQo|rL<HE#0U``EwG>3G7ILMkXbv*fH}u+eTX^7 z?;J1>iNWlL%(}4~F#CSVA!gsNFy>=_Bj#5ku6IqqI7w97kidjjB3+CzE3Ow!rVf|Y z4@Cm2A5Duq6iJA{PwJ_Usl6DJ{_2oRH{$~fR!7RLL#Mv&lRqKMFYb$HnIwq`k=DxZ zTNe;rjCtC}6d8Ro=IYpueMt04J4dliP4r1S{bnN)ebR0$E4Yt7Su01xRwnv%D&&qn zZ6UX9M56m_xY;lZHX>WXVK(d+6fx>y25IzFJ0~3VU$lGl)wZvoZ>TmS(bx0vzoG)R zPl7#*v3+94i6eEY8~vn%L`G>38vUfxA@R>rdzop^N%N4Hd(VKNRzq6Zu2oyL=n%W@ zqFN0ZX&a0a`Oh?lOq7}tC-wwAPUz^>G*fiQ0#$bO5>vNE_^5GoX>^!Xa#TOVTbeay z<*;(YPf<C;1D;&z86H&l_u?OJhoNe~V0V;pW_V?)sdo3HiPa)?TK70E)oT_b=Qz;` zz6x-Ly_I5^7Swszry)aqcEIp`ieW~`kcaisa9qgHCZuPEba&AzGTadk8xk@s2pJ}( z7)}l~&I}n&2^p4#^pcR?loD7K3Tz1(R)-8Xq!>;M8SV-h)`bj@hV=T7ekmnzb|~<t zkl~z=;j0wG`5}YH08p(j2pNh(`l68TC|b4tc_`2)WVkY97@cCcCS;fzGHeSO=7se2 zA-y^!aBJ9g=Y|Zog<W?=NdGdVZwcvp0(z*-eJD`o9C-yJFYB*Gr_kr#uz`$F9d>5@ zwTlAp5qiEN>#zN(v$n8Ve;udcZ090be?3;I46>{*f?2wF#TqB;%jV)3HA_mr%9FlP zD;SblUmMS;c}oAfxg>2+26wrt!$BFW#d<*_^t4A_fTQ8*1~cwy8HW*j>>wmCVoyIa zjRiSt&p0i$fyH~KDLJs>vA~Kp()4&>#RanB@sgDNk5?K-te3Ud?o~KP_M{S7zber{ z_dZv-<o&9@3K&TxciOyjj;vu4X5Acc6|-E4>*ga;T(<^X!~03s<;7k<aUgwpaE}Gv z%Lj?q8QzHroOMpIS0Cy)r?WLayyw`BC};R^m9(nZ(>f|0tAfKIbgUW@=$NAV%`5g4 zJ;{!FK?lM+&+g<n!~Y>WDvG^_Lyn3xN5v4O;r#dWdt?@T-eYa0*3;?2h!v0nM2?sP zHdLL#4KeRAdt-?K;O(_$b%xKvO7FH}PaCoki+SGCyRAZTrgP-C%Gusrgg2es(Wj}9 z?RE?`dXM4#k0o=|?c&&Bck)Ngr&+ukgZB#SbtIPhKcNyZ>EaVo=&F2<tjgE;Nj%Qa zdAD*m14ujoaTmx=5qCno3G#-B8zKDLP!1%ng6IL#4XE;J0?p|tp<6mIVE<B{CWsPN zTa=JG1LN5tJvUzv%3mL-!NRi!Q^q{9=AeHXkXR1!H;_+6Y=l@zrB4PD7eRal@-dLS z3gYBn5R3sGq`OO~n^I^nJrdqlx+Sy~o}U7y?pcuEiBLgbf&5j3Oz8DXVtb%M3ao&$ zp*8?L_tMd0!U76H<0BKJ&HqVSkB`ah@eV(USNM4o{x^W+R}hgqc&ZV?sTv$gPg!h1 ze((x}-P6%?rITT?Le2@<TBQn^8f`v{dK^|r4SJ6NtdMyiGXbaS%)<(?XNZI6cPV5F zy`U&#SIAZG1%<fVE*gRH{~+rT)Z7ImTvo3Wf5ny!NaR862iYs4CB)o2Q3WJAKpX`5 zR75w3ZaXmwXc!2=otetf{H;7%Kga85p?+5B=S=<ll%H<0=})0eF8_NMOZ1S~B$*^D z7NKoEkdVg5L3WE!SsiydPB~y!oB%RigzUQ-<Yyve`NtsdiBJWPxQl)UDwe5_W!!C0 zR{%*FdGp<jL?9_+x8KXNra)3gKXN}076C~a-|{zv??6(Oco<}t2vug*gWRJ6rvCzB z7iIWEIq%sC5j*;__~gst&UA$q2gxZRr*aR3Gef~eHNC7W>=b7x*~$H6yo|aR0cW~m zj$t^m$&!3mlG7D+EF)>LxW9n-H=O@8ZUrDZ%{pIM5q$W#-3(&DnXb^|AXzsms{_RE zNPg0?6s1(NBt5Jwy{Oy#w;V+R&U6JRv&ecwS-l~SAbEggDOA})*4N6?<A!IEyuq>* zwd^OW=`gaUK)gWmGnS?Jh5e3GrL4ISbq}!%1f1y#WrmS8T3IV0mXo~1vJ};9B5Rhi z&VhJ{<lUB~_+}Sbrz`7n2>)T+AmB__sH6J_S19Wih{+^Ruq*{V<#7hSvhIU;p5$jO zOYzSnvYu7elMsI+`3uWZD71;JkCgQq#IQ$LwE<_kf}&kyMTV305ybf<pKV!+j}DU6 zMp^#_@e0W=Dr<%!r42*CxJrUQ&M2|*{*`m|9*)2OXS(8}@@!_jvIat|C3&S~DH2*n z);eXK4DkfXk1A`1!mdAu%2Olk2C<cp(fm=m7;vU58rzPBUz1gtgm9)S{@PE{3*xSY z7!K!P<5nc5|4{QU%9;-G5XrkOOEFe8S>KaYd5!pHC@yOl3dTi8*j2_XuRLAZ(-o!7 zLZUxO$qOO=grWmd)>Q%87P6AJf@D2Lw*p*M@nQDYNv}sb8r5aH*1l<i^=Oo>N2&N8 z_oaPV!7$^_c)91KQ8<eBWOb*ADj?AX;uMetBKkwz0dkXw;Shz7a{vKUj)SPw%ixu> z_~~T3zEHdC?7?{Uc&2M6+{XhZegViiBBc0fkjH=?D!-yUhYCw;*<Qyf29nZ#0myn0 zDy97s^cyf^Bg9EzX^Egp&YdISI-86q;n)i#w?KRX@-Z-ITZTwpDAM^_5@RP^7N3cq za%O0|_<E@I#E>Ot6pDUHM)8xJh62g^Ar^uhFXC}2cnV&i@&$;lZ}PK6Re1|!J;|pj z+o>KhOn(Sv7t_ut)rnX5W-nivty<2w(UtDm8R^a>(rDDP-&xP5Hn|e2zq6dV8ESYs zsw722vGFwY?s6VBz=Vf@#8VJ+pXNvoNW2J<*vD)D5^qAh4Dy7C4<Oe5j=2RS4nq7H z<aMCoI|x>}WLA5}+3^hC1xOY`415+u&>G@1kdH)kf|&Ij0Uwa;1@Y<g%pRbdZoYmo z+_8&8dKxV9>+HItC{JIbt9XHDD1gKwh_xU~M4Slm4agTFj)j=9pTh|tF%DuE$W1_n zlqJt3W!Q^6y8v|4Ew}SVqzcpjJnLSZy>m2zdh`5#SndG=qqfjD!F51<XXpLn$gs4( z!t)tm78bw6**;(v4g~2hLKe;jnJGd>oeOd{P$6ZNGOCjz*PZD?%JV4Xl57iAe+A<& zC8<#LC6N6h6srCM<ZmJrs+PUXqqTsAs>4Bs0u@q}ROq_|YA%pe2>c<)0bu&yA(p}N zduo&X2gH%TC%gudUXs-mWFau9Da5YOxU8@pIv0=_n|@h*hGt1s5)HZ(w;w0t6lonN zlZo-{s`kRR)>tp2Pj!33LbG7R>-+sq)#8vz(U2I<_|eC&R)>#YO+T8^vz-e37JbRd z5Vv6OO{&205YK_^6LAv6npgPJGmu;f(fU<<29VqYaWTmGz@UpD-VF_i1y(zqx00By zXE*IRC*o6r>i|VZUiSx#q22ZFbj549Bf#FBo(VETgx;OL9^@JkdUyH_kXL{T$=e&w zrLPkj0QQFSr63oH&>PO3-e8#o7>F7pD;S@_Ri01T`?F(XQK~J?)i7NN*f@Cv<RKC2 ziuXbOBtqjP_YW*qfQ^%$AU%KzDYJ1h9cl_-<KzyIn}9(YCu_r!+lJ-acxm@0)&VwN z#(<0fY`mn{;~{%6UQ%9_+UPd^E$NnArrNyG<rdXOF9G}vJ(mLZ62Naj?iZn#0Nw?8 z2dI#Uy$R6dE!Gvl-UMg>nJPkW0$d8RMTEW<@DRwofPF1skAy!bwfozQUcjFIUkb7i z;OeI5QVxdpdCo!E_Xj^~99BF}&R)141MCT?k3l{Xp(mg^{*mDg*b`7!fov6_SE~x% zVI%<+Qf5y;ZHKxJuqUAQfjllkPe64zz;p)e38<|gmx$1-Rri7XT0}F5cR}73p(mi) zyvx7_><Oq5Aj3rH38)1i^8kASDjv>c*BRCnH*;H)S86d(Pe5G+%TEA%0xHGkIg?;Z zKLK?Y`8xr70xCtIS?ATAL(NT`P13w8zeyd8dIIWIBz`X`JpuJ^kne%u38<7%BrQ&k zT|5CbL<;l-RL4KjCO~7E*bilP<}XjlOn`r!Wb6s3R5|(1ei?UH{;lHE6Hsg6Sq<0| zP&a^FZ$f&tswS*agx*8w?)=|NNKZgL3C~_2;|Zt~GjHXKIefM16PP{*><OrX_gKsU zRpiccdM9+7hp={*$za=__qGPxZn$cYI0CShdJf2J5igQ+A;<+H-h{XZ<Sr2(K)ea^ zhKPd@k@p?k0K|6?NsvxJrIzbTEz^}+o-4I1S86$~8WUQT4m(cWf;^W6l#RYj@v?;- zlP(SNk^Lrg6AJxs;8FcYCWvJ`L8}*Bh)(qGLiI6$-0)D`-S&&|Sh<+2W3g}?&|iE5 zLq3Ld5w+pv2IJXJ{?ovu5n;X_PnlGgNleKkj?X0KXAnm(%^<Kkc%;Rt*XthJ!>oR3 z8*3(DV-&Oce?b2Oi9(3$K&}wc7Q*|GAr8@B8tx1=u+|n~J@0|^5Rd(s=v25T0;cp< zkQ;!iheI(vFrc__00tbdmw-1lXLN15av=hLggp8qPH-gs3B>46h=%?G@pp)mJ}1-x z5-#OFc8~-hkq@!yYwmvm{iUz=*syBOE;Q?HUgP=GKUh!zldkzE1L)gO?_>WW2e1-% zJFdeAl>=Me@myy!&_Vwn%CFLTXSG1@PA{*`RD`}K>$EJ_ITc78geZ)=&i5kThxiEM z9U$=r#Q1F283`nwhj<p`VG)l*tZd>sbAiNt5WRC;ryWqCa+29?3Bqz+Ck7;oA-043 zOhkK#{yeqY1xR*<cn#zk5d$HX@QwBpfewm7p9^hwIp)Cjk&*0mM`OFf&}dU0p#m(( z>kiUcgo3=&K-P#*7<v=PHW7;W@(ZvBsE{@bLzhFH3|P#2+_azvqRue#2`?w9Fll)i zmKOml`JW))h*(5U`$8%WSjk6%j1r;3P61g6R7lyO@G?~hZ+@zfFudFX<HeFxtadNR zJtFKR6yyyN3LBheuJbPuIti_W=m=Cuk%bK>LX86~Y?xEzI^zKgFE_!`nc7&m@Xun` zc?z&_;W$3%*HxhKvb+Qqg_PHpy3S<)6QJvfL919yDI?rL7Fu$%-XcqPpygK$nHKP+ zV#d`LGX^ha=|P!>=&1D$6VB<N=d^3)1l$p)pp>3HI^v%(g~pynR&^_v|Hq6<>do$B zL8gcp3b6s?3=w*>`xcO!L?j`e0of;_9mH24Ux?6~-6gGErv*@<a_r6SiBN+8d$aqP zGS}$@*qhz49<K9zcZjnQ^!uQtH@ONyw#^I7jXIN1lX|oJ2>wUy0YDGE*==FRNl+&M z7Iqv2`A~$yj<x+<X9-Xt1r~OE33U*#u%l&v*J%z|*fAJnkO)0^JqKjA2!$P&f}ATt zVMo;f*C_)m?06332@!hmy5~R;fx?c<L4FF@`g?y^kpgFzDsoqTC;XeOzu&;}1z_v% zoFiOk1`tFPDWP0vSu2Eg<sT;@MHElL^9W!OMbAN$2m}Gnonc7?ICx(IoW~@j0Ot~T zehQqR+tn#HFO6jfO?@cX`8B+E0~YM02uisD@sw#%XPHX5Gyg9tMX|~|NW2C#=8HRf z#J4lQ*_4oPVvXw@1q2UUKOS1mxMZvnY8)j#g&L2*b3c&yzBfVMVAp941aEVvgksKi z356lY81jb!7INGHa+3sfRUaA7DJ{>}Q-JnZhi1xTrd0I{CkMP*{oe^#vc24`LE_;N zfY+pR#6p1dOK4RWoN`DW_1WHU{zLTOHAx;O%M@LTC;nS~paFaF?vXpZyc=fF7JJER zF~oK9fyDg~yFjiM@k@wXhq}&HKw>+@=wYri6i8eSaV5ybB7OqVZn(?0BO%s9{2k-~ zP@!^?`$_qD1j`SQd=p~9NY`lqk{?18jB=eQko*c_C&&#V^!@vV{NEsRfFrbUv~37% zchlGzVPzucxY=u1R?L-ue5C7q1ehx?ItrTrbLF!^W{QyeKOf|55%TMMK^_Kd{b)JH zb(#WI=Y<8Pyx$LASc(oY?>D0zq2;cSnI+n;Nx05rIT`CvwHiovfp`SuE)fGDHjj0k z^+0kY#A_fgikJk^y%y&UB#(z!3UaiFlOf)(<FpT$u?FIIVVUf8?P{hn&miN<@vO^$ zGhMId?V=01lGRxs?N1%Q4bm%m+0z3-c1?CAw~_b(g6~Q=_@LPfArJkjA=4`2KZh>c zly{my2LrY#9}iL|LYwmCAj?E(Q+^f5&w&aluub`XsK)@?l%GG*bru1(DIa<at{0$i z`RLn@3k+-OlrtP6Wf8v}=GZ=Q@l@A21+abM&q20|&_1!vH2f}L4*MdIvqi{Z{~P2V zK!voK!(LF2CkD)6N2aUEAhb{H3{ojV4toN~I1zH#r-Pg-LJs>IkiUx1K5_XBssfn9 zeiUT42s!M6<6Nf+V7s{w!dm4zTd)J)`#RIoeD6$H8UXXXcZ1vk1YSNRRN!b-;pOw_ zee?3}@viev302|Jra(*p0*C#Fuq4OXBca=xERc{K_6_h{3)qe{#TIe)!<OEWzDfRT zfH~<D5jx+LIk>WNG~bzji8RYew>-gh3W2~$r}*N|B=POczdyyd1fG+OPy4|yLQ5mg z7V+Jk|Ec)or1!z|IABh?c&6(#0|F<V5{ePDArw04!Q}S`%t>Daa;^jzQ92mehriPm zbCw|zX&o7`M<YrnBX7d?hUD}eMR%6#{9A-hMk*mX0u_?6laU6fI>1gwrp;!#0qkVt zoD&IE0XrG#IESbgu#=JP64uGcEK<e*b~1A3T-VtGa8*wT7YMB(?_t*AYe+w*dU?hg zlAtcO4!r#z*MT!!TSE#im42@3tr_xjQu4q5kMgG<CSUc`;cL)0|53Jium+{erU&$* z^tj^#Q!u6jJ#f31_vvhU;2W~en(sR6fW&7I1q%p_Mf?fkWr$~h#On|PPr^w6iRU4H z4RV`^y%6ITx=sy{cmN`Hvg>>eQK52@(Q-mcQXU18`4HnzVG9H#OCX*G`K^eK5HlCK z&Qu`T1L8f9w}Am#gBFLjyJ-y5?TY*@yCa#l1T9$NI`aTqf_@5ep$P3`?grT<LQBva zAg_qf64ZPtvj(sw=xC5Sp!&wJJS{=rF+)-VLf;_N?mv8UmK|)>?=o18t$>K)Ft&c2 zn@*rkZ-l((hQ{j?PRWU6+)Sa@%8Ka_t(Un@OCY%bVj0L15z8TN1i4JaMu<hH@>x`1 z#zheCg_^UR;JOLA^Hws_>&|r$1t$c#DXz}fiz9X9JyS=)yEHcDxPB{Gf9&&>6=JZ( zr1^5!$pLIJxeDY05jx@hXeA*B5H2QLW(K8ZI|rqFp6f4~MUUyw@%2@%^D1DANo2L_ zd?!MS$xqg>egL+Z902))2rVW9*1AqFphDVgF}V=x9KaTns&(vN0b5L_fJ_jf#bgJ_ zb`e@ko&$M8gcg&Yr?Z6yY%$pca)t<d?GofZ5n4?C4ssB%#pH#sR=Lis1a50regz4( zn2b7uU=^^%WFyGwK(LskgbJKJ61ppYx`cFO_ZxWbm5>&bzkz&VLi%#l-moMlZbyV} zYw~LeX))=s9=icsOj2wSXBceh#bhD*^8i~+Qbf2&q|71Wm*zY3-;!o6CO0B+JrFD= zDZaR~OME-?qv}BMy$jFV#;3*P&Ct?_b3lA|=MNO07L)cHT&E3Si%A2>G$2?^QbHUu zRv;8ECY#7VLjs$Seh}n7351JDX;=;)qCzAx*By{In}W2Md=1-|lG9?+YNP9v0JfM6 z1sM!fNX8bEB~Wt#TTDi6a-DvFEhaP0B=!SrF?k7OKVXZ=E(vQf(Wn0ZE*5=cXXs`; zBfwQXFk>;P#;la@2p`FJ`#9CRG8Thn0ZX>`=znzRCj^T@>H`T*b=Qo=U}sAHKW$1P z@lS0nN{d&WoFQ)O*j@jj=t%sN#-g;pzQHnjmTIc2yps06+siv+A??4PtoCQSPAQOh z9AY=f%_8oHxak~@kATD-5KYddv4F%45Ep`+F5(J^G3U__K;i<3w&!!o1XQS;<Xfa9 zFJK@6$&VoRfb0_SCB)jF5Z3_7e?tttkPZQoIc=B=7ZFoH*g4p|S!TFHJTKc%iDb{3 zi|wnK-#7o%b#4S~{dfUnp9rlVtuAID0k(dO1{o|u>&H%zTY(B`vqhxn68s`y=U`uj zrA3{C<Z}+zPlag}S_#W?z)Ic*a<zy><U9tlM}$iL2;>71DlB&k(JW9QWp)nM@gkB_ zg~ZYr=Ph=n&cu2m)B~_Hv137|h|rnX86fLK=s4;Ikn2V0OzbI;CjdJR`xnTkB6PR) z#jPyoK-a%Rl;c_LD9pQzW%W{6bf>k|<;;$s!J?zE?PAeU*t1u-&R)Q-s#j+PNNS(= z!&9zd!711DE_9;)=iYYnP}CKo?&q#E8c6E@cfA_qXCg*Hd=2uch@&AEUy1Jnk|#jC z0J2ZSLWtg1F-(EvYKUc5yUrwF`eumjl=CM#sq@(osnxS8@9-&8_8*TAb_d~C>We>2 z8Lg`)EC?!#E1`hM;}KuyV78rm^coI+0Nc)e1oD9hZRc{g(cge==X!(m1S+J!R^WwD z4S=n{qpzh#fUUrVH}d~*0O1O}Vqs8tQ%AiJc_QL}i#fIee{z%Sd<@tM-27&?;DD{b zyKmv>6tESz>Q<%?U@P#|AeRCa(q=2La~n%HDYgO+f*1(c3OpNRrU<RT=YgCfLM!mE zL4F}ZD{!ydS+xOMfqw~dvk0xg--3KCLM!mtUl2P2wgNvG)+*Q8gdMEFx6W6KvR+&X z%cX#=z@LD800b*=N~pm8n?6?Hw<M$$_=sP+P9MNl;Gcq=2L#)>yTX$2HdT~#TayuL zKCQs7!}BU&=Wi)C&q-m~LAxJXjlYNYpMb5#DI#2DQ>I0o11jat{F7CRR@ursT&Ele zR^t?3+$rw@-_HC?Q+(^;Sz~-!jh_syjySW#cX$3%;?rvU3Op|Wwi=iJijy56SdCLc zF=xMo!qs>z`6B^ajjsf`R082@yz!)<mN92oS4P*~NSA9!vDNq^*glY)R^z-oag2bi z#=StQfeOjkYP<ky8epsO%AGiKz*gf8yNH1STaA0(g)0MWHC`rRt;Q=znF`oy-1#2Y zi2z*HbLd`O+S)ygS%<I2{hjL1Ggjk&1uXyF5#Nl%=67{nhHn@`o7<B5pKdUEO&&f> zzUsCNd6O;vkG^I4VY0fXFw5%a+*z)Y^}k!|BhV|9Sg$YOZ8|N;zb5#@eKvhUGBKR2 zf%m#jZy+%N;zE#fL^MFW1M(VBIUl0G)La>=;W?WgbTa>YOAj&HkI7HG&vk|araA9^ zR$Pb*F(;*DA1Mz3GD}~-*|R>d=V|T*>T<W~DVoHiWX*Vh;0s7R5Ahzzb0Xe^`0_Wn zPayGUh*NgE&hfykzd<;&A}#r?Y|3wc>Gw8BtFD99*vr>GO{n;{1QdX&dje#q2o?0q zLj>S}nXu<!*LeV_kZ@83R6fED0wAe!ZUDJlgo>-!gAmX`??j!RF1EZU#cuR+<}RXI zACgrM&lvH(1<~YD>;Mw`Atrzf6R{WKJCIL-3Moi_Ny?p%xy~&>@;iv;k8`pLbdC?C zlDwduEC#uZlodd-9O9F`uJazyL9bqP-Waq34?UnSE9UyoG29a4$vWW)*EtSIjD*+> zawZT+Rc{KUTxXM{O5JQv)sWP$V7fge^)bi?lB&Kmthjoy5?;--L(f9#t?jCPp(*K` z@I$r+rPvXC_cU>|*CZZ9yw$1W6ACB|3((Eu%|QY7#m3-9a&=8c_Dw;yeN8*ImH&sb zH=j*k9WrR1JRKT%=)2j$e<1LD$fLXN2SOf_s$b1W|F5*HQ{6VKktRqP6<4JX={#Dq zuxj&}K_#U#$QM2PT|{03nmM!e|1IqWK%dAWXa+#_UqW@ZRL3oJEAoqSy!_Vrg>JK~ z0tQ{Ah2!NPkuxY~V9wYg20};vqp=}ya5FbV<HWs9NhOG>bi|Vtb-nx{IXMUfg1Uzu z?~I-@n6it=&B-~G(<CpWgaL5mkPuH5sf1jqm*%|g?$FYdIh{(!7S)tWcfN1sHf@|6 z<Q1e7{ed~1N`u70#)&CC%??j4&yo5fKQIslGNQOoU|vWzKU_#HH>~96Bh0iG$f_>J z9BFy~2%5BIrh+i7<N|hig>Fyumu40hX178_y^yJ<b!HmF0uA(E&mx)J<|n9&lx!VQ z!qz60L0Fq<jpLLzNo!?4)dtzg?gJzIsV(bs8vJQAd<Wm@SrnR($Z@A)e8)aYLT!a1 zL5(VNke%96C3pIP8l^J6RJEjJ7^;mL09{=U8B)j`@7lOY8#QRRw0<QAhN^__ho|SL z0zHDdUp}H#<yL35nCj5eb;nwJ^=i)u>VZJ-?u^c0>~$&)y1!4@AK?t>8@6Fc_6zG0 zlEil@d5x6;IaFt0rp~cNfz~6!DkH~Zf8A-nM%AoQOKG|cZUUl48Dc4U>^K`S^IXs2 zHMg$IoXb;N7P>Z<4^3XL@wAQxGuJ;frDMUA&Pq)^eUZz_{;`?eBsH^h4xib%htKT1 z!)JEB>z+4)d8{66+TKwQ6l7X<zDvrX*-B#_n)S_sSzpw6u%za4G2QDNHaCOG-y$tw z>dtdRr_eH;&MZ?gK}VG|o-?JHW0&pc;X;jiv2~_wIFHIQ6@+PR!cmhsz1udDr8b(p zhx>r?MuIT4Z#<Jaq{l{TQmdsC8PmFBnj@S~Hg76|$zB=E*Td$tadcLe=8(<lupU*1 zTuqk@57aeq59}(^g_$`hN>ANX0&_O-71b$SV(BTt#uL6*YVP(<&D}oXJZsc_ny%?q z<C(6^1|x!NY>>^I0qL|uEg~BR9%@?laECJ?DyBiIs^oZDrt#1SM$_O-8-pY!wwFJ) zs86X{bEq7~upC#qhG+VXfOkYVC_-;D64CTZ$>Zl?<-*+2Vbw$O$V_#q(S20fNSh3@ zJiT^}$&?R!cx<KtVOniwv0++Wre$H;IC_*dE_BA@8<#w`vHzRUs2mz*BG!jhJv28b z1sdhsj}C@QsC=@<uiEgKMs+|B|0Uxg2dx&Lnzkc7Zu;2LeQe{5@|+-fS~}TUEa;c| zMm|{uH`p9Q|MWv^<BZhc5W{hrAU%t0i9TN9Q(LB6{)8VHUEH-&YUVtim0Bcbcjvpz zHKj}PgR0^Az9}G9bM6Fl-GAoi@#`|M9Kh8_o_Z`@wz9|alX}dZw|eE$rHfX~TiLB= zb&ussm#*xwYQ^#%ix!^PW5Jv`J=PBBH?v=#Zp-J*J!$sJZi^N!S+%wYd<&P%S+r{I zJjZxbgfnk$pFRV+&rumGR?eL}Z+`caoQUBIm#hRQEM2_RFgOC{lR{?73m6>Vb+RK) z0#muXTO+RT7jgMTu~OglR$b>8_3{h6f?9}0^ZlZeeLog2B^SQfEdF|@x^MgOPod87 zD`M_-etx}QQ3E;Hj~mkrKPTpXnUUaS*KXaq*>___Bzh}fEfzz3ewxFDVP$zar7o+1 z%PWf4W0Prfr@=KoRvT;BO3q;4Z?{Dp`<=7W9GAecM2Ty$aI&8l^M0|u*7u7|J}-8x z@3)Zr^>)S1ih0jQ+^t)s4s*u(?%;CY?{=LOJg`w(brp*|&GqAN^L>Iy)Qzw73$UC& zzL)P7Ltx%KKO5z-;YKx^=krlDwMlu*t*`fUs6x6$E~CQD{lcjv4OQL!czl7Mvm%4T zYtwzR<@kI_CO77uMPp2I>4KhWCT}*ne^jnVnB34<U61&5zl3(6MT)6R6BYS^-{h%u zi8%{Fzm%}-Y_PV<iMI!jHw*2!KJ3nYAsr96{Mi3;Le4(v?H=mcC%sSmdEQ=zUdIU_ zYw507U2#zhzhjIxtdIQ)1k>yNjt}~NZESOVv!75xZ7e<*43iBju{1w-552OkCbn4( zr;_S|uBTM**Xv)6ZE2vpxya1(?$vmw3Uuf4diC;SPMiTy1X}2~j<@ui4)9z5%rCF; zO9#NXmDZy}{p=4R<|EbI&z=K1#BWAwT!x>cdOe-l-Clm}_1B}Y=xKWKB*s+iC*n~# z=^-&LR_ooczTSH$QsZ|)%}S{2pw3dN-^J2t07mmw>#y_umPN%4@egA02V>;8hxdpL z9U55b39jivAG?FucqxYD`Ppy!&Altu*VNVd+5BI{vU>=vu~jprc@dL3--Thhrg4Lu zLDN`?w@zGx$t?AodTVOx#`*pvu+zj;7b{UBwPx=6P5U3^`?E+`7bs}a5Z@QCi#Nm< z#NtoK8sc;y{|3hw(0w%dOOg0lelAn5M|pX7uKBV5$}l+Ifm*wM0q$fPwaHe?dZ(33 zkQqsNuVU#=4A1sn2rJT&>1b(V>iniNC;I*bzoYjUElcy=M05JoAm(MOifhbzzd0S* zbQbg~RkF?|eeeTk(*`+`ru}_?qUwwMO#ZHA@{=0Wv974a_3`Ve&?>4WSU?3;<A(U) zSo|#NOyx<I*YkdTSbZ54t8uR}uU+78<Zbf&_?v!ye4NIZd9qf1hgfla;9`b=yMAuH z-@&>h?Agm~45}kbye((YG~rZ#U)`4Gk=yWNUxjqa$;1Qq>N9BqhW~vDXZbna+n(#^ z->;T6Uk|c5G@$P5RDmfIf0z<4VQB6+gSuuq@n8~fl?VU5Cl8*Q@AkKzMx7~#*})v< z)-&Q;HU|<h8hXFydWD+)JFK15_Pa5WfmIeS|JwXUfw#E(d}SnpP6;QF>#f`3$M5#@ zE`wX0L&IrU=GU`eA-|f*7AG-#EY#p4u)H(D8opvw@Q=~t`VGu{cf8-w#&>6Ez}rek zl2=gg_tx@qjo)CaOl`2*bf+#W&?^QOj6-vIhU{C1H=5)p28Tt)u8aN7D&Y2b5MPvH zcBlFUy?l3yAD`iu%(79nk_vmdu3Xqyzu6I3Ii!e{ar0MS#|papZgUlTDhr|4v_9rt zvhfadQC^`ccs<PVHMHNWT2flZT3&bEO22S4sayR*8(=ufhIpx5M-J^Ad%|zBxrblu z6~AA@a9Heu7S-3%^}_RFJN@j~m|_zxxy~=F_e+@0J^j3?ehaUmemn(rBtfGm&zr#f z)5w+^F6}wcFYoC$!QI5F{id`;5$Vmx`)%Z{a#kWU*tBNH7KDH6{89wl)R0~CquDK# zUF(<D!t`T2#W8OUF3!p_RkeqyTGhCuS{DDzl2X|XfgwLG{eKEc_1phX&6VwSa{WSY zTD{+9`j7SB|KkoSVssR)V&wgx|J%j9q?K9Yck(*bj8pL%ICTteZ-#ORt5fANNV8*J zcbC5`YTGvA95vg5%kLEPUU4+N@7-9>61Ao#@J4u_Le?^(7+cZ{Sixfxv=nL~Jz8s7 zecc#a-B|06C(imH-Vlpl$Lh5;R!^+OinhuYGA(9xtmzH5)@_av_+ZUo*RP5dYl*6w z&Qki-2CVlkbZf!?zM;O(uQDS02wD8)1}y#`M;bD}t|&${mJwqpt%a;tpr491PQdDP ztRc(wFN`%<h-Kzij$33NGA|aV9q?E4nW8c86ykxHSG<y)NP+inm&M~aztnqdef&DV z$rcv-m^aiV*2MVV(yH=7#c~5V`1ls}etE6mV!VD!kCNkPF+w<{;fLDLNsU}U$`=g| zebJBl8M&^&RsCqT213pMiW~aB@lrpUof>WOtN$Zk_oG@gg#R1q|5M1}zV3f-b2VNE zS7{&*ls7pla4td5{0LJ&G1WG5IW`BTU(f9EzG0{DdgpKG9`QNq@FwW+W4aDI{=Yi> zIC0^EC94((ryq98Vdo%omM(_iXaiFguUfQn;j%@iai9{g&0D;fgOTM6m9KM>h09Kw zz2c-WZ^_(+vzN?Uu_BaRI+sr+&s?=~;i47)(-W4(nKI!)3xzER4q7;&S-3Pn7cZW< zc=n=2OXq}ktel%Zj+wn;#k}R=*-g!fs}?R=*=^yHA$B(7=W$Sz`e2;*mLuQqd!@C} zh{C{^vLaof35?uWQ^jaA=%p!scFQ6^pRH`O!SYJY=+4~ws3*tt?b<uc3l_&#_^nXY zG^WjjTQ7CqWm&eqoc1Ncu7vXkAv4%^7}8T8>cRVdW!rTky4W3=dSGvm{`scwQuGyT zbLDzD_0ed|`*6)!GC%fOaJZ7E_2zfMp5T%Bek|s#Q04MCLyKK@*1%W|m5sSY#n2qz zl#+ECRcTTJvaYr^<`$!dU8*!{U!5I`Pj}r=NIGho*VM*{z0pxb(5}jDZN%WtuVp7u zSYK4*HF3SwaEr4woCP*bTz5Xw^J6u&rR;cXl*=W10?X|0kC#%L!9giCv9k&reyILI z)RQUgDx&uPWf3($R>mEaQ9~IuEcj+YP=!nb53fRZT56T+X0pt$S0#S50Qz+PN;0jT zX+QkMXm)<yAdB8vy+>IO`Axi<r-==kJWc=Qo>eP<vcz(>h%tUrqpmsJBsi{b#BiwZ z{&Tna`7QkH0b!*Xip$wQTZvxVr)xRNvq2K8Kh#w<^oCV~?G3yf6AWg|528wgHJ+@J z{KCZ8D{4*}gTwkTtbEI`fa?N#0}<b69@QD6<ouR-As1&)8r7F>)VbJ$^(#5|(iYHL z%1z~{%l|nRb?ehuKr+#B2nEB;IXK>CrUs{#!4}#5-1qyjiL=;f38$!rbY7{MwFW*N ze&96hh*Wz@+s+jG{Fh1DI>K%G>PkgvGZ^1bTay$IW_~Nw9LI@oonJf%v`&Y>wagJ| zEF-r$9t822msjt%FimjnhHJCm>=Mwye!GG&gAG*7TgGt)_G(KUit2!@IpIz>^h~F4 zzgz5hZN{>Xi9HzD;rEO+uj#HSc|<X|Ydgi!e(4CmU<HYT{VJuc)_%BZDhcCsc2(pj z0{4|qcv?EfFQCH898%=B@|L-_l`Ib2U(9Q!W59;_oSqF@8SifHQ0=^Fc-YQ2Z^V)~ z5uTT)eZ03qZj(bYnv_5==0?@L)3@OET6mQ!1FDueaM4ETD)6p$bud>)Mt;ouV1r9y z+`GorIn<CK@x2W?nfkjU&mQ+W-GQZVkdvnqV86IHR^PoQc6R9O`~hG2IcL^9UE>en z1R$ofo;VFr=O@n8Z->~l6l45c<&|?dboNH+p`GI1w~jez<|$i`7)g23um%~cNDf2J z^KRdGo&MJ7Ctj=HJFqNUNX&bkl@^5KGou*^`a3Gfp6KU_@>bAcmd$^t7xhfQe&(mi zn9;#+ky7oaxiI@F4)k&^)<S8u0eMuQb`(n^iTwj=xNzci{bBwDiC&=@UhXG?<Odri zbCRaynAoizG>|2zjhdf@n~K#i8J`Gxi^C$#wb;oYGpN<yg)#5X8<??d2~vv?=ks10 zj_p}!=eo9z6l-!cFj0#AmR&(l@=Ib({j!CA0bAS^ev2x<a01DLnT6Vq1#4N%Yf?`U zk(hS@MY5byT9)_X1`VZLZ>M`ll<D>i8!gHX3(vm37|kfy>X!tgUMCug!P))!g@gQ7 z<NdDu_Fz&B7E68)2BeOW3Wmeh17@~C>lgrjYc?3EX_1X@mmRmbvLV+SsWD^~Zl=>A zDDNAm-f!lex3N3fUpN}jZ$$a%yZ1atYaVflcdY&*&2W4B441qT??$itmUK#3X)>C7 ze~8!CKS&M@c<UPRy51#_9^*Dh<!v2Hy|_{87h&ov@l4)dgc|-}sq$NXdv6_gvlg8d zD7!gi;A0*cMQjgKcUTdA`<S;Y>eg~*R?D#1d%9aodP&TC_4HJC)%snzNm1{&Rpq_x z8U-}+RUCa$WLb^hq24dk4FE5PaDqN`y;4`TWK((jMlFe)mUV_TTc@VS)b=2yYj@>N zc>mDw%5INqTp9So)YgI10(v-qtaWq?bIFA|ipR;Jjt*UwvQe8=*4un;rKq6TYxtop zCRS8nX6Dl6O&O*Bv9aT0__3JxC}#<B4*m^(Y^slU4_t&4VEX{?=<csl7izWFA))a! zVL2}fs#Fhe4lA5oV`uMkr@PUYZT!F3dlUFNs_TAy-W$#HlUErTY>csmu-P0N%LZeE zj7=zuZ3ueOlaP%p#fxkdyrIP#V6i4-tqFu?!;dUYXafmJnuL-Knw>OzLP**yP02zN z8bUUj1^(Z2@A=+4Z)PN$CGD@De+AZj@0oMYIrrRi*SRyg-lQK7Fx3zi6!x{Uox#Rb zy9TAbKC`qE-m7H+kLyLQm=f+9w#l-t8MUlvR0vGGx)pEMcBL=Px*&!k9DjkCcQby( zSd_U7yOoJ9Rk}yqNp-1a^8lL-xVI=*Q-~Je>COH;HkzdM*4NjJ34a;nri7Qsy*UMG zVhhY7KO8$hn!OAOOrYn4wGGiEeBvI@3~I)RsHZScm?nt)|LO8$Ref&GGW;?a1jB)0 znX}3;SNtNfeGajC<XfWg?~ICXGP4@YM(h)!vk@M^XKgf{cdqbdI~6frULz94M`C5T zPz<dN--gzYt_i+5JBRJe>4k|=?MpB-Y97>C6{b?FnlWWtRiBfI6H=HsAuZFV=2e@) zwQ7oyFcn)-m<@_wbDij-3*q<!s7s8{*r74O`~s$oKs-X8%5q~)ym?h&(3l9DoT=9G zRoBZD?rvKo6axPv<JnPkW<kn{>0C4mmPW+|*jq04qX=gU8Ku^8VuENG>*1sVX348^ zdS?*6$%${wyxNhiW3pT}2xp;vI>o4zDKd|VjzoQ+ZNq_+F+pjTUTC=~9j44$MGFwT z#_Om66!`iA)xaoQVl10X@xZof)j=tOH4XR0{)AgJlaV64Qn$EFK{UfCybx-PLQP_B zIsKvtyMNR1P)qh5@jw&+!)z}6=x~Ev&Aj%0hdOJDI>%k5bFY;UCqXO&1-7Ix_F>ps zej2(_JZZGoRnfesqUHEKh|bJRe!w^v6@y0#AkU4Hr%YBsdVfk`r4p8-XOl>uJ_sA; zhMTXK>{Yi#Qj#_(k8Y<Oh%w4QOf!x)9>HTLbjLY}g-`JCLmJMwZz56LgVl9$$vJo$ zgK5I#3D%NWo>f(Oj+L_pt)_BwJtAvgv9mtkSYOC5IwC*!h~oWNNQ{@6d2NWnBv&Z@ zTs8;9XA`57Rz#;@DSk?{ctx}nqd_=sezY_k!ulq}KIQCi_x;h*7fAry=k9oRGQKc9 z%B{u}beF``6;cIacy4v!r(WzSD{yZC`VrKNtSm5jX^xhfI>K6Hd^dEUnvO*O@)8X2 z`>w~6oZQ8Q;_;Ahq&x*YJ1U-ulB|Y*uriX)eMnpdK`*yQ7SOkx9ifLQ&5w#5Q6u=p z%8Se%1s=0tSx~<qntx_gLP;)*N=qY@OP*>OTcbjsHic7-)Qd3rfi-rDB%{X(tD>oE zqVvy+Cdr}~9mA2DZ!HQ`Z|$^?FU@oQTi<K8J6cvnr_7I<JEK#u=s`EVDnhd>UK};g zjcP^vGSg#4g<VE@R5;Zx(CV?z&KZI!v-BO44@9$8ML6Oy6;raNdC}Bm(FAK>u7KsM zoRz`Q1mDOoZ_b6_dbyd-)P?<zq8Ut;NqR2q#rP@U1o?%tBB+oPA1>q`hE92$FV$zB zTwWKQB^>uh<6v=wX@ETZor;d_WRNk3Hj`zX%8-=YF;|qzrcqOMn8FtEl(BFtW=A+X z(%2MD>4=U)yEA2%M|y9aA2nVcO-6lPWFA>d0P$I`=9(fC?A4GkIl_s6sBqiIutkOA z2dH`sj0pQB2&Eio6J^jtG8}u*rkXot_4NhQo{p47t;n&%*zGt20D;l%5^J5&afrF| zar;)=d)T>8{&;c4A{6b!5RcOrg@f|AWb7aip2#B<r$qHKnK(L{aG5D{xI5oyRw{mt zG9?l(i+d)^^(8i0wo8)2TA_JnJZ><|lg*Re@O=CYC){tg)D@PvBr+?W=IHd;z4^9E zmRnAoWRQE<#jFV*mS08bKg0VYbHP*STx4{j^$XoDtFX;60kh6%W+B|l$sne{;S}+q zkY>Lf%fmW()RYUCnx)IS;(R<-m;ExMFPvU9i$J3?fASGV^ON%16eB<92xMPlb{3j2 zUp0{i|Jv?g(qf3+bA2@FjdGnIop_R5(O=3ud6GQgL9bW9vzDf4@&!ntBQgEFsVP&6 zU(0V(F7I<wzKf&3l3TjSY-Y;T%TjfLtq6My<&k4t;RSTRNoiG7JAaYz;b@Fp&NNTw zkvdyat8Ge^nw6~V(1gYxg|*s9qz5)8o5{G`NATB~tBIrLXr@U>l_gf5IfNt*#8~@3 zBwR*G{uJwX87xCNp^$H!4qpRIZjk1KMJC4JHE17G!uQ*i{(+ieA^Zv^@%G4^OkB<0 zQA4X8S235Uub+mF8^bCpYZrEaA}l<k3B?Peam!APa2&wK(VA$AHC@xIqiLEptA4$G zrlsDXOz39~Q=MJ2zut!MkkCvSG?<r1M+<3nbc|fEu93@`@@omTNy65@L6!ymp~;Aj zQmAmRZDNf5Wp>BFG>YlMA)}IUHF|%OLk2aotAMz$yBO%B%pEubXEMfzHyb~i6^RUc zIQKI?+|!IbhQe~Q27Rt8-1)LUgns>h(+YPcR=Ca4i=-RZ6)sA!1+$!7)Yu%&5T{^u zYo0%2*pwyJKZH2_X;&9GzgfT}%O1g$^Eeuk6372VrU<P^CjE8qiE>yX)nVAu+;>3u z%Biv=J0G1^-P&lZ45M<0?5L<tj?<w3!TGFQ4^EWWiK3jO8n-UWoq;iKk*vJz&?84o z8&=Ji!9(UGrcw*5u~N0$E>ZpJ2(SKNkE9;+AsK?vu#U!PG84g!=Ova4+o~@yLTun& zVB=7@BzPG1;Fct!#)g#qHpg0Dox58KCI<~6{S?r1m{>@!kTat)rWAtjiO!Hqv*~qm zGIcIaiB`Zp$E=E0pa8mN{+Jxkn}SvxO_Na&lga}!dBDc)(K4O6#Z=I=>!S&qqoXmy zLMxHEmTVuO{n$x{T}Us(v<ACv7e&)?@(~-Q=s;x(C67Xce`W#gcvm!e%k|MLS)5L8 z1$lLSG*fyonZ!&hNNAwt;26*N@B_Z(EG&edMISUiynncPezedhuvIPXNh;&k=hd9B z8wO+klC7!xdaL5O?H5T^CH9M|TNCyTuzdSLB-<**@NN5~=7wC;lKqDq?lw2z_6*!^ zAOVNSqPmaBak8lHEz%6eqv>Fe$G5w`#u?*!8&I7#pzikp^}4Br{0SJl>mYt=Cl(HM zVV^vzn`$;J1~8Q4c`r`NO$c8RA}UwO9?fsfdAuoG!pR5i6Sb%?BqO#=zG_jA!u_B* zU571)!D!q9tXGQ-g^!tKO`(3U8O!PD_(JhlIJ}$KsjhuPbF=6~JQl*2BY-A^Pats2 z<`~X@A-vt*kUW9gj5TL8aVn&ohv|*nlD^1odEpU5E_cxGA0gV0x>7de5VyuoSvzb- zdbKP7s<Y?@n`Dt3OC<;NU@Chpl4oZq(MKhc0~{9=CZRh#5-V}ZK8hmyY)z)hl5MGZ zlu`?ISgnqxEmoxGt8H@gDs-n4v4?meL}e8X%J6WDHu|DT$qML3C)(L^%89YE35Rha zuIN7y*JihJsH(EY%fVyx9@zD{6MUDVdgS@pnkcq6DV@tYoF7N<BMv_doe0mbU=Mae z`2HG(=Yv<7?yw%~hAqVfE<&s0^BHp>-pA*oh1Y9%-jAq2a6Xd?&WFt=;nUcRmuKcs z{N(^sTJ*LEsoKIlW@#ml%%`3mO_yE%A*|M94;ZmfTe!(=+agHoC8p{og0yTkqEjC` z!YM*JM<M_LifyF2WmxS_zE1eiwsN_LO&H6WC1JdTjKFeC4$CpK|BDt-zeVnC7N29f z343H&t^NC`cejjs7Y`?<%X$d%q-(IFK8{hXiH@s_8bO{8H`HVJsO`W)st~R+m5GB> z5C01~gvsH%^jNYPXR$9MgNk`Bg46!!87ImUhp9JU3^*?QWG$Y!L{q~Dci|~v;Y(P= z*@q&?B@rVrArEHx9Hq9fN6IN)zB7XtB5|nwGquvOP7Oc0OI9~$o0fJA8r;RvH2mHz zXUu2Vq0qXlN|LkHC>BLlz|=FN88~tc0eF;iYD|Ez?8>l3?S6LZW$R|DJTJO2nzqrX zT2ob2%-0bcGTZuMD1{s!zS8<yG9o_ZL91*=9ks?j6~YmB6Ty>SBzr28m&#M2<Iz)@ zM?dilIQ%}1PZh-7%c2)S%%pj;nTKr0UnEn(>39u8A0{E(<mv4)Fdc?0c_d{8y$BPI z=ObnEN<P>UDYCUwXF6VaK?ILl(U>yLk?LM8k8Sme9l`nXkPPM=Ki^21A02aMgrkz_ zGNG}@ODPZ4Z58}XtKd4@zn}_^gbF+v%SA8R5>3Mv=yC}d{62o=sjw|NqA8koiY&8^ zSb<(`Z1~e~v#G;ZT{9n%i&5}vSn2skXi}5l8z25W---Lv!Z%zqU!FywJHm4{TYHl4 z1%G0O-l%?>Xu>S(aHl{Y!y_~7GVC)C%^pfVG^?%uix_%+RNwt9?R1a!{#$Jw8-Cy_ z7#n`Mrt`Vln|>5okjKLq8~+sLqVo}=6R<~VCT;&<7YQ;dR_^4Wh)u5eq|H3b#nIMU zyciJS0XsGZH%7I1?O>x$-s%gR@gTEshmEtSF@K_LqZj0~0s;_Epg1(1Wk$wY8M@5I zVr^kLdL7%f4#|-jJH-MGW0gFym?5K{X^3^0(#f&{)29OF7IiO^)bezW<iIDxQ!Rwm z7Z<<*mztph<I{06KG|E?sl~w5Z3ZUnh|PUiqB(r*nun_gqhksa5tzq?57bJvj4}+Z zt{R45=rn9s6jo?4vqzBC5S<#1E>8?chZs%VfUwI92pGJ!K(E*52ZY=5c0hQ*^hT(R zssW)Er*mxgx6F<Rb}X1S7Y`ZHv0oG&btXFbMDHm_YRssBJd?2?e9_s`TjEJIy6|b2 zVjvMvCw(hU8K62QW{xb_J&KPkdO%^N_Ps~Vi>BGFCx0e^1Cw2hVhn?9*RA{h_x)Pp z`*4uP9#W|4e=+3sHAmAfh>l-=R&>O|XyV*x+C0<yE;POGy?NXFKDfVGI;a2ZeNm6$ zVIQn8JzA&f(#!#gXE9W`E;yr0yWe(cH)HaD|J|7UjW5iJCY)S&jr2KpA+jfgkL2;9 zr0M3~F0V0SB8$~&tzVs1cXMw_tWEvgUzVl^Mp~M_;xD;0g`fS>N;<;-TQw$EjXdKr z(yH+%@Y*P=#)ESBq%M3P`VF(af#AI9nubEBY^!yf=ZMFy!aK1?To@gPSsBhuUlbj8 z0gg>a$6gXG#4*FoQRA|xep$5e!l-d|v~XqAcu90Dw%E>7I^IN^SHKo%JqF17i=(mf z#A(R9{2=+3M~xTA)}q<9v}9x+E6+ZL%<>76@!nbEvNLha5-$N<5RC<4NHmPSQkd$^ zb5L@_zQ&c&STGKN@jb#Ir>iD}&mgv^VT{MDAA{>;GnNiv>4s9z6o+D?2BTda(A(_3 z9kvX?YV4e`6)(MDnt<_Ec1a`(hj56}_P95gF=}RiH2EgbH|vUWs7i<&9Xk5L!Dz-- zybB|ntFmUWOV1&gFeN%hRxSe+i6xhq1(7&)c!qGF13P4~H@SpFwQPA;VaDyxL2fkp zoIyxy)_uxYdF5opjKUQW-d+@KqZ?RT_<Xg5=Umu6E$ku|c3Wm)#dpuwy7|$J7S^fM zgzR^XQqWD&<UVl7G-*OK`AbQ&q~4B-W<U^*TO#00RADu4r!;rt{2Wf!$u8+J;dgh- zGTTfMP{UZYV((0zPx(5H<SpE)P2w5mH8LD8#1u0;0<VRK+ht!k>oJS0f~wCB{)HA3 z|C?4lH$T@^#DD9mM?xg3f6lh1rw8c1WUBUpFL=eu=e6Z8)e+nBmm><;!IG`ADd-~Y z!?Hn)N!a%PFWL4FU$M`eImf{C?hvmV%D}V^OBq?O+$7Uqv(Xqn6f_sYj|@NRmsV(I zb@GDb4y<M%cT%`X`qGQ#89ZLIj9=V-qvVidV>9IIF1qlF?II%ED7%QG-rX|lUF;&_ zRD~?lCSjiVh%VIdxC%Ql)9cJogBQ_-0sFko_se?i!}1sj>F`T|ZYBPCpUmyuV#efh zTZyt$cFf9XDjp`Eg$>2%nBG+g4_VF0Qi!X$y`yc;$>Hp()ttC9Ydg<&e95gvbGCbT zWH$%v);ybSK|L1!JhIkdoOb(|BiUWGZpGfE-3T4kRIWLvU1xSn?}10M7M#DSu?x;0 z+A4B&WOpFtS!Bk7({4l_kGHzqf{uHZvIS|2!+kp4g0zR(vD+tGkg@aZhuDIQ%aY?+ z?o>QBHD5?6@aQzm;IW83<c=r~DWEyXXm8B1dzlGyuq4mihBW)SX&-61?9x28m`?7@ zqHBO^=XAe{#<O`emhs^uc(kHN{jrJpD%r#wGMkuY+g$dI&oY~sx`wtpm<J*mn#YI# zc9j{(aborV26Fqp!r{D`@O-u}|62#g=l483dvKJcT_axbF~eebqr7>8A?i<i<wRkK zL)$p4A^V#cA)91??CiwZcAPuz#EE<yTiV+>*f}_Osr>2;H|B~DhYw-f@O~r~$pxe1 z4};G89~Rd4Uu|!EJ;WKw&hQ>hej;zlP4@E9VF<x45Z(d%>J@qp`9pG?!=6boXEYAl zN9u$Ak^0+^V<HZ^-i@=jYofZp!$WyIkH^UfI~Ma$+_6P`*9V7RaGEG;d?^Z8?306( z(bQFV!`6Q#=T`ZK01oHz_)1i`T^6esuUZPyW%69Qws5aFMkE|7GYp)YT^o&;kGiaj zX3MK)xOFhP7$-?WtWVFAYc9IbBze9Q3T+w^@d{w!yYLkr^NG|WuRj<~I6K^RuuyDX zV-5u$jZ;84CvX7kiBqFV#dchK<hu!%p}hD=nb5<24C#*`ckMf2#_}8N_jwkETRIOu z49;zMg7|XTUHg6D&cW0#YC-lP%nF90+&ozW=kAE=_wN7Me|{pIbbYw(dI);^G;`n; zu~1ulRN;d%55kV>=G@Jo4&v;@IQ*7lVYy<LIc}G`(H!y0$pdaVwkn-1&iK>;;&f2> zI9^?XM7)04a1_FATKEciOA-T?EJS4&839)e|Af^IPx8t^ICB~YAANwdv5(3(!dO4G z;lBk3P{!8{<4tVHt$Q+qDJt}sF*w3=)Cu8a9MhFCpw4_Y?g9CfUUbw&(X5N3Q`%%F zqHe%QpM}NO5laLfX-?bVZACfqI?Eg)k|XPQduGo8?7qnXY`jf`)75wzU<x+0=HdP9 z<8o#@R^ITzY-$xAp%=p6;MHtd-A^>}#nZF5p#r6_dyL`ua+zpput$|}Kv$x|9FYIx z?q-?2hBp;IFP}e?!F@vbR^z<-Dbujp$1x+svDtEl%IL($qDePIOIJrHc0?GnPFxu+ zExsQ0IQ#Bs>66Hgqq^AipASxR=ISW9VoRfdFK5X&;FfNVW^a}=>nC+a%W>knQ}#=a z!LtZ3PQWQDoZF91!m9wy5e_9BQ^0F=5O9>V2FSS>^Jg<C-7#!l*3*dz%#vN9NpfTj zw_(HG!;jjz$_x4q9cJvcohFiw4!?n?BzSRl0OuUU%el?=3o4Hwz+^N=<GE=!4q;B2 z0(T;f_kG4-KkCwGjCn#mM%E4XVEGultF<f|BX974M_8Mq5ooe)B#-VT_fRy(d{gC4 zQ5OEv#C6FAl&xwTP>_0?`FshwmE-hW^=<mJ=$-<qEh?O5B6S*08o_`$K0r`~a3;PG zg%jKPs3H9OT6y0K1^XIKR=bJ2oHvi;l+!&X2IT{15M$nvl;df!cO<ddv@$wsN!Ck} zgR-Mx_mk`jAX9*O$#O$hesiSbeYLq83X@?XRvTa2h4_GFwfIh&G>zx<>ShtAvqGs* zJct{A(6#N!c-|t9L?V3BOFl?<r{0mxG<ydDxad)Qv=9x@Ht0X>E*?C}bQM^qNiE9b zI@F9AfbiLwE28N7!lk$5=gNx?ol)^3X>x01wR8#I)9TBGco+_$^Cc6y4I6RzQj54v zzV~J~`{Zu8(quqG#|jg#CkYAXtx$r~<Z$1anpfWT1MNZd9PF}aJTmNlxIV;}VCB35 zI%J#@JoX@#TpJIfKSX1dmpSB^U{%K@<~1J(cNFL24dp_3aQEiwCR-b>IKah6ZQ&JM zx8XVG7`$bDTMn}Tn1tYZ7$(8H_nW@yy?YMk&p4vkS!{k1Rq^NjGLFv*@rtMPnQe(4 z7K6fdAWK)8=wW5hVGj#<8)Vmq*Gc~>j~JvfpnDej(F10Na#rUJh4AOQIyq@**{zd? zx611Yngdbx9rJK9Le-d2xA<*)$Q-UY))4+t&yCu<vXk}&9KM_!O~9^n0WYaYeMyL} z_Ehus5~<Q}9BW@_l9Oe1;l9t~U~CkfQRtG;!n+i^8*nBTBk-%@W?{gP2^bFLP5%N- zyI&7VBND_K3>4Nx=#w<8z>5?{=*+Wlv=q-^<fBJ18`qfXoNzs<Y7nMXqZuSkuVFJ> zg-MaIskw;$!TRGkck<jErq42Io*XH{#v=}cVEAmNZu&>=)j5l%SQp`&Hn8a3aFHlf z7vVb!_@b<QT1CF(Bp(!n4S1t!hAF;$x51?46Sn4USD9TLTli~KQK5)O<x)lRb<ipk za6AR4EkzgZ<NFA5U!2A&#PQ2Q_}EqV+X<tYE@Cx(Y;l^5f9Q>G)h7XX?u)JupCBBE zr}MSNEf{DaYFyz$jQH}NfSIDKGm|(t5375yN~exV=I0|E@jp&lBwxq5O*$Fr{~f`^ z`peA%kdYhVker)de9_J>1~I!hkU6{fC3;kO-3@EOLikgh&9;q3Mk;Alh~hDb>Dt1_ zp7nrhSJkINkX^f?UhzD?R>mEftG&`_xZPBl|K8;rICw=-{`hHMK#w2Q&WIv>8S#Y8 z^Y2C@St;jU&*)r*DJdR8JXwE(baZ$(rZzmXvoI*{4{N9V$9<2E*eBy@_fc}#ycxZ+ zeDU;_XVEXi7x<zB9=#xJOcB^8<C|`y^~o4v!d;!6=F1G>lL$|on(z7o-oYqLFrDEo zR}B`Az&ks|yEi{tJVGXZV6w%-r*<$MKZyDGI{EfRI1dAptWzZFCPWSR2=0lSqazS< z@`jild&1oZ@Npgqmjlh1r}%&|{+7=fAA4Ple1*Cl-jF#%6ACD9#Ekt3JRp*gupKGx z-Ff7fB&Mdp{wbKnLE{OC9n;z2Bgl9K`k;JK2$l1yD0jmR@DRSbQ5SA59@zXgX?{44 zTzFUtTnKNt>fn?k@e<54atZ*SK{~q7ylmN)Wq6h*Po<7t10Lzt!#`p!c64~tu#9&0 z%Uh#dWmNqgGT?1i8O2_VrzuNfsRJ))%FJdvqgkEMvq~jn**UpT{FY3B@iO6&k!&Sn zTWI1YW4+D{%mOD`9@WZI!^`p~;(MfE^VK9XVI<8<0<!5eCH#ePk{QmA315eEl*i*+ z2J)ayKGZk<TmXFMcf52K)<xrG3i@0j6i>%-I2@w2X8aMubhI4b)81_6^#@1$jSmJL zEY5!vF;Ex&K)SbDEa2);hT2}73XrZBHT3zt=*4URPmHGRiSXUiX}=ST*P7Fd(RT`u zuJJE>;7y6zQ_Zk)P~XNvdzUm`=adWf3*~~7gocR&vs*6jHXnDk9}l08bw@NW%2lqP zKVLq|g_MSN?zK3Ak0VuhW0tjKukR4AACS!p*Nk3oI&66XH@WV29atfMyeusj-f*Mg z&7IoWJbyk~NVr~lFoX=+!sU<3`!$%1fou=-&u_r17r3+U?!v=`@MQ;asv9fqLU@d@ z;H}YIc#L6z82P-L6*JIa-T@5v9qcq8dlTQwcE|$!kzV-;-!&#@@5p!9de(2+6kNPx z)6mwTftE!}PO~4L@7dYE<7K@Y2m5yQ_6+XmS-*L6-}YYfb^4yo{X4exY}h;4JD{vv zdIx*<?6o&HLSpZpK?*!izIY#;s=|Ve<|}I8G}?Obb+?{{HXl9>x1qN`*xtLlXZMc& zD|T*Ozp+=vi+%mQ1Nb;xuyx1wEe+<^(Dng*Pp)@U13nOECEyGFnn8r@+#xqMZtY#a zeQ2lBH}2S}Rt^kpi1E^9m<4NlHfTBfw(o)$`nL53{R?|=uV=gF89*`C_v3SP`{0{k zXYa<Ije~otiVq+4()>+3hBj>Nr9&?0-QL^Zw=vkzH`vp+X%ERQr!Q;@hG6m%NHkym z@7dnF#mej(=;^(3X#G~lyYTeI!N!5z>sc;QrUkZH4S}UH3GY+yLUB;<#+^+;kJf&9 z@6O%;fBWE6BL!d4YuPb07@)K$_{N><<<|yll6<Kz*tUM)ilARTbHPj68_sPyqoHZR z{Dt$I8Wt{C*tDQ&(SnAPT2V(At{>DJ^O~AYZkV?XAI)2c%iz%V-ep^?N040Kzwz>A z_=5`b7N6EIZ%f0xOBOZE+q}Df{mxyuwyZpt)wpeE(9*ZPNq#L11}@*xKj@>t)NxOX z)V__qp7S=It1&75U3?lGd@%?l+RE(N+PfV^vtem5S_T5&#<^)H>d>CP?R~7Hjqs*K zi_JGE{<Ae;D;=zZz5Ux!buL^tUXI8?$m}$~H25WaY(BNd<r~=8zkYDz<yuN71@|=r z8i&`?b19pSEjtWbXiBzmeSiPn0P!Y`YZLx3`$l~FaFbN+APfw)^={jEd4JFL9om#^ zp?i8-TF)z&*Yup<{*rUcD=&FTPY)X4`b|AUO9pqqkNBWt(1TAS3T>!ops#7+5|iH1 zuL(G8laH64of5aZ`?hb|u^SBgw3SIH^=J$PFYX(>)G}Pu8f@y@ycs6;uiqx^2MuNb zW!WqyZt5B6-HOgB*sx=0`=<3M8fZ<dLj-h>`4S^~7nDr;h5i9Fp#EOm*tKv|Uof<2 z;oy!XJzM(*2O-%IhtM}|yu24QROrt2ef<N0xN4whXaJ6?61WlZX95BZb6;=&4&1e0 zf$Z75z7JKs__UaCX->l2gyyspy{j}AWIzSNT@9?zz<6BZ%_t4fKN&_F6q04@j@_uJ z{@!it5q{g@_?~SL(AP7Runj$&goM$8x<TQ4dUy6MK5b91bH_m69&yO}t>`&pu5P_3 z80hWY)FX{uy7KMlzk4?IZ9xy!ztxpg0)5N+!OLOAz!1KN*@t34!TRl}3{&+&g_Xhf z{vJfz`n?0ehM~=y!M?M<cXQvKpcMf#H~`=F5B8x&U`W{1b9rBY>h9If(}aRJDKLGO zMkm~#uxe|+Q9UrYqraDdw|*CVzg_}mec!ew8!e{lc0$o0-4&qj#5Xe5*+L^mHXw}p z`*-X{E^}STf}uTV*-Uj~EZ9D{IoODpGmQqd+S8BnV>Hy!YsaqM{>|b8Q@E`=!~;uE zY3sL|*j(SUeRqKS>oG8ikYHzD??!|ix*l8q60ifiHSk>Lvt#pSiD6@db&(7fJ|uSz zp@%@Pf_leoX@!H^(5st{UI!oja;mXw2<=Ad3ci;XY2yr^P8BnxhiqDm9#Z-^sjnVw zuM7mE-$Z3qSD-Bk5oE;RORNYN6wrj49SnE&GdiqDL;{Low4*{ywxm+j^A<QyoQ)Ep ztGAuu&h^r(Y(m;Z9P3eiXu1dt-M#$-z4%jBzExwkvS+6WR|LCSW~U=pEHuvO$L}qd z2WZthFyrWHLEK#2yKM)07j4q)@K75~Y*pg1MGN7vo}Mcg$gidVUJzfJMqtV%^AWT= zk=(lrci>g&TFl7W1EaL&f{jD{13UTyn1j&i+b%-v&ja{dlJfICz2fid68=g_HNmfQ z?G>h;_KY@X{P#EX=3|bjGk!Y@--|!0CqLiQs~Dj0`;OE`_!A{ro0uAK>e>jeRgz_7 z>UEB>o$v#W)JFITM{2jWjrKcjf0_3Gz}eqHNQ=d+a)qg99AlYqud|_pkcF^$nPNF| zL79-{$ORpQzDVV)!u(zhxW;K+mln1znG@et4w&;Qm$NIKvn!cX(lwf6*yZd_=j_hP zX=ytr+3O>EMc@!l!r$MLpD?)Pf&EN$;LrQYkBtbXdX<XYgx|;C4fBi^r+-uZC!G2+ zA!S4TUBgUJI_im#iVR;`L!3fwA931Bge+e!Xd|Rf2);AJfD#SZ9dk*k!qfq!n%qp# zR`Fh`5;rZ5Y34o7%vM6$Bm!D1Owp2D&`KEB)SA*HF(*IoPz|i|XIJ|yYFt<Qh`PKs z`W%0`nvgyp$^BGCM?MR$+Oo2wj4lKaA-!k<h>BPyL$uEFzyC+v7l!!rcmJUkMt|jl zGb+UOuD$LYt}rn}iN)ZSHxA!c(=?+(%87a>7qrY(c!H1FHx4s#h7!F5Qs_7_!aK(z zd<|YcU9V(GrA=SpOs4_x_FIRU=<o&-UZ$i%aAmMFII+U?I!DK>1$3r2coBp*9ARy$ z0pqL+3(2Aw0~iCbV0-JZmc(7~rvTm0XhoyDA^C^<nee`EBV6Wv|HJ(+)&$K$9c38x zL;XwJ&W;#hP|%sCU`aQk0n&p9)GcU$gj9a`KC${Kl9f;ho@J%Pib0sC(08~REfKy& zO^2QLrK$-6T;6xNysd<>y!U40y<BrJXiyKdDEqokGrZcVDt}txBaT#>JlW=+qgT{J zx59o;dXK_SdeT!0$Gh4pU7~QKCuN&P>Md$V#o1H-zQQLRsWewLE%(azD1414eMaGT zJn0Cv;{<O{pTcWAiN<7J^LMKqpYZlPrEr|rbe_UaPkOz=zxAXaD16eB7ONdAy*;d8 z#zRI$%eOdVKY7N+ht;xtu%JR5s<M30R3UD0w1pMoI~;9Mh4?=l?X(K<IcjM>IK4tl zQ}e;%3Nf!)J#r9KRLUJwtlQDn)BY#ZW6n7(Nv4{Bdfur_XnH?Obw-|zvNBs}CR@5O z=AHRH_{+2MlM8w*@V})~P8VPe^|Rox<3Osl*JR{OP4gqiL|IrKc>NX?GMG}6cl>o_ z$42|m4-k6ssRcvP<?~D_8)`F{QZ|fz&NfIv->a2RlXJmkglB0L!O>5p;v(mAe$a={ zBPljf5d<GomIw5T87d)_<%6Ad#PkRhe?BEK=cIktEB<PVE$`UA=Gh)dv4xK9N1pA8 z6k8B{T5r>~T+nUH7XSTE+9o+6$!wcsDjsRGX7o~W<J~IjGp?PN2$>W9$!cO$;H^kS zUl^pBQqd<?JfzyGG8e2Nq<C17c395kBwH>>S&`3RN?9Sj!E?1jO7OK*2`*y^Zqyn; z3DS|9b2%SZ31CYHP~NfqmuE{yZ4f-Fx4l170hDu0Id54yw1eO`DOssbG?&4Y>N?<_ z{F{#wF9pHJ^@?yL{DiLlQSgj8S^f>0gKQa{s1>ch^PkcTUw5k3)=afGr|LBqti43x z22Xmk!h1aF#|oeFqy=j3xq5}Hs}y<@*H)R7N<5;b{nVRytZG=`HC?XoDo^^L!q0lr z(+VehdsZs!@}%1ozRQtXQ&z<Z`N!3?r@e`bRntnZ{5plVdD1^C{DCJ;Ri&pm<!d)6 z9P*@l6?!k0;uZ;xVv{OB7gfJgBV}Gie2(guc@^<%9BpBR_}h-Qs6yPRrsRXuD#Y6y z?eq#UO_g~SF|XP4Dk;UiMfn{Br_|aj#wo&RoF&;UGo~gg6^!<F@;4<ecM{8llpzw! z6{ftza#B_hJf`;jQO11yWR5RmRn=iJwK=;|6GTx!S)OeTAq~#%9AbG{UToG7GOsPV zC`$fNG2K66O(Zi)`gvrYtp50u^KeI6!%StWakZb({RRQq=rK&K2<ZSgFKYz%dFioy zFjz-?wc3WvZ%j>qWw@kbW<cg?#4*ixrZU%LXKr9-nvW@N(kqeEI*RKGj%gIv$())c z@Cpylb<#f4dDl`*tnhcG3SaAT9<TKa2d7sUV;$SMp6%L{v~iAYiD$bx#TEps^mg6_ zQ^vf2Oo3y{m`r(DEHAc_37>WWoiz)9+ny-cDm`2Lj~}!+!nbI*WBWd)-lf#czVB$2 za*JciSfw8OY?wAWyE1z!%A(C9nr};2{rfp*&IinTyDMm_W<tmGddHN}s|3LuEut^# z8bUf9A(@WcoXa_i6?w-riWSm(JXb5kr7udAU@c4VBfW(Zq&uFR%emUKrQ2TKv0duf z(tThMyjX9)(K$TTsKneJWuuMgp$TISPtSd^X`wma>=g8f!1#}Bmy?ZB(I5$Lb2+mb zq;9(JjI6|O>lIN=_-jY%B8;>N>l{T>IFx99keBdLM>-7M-*Ae`gj9$bKVe)qW-}?> z<+Se1HXx?5)CZjA5@FyhUq?t?QtFb^?2DLckI*opdt1})ZObZRt5d{sp=t@e?sTVz zhbi}Ku_zZ?3F(|!@yZ7=raFV*UsTS|oSRw*z33i_KF)crg>a4|^$^Z;q!z*zj@0v@ z!hdn37Q!DmQV*ebL#oHl1%1lD&E-om1&--Gjw!<}X-OF~XD`buTti6lnVqXRJFVif zjJ)Y?Eh{gS+&7$&J8N!`rFm^e-gFlzoln~8_GI1>c3;yuTa!6ajCB7j<+VQz8mlYx ziq41dZb#}M{D3316Mj%hwl8DqA3Y;A`Rf^a^OcS%qjzgQ945+qLcyQ)ic%0xa!NV~ z>m8|`aEg*_DVRFiGg4FR>Ylffw%%(ee7hsH5x!SRRuxkZdq%?VRxvX5BhRSFT_lz; z9gO{KRV=G|;%k+L{Ubt}hGByCeA{t#q%~*s0MvV<<~!i>w-9<QUDWbf&qer<BXtqd zfQ$`T>~1SR^XG$IO3AuBpzfJxd}Sujg!>$+jqv4;)K2(DCE40zs?YW8>4C(VLER@g zsbxYc#0W!3g;<RfQk&>5SD5m;Gx}UAr|u@FyF^HZ=wb+|5X(nGY7^b14Be?&6*cpk zwxE?3^f{x}5z-P-*IHqU#$X61jN8@f?3ym~WBgz*o3LA}$Vz0&J1=YYVTA-VeY~@? zlaQ97<q*=cT+m4vH?q?i>2;4V!FpPQmC7KIkjkK!!Vf9VmWD#<eE5=(&WG0ssmFSa zs_4__@7}aES#e3dzKA1)8^y6*q45y1Bxqu3aU--GiendnVTI6(YfFn8r4!JQ!exs_ z6J3qojnE74qVNy9*lQtt(2=?bA917>!hd(9F2X-JQVU^|>?q+U7j!+Y5buYXpK&<4 zQ*4;M;N;>n(<>yh{ea(c`QQ0qX+lEA6D6`QR8zXVNrZF;CNTF7(+vx>VH+Zi@L`b} zm{cs(u`bzy^1+^fm<<38j4-DCE~ou;ul=s!q;{B;Uhzu?y5p<f$AsT@q|~#7T<}LV zzDg?{S9Q&?K`wRuUJKzor(zu|?;<x^jne5^1!t<j&0g>pg|GCaS1G*PlkQRY6;JxA z!Y4iH*9vDjBU>62db?X__mR%-R6Tol)alOKxo!upo$y$9WVws*1V?HoT%siD^4cp* z-QyTj0q=DO0kxm)w3i9rIo>j&H4xGYQB|%mMMKbe5z-3F$dtEf#Clw+cF+jOB%~1| z+Cw#WxuTDthDzvXbd!WE6Z(m?xKTZ6BV)Nbt<^cNg>Z`_brbG$q!z-zcBF2?_d8Mx z;S-M3y<bcFO1*|b?K2f7D$W%xgl~7G5eAVUXw^#C>Vl$$(EF!@{_z4k2z?D?2LAaf z*9+^RFrPCuVq$WU>(-nny7If6^h3tV)5LLZr{=xcmx|DfYoj4v+#v_YSE|6bdBJa2 zc)uroRN*%~>6;3F;Yp7x#NPt9RtGHwg)=>AmO^iL3+=wZRd0stYXUYRA3*C^QpOAx zB)WrWO|ZZJPF2P-#&1_)J%xOVJD}c9Sazf~!Zk{=-4|1v9pebkKcP@r8XRkxu)~o$ z2r1b1NKAP(Sz9}~86&G`^(v~$ZWAsi3yv;^(C17=RxWpfiuFucosK*c$6$N!9;@w1 zy+X-Zdo79A7-_ZM3WK3yg^3PNtgF0K6IbgMnX}3^lJYW@@`}!zkov-4FiZJhmh!AB zG4`<BKXK(Q5wZwU%_Uc$eXc+yLYC1oW)xHAmcf@29+rIx7U>)>l<)#2g~64>mCc%< zCdr%BgFz#s9^+bAL6~i`Y@-RZ3ZB?)uLI6OWy0H(WZMB#cYDU9i6#wK<dx-Ay^4`| zE!6z%aM??Q`y6S_L4{N@vLk4BmX23Bfh|d^vjoB}X(gtew5U6V^@_OufI?nlq>t$> z(@vQ9oF~>*nE0Y6POE%N6Ti@FcH@CrwB~OeW0{aLY~?WJC1$k<6fp?8RTfJq9%0e$ zb9zdIpK_$~_Z3n}mM?9T((WuB^aP?bX?2!B8#SZ-eqx)wd&G8og*OSGcBD4Kx*e8F z{MKG!YPnKzn1%5CDn_P0?HLJ+gK>#W-K11VB<vcBGcxrVrGk-gx^DAX8<{#msbD00 zpo)>H&v-_{hpHHv`VY@Yc#hVwRc-AZ?KhqOJ?H5%Aw7=yaoWvYbm*ndp=H7`JFP}! zOnb8{?YFM9hq~yCBVG7r4UVajrHfNyaem=SSR(w5BXy@s*qtt6DP6+ubP2oDCG1X@ zusdDC)Fd6PJ>%!~YBlReT3yn7q0#;?_FExBBYs+GXvBn{7_e;Egd$`-OU|!rm_O#i zy@l|Xj?_)aYLlGAjjk%Y2^p=zmQm8fA}!VcWV=U^hLrR{7n?1Fzjm?NK{!KwflZRn zU&EraS`CqjMXpb1A-vF$ItX_<QVSs?0$ZYld!5r-2w&$&9fWUoq!vO}3S`mSW3?YJ z#xlV^27H7k#rc?co9je67?KZp65+o)QVSvL6$-K{>U|nd^k`Nn<b#E&de0Xa%)E{Z zuEtw_jko1wmoKTR=Gn1VXU_${)exEG;-Z`IcqN6w{^1G}b3ES%w4T4}>bsk;L8}du z!@U(&2>Sp-OnToCBW)qxv#BmYrmD0#*3YJMj@VsFr$Pz7G;J&m;}fG)(r}QHW`ji4 zb*_205waY$!EiAC8T_QHkM-e8<!xG*wrO43rgdqX*3l*!fIfkWc&+YR=@8aEIzd9# z{C{5<&_rIvRAa6_)uplCQ(g4b@vgt<ny>IoPa?cXNkwd*FPeRI&{!d*)!!MmcSvDe z_&n*V=t@^bDh%oObRnL52+~o!j;!OkhZJQeub<M^ztFk4Oh}huA)HI~0`mAr`&8cp zmy^<2k|6l!L~j!X`-3y4SJ>lF7Xp{{a-{3By9wC^Md+81Ic-3yzcKs#h`VGoNpGGE zC$zF;9EAbiKu?BHMr#a$lhl8{AQ_Jxtb1<KK9~bHIw1}+9H~J{4vrut$3c)ra(G(D zy0ngUX&vj*I#N5+tkkrQuC$J>w2rQ{j#M*4y}2_W2h?BnSK87_-4W;f<mcvVm>8qP zF~Kc2UsE_fS4o<MiN?*>Bn>mfq-lmYl9Po_<KC(|BfKNNcy>yol9M`>oYbmhHZ0C- zl$@M>DmiJTq)$|r-KkeRkxrTbQZgqh*lb2H_nDeI3<icP*K6Wdy-o>kx%QfZ{A-#% z5G*|Tq+D=ReT8><Jt~U}-*8A;V^k#V2?E;xcdi_%$j@R*g>Dv8R_vktNtNbd#eJ&( zQD;Z_F@;ZgQqq2GN~FX|5L24Z+Mdjc$8xEx#z*PAscOW5!O%SFNlAz+r~PAs{-9w1 zV<`zwXo2Lb2mQf}3e&%i(XRxZX<v%eWCf+leNMA|-DStKZ_KEe_Sx4YonX?rFKWgw zI{{Z30Ze~e={Q+KNSOsZkj|QX8^PkEyo?j<CBCFHfAJFWAC-o_pYUlVnK6P1-+{OM zSx1CO$1xE{%rQ=0|4KG~;mh;@CQ;u}o&TxVSt!`?*YYPf6i>{R5|i<_nqf|L2Aw|@ zVlqs&ba6__;v9!nO+4Q<RjGL+x?5b04rVlG|5S}dO%l=|Ogjj@t5dd#3lGz+W-vQJ zJMUNN6}3$GMkPf73OK96F8Pyga?--?c!e$?lry^urRb|w<jbA5ZbE8p!OXU4Ha-B; zG<(T(TozU*cLp<O%uLV{NyB3K27?(hE0p{?Rk}^eQ~UHxDV5P;z``t|+!1{v+)D{D z{0nD@Xvt>OQ!U+zc^>`7O%#yQKAWqdfX_LapNuI_5Tuz>{b&|bM_Qd{o97g^5PBO@ z^IUU!0v!o0S*W=s5Q#7M5(%$xq)tMwB&!#N#ph_AOZ7S{*cWg0d*cbymdUtYGt8;Z zAYH(&pfTQ*O*R^Y&y%X>OG$s(<0Sb}OWoqL6RvY4SL#ueKq(wcx4hfsZ6W-7M`|VH z-c9CAT}pAS=DA(3vx2MQeyj4R@dg?1&<t~`Gl&xhGn|+<DCI<0gD#Qf`)gO25+P;a zvjc>_d|Be8fT^FB>n-Vxdc{);!lQ1mw{Tj8@E9f8ZFr_uIL3CuiydhlVQW=hrY`r4 zgnJ#So$%$3w2tuARpOYs-7&Tke!!73rhO@Y1a!z7oI}cllbxhCLb^a4Qm!y{nqw>z zUg$_|gmi(;%hYwAk&uP6j7+h782Si(QQOi5%ciinZ*|2j5l(TIbP=+EVoAvrmz9oj znQ*nwOUMG+yiBpu@lb_uz~wCw-snhOgmi-y#}qvQQwY6NQZxFvOYT$$eB3#rg>ahF z-kmnPn|ki@T!i;HQVXHCCSz3d_B^Oo{N7tbINk~Epf$aY)IvySVi%hR-r>0jY3K-h z-PWFlt@gS>ujnEO`}G+oPAn1bccga014@#rYOgT$xMS?`<*r85+~YKt38@YX@%x6E zph7eWLTWL5)zW>6dd_fqN`$X)R(24w05<ZNqM{5}nz^Lgwy<j7rmFtdsca#9w<EO@ z@``B=;Xf&tS@kjTkk3l^6-R2Dpk<k^S7hB^VPdu?4p%;|iHG9EM>O$0N34B1wIVTP zRnJoO_tk{4!9gC&x|Xz`IrG;2Ug1=gk8!70;Z9E?WS!$nChyR@@9|u|ZY|Oiu1aQo zzf3jCbd2~$XHW~FSJg$x@RFR20Qv=88R3teMJ<FrPEy^Gp0!OFd2`H2;x~CC327Oo z%Y>sF*_|{}%96G+HQmJaLDdhP$%qy)#7{aq+X;W?inD78F%3o|y*JgE<1S_m8^({T zb6F1bON4Z?<gGH+Bq)Uf5NK&8q42M_j`zhNJVHsfPh)DPXFObq<t&NiN?KxSabY#2 zZ7gL;EM-U>ags=xMOU0wLdupGWArXf6<4%osA(PD6@gRINf?*dnIW+=TOz5~s;lnQ zD*}V?1G)ml+w6qjR+6nrrhe=h37@E9Wa@X0v7N9+SCCLblhRij`Is}ZOh_9rvnQkt z7}*GE0JsRf;t_&{W>EQio$?alL#{k+gfzkqcuf7oGZH#G%=C~cx&?DGLT~7(6IGf? z$6!yI@O@5uJ0T6TamW<ig}j6`%rd%^tF;jVR-8wRe&ih2Nl1kvwX?z$b)vlxI)#SO zrJVW^qWfW0`E@OMEp}@3=`%@GIzG7NWB3-b-c33^mXYz0yi(WQ&dVKy^mY;I7tJ2R z#xN<gLgX)+jlQ6<l2n~BIil*XYw=jY&!(=^YBH;kD!%DT)t$~c!nB-u*(NX(Bc#`D z^GHh^A;c-s7dWc}NQ+ZH(Qmv`9J{p<d$_d3R4?TxA`Ao?DFZ6;D(A*d!m=Z^64E<p z07=bRqcc^HrZ{q1N|P0?^Q6PkVrQwdHPdN&orT@i*pBybJYhDj$=IwJ=HLN{X#??H zvUIi!l>MuE#RQSH#;cj1nx_q;6@0!IKuFn`1{22A9G)*OQLzl2Q91~59NAkn+gP}* z0sHz_2FF!MV||Rp(*WLMS$TylQ(`aiDp$UC!aJ2z2!^1hvBLB_m0q;;<LfG<usdQ7 zrdhf%kYhS0+QF;0C(ELav_-o{u*lG37P0Fr1U3iLv}_!^QYj#bG<Uq~P310a<&`#H zqVAxPX#IrrSOHs;*&a0Xn7vfZ98~77n^he-F)i^oEwal5+I6|BE;BMU&8d(=Gch|L zq*Q#6UxqO-Cxz!VbgoPkTY3~qVYwre`m{Nzz>zRGZ4M3rFm9+7H+GsENu@zRb!5#2 z8<I>lL0Z3w+$5u{gww1hKxnyFvniQ72>wQk{uaIFg7s;pTlJ=wv@y*@37#n>DHpKD z>4J<J4-bcF?06QM*T}Zuq+Myo3~%RaD1}$H`lPr*ksQ3TH6}SHx@w{KBHL~c&6sH+ zrSO^yMyUf<eMW5-0!kp$$nBG+Hte(L<9fwPi0~U%*;|;B5&o-^WFpgEVJd$$8QTfp ze+@~Q&&uQ`HSc$t%Y?6Wq_$fXzR{DY_BYPHRM+B<0Hw8*sO3f#IS$7Z8n9d4i03dB z5^2KN0Dp-rm?5_-X<JHZTSi<m$IE<%D@`lmw_Itu2r1mILYR8oGZNAhmXRr62dT*f zddJugee?yjO8Q9R?>kFd2*2bE=%G!lcF9S6hYNuo!nZq83!yi%CuWg>VUmC}P5n{K zRN`ZtT`h#()ODkoda4WHb%Yl<QVStVfz2SocWZ&9+{AbLLK6Byu1l7wdfU+#@ER?Q zNGATEFCZZci0!VshFQcJYP;lRdA=Q^5kKk6NH|H2H}aUE`64fAKWF1YXXVf+;ipZE z3ZW4n>1;aN+4<_2M~UfeIW$i^noXGU=+DnJOc)QQSaiv?s@@R4s0sR}$^i{=uk>o- zia3!9dCdh>opY6zTIE?g$w(WqJxdE|3`ndC`XuAb1B;y&*g}B}Wjx*{^g7n1b*y7~ zc!ds~kz2}d*ga?|joVn{$*$-n!lNA@ULIw_m%KznOD;4^gs*qiHMqButS-zAlh)(W z|K3!%!hU(oqK{f=y*HqZ2HfckXe0cnBef7d=xo}#r@{nngOdrpliQMJW}Hj06`3~f zdB#Or;0qTQ5)EgmGkjs&(}mUPCgaJR=yHj_QVFZ{iqqP1)SJmyDmmuZZ+Q|S)oW&& zuu_{VGP4Eywv>8=kq=nw?^6v~onH{VS?{u<GtR^YxdsjTO|Ctpw~#WJQvF4iq*M!) zp*`oM&2{Y!AIxB)%h^%xPMMaPOJNvJi4$i~nlDwVZpD<@s$qju+DgcrVbGt;YN>L* z(&eYRxN2HIK~A9V*S*fh3dz(n9&ZfTolZH8N-DJ{GQ;NNPj0!|zDlnJtPJItBGVLw zEtX_nlg^#18P9hD><Lt+FHt(WF+$2L1bat5foi1xPy^);dc_o;Ft4?VDGT95CD|!F zQ&T)6;Z;?PndMSq+JG_*2%X$ELaG!4$`z*8dPc(Dm;vPqQ#321-;CQxn||h;QX-t- zRCN>53bCo=Y}(`*32B98WXju=ZrCxSXcL`-&Vq1^Q`JEjx2e_H)a@AwX@%I-n&GDr zS72h=)9N3F2f9bXTBoXuaJD105Wdurx(I2IbhUcdd#Ees5ChF<r-SkwWq+|=rLhyQ zc8W@btx7VVqF~|*&qvrF=VQW~l(l42gV-2o1R4?{^-V-)FgR@cmqoK@R7h`ErIV}g z_hXSsuh5jF2-1f}7LoL#Pan9>;<xG*-2vfg*V|i|JQALzBnh7O3R4$(M#4*~7`?hA zqWTXy^<~08JJLErDirl)r+$@Fzm71jzML8?yb)CY5vQv}xWGy6B8;mqIrSHMM#8xI zk^gG#eX8_3PI(LAd?&Mm@JvT)ryW#-mg9?LQBE$1%Ac!jdQh4OanVU^Bb=fna|nou zV?19{jZHV`)3MchMGO&+bscIO;XEbT7#dyT#ZF?Gu)#^}AdE{KskUk3N++>INHKVf zLKv4gQUy{X4MYD-NHJ*tgmH=KKQAm^pu91zfSrW#%$=Fx%*-_|^BTf<<~6CzJbgm} zEP@0I@!vb2wG)2aky;5^Qq+F3Qth&TG!?IQ@=9+}_+d{<%CqURGVIoC;;ghhO3ONM zPWJtpZLWFfhPQj;58Xz}{07bB3!56l?H)~5VXxE76e9brGBIR&6rs7`eVUogC?DLC za!Z;kd*QE(a*F(xipC>V!l#rZZ#2n69;W}Kba}mbPtb^mJftvIWwwhu6{cygeN5Il z@*}6f6_G~ZBnlz*%lvjEd-hh@!|)e-aHqm_wLNP_wkPeKwzM_!hkCQTW9TvOP^<mZ zzG<aF@Iaz|GuDQ-t<tW4(hL#48h}SyOwvXy4hX4SIg??N*Ik+~sz7FwE`XT+*N0zB zy2^(e%rh<$sB)BtUsOldjE5aHL0Z3w$7B)Y;a8f~gbGddYBC;vJ)uSajb1YzmjuBt z^rn}T@!*9LJk$E5u{l@QbU{X4hlj&7c03EsYh>GNQe~Pk!`t~9O5v5QKPj$IBnPi- zmr2fvu3G55$hP1^GiF*yDZFMr{9+xj>N9Gy;A)dhBezUz>JvKe|Fd2(%n?p<QPV+K z??~;0Q<RiF@5u#uhL>JP`wIR8I^p|?USSO3mCn94!mE^IH8b@~&zP(Xrl}@$tYyNT zj&vCz1>4y<Q(nzw6q~$K&9_`>N`(DRO$Q+bi<(k}DX%7D0ZZR_rqmQA2%b{yo=FMb z+*}4z>MdgXAd1rHFX>E)=`i`DnOZ)tG_@yW=M$sJ>vc}*Ov_81{zG@~iZSSNcBOM> zuf2m~HBXmbC!xz(Jln2luL=r{u1a1$62oWo#+OH8@E%VhDnCiH9)r^?OXf5kHx?hw z*%jbbP|T+UH(nj!yB*3j*D+riXEvK^j+sm>)?5^;Y4%mcLgQ`um<CUbYoha5<Y$#R z>5gZWIq9Hy`l}b))Y&hwSM(Bu*Ev!*;ZHBIT(*~B>M5lnFX8*OU06n@KH(Z~YDOHl zNigj?*BMbJoTlpVWaz2=OwbnFu`oq*aB_rjT+Fg^g{c#iYGg7&v#m^~SO~+KG`l*@ zLacFxC=t?bNV##C37RbmOBJSQIc95wG}|&VMZ1kmCTOl@t+p?nqQzUC#jS)i5(`#B zS}3wxGwf~6vbQzmbV#JNbh4Gm6w3g{w8_<!bOAb9fZw<>^$^Aj(3w$y&a47-W)z?& zs{oyqbOCy*&Go4PweGdf$`(ReiDNUYY6=F4&^t+E*~=DmvC8$r+9=HD)SUsJGw1SM zuK5vMcMp38i)1S)7yMaS7#^`m>F{m#ox`8e#5d!_q)5DK4N@2!twNjiijAzK9vL^O zGp6W(Q}jhugu{IYaJUZ#@RHhOz>|OYGY-m2K_Z;^qk0c>al%i!GT@05gJ6s6=UT5< z$Xd#n#*1DS$=6OQqB6hGp0suhj*S)eVYz9_68mK~`%;BNW!^c=(s|uoEQq&ygn@p$ z7XN*EJr+lsj<DnWE$@V@kD6i=^X#X1DEDmj$|2b4yw@Bad#t!skVfuNBagvDU=G*) z!Aw8K4`V_=CYI<#eAm5j4L+IZMtEc)iQ~IuOqT7iGbT%U*cqz|iG&T{AV`+?lu^n% z5X`hSv_EK+xJed&@nIG}DJSWT=PD=ZoaZVh=_@+}_rAJAV`IEKUN7JBBbC80(cHzf zqtIB8`^i#P=T6$5%$>9;m-~C|<i4iYFet9bZpx1Jqslr_`sLedILoe({z=zwmIx_5 znI&mYko$DPo{XmmL5|{h&Dc*gl69u}PkO~{k??a$l2N}sRo)<I*86w5tf>`?wf#J0 zSmzj93AZSzfa90)si<9=_A+%%UG0T)m5tdk2}|eHwL?7TyDze-uj>{2l=0idpVr&o za%`QCDSXnC$Q{2f(A#G^wi4k6M@s2L*yD3*>?kPXbj=V2<y&iRox&uq(}k>Woixq( z{mDbY?@vDF_dx}`b>!jo*b#YK!9JdBOH|`=qp>d$4MnoDbSEDw%av%PjrgA1twm;8 ztJ)5kwO_V@O;%><)~t<((%Nz>-!qTbQt-poHu-D4B7O)PRrCmFJec#RE@vwtbJ|&Q zl|Cf2Ym<5o!y1YitJ-WG&tS4n$wevO8u)t}DaY!aaeAkOn^Q>Sb<~@ad`?r9b<D+U zeKo@ZsqgW;$?H)WOf_q>y^X)jw92~UM!lk!A-vg<S_r?Xz8$IKF|zb%A0>a>i76BQ zizBrW{=ku134f?0JUHE1Vd6>0*OpUb*0~CAyHO$S9Px-s+PD&pd)#SQ_aPPcfYXrb zxgz=F4>dLN+y2<j!u+O^vs9u?jfpRDw5AF%uX4(k_)^EWs6xEm(N3!nU*l+}SBT%> zXp1YvZ+5gZD#X0zgC&keZ-~vr-`2cXL=m!D!eH01t0V8hj-&@gT&n#=H33cFwGceH zvj>cn|EQ`a{cvQ|1h>4^8$}70n#^y~8n`Xz+q-YqE1Cr14;*O?;n^2h?l9Q9r^3V~ zO2jDkla;E=Ij=oX80mGi)<k2voaQp&dPiDI7?+s+)SmJNUFH&DJahH~dS-rH%Y?-l zVLWs8vv_d>1vEJUorLt0IHR-TQqF6gH5pz@Ke*>m4P}Kw5I-A_f!zGXJlgOf^?-cw zWT<ywXYaNh1EhW1d8dW&DM#uce6OqJ7Q!Dp(i*}U7uo<o7!fXXr1A=deV#-}&tM27 zT<!fvxW<vnT?%_ViSSBC>LmP>BefIqIuWmX6&t2ZnLTyZ@hj#WS0Vj#nq_kJeR*q# z6~;J-d)1cT{|-&>m^TBj{I0=2|6g7wT&$-L#Oi6=j!oOw_wU$5+86cS#Ng_n?(y&6 z^6T6G`CmV>>BI`@e{z-97HZ9$>}sfOvBFP!65+QUspY#0i>`)RSdWW6iS=0Wq+W%u z^rYJr{-Y;-R^elw^k;=jT@AIIt8kkq4J-UxPr6ItL!Ly)>jXSiKF8NA$zRqSbyc^o z3{K3fSXP6tQj0JQVq2@~zZ!YeQWK*A8!k)3jLT%rs_gasz1w@Y?A^-B{*kN9(h~}Q z?MbZPI#+Y0SqkTP607_lJn0Jxzv4-(@+Um$X+l>`YZwK*qO&JtG+?Sqc(Kda&cGP- zq^lI(<Va=4$~!&jJqkbMNerK_deRRR{@9ZkQPW&tl;<gAWMRvnu+?#u*roJ&665Zb zp7b{g@9-ps;s-p5y$E9t{Tku7lxrfEn(>Z@^ndYEvN{?@N-`d$`wy|rgBZ)}EZ?R; zsVNl3jKTe^$Q$S#+`C~@?;s=ZCoas|8F|wf4?#P_>^@IoOnt+X2wflrYYDquMU@yD z90TAZ!ePg?hVT(bYG<X-aGq*s4R7=$!q+-dnRWM%p2Ujc6`?`M>jdlyoaeg{k~u)k zObrlm_UulDPES^%-HGkfD&Po>ofX1bwLFxkKnxGg7BY5VMBq*p_hVP;F6QJ2mhlA$ ziKnk>PR{@GSOOEDtJMwKo@6l?f7JXL7aD5`X~8%Yq+I*dbZqYUfz=miEg>zf;!o<8 z{+BwL5nmo4q>O^-#G5|J>`_n%>@<o(j&wm+X17vMFOEm^#TSnUgA<1^a*)bK9-9pR zmveiWkcNyALyAjgrz{y0P#r5Ai-A4slLjN5=FE7CPzY$(57d~E#HBg$x=b-;UoQCJ zS=N}a*<K65A3k+b5F8%oeTU8Y-oxg6$6<56DT_1i+Bz-M61`$JOL&eWbrEh<l3m#_ zb+uz`C#*P97vcM=^2Tkb#<Zx(i6|3Np{Orcm>Tqqgx5M!Ct+ND_7cjPLG{Nu5hcP- zN9rJ?4PsHrS@asuNElb2y$GvT-|R%R62^74I$hfxV~LPOM(ZGqtIt}-U8z!7StD$) z%vCm;1Pz4rh<GAP1GAD3n+?_VZc}7qm1B$|WKLWAS()*va5Zp=^U7%99G95hZ?{WM zN}R6}W#3$0c4M05$AMr%iY-c*!W%PEJq11)uHwj>F)GPB31quO*=3)Fm|5iy7Nos# zljiU>n)bKZ7$GAgRa6ka$*FCs5K~~*mQS@A_iFCx%Pbvz3*m>Blhi@@X(dVZwpW<? zj$>>me9VzL2*VW=*G^bek`-rfr+?GLU#qDIH$uv`;l|XTobobZT+?Vh3;yD=YWcI% zRwASq5C?>Gff!J74xu4nB>b(jsYDpJX|(Rf+w@<~rdC24g3f?2Zc}T9O>MO431?F) zVce#y9>Uu)M(Yl3iZGrzy*nfoOXo5NrX_^&%<0!UY&-vvmY>xhiv$+lMgm>Hl3Hpy zv@C^UA3fWq@lcSkq%M-T6Daii&TZX<)PvTOrGyG-B#KR8K4<Frmq<$I>`dnz;Q=G_ zGE^`S5PCz}(&ADFYiyAyj;#U9BSJ5(D=n@o%Oml!vA@agdMJ=R3%Cfq@6z4om~b-w z8xxF?EiRddpR66+BG=KizDgmlaL`Yc#494~Y>kQ+yXa{Bw8Ecz(y#`_O)fafuTl68 zM{2oOp?6qII)qZsb`kutl@p;9vXZH(84;OH*3j<z)JVb*f`IiN_`(ww9jS|uu99I? z-sfR@nPV+qrf{QPYq9nKtL#RS^fJ$Vjlyg7TEJRG-UMYjRsn>!`P}bS_+h=qbdmH) z&;78%@90(Dml3m=j@2yTuUzidaayBC=~Z=!u_Vp%m42GSGxS<OspS0`rWra2EW(Ri z?)EDbZr7{ol23+`wA*vvuJE^xRGy;IG()d3$B=ZqkG&NNU+PHZJqoYVt37Xk6VIAv zP@@$PGN`e(CuC5|WP_Mjun{umg^i7x!Ouuz+P7?d2Uz+G`{RR}!L3&f^&B2O;Kv0& zL!ZGd>WO)!dZy3UfDm3{hO>M?O&SH$H@e_yXYBF{w-MeElSs^<r9`HG=p`~jd5!f@ ze~3vWW@u6((+ocJorLWgMp8s#MjPG1^sPSR7=^r|h=k9?BofbZfwkW_jcLXrvJ>u5 zRxyZ}L5C<J%!(pLi)7U(aTnPT55|r2zs&}?oB#zK|2P~hbxv<tsqhj{B4l-%vxrO_ z@O*Dm_-;=kWEGmMOg!%So>o}noZUjmk;i0Z;zG~2Mq!U95ptw5Svg$&%Jb#b>qWi7 z(}bM*n5=8`{$|hTT&w`2)cEn{)w?`4dg<3~u7o8*`VE5b8fK#2*;FEANev$pED&ZN zEDj9?iDvdYGgF5K3fNSW|L}|w|JdSbF3L}fzOI(%@m4GAt4XZ{t;m-2a!;!}sF<cf z9OJv}Olo28$G8Po(wSpGkbmAn4#KjMq!Yg8oYv0H_$^LN57n?!m7K(0b;g91&S0A; z1UN8M%09)CY%Jtui`lJSoP@)+zd!l+3-CsbTxM2G;bOmvz)4|^c07%JbGSc<CCoR6 zsi;jA%|;#^6fQKz7}L38iVYl#->i7HXBLHN286sIG-^?TAUWYdzn#>0gwyw0wft~O zo0KByWT!*B+4Fe2wF-)(R6$bM;TT0l?|EKT5CqAo8%Bp@d8MA%7}<HUyiBu^x_TO^ zyhk`u|KX}&P$qD(&>2hxT+$>-Cp&MN#2(z6q*YKiN);r9HDdmHD5I#Ts6E1L<Vm)I z!zl`9v}d}WCDk=adD$Ct5Mp_mW}oP)VC3>r)Oo7$Z~{(DNd6=TL7K#o(3_-HFm047 zND4a~qp0X|R|U_dBMO4oXnxMCGWrfFdvfGvc{zM9(1Cy*@4k^bUJ=G|lfyfOG2N%a zrfAo9HO9ooB{N3wU=VQp`<0f3@<dnsM>_pvK@P{)EaZ5#>$!FML9kf!FV$<NuenOP z-7%#m71-I*o1C9!jOkMFx)t&}2$rod7fe9g3H#5nB-yKKuUK6Do0(^?uypi~gz?NH z?{8ATJSU(;_!8BQEq}tcm_elqQ`9uVvw^H4wz7y{b9&ndDNahA-f+wZr)!otUv>e> zNy*p|C5&fIE3wXGc9#D6I6{^d@^j7#a|wF%Dhm|ik1H(<_Tle|Y2rb>;_M3Hm*adv z;zu^N<Pn7Yq?I)}WxXp53&L$J;cbpoCcHyQMa<Rkehto+CyhY<Zz<DS7ci-*O=y(a zEn9CF6^j#ItwN{~?e0D$(G~JVmIWuvN}CjF76HV6&|GLobJU<S^(r5Gkhg@G-sTKW zO?h*{kjlB%$xDrUdB^0fPIUyi06)1WRmyL@G{QeSQa2$DM;Va0>IXj5+6@8<{rw8d zg5?e&CE>L@!Xvb_=2Xu!(-+K#Cx_t;(&svFv=A;-Qmq^WdIo<!xv@ghm7crGJ|=RL zl;LQ{xR!8+lIk%rUo=}jYEvvU&Bo5+@;Qwa-lPwXu42**1;a{R@hg4OqB;se_pQaA zTZ_rgiu8EiB)(Q<{LvMmov`DtEHhT3HxD!MawXdSnyDY37h`4OH%dee6JB_Jj4x?Q zGELK-a;B9D?|rdlM%5G26#LMFsa4K~9zvRD8JYT(V=NQSR%4-rkoMcWNrS7?H2-(b z{1V|}HQ%i9nV=;iyHsK7=gzJY;nPa8j7-r)Ba?}^y(2tqbFUiF-n{c|E8%=c>L7fF zFT#DpOweettko6aKV1=8327gO8^XA$BaK!;kT$ZDMp8K(aOW@+PdVM4gj8hss;exW zO6yxgeKVa?))BHQ5%GjH1lq36uxbshVl^5*Cg>ZyrcD^L{@UTBy*VMELS>teb@CN8 zQ^pVCDd*apcv4Gvw35Q$>irca=6k+V)sbvPB5sy85ZWfRq)BG1juGFdt$|*|LqS4% z5v3)h7yqXmY7PIg+I)ldeRxtz$bM!ro|K}0$FIgkvr*IdfC_K1#<E|!bj>g3BfxK} z%DFDcx(HdZh?IL>%lnM-O^`2c6b1rVf!BpAB(vi2J}GWnE9E}vO<K_t@N#;Sd~eTY zC;1G$Jt<yF$<G@->X`|cLp9BI>Pe=zQu%p<zKXf=w1gWOc!?5{%yyQrfMkX!BA$@- zlE_hA53*VQgqD7W7E<0tuy15Hy$CagJ@^Ax=}bcTl~&?wT_v`$pi^AG)W*hM>xP@Q zY;kds97!-8B4k@ZT--Ix1XbIyBB{N41fc;&z(^*rOdN@^8Y84GjF(A8Af=1hldXdq zytwYPxbC#L?rd?EN}=p)o^`iFYfS%~w8s$B7Ol&)$V_cR4GGqhbe+VPyKw0s+@>VF z^tQjk#49{sQg>EQoC|Xyv+#=5BD3<EalS4WBnzC`m!+9ffgGeH*$_-RD$R!oIy951 zhcw&!wBh<jmvMF^&6Ht%nkmDoG*iYQmo!sq85BuL%-bqt=2fbf_{(lkDieN9N%(6R z!xbie<oO7_KT^v+c~=IX^3*)Mir$>|Tm`)rv39X5R#L|49em+>*!~?vdp}t*x!@xz z|DT*~DMMs3L$=R4wi2zNuI!VB|E4Wunw!U@R_(GE_futiQm;#7`ik`$J|j}Kdz{>m zo{QeU@yeia0G}6=ZReR4N_a*ko#`bF1clfJJ5tq~+i6)zcgcgXq@|0z{KK|1W#s8z z$g?mqJ?80A1lq_e_5=y(9(mL*3vH%Dt)DTNK8Rl`B-FSYL-t0}DfvPn<`(L~s7Oc^ zbD%Qj|E#J+O*)HMfhUSZv3!~JCK;24N&C4(t-sZUU)vA0ZE#+a(c5O_v<s?aW=lOh z&1;gGF#;Z5&aQOM)Zw;BM1^54a%Jw)GE0|1{A%Zi7Q)vlDMVjUVZ!^XC8;}WU^B(Y z^{J%&dYy%huvo<n#S_xlDrCG#Gt8;Zu+wha#4F!qOB<Qm4yzH1^7&lNsNUGEdJ(LI zl#NLhq4!1U@O&|#5%yKRW`2=vM~W$9uuC$H5N<(|4`*Xdl~nyoGi8r=0qy5iYMl5z zu1sY@U(D3dA=MzG7<2O~5^q;Y_d1EK4=VhuUj4vE$`|#{p$E2WmGjkl&3G=7H`bAn z_8=GtGfblanWJ6qT^dkauVnTuNv07hHA7gcyD%kij1(LO_^U%q{Hu%c^1r35OFiZe zQD4l-t5g=TFIYNuTt?578tXAs$aKoFQf^!a%^ZViO#>FP6%u}?_RANB<t+=QsZZ$g z)uO7Xw~5>*HSa@ChW%SYOj8EllFP^ri$A3qKkEdT&FTu%Ur{>3hmbN0cpM<zT~cu9 z*0o)3T9xVqJkzsS{Dx)^Dsb`}o%}U~7b=M#oM!qWr5EkzrSa)?Qr0ALq>E$!NF9q! zO<3>~Qb{4W+RQ$fri!Aa$CT1D%rTPEbXl<yxp_FL7#}yhdDzTvlB&n@PE0v>+~tvw z<ZG;uLbL40`0>VO(k`5zQg@Lx<4}pre7)ggHA93j#&_tMWDyWpgcPZqN!{ob%$`=g z3S>5EWW+4Keuth(R)mzxe21O{svPAz^i)UIjPH)u1Zn-|<MPQOh-cEQCTM7?SF<UZ zI|x>2(f>-X8DB2P7t{2nm$Wf0i4r{1`Xp1%)iqs^QP=oNovIs!Y3z6wn%5D&@}6eQ z@OHk2Qg~%!PnMuiBnPh}wYQ0`TIjvVw%Me}G-IZPl)`J~cj#FMton@FEV$YvlW*!t z({jPdy3xlCNYhswnoUOP^cjG(IN?h_>&fOzKWItw!Mr<%4{cuN-b-3q)}+J<U!Vif zGQDEkpYUal)Iqr2k=hA&C`o+KUSaA=&*)Soz*1$Qy634mA>AeKR5kZ{iwHmKNNt4w ztR!0+rXF^TsaX*9P|b%NYnkvL9jTp=f^C2?<<+F-X;uxDeB4Pa5mJT?MW(#O)QZVU ze6LEPt?0-IX)Ef5kYcUbEPC~o66s`QC!~`Rkc4rG*=LcerN5A=I(?aINUyMz@J1!s zFktFyo{@0ErPd-mRV92>mttt0_YE`As8f09AZ&G{4#GDp30dzQW@3fzX<J*Ex=N`K zNLc$)XA9w6M`|ZL-H|#7`y8pAu;NG^gfH3<m>*LvCeBeJ%pg49kva(5HruSW2uyV= z6?q9aI#LJW$uEoNW$HAgA}`_Dj?_W8(vjK;+Z?HbaGN8w6ZSh&2jOcRsh#j%N9rJa z$dTF!zv4(8gpWB=JK=viQU~FLE8-<*>O`fY<b*GBqz=N>Re71}b&TzVFLR_0!W$i_ zo$!^8)Is<TM`|a$%aJ+=Kc^&H^GxxIGAwAcg*;QQAX&m+=6AZym$TY@xxzO8Y1ih< zglyAzK0<h;Ys+QAyBw*9kZo6-QLZqx$+hG%VeLz8>7jv;%@-XsA)7C_2)kUyG9g<k zxCj@!7Fs6UrZZu15we+DYnl4+<<2z1lQncLBU5Z$kVv@M#dw*JtqWX)H+e2Xwk~iH ze#&zZvUP!r@JF7DknIRugbglk%Y<w(;3DkyT!d^f;3B-na}lz|fQ#_0o{Nwz23&+} zCf2b`@rp=DH=YqD4z|t??>C#sSuXNRglsB!7D>o<A~u#>t9h%>OBlJ4vYW8Wk-7-m zU90IPe1ju(5VGl5rA&R<HKcCBT5S)Ok*U8?DvCk)Ye(uLWNQHzAzKTU=7isKZK<1( zO~oo@>V_@W{SZgUreYbHy2Zt8Hz9-GGBU+5fkZ;ahGk@mS1_g{CiM*8n)#Rb&B$Wx z;4m&>Jd9dh82!?PQ7d7ci<vgUiyf((ko_`dnuN<-7_|~I!oWqyNtc=AFu?#5ueQ2= z`%Ny~S_v6o5J)(~1y(B|J8N(e-srgq-|k3lgpWE>Hz6YvvIx&|5!p(}7z7t#r<-ZD z5;6e6ML6HZVk;r%R^TE$*K-lF%NLD$cdh3lWS0*v!o8l0kns*K!jE_^LU#G!B7E3$ z5wgn%7vU7w7q=3!%Lf->tLGwQmk%z&D?Jw>yL@mF9`Ia*Y{1|mWUIAN#}uz<JL$HZ z+I|mSz@K#M?aXSuov!t=ed6I1AseHVsk6cq8y^@6<4vy9HM!eelj|g`)iz-zGIgSB zDV>CDYL<~HHZ7<oWIM8qOr7UiRVN{vl4WFSgKJowgltWgk*OsvIy(v3pe!R(7kfrR zwkcJu3|D$aLN+VQ$kYMPNXV9D8JYUBXC!3fvW!eU?imT$zAPhCb6xCr60(U|MyC2a zBOzOvWn}7R&q&CIW*M1!w`U||YqE??@rs~Gx3P=|tuIs~Th(DDy-csr&)E|j5J-e< zJ=S)n*nq%D`2S2>;+%;M2sRS3_1MBN#RddMLbe{u$P^n87zx>WEF)8FKwu>NzqZs_ z`EPAYr#IR#M;*LSE$2{j(k-i%EsGON45)-`VHk`FIkChPnvg9HT!frhLKYz#A-D)R zt^8j&$7BoU#1aK1WSd1n2|2L@7a<!gxClA11Q#J&E4T<bu>=<(8?I>7;fE7Ta1nCM z0~aADmf#}ffCnx@PAtJi$k7g5gq&D{i;zPdxClA11Q#L4IdBnjVhJunHcW64a$*TC zLXL3YBILvpT!frhf{TzNoph3|6{dJaUXFjh%|4GgX1W!2vlVhn0PTyATLL&vK*$yZ zF2XmsW!?YS?f@GF*Z;7NkS#&{i#MBfYRL6J7zx=JEF)7~|AUc`(P<f(Vts;<kd<f| znc@|U>8kyUZ3Uz&zRZf}rYd%`2-%xrCyek&SIhq|@2@ftxPyuU5VGo}Hp(s#xPuBt zLRP(HWQzS87zw$93da$$e*+gGcTmAa$d~~a;iuf}y-djd4P1oWL4_<r_HW=K<PIvh z2-&}Zi;z30;38!I1};MGpn{8#{TsLlxq}KWLN)?$5i;_vW0~R=dDHFT1=vhI)WpQ! zPq&eFwh=yT#Iq5?32x8p|6k7?*~Iv;5iTL*!$v%cC5*SacGv3oun~C)`LGdr3EA`{ zUfL^6@nIwK5^{!uyo4)Vd-}iUjuPQ~*a)u?vWdfMgnZZtE<!eOa1ruhBe)3J#KA?# zc5Q2qDPEB`-P%Wd?s$(b#~;z_xL{AsZ8i3F#0mqF3)!lh>|eQeQgxHXzFD^=s&4vz zVPr(RxNO06jgZS0O!Wx4Y{AG+$k7#CECy%ukVVKw1TL0`^I>oia*zNQ3&z<gxCmK^ z;2No1EY)}2CP)j7qmOa4o0ibCAW<#-nQ;Kz>!g;v>qol?=@oMbgR0r1U@}V8zQkQr z?TeRsUBjyuMD?8OqEZMs*NshkX%V<+4=0!)5we~n<V%&bmECD84>{qZot&Csm?ZQ@ z_0T9zb};G^#*HdFqd3WcI708u!yNsq9h#k@`5ZOT?g<YyfU-;+U67T~$HE8$4SmlO zAjnJTi+PycUb0}h7~$jEMA+*8@*O}-c?vQx*x{gZ30JvR)<(!as3zEdAXj0EK~)nB zfXX`X?Y>Ot<4PElw#1!8v*@Inp#Nw23RAQY3PELx=D;{mnTi<)Dve_|Y2`8%vk$yU z`|>dY?W6AhLAT*80{26+=qMELkzAJBK&9z)6x;?XQ!%%Jn&CE3Gu#HMGe$u!_>x9E zW#)sW8C=3nPIjw@-NPPQDY~~blci8AJ@Wi3^H7>tKhLM_XX?N^^M6!tvo!KP0rBas zNv|V3TS;MX&Hf4#tf`E5;-Y|K9hq#iPnuJc;>)V`G#9G;(4sObGfPrxx>9gPy;66v zQ3FYJo{1&QvOLX|VN{waADoqn{WKR``at@RQ;n;w4Z|qnzZ(3&c2>urR;1K7@g0uV zR3ZMPqb;lu|J>0QRfs33hw{N`72?H?c6x=l)6o`Jh_7?BGb+S?>u5_V#2<3Br4?d2 z9mjQ&H8XZh&isjk`0so^%K<FxyR~2w@m4cl?lRvwlP~DA;9qt3&1c)qeR)fn^zUTc z--G*f(v$9fwR}447%iarv#qLM<dZ%-<G#qJbC<dM)$-}+zKr`KpY)-O`yxMCDM|k% zJuhQ3{-Jx}C~dFRDZ^v33Vnn6X0u)~wI_U;lH}#V;Q-$Q*sp{)cwWMHDoNhYlcF*G z51#d(6|&Z#iSQdPxBUIP#tPF9$LR7IK&JoQNiF?SA?p}Y34iNy+xPRC&a1mIf=pG& znnrHInR-k9&V|^-^l>q|*u?aFC$)5@LdFH860UH$txZg?bh*of7dukR289e52qfI< z1X?qh-VvjVnN06>QcE`}e2pWu5Wd-wQXQ|EVCC^Uj~@vm{^pf5{WHW2n!k2+b{Qet zKPK^njGJVrlm1>OrNrKWS9C>$47Fr~CjEO(%4LM?D_{#DLn~<u>3?!kN`&lD!eHQ$ zfC*k<AR*%}X&~t*Isacq$j$}^5;D$`29o|)PD+W8T@noZS-=FZFp#iUv&KbByC$7o z6RaU*IK{I_FHZWc-WtM#j+A=cU82bTBzq`+hd9|yO+q&%pL9o8Wxr1U|Fw4}aDEk4 zzQ5g_r4t}&1rY%y2`FfWkdUy6$|kEU-AO01=AZ7QvtTy5JCLv?iVJSfjPRZ~!u(-S zpBoq*6+Yr<o}!?P5N8}g#w7?EltIH21Q+C;y7l|ky|?bY-5n5TKJ)nJlm4AL_tZJ3 zPF3Bds%~9c9&Kk#a`sj2=UmlJE1(|X6MVu4A4kBp<aJuo&7(-wtw(D~%I+5`?z}7I zDjvMbayE>COJG^ZKYei=EX!348&wJEwiP}03c5QDwAyE=+l+Gm?KD7m&Q+M)%?@-k z@Mbij|8L+O+=M=2k+)%Ap=d&19(c2w(BBKZLz>VN`^bA}6S^nx4r@YR8+eB|p@*u{ zwy=+@%I_aG+p=hgvb|%7!HJ=4)0@z};_YNRaC5)Ygn7OW+FmUWx7yx!g^wUOR&E=R z^y3L+xI`KG@(bxtiT@(Ih+{3iPnpu>(3d50VNPUZ*4<`7Ifq7;DVM>OU`iAF-<2PB zeS>^RtO-f_^_leE&s~n;(_TK_k{utJ7k>%YM`&q#>zH&~rCh-WjF(HMaq#2b10ByI zr2kb56Bn^LTK#nop;a~HL1InFbqiP3@Hq{vZp*sO2rJ+(&`L*W>4mD^u%X4ZX4_Cx z?Rk&?M(z2(bLR{-R_e6Jsb?+_a)}}RZt-7a8=XX#7!G|vB3F;kL`K-9Ug*3V_@zB- zgkjsEGf`CKp(zZ!(0TuhHov+Wi})jKEdNCd`Txb~c3?xB-5y3A&3I8waygy!!sYZ? zL?8<02)o4#=TLX$Nv}FIzyHQhC*i91>>A4p=TL4_e2e+3_OTs0heq`~rTJmqoqk4W zPo<Dw7i&W9-qt;peqa2@gzmf1cJJFH{Spl><?o48i7CxVI&_4PtfU#As>sTrY?!M2 zkqUioh{39A^xVR+*&1qL;Ao5=a%qzOppH*UE^W_WoK}}Mqeb!><(LxX7`Ub-uOQut z7Fh;<#`sZyCh0BGwNG+c-d<rJ<Wv!YKdH`8-Z~e-ZOSmYXkp;`va^UXbTP&coHa@B zrAD!jeOw{e*vif#`0DBm>+-qN(jj=LGFWBok&k6L2g4>jtc|haxrR!5VK9A3-ded< z5xk%}Lt%sB)K>%<tDS6Bnv2H3rgC5rrT6g_Y|>w;wq5u*Y-$_9+m#`<eQVh^qV!;% za!EfPY!`}J4itinJx7~2Uz`s@>MVks04O!-lXRkp6qPL_c$zXyP71CL+*vL)q66V% z<Tqm_{mx*!V6M=V({X47Kd1~x+O%n|wu>1G6?Q>h?!d{eaiXLtWv@>LwiJBdF?I0> zy^Z9%pPQ|4e;pl0?3t;knzi7R7|&dAvSKuvKF4{1G|ihnNcwwfT2wq~8U{^~G?xM7 zNi&P#Caql<Nk30v9GzewyB?KSjg4|)cE2Efk80H~N+R{!jC*}clhm$yv&&>RwKPc` zmT@<?G)duw$!;mHaU0SPo0+Td<Kap_o~rcY%GN4Bt|>23toOrK*~d=UH&QxEu`uSO zQYef$y~2YFE7m9_$<2!O@nK7a(mI}Tp}GjGTVxdXq}H}uqzZKXCYDMPjvf>Y_QXPC zjKO!^5&xQ$+lHr*M98MFH@1+VwHWjI77{cTV{U38L0d8A<`xo^uqDwRT$yj<+s4~0 zr~ZdxV7Db%1c_Bs{BUpqW=qlsi6bWWRPYLBOR^Xe-%RexRuY+`OEMRW6mhyE3*9!6 zk7TT!R1XtFee_Z_GXtwsMX9B>B>9FE-4zrrd{E?XGS*lrqC~bK?NqU{a`YCxw^UpD zFTsD}YfS+E38k^{KeN$`|Cx<aIXV*mk7h=Ba@9$B3e`!83Ux=B(u#^pQ*Wt<f?>(F z;-z5NF%|{GO2vk~J5TWcC=F=g!3JnPX8i+e#?1N$_KdmNEf6dG>Me!RU@2D`?Bq&= zm5S1|gp*TNj?&4gZ6rdY#`u5e0gIO%95!z5vV+gX%MNZE*DgDS&{(2<y#I$C(4=#h zmz=%a<t1k?cX`R#v&&0tuXU9FN9zTxpV6j3W6`F-TyM<UR;f3(jzTMFttxhe^mFdA zoaQQ;g}*Y438x;yXxB^%Net6#CdDL#={1vrVkf<3;(d%yXm!%7^@eoeEi&FmWUG_H zL0%+gtDwR`-XGqmHyH~DV;`#1c*af`wmuq?m-lTw59A0o#h^6Dg|{o8m#rXp)83q` zdYiDke|NF?6q|zCdNmwBAvoRzNzJq-YY(788kra*b>zgTn#(gWNNUT86}=*bckBsd z%d_w<EBCo^xhocNp)g5MnH6~Cn=_Pc*X&=AnX994<0a2xs{q`f25kL3B=6SSI$TI9 zz@#8~x89^6vvAhDf?ijUBA;ThYqYIpgk;xfJGnsSdQsg5(v<aien&Yge$6|%#bRdb zy_4i0RD*1r>+aQ|{}5{TOvryc+pDt3K>llBok>&vR<`+9y=8Y~f-G>Z`YWBb@RL`R z-CLYPpK566S-<Osq#4*7FpzZku}<&4wsezrz!}JzE+lQ=ZV5~<_AF=^I*zzU9PI_N z>sy<o@YGBgmlV$0ryOowKW1M$0;lM{9l(7q23|d>TnS9Jx&(G0F2OD-;}cr3`Z;04 z-uSpA+24jLX6#)U7Ap)}xiPXC`_&(J!%vg#TlafjkW9{f%65%?$`(VnJU<54l?-C& z4jH^S88|#YK3g0*KkzSD__8l?9keE|P!FW;Ta!aeHRW&mk)-`tdx!j=;Y1Pk1wx;H zK{~eEQnFj|7M3$xHd@v1%IY15ymW&dIJs0Rv=PA*R8R`;&X&-Zhaj8>`7W{2m-I*w znTnV6-0I<X=ydu4p{o#RPPr9tzu6<W4X3&Hd|cSZDf3>!{8Ux?9+UX9Dvn=bQ(5qj z)^WS9I$h-18S5<~FAA*APl~)*=sxb`zm5urGK{kU$uZR*PW93Mih}nwp?i^No%u%k zPr>ThoO814j*eyZ=-Y6tbFAsyXPtf3ELJ+o9SG+#^m=Zl6zV&2@jbz%(n~VVzW2fZ z^&h@<74H6jPYUiA+H51_kHvDXUh3Yt`h^(3%w!?|Lo7E4>}DiM|2Y$Vsa&LGm?g-` zI>h@;r2i(AsuPm-v9q57wI*XT<)PKQRvCP_NWC#rLtE-D2$Gtg3DUwYC<v0eBnXy9 z1AJJ+8%ZrKqei*Pa-YZ3-<ITFMTJOPBPX`M4FT(dq)S=1g#;}lB;k!a9Q*@<%MHls zfz<^`c&FvVo0~aF7ff2vbF2f`=PH2w<{0FO!OCn%YQar5yORQGFxTmOvfPkV4Y^5! z*03Ni&vHX@mUFpXOZ}uoI6G8+0n(~2?kK$aLmkpvCMFlBul`t%@vr{4dXIlp$~=9Q za7;4)s`kcJ?VL`yJ%k_UZy9xu-2S#SR9-zxQWZ~lWmPuXRvtAki}@SGircF(eul;W z4K6$>huwt>diUV`j3)Fcfp>5d`r^Qw*@XUh;LU16XTdn62@O^SC=RRAqej`ckMEVg zob03d&f+|wo8LlkoE+Py_+8|}En_-KiQrz!@CLuiAlJ1Dla^Bp(~L!R={zNRUKJb| zVrJ8MjNs8BLt)0gTto!tC_^-@S}-?t2wkbWC|Mn>7s^yvS&_yI!GUV)1$U<op)0kH zlJ(WfF3(Q`5339%Zwo~!greYCS`-AY4H*in5y}}5q@@oT`5|<rWk(5U>oyL^KNl1W z?^+6yUy#3Rhs<%gJGysWJ1&G~>M*|Ml=#W`xXX^Vdt-m+>F;wmFLH{>pKf*z(JnmF zm7~qM=s;z7u050USVQ`Tti9p-4N7{0bA{8yI=iCgV?S&^<b?X}YUhfLVYqIElJ`|R zcd@PaDL6NrzPRBH8M$HFQt9b(V!{{z;|^69iHT{GLz0L17e)*IaziD<j}}byHxr@0 zp4Ny)daFX>75Z$1n-EKyq>jwETaqRzD%@nZmiJAmGZ$`oDok!_tunc}waVm{@|aYe zNgMTzjipmcaq-eArMPsJQ%WzXY|l%d=h3ej`}@(beM-Y%e__j|#*|r($HT7p&l?ZR zoQf}KyM;zh8+EUp$5O3rKUWt3-GwfeN)nFF44+i#iG{`(!%b*r!jDR|&8|Yy23zgf z0GcM~X6F+UG(lr-Nk~wVis{<0q$RkDdRu-1iE>lAsg(rSk}QG5p7W@cL}t9Sp2mlQ zGCq+N`^5^^?jdZwMDVb{Dn-((drWG6AJi?JpgenqybBK!nR%xbzg|iD*DXFt@QPSi z4DpI$8w;;8btUiodI=f?XnD~L7U~llX?^B=OUXKwJ*Wb04jn~c#k9I#pMqz^G1m@= zW1$@o$+XgA59?G04^f%(5QP;UI`#LfULOec+X;#56*=8l+q28**NvbWw9-y*5?-)) z<s;I@wJTp78NWOPbztcVms6d)!sS%k6)sloSAtM~psn#B*r2fpHfXG}I#hra=MkT2 z$2tpVh>Gg+D?G4A5bR=%>qH>E7~?z&(~EIjj4``>TQ|krOIF=&mZd7jY|27ubBHar z8zX%-YH1laE?D0tFWQoE&ooKw5gK#XULsG-Sf_}*JYzvp78`Vf1l{I4%qiJ~SQ9?@ zrrhzub3ozg?7;d%Q~hL}n{6w#!ExFGDve2ddno<Csr2r034OnK6Z~s4Gxkfj@0i?# z|Ko5xUCA7d!zYMwej<5M2-|GPj|JA*gafp}Pe`z9M3LH&smW5jcFOk6*=eT`ElSp! z91@xerE)89p=luQRt1_C(wZFHgr-1lkQEwqH3AK$Z8UDyI|ujZP}TQ7aXw3r8M6zO z{(vf#W%Q&U7vClsAxEjQSXoc{fKZ7I$U`Gh(r*r;=Rx*HqNE3d=-H4TibP2hrk3O^ zNDyC1gZtR<bZ$_k*wx%nPaHKjtWxtEJ2pg<uEOhMq@N7YoDKPO2>j~wy#UhVL%Gj` zoGR87cLmFjP+dAHpGt?+kUc2G%Bv@RL{NV=<k^|}JB#WIuQ8?Sk)0o@C%rVNKMV4I zWa>8;)pwM<NA{|q-oG?K`olqe7bG>x`xvCbp=vsP)2F6ZlT&qT`a|J3oBi_-Z{hn0 zEX&9p;=>?(nml)iuYs^LdG1i14;deC`1q>LKtqmO;KghSA0KYu(^4h{iLWNbY9)5= zHWqI4y(Y^DNl8qK67anylY*pBCY3o|q$t8agxmj4{N*!tcKO7UsbL9ICuWyrtfJ<8 z3M*Mu&cjL;g7eBDI1j^FdC$XeRyetyH<;0wzB?4K=F`k&hiblfRQ73p*{9OJznMp# z!Y@9!Zi}BFvnVynPBqF=8tTJ0S>Q(a;hWgcavIMs2@#zOnRz}B&-q4)t&M}ss(fC# zF!KoS{-I&bh0F>wkBIXz4^t1BHH^|OeAxx#2XdYhiMvcgH&l6T$)%SzNi58mmo-UD zZusz|l5ts5W*olEg9Y+{Gsa)|<PjUrr)g+er|*WOo1~wfAVIbI5lLz`J3n+oQnOw# z4v6RG9dUFP5!@mowxG`59w3!-!nioWnbgaY%K2fk6@FB_l`uASY@=%Q?}ZIpG;*<q zlcTwe+^vegy{$j)F4L23+1;Llg@tfyZRH(?ZjiyAoWaWqm*&Fci?=w0zz`-e^*Ncm zG#Mz&v0YYpZQUMn{Ikpu#-58eaeHV@R;Xvt{HorkYbi-p?6qDcq%vn#UHii#y}(Y! zkT{Wch%A?<@_A{exqeLEitDd?m9{0>sFL0&bY~&x?*!h#O=uKWMa0JA(&x$pb)q^< z=wzYaEMB`kO<roVU89<C&W?_ZZo=UNnB|G1;LJWKZ=VtFW{-vYq`OcKCMoPaXbW08 zWMxm`PX4Jj6==q4ljKKIhWl16v5-a4b`f<yk7W6kvW{|oG)aMWO9Q!Gg6>w;t+^rn z+Z?~&_@w_RzE$%}RSM9wLQ=qSzJN|KtXC?RDToV`zGQ7BaRYJ`guw1({t?P1ObSsQ zZH_(}T<(ITnsP2r4t{k(zB;hV`wp{^X4HBKT_<#H82X<AZ$=aPiNHI!3H>tlO81No z4OX@FT;S3LG4GPj8-)AV60zLrxiGDtJ~AQrk0C>01B&vrJA&U-h9j+Fa~2Ax{;5Og zN*6hx<dI-~i1jn>!56__2kQlc1$T#Ci-Qt^AI)1AW~zr(h7xd6a#`U4wGgHB(GJO0 z)%n^XbM(8T`Dyt=!FR~lTy<5i*YIBiXi0`@(Km%E8>WTP-0u%nRtQC*7{fN0IA+hO z%5t42CC4S)^l*z+)#b*evPg2*^1|)WU;FmR29ND}OFe8;C$cg2Nlg-?7WgVo2i{3g zw{{a=vC~1dRwvt1Qfpk>HKIcA*7B>q)p~8NqU@{f-w^ApoU8C_UI+jUacS<hxzM)? z-SpYtr)QJmSmZAH{G8?I=N37$jZN;{-|?S$=bpLcn_KpGLTI0~Iycas9rsjv2a(*P z7EFV1w-3;?2R9@SJ(R{IX#112R!*O}H3gaIy+O1W68pBIU=lR;-6{iUe5si88$W)0 z&IU?s-vmf>SSQ`mLLyVB-64uG!@r+qE>qBCffubPusiVY%JE>xx$r5Gna$Gdre(Aj z1hDpa$lD8vj@IPD1P?NOJ>I44ubY#nzCnu}Apu>8vrL|<&e}s3u%h^GnjK?=Ay*F+ zA+3klYIWXVmAn;Jou=Cru)9LwIw5hWBB#6ge|9<DY&?p=!i9k-r5A>{tZvesTww76 zKz4rti1WLdb>a)!j5#p^D<{#B2P-<1Ge=9r5hu35`#}$?2&kJcM{$;O9uAQ+oh|pu zvcF@-@)*Jer|RCQELHIuTUjWro6MG{+{C!uh_<x_%g3qtq!W%L&JS(sY{>ToRu?2r zyYJ^PjANrvP59uOa>whho(I++V!GQYk4rSp20HBL+I4GdDAj)Q)}8O6r-~OQt1or4 zaFd(x4~&ne6H$|!@Ci<wf06PL7JKT2Bmy?H010-DC@4E}OVNx&V>8=sZhQ3T5EhEy zo`j*PV0RIP#(#HdgvN0fQfRPdwwl%rx~#F273r~)6;Wztj14Eb2UXIi=(sHqfjmtt z_FN;~9Yi}JmqenZFBE^WT_Ez)l$RAIEz_q=MBf%vU7R{d`pRH+HYA~PuT;9SkOud$ z@uA!^WZ}j#9aN|YlyCa(KugP5n)$5Yliv!JG?B8AA;>d=o86EXhurDsJ({F15B&72 zHBHiQ&s0ECBDTdN4GvY(G`bZfO<Bh;@JCh)3wyTAS?mw?3JVAMD)FP|d!fQXK5G5H zH6>Iy=;ep|i)U|N;3X}_kpB=^b08lItoe}p_mXiA1vyg%F<p>MOW24nCHjF%WKxh! zahViTTFhq|i_&fk6JWC;c?YjzK-qhjBowqi6rmG;3A~;DaE@>r3$p~-Sm-PxR;~_K z&V?jU>3}(=7lu%si|Jp7xSWgWtaw^dP&Nz)2R;-Wm=F2ez&aNapKOi*kFHqaRT&GC z%JXmM<7ZY`^UIYrzwElkdvLT0asJ%kX*Xo%X#-Ecq_x4e831J7)9xmo{wzea8!~gg zQFgw8^Vf!!)(x3eg-#z;<tXwf)v{2kxsc7kng>Zit(n}qo}$hV&15cQ)^g@S=1V^} zl>V2Y^m8GzCN>X}fVeuI+l*u4xrF7$5SF=+Sy+acTTYU<s2mpw-DMT}hET>cA&*sC zY)jUzZ<1Ia8t9ogzq1@l<?#KK;HCEA%4#LO@5++NTvfx{Lv=jgCqX<X?A2$yoQstt zorBY}o1Rk<9tcI51No3x_6_h)v@}W4-t6JUxHP!zl-LcKwJs+Z7r<vH_MEjnH}*Xa zKgA&YHfL>b+mNC}?&+$vNecI^Fvca7D~xd|3>P7<msGAiCR<S+<5rZ%xN&*>-ZTTt zJpb*&hP~9cuIh!W!YqitO)jkOD;)RJ)&0qyHYc9jo8~f`A;-{-GI&Y6OL}ny+kwxk zGdS@ta>m{#EzFkN;A;NP^!amUV0&`)sL7=|vJF(#{AnYt$zc^zt`3pp!fBU6NG_aq z{|<@1%6WEFWkL<#O0vK721IG$&%HBeHarzuqK7?~d%j8=c6a~&1^x)7ac6qy@9LNh z20;EmtaR@i5?RnRQR`K@zoU~l{MDx#yKqS}%BrfpELBmNRYIl8tP(1%F&q<|`j;MG zB&z{WWPdZEp*$~3Rcwt^7OMK-Y+0&uI4t*ldVQOo2=AoAxT=Pp6?ik6(DMTC;3o9? zz?<2Gz9H~tHKD%~c!xBh9}c`jo6t`M-eFB>;%JNYvoL$A_|5s&)~X`m{*h80f2WwD zEDFbqUz>-&qT;ywT06ylXE<K`8ayHRe8q9MAq)JkRvdTw<8a0P$1!O!hWqb+9*Zfs z9)G_e6-=HM+EY>>d;FpB9r%}s@iL*wLhdaVy9$xsC&zc6BPabgK}FZ$BB>wK3i*bR z+plFI{icw+dx1!5$#O$33Az0z(n+76<2#>7Ulg=<T_KV>HLZ~E4!ONgq(2yPcSHWK z!0P<8NGjVDLVhtQ^lp;AHOF^ulKy(o+I6?ce+#Tm$gP1@IzzdEOTV-#?3|<*c<hM2 z-u@D0e^pR(4kZ1_Er8WgsxWSv@Q)8#x*+LwHaBuOG-w?ilIo2=m=6Dfp!pm~`lI;= zNp;5l!GC|y(gjJcwR7p62?@{~guGc<^Qv91hEMM`Zy>3)d=~e?bof8Yyn%cuusVI8 zEdPx=GJ7V)y}9(cbgG)l;`8T(m>|I~n|7Ql7JGj05|371Zq3`n1KnKi%TLHyUOfBT zl9I8yQ8sqHPq^7fqvys-JvY->q^^;pFA9#%hQ#-FGq%Q7`R!dYm>r3YW=D$V?3Twm zmwPi1!(WgC79q&Zfz@@l$on(aBO;#+tWqOLyL2*IMWQ_JmI<1taBI5M%OAo3L+QHO zVsG*7GI65TBDPtPoCWuvQh+|#q(FBo0Sy)<uTx>1Bs6FzN63##jJ@tie<q6sLHx2< z-VUkTGeJW8{emE=pJajr{IP-{sXqq6QrKEYjT$?4+_(u7IyzjXmv*Bg6rkNcLW0&R zAi*7$B6y|?a#Q9s@dB+yK;99gW<wG*Hh?1yT5iY(vfPkFlH8<0t7*tTXSpG1&ukwT z_pFvt^VQ<lYe=!`A)zc)@s@8{$WHu+m!C6B7X9c(>{(%3w$|2=>jU!FwR-5A0&hkW z`lo?+a1**clyPPgdRpMkYC@kAc!xBhv-lj^ga)f(7MG_covu|~EMKn{?qlO8xoM@s zs7N~5g5ZZjhQd5lVd-d^0l^!UVRCWeDjK3lvmp9$WqJM3Sqe)T3-0@sm8kjr$kY{z zP@xVr{}dunaG>y_Xj&Wu|E)ShVd^f;fZ%<~5H0U5W+-@As0&|ulsq&NWd-Lel%Zr> zC`!S6A#`a`5d3p>hQbhBngPKUb%Y~}4YHV_;9;Q_eA!X5%Se<JoUc%Zk`5`0<|PZE zON)Zwe$^R@%Z1$>FM|6AcMAn9W+-@As0Ckkl*}B7vV!v!%23i3ic*MHaqBZz6a>42 z^&v783>J#)i-HnPh)3GH2f33}(Rv{+70OTo+Ma%e>H9(`(t1Sle3ixa^cx~adNjXA z{Mq}OE29rYd?sg4Kfkjd*Hf-d`Rmkm)%~x0e&-@~yD|)O?kyCqP><eYu78h8-H@lU zLg*{1jtl4Rp-~kq7S9a@&kBvgd&U*_sGzK1vDn!Po)wIGWpNXEPAxR9<&K0|4rWiP zuKIo@GLlSFyf7b<p8$z&Hva1KA?#g8EirGC-ma4PjV5#K=Jd{_NvcE7d&a#lX_BHr z8291w&P8?R{B3WAy{)ZP_O`cH+1t=oy1}lqXDjSuW9j<FxNPYP`?zSvtX>87ImKzW z@Fd&`xmO6*Wyz$Ho4Zx?r>c$PzAOWvJD<jVGf6nw9^BAyPbNCXNWXC$!e5taTQdqt zgxr`KGyzJ-u}BagW8RmLpdr{EZ<$?BWgEv~9rd>G7!u{CbZaXK(5CSqv1fAITS;Wb z^%xktKpDT26?>b=M=}->+_^rIrr5?azNI{OhrA0P6p5d<uy>TyWZw10e)(?};uW#5 zO2Mm4T`yi`>Pq$OcX=bqps7PMSg22Ir1cqlSf{cFRiG_3MiE%C`q=OChG)bv*A9qd zp&by(w9;b_>r@60QJM1)g%uvQB=l>%v|)zWX4^=F{C03?0j&&&HwhY8Jk=6Ef2xgb z`|aRR2NqAMIlZ}4YEG}6Qe(Y-FF2|Mw02DVz+BVL;#g|ht)ox@y7lRmza4A;boz?A z^LxQzk099DAJ>UMdiKY86sBkY*uk;8Fw(&_v+CYwOi8L@l&CC}wuRVYyD{v3+Gf-3 zzwHKx{lC|JV!C#j#9d<AvVprrKAy3j6uDnGPjy3f23F@BkrdEI3?ab@xm7K;Dy0b@ zd{gdt;V!sve_z}nu5gGI^G<mjkg#IjhLs7%dsQ-bNre8OcwxQ!TEAW%{?+mEbf$H3 z6FxDG^AlJK+mf6K33iRB{O(~c`XW^!2>De%r6_3Ix3=_W8@~|=ymng@LgTU93=W#M z;NIAPrZKqX_0V(F8r<@FXo~5U*F%G@2B5*3<@LA>R^QLW)gRKfCES&&LaKC(eW~6( z?UVkbj$0K$vPg7{jo~>_(mxEM4af(@Vog5j*3ehZf!tXvw32>#5Iq}mx>!?^OAGIU zM;oQ3Yvz$XGN|{Pi;<om)Sm^pG!iAfGKh9VQazN9G#KqeR%)B2HW{j>p0J(g=${`7 z;q?psN#7J|Vm9RGgQzb*>8}RSF32AR(R44!Ch4CBzOQ%E+k%SOklQ0s(xVkZtGP*q zr?~qHtJ=~r8f4p}>LA?_s-p|?upsK=LHej5+6{SZBuctheDkpI(uX~`<sD8vM7A&J z@_`|JelXh!Ny8Z9zcEzm=R-A^)Mj<N*s#v?9~9b56XbTWY(<qVNG7${#Xf@x4y|!( z(AW)$4yUoZLSuKe#w5YZ&jy`cka?Y5L1%05vI`Q&o$;=!?qdrk%zpY_%r&xeOR(3y zO(bYndB{g~s4W?6Z~jgR%$gh|=svPGb3eE144mEM?s$&u+unqS-*#+$n#+z=#A!(H z=i(}8wFjAbzoyFjx%dcr@7*#7IC$#4w<ERQ`(v^9woo8=A4lF@mts$CrV^*Yw&a4A zQs`Y?eC!Afq7xFg+mh8S)e%h{-F%t%cjDz9Ep(7S2(0rU9~R4Z8dB}+Lte-$-wLa= zw9+4l|Ki8a!Du(+mjY`Z<ZU@Wx|^iFl?g)PqVJQW@X}f@<gY>*=0W~?gLl&BC3R9L z**wVe#qxrrvJjMBS%?c?P7{uMRXx@yAc=u{Eky+;0M3D~if}Zl!qL?v9KQ>3Yd}7g z3vgGH)R+*Y1|;$Grb*qO2|^M-FGz|IT45lGpBE&xI)uFexh5C(t|qC=GeJmd!fPxC zJI^8TdxV(GhP))O=0Flbr+IdWCsDA+8_0b_K;}SFGM|?ezSg~I)`GKb@&@nB7$n}A z4#*$m>T`B;hrJ@?rja-g=cs$MEc|eoM*D2qZ@w5^p%^qV(+ElX@>NcXCblE3jq=i% zEH5M>7^Ynn;y@HQx!EZQG7HR(pXc&{=?;P6OlIQ}kc7hd+}$LV1!kC&TGkNe5g4Li zMhf-q6KUZoG*_1DiwvzYvvFS8M%Cp+0p43}{K(KxJ0S^=jg?@94reUL%y4JfaMhcU zp=M8%$u*g2$jtP7Ousyw3_2lk!QKnN^xNJ_1Un(KP|q)gx`lImX0TBb^6O^<o3q1b zg4=T-zaW+k9IbDX_);c!n@FtMnSm4A_e1gKK+?`ko4wk#!8?#Ox;c=9A(abm<_J8_ z%$|!`@>Yz8<rEl+j;u5z?{65RJ3aTFRrD>F@?VFo@b<iN?9aom--Xzp2YKWMuhecK zAU`0M-B+${lAu~l4w7oI7il1~D3?|h`mWxV>?iF93Ehn<^kL%JX%7<n_I$BEIP>95 zE{T5bF~)s5mm=R8iro2akw<Otd2Bo#GPAO}Jy^*KQyzCucS*|q@fyS51v0f**qR*P zgkBYRhc%(s2Hv4f=(h&mAx-G_1m3JB^i_d3vk84|;2qqA{#4-2XhIVbR|(Ktg52Su zGd``5xiM$xoplCs1AfqZ1>PY|=+^|^tS0mkfj6@WO&hA(l#0OqM7}*HwA&g;+E9Bk zU=Nt?5sg+td(DnuiW<(2U<hn$p&?PFRkJW9p;7Mj=_X3R7Q5@gO<G=EBP0))&wJzs z&#mjT<N^O|ncZ(g+BuTsdf_s^MXNuU`};>7KQR3cb&|A8?$jFjgWbHY{SFbHBAhLJ zv+!);GU2C%K6mza{8&%#E_}K0J?)uHp8A>izYsnu96ioUjTb&XKA$V2XYS<bN&Z#Z z<Y?jL!i~b4gjr5ck^czk0iUhD`O>rh&R&1)Pi+6AlG`rCZ!nhM-7k?z_KvVy=~(_o z@fYmwk8BX$yN6HzQ1}yJoWG;Pb9NQ(A>3QIzwlV;Jz0poSl=m<pDjE`_^KCs$*ICC zgzpr-TewkpweUm2j|gLXv0PJf;766dZnrq6Pk&1Mn}z=<yiNFZ;j2{cSPSvqsN;Vp z{D|WH_rhC*Ulx8<80(w*I?p*%c%$$W!dU)C;(zfdf8<W#FNJmTKT|&Nx#oXF`hF+; zy)d?4Cx`sg<a@o(IZD_rjP=bF|4`xUBaG!^xf3LRvhW<?0%4rLPHv&(7Yom?$sfzT zU2^Xdz9+)i{slT-moJt_-}{yC>Ih@`SnfK>-yr;w@HSzbzfSIJHS*sQ|A)dK3AYL# z5^fX5_C}hoE<gNVN&jOJ#`a>lKS=)1!rkBCbL=II^ViAkQzQQ>@edQeR``Y*`8v5{ zYvkb{uj8ji82cZ~&6WIF!j-}SVVu8C?xGs`TgBfj{I&22;WNTko$q!NzO3f_ho0M& zuS;@g)yO|0x!5lD<MP${v2Tt3*NA_F@O8qYYvfN8AHUZt{k|Ic#o{j)t`d?j_Wybv z|D^CH;U-}$Kjmo8*-!Wy;eo<w!b5~d2v0gDNq=*M{X);p{!TgC(<9Z79dJkO-6wlL z7XCu`e}$vvXM2smw~GHY;Wvce5#BBQp78s^2ZfIb-+ye9{%#U(5pH~==kIpB#~H$- zgnt%}JHa2{Pxxw~=VpKJl)d5nyH9fOk{=-Uz)Z8JhVy?o|Kj}Ds{GdrKO4nkIDMNW z{~h7o!tV)V|B3rEDtFs)UZO*|oA71AIR6>qpDA1*yh^xL_4TkY&L8KSFS!N6rNZ-t z1HvuBSl>0Wd!z8<!tD`0q4bl&KL}%eo5cT-@TbBDYUD?1r(N{{UQ|;*9IwOi%C~Dx z{+Eh>Kn+e4f0pod!lQ+8JkV2@FP29ih~78W=tmAj?xY&|`KNe`i-ms|;Z~&|62|_u zzsYlM6>b)OUl_}O>U7TmZ&vzN;cde23FG{e&hVUX3bzQqFZ_vcyKs7^m;anF*7r)u zy+$}gc!=-_;cdd<^tEg7v`5${e2Z{{@HfKPpU=+roXrtVD(wYSEf?qey7b&7jP2bc z{(Uw06Y(Ds{)ce8FxH2jx_q%b`atwPUZWp55V@yn<d0C?mI==nUQiRyo5la8@LR&W zYUF>=?Mt*+tBSzSEByuGw}p2J?-s`KI757Jw$k0gHw&=?K3jX_ufwIXcY!eWca8WP zYVe)nzgKvb@I%5_AA0KY#q#I_(fg4a{m6mHU0);LG0$7P<1HSiPx1I#VeHQ-l3y*n zUU=@Cy(D=5xjqfv-tcMgw+nn4oZjoxhYD}*^J$P54#1K6i+>-JpEuR``|z3G9$R4z z=g+B&z5MAyc2wMSzUQ;UDxa2Qhfses`}^G;^e4;dsS~5P6aTvM#QBjQlpgRprNOT$ z4L+hYxQpTk9;!5WrqbYBl?Feibe(^TWpAYrKf%kz$KQ`Cjlch_^cLa23i1CpN<Sfd zN=SKLD*yHpzCuX(UaK_a>r;A}aJi83zC-D_ysum6IkbDQuD!+i2h?w_5MCQ$GwN5* zR{tf^bBpjc;n#%U5Z)oYOL&j)Ug1xL4+<X<{zmv);U9%<>ThF(y9)Ob?kk)sjN^mf z#0USuxE%Nk*7?0H@^?7Dcanej57w3Apqlbfe=$;?xcu-z$_3&#h+p9It&esSBkhQG z0up!H4ebIX&J&|{LHi)CGi%}-`w_Qe`~ZIwwFCSB@q>8c2Z$es)%e4C{ZXAio)B`K z1%ImR?*qc4&+|3McW(K@E!$Ja*Hi8T;`+Y#EYG=L_<-;i!dU*EvpwhM!e0sZI>+<( z6@FV7=N~Q~--idkAKiBh7mwlW{apIMUn>2m@aYIgE6(GE6NE1oz9Pbdl%6S!{fXmL z=f`96;|byKN9fn?vb$&G*Q=DCD#Xv&KjIr>-2U)8&JQ1q;~B>*_UpOoi}Mr57>O(O z2~w}bkvM_W>tTxHaQ5PQ!wwkN6LvuC99d(Jenx)*|3&R3_7C}O>Yw0Vk_S&w8oXR- z5Ic4FP08OO{AXe851*3fIRgB)o-ghab}aBYc@sQ7?{S~bHuLN@$o}lyx5xJR(&u~U z`y(5Le4zEaO7nS~IR9|@_@D~-)#$ltxbhBX?;hy`|5fRGh1(+Jn^%7lKh__YyH4-F zD?cCPdN8u{8>Jr?VmG!&`D2XhA3x&!@WHseu^&5{KbEK5F%k#L35GZ?h&B0itS62m zdcZ__M%Cz}ozmXG+f)y+7swx{<KX#9gM48ML@#)g<UcF?qA<31xcq*-@OUBP1|ZMv zb9CRtI05(yJ(o`sa$ev$z3x1~b36A*v44HT_!G<jWC!Ib-%dSV6UfHEAlvzZY|IO? zn=Z&!xggtv$NpmfY56@m@&kX^<Mw4bzPAwn*!%Vk;vXZ#U-rU{x0c5LD<qHq?Ed?C z@xLgfJZ$wFm*)bt4|Z#1t5)himj7GHUoB+IP`3Sy<=NkhF9cn=#7nRt;g^->{q8vb zaQS%M6uePyq|(m8y7oStJ@(1~zbgG-7qVdlc)$2R6|##2TgR}Q1o))n{v>3B3HFtV z{fpyP=NB7Vuulft&J5@0aDK)95Z@T_E0%{3;tz;@@GqU8xWq`Ds4tLuV{;wq2c(|Z zX(#qKwiDL_c0lY<e(ZqQVFQxb9{q^^0A8>5RVU9j5FlGXfNcK&vh@QvNBTkR*5QY0 z{OMTbJ*>mn|0g8>%GLhJTZC(cw+?##0c$+khvL)UNfDl*G`K+N@fUjeJ%!VSHwZ^x z<d07f`c(G!Kij{|6HmQEaoM}yr#BCH>`<JxN9B(5H<iETS?0g~0<ZCt!drz;31fR4 ze@Mr-34d85AD8FpVaoF=mE#&A^}1R0J4N++Oilg1Qt{hgI90e-7?+3l#@P<QzLc5% zczZsUe}v<g_#@LV_4s$f>x8#N_*JFBtx8Y4%;$fvFt+#jU)dfn6!NZH$9nJ4m2Ztb z^J!lB;<d2@B+u(1aW0OZEV)yKydo0IPv77<GlfS9KOpo+v%g!9^z`Si@W?n}-F#t| zvzltNmu(MkEgx&Mz3>-Q^4pRvZB_E4k^{z7@kb})_3lCbXq#>Jx1o|hHrZ6kZ%@vw zc*nxF@kx?NdCi_~OU5UYD)~Dl#4MkyE!jEwf?`_ao6(JVj;Gs_3CWfZR`Dk$omW@! zJCdjVsfz!iB>8F;|HVmrC4bkXqmsW{vh{0KdR~$wo2&S{Cwu&#D*j8$OyjgAd(`k> zR>R-3hQC)0fA1Rp%WL?rDDhj2Gb(xPnfQQfmaWN734Lc@3AmEBB)cR>sUGzzQF5T< zJ6`7no0305^4Cayy!f5sZ;bS~M-69p!!cg)&QTuMNxoC^FZS%@1L9vPzFt*IJ|_O^ zNd7kQJH($TJ>L_5QpDdTeiHGY7JvKSdIcRGl3gvJ&VTv~<(*=D7q|N)5C3rSr$_ov zH-1&UoF)B7Pmw{vIpVL5_$$TV6!G6~{FWqZ&z4Mo8&iI{f88QI+ao>SNaf4@^k>Ge z^1rTJze@E?Om3&)$R7t)dY($<%l&<Ht1DNzzfUlJQgQy7oXWqX)UOW|KRyo}XZ#mi z{cd&**nS6@AMSTb%J+2s@3}Sn3#2DG%}d{*Ojn5Caf)Z$F8v=c{v^rd;nR}ue4FR? zO8yJtPnzxdyNLf4@i))#{5MG1x5S@5$1{!*|32}z>jdy>@gEU?(^SuxZ)x{?0zIet z^uZpIcDw$$xJ_E_8Q+yZFNLprn!mNQ`|U6OCY?{t6n{p_FJE^KlYAnB8v00%6~E)? zRBb|hPEPrrm;ZZS4S#J7|9#TG@vUA9my>I1<Ub?%O>4dUKg;-+Yvk{i{OSX|;Gp96 z@9<ULmAa33*!YvAGY?PJ=pS$A*R)>t^U@zyroF`P)IIgJ;vXP>vae_SO#Ii1&yFs4 znmzYBNqp99-C~zk_nR&L_AZ~^&qLCK9x*;CJr{_-q1y|(^OyTwEdFY>x3_tA@;>pm ztHFLr@*fs|i~8NK)oyP<zq`=b?;{?PPp5n(a&U+7C*{(R4@l2;#qBFP@TmA(wFdWC zGK}`|?>xaXzNqrHi@!nraaYOjD*pB2A1eMn;&)8*jO$dcsp4<ZS~-^R&NBWK<;_E< z<hM#caafn~t&vU2ODD-f$#0tO`4bf972<DS;rU%^pUH|<D+gyxTbT4LTC`%#@@cDk z`Uj^?Pa2KR*~fQxpVc^F?&-&MpM1vYjmES?lZ7i*H&(1#v}XC5fl7%PGpgCsQ!5SA zKiF8(x3aH)*}_V}!z#H)RB{im<j$<*&Z^`dT*;l0`8sXks^yC+g{lK|NV2ehaA0uF z;>8xvMScB!OO_1`_VqUgS2PwbU$wH&1#Qu)#**c$dV7{P77ecIA87QfS(_|ewPN-1 zzQMjlY2Yg)8jF{$T-NC6@9$aH=vz71zb;wa-?O5xv1rYT73)lCF4Zu}!GdVtqFJ*J zH-{RH6J{TC+VPF!Pk&>h;XD~w)mYlIa?$d>r18eHPCw?flaDj*iKowP9DkBTPkQ5Q zV|AZ)9GOl$^^9YWIkj=d2`9`szPr(V%(15)-$<793@+{KH<$YQjz0RtQ%^qjxW>WL z4xV;MvU<(n!lga^Mdp&e!N$tIwS$dC%a)j@{mYZSwX4mI#z0@61^eXg(;8Xm%(M$! zcTcZ*=~}8u4JHF?dR;S2(vq37CH~MtJMI)aM|8}Q4e`aYcAlg$>NV>ZEnB&0)kV&U zRQa-%7dBS+FIyp7i~CotX!Ncdw2Je+W5&VO>Req&*TPk+*ChiNtm*0RODx~Y!NtY0 zHX1zx1AYDGQqQvG#X~FlR#;IYo-3f&lh|?VZ579t4K(`9;__r+&+_G~78WIZL|lm1 zu9J@gCfCz%)wslp*cceJ{%zIo)URHbWu7rBAF<V|tSk!2K;z=R{#81<vhSi0&NO0! zs}!I#<vMuU4jN{4(3-y0D3x?kBd66>LevnJ_e*rqsx_{*rGcuoK(AgkuxxF^Jnvb) zY{|;Zch}U?c0-3Nw;BtYHKS6!o6Uh`tC#i+EcIr5U8hA^xn@PLHEQpD+Izi-wLOdF z!nHlF9hf5*M{PdM+;8pKnod#2iq(|GH&fRLlVsY!x)p;xy@rGR9+yI`Ts7D?ZOO_t z(|Xq|TfXSPWs8zDmAX4^(YlqEGf8o<-ygZKuYX|Ks+EOA!;ba$E$?xHqE=faO-rp$ zbNwZmmbU0={i_!B4E7|``j+Z^vUHK<CFOJY6N}FQ?Q%I2rXY2vXN8^Jr!84!itW#| z)LQSrKw@Xp6)WuQWkP+uYnE8{o|Q|iYbm*G<zkoLAL{Mx@4JxH@?}<aI%2Vbw8jr9 zO~otWvrD-rd-n{j%XJu6Vti@8NUhyQ6n^e<|GQ_NSw;Q@BEZ$U9_zLu;rSRPha0hz z{U<-;RN$F*9d|!x*Qp{uBO6B>&*>&V<5}PX955O8lRG|Pe^0Xi&*c1P+zafNB>tlg zoNLGboXgMn7^vHllK)bhEHc8C4SkHGfuE2d_T%!eRQ_Wn$9Nl<2FH%M{O;B_&hH)r zTujE;|MWMhi1CO}T>k?mp3gr?`N0kfCbf)HfR{)4r%&;M;M;nXG0G43?MCG7Gad+X z+lPGY|9g}_xVcf1!Y$!|=i@i}J{aZS;u!V=FLlo4ezE=Q?U)n64C9dCTGu&pKk5(G zr;M0j|7jnLS3Y%<mx$#_gI_W+HwH!iFs^y?$nt;P#GL=+XZ*8$nEYOQlH6m2YkTBp zoU}vvw<vzZ4Zo>}`z&wXKI5rdKkF?_@(})#AN;W$$>&ctOLUXRJ!D_p(0|DP3p?Ow z{AYZ2kI(rW$dNx%mpozz9B(=TLh>IJ@yQQ9ZpWeXq9@A!>O8YTw#_nE<-bMwf6fD# z^u)3gYw}-vnwR`e)B)rCFR#hJ_|0B&RHImcIRC4aKaSt|df>jH#y)yxDSy$5U6VF@ ziOJtW(n}OmNpe(8{=a#rZxLH(6g9{BU7Eh1m+ZLJ=RZ^Zf07+M#{Scuxc<4~(e{iC fzop;s-1WMCav-+<B0Er(f13tSRE=aWwUz$|Vd=_k literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py new file mode 100644 index 0000000..53b16df --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py @@ -0,0 +1,135 @@ +# =================================================================== +# +# Copyright (c) 2019, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import struct + +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHA512 +from Cryptodome.Protocol.KDF import _bcrypt_hash +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.py3compat import tostr, bchr, bord + + +def read_int4(data): + if len(data) < 4: + raise ValueError("Insufficient data") + value = struct.unpack(">I", data[:4])[0] + return value, data[4:] + + +def read_bytes(data): + size, data = read_int4(data) + if len(data) < size: + raise ValueError("Insufficient data (V)") + return data[:size], data[size:] + + +def read_string(data): + s, d = read_bytes(data) + return tostr(s), d + + +def check_padding(pad): + for v, x in enumerate(pad): + if bord(x) != ((v + 1) & 0xFF): + raise ValueError("Incorrect padding") + + +def import_openssh_private_generic(data, password): + # https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key?annotate=HEAD + # https://github.com/openssh/openssh-portable/blob/master/sshkey.c + # https://coolaj86.com/articles/the-openssh-private-key-format/ + # https://coolaj86.com/articles/the-ssh-public-key-format/ + + if not data.startswith(b'openssh-key-v1\x00'): + raise ValueError("Incorrect magic value") + data = data[15:] + + ciphername, data = read_string(data) + kdfname, data = read_string(data) + kdfoptions, data = read_bytes(data) + number_of_keys, data = read_int4(data) + + if number_of_keys != 1: + raise ValueError("We only handle 1 key at a time") + + _, data = read_string(data) # Public key + encrypted, data = read_bytes(data) + if data: + raise ValueError("Too much data") + + if len(encrypted) % 8 != 0: + raise ValueError("Incorrect payload length") + + # Decrypt if necessary + if ciphername == 'none': + decrypted = encrypted + else: + if (ciphername, kdfname) != ('aes256-ctr', 'bcrypt'): + raise ValueError("Unsupported encryption scheme %s/%s" % (ciphername, kdfname)) + + salt, kdfoptions = read_bytes(kdfoptions) + iterations, kdfoptions = read_int4(kdfoptions) + + if len(salt) != 16: + raise ValueError("Incorrect salt length") + if kdfoptions: + raise ValueError("Too much data in kdfoptions") + + pwd_sha512 = SHA512.new(password).digest() + # We need 32+16 = 48 bytes, therefore 2 bcrypt outputs are sufficient + stripes = [] + constant = b"OxychromaticBlowfishSwatDynamite" + for count in range(1, 3): + salt_sha512 = SHA512.new(salt + struct.pack(">I", count)).digest() + out_le = _bcrypt_hash(pwd_sha512, 6, salt_sha512, constant, False) + out = struct.pack("<IIIIIIII", *struct.unpack(">IIIIIIII", out_le)) + acc = bytearray(out) + for _ in range(1, iterations): + out_le = _bcrypt_hash(pwd_sha512, 6, SHA512.new(out).digest(), constant, False) + out = struct.pack("<IIIIIIII", *struct.unpack(">IIIIIIII", out_le)) + strxor(acc, out, output=acc) + stripes.append(acc[:24]) + + result = b"".join([bchr(a)+bchr(b) for (a, b) in zip(*stripes)]) + + cipher = AES.new(result[:32], + AES.MODE_CTR, + nonce=b"", + initial_value=result[32:32+16]) + decrypted = cipher.decrypt(encrypted) + + checkint1, decrypted = read_int4(decrypted) + checkint2, decrypted = read_int4(decrypted) + if checkint1 != checkint2: + raise ValueError("Incorrect checksum") + ssh_name, decrypted = read_string(decrypted) + + return ssh_name, decrypted diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi new file mode 100644 index 0000000..15f3677 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi @@ -0,0 +1,7 @@ +from typing import Tuple + +def read_int4(data: bytes) -> Tuple[int, bytes]: ... +def read_bytes(data: bytes) -> Tuple[bytes, bytes]: ... +def read_string(data: bytes) -> Tuple[str, bytes]: ... +def check_padding(pad: bytes) -> None: ... +def import_openssh_private_generic(data: bytes, password: bytes) -> Tuple[str, bytes]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..88975a0b54fb017fcfaa3bef58ee9a595cfb713f GIT binary patch literal 79432 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 literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.py new file mode 100644 index 0000000..fd18d86 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# Random/__init__.py : PyCryptodome random number generation +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['new', 'get_random_bytes'] + +from os import urandom + +class _UrandomRNG(object): + + def read(self, n): + """Return a random byte string of the desired size.""" + return urandom(n) + + def flush(self): + """Method provided for backward compatibility only.""" + pass + + def reinit(self): + """Method provided for backward compatibility only.""" + pass + + def close(self): + """Method provided for backward compatibility only.""" + pass + + +def new(*args, **kwargs): + """Return a file-like object that outputs cryptographically random bytes.""" + return _UrandomRNG() + + +def atfork(): + pass + + +#: Function that returns a random byte string of the desired size. +get_random_bytes = urandom + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi b/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi new file mode 100644 index 0000000..ddc5b9b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi @@ -0,0 +1,19 @@ +from typing import Any + +__all__ = ['new', 'get_random_bytes'] + +from os import urandom + +class _UrandomRNG(object): + + def read(self, n: int) -> bytes:... + def flush(self) -> None: ... + def reinit(self) -> None: ... + def close(self) -> None: ... + +def new(*args: Any, **kwargs: Any) -> _UrandomRNG: ... + +def atfork() -> None: ... + +get_random_bytes = urandom + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Random/random.py b/python/lib/python3.11/site-packages/Cryptodome/Random/random.py new file mode 100644 index 0000000..da30795 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Random/random.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# +# Random/random.py : Strong alternative for the standard 'random' module +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample'] + +from Cryptodome import Random + +from Cryptodome.Util.py3compat import is_native_int + +class StrongRandom(object): + def __init__(self, rng=None, randfunc=None): + if randfunc is None and rng is None: + self._randfunc = None + elif randfunc is not None and rng is None: + self._randfunc = randfunc + elif randfunc is None and rng is not None: + self._randfunc = rng.read + else: + raise ValueError("Cannot specify both 'rng' and 'randfunc'") + + def getrandbits(self, k): + """Return an integer with k random bits.""" + + if self._randfunc is None: + self._randfunc = Random.new().read + mask = (1 << k) - 1 + return mask & bytes_to_long(self._randfunc(ceil_div(k, 8))) + + def randrange(self, *args): + """randrange([start,] stop[, step]): + Return a randomly-selected element from range(start, stop, step).""" + if len(args) == 3: + (start, stop, step) = args + elif len(args) == 2: + (start, stop) = args + step = 1 + elif len(args) == 1: + (stop,) = args + start = 0 + step = 1 + else: + raise TypeError("randrange expected at most 3 arguments, got %d" % (len(args),)) + if (not is_native_int(start) or not is_native_int(stop) or not + is_native_int(step)): + raise TypeError("randrange requires integer arguments") + if step == 0: + raise ValueError("randrange step argument must not be zero") + + num_choices = ceil_div(stop - start, step) + if num_choices < 0: + num_choices = 0 + if num_choices < 1: + raise ValueError("empty range for randrange(%r, %r, %r)" % (start, stop, step)) + + # Pick a random number in the range of possible numbers + r = num_choices + while r >= num_choices: + r = self.getrandbits(size(num_choices)) + + return start + (step * r) + + def randint(self, a, b): + """Return a random integer N such that a <= N <= b.""" + if not is_native_int(a) or not is_native_int(b): + raise TypeError("randint requires integer arguments") + N = self.randrange(a, b+1) + assert a <= N <= b + return N + + def choice(self, seq): + """Return a random element from a (non-empty) sequence. + + If the seqence is empty, raises IndexError. + """ + if len(seq) == 0: + raise IndexError("empty sequence") + return seq[self.randrange(len(seq))] + + def shuffle(self, x): + """Shuffle the sequence in place.""" + # Fisher-Yates shuffle. O(n) + # See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle + # Working backwards from the end of the array, we choose a random item + # from the remaining items until all items have been chosen. + for i in range(len(x)-1, 0, -1): # iterate from len(x)-1 downto 1 + j = self.randrange(0, i+1) # choose random j such that 0 <= j <= i + x[i], x[j] = x[j], x[i] # exchange x[i] and x[j] + + def sample(self, population, k): + """Return a k-length list of unique elements chosen from the population sequence.""" + + num_choices = len(population) + if k > num_choices: + raise ValueError("sample larger than population") + + retval = [] + selected = {} # we emulate a set using a dict here + for i in range(k): + r = None + while r is None or r in selected: + r = self.randrange(num_choices) + retval.append(population[r]) + selected[r] = 1 + return retval + +_r = StrongRandom() +getrandbits = _r.getrandbits +randrange = _r.randrange +randint = _r.randint +choice = _r.choice +shuffle = _r.shuffle +sample = _r.sample + +# These are at the bottom to avoid problems with recursive imports +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes, size + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/Random/random.pyi b/python/lib/python3.11/site-packages/Cryptodome/Random/random.pyi new file mode 100644 index 0000000..9b7cf7e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Random/random.pyi @@ -0,0 +1,22 @@ +from typing import Callable, Tuple, Union, Sequence, Any, Optional, TypeVar + +__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample'] + +T = TypeVar('T') + +class StrongRandom(object): + def __init__(self, rng: Optional[Any]=None, randfunc: Optional[Callable]=None) -> None: ... # TODO What is rng? + def getrandbits(self, k: int) -> int: ... + def randrange(self, start: int, stop: int = ..., step: int = ...) -> int: ... + def randint(self, a: int, b: int) -> int: ... + def choice(self, seq: Sequence[T]) -> T: ... + def shuffle(self, x: Sequence) -> None: ... + def sample(self, population: Sequence, k: int) -> list: ... + +_r = StrongRandom() +getrandbits = _r.getrandbits +randrange = _r.randrange +randint = _r.randint +choice = _r.choice +shuffle = _r.shuffle +sample = _r.sample diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py new file mode 100644 index 0000000..330fa22 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/__init__.py: Self-test for cipher modules +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for cipher modules""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Cipher import test_AES; tests += test_AES.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ARC2; tests += test_ARC2.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ARC4; tests += test_ARC4.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_Blowfish; tests += test_Blowfish.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CAST; tests += test_CAST.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_DES3; tests += test_DES3.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_DES; tests += test_DES.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_Salsa20; tests += test_Salsa20.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ChaCha20; tests += test_ChaCha20.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ChaCha20_Poly1305; tests += test_ChaCha20_Poly1305.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_pkcs1_15; tests += test_pkcs1_15.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_pkcs1_oaep; tests += test_pkcs1_oaep.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OCB; tests += test_OCB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CBC; tests += test_CBC.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CFB; tests += test_CFB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OpenPGP; tests += test_OpenPGP.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OFB; tests += test_OFB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CTR; tests += test_CTR.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CCM; tests += test_CCM.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_EAX; tests += test_EAX.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_GCM; tests += test_GCM.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_SIV; tests += test_SIV.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py new file mode 100644 index 0000000..a13d4fb --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py @@ -0,0 +1,510 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/common.py: Common code for Cryptodome.SelfTest.Hash +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-testing for PyCryptodome hash modules""" + +import unittest +from binascii import a2b_hex, b2a_hex, hexlify + +from Cryptodome.Util.py3compat import b +from Cryptodome.Util.strxor import strxor_c + +class _NoDefault: pass # sentinel object +def _extract(d, k, default=_NoDefault): + """Get an item from a dictionary, and remove it from the dictionary.""" + try: + retval = d[k] + except KeyError: + if default is _NoDefault: + raise + return default + del d[k] + return retval + +# Generic cipher test case +class CipherSelfTest(unittest.TestCase): + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def shortDescription(self): + return self.description + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def isMode(self, name): + if not hasattr(self.module, "MODE_"+name): + return False + return self.mode == getattr(self.module, "MODE_"+name) + + def runTest(self): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ a2b_hex(b(x)) for x in self.assoc_data] + + ct = None + pt = None + + # + # Repeat the same encryption or decryption twice and verify + # that the result is always the same + # + for i in range(2): + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ctX = b2a_hex(cipher.encrypt(plaintext)) + ptX = b2a_hex(decipher.decrypt(ciphertext)) + + if ct: + self.assertEqual(ct, ctX) + self.assertEqual(pt, ptX) + ct, pt = ctX, ptX + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(a2b_hex(self.mac)) + +class CipherStreamingSelfTest(CipherSelfTest): + + def shortDescription(self): + desc = self.module_name + if self.mode is not None: + desc += " in %s mode" % (self.mode_name,) + return "%s should behave like a stream cipher" % (desc,) + + def runTest(self): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + + # The cipher should work like a stream cipher + + # Test counter mode encryption, 3 bytes at a time + ct3 = [] + cipher = self._new() + for i in range(0, len(plaintext), 3): + ct3.append(cipher.encrypt(plaintext[i:i+3])) + ct3 = b2a_hex(b("").join(ct3)) + self.assertEqual(self.ciphertext, ct3) # encryption (3 bytes at a time) + + # Test counter mode decryption, 3 bytes at a time + pt3 = [] + cipher = self._new() + for i in range(0, len(ciphertext), 3): + pt3.append(cipher.encrypt(ciphertext[i:i+3])) + # PY3K: This is meant to be text, do not change to bytes (data) + pt3 = b2a_hex(b("").join(pt3)) + self.assertEqual(self.plaintext, pt3) # decryption (3 bytes at a time) + + +class RoundtripTest(unittest.TestCase): + def __init__(self, module, params): + from Cryptodome import Random + unittest.TestCase.__init__(self) + self.module = module + self.iv = Random.get_random_bytes(module.block_size) + self.key = b(params['key']) + self.plaintext = 100 * b(params['plaintext']) + self.module_name = params.get('module_name', None) + + def shortDescription(self): + return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,) + + def runTest(self): + + ## ECB mode + mode = self.module.MODE_ECB + encryption_cipher = self.module.new(a2b_hex(self.key), mode) + ciphertext = encryption_cipher.encrypt(self.plaintext) + decryption_cipher = self.module.new(a2b_hex(self.key), mode) + decrypted_plaintext = decryption_cipher.decrypt(ciphertext) + self.assertEqual(self.plaintext, decrypted_plaintext) + + +class IVLengthTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = b(params['key']) + + def shortDescription(self): + return "Check that all modes except MODE_ECB and MODE_CTR require an IV of the proper length" + + def runTest(self): + self.assertRaises(TypeError, self.module.new, a2b_hex(self.key), + self.module.MODE_ECB, b("")) + + def _dummy_counter(self): + return "\0" * self.module.block_size + + +class NoDefaultECBTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = b(params['key']) + + def runTest(self): + self.assertRaises(TypeError, self.module.new, a2b_hex(self.key)) + + +class BlockSizeTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = a2b_hex(b(params['key'])) + + def runTest(self): + cipher = self.module.new(self.key, self.module.MODE_ECB) + self.assertEqual(cipher.block_size, self.module.block_size) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can use bytearray's for encrypting and decrypting""" + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def runTest(self): + + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ bytearray(a2b_hex(b(x))) for x in self.assoc_data] + + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ct = b2a_hex(cipher.encrypt(bytearray(plaintext))) + pt = b2a_hex(decipher.decrypt(bytearray(ciphertext))) + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(bytearray(a2b_hex(self.mac))) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can use memoryviews for encrypting and decrypting""" + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def runTest(self): + + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ memoryview(a2b_hex(b(x))) for x in self.assoc_data] + + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ct = b2a_hex(cipher.encrypt(memoryview(plaintext))) + pt = b2a_hex(decipher.decrypt(memoryview(ciphertext))) + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(memoryview(a2b_hex(self.mac))) + + +def make_block_tests(module, module_name, test_data, additional_params=dict()): + tests = [] + extra_tests_added = False + for i in range(len(test_data)): + row = test_data[i] + + # Build the "params" dictionary with + # - plaintext + # - ciphertext + # - key + # - mode (default is ECB) + # - (optionally) description + # - (optionally) any other parameter that this cipher mode requires + params = {} + if len(row) == 3: + (params['plaintext'], params['ciphertext'], params['key']) = row + elif len(row) == 4: + (params['plaintext'], params['ciphertext'], params['key'], params['description']) = row + elif len(row) == 5: + (params['plaintext'], params['ciphertext'], params['key'], params['description'], extra_params) = row + params.update(extra_params) + else: + raise AssertionError("Unsupported tuple size %d" % (len(row),)) + + if not "mode" in params: + params["mode"] = "ECB" + + # Build the display-name for the test + p2 = params.copy() + p_key = _extract(p2, 'key') + p_plaintext = _extract(p2, 'plaintext') + p_ciphertext = _extract(p2, 'ciphertext') + p_mode = _extract(p2, 'mode') + p_description = _extract(p2, 'description', None) + + if p_description is not None: + description = p_description + elif p_mode == 'ECB' and not p2: + description = "p=%s, k=%s" % (p_plaintext, p_key) + else: + description = "p=%s, k=%s, %r" % (p_plaintext, p_key, p2) + name = "%s #%d: %s" % (module_name, i+1, description) + params['description'] = name + params['module_name'] = module_name + params.update(additional_params) + + # Add extra test(s) to the test suite before the current test + if not extra_tests_added: + tests += [ + RoundtripTest(module, params), + IVLengthTest(module, params), + NoDefaultECBTest(module, params), + ByteArrayTest(module, params), + BlockSizeTest(module, params), + ] + extra_tests_added = True + + # Add the current test to the test suite + tests.append(CipherSelfTest(module, params)) + + return tests + +def make_stream_tests(module, module_name, test_data): + tests = [] + extra_tests_added = False + for i in range(len(test_data)): + row = test_data[i] + + # Build the "params" dictionary + params = {} + if len(row) == 3: + (params['plaintext'], params['ciphertext'], params['key']) = row + elif len(row) == 4: + (params['plaintext'], params['ciphertext'], params['key'], params['description']) = row + elif len(row) == 5: + (params['plaintext'], params['ciphertext'], params['key'], params['description'], extra_params) = row + params.update(extra_params) + else: + raise AssertionError("Unsupported tuple size %d" % (len(row),)) + + # Build the display-name for the test + p2 = params.copy() + p_key = _extract(p2, 'key') + p_plaintext = _extract(p2, 'plaintext') + p_ciphertext = _extract(p2, 'ciphertext') + p_description = _extract(p2, 'description', None) + + if p_description is not None: + description = p_description + elif not p2: + description = "p=%s, k=%s" % (p_plaintext, p_key) + else: + description = "p=%s, k=%s, %r" % (p_plaintext, p_key, p2) + name = "%s #%d: %s" % (module_name, i+1, description) + params['description'] = name + params['module_name'] = module_name + + # Add extra test(s) to the test suite before the current test + if not extra_tests_added: + tests += [ + ByteArrayTest(module, params), + ] + + tests.append(MemoryviewTest(module, params)) + extra_tests_added = True + + # Add the test to the test suite + tests.append(CipherSelfTest(module, params)) + tests.append(CipherStreamingSelfTest(module, params)) + return tests + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py new file mode 100644 index 0000000..bd6c40e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py @@ -0,0 +1,1351 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/AES.py: Self-test for the AES cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.AES""" + +from __future__ import print_function + +import unittest +from Cryptodome.Hash import SHA256 +from Cryptodome.Cipher import AES +from Cryptodome.Util.py3compat import * +from binascii import hexlify + +# This is a list of (plaintext, ciphertext, key[, description[, params]]) tuples. +test_data = [ + # FIPS PUB 197 test vectors + # http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + + ('00112233445566778899aabbccddeeff', '69c4e0d86a7b0430d8cdb78070b4c55a', + '000102030405060708090a0b0c0d0e0f', 'FIPS 197 C.1 (AES-128)'), + + ('00112233445566778899aabbccddeeff', 'dda97ca4864cdfe06eaf70a0ec0d7191', + '000102030405060708090a0b0c0d0e0f1011121314151617', + 'FIPS 197 C.2 (AES-192)'), + + ('00112233445566778899aabbccddeeff', '8ea2b7ca516745bfeafc49904b496089', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'FIPS 197 C.3 (AES-256)'), + + # Rijndael128 test vectors + # Downloaded 2008-09-13 from + # http://www.iaik.tugraz.at/Research/krypto/AES/old/~rijmen/rijndael/testvalues.tar.gz + + # ecb_tbl.txt, KEYSIZE=128 + ('506812a45f08c889b97f5980038b8359', 'd8f532538289ef7d06b506a4fd5be9c9', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=1'), + ('5c6d71ca30de8b8b00549984d2ec7d4b', '59ab30f4d4ee6e4ff9907ef65b1fb68c', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=2'), + ('53f3f4c64f8616e4e7c56199f48f21f6', 'bf1ed2fcb2af3fd41443b56d85025cb1', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=3'), + ('a1eb65a3487165fb0f1c27ff9959f703', '7316632d5c32233edcb0780560eae8b2', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=4'), + ('3553ecf0b1739558b08e350a98a39bfa', '408c073e3e2538072b72625e68b8364b', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=5'), + ('67429969490b9711ae2b01dc497afde8', 'e1f94dfa776597beaca262f2f6366fea', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=6'), + ('93385c1f2aec8bed192f5a8e161dd508', 'f29e986c6a1c27d7b29ffd7ee92b75f1', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=7'), + ('b5bf946be19beb8db3983b5f4c6e8ddb', '131c886a57f8c2e713aba6955e2b55b5', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=8'), + ('41321ee10e21bd907227c4450ff42324', 'd2ab7662df9b8c740210e5eeb61c199d', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=9'), + ('00a82f59c91c8486d12c0a80124f6089', '14c10554b2859c484cab5869bbe7c470', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-128: I=10'), + ('7ce0fd076754691b4bbd9faf8a1372fe', 'db4d498f0a49cf55445d502c1f9ab3b5', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-128: I=11'), + ('23605a8243d07764541bc5ad355b3129', '6d96fef7d66590a77a77bb2056667f7f', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-128: I=12'), + ('12a8cfa23ea764fd876232b4e842bc44', '316fb68edba736c53e78477bf913725c', + 'f0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-128: I=13'), + ('bcaf32415e8308b3723e5fdd853ccc80', '6936f2b93af8397fd3a771fc011c8c37', + '04050607090a0b0c0e0f101113141516', + 'ecb-tbl-128: I=14'), + ('89afae685d801ad747ace91fc49adde0', 'f3f92f7a9c59179c1fcc2c2ba0b082cd', + '2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-128: I=15'), + ('f521d07b484357c4a69e76124a634216', '6a95ea659ee3889158e7a9152ff04ebc', + '40414243454647484a4b4c4d4f505152', + 'ecb-tbl-128: I=16'), + ('3e23b3bc065bcc152407e23896d77783', '1959338344e945670678a5d432c90b93', + '54555657595a5b5c5e5f606163646566', + 'ecb-tbl-128: I=17'), + ('79f0fba002be1744670e7e99290d8f52', 'e49bddd2369b83ee66e6c75a1161b394', + '68696a6b6d6e6f70727374757778797a', + 'ecb-tbl-128: I=18'), + ('da23fe9d5bd63e1d72e3dafbe21a6c2a', 'd3388f19057ff704b70784164a74867d', + '7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-128: I=19'), + ('e3f5698ba90b6a022efd7db2c7e6c823', '23aa03e2d5e4cd24f3217e596480d1e1', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-128: I=20'), + ('bdc2691d4f1b73d2700679c3bcbf9c6e', 'c84113d68b666ab2a50a8bdb222e91b9', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-128: I=21'), + ('ba74e02093217ee1ba1b42bd5624349a', 'ac02403981cd4340b507963db65cb7b6', + '08090a0b0d0e0f10121314151718191a', + 'ecb-tbl-128: I=22'), + ('b5c593b5851c57fbf8b3f57715e8f680', '8d1299236223359474011f6bf5088414', + '6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-128: I=23'), + ('3da9bd9cec072381788f9387c3bbf4ee', '5a1d6ab8605505f7977e55b9a54d9b90', + '80818283858687888a8b8c8d8f909192', + 'ecb-tbl-128: I=24'), + ('4197f3051121702ab65d316b3c637374', '72e9c2d519cf555e4208805aabe3b258', + '94959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-128: I=25'), + ('9f46c62ec4f6ee3f6e8c62554bc48ab7', 'a8f3e81c4a23a39ef4d745dffe026e80', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-128: I=26'), + ('0220673fe9e699a4ebc8e0dbeb6979c8', '546f646449d31458f9eb4ef5483aee6c', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-128: I=27'), + ('b2b99171337ded9bc8c2c23ff6f18867', '4dbe4bc84ac797c0ee4efb7f1a07401c', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-128: I=28'), + ('a7facf4e301e984e5efeefd645b23505', '25e10bfb411bbd4d625ac8795c8ca3b3', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-128: I=29'), + ('f7c762e4a9819160fd7acfb6c4eedcdd', '315637405054ec803614e43def177579', + 'f8f9fafbfdfefe00020304050708090a', + 'ecb-tbl-128: I=30'), + ('9b64fc21ea08709f4915436faa70f1be', '60c5bc8a1410247295c6386c59e572a8', + '0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-128: I=31'), + ('52af2c3de07ee6777f55a4abfc100b3f', '01366fc8ca52dfe055d6a00a76471ba6', + '20212223252627282a2b2c2d2f303132', + 'ecb-tbl-128: I=32'), + ('2fca001224386c57aa3f968cbe2c816f', 'ecc46595516ec612449c3f581e7d42ff', + '34353637393a3b3c3e3f404143444546', + 'ecb-tbl-128: I=33'), + ('4149c73658a4a9c564342755ee2c132f', '6b7ffe4c602a154b06ee9c7dab5331c9', + '48494a4b4d4e4f50525354555758595a', + 'ecb-tbl-128: I=34'), + ('af60005a00a1772f7c07a48a923c23d2', '7da234c14039a240dd02dd0fbf84eb67', + '5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-128: I=35'), + ('6fccbc28363759914b6f0280afaf20c6', 'c7dc217d9e3604ffe7e91f080ecd5a3a', + '70717273757677787a7b7c7d7f808182', + 'ecb-tbl-128: I=36'), + ('7d82a43ddf4fefa2fc5947499884d386', '37785901863f5c81260ea41e7580cda5', + '84858687898a8b8c8e8f909193949596', + 'ecb-tbl-128: I=37'), + ('5d5a990eaab9093afe4ce254dfa49ef9', 'a07b9338e92ed105e6ad720fccce9fe4', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-128: I=38'), + ('4cd1e2fd3f4434b553aae453f0ed1a02', 'ae0fb9722418cc21a7da816bbc61322c', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-128: I=39'), + ('5a2c9a9641d4299125fa1b9363104b5e', 'c826a193080ff91ffb21f71d3373c877', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-128: I=40'), + ('b517fe34c0fa217d341740bfd4fe8dd4', '1181b11b0e494e8d8b0aa6b1d5ac2c48', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-128: I=41'), + ('014baf2278a69d331d5180103643e99a', '6743c3d1519ab4f2cd9a78ab09a511bd', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fa', + 'ecb-tbl-128: I=42'), + ('b529bd8164f20d0aa443d4932116841c', 'dc55c076d52bacdf2eefd952946a439d', + 'fcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-128: I=43'), + ('2e596dcbb2f33d4216a1176d5bd1e456', '711b17b590ffc72b5c8e342b601e8003', + '10111213151617181a1b1c1d1f202122', + 'ecb-tbl-128: I=44'), + ('7274a1ea2b7ee2424e9a0e4673689143', '19983bb0950783a537e1339f4aa21c75', + '24252627292a2b2c2e2f303133343536', + 'ecb-tbl-128: I=45'), + ('ae20020bd4f13e9d90140bee3b5d26af', '3ba7762e15554169c0f4fa39164c410c', + '38393a3b3d3e3f40424344454748494a', + 'ecb-tbl-128: I=46'), + ('baac065da7ac26e855e79c8849d75a02', 'a0564c41245afca7af8aa2e0e588ea89', + '4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-128: I=47'), + ('7c917d8d1d45fab9e2540e28832540cc', '5e36a42a2e099f54ae85ecd92e2381ed', + '60616263656667686a6b6c6d6f707172', + 'ecb-tbl-128: I=48'), + ('bde6f89e16daadb0e847a2a614566a91', '770036f878cd0f6ca2268172f106f2fe', + '74757677797a7b7c7e7f808183848586', + 'ecb-tbl-128: I=49'), + ('c9de163725f1f5be44ebb1db51d07fbc', '7e4e03908b716116443ccf7c94e7c259', + '88898a8b8d8e8f90929394959798999a', + 'ecb-tbl-128: I=50'), + ('3af57a58f0c07dffa669572b521e2b92', '482735a48c30613a242dd494c7f9185d', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-128: I=51'), + ('3d5ebac306dde4604f1b4fbbbfcdae55', 'b4c0f6c9d4d7079addf9369fc081061d', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-128: I=52'), + ('c2dfa91bceb76a1183c995020ac0b556', 'd5810fe0509ac53edcd74f89962e6270', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-128: I=53'), + ('c70f54305885e9a0746d01ec56c8596b', '03f17a16b3f91848269ecdd38ebb2165', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9ea', + 'ecb-tbl-128: I=54'), + ('c4f81b610e98012ce000182050c0c2b2', 'da1248c3180348bad4a93b4d9856c9df', + 'ecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-128: I=55'), + ('eaab86b1d02a95d7404eff67489f97d4', '3d10d7b63f3452c06cdf6cce18be0c2c', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=56'), + ('7c55bdb40b88870b52bec3738de82886', '4ab823e7477dfddc0e6789018fcb6258', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=57'), + ('ba6eaa88371ff0a3bd875e3f2a975ce0', 'e6478ba56a77e70cfdaa5c843abde30e', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=58'), + ('08059130c4c24bd30cf0575e4e0373dc', '1673064895fbeaf7f09c5429ff75772d', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=59'), + ('9a8eab004ef53093dfcf96f57e7eda82', '4488033ae9f2efd0ca9383bfca1a94e9', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=60'), + ('0745b589e2400c25f117b1d796c28129', '978f3b8c8f9d6f46626cac3c0bcb9217', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=61'), + ('2f1777781216cec3f044f134b1b92bbe', 'e08c8a7e582e15e5527f1d9e2eecb236', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=62'), + ('353a779ffc541b3a3805d90ce17580fc', 'cec155b76ac5ffda4cf4f9ca91e49a7a', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=63'), + ('1a1eae4415cefcf08c4ac1c8f68bea8f', 'd5ac7165763225dd2a38cdc6862c29ad', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=64'), + ('e6e7e4e5b0b3b2b5d4d5aaab16111013', '03680fe19f7ce7275452020be70e8204', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-128: I=65'), + ('f8f9fafbfbf8f9e677767170efe0e1e2', '461df740c9781c388e94bb861ceb54f6', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-128: I=66'), + ('63626160a1a2a3a445444b4a75727370', '451bd60367f96483042742219786a074', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-128: I=67'), + ('717073720605040b2d2c2b2a05fafbf9', 'e4dfa42671a02e57ef173b85c0ea9f2b', + 'f0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-128: I=68'), + ('78797a7beae9e8ef3736292891969794', 'ed11b89e76274282227d854700a78b9e', + '04050607090a0b0c0e0f101113141516', + 'ecb-tbl-128: I=69'), + ('838281803231300fdddcdbdaa0afaead', '433946eaa51ea47af33895f2b90b3b75', + '18191a1b1d1e1f20222324252728292a', + 'ecb-tbl-128: I=70'), + ('18191a1bbfbcbdba75747b7a7f78797a', '6bc6d616a5d7d0284a5910ab35022528', + '2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-128: I=71'), + ('848586879b989996a3a2a5a4849b9a99', 'd2a920ecfe919d354b5f49eae9719c98', + '40414243454647484a4b4c4d4f505152', + 'ecb-tbl-128: I=72'), + ('0001020322212027cacbf4f551565754', '3a061b17f6a92885efbd0676985b373d', + '54555657595a5b5c5e5f606163646566', + 'ecb-tbl-128: I=73'), + ('cecfcccdafacadb2515057564a454447', 'fadeec16e33ea2f4688499d157e20d8f', + '68696a6b6d6e6f70727374757778797a', + 'ecb-tbl-128: I=74'), + ('92939091cdcecfc813121d1c80878685', '5cdefede59601aa3c3cda36fa6b1fa13', + '7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-128: I=75'), + ('d2d3d0d16f6c6d6259585f5ed1eeefec', '9574b00039844d92ebba7ee8719265f8', + '90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-128: I=76'), + ('acadaeaf878485820f0e1110d5d2d3d0', '9a9cf33758671787e5006928188643fa', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-128: I=77'), + ('9091929364676619e6e7e0e1757a7b78', '2cddd634c846ba66bb46cbfea4a674f9', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9ca', + 'ecb-tbl-128: I=78'), + ('babbb8b98a89888f74757a7b92959497', 'd28bae029393c3e7e26e9fafbbb4b98f', + 'cccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-128: I=79'), + ('8d8c8f8e6e6d6c633b3a3d3ccad5d4d7', 'ec27529b1bee0a9ab6a0d73ebc82e9b7', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-128: I=80'), + ('86878485010203040808f7f767606162', '3cb25c09472aff6ee7e2b47ccd7ccb17', + 'f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-128: I=81'), + ('8e8f8c8d656667788a8b8c8d010e0f0c', 'dee33103a7283370d725e44ca38f8fe5', + '08090a0b0d0e0f10121314151718191a', + 'ecb-tbl-128: I=82'), + ('c8c9cacb858687807a7b7475e7e0e1e2', '27f9bcd1aac64bffc11e7815702c1a69', + '1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-128: I=83'), + ('6d6c6f6e5053525d8c8d8a8badd2d3d0', '5df534ffad4ed0749a9988e9849d0021', + '30313233353637383a3b3c3d3f404142', + 'ecb-tbl-128: I=84'), + ('28292a2b393a3b3c0607181903040506', 'a48bee75db04fb60ca2b80f752a8421b', + '44454647494a4b4c4e4f505153545556', + 'ecb-tbl-128: I=85'), + ('a5a4a7a6b0b3b28ddbdadddcbdb2b3b0', '024c8cf70bc86ee5ce03678cb7af45f9', + '58595a5b5d5e5f60626364656768696a', + 'ecb-tbl-128: I=86'), + ('323330316467666130313e3f2c2b2a29', '3c19ac0f8a3a3862ce577831301e166b', + '6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-128: I=87'), + ('27262524080b0a05171611100b141516', 'c5e355b796a57421d59ca6be82e73bca', + '80818283858687888a8b8c8d8f909192', + 'ecb-tbl-128: I=88'), + ('040506074142434435340b0aa3a4a5a6', 'd94033276417abfb05a69d15b6e386e2', + '94959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-128: I=89'), + ('242526271112130c61606766bdb2b3b0', '24b36559ea3a9b9b958fe6da3e5b8d85', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-128: I=90'), + ('4b4a4948252627209e9f9091cec9c8cb', '20fd4feaa0e8bf0cce7861d74ef4cb72', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-128: I=91'), + ('68696a6b6665646b9f9e9998d9e6e7e4', '350e20d5174277b9ec314c501570a11d', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-128: I=92'), + ('34353637c5c6c7c0f0f1eeef7c7b7a79', '87a29d61b7c604d238fe73045a7efd57', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-128: I=93'), + ('32333031c2c1c13f0d0c0b0a050a0b08', '2c3164c1cc7d0064816bdc0faa362c52', + 'f8f9fafbfdfefe00020304050708090a', + 'ecb-tbl-128: I=94'), + ('cdcccfcebebdbcbbabaaa5a4181f1e1d', '195fe5e8a05a2ed594f6e4400eee10b3', + '0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-128: I=95'), + ('212023223635343ba0a1a6a7445b5a59', 'e4663df19b9a21a5a284c2bd7f905025', + '20212223252627282a2b2c2d2f303132', + 'ecb-tbl-128: I=96'), + ('0e0f0c0da8abaaad2f2e515002050407', '21b88714cfb4e2a933bd281a2c4743fd', + '34353637393a3b3c3e3f404143444546', + 'ecb-tbl-128: I=97'), + ('070605042a2928378e8f8889bdb2b3b0', 'cbfc3980d704fd0fc54378ab84e17870', + '48494a4b4d4e4f50525354555758595a', + 'ecb-tbl-128: I=98'), + ('cbcac9c893909196a9a8a7a6a5a2a3a0', 'bc5144baa48bdeb8b63e22e03da418ef', + '5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-128: I=99'), + ('80818283c1c2c3cc9c9d9a9b0cf3f2f1', '5a1dbaef1ee2984b8395da3bdffa3ccc', + '70717273757677787a7b7c7d7f808182', + 'ecb-tbl-128: I=100'), + ('1213101125262720fafbe4e5b1b6b7b4', 'f0b11cd0729dfcc80cec903d97159574', + '84858687898a8b8c8e8f909193949596', + 'ecb-tbl-128: I=101'), + ('7f7e7d7c3033320d97969190222d2c2f', '9f95314acfddc6d1914b7f19a9cc8209', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-128: I=102'), + ('4e4f4c4d484b4a4d81808f8e53545556', '595736f6f0f70914a94e9e007f022519', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-128: I=103'), + ('dcdddedfb0b3b2bd15141312a1bebfbc', '1f19f57892cae586fcdfb4c694deb183', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-128: I=104'), + ('93929190282b2a2dc4c5fafb92959497', '540700ee1f6f3dab0b3eddf6caee1ef5', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-128: I=105'), + ('f5f4f7f6c4c7c6d9373631307e717073', '14a342a91019a331687a2254e6626ca2', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fa', + 'ecb-tbl-128: I=106'), + ('93929190b6b5b4b364656a6b05020300', '7b25f3c3b2eea18d743ef283140f29ff', + 'fcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-128: I=107'), + ('babbb8b90d0e0f00a4a5a2a3043b3a39', '46c2587d66e5e6fa7f7ca6411ad28047', + '10111213151617181a1b1c1d1f202122', + 'ecb-tbl-128: I=108'), + ('d8d9dadb7f7c7d7a10110e0f787f7e7d', '09470e72229d954ed5ee73886dfeeba9', + '24252627292a2b2c2e2f303133343536', + 'ecb-tbl-128: I=109'), + ('fefffcfdefeced923b3a3d3c6768696a', 'd77c03de92d4d0d79ef8d4824ef365eb', + '38393a3b3d3e3f40424344454748494a', + 'ecb-tbl-128: I=110'), + ('d6d7d4d58a89888f96979899a5a2a3a0', '1d190219f290e0f1715d152d41a23593', + '4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-128: I=111'), + ('18191a1ba8abaaa5303136379b848586', 'a2cd332ce3a0818769616292e87f757b', + '60616263656667686a6b6c6d6f707172', + 'ecb-tbl-128: I=112'), + ('6b6a6968a4a7a6a1d6d72829b0b7b6b5', 'd54afa6ce60fbf9341a3690e21385102', + '74757677797a7b7c7e7f808183848586', + 'ecb-tbl-128: I=113'), + ('000102038a89889755545352a6a9a8ab', '06e5c364ded628a3f5e05e613e356f46', + '88898a8b8d8e8f90929394959798999a', + 'ecb-tbl-128: I=114'), + ('2d2c2f2eb3b0b1b6b6b7b8b9f2f5f4f7', 'eae63c0e62556dac85d221099896355a', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-128: I=115'), + ('979695943536373856575051e09f9e9d', '1fed060e2c6fc93ee764403a889985a2', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-128: I=116'), + ('a4a5a6a7989b9a9db1b0afae7a7d7c7f', 'c25235c1a30fdec1c7cb5c5737b2a588', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-128: I=117'), + ('c1c0c3c2686b6a55a8a9aeafeae5e4e7', '796dbef95147d4d30873ad8b7b92efc0', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9ea', + 'ecb-tbl-128: I=118'), + ('c1c0c3c2141716118c8d828364636261', 'cbcf0fb34d98d0bd5c22ce37211a46bf', + 'ecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-128: I=119'), + ('93929190cccfcec196979091e0fffefd', '94b44da6466126cafa7c7fd09063fc24', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=120'), + ('b4b5b6b7f9fafbfc25241b1a6e69686b', 'd78c5b5ebf9b4dbda6ae506c5074c8fe', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=121'), + ('868784850704051ac7c6c1c08788898a', '6c27444c27204b043812cf8cf95f9769', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=122'), + ('f4f5f6f7aaa9a8affdfcf3f277707172', 'be94524ee5a2aa50bba8b75f4c0aebcf', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=123'), + ('d3d2d1d00605040bc3c2c5c43e010003', 'a0aeaae91ba9f31f51aeb3588cf3a39e', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=124'), + ('73727170424140476a6b74750d0a0b08', '275297779c28266ef9fe4c6a13c08488', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=125'), + ('c2c3c0c10a0908f754555253a1aeafac', '86523d92bb8672cb01cf4a77fd725882', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=126'), + ('6d6c6f6ef8fbfafd82838c8df8fffefd', '4b8327640e9f33322a04dd96fcbf9a36', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=127'), + ('f5f4f7f684878689a6a7a0a1d2cdcccf', 'ce52af650d088ca559425223f4d32694', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=128'), + + # ecb_tbl.txt, KEYSIZE=192 + ('2d33eef2c0430a8a9ebf45e809c40bb6', 'dff4945e0336df4c1c56bc700eff837f', + '00010203050607080a0b0c0d0f10111214151617191a1b1c', + 'ecb-tbl-192: I=1'), + ('6aa375d1fa155a61fb72353e0a5a8756', 'b6fddef4752765e347d5d2dc196d1252', + '1e1f20212324252628292a2b2d2e2f30323334353738393a', + 'ecb-tbl-192: I=2'), + ('bc3736518b9490dcb8ed60eb26758ed4', 'd23684e3d963b3afcf1a114aca90cbd6', + '3c3d3e3f41424344464748494b4c4d4e5051525355565758', + 'ecb-tbl-192: I=3'), + ('aa214402b46cffb9f761ec11263a311e', '3a7ac027753e2a18c2ceab9e17c11fd0', + '5a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-192: I=4'), + ('02aea86e572eeab66b2c3af5e9a46fd6', '8f6786bd007528ba26603c1601cdd0d8', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394', + 'ecb-tbl-192: I=5'), + ('e2aef6acc33b965c4fa1f91c75ff6f36', 'd17d073b01e71502e28b47ab551168b3', + '969798999b9c9d9ea0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-192: I=6'), + ('0659df46427162b9434865dd9499f91d', 'a469da517119fab95876f41d06d40ffa', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6c8c9cacbcdcecfd0', + 'ecb-tbl-192: I=7'), + ('49a44239c748feb456f59c276a5658df', '6091aa3b695c11f5c0b6ad26d3d862ff', + 'd2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-192: I=8'), + ('66208f6e9d04525bdedb2733b6a6be37', '70f9e67f9f8df1294131662dc6e69364', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c', + 'ecb-tbl-192: I=9'), + ('3393f8dfc729c97f5480b950bc9666b0', 'd154dcafad8b207fa5cbc95e9996b559', + '0e0f10111314151618191a1b1d1e1f20222324252728292a', + 'ecb-tbl-192: I=10'), + ('606834c8ce063f3234cf1145325dbd71', '4934d541e8b46fa339c805a7aeb9e5da', + '2c2d2e2f31323334363738393b3c3d3e4041424345464748', + 'ecb-tbl-192: I=11'), + ('fec1c04f529bbd17d8cecfcc4718b17f', '62564c738f3efe186e1a127a0c4d3c61', + '4a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-192: I=12'), + ('32df99b431ed5dc5acf8caf6dc6ce475', '07805aa043986eb23693e23bef8f3438', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384', + 'ecb-tbl-192: I=13'), + ('7fdc2b746f3f665296943b83710d1f82', 'df0b4931038bade848dee3b4b85aa44b', + '868788898b8c8d8e90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-192: I=14'), + ('8fba1510a3c5b87e2eaa3f7a91455ca2', '592d5fded76582e4143c65099309477c', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6b8b9babbbdbebfc0', + 'ecb-tbl-192: I=15'), + ('2c9b468b1c2eed92578d41b0716b223b', 'c9b8d6545580d3dfbcdd09b954ed4e92', + 'c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-192: I=16'), + ('0a2bbf0efc6bc0034f8a03433fca1b1a', '5dccd5d6eb7c1b42acb008201df707a0', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfc', + 'ecb-tbl-192: I=17'), + ('25260e1f31f4104d387222e70632504b', 'a2a91682ffeb6ed1d34340946829e6f9', + 'fefe01010304050608090a0b0d0e0f10121314151718191a', + 'ecb-tbl-192: I=18'), + ('c527d25a49f08a5228d338642ae65137', 'e45d185b797000348d9267960a68435d', + '1c1d1e1f21222324262728292b2c2d2e3031323335363738', + 'ecb-tbl-192: I=19'), + ('3b49fc081432f5890d0e3d87e884a69e', '45e060dae5901cda8089e10d4f4c246b', + '3a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-192: I=20'), + ('d173f9ed1e57597e166931df2754a083', 'f6951afacc0079a369c71fdcff45df50', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374', + 'ecb-tbl-192: I=21'), + ('8c2b7cafa5afe7f13562daeae1adede0', '9e95e00f351d5b3ac3d0e22e626ddad6', + '767778797b7c7d7e80818283858687888a8b8c8d8f909192', + 'ecb-tbl-192: I=22'), + ('aaf4ec8c1a815aeb826cab741339532c', '9cb566ff26d92dad083b51fdc18c173c', + '94959697999a9b9c9e9fa0a1a3a4a5a6a8a9aaabadaeafb0', + 'ecb-tbl-192: I=23'), + ('40be8c5d9108e663f38f1a2395279ecf', 'c9c82766176a9b228eb9a974a010b4fb', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebec', + 'ecb-tbl-192: I=24'), + ('0c8ad9bc32d43e04716753aa4cfbe351', 'd8e26aa02945881d5137f1c1e1386e88', + '2a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-192: I=25'), + ('1407b1d5f87d63357c8dc7ebbaebbfee', 'c0e024ccd68ff5ffa4d139c355a77c55', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364', + 'ecb-tbl-192: I=26'), + ('e62734d1ae3378c4549e939e6f123416', '0b18b3d16f491619da338640df391d43', + '84858687898a8b8c8e8f90919394959698999a9b9d9e9fa0', + 'ecb-tbl-192: I=27'), + ('5a752cff2a176db1a1de77f2d2cdee41', 'dbe09ac8f66027bf20cb6e434f252efc', + 'a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-192: I=28'), + ('a9c8c3a4eabedc80c64730ddd018cd88', '6d04e5e43c5b9cbe05feb9606b6480fe', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdc', + 'ecb-tbl-192: I=29'), + ('ee9b3dbbdb86180072130834d305999a', 'dd1d6553b96be526d9fee0fbd7176866', + '1a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-192: I=30'), + ('a7fa8c3586b8ebde7568ead6f634a879', '0260ca7e3f979fd015b0dd4690e16d2a', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354', + 'ecb-tbl-192: I=31'), + ('37e0f4a87f127d45ac936fe7ad88c10a', '9893734de10edcc8a67c3b110b8b8cc6', + '929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-192: I=32'), + ('3f77d8b5d92bac148e4e46f697a535c5', '93b30b750516b2d18808d710c2ee84ef', + '464748494b4c4d4e50515253555657585a5b5c5d5f606162', + 'ecb-tbl-192: I=33'), + ('d25ebb686c40f7e2c4da1014936571ca', '16f65fa47be3cb5e6dfe7c6c37016c0e', + '828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-192: I=34'), + ('4f1c769d1e5b0552c7eca84dea26a549', 'f3847210d5391e2360608e5acb560581', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbc', + 'ecb-tbl-192: I=35'), + ('8548e2f882d7584d0fafc54372b6633a', '8754462cd223366d0753913e6af2643d', + 'bebfc0c1c3c4c5c6c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-192: I=36'), + ('87d7a336cb476f177cd2a51af2a62cdf', '1ea20617468d1b806a1fd58145462017', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedeef0f1f2f3f5f6f7f8', + 'ecb-tbl-192: I=37'), + ('03b1feac668c4e485c1065dfc22b44ee', '3b155d927355d737c6be9dda60136e2e', + 'fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-192: I=38'), + ('bda15e66819fa72d653a6866aa287962', '26144f7b66daa91b6333dbd3850502b3', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334', + 'ecb-tbl-192: I=39'), + ('4d0c7a0d2505b80bf8b62ceb12467f0a', 'e4f9a4ab52ced8134c649bf319ebcc90', + '363738393b3c3d3e40414243454647484a4b4c4d4f505152', + 'ecb-tbl-192: I=40'), + ('626d34c9429b37211330986466b94e5f', 'b9ddd29ac6128a6cab121e34a4c62b36', + '54555657595a5b5c5e5f60616364656668696a6b6d6e6f70', + 'ecb-tbl-192: I=41'), + ('333c3e6bf00656b088a17e5ff0e7f60a', '6fcddad898f2ce4eff51294f5eaaf5c9', + '727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-192: I=42'), + ('687ed0cdc0d2a2bc8c466d05ef9d2891', 'c9a6fe2bf4028080bea6f7fc417bd7e3', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabac', + 'ecb-tbl-192: I=43'), + ('487830e78cc56c1693e64b2a6660c7b6', '6a2026846d8609d60f298a9c0673127f', + 'aeafb0b1b3b4b5b6b8b9babbbdbebfc0c2c3c4c5c7c8c9ca', + 'ecb-tbl-192: I=44'), + ('7a48d6b7b52b29392aa2072a32b66160', '2cb25c005e26efea44336c4c97a4240b', + 'cccdcecfd1d2d3d4d6d7d8d9dbdcdddee0e1e2e3e5e6e7e8', + 'ecb-tbl-192: I=45'), + ('907320e64c8c5314d10f8d7a11c8618d', '496967ab8680ddd73d09a0e4c7dcc8aa', + 'eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-192: I=46'), + ('b561f2ca2d6e65a4a98341f3ed9ff533', 'd5af94de93487d1f3a8c577cb84a66a4', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324', + 'ecb-tbl-192: I=47'), + ('df769380d212792d026f049e2e3e48ef', '84bdac569cae2828705f267cc8376e90', + '262728292b2c2d2e30313233353637383a3b3c3d3f404142', + 'ecb-tbl-192: I=48'), + ('79f374bc445bdabf8fccb8843d6054c6', 'f7401dda5ad5ab712b7eb5d10c6f99b6', + '44454647494a4b4c4e4f50515354555658595a5b5d5e5f60', + 'ecb-tbl-192: I=49'), + ('4e02f1242fa56b05c68dbae8fe44c9d6', '1c9d54318539ebd4c3b5b7e37bf119f0', + '626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-192: I=50'), + ('cf73c93cbff57ac635a6f4ad2a4a1545', 'aca572d65fb2764cffd4a6eca090ea0d', + '80818283858687888a8b8c8d8f90919294959697999a9b9c', + 'ecb-tbl-192: I=51'), + ('9923548e2875750725b886566784c625', '36d9c627b8c2a886a10ccb36eae3dfbb', + '9e9fa0a1a3a4a5a6a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-192: I=52'), + ('4888336b723a022c9545320f836a4207', '010edbf5981e143a81d646e597a4a568', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdced0d1d2d3d5d6d7d8', + 'ecb-tbl-192: I=53'), + ('f84d9a5561b0608b1160dee000c41ba8', '8db44d538dc20cc2f40f3067fd298e60', + 'dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-192: I=54'), + ('c23192a0418e30a19b45ae3e3625bf22', '930eb53bc71e6ac4b82972bdcd5aafb3', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314', + 'ecb-tbl-192: I=55'), + ('b84e0690b28b0025381ad82a15e501a7', '6c42a81edcbc9517ccd89c30c95597b4', + '161718191b1c1d1e20212223252627282a2b2c2d2f303132', + 'ecb-tbl-192: I=56'), + ('acef5e5c108876c4f06269f865b8f0b0', 'da389847ad06df19d76ee119c71e1dd3', + '34353637393a3b3c3e3f40414344454648494a4b4d4e4f50', + 'ecb-tbl-192: I=57'), + ('0f1b3603e0f5ddea4548246153a5e064', 'e018fdae13d3118f9a5d1a647a3f0462', + '525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-192: I=58'), + ('fbb63893450d42b58c6d88cd3c1809e3', '2aa65db36264239d3846180fabdfad20', + '70717273757677787a7b7c7d7f80818284858687898a8b8c', + 'ecb-tbl-192: I=59'), + ('4bef736df150259dae0c91354e8a5f92', '1472163e9a4f780f1ceb44b07ecf4fdb', + '8e8f90919394959698999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-192: I=60'), + ('7d2d46242056ef13d3c3fc93c128f4c7', 'c8273fdc8f3a9f72e91097614b62397c', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbec0c1c2c3c5c6c7c8', + 'ecb-tbl-192: I=61'), + ('e9c1ba2df415657a256edb33934680fd', '66c8427dcd733aaf7b3470cb7d976e3f', + 'cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-192: I=62'), + ('e23ee277b0aa0a1dfb81f7527c3514f1', '146131cb17f1424d4f8da91e6f80c1d0', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304', + 'ecb-tbl-192: I=63'), + ('3e7445b0b63caaf75e4a911e12106b4c', '2610d0ad83659081ae085266a88770dc', + '060708090b0c0d0e10111213151617181a1b1c1d1f202122', + 'ecb-tbl-192: I=64'), + ('767774752023222544455a5be6e1e0e3', '38a2b5a974b0575c5d733917fb0d4570', + '24252627292a2b2c2e2f30313334353638393a3b3d3e3f40', + 'ecb-tbl-192: I=65'), + ('72737475717e7f7ce9e8ebea696a6b6c', 'e21d401ebc60de20d6c486e4f39a588b', + '424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-192: I=66'), + ('dfdedddc25262728c9c8cfcef1eeefec', 'e51d5f88c670b079c0ca1f0c2c4405a2', + '60616263656667686a6b6c6d6f70717274757677797a7b7c', + 'ecb-tbl-192: I=67'), + ('fffe0100707776755f5e5d5c7675746b', '246a94788a642fb3d1b823c8762380c8', + '7e7f80818384858688898a8b8d8e8f90929394959798999a', + 'ecb-tbl-192: I=68'), + ('e0e1e2e3424140479f9e9190292e2f2c', 'b80c391c5c41a4c3b30c68e0e3d7550f', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadaeb0b1b2b3b5b6b7b8', + 'ecb-tbl-192: I=69'), + ('2120272690efeeed3b3a39384e4d4c4b', 'b77c4754fc64eb9a1154a9af0bb1f21c', + 'babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-192: I=70'), + ('ecedeeef5350516ea1a0a7a6a3acadae', 'fb554de520d159a06bf219fc7f34a02f', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4', + 'ecb-tbl-192: I=71'), + ('32333c3d25222320e9e8ebeacecdccc3', 'a89fba152d76b4927beed160ddb76c57', + 'f6f7f8f9fbfcfdfe00010203050607080a0b0c0d0f101112', + 'ecb-tbl-192: I=72'), + ('40414243626160678a8bb4b511161714', '5676eab4a98d2e8473b3f3d46424247c', + '14151617191a1b1c1e1f20212324252628292a2b2d2e2f30', + 'ecb-tbl-192: I=73'), + ('94959293f5fafbf81f1e1d1c7c7f7e79', '4e8f068bd7ede52a639036ec86c33568', + '323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-192: I=74'), + ('bebfbcbd191a1b14cfcec9c8546b6a69', 'f0193c4d7aff1791ee4c07eb4a1824fc', + '50515253555657585a5b5c5d5f60616264656667696a6b6c', + 'ecb-tbl-192: I=75'), + ('2c2d3233898e8f8cbbbab9b8333031ce', 'ac8686eeca9ba761afe82d67b928c33f', + '6e6f70717374757678797a7b7d7e7f80828384858788898a', + 'ecb-tbl-192: I=76'), + ('84858687bfbcbdba37363938fdfafbf8', '5faf8573e33b145b6a369cd3606ab2c9', + '8c8d8e8f91929394969798999b9c9d9ea0a1a2a3a5a6a7a8', + 'ecb-tbl-192: I=77'), + ('828384857669686b909192930b08090e', '31587e9944ab1c16b844ecad0df2e7da', + 'aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-192: I=78'), + ('bebfbcbd9695948b707176779e919093', 'd017fecd91148aba37f6f3068aa67d8a', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4', + 'ecb-tbl-192: I=79'), + ('8b8a85846067666521202322d0d3d2dd', '788ef2f021a73cba2794b616078a8500', + 'e6e7e8e9ebecedeef0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-192: I=80'), + ('76777475f1f2f3f4f8f9e6e777707172', '5d1ef20dced6bcbc12131ac7c54788aa', + '04050607090a0b0c0e0f10111314151618191a1b1d1e1f20', + 'ecb-tbl-192: I=81'), + ('a4a5a2a34f404142b4b5b6b727242522', 'b3c8cf961faf9ea05fdde6d1e4d8f663', + '222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-192: I=82'), + ('94959697e1e2e3ec16171011839c9d9e', '143075c70605861c7fac6526199e459f', + '40414243454647484a4b4c4d4f50515254555657595a5b5c', + 'ecb-tbl-192: I=83'), + ('03023d3c06010003dedfdcddfffcfde2', 'a5ae12eade9a87268d898bfc8fc0252a', + '5e5f60616364656668696a6b6d6e6f70727374757778797a', + 'ecb-tbl-192: I=84'), + ('10111213f1f2f3f4cecfc0c1dbdcddde', '0924f7cf2e877a4819f5244a360dcea9', + '7c7d7e7f81828384868788898b8c8d8e9091929395969798', + 'ecb-tbl-192: I=85'), + ('67666160724d4c4f1d1c1f1e73707176', '3d9e9635afcc3e291cc7ab3f27d1c99a', + '9a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-192: I=86'), + ('e6e7e4e5a8abaad584858283909f9e9d', '9d80feebf87510e2b8fb98bb54fd788c', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4', + 'ecb-tbl-192: I=87'), + ('71707f7e565150537d7c7f7e6162636c', '5f9d1a082a1a37985f174002eca01309', + 'd6d7d8d9dbdcdddee0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-192: I=88'), + ('64656667212223245555aaaa03040506', 'a390ebb1d1403930184a44b4876646e4', + 'f4f5f6f7f9fafbfcfefe01010304050608090a0b0d0e0f10', + 'ecb-tbl-192: I=89'), + ('9e9f9899aba4a5a6cfcecdcc2b28292e', '700fe918981c3195bb6c4bcb46b74e29', + '121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-192: I=90'), + ('c7c6c5c4d1d2d3dc626364653a454447', '907984406f7bf2d17fb1eb15b673d747', + '30313233353637383a3b3c3d3f40414244454647494a4b4c', + 'ecb-tbl-192: I=91'), + ('f6f7e8e9e0e7e6e51d1c1f1e5b585966', 'c32a956dcfc875c2ac7c7cc8b8cc26e1', + '4e4f50515354555658595a5b5d5e5f60626364656768696a', + 'ecb-tbl-192: I=92'), + ('bcbdbebf5d5e5f5868696667f4f3f2f1', '02646e2ebfa9b820cf8424e9b9b6eb51', + '6c6d6e6f71727374767778797b7c7d7e8081828385868788', + 'ecb-tbl-192: I=93'), + ('40414647b0afaead9b9a99989b98999e', '621fda3a5bbd54c6d3c685816bd4ead8', + '8a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-192: I=94'), + ('69686b6a0201001f0f0e0908b4bbbab9', 'd4e216040426dfaf18b152469bc5ac2f', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4', + 'ecb-tbl-192: I=95'), + ('c7c6c9c8d8dfdedd5a5b5859bebdbcb3', '9d0635b9d33b6cdbd71f5d246ea17cc8', + 'c6c7c8c9cbcccdced0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-192: I=96'), + ('dedfdcdd787b7a7dfffee1e0b2b5b4b7', '10abad1bd9bae5448808765583a2cc1a', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6f8f9fafbfdfefe00', + 'ecb-tbl-192: I=97'), + ('4d4c4b4a606f6e6dd0d1d2d3fbf8f9fe', '6891889e16544e355ff65a793c39c9a8', + '020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-192: I=98'), + ('b7b6b5b4d7d4d5dae5e4e3e2e1fefffc', 'cc735582e68072c163cd9ddf46b91279', + '20212223252627282a2b2c2d2f30313234353637393a3b3c', + 'ecb-tbl-192: I=99'), + ('cecfb0b1f7f0f1f2aeafacad3e3d3c23', 'c5c68b9aeeb7f878df578efa562f9574', + '3e3f40414344454648494a4b4d4e4f50525354555758595a', + 'ecb-tbl-192: I=100'), + ('cacbc8c9cdcecfc812131c1d494e4f4c', '5f4764395a667a47d73452955d0d2ce8', + '5c5d5e5f61626364666768696b6c6d6e7071727375767778', + 'ecb-tbl-192: I=101'), + ('9d9c9b9ad22d2c2fb1b0b3b20c0f0e09', '701448331f66106cefddf1eb8267c357', + '7a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-192: I=102'), + ('7a7b787964676659959493924f404142', 'cb3ee56d2e14b4e1941666f13379d657', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4', + 'ecb-tbl-192: I=103'), + ('aaaba4a5cec9c8cb1f1e1d1caba8a9a6', '9fe16efd18ab6e1981191851fedb0764', + 'b6b7b8b9bbbcbdbec0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-192: I=104'), + ('93929190282b2a2dc4c5fafb92959497', '3dc9ba24e1b223589b147adceb4c8e48', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6e8e9eaebedeeeff0', + 'ecb-tbl-192: I=105'), + ('efeee9e8ded1d0d339383b3a888b8a8d', '1c333032682e7d4de5e5afc05c3e483c', + 'f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-192: I=106'), + ('7f7e7d7ca2a1a0af78797e7f112e2f2c', 'd593cc99a95afef7e92038e05a59d00a', + '10111213151617181a1b1c1d1f20212224252627292a2b2c', + 'ecb-tbl-192: I=107'), + ('84859a9b2b2c2d2e868784852625245b', '51e7f96f53b4353923452c222134e1ec', + '2e2f30313334353638393a3b3d3e3f40424344454748494a', + 'ecb-tbl-192: I=108'), + ('b0b1b2b3070405026869666710171615', '4075b357a1a2b473400c3b25f32f81a4', + '4c4d4e4f51525354565758595b5c5d5e6061626365666768', + 'ecb-tbl-192: I=109'), + ('acadaaabbda2a3a00d0c0f0e595a5b5c', '302e341a3ebcd74f0d55f61714570284', + '6a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-192: I=110'), + ('121310115655544b5253545569666764', '57abdd8231280da01c5042b78cf76522', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4', + 'ecb-tbl-192: I=111'), + ('dedfd0d166616063eaebe8e94142434c', '17f9ea7eea17ac1adf0e190fef799e92', + 'a6a7a8a9abacadaeb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-192: I=112'), + ('dbdad9d81417161166677879e0e7e6e5', '2e1bdd563dd87ee5c338dd6d098d0a7a', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6d8d9dadbdddedfe0', + 'ecb-tbl-192: I=113'), + ('6a6b6c6de0efeeed2b2a2928c0c3c2c5', 'eb869996e6f8bfb2bfdd9e0c4504dbb2', + 'e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-192: I=114'), + ('b1b0b3b21714151a1a1b1c1d5649484b', 'c2e01549e9decf317468b3e018c61ba8', + '00010203050607080a0b0c0d0f10111214151617191a1b1c', + 'ecb-tbl-192: I=115'), + ('39380706a3a4a5a6c4c5c6c77271706f', '8da875d033c01dd463b244a1770f4a22', + '1e1f20212324252628292a2b2d2e2f30323334353738393a', + 'ecb-tbl-192: I=116'), + ('5c5d5e5f1013121539383736e2e5e4e7', '8ba0dcf3a186844f026d022f8839d696', + '3c3d3e3f41424344464748494b4c4d4e5051525355565758', + 'ecb-tbl-192: I=117'), + ('43424544ead5d4d72e2f2c2d64676661', 'e9691ff9a6cc6970e51670a0fd5b88c1', + '5a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-192: I=118'), + ('55545756989b9a65f8f9feff18171615', 'f2baec06faeed30f88ee63ba081a6e5b', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394', + 'ecb-tbl-192: I=119'), + ('05040b0a525554573c3d3e3f4a494847', '9c39d4c459ae5753394d6094adc21e78', + '969798999b9c9d9ea0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-192: I=120'), + ('14151617595a5b5c8584fbfa8e89888b', '6345b532a11904502ea43ba99c6bd2b2', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6c8c9cacbcdcecfd0', + 'ecb-tbl-192: I=121'), + ('7c7d7a7bfdf2f3f029282b2a51525354', '5ffae3061a95172e4070cedce1e428c8', + 'd2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-192: I=122'), + ('38393a3b1e1d1c1341404746c23d3c3e', '0a4566be4cdf9adce5dec865b5ab34cd', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c', + 'ecb-tbl-192: I=123'), + ('8d8c939240474645818083827c7f7e41', 'ca17fcce79b7404f2559b22928f126fb', + '0e0f10111314151618191a1b1d1e1f20222324252728292a', + 'ecb-tbl-192: I=124'), + ('3b3a39381a19181f32333c3d45424340', '97ca39b849ed73a6470a97c821d82f58', + '2c2d2e2f31323334363738393b3c3d3e4041424345464748', + 'ecb-tbl-192: I=125'), + ('f0f1f6f738272625828380817f7c7d7a', '8198cb06bc684c6d3e9b7989428dcf7a', + '4a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-192: I=126'), + ('89888b8a0407061966676061141b1a19', 'f53c464c705ee0f28d9a4c59374928bd', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384', + 'ecb-tbl-192: I=127'), + ('d3d2dddcaaadacaf9c9d9e9fe8ebeae5', '9adb3d4cca559bb98c3e2ed73dbf1154', + '868788898b8c8d8e90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-192: I=128'), + + # ecb_tbl.txt, KEYSIZE=256 + ('834eadfccac7e1b30664b1aba44815ab', '1946dabf6a03a2a2c3d0b05080aed6fc', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=1'), + ('d9dc4dba3021b05d67c0518f72b62bf1', '5ed301d747d3cc715445ebdec62f2fb4', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=2'), + ('a291d86301a4a739f7392173aa3c604c', '6585c8f43d13a6beab6419fc5935b9d0', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=3'), + ('4264b2696498de4df79788a9f83e9390', '2a5b56a596680fcc0e05f5e0f151ecae', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=4'), + ('ee9932b3721804d5a83ef5949245b6f6', 'f5d6ff414fd2c6181494d20c37f2b8c4', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=5'), + ('e6248f55c5fdcbca9cbbb01c88a2ea77', '85399c01f59fffb5204f19f8482f00b8', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=6'), + ('b8358e41b9dff65fd461d55a99266247', '92097b4c88a041ddf98144bc8d22e8e7', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=7'), + ('f0e2d72260af58e21e015ab3a4c0d906', '89bd5b73b356ab412aef9f76cea2d65c', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=8'), + ('475b8b823ce8893db3c44a9f2a379ff7', '2536969093c55ff9454692f2fac2f530', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=9'), + ('688f5281945812862f5f3076cf80412f', '07fc76a872843f3f6e0081ee9396d637', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=10'), + ('08d1d2bc750af553365d35e75afaceaa', 'e38ba8ec2aa741358dcc93e8f141c491', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=11'), + ('8707121f47cc3efceca5f9a8474950a1', 'd028ee23e4a89075d0b03e868d7d3a42', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=12'), + ('e51aa0b135dba566939c3b6359a980c5', '8cd9423dfc459e547155c5d1d522e540', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=13'), + ('069a007fc76a459f98baf917fedf9521', '080e9517eb1677719acf728086040ae3', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=14'), + ('726165c1723fbcf6c026d7d00b091027', '7c1700211a3991fc0ecded0ab3e576b0', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=15'), + ('d7c544de91d55cfcde1f84ca382200ce', 'dabcbcc855839251db51e224fbe87435', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=16'), + ('fed3c9a161b9b5b2bd611b41dc9da357', '68d56fad0406947a4dd27a7448c10f1d', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=17'), + ('4f634cdc6551043409f30b635832cf82', 'da9a11479844d1ffee24bbf3719a9925', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=18'), + ('109ce98db0dfb36734d9f3394711b4e6', '5e4ba572f8d23e738da9b05ba24b8d81', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=19'), + ('4ea6dfaba2d8a02ffdffa89835987242', 'a115a2065d667e3f0b883837a6e903f8', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=20'), + ('5ae094f54af58e6e3cdbf976dac6d9ef', '3e9e90dc33eac2437d86ad30b137e66e', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=21'), + ('764d8e8e0f29926dbe5122e66354fdbe', '01ce82d8fbcdae824cb3c48e495c3692', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=22'), + ('3f0418f888cdf29a982bf6b75410d6a9', '0c9cff163ce936faaf083cfd3dea3117', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=23'), + ('e4a3e7cb12cdd56aa4a75197a9530220', '5131ba9bd48f2bba85560680df504b52', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=24'), + ('211677684aac1ec1a160f44c4ebf3f26', '9dc503bbf09823aec8a977a5ad26ccb2', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=25'), + ('d21e439ff749ac8f18d6d4b105e03895', '9a6db0c0862e506a9e397225884041d7', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=26'), + ('d9f6ff44646c4725bd4c0103ff5552a7', '430bf9570804185e1ab6365fc6a6860c', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=27'), + ('0b1256c2a00b976250cfc5b0c37ed382', '3525ebc02f4886e6a5a3762813e8ce8a', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=28'), + ('b056447ffc6dc4523a36cc2e972a3a79', '07fa265c763779cce224c7bad671027b', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=29'), + ('5e25ca78f0de55802524d38da3fe4456', 'e8b72b4e8be243438c9fff1f0e205872', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=30'), + ('a5bcf4728fa5eaad8567c0dc24675f83', '109d4f999a0e11ace1f05e6b22cbcb50', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=31'), + ('814e59f97ed84646b78b2ca022e9ca43', '45a5e8d4c3ed58403ff08d68a0cc4029', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=32'), + ('15478beec58f4775c7a7f5d4395514d7', '196865964db3d417b6bd4d586bcb7634', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=33'), + ('253548ffca461c67c8cbc78cd59f4756', '60436ad45ac7d30d99195f815d98d2ae', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=34'), + ('fd7ad8d73b9b0f8cc41600640f503d65', 'bb07a23f0b61014b197620c185e2cd75', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=35'), + ('06199de52c6cbf8af954cd65830bcd56', '5bc0b2850129c854423aff0751fe343b', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=36'), + ('f17c4ffe48e44c61bd891e257e725794', '7541a78f96738e6417d2a24bd2beca40', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=37'), + ('9a5b4a402a3e8a59be6bf5cd8154f029', 'b0a303054412882e464591f1546c5b9e', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=38'), + ('79bd40b91a7e07dc939d441782ae6b17', '778c06d8a355eeee214fcea14b4e0eef', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=39'), + ('d8ceaaf8976e5fbe1012d8c84f323799', '09614206d15cbace63227d06db6beebb', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=40'), + ('3316e2751e2e388b083da23dd6ac3fbe', '41b97fb20e427a9fdbbb358d9262255d', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=41'), + ('8b7cfbe37de7dca793521819242c5816', 'c1940f703d845f957652c2d64abd7adf', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=42'), + ('f23f033c0eebf8ec55752662fd58ce68', 'd2d44fcdae5332343366db297efcf21b', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=43'), + ('59eb34f6c8bdbacc5fc6ad73a59a1301', 'ea8196b79dbe167b6aa9896e287eed2b', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=44'), + ('dcde8b6bd5cf7cc22d9505e3ce81261a', 'd6b0b0c4ba6c7dbe5ed467a1e3f06c2d', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=45'), + ('e33cf7e524fed781e7042ff9f4b35dc7', 'ec51eb295250c22c2fb01816fb72bcae', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=46'), + ('27963c8facdf73062867d164df6d064c', 'aded6630a07ce9c7408a155d3bd0d36f', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=47'), + ('77b1ce386b551b995f2f2a1da994eef8', '697c9245b9937f32f5d1c82319f0363a', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=48'), + ('f083388b013679efcf0bb9b15d52ae5c', 'aad5ad50c6262aaec30541a1b7b5b19c', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=49'), + ('c5009e0dab55db0abdb636f2600290c8', '7d34b893855341ec625bd6875ac18c0d', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=50'), + ('7804881e26cd532d8514d3683f00f1b9', '7ef05105440f83862f5d780e88f02b41', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=51'), + ('46cddcd73d1eb53e675ca012870a92a3', 'c377c06403382061af2c9c93a8e70df6', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=52'), + ('a9fb44062bb07fe130a8e8299eacb1ab', '1dbdb3ffdc052dacc83318853abc6de5', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=53'), + ('2b6ff8d7a5cc3a28a22d5a6f221af26b', '69a6eab00432517d0bf483c91c0963c7', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=54'), + ('1a9527c29b8add4b0e3e656dbb2af8b4', '0797f41dc217c80446e1d514bd6ab197', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=55'), + ('7f99cf2c75244df015eb4b0c1050aeae', '9dfd76575902a637c01343c58e011a03', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=56'), + ('e84ff85b0d9454071909c1381646c4ed', 'acf4328ae78f34b9fa9b459747cc2658', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=57'), + ('89afd40f99521280d5399b12404f6db4', 'b0479aea12bac4fe2384cf98995150c6', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=58'), + ('a09ef32dbc5119a35ab7fa38656f0329', '9dd52789efe3ffb99f33b3da5030109a', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=59'), + ('61773457f068c376c7829b93e696e716', 'abbb755e4621ef8f1214c19f649fb9fd', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=60'), + ('a34f0cae726cce41dd498747d891b967', 'da27fb8174357bce2bed0e7354f380f9', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=61'), + ('856f59496c7388ee2d2b1a27b7697847', 'c59a0663f0993838f6e5856593bdc5ef', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=62'), + ('cb090c593ef7720bd95908fb93b49df4', 'ed60b264b5213e831607a99c0ce5e57e', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=63'), + ('a0ac75cd2f1923d460fc4d457ad95baf', 'e50548746846f3eb77b8c520640884ed', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=64'), + ('2a2b282974777689e8e9eeef525d5c5f', '28282cc7d21d6a2923641e52d188ef0c', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=65'), + ('909192939390919e0f0e09089788898a', '0dfa5b02abb18e5a815305216d6d4f8e', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=66'), + ('777675748d8e8f907170777649464744', '7359635c0eecefe31d673395fb46fb99', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=67'), + ('717073720605040b2d2c2b2a05fafbf9', '73c679f7d5aef2745c9737bb4c47fb36', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=68'), + ('64656667fefdfcc31b1a1d1ca5aaaba8', 'b192bd472a4d2eafb786e97458967626', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=69'), + ('dbdad9d86a696867b5b4b3b2c8d7d6d5', '0ec327f6c8a2b147598ca3fde61dc6a4', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=70'), + ('5c5d5e5fe3e0e1fe31303736333c3d3e', 'fc418eb3c41b859b38d4b6f646629729', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=71'), + ('545556574b48494673727574546b6a69', '30249e5ac282b1c981ea64b609f3a154', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=72'), + ('ecedeeefc6c5c4bb56575051f5fafbf8', '5e6e08646d12150776bb43c2d78a9703', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=73'), + ('464744452724252ac9c8cfced2cdcccf', 'faeb3d5de652cd3447dceb343f30394a', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=74'), + ('e6e7e4e54142435c878681801c131211', 'a8e88706823f6993ef80d05c1c7b2cf0', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=75'), + ('72737071cfcccdc2f9f8fffe710e0f0c', '8ced86677e6e00a1a1b15968f2d3cce6', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=76'), + ('505152537370714ec3c2c5c4010e0f0c', '9fc7c23858be03bdebb84e90db6786a9', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=77'), + ('a8a9aaab5c5f5e51aeafa8a93d222320', 'b4fbd65b33f70d8cf7f1111ac4649c36', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=78'), + ('dedfdcddf6f5f4eb10111617fef1f0f3', 'c5c32d5ed03c4b53cc8c1bd0ef0dbbf6', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=79'), + ('bdbcbfbe5e5d5c530b0a0d0cfac5c4c7', 'd1a7f03b773e5c212464b63709c6a891', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=80'), + ('8a8b8889050606f8f4f5f2f3636c6d6e', '6b7161d8745947ac6950438ea138d028', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=81'), + ('a6a7a4a54d4e4f40b2b3b4b539262724', 'fd47a9f7e366ee7a09bc508b00460661', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=82'), + ('9c9d9e9fe9eaebf40e0f08099b949596', '00d40b003dc3a0d9310b659b98c7e416', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=83'), + ('2d2c2f2e1013121dcccdcacbed121310', 'eea4c79dcc8e2bda691f20ac48be0717', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=84'), + ('f4f5f6f7edeeefd0eaebecedf7f8f9fa', 'e78f43b11c204403e5751f89d05a2509', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=85'), + ('3d3c3f3e282b2a2573727574150a0b08', 'd0f0e3d1f1244bb979931e38dd1786ef', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=86'), + ('b6b7b4b5f8fbfae5b4b5b2b3a0afaead', '042e639dc4e1e4dde7b75b749ea6f765', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=87'), + ('b7b6b5b4989b9a95878681809ba4a5a6', 'bc032fdd0efe29503a980a7d07ab46a8', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=88'), + ('a8a9aaabe5e6e798e9e8efee4748494a', '0c93ac949c0da6446effb86183b6c910', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=89'), + ('ecedeeefd9dadbd4b9b8bfbe657a7b78', 'e0d343e14da75c917b4a5cec4810d7c2', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=90'), + ('7f7e7d7c696a6b74cacbcccd929d9c9f', '0eafb821748408279b937b626792e619', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=91'), + ('08090a0b0605040bfffef9f8b9c6c7c4', 'fa1ac6e02d23b106a1fef18b274a553f', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=92'), + ('08090a0bf1f2f3ccfcfdfafb68676665', '0dadfe019cd12368075507df33c1a1e9', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=93'), + ('cacbc8c93a393837050403020d121310', '3a0879b414465d9ffbaf86b33a63a1b9', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=94'), + ('e9e8ebea8281809f8f8e8988343b3a39', '62199fadc76d0be1805d3ba0b7d914bf', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=95'), + ('515053524645444bd0d1d6d7340b0a09', '1b06d6c5d333e742730130cf78e719b4', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=96'), + ('42434041ecefee1193929594c6c9c8cb', 'f1f848824c32e9dcdcbf21580f069329', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=97'), + ('efeeedecc2c1c0cf76777071455a5b58', '1a09050cbd684f784d8e965e0782f28a', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=98'), + ('5f5e5d5c3f3c3d221d1c1b1a19161714', '79c2969e7ded2ba7d088f3f320692360', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=99'), + ('000102034142434c1c1d1a1b8d727371', '091a658a2f7444c16accb669450c7b63', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=100'), + ('8e8f8c8db1b2b38c56575051050a0b08', '97c1e3a72cca65fa977d5ed0e8a7bbfc', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=101'), + ('a7a6a5a4e8ebeae57f7e7978cad5d4d7', '70c430c6db9a17828937305a2df91a2a', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=102'), + ('8a8b888994979689454443429f909192', '629553457fbe2479098571c7c903fde8', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=103'), + ('8c8d8e8fe0e3e2ed45444342f1cecfcc', 'a25b25a61f612669e7d91265c7d476ba', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=104'), + ('fffefdfc4c4f4e31d8d9dedfb6b9b8bb', 'eb7e4e49b8ae0f024570dda293254fed', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=105'), + ('fdfcfffecccfcec12f2e29286679787b', '38fe15d61cca84516e924adce5014f67', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=106'), + ('67666564bab9b8a77071767719161714', '3ad208492249108c9f3ebeb167ad0583', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=107'), + ('9a9b98992d2e2f2084858283245b5a59', '299ba9f9bf5ab05c3580fc26edd1ed12', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=108'), + ('a4a5a6a70b0809365c5d5a5b2c232221', '19dc705b857a60fb07717b2ea5717781', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=109'), + ('464744455754555af3f2f5f4afb0b1b2', 'ffc8aeb885b5efcad06b6dbebf92e76b', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=110'), + ('323330317675746b7273747549464744', 'f58900c5e0b385253ff2546250a0142b', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=111'), + ('a8a9aaab181b1a15808186872b141516', '2ee67b56280bc462429cee6e3370cbc1', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=112'), + ('e7e6e5e4202323ddaaabacad343b3a39', '20db650a9c8e9a84ab4d25f7edc8f03f', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=113'), + ('a8a9aaab2221202fedecebea1e010003', '3c36da169525cf818843805f25b78ae5', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=114'), + ('f9f8fbfa5f5c5d42424344450e010003', '9a781d960db9e45e37779042fea51922', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=115'), + ('57565554f5f6f7f89697909120dfdedd', '6560395ec269c672a3c288226efdba77', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=116'), + ('f8f9fafbcccfcef1dddcdbda0e010003', '8c772b7a189ac544453d5916ebb27b9a', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=117'), + ('d9d8dbda7073727d80818687c2dddcdf', '77ca5468cc48e843d05f78eed9d6578f', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=118'), + ('c5c4c7c6080b0a1588898e8f68676665', '72cdcc71dc82c60d4429c9e2d8195baa', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=119'), + ('83828180dcdfded186878081f0cfcecd', '8080d68ce60e94b40b5b8b69eeb35afa', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=120'), + ('98999a9bdddedfa079787f7e0a050407', '44222d3cde299c04369d58ac0eba1e8e', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=121'), + ('cecfcccd4f4c4d429f9e9998dfc0c1c2', '9b8721b0a8dfc691c5bc5885dbfcb27a', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=122'), + ('404142436665647b29282f2eaba4a5a6', '0dc015ce9a3a3414b5e62ec643384183', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=123'), + ('33323130e6e5e4eb23222524dea1a0a3', '705715448a8da412025ce38345c2a148', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=124'), + ('cfcecdccf6f5f4cbe6e7e0e199969794', 'c32b5b0b6fbae165266c569f4b6ecf0b', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=125'), + ('babbb8b97271707fdcdddadb29363734', '4dca6c75192a01ddca9476af2a521e87', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=126'), + ('c9c8cbca4447465926272021545b5a59', '058691e627ecbc36ac07b6db423bd698', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=127'), + ('050407067477767956575051221d1c1f', '7444527095838fe080fc2bcdd30847eb', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=128'), + + # FIPS PUB 800-38A test vectors, 2001 edition. Annex F. + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + '3ad77bb40d7a3660a89ecaf32466ef97'+'f5d3d58503b9699de785895a96fdbaaf'+ + '43b1cd7f598ece23881b00e3ed030688'+'7b0c785e27e8ad3f8223207104725dd4', + '2b7e151628aed2a6abf7158809cf4f3c', + 'NIST 800-38A, F.1.1, ECB and AES-128'), + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + 'bd334f1d6e45f25ff712a214571fa5cc'+'974104846d0ad3ad7734ecb3ecee4eef'+ + 'ef7afd2270e2e60adce0ba2face6444e'+'9a4b41ba738d6c72fb16691603c18e0e', + '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b', + 'NIST 800-38A, F.1.3, ECB and AES-192'), + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + 'f3eed1bdb5d2a03c064b5a7e3db181f8'+'591ccb10d410ed26dc5ba74a31362870'+ + 'b6ed21b99ca6f4f9f153e7b1beafed1d'+'23304b7a39f9f3ff067d8d8f9e24ecc7', + '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4', + 'NIST 800-38A, F.1.3, ECB and AES-256'), + +] + +test_data_8_lanes = [] +for td in test_data: + test_data_8_lanes.append((td[0] * 8, td[1] * 8, td[2], td[3])) +test_data += test_data_8_lanes + +class TestMultipleBlocks(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt data which is 8*2+4 bytes long, so as to trigger (for the + # AESNI variant) both the path that parallelizes 8 lanes and the one + # that processes data serially + + tvs = [ + (b'a' * 16, 'c0b27011eb15bf144d2fc9fae80ea16d4c231cb230416c5fac02e6835ad9d7d0'), + (b'a' * 24, 'df8435ce361a78c535b41dcb57da952abbf9ee5954dc6fbcd75fd00fa626915d'), + (b'a' * 32, '211402de6c80db1f92ba255881178e1f70783b8cfd3b37808205e48b80486cd8') + ] + + for key, expected in tvs: + + cipher = AES.new(key, AES.MODE_ECB, use_aesni=self.use_aesni) + h = SHA256.new() + + pt = b"".join([ tobytes('{0:016x}'.format(x)) for x in range(20) ]) + ct = cipher.encrypt(pt) + self.assertEqual(SHA256.new(ct).hexdigest(), expected) + + +class TestIncompleteBlocks(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt data with length not multiple of 16 bytes + + cipher = AES.new(b'4'*16, AES.MODE_ECB, use_aesni=self.use_aesni) + + for msg_len in range(1, 16): + self.assertRaises(ValueError, cipher.encrypt, b'1' * msg_len) + self.assertRaises(ValueError, cipher.encrypt, b'1' * (msg_len+16)) + self.assertRaises(ValueError, cipher.decrypt, b'1' * msg_len) + self.assertRaises(ValueError, cipher.decrypt, b'1' * (msg_len+16)) + + self.assertEqual(cipher.encrypt(b''), b'') + self.assertEqual(cipher.decrypt(b''), b'') + + +class TestOutput(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = AES.new(b'4'*16, AES.MODE_ECB, use_aesni=self.use_aesni) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(15) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from Cryptodome.Util import _cpu_features + from .common import make_block_tests + + tests = make_block_tests(AES, "AES", test_data, {'use_aesni': False}) + tests += [ TestMultipleBlocks(False) ] + tests += [ TestIncompleteBlocks(False) ] + if _cpu_features.have_aes_ni(): + # Run tests with AES-NI instructions if they are available. + tests += make_block_tests(AES, "AESNI", test_data, {'use_aesni': True}) + tests += [ TestMultipleBlocks(True) ] + tests += [ TestIncompleteBlocks(True) ] + tests += [ TestOutput(True) ] + else: + print("Skipping AESNI tests") + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py new file mode 100644 index 0000000..0072506 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/ARC2.py: Self-test for the Alleged-RC2 cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.ARC2""" + +import unittest + +from Cryptodome.Util.py3compat import b, bchr + +from Cryptodome.Cipher import ARC2 + +# This is a list of (plaintext, ciphertext, key[, description[, extra_params]]) tuples. +test_data = [ + # Test vectors from RFC 2268 + + # 63-bit effective key length + ('0000000000000000', 'ebb773f993278eff', '0000000000000000', + 'RFC2268-1', dict(effective_keylen=63)), + + # 64-bit effective key length + ('ffffffffffffffff', '278b27e42e2f0d49', 'ffffffffffffffff', + 'RFC2268-2', dict(effective_keylen=64)), + ('1000000000000001', '30649edf9be7d2c2', '3000000000000000', + 'RFC2268-3', dict(effective_keylen=64)), + #('0000000000000000', '61a8a244adacccf0', '88', + # 'RFC2268-4', dict(effective_keylen=64)), + ('0000000000000000', '6ccf4308974c267f', '88bca90e90875a', + 'RFC2268-5', dict(effective_keylen=64)), + ('0000000000000000', '1a807d272bbe5db1', '88bca90e90875a7f0f79c384627bafb2', + 'RFC2268-6', dict(effective_keylen=64)), + + # 128-bit effective key length + ('0000000000000000', '2269552ab0f85ca6', '88bca90e90875a7f0f79c384627bafb2', + "RFC2268-7", dict(effective_keylen=128)), + ('0000000000000000', '5b78d3a43dfff1f1', + '88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e', + "RFC2268-8", dict(effective_keylen=129)), + + # Test vectors from PyCryptodome 2.0.1's testdata.py + # 1024-bit effective key length + ('0000000000000000', '624fb3e887419e48', '5068696c6970476c617373', + 'PCTv201-0'), + ('ffffffffffffffff', '79cadef44c4a5a85', '5068696c6970476c617373', + 'PCTv201-1'), + ('0001020304050607', '90411525b34e4c2c', '5068696c6970476c617373', + 'PCTv201-2'), + ('0011223344556677', '078656aaba61cbfb', '5068696c6970476c617373', + 'PCTv201-3'), + ('0000000000000000', 'd7bcc5dbb4d6e56a', 'ffffffffffffffff', + 'PCTv201-4'), + ('ffffffffffffffff', '7259018ec557b357', 'ffffffffffffffff', + 'PCTv201-5'), + ('0001020304050607', '93d20a497f2ccb62', 'ffffffffffffffff', + 'PCTv201-6'), + ('0011223344556677', 'cb15a7f819c0014d', 'ffffffffffffffff', + 'PCTv201-7'), + ('0000000000000000', '63ac98cdf3843a7a', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-8'), + ('ffffffffffffffff', '3fb49e2fa12371dd', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-9'), + ('0001020304050607', '46414781ab387d5f', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-10'), + ('0011223344556677', 'be09dc81feaca271', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-11'), + ('0000000000000000', 'e64221e608be30ab', '53e5ffe553', + 'PCTv201-12'), + ('ffffffffffffffff', '862bc60fdcd4d9a9', '53e5ffe553', + 'PCTv201-13'), + ('0001020304050607', '6a34da50fa5e47de', '53e5ffe553', + 'PCTv201-14'), + ('0011223344556677', '584644c34503122c', '53e5ffe553', + 'PCTv201-15'), +] + +class BufferOverflowTest(unittest.TestCase): + # Test a buffer overflow found in older versions of PyCrypto + + def runTest(self): + """ARC2 with keylength > 128""" + key = b("x") * 16384 + self.assertRaises(ValueError, ARC2.new, key, ARC2.MODE_ECB) + +class KeyLength(unittest.TestCase): + + def runTest(self): + ARC2.new(b'\x00' * 16, ARC2.MODE_ECB, effective_keylen=40) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 4, ARC2.MODE_ECB) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 129, ARC2.MODE_ECB) + + self.assertRaises(ValueError, ARC2.new, bchr(0) * 16, ARC2.MODE_ECB, + effective_keylen=39) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 16, ARC2.MODE_ECB, + effective_keylen=1025) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = ARC2.new(b'4'*16, ARC2.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from Cryptodome.Cipher import ARC2 + from .common import make_block_tests + + tests = make_block_tests(ARC2, "ARC2", test_data) + tests.append(BufferOverflowTest()) + tests.append(KeyLength()) + tests += [TestOutput()] + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py new file mode 100644 index 0000000..a160c98 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py @@ -0,0 +1,471 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/ARC4.py: Self-test for the Alleged-RC4 cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.ARC4""" + +import unittest + +from Cryptodome.Util.py3compat import b +from Cryptodome.SelfTest.st_common import list_test_cases +from binascii import unhexlify + +from Cryptodome.Cipher import ARC4 + +# This is a list of (plaintext, ciphertext, key[, description]) tuples. +test_data = [ + # Test vectors from Eric Rescorla's message with the subject + # "RC4 compatibility testing", sent to the cipherpunks mailing list on + # September 13, 1994. + # http://cypherpunks.venona.com/date/1994/09/msg00420.html + + ('0123456789abcdef', '75b7878099e0c596', '0123456789abcdef', + 'Test vector 0'), + + ('0000000000000000', '7494c2e7104b0879', '0123456789abcdef', + 'Test vector 1'), + + ('0000000000000000', 'de188941a3375d3a', '0000000000000000', + 'Test vector 2'), + + ('00000000000000000000', 'd6a141a7ec3c38dfbd61', 'ef012345', + 'Test vector 3'), + + ('01' * 512, + '7595c3e6114a09780c4ad452338e1ffd9a1be9498f813d76533449b6778dcad8' + + 'c78a8d2ba9ac66085d0e53d59c26c2d1c490c1ebbe0ce66d1b6b1b13b6b919b8' + + '47c25a91447a95e75e4ef16779cde8bf0a95850e32af9689444fd377108f98fd' + + 'cbd4e726567500990bcc7e0ca3c4aaa304a387d20f3b8fbbcd42a1bd311d7a43' + + '03dda5ab078896ae80c18b0af66dff319616eb784e495ad2ce90d7f772a81747' + + 'b65f62093b1e0db9e5ba532fafec47508323e671327df9444432cb7367cec82f' + + '5d44c0d00b67d650a075cd4b70dedd77eb9b10231b6b5b741347396d62897421' + + 'd43df9b42e446e358e9c11a9b2184ecbef0cd8e7a877ef968f1390ec9b3d35a5' + + '585cb009290e2fcde7b5ec66d9084be44055a619d9dd7fc3166f9487f7cb2729' + + '12426445998514c15d53a18c864ce3a2b7555793988126520eacf2e3066e230c' + + '91bee4dd5304f5fd0405b35bd99c73135d3d9bc335ee049ef69b3867bf2d7bd1' + + 'eaa595d8bfc0066ff8d31509eb0c6caa006c807a623ef84c3d33c195d23ee320' + + 'c40de0558157c822d4b8c569d849aed59d4e0fd7f379586b4b7ff684ed6a189f' + + '7486d49b9c4bad9ba24b96abf924372c8a8fffb10d55354900a77a3db5f205e1' + + 'b99fcd8660863a159ad4abe40fa48934163ddde542a6585540fd683cbfd8c00f' + + '12129a284deacc4cdefe58be7137541c047126c8d49e2755ab181ab7e940b0c0', + '0123456789abcdef', + "Test vector 4"), + # shortest key - generated with arc4 package + ('7468697320697320616e206578616d706c65', + '7260677d38495a09585d69321e17eaf3cdd0', + '01'), +] + + +class RFC6229_Tests(unittest.TestCase): + # Test vectors from RFC 6229. Each test vector is a tuple with two items: + # the ARC4 key and a dictionary. The dictionary has keystream offsets as keys + # and the 16-byte keystream starting at the relevant offset as value. + rfc6229_data = [ + # Page 3 + ( + '0102030405', + { + 0: 'b2 39 63 05 f0 3d c0 27 cc c3 52 4a 0a 11 18 a8', + 16: '69 82 94 4f 18 fc 82 d5 89 c4 03 a4 7a 0d 09 19', + 240: '28 cb 11 32 c9 6c e2 86 42 1d ca ad b8 b6 9e ae', + 256: '1c fc f6 2b 03 ed db 64 1d 77 df cf 7f 8d 8c 93', + 496: '42 b7 d0 cd d9 18 a8 a3 3d d5 17 81 c8 1f 40 41', + 512: '64 59 84 44 32 a7 da 92 3c fb 3e b4 98 06 61 f6', + 752: 'ec 10 32 7b de 2b ee fd 18 f9 27 76 80 45 7e 22', + 768: 'eb 62 63 8d 4f 0b a1 fe 9f ca 20 e0 5b f8 ff 2b', + 1008: '45 12 90 48 e6 a0 ed 0b 56 b4 90 33 8f 07 8d a5', + 1024: '30 ab bc c7 c2 0b 01 60 9f 23 ee 2d 5f 6b b7 df', + 1520: '32 94 f7 44 d8 f9 79 05 07 e7 0f 62 e5 bb ce ea', + 1536: 'd8 72 9d b4 18 82 25 9b ee 4f 82 53 25 f5 a1 30', + 2032: '1e b1 4a 0c 13 b3 bf 47 fa 2a 0b a9 3a d4 5b 8b', + 2048: 'cc 58 2f 8b a9 f2 65 e2 b1 be 91 12 e9 75 d2 d7', + 3056: 'f2 e3 0f 9b d1 02 ec bf 75 aa ad e9 bc 35 c4 3c', + 3072: 'ec 0e 11 c4 79 dc 32 9d c8 da 79 68 fe 96 56 81', + 4080: '06 83 26 a2 11 84 16 d2 1f 9d 04 b2 cd 1c a0 50', + 4096: 'ff 25 b5 89 95 99 67 07 e5 1f bd f0 8b 34 d8 75' + } + ), + # Page 4 + ( + '01020304050607', + { + 0: '29 3f 02 d4 7f 37 c9 b6 33 f2 af 52 85 fe b4 6b', + 16: 'e6 20 f1 39 0d 19 bd 84 e2 e0 fd 75 20 31 af c1', + 240: '91 4f 02 53 1c 92 18 81 0d f6 0f 67 e3 38 15 4c', + 256: 'd0 fd b5 83 07 3c e8 5a b8 39 17 74 0e c0 11 d5', + 496: '75 f8 14 11 e8 71 cf fa 70 b9 0c 74 c5 92 e4 54', + 512: '0b b8 72 02 93 8d ad 60 9e 87 a5 a1 b0 79 e5 e4', + 752: 'c2 91 12 46 b6 12 e7 e7 b9 03 df ed a1 da d8 66', + 768: '32 82 8f 91 50 2b 62 91 36 8d e8 08 1d e3 6f c2', + 1008: 'f3 b9 a7 e3 b2 97 bf 9a d8 04 51 2f 90 63 ef f1', + 1024: '8e cb 67 a9 ba 1f 55 a5 a0 67 e2 b0 26 a3 67 6f', + 1520: 'd2 aa 90 2b d4 2d 0d 7c fd 34 0c d4 58 10 52 9f', + 1536: '78 b2 72 c9 6e 42 ea b4 c6 0b d9 14 e3 9d 06 e3', + 2032: 'f4 33 2f d3 1a 07 93 96 ee 3c ee 3f 2a 4f f0 49', + 2048: '05 45 97 81 d4 1f da 7f 30 c1 be 7e 12 46 c6 23', + 3056: 'ad fd 38 68 b8 e5 14 85 d5 e6 10 01 7e 3d d6 09', + 3072: 'ad 26 58 1c 0c 5b e4 5f 4c ea 01 db 2f 38 05 d5', + 4080: 'f3 17 2c ef fc 3b 3d 99 7c 85 cc d5 af 1a 95 0c', + 4096: 'e7 4b 0b 97 31 22 7f d3 7c 0e c0 8a 47 dd d8 b8' + } + ), + ( + '0102030405060708', + { + 0: '97 ab 8a 1b f0 af b9 61 32 f2 f6 72 58 da 15 a8', + 16: '82 63 ef db 45 c4 a1 86 84 ef 87 e6 b1 9e 5b 09', + 240: '96 36 eb c9 84 19 26 f4 f7 d1 f3 62 bd df 6e 18', + 256: 'd0 a9 90 ff 2c 05 fe f5 b9 03 73 c9 ff 4b 87 0a', + 496: '73 23 9f 1d b7 f4 1d 80 b6 43 c0 c5 25 18 ec 63', + 512: '16 3b 31 99 23 a6 bd b4 52 7c 62 61 26 70 3c 0f', + 752: '49 d6 c8 af 0f 97 14 4a 87 df 21 d9 14 72 f9 66', + 768: '44 17 3a 10 3b 66 16 c5 d5 ad 1c ee 40 c8 63 d0', + 1008: '27 3c 9c 4b 27 f3 22 e4 e7 16 ef 53 a4 7d e7 a4', + 1024: 'c6 d0 e7 b2 26 25 9f a9 02 34 90 b2 61 67 ad 1d', + 1520: '1f e8 98 67 13 f0 7c 3d 9a e1 c1 63 ff 8c f9 d3', + 1536: '83 69 e1 a9 65 61 0b e8 87 fb d0 c7 91 62 aa fb', + 2032: '0a 01 27 ab b4 44 84 b9 fb ef 5a bc ae 1b 57 9f', + 2048: 'c2 cd ad c6 40 2e 8e e8 66 e1 f3 7b db 47 e4 2c', + 3056: '26 b5 1e a3 7d f8 e1 d6 f7 6f c3 b6 6a 74 29 b3', + 3072: 'bc 76 83 20 5d 4f 44 3d c1 f2 9d da 33 15 c8 7b', + 4080: 'd5 fa 5a 34 69 d2 9a aa f8 3d 23 58 9d b8 c8 5b', + 4096: '3f b4 6e 2c 8f 0f 06 8e dc e8 cd cd 7d fc 58 62' + } + ), + # Page 5 + ( + '0102030405060708090a', + { + 0: 'ed e3 b0 46 43 e5 86 cc 90 7d c2 18 51 70 99 02', + 16: '03 51 6b a7 8f 41 3b eb 22 3a a5 d4 d2 df 67 11', + 240: '3c fd 6c b5 8e e0 fd de 64 01 76 ad 00 00 04 4d', + 256: '48 53 2b 21 fb 60 79 c9 11 4c 0f fd 9c 04 a1 ad', + 496: '3e 8c ea 98 01 71 09 97 90 84 b1 ef 92 f9 9d 86', + 512: 'e2 0f b4 9b db 33 7e e4 8b 8d 8d c0 f4 af ef fe', + 752: '5c 25 21 ea cd 79 66 f1 5e 05 65 44 be a0 d3 15', + 768: 'e0 67 a7 03 19 31 a2 46 a6 c3 87 5d 2f 67 8a cb', + 1008: 'a6 4f 70 af 88 ae 56 b6 f8 75 81 c0 e2 3e 6b 08', + 1024: 'f4 49 03 1d e3 12 81 4e c6 f3 19 29 1f 4a 05 16', + 1520: 'bd ae 85 92 4b 3c b1 d0 a2 e3 3a 30 c6 d7 95 99', + 1536: '8a 0f ed db ac 86 5a 09 bc d1 27 fb 56 2e d6 0a', + 2032: 'b5 5a 0a 5b 51 a1 2a 8b e3 48 99 c3 e0 47 51 1a', + 2048: 'd9 a0 9c ea 3c e7 5f e3 96 98 07 03 17 a7 13 39', + 3056: '55 22 25 ed 11 77 f4 45 84 ac 8c fa 6c 4e b5 fc', + 3072: '7e 82 cb ab fc 95 38 1b 08 09 98 44 21 29 c2 f8', + 4080: '1f 13 5e d1 4c e6 0a 91 36 9d 23 22 be f2 5e 3c', + 4096: '08 b6 be 45 12 4a 43 e2 eb 77 95 3f 84 dc 85 53' + } + ), + ( + '0102030405060708090a0b0c0d0e0f10', + { + 0: '9a c7 cc 9a 60 9d 1e f7 b2 93 28 99 cd e4 1b 97', + 16: '52 48 c4 95 90 14 12 6a 6e 8a 84 f1 1d 1a 9e 1c', + 240: '06 59 02 e4 b6 20 f6 cc 36 c8 58 9f 66 43 2f 2b', + 256: 'd3 9d 56 6b c6 bc e3 01 07 68 15 15 49 f3 87 3f', + 496: 'b6 d1 e6 c4 a5 e4 77 1c ad 79 53 8d f2 95 fb 11', + 512: 'c6 8c 1d 5c 55 9a 97 41 23 df 1d bc 52 a4 3b 89', + 752: 'c5 ec f8 8d e8 97 fd 57 fe d3 01 70 1b 82 a2 59', + 768: 'ec cb e1 3d e1 fc c9 1c 11 a0 b2 6c 0b c8 fa 4d', + 1008: 'e7 a7 25 74 f8 78 2a e2 6a ab cf 9e bc d6 60 65', + 1024: 'bd f0 32 4e 60 83 dc c6 d3 ce dd 3c a8 c5 3c 16', + 1520: 'b4 01 10 c4 19 0b 56 22 a9 61 16 b0 01 7e d2 97', + 1536: 'ff a0 b5 14 64 7e c0 4f 63 06 b8 92 ae 66 11 81', + 2032: 'd0 3d 1b c0 3c d3 3d 70 df f9 fa 5d 71 96 3e bd', + 2048: '8a 44 12 64 11 ea a7 8b d5 1e 8d 87 a8 87 9b f5', + 3056: 'fa be b7 60 28 ad e2 d0 e4 87 22 e4 6c 46 15 a3', + 3072: 'c0 5d 88 ab d5 03 57 f9 35 a6 3c 59 ee 53 76 23', + 4080: 'ff 38 26 5c 16 42 c1 ab e8 d3 c2 fe 5e 57 2b f8', + 4096: 'a3 6a 4c 30 1a e8 ac 13 61 0c cb c1 22 56 ca cc' + } + ), + # Page 6 + ( + '0102030405060708090a0b0c0d0e0f101112131415161718', + { + 0: '05 95 e5 7f e5 f0 bb 3c 70 6e da c8 a4 b2 db 11', + 16: 'df de 31 34 4a 1a f7 69 c7 4f 07 0a ee 9e 23 26', + 240: 'b0 6b 9b 1e 19 5d 13 d8 f4 a7 99 5c 45 53 ac 05', + 256: '6b d2 37 8e c3 41 c9 a4 2f 37 ba 79 f8 8a 32 ff', + 496: 'e7 0b ce 1d f7 64 5a db 5d 2c 41 30 21 5c 35 22', + 512: '9a 57 30 c7 fc b4 c9 af 51 ff da 89 c7 f1 ad 22', + 752: '04 85 05 5f d4 f6 f0 d9 63 ef 5a b9 a5 47 69 82', + 768: '59 1f c6 6b cd a1 0e 45 2b 03 d4 55 1f 6b 62 ac', + 1008: '27 53 cc 83 98 8a fa 3e 16 88 a1 d3 b4 2c 9a 02', + 1024: '93 61 0d 52 3d 1d 3f 00 62 b3 c2 a3 bb c7 c7 f0', + 1520: '96 c2 48 61 0a ad ed fe af 89 78 c0 3d e8 20 5a', + 1536: '0e 31 7b 3d 1c 73 b9 e9 a4 68 8f 29 6d 13 3a 19', + 2032: 'bd f0 e6 c3 cc a5 b5 b9 d5 33 b6 9c 56 ad a1 20', + 2048: '88 a2 18 b6 e2 ec e1 e6 24 6d 44 c7 59 d1 9b 10', + 3056: '68 66 39 7e 95 c1 40 53 4f 94 26 34 21 00 6e 40', + 3072: '32 cb 0a 1e 95 42 c6 b3 b8 b3 98 ab c3 b0 f1 d5', + 4080: '29 a0 b8 ae d5 4a 13 23 24 c6 2e 42 3f 54 b4 c8', + 4096: '3c b0 f3 b5 02 0a 98 b8 2a f9 fe 15 44 84 a1 68' + } + ), + ( + '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + { + 0: 'ea a6 bd 25 88 0b f9 3d 3f 5d 1e 4c a2 61 1d 91', + 16: 'cf a4 5c 9f 7e 71 4b 54 bd fa 80 02 7c b1 43 80', + 240: '11 4a e3 44 de d7 1b 35 f2 e6 0f eb ad 72 7f d8', + 256: '02 e1 e7 05 6b 0f 62 39 00 49 64 22 94 3e 97 b6', + 496: '91 cb 93 c7 87 96 4e 10 d9 52 7d 99 9c 6f 93 6b', + 512: '49 b1 8b 42 f8 e8 36 7c be b5 ef 10 4b a1 c7 cd', + 752: '87 08 4b 3b a7 00 ba de 95 56 10 67 27 45 b3 74', + 768: 'e7 a7 b9 e9 ec 54 0d 5f f4 3b db 12 79 2d 1b 35', + 1008: 'c7 99 b5 96 73 8f 6b 01 8c 76 c7 4b 17 59 bd 90', + 1024: '7f ec 5b fd 9f 9b 89 ce 65 48 30 90 92 d7 e9 58', + 1520: '40 f2 50 b2 6d 1f 09 6a 4a fd 4c 34 0a 58 88 15', + 1536: '3e 34 13 5c 79 db 01 02 00 76 76 51 cf 26 30 73', + 2032: 'f6 56 ab cc f8 8d d8 27 02 7b 2c e9 17 d4 64 ec', + 2048: '18 b6 25 03 bf bc 07 7f ba bb 98 f2 0d 98 ab 34', + 3056: '8a ed 95 ee 5b 0d cb fb ef 4e b2 1d 3a 3f 52 f9', + 3072: '62 5a 1a b0 0e e3 9a 53 27 34 6b dd b0 1a 9c 18', + 4080: 'a1 3a 7c 79 c7 e1 19 b5 ab 02 96 ab 28 c3 00 b9', + 4096: 'f3 e4 c0 a2 e0 2d 1d 01 f7 f0 a7 46 18 af 2b 48' + } + ), + # Page 7 + ( + '833222772a', + { + 0: '80 ad 97 bd c9 73 df 8a 2e 87 9e 92 a4 97 ef da', + 16: '20 f0 60 c2 f2 e5 12 65 01 d3 d4 fe a1 0d 5f c0', + 240: 'fa a1 48 e9 90 46 18 1f ec 6b 20 85 f3 b2 0e d9', + 256: 'f0 da f5 ba b3 d5 96 83 98 57 84 6f 73 fb fe 5a', + 496: '1c 7e 2f c4 63 92 32 fe 29 75 84 b2 96 99 6b c8', + 512: '3d b9 b2 49 40 6c c8 ed ff ac 55 cc d3 22 ba 12', + 752: 'e4 f9 f7 e0 06 61 54 bb d1 25 b7 45 56 9b c8 97', + 768: '75 d5 ef 26 2b 44 c4 1a 9c f6 3a e1 45 68 e1 b9', + 1008: '6d a4 53 db f8 1e 82 33 4a 3d 88 66 cb 50 a1 e3', + 1024: '78 28 d0 74 11 9c ab 5c 22 b2 94 d7 a9 bf a0 bb', + 1520: 'ad b8 9c ea 9a 15 fb e6 17 29 5b d0 4b 8c a0 5c', + 1536: '62 51 d8 7f d4 aa ae 9a 7e 4a d5 c2 17 d3 f3 00', + 2032: 'e7 11 9b d6 dd 9b 22 af e8 f8 95 85 43 28 81 e2', + 2048: '78 5b 60 fd 7e c4 e9 fc b6 54 5f 35 0d 66 0f ab', + 3056: 'af ec c0 37 fd b7 b0 83 8e b3 d7 0b cd 26 83 82', + 3072: 'db c1 a7 b4 9d 57 35 8c c9 fa 6d 61 d7 3b 7c f0', + 4080: '63 49 d1 26 a3 7a fc ba 89 79 4f 98 04 91 4f dc', + 4096: 'bf 42 c3 01 8c 2f 7c 66 bf de 52 49 75 76 81 15' + } + ), + ( + '1910833222772a', + { + 0: 'bc 92 22 db d3 27 4d 8f c6 6d 14 cc bd a6 69 0b', + 16: '7a e6 27 41 0c 9a 2b e6 93 df 5b b7 48 5a 63 e3', + 240: '3f 09 31 aa 03 de fb 30 0f 06 01 03 82 6f 2a 64', + 256: 'be aa 9e c8 d5 9b b6 81 29 f3 02 7c 96 36 11 81', + 496: '74 e0 4d b4 6d 28 64 8d 7d ee 8a 00 64 b0 6c fe', + 512: '9b 5e 81 c6 2f e0 23 c5 5b e4 2f 87 bb f9 32 b8', + 752: 'ce 17 8f c1 82 6e fe cb c1 82 f5 79 99 a4 61 40', + 768: '8b df 55 cd 55 06 1c 06 db a6 be 11 de 4a 57 8a', + 1008: '62 6f 5f 4d ce 65 25 01 f3 08 7d 39 c9 2c c3 49', + 1024: '42 da ac 6a 8f 9a b9 a7 fd 13 7c 60 37 82 56 82', + 1520: 'cc 03 fd b7 91 92 a2 07 31 2f 53 f5 d4 dc 33 d9', + 1536: 'f7 0f 14 12 2a 1c 98 a3 15 5d 28 b8 a0 a8 a4 1d', + 2032: '2a 3a 30 7a b2 70 8a 9c 00 fe 0b 42 f9 c2 d6 a1', + 2048: '86 26 17 62 7d 22 61 ea b0 b1 24 65 97 ca 0a e9', + 3056: '55 f8 77 ce 4f 2e 1d db bf 8e 13 e2 cd e0 fd c8', + 3072: '1b 15 56 cb 93 5f 17 33 37 70 5f bb 5d 50 1f c1', + 4080: 'ec d0 e9 66 02 be 7f 8d 50 92 81 6c cc f2 c2 e9', + 4096: '02 78 81 fa b4 99 3a 1c 26 20 24 a9 4f ff 3f 61' + } + ), + # Page 8 + ( + '641910833222772a', + { + 0: 'bb f6 09 de 94 13 17 2d 07 66 0c b6 80 71 69 26', + 16: '46 10 1a 6d ab 43 11 5d 6c 52 2b 4f e9 36 04 a9', + 240: 'cb e1 ff f2 1c 96 f3 ee f6 1e 8f e0 54 2c bd f0', + 256: '34 79 38 bf fa 40 09 c5 12 cf b4 03 4b 0d d1 a7', + 496: '78 67 a7 86 d0 0a 71 47 90 4d 76 dd f1 e5 20 e3', + 512: '8d 3e 9e 1c ae fc cc b3 fb f8 d1 8f 64 12 0b 32', + 752: '94 23 37 f8 fd 76 f0 fa e8 c5 2d 79 54 81 06 72', + 768: 'b8 54 8c 10 f5 16 67 f6 e6 0e 18 2f a1 9b 30 f7', + 1008: '02 11 c7 c6 19 0c 9e fd 12 37 c3 4c 8f 2e 06 c4', + 1024: 'bd a6 4f 65 27 6d 2a ac b8 f9 02 12 20 3a 80 8e', + 1520: 'bd 38 20 f7 32 ff b5 3e c1 93 e7 9d 33 e2 7c 73', + 1536: 'd0 16 86 16 86 19 07 d4 82 e3 6c da c8 cf 57 49', + 2032: '97 b0 f0 f2 24 b2 d2 31 71 14 80 8f b0 3a f7 a0', + 2048: 'e5 96 16 e4 69 78 79 39 a0 63 ce ea 9a f9 56 d1', + 3056: 'c4 7e 0d c1 66 09 19 c1 11 01 20 8f 9e 69 aa 1f', + 3072: '5a e4 f1 28 96 b8 37 9a 2a ad 89 b5 b5 53 d6 b0', + 4080: '6b 6b 09 8d 0c 29 3b c2 99 3d 80 bf 05 18 b6 d9', + 4096: '81 70 cc 3c cd 92 a6 98 62 1b 93 9d d3 8f e7 b9' + } + ), + ( + '8b37641910833222772a', + { + 0: 'ab 65 c2 6e dd b2 87 60 0d b2 fd a1 0d 1e 60 5c', + 16: 'bb 75 90 10 c2 96 58 f2 c7 2d 93 a2 d1 6d 29 30', + 240: 'b9 01 e8 03 6e d1 c3 83 cd 3c 4c 4d d0 a6 ab 05', + 256: '3d 25 ce 49 22 92 4c 55 f0 64 94 33 53 d7 8a 6c', + 496: '12 c1 aa 44 bb f8 7e 75 e6 11 f6 9b 2c 38 f4 9b', + 512: '28 f2 b3 43 4b 65 c0 98 77 47 00 44 c6 ea 17 0d', + 752: 'bd 9e f8 22 de 52 88 19 61 34 cf 8a f7 83 93 04', + 768: '67 55 9c 23 f0 52 15 84 70 a2 96 f7 25 73 5a 32', + 1008: '8b ab 26 fb c2 c1 2b 0f 13 e2 ab 18 5e ab f2 41', + 1024: '31 18 5a 6d 69 6f 0c fa 9b 42 80 8b 38 e1 32 a2', + 1520: '56 4d 3d ae 18 3c 52 34 c8 af 1e 51 06 1c 44 b5', + 1536: '3c 07 78 a7 b5 f7 2d 3c 23 a3 13 5c 7d 67 b9 f4', + 2032: 'f3 43 69 89 0f cf 16 fb 51 7d ca ae 44 63 b2 dd', + 2048: '02 f3 1c 81 e8 20 07 31 b8 99 b0 28 e7 91 bf a7', + 3056: '72 da 64 62 83 22 8c 14 30 08 53 70 17 95 61 6f', + 3072: '4e 0a 8c 6f 79 34 a7 88 e2 26 5e 81 d6 d0 c8 f4', + 4080: '43 8d d5 ea fe a0 11 1b 6f 36 b4 b9 38 da 2a 68', + 4096: '5f 6b fc 73 81 58 74 d9 71 00 f0 86 97 93 57 d8' + } + ), + # Page 9 + ( + 'ebb46227c6cc8b37641910833222772a', + { + 0: '72 0c 94 b6 3e df 44 e1 31 d9 50 ca 21 1a 5a 30', + 16: 'c3 66 fd ea cf 9c a8 04 36 be 7c 35 84 24 d2 0b', + 240: 'b3 39 4a 40 aa bf 75 cb a4 22 82 ef 25 a0 05 9f', + 256: '48 47 d8 1d a4 94 2d bc 24 9d ef c4 8c 92 2b 9f', + 496: '08 12 8c 46 9f 27 53 42 ad da 20 2b 2b 58 da 95', + 512: '97 0d ac ef 40 ad 98 72 3b ac 5d 69 55 b8 17 61', + 752: '3c b8 99 93 b0 7b 0c ed 93 de 13 d2 a1 10 13 ac', + 768: 'ef 2d 67 6f 15 45 c2 c1 3d c6 80 a0 2f 4a db fe', + 1008: 'b6 05 95 51 4f 24 bc 9f e5 22 a6 ca d7 39 36 44', + 1024: 'b5 15 a8 c5 01 17 54 f5 90 03 05 8b db 81 51 4e', + 1520: '3c 70 04 7e 8c bc 03 8e 3b 98 20 db 60 1d a4 95', + 1536: '11 75 da 6e e7 56 de 46 a5 3e 2b 07 56 60 b7 70', + 2032: '00 a5 42 bb a0 21 11 cc 2c 65 b3 8e bd ba 58 7e', + 2048: '58 65 fd bb 5b 48 06 41 04 e8 30 b3 80 f2 ae de', + 3056: '34 b2 1a d2 ad 44 e9 99 db 2d 7f 08 63 f0 d9 b6', + 3072: '84 a9 21 8f c3 6e 8a 5f 2c cf be ae 53 a2 7d 25', + 4080: 'a2 22 1a 11 b8 33 cc b4 98 a5 95 40 f0 54 5f 4a', + 4096: '5b be b4 78 7d 59 e5 37 3f db ea 6c 6f 75 c2 9b' + } + ), + ( + 'c109163908ebe51debb46227c6cc8b37641910833222772a', + { + 0: '54 b6 4e 6b 5a 20 b5 e2 ec 84 59 3d c7 98 9d a7', + 16: 'c1 35 ee e2 37 a8 54 65 ff 97 dc 03 92 4f 45 ce', + 240: 'cf cc 92 2f b4 a1 4a b4 5d 61 75 aa bb f2 d2 01', + 256: '83 7b 87 e2 a4 46 ad 0e f7 98 ac d0 2b 94 12 4f', + 496: '17 a6 db d6 64 92 6a 06 36 b3 f4 c3 7a 4f 46 94', + 512: '4a 5f 9f 26 ae ee d4 d4 a2 5f 63 2d 30 52 33 d9', + 752: '80 a3 d0 1e f0 0c 8e 9a 42 09 c1 7f 4e eb 35 8c', + 768: 'd1 5e 7d 5f fa aa bc 02 07 bf 20 0a 11 77 93 a2', + 1008: '34 96 82 bf 58 8e aa 52 d0 aa 15 60 34 6a ea fa', + 1024: 'f5 85 4c db 76 c8 89 e3 ad 63 35 4e 5f 72 75 e3', + 1520: '53 2c 7c ec cb 39 df 32 36 31 84 05 a4 b1 27 9c', + 1536: 'ba ef e6 d9 ce b6 51 84 22 60 e0 d1 e0 5e 3b 90', + 2032: 'e8 2d 8c 6d b5 4e 3c 63 3f 58 1c 95 2b a0 42 07', + 2048: '4b 16 e5 0a bd 38 1b d7 09 00 a9 cd 9a 62 cb 23', + 3056: '36 82 ee 33 bd 14 8b d9 f5 86 56 cd 8f 30 d9 fb', + 3072: '1e 5a 0b 84 75 04 5d 9b 20 b2 62 86 24 ed fd 9e', + 4080: '63 ed d6 84 fb 82 62 82 fe 52 8f 9c 0e 92 37 bc', + 4096: 'e4 dd 2e 98 d6 96 0f ae 0b 43 54 54 56 74 33 91' + } + ), + # Page 10 + ( + '1ada31d5cf688221c109163908ebe51debb46227c6cc8b37641910833222772a', + { + 0: 'dd 5b cb 00 18 e9 22 d4 94 75 9d 7c 39 5d 02 d3', + 16: 'c8 44 6f 8f 77 ab f7 37 68 53 53 eb 89 a1 c9 eb', + 240: 'af 3e 30 f9 c0 95 04 59 38 15 15 75 c3 fb 90 98', + 256: 'f8 cb 62 74 db 99 b8 0b 1d 20 12 a9 8e d4 8f 0e', + 496: '25 c3 00 5a 1c b8 5d e0 76 25 98 39 ab 71 98 ab', + 512: '9d cb c1 83 e8 cb 99 4b 72 7b 75 be 31 80 76 9c', + 752: 'a1 d3 07 8d fa 91 69 50 3e d9 d4 49 1d ee 4e b2', + 768: '85 14 a5 49 58 58 09 6f 59 6e 4b cd 66 b1 06 65', + 1008: '5f 40 d5 9e c1 b0 3b 33 73 8e fa 60 b2 25 5d 31', + 1024: '34 77 c7 f7 64 a4 1b ac ef f9 0b f1 4f 92 b7 cc', + 1520: 'ac 4e 95 36 8d 99 b9 eb 78 b8 da 8f 81 ff a7 95', + 1536: '8c 3c 13 f8 c2 38 8b b7 3f 38 57 6e 65 b7 c4 46', + 2032: '13 c4 b9 c1 df b6 65 79 ed dd 8a 28 0b 9f 73 16', + 2048: 'dd d2 78 20 55 01 26 69 8e fa ad c6 4b 64 f6 6e', + 3056: 'f0 8f 2e 66 d2 8e d1 43 f3 a2 37 cf 9d e7 35 59', + 3072: '9e a3 6c 52 55 31 b8 80 ba 12 43 34 f5 7b 0b 70', + 4080: 'd5 a3 9e 3d fc c5 02 80 ba c4 a6 b5 aa 0d ca 7d', + 4096: '37 0b 1c 1f e6 55 91 6d 97 fd 0d 47 ca 1d 72 b8' + } + ) + ] + + def test_keystream(self): + for tv in self.rfc6229_data: + key = unhexlify(b((tv[0]))) + cipher = ARC4.new(key) + count = 0 + for offset in range(0, 4096+1, 16): + ct = cipher.encrypt(b('\x00')*16) + expected = tv[1].get(offset) + if expected: + expected = unhexlify(b(expected.replace(" ", ''))) + self.assertEqual(ct, expected) + count += 1 + self.assertEqual(count, len(tv[1])) + + +class Drop_Tests(unittest.TestCase): + key = b('\xAA')*16 + data = b('\x00')*5000 + + def setUp(self): + self.cipher = ARC4.new(self.key) + + def test_drop256_encrypt(self): + cipher_drop = ARC4.new(self.key, 256) + ct_drop = cipher_drop.encrypt(self.data[:16]) + ct = self.cipher.encrypt(self.data)[256:256+16] + self.assertEqual(ct_drop, ct) + + def test_drop256_decrypt(self): + cipher_drop = ARC4.new(self.key, 256) + pt_drop = cipher_drop.decrypt(self.data[:16]) + pt = self.cipher.decrypt(self.data)[256:256+16] + self.assertEqual(pt_drop, pt) + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, ARC4.new, b'') + self.assertRaises(ValueError, ARC4.new, b'\x00' * 257) + + +def get_tests(config={}): + from .common import make_stream_tests + tests = make_stream_tests(ARC4, "ARC4", test_data) + tests += list_test_cases(RFC6229_Tests) + tests += list_test_cases(Drop_Tests) + tests.append(KeyLength()) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py new file mode 100644 index 0000000..ca5c603 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_Blowfish.py: Self-test for the Blowfish cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.Blowfish""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.Cipher import Blowfish + +# This is a list of (plaintext, ciphertext, key) tuples. +test_data = [ + # Test vectors from http://www.schneier.com/code/vectors.txt + ('0000000000000000', '4ef997456198dd78', '0000000000000000'), + ('ffffffffffffffff', '51866fd5b85ecb8a', 'ffffffffffffffff'), + ('1000000000000001', '7d856f9a613063f2', '3000000000000000'), + ('1111111111111111', '2466dd878b963c9d', '1111111111111111'), + ('1111111111111111', '61f9c3802281b096', '0123456789abcdef'), + ('0123456789abcdef', '7d0cc630afda1ec7', '1111111111111111'), + ('0000000000000000', '4ef997456198dd78', '0000000000000000'), + ('0123456789abcdef', '0aceab0fc6a0a28d', 'fedcba9876543210'), + ('01a1d6d039776742', '59c68245eb05282b', '7ca110454a1a6e57'), + ('5cd54ca83def57da', 'b1b8cc0b250f09a0', '0131d9619dc1376e'), + ('0248d43806f67172', '1730e5778bea1da4', '07a1133e4a0b2686'), + ('51454b582ddf440a', 'a25e7856cf2651eb', '3849674c2602319e'), + ('42fd443059577fa2', '353882b109ce8f1a', '04b915ba43feb5b6'), + ('059b5e0851cf143a', '48f4d0884c379918', '0113b970fd34f2ce'), + ('0756d8e0774761d2', '432193b78951fc98', '0170f175468fb5e6'), + ('762514b829bf486a', '13f04154d69d1ae5', '43297fad38e373fe'), + ('3bdd119049372802', '2eedda93ffd39c79', '07a7137045da2a16'), + ('26955f6835af609a', 'd887e0393c2da6e3', '04689104c2fd3b2f'), + ('164d5e404f275232', '5f99d04f5b163969', '37d06bb516cb7546'), + ('6b056e18759f5cca', '4a057a3b24d3977b', '1f08260d1ac2465e'), + ('004bd6ef09176062', '452031c1e4fada8e', '584023641aba6176'), + ('480d39006ee762f2', '7555ae39f59b87bd', '025816164629b007'), + ('437540c8698f3cfa', '53c55f9cb49fc019', '49793ebc79b3258f'), + ('072d43a077075292', '7a8e7bfa937e89a3', '4fb05e1515ab73a7'), + ('02fe55778117f12a', 'cf9c5d7a4986adb5', '49e95d6d4ca229bf'), + ('1d9d5c5018f728c2', 'd1abb290658bc778', '018310dc409b26d6'), + ('305532286d6f295a', '55cb3774d13ef201', '1c587f1c13924fef'), + ('0123456789abcdef', 'fa34ec4847b268b2', '0101010101010101'), + ('0123456789abcdef', 'a790795108ea3cae', '1f1f1f1f0e0e0e0e'), + ('0123456789abcdef', 'c39e072d9fac631d', 'e0fee0fef1fef1fe'), + ('ffffffffffffffff', '014933e0cdaff6e4', '0000000000000000'), + ('0000000000000000', 'f21e9a77b71c49bc', 'ffffffffffffffff'), + ('0000000000000000', '245946885754369a', '0123456789abcdef'), + ('ffffffffffffffff', '6b5c5a9c5d9e0a5a', 'fedcba9876543210'), + #('fedcba9876543210', 'f9ad597c49db005e', 'f0'), + #('fedcba9876543210', 'e91d21c1d961a6d6', 'f0e1'), + #('fedcba9876543210', 'e9c2b70a1bc65cf3', 'f0e1d2'), + ('fedcba9876543210', 'be1e639408640f05', 'f0e1d2c3'), + ('fedcba9876543210', 'b39e44481bdb1e6e', 'f0e1d2c3b4'), + ('fedcba9876543210', '9457aa83b1928c0d', 'f0e1d2c3b4a5'), + ('fedcba9876543210', '8bb77032f960629d', 'f0e1d2c3b4a596'), + ('fedcba9876543210', 'e87a244e2cc85e82', 'f0e1d2c3b4a59687'), + ('fedcba9876543210', '15750e7a4f4ec577', 'f0e1d2c3b4a5968778'), + ('fedcba9876543210', '122ba70b3ab64ae0', 'f0e1d2c3b4a596877869'), + ('fedcba9876543210', '3a833c9affc537f6', 'f0e1d2c3b4a5968778695a'), + ('fedcba9876543210', '9409da87a90f6bf2', 'f0e1d2c3b4a5968778695a4b'), + ('fedcba9876543210', '884f80625060b8b4', 'f0e1d2c3b4a5968778695a4b3c'), + ('fedcba9876543210', '1f85031c19e11968', 'f0e1d2c3b4a5968778695a4b3c2d'), + ('fedcba9876543210', '79d9373a714ca34f', 'f0e1d2c3b4a5968778695a4b3c2d1e'), + ('fedcba9876543210', '93142887ee3be15c', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f'), + ('fedcba9876543210', '03429e838ce2d14b', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00'), + ('fedcba9876543210', 'a4299e27469ff67b', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011'), + ('fedcba9876543210', 'afd5aed1c1bc96a8', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f001122'), + ('fedcba9876543210', '10851c0e3858da9f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00112233'), + ('fedcba9876543210', 'e6f51ed79b9db21f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011223344'), + ('fedcba9876543210', '64a6e14afd36b46f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f001122334455'), + ('fedcba9876543210', '80c7d7d45a5479ad', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00112233445566'), + ('fedcba9876543210', '05044b62fa52d080', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011223344556677'), +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, Blowfish.new, bchr(0) * 3, + Blowfish.MODE_ECB) + self.assertRaises(ValueError, Blowfish.new, bchr(0) * 57, + Blowfish.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = Blowfish.new(b'4'*16, Blowfish.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + tests = make_block_tests(Blowfish, "Blowfish", test_data) + tests.append(KeyLength()) + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py new file mode 100644 index 0000000..8bc21fd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/CAST.py: Self-test for the CAST-128 (CAST5) cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.CAST""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.Cipher import CAST + +# This is a list of (plaintext, ciphertext, key) tuples. +test_data = [ + # Test vectors from RFC 2144, B.1 + ('0123456789abcdef', '238b4fe5847e44b2', + '0123456712345678234567893456789a', + '128-bit key'), + + ('0123456789abcdef', 'eb6a711a2c02271b', + '01234567123456782345', + '80-bit key'), + + ('0123456789abcdef', '7ac816d16e9b302e', + '0123456712', + '40-bit key'), +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, CAST.new, bchr(0) * 4, CAST.MODE_ECB) + self.assertRaises(ValueError, CAST.new, bchr(0) * 17, CAST.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = CAST.new(b'4'*16, CAST.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + + tests = make_block_tests(CAST, "CAST", test_data) + tests.append(KeyLength()) + tests.append(TestOutput()) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py new file mode 100644 index 0000000..f118eb6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py @@ -0,0 +1,556 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, is_string +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +class BlockChainingTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + iv_128 = get_tag_random("iv_128", 16) + iv_64 = get_tag_random("iv_64", 8) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_iv(self): + # If not passed, the iv is created randomly + cipher = AES.new(self.key_128, self.aes_mode) + iv1 = cipher.iv + cipher = AES.new(self.key_128, self.aes_mode) + iv2 = cipher.iv + self.assertNotEqual(iv1, iv2) + self.assertEqual(len(iv1), 16) + + # IV can be passed in uppercase or lowercase + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + ct = cipher.encrypt(self.data_128) + + cipher = AES.new(self.key_128, self.aes_mode, iv=self.iv_128) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + cipher = AES.new(self.key_128, self.aes_mode, IV=self.iv_128) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_iv_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv = u'test1234567890-*') + + def test_only_one_iv(self): + # Only one IV/iv keyword allowed + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv=self.iv_128, IV=self.iv_128) + + def test_iv_with_matching_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + b"") + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + self.iv_128[:15]) + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + self.iv_128 + b"0") + + def test_block_size_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_unaligned_data_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + for wrong_length in range(1,16): + self.assertRaises(ValueError, cipher.encrypt, b"5" * wrong_length) + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + for wrong_length in range(1,16): + self.assertRaises(ValueError, cipher.decrypt, b"5" * wrong_length) + + def test_unaligned_data_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + for wrong_length in range(1,8): + self.assertRaises(ValueError, cipher.encrypt, b"5" * wrong_length) + + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + for wrong_length in range(1,8): + self.assertRaises(ValueError, cipher.decrypt, b"5" * wrong_length) + + def test_IV_iv_attributes(self): + data = get_tag_random("data", 16 * 100) + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + getattr(cipher, func)(data) + self.assertEqual(cipher.iv, self.iv_128) + self.assertEqual(cipher.IV, self.iv_128) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + self.iv_128, 7) + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv=self.iv_128, unknown=7) + # But some are only known by the base cipher (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, self.aes_mode, iv=self.iv_128, use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_bytearray(self): + data = b"1" * 128 + data_ba = bytearray(data) + + # Encrypt + key_ba = bytearray(self.key_128) + iv_ba = bytearray(self.iv_128) + + cipher1 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(key_ba, self.aes_mode, iv_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + iv_ba[:3] = b'\xFF\xFF\xFF' + ref2 = cipher2.encrypt(data_ba) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.iv, cipher2.iv) + + # Decrypt + key_ba = bytearray(self.key_128) + iv_ba = bytearray(self.iv_128) + + cipher3 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(key_ba, self.aes_mode, iv_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + iv_ba[:3] = b'\xFF\xFF\xFF' + ref4 = cipher4.decrypt(data_ba) + + self.assertEqual(ref3, ref4) + + def test_memoryview(self): + data = b"1" * 128 + data_mv = memoryview(bytearray(data)) + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + iv_mv = memoryview(bytearray(self.iv_128)) + + cipher1 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(key_mv, self.aes_mode, iv_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + iv_mv[:3] = b'\xFF\xFF\xFF' + ref2 = cipher2.encrypt(data_mv) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.iv, cipher2.iv) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + iv_mv = memoryview(bytearray(self.iv_128)) + + cipher3 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(key_mv, self.aes_mode, iv_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + iv_mv[:3] = b'\xFF\xFF\xFF' + ref4 = cipher4.decrypt(data_mv) + + self.assertEqual(ref3, ref4) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + output = bytearray(128) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + + def test_output_param_same_buffer(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + pt_ba = bytearray(pt) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.encrypt(pt_ba, output=pt_ba) + self.assertEqual(ct, pt_ba) + self.assertEqual(res, None) + + ct_ba = bytearray(ct) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.decrypt(ct_ba, output=ct_ba) + self.assertEqual(pt, ct_ba) + self.assertEqual(res, None) + + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class CbcTests(BlockChainingTests): + aes_mode = AES.MODE_CBC + des3_mode = DES3.MODE_CBC + + +class NistBlockChainingVectors(unittest.TestCase): + + def _do_kat_aes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CBC KAT", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + + cipher = AES.new(tv.key, self.aes_mode, tv.iv) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + # See Section 6.4.2 in AESAVS + def _do_mct_aes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CBC Montecarlo", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, self.aes_mode, tv.iv) + + if direction == '[ENCRYPT]': + cts = [ tv.iv ] + for count in range(1000): + cts.append(cipher.encrypt(tv.plaintext)) + tv.plaintext = cts[-2] + self.assertEqual(cts[-1], tv.ciphertext) + elif direction == '[DECRYPT]': + pts = [ tv.iv] + for count in range(1000): + pts.append(cipher.decrypt(tv.ciphertext)) + tv.ciphertext = pts[-2] + self.assertEqual(pts[-1], tv.plaintext) + else: + assert False + + def _do_tdes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "TDES"), + file_name, + "TDES CBC KAT", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + if hasattr(tv, "keys"): + cipher = DES.new(tv.keys, self.des_mode, tv.iv) + else: + if tv.key1 != tv.key3: + key = tv.key1 + tv.key2 + tv.key3 # Option 3 + else: + key = tv.key1 + tv.key2 # Option 2 + cipher = DES3.new(key, self.des3_mode, tv.iv) + + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + +class NistCbcVectors(NistBlockChainingVectors): + aes_mode = AES.MODE_CBC + des_mode = DES.MODE_CBC + des3_mode = DES3.MODE_CBC + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "CBCGFSbox128.rsp", + "CBCGFSbox192.rsp", + "CBCGFSbox256.rsp", + "CBCKeySbox128.rsp", + "CBCKeySbox192.rsp", + "CBCKeySbox256.rsp", + "CBCVarKey128.rsp", + "CBCVarKey192.rsp", + "CBCVarKey256.rsp", + "CBCVarTxt128.rsp", + "CBCVarTxt192.rsp", + "CBCVarTxt256.rsp", + # MMT + "CBCMMT128.rsp", + "CBCMMT192.rsp", + "CBCMMT256.rsp", + ) +nist_aes_mct_files = ( + "CBCMCT128.rsp", + "CBCMCT192.rsp", + "CBCMCT256.rsp", + ) + +for file_name in nist_aes_kat_mmt_files: + def new_func(self, file_name=file_name): + self._do_kat_aes_test(file_name) + setattr(NistCbcVectors, "test_AES_" + file_name, new_func) + +for file_name in nist_aes_mct_files: + def new_func(self, file_name=file_name): + self._do_mct_aes_test(file_name) + setattr(NistCbcVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TCBCMMT2.rsp", # 2TDES + "TCBCMMT3.rsp", # 3TDES + "TCBCinvperm.rsp", # Single DES + "TCBCpermop.rsp", + "TCBCsubtab.rsp", + "TCBCvarkey.rsp", + "TCBCvartext.rsp", + ) + +for file_name in nist_tdes_files: + def new_func(self, file_name=file_name): + self._do_tdes_test(file_name) + setattr(NistCbcVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST CBC TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CBC test vectors found in Section F.2 + of NIST SP 800-3A""" + + def test_aes_128(self): + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '7649abac8119b246cee98e9b12e9197d' +\ + '5086cb9b507219ee95db113a917678b2' +\ + '73bed6b8e3c1743b7116e69e22229516' +\ + '3ff1caa1681fac09120eca307586e1a7' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192(self): + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '4f021db243bc633d7178183a9fa071e8' +\ + 'b4d9ada9ad7dedf4e5e738763f69145a' +\ + '571b242012fb7ae07fa9baac3df102e0' +\ + '08b0e27988598881d920a9e64f5615cd' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256(self): + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'f58c4c04d6e5f1ba779eabfb5f7bfbd6' +\ + '9cfc4e967edb808d679f777bc6702c7d' +\ + '39f23369a9d9bacfa530e26304231461' +\ + 'b2eb05e2c39be9fcda6c19078c6a9d1b' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CbcTests) + if config.get('slow_tests'): + tests += list_test_cases(NistCbcVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py new file mode 100644 index 0000000..2615720 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py @@ -0,0 +1,936 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class CcmTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # If not passed, the nonce is created randomly + cipher = AES.new(self.key_128, AES.MODE_CCM) + nonce1 = cipher.nonce + cipher = AES.new(self.key_128, AES.MODE_CCM) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 11) + self.assertNotEqual(nonce1, nonce2) + + cipher = AES.new(self.key_128, AES.MODE_CCM, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + nonce=u'test12345678') + + def test_nonce_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=b"") + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=bchr(1) * 6) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=bchr(1) * 14) + for x in range(7, 13 + 1): + AES.new(self.key_128, AES.MODE_CCM, nonce=bchr(1) * x) + + def test_block_size(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 11 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_CCM).nonce + nonce2 = AES.new(self.key_128, AES.MODE_CCM).nonce + self.assertEqual(len(nonce1), 11) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + for mac_len in range(3, 17 + 1, 2): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, mac_len=mac_len) + + # Valid MAC length + for mac_len in range(4, 16 + 1, 2): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_longer_assoc_data_than_declared(self): + # More than zero + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=0) + self.assertRaises(ValueError, cipher.update, b"1") + + # Too large + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=15) + self.assertRaises(ValueError, cipher.update, self.data) + + def test_shorter_assoc_data_than_expected(self): + DATA_LEN = len(self.data) + + # With plaintext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.encrypt, self.data) + + # With empty plaintext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.digest) + + # With ciphertext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.decrypt, self.data) + + # With empty ciphertext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.verify, mac) + + def test_shorter_and_longer_plaintext_than_declared(self): + DATA_LEN = len(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN + 1) + cipher.encrypt(self.data) + self.assertRaises(ValueError, cipher.digest) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN - 1) + self.assertRaises(ValueError, cipher.encrypt, self.data) + + def test_shorter_ciphertext_than_declared(self): + DATA_LEN = len(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN + 1) + cipher.decrypt(ct) + self.assertRaises(ValueError, cipher.verify, mac) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN - 1) + self.assertRaises(ValueError, cipher.decrypt, ct) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=127, assoc_len=127) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=127, assoc_len=127) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_CCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_CCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_CCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_CCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_CCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_CCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + + pt = b'5' * 16 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(15) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class CcmFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + for assoc_len in (None, 0): + for msg_len in (None, len(self.data)): + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + for assoc_len in (None, len(self.data)): + for msg_len in (None, 0): + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + for assoc_len in (None, len(self.data)): + for msg_len in (None, len(self.data)): + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + # Only possible if msg_len is declared in advance + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data, + self.data + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + msg_len=64, + assoc_len=assoc_len) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_multiple_encrypt_decrypt_without_msg_len(self): + # Once per method, with or without assoc. data + for method_name in "encrypt", "decrypt": + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + method = getattr(cipher, method_name) + method(self.data) + self.assertRaises(TypeError, method, self.data) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + msg_len=32) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +class TestVectors(unittest.TestCase): + """Class exercising the CCM test vectors found in Appendix C + of NIST SP 800-38C and in RFC 3610""" + + # List of test vectors, each made up of: + # - authenticated data + # - plaintext + # - ciphertext + # - MAC + # - AES key + # - nonce + test_vectors_hex = [ + # NIST SP 800 38C + ( '0001020304050607', + '20212223', + '7162015b', + '4dac255d', + '404142434445464748494a4b4c4d4e4f', + '10111213141516'), + ( '000102030405060708090a0b0c0d0e0f', + '202122232425262728292a2b2c2d2e2f', + 'd2a1f0e051ea5f62081a7792073d593d', + '1fc64fbfaccd', + '404142434445464748494a4b4c4d4e4f', + '1011121314151617'), + ( '000102030405060708090a0b0c0d0e0f10111213', + '202122232425262728292a2b2c2d2e2f3031323334353637', + 'e3b201a9f5b71a7a9b1ceaeccd97e70b6176aad9a4428aa5', + '484392fbc1b09951', + '404142434445464748494a4b4c4d4e4f', + '101112131415161718191a1b'), + ( (''.join(["%02X" % (x*16+y) for x in range(0,16) for y in range(0,16)]))*256, + '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + '69915dad1e84c6376a68c2967e4dab615ae0fd1faec44cc484828529463ccf72', + 'b4ac6bec93e8598e7f0dadbcea5b', + '404142434445464748494a4b4c4d4e4f', + '101112131415161718191a1b1c'), + # RFC3610 + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e', + '588c979a61c663d2f066d0c2c0f989806d5f6b61dac384', + '17e8d12cfdf926e0', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000003020100a0a1a2a3a4a5'), + ( + '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '72c91a36e135f8cf291ca894085c87e3cc15c439c9e43a3b', + 'a091d56e10400916', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000004030201a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '51b1e5f44a197d1da46b0f8e2d282ae871e838bb64da859657', + '4adaa76fbd9fb0c5', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000005040302A0A1A2A3A4A5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e', + 'a28c6865939a9a79faaa5c4c2a9d4a91cdac8c', + '96c861b9c9e61ef1', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000006050403a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'dcf1fb7b5d9e23fb9d4e131253658ad86ebdca3e', + '51e83f077d9c2d93', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000007060504a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '6fc1b011f006568b5171a42d953d469b2570a4bd87', + '405a0443ac91cb94', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000008070605a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e', + '0135d1b2c95f41d5d1d4fec185d166b8094e999dfed96c', + '048c56602c97acbb7490', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000009080706a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '7b75399ac0831dd2f0bbd75879a2fd8f6cae6b6cd9b7db24', + 'c17b4433f434963f34b4', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000a090807a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '82531a60cc24945a4b8279181ab5c84df21ce7f9b73f42e197', + 'ea9c07e56b5eb17e5f4e', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000b0a0908a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e', + '07342594157785152b074098330abb141b947b', + '566aa9406b4d999988dd', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000c0b0a09a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f', + '676bb20380b0e301e8ab79590a396da78b834934', + 'f53aa2e9107a8b6c022c', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000d0c0b0aa0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f20', + 'c0ffa0d6f05bdb67f24d43a4338d2aa4bed7b20e43', + 'cd1aa31662e7ad65d6db', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000e0d0c0ba0a1a2a3a4a5'), + ( '0be1a88bace018b1', + '08e8cf97d820ea258460e96ad9cf5289054d895ceac47c', + '4cb97f86a2a4689a877947ab8091ef5386a6ffbdd080f8', + 'e78cf7cb0cddd7b3', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00412b4ea9cdbe3c9696766cfa'), + ( '63018f76dc8a1bcb', + '9020ea6f91bdd85afa0039ba4baff9bfb79c7028949cd0ec', + '4ccb1e7ca981befaa0726c55d378061298c85c92814abc33', + 'c52ee81d7d77c08a', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0033568ef7b2633c9696766cfa'), + ( 'aa6cfa36cae86b40', + 'b916e0eacc1c00d7dcec68ec0b3bbb1a02de8a2d1aa346132e', + 'b1d23a2220ddc0ac900d9aa03c61fcf4a559a4417767089708', + 'a776796edb723506', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00103fe41336713c9696766cfa'), + ( 'd0d0735c531e1becf049c244', + '12daac5630efa5396f770ce1a66b21f7b2101c', + '14d253c3967b70609b7cbb7c49916028324526', + '9a6f49975bcadeaf', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00764c63b8058e3c9696766cfa'), + ( '77b60f011c03e1525899bcae', + 'e88b6a46c78d63e52eb8c546efb5de6f75e9cc0d', + '5545ff1a085ee2efbf52b2e04bee1e2336c73e3f', + '762c0c7744fe7e3c', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00f8b678094e3b3c9696766cfa'), + ( 'cd9044d2b71fdb8120ea60c0', + '6435acbafb11a82e2f071d7ca4a5ebd93a803ba87f', + '009769ecabdf48625594c59251e6035722675e04c8', + '47099e5ae0704551', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00d560912d3f703c9696766cfa'), + ( 'd85bc7e69f944fb8', + '8a19b950bcf71a018e5e6701c91787659809d67dbedd18', + 'bc218daa947427b6db386a99ac1aef23ade0b52939cb6a', + '637cf9bec2408897c6ba', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0042fff8f1951c3c9696766cfa'), + ( '74a0ebc9069f5b37', + '1761433c37c5a35fc1f39f406302eb907c6163be38c98437', + '5810e6fd25874022e80361a478e3e9cf484ab04f447efff6', + 'f0a477cc2fc9bf548944', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00920f40e56cdc3c9696766cfa'), + ( '44a3aa3aae6475ca', + 'a434a8e58500c6e41530538862d686ea9e81301b5ae4226bfa', + 'f2beed7bc5098e83feb5b31608f8e29c38819a89c8e776f154', + '4d4151a4ed3a8b87b9ce', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0027ca0c7120bc3c9696766cfa'), + ( 'ec46bb63b02520c33c49fd70', + 'b96b49e21d621741632875db7f6c9243d2d7c2', + '31d750a09da3ed7fddd49a2032aabf17ec8ebf', + '7d22c8088c666be5c197', + 'd7828d13b2b0bdc325a76236df93cc6b', + '005b8ccbcd9af83c9696766cfa'), + ( '47a65ac78b3d594227e85e71', + 'e2fcfbb880442c731bf95167c8ffd7895e337076', + 'e882f1dbd38ce3eda7c23f04dd65071eb41342ac', + 'df7e00dccec7ae52987d', + 'd7828d13b2b0bdc325a76236df93cc6b', + '003ebe94044b9a3c9696766cfa'), + ( '6e37a6ef546d955d34ab6059', + 'abf21c0b02feb88f856df4a37381bce3cc128517d4', + 'f32905b88a641b04b9c9ffb58cc390900f3da12ab1', + '6dce9e82efa16da62059', + 'd7828d13b2b0bdc325a76236df93cc6b', + '008d493b30ae8b3c9696766cfa'), + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, **extra_params): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._extra_params = extra_params + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_ccm_test.json", + "Wycheproof AES CCM", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt CCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) not in range(7, 13 + 1, 2) and "Length of parameter 'nonce'" in str(e): + assert not tv.valid + return + if tv.tag_size not in range(4, 16 + 1, 2) and "Parameter 'mac_len'" in str(e): + assert not tv.valid + return + raise e + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt CCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) not in range(7, 13 + 1, 2) and "Length of parameter 'nonce'" in str(e): + assert not tv.valid + return + if tv.tag_size not in range(4, 16 + 1, 2) and "Parameter 'mac_len'" in str(e): + assert not tv.valid + return + raise e + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt CCM Test #" + str(tv.id) + if len(tv.iv) not in range(7, 13 + 1, 2) or len(tv.ct) == 0: + return + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(CcmTests) + tests += list_test_cases(CcmFSMTests) + tests += [TestVectors()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py new file mode 100644 index 0000000..673bf8e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py @@ -0,0 +1,411 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, is_string +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class CfbTests(BlockChainingTests): + + aes_mode = AES.MODE_CFB + des3_mode = DES3.MODE_CFB + + # Redefine test_unaligned_data_128/64 + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + # Extra + + def test_segment_size_128(self): + for bits in range(8, 129, 8): + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, + segment_size=bits) + + for bits in 0, 7, 9, 127, 129: + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CFB, + self.iv_128, + segment_size=bits) + + def test_segment_size_64(self): + for bits in range(8, 65, 8): + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, + segment_size=bits) + + for bits in 0, 7, 9, 63, 65: + self.assertRaises(ValueError, DES3.new, self.key_192, AES.MODE_CFB, + self.iv_64, + segment_size=bits) + + +class NistCfbVectors(unittest.TestCase): + + def _do_kat_aes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CFB%d KAT" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_CFB, tv.iv, + segment_size=segment_size) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + # See Section 6.4.5 in AESAVS + def _do_mct_aes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CFB%d Montecarlo" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + assert(segment_size in (8, 128)) + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_CFB, tv.iv, + segment_size=segment_size) + + def get_input(input_text, output_seq, j): + # CFB128 + if segment_size == 128: + if j >= 2: + return output_seq[-2] + return [input_text, tv.iv][j] + # CFB8 + if j == 0: + return input_text + elif j <= 16: + return tv.iv[j - 1:j] + return output_seq[j - 17] + + if direction == '[ENCRYPT]': + cts = [] + for j in range(1000): + plaintext = get_input(tv.plaintext, cts, j) + cts.append(cipher.encrypt(plaintext)) + self.assertEqual(cts[-1], tv.ciphertext) + elif direction == '[DECRYPT]': + pts = [] + for j in range(1000): + ciphertext = get_input(tv.ciphertext, pts, j) + pts.append(cipher.decrypt(ciphertext)) + self.assertEqual(pts[-1], tv.plaintext) + else: + assert False + + def _do_tdes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "TDES"), + file_name, + "TDES CFB%d KAT" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + if hasattr(tv, "keys"): + cipher = DES.new(tv.keys, DES.MODE_CFB, tv.iv, + segment_size=segment_size) + else: + if tv.key1 != tv.key3: + key = tv.key1 + tv.key2 + tv.key3 # Option 3 + else: + key = tv.key1 + tv.key2 # Option 2 + cipher = DES3.new(key, DES3.MODE_CFB, tv.iv, + segment_size=segment_size) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "CFB?GFSbox128.rsp", + "CFB?GFSbox192.rsp", + "CFB?GFSbox256.rsp", + "CFB?KeySbox128.rsp", + "CFB?KeySbox192.rsp", + "CFB?KeySbox256.rsp", + "CFB?VarKey128.rsp", + "CFB?VarKey192.rsp", + "CFB?VarKey256.rsp", + "CFB?VarTxt128.rsp", + "CFB?VarTxt192.rsp", + "CFB?VarTxt256.rsp", + # MMT + "CFB?MMT128.rsp", + "CFB?MMT192.rsp", + "CFB?MMT256.rsp", + ) +nist_aes_mct_files = ( + "CFB?MCT128.rsp", + "CFB?MCT192.rsp", + "CFB?MCT256.rsp", + ) + +for file_gen_name in nist_aes_kat_mmt_files: + for bits in "8", "128": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_kat_aes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_AES_" + file_name, new_func) + +for file_gen_name in nist_aes_mct_files: + for bits in "8", "128": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_mct_aes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TCFB?MMT2.rsp", # 2TDES + "TCFB?MMT3.rsp", # 3TDES + "TCFB?invperm.rsp", # Single DES + "TCFB?permop.rsp", + "TCFB?subtab.rsp", + "TCFB?varkey.rsp", + "TCFB?vartext.rsp", + ) + +for file_gen_name in nist_tdes_files: + for bits in "8", "64": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_tdes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST CBC TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CFB test vectors found in Section F.3 + of NIST SP 800-3A""" + + def test_aes_128_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = '3b79424c9c0dd436bace9e0ed4586a4f32b9' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = 'cda2521ef0a905ca44cd057cbf0d47a0678a' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = 'dc1f1a8520a64db55fcc8ac554844e889700' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_128_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '3b3fd92eb72dad20333449f8e83cfb4a' +\ + 'c8a64537a0b3a93fcde3cdad9f1ce58b' +\ + '26751f67a3cbb140b1808cf187a4f4df' +\ + 'c04b05357c5d1c0eeac4c66f9ff7f2e6' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'cdc80d6fddf18cab34c25909c99a4174' +\ + '67ce7f7f81173621961a2b70171d3d7a' +\ + '2e1e8a1dd59b88b1c8e60fed1efac4c9' +\ + 'c05f9f9ca9834fa042ae8fba584b09ff' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + + ciphertext = 'dc7e84bfda79164b7ecd8486985d3860' +\ + '39ffed143b28b1c832113c6331e5407b' +\ + 'df10132415e54b92a13ed0a8267ae2f9' +\ + '75a385741ab9cef82031623d55b1e471' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CfbTests) + if config.get('slow_tests'): + tests += list_test_cases(NistCfbVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py new file mode 100644 index 0000000..ef5be5d --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py @@ -0,0 +1,472 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128, SHA256 +from Cryptodome.Util import Counter + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +class CtrTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + nonce_32 = get_tag_random("nonce_32", 4) + nonce_64 = get_tag_random("nonce_64", 8) + ctr_64 = Counter.new(32, prefix=nonce_32) + ctr_128 = Counter.new(64, prefix=nonce_64) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_invalid_counter_parameter(self): + # Counter object is required for ciphers with short block size + self.assertRaises(TypeError, DES3.new, self.key_192, AES.MODE_CTR) + # Positional arguments are not allowed (Counter must be passed as + # keyword) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, self.ctr_128) + + def test_nonce_attribute(self): + # Nonce attribute is the prefix passed to Counter (DES3) + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + self.assertEqual(cipher.nonce, self.nonce_32) + + # Nonce attribute is the prefix passed to Counter (AES) + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(cipher.nonce, self.nonce_64) + + # Nonce attribute is not defined if suffix is used in Counter + counter = Counter.new(64, prefix=self.nonce_32, suffix=self.nonce_32) + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertFalse(hasattr(cipher, "nonce")) + + def test_nonce_parameter(self): + # Nonce parameter becomes nonce attribute + cipher1 = AES.new(self.key_128, AES.MODE_CTR, nonce=self.nonce_64) + self.assertEqual(cipher1.nonce, self.nonce_64) + + counter = Counter.new(64, prefix=self.nonce_64, initial_value=0) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Nonce is implicitly created (for AES) when no parameters are passed + nonce1 = AES.new(self.key_128, AES.MODE_CTR).nonce + nonce2 = AES.new(self.key_128, AES.MODE_CTR).nonce + self.assertNotEqual(nonce1, nonce2) + self.assertEqual(len(nonce1), 8) + + # Nonce can be zero-length + cipher = AES.new(self.key_128, AES.MODE_CTR, nonce=b"") + self.assertEqual(b"", cipher.nonce) + cipher.encrypt(b'0'*300) + + # Nonce and Counter are mutually exclusive + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, nonce=self.nonce_64) + + def test_initial_value_parameter(self): + # Test with nonce parameter + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=0xFFFF) + counter = Counter.new(64, prefix=self.nonce_64, initial_value=0xFFFF) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Test without nonce parameter + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + initial_value=0xFFFF) + counter = Counter.new(64, prefix=cipher1.nonce, initial_value=0xFFFF) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Initial_value and Counter are mutually exclusive + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, initial_value=0) + + def test_initial_value_bytes_parameter(self): + # Same result as when passing an integer + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=b"\x00"*6+b"\xFF\xFF") + cipher2 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=0xFFFF) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Fail if the iv is too large + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + initial_value=b"5"*17) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=b"5"*9) + + # Fail if the iv is too short + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + initial_value=b"5"*15) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=b"5"*7) + + def test_iv_with_matching_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + counter=Counter.new(120)) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + counter=Counter.new(136)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + 7, counter=self.ctr_128) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, unknown=7) + # But some are only known by the base cipher (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128, use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_wrap_around(self): + # Counter is only 8 bits, so we can only encrypt/decrypt 256 blocks (=4096 bytes) + counter = Counter.new(8, prefix=bchr(9) * 15) + max_bytes = 4096 + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + cipher.encrypt(b'9' * max_bytes) + self.assertRaises(OverflowError, cipher.encrypt, b'9') + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertRaises(OverflowError, cipher.encrypt, b'9' * (max_bytes + 1)) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + cipher.decrypt(b'9' * max_bytes) + self.assertRaises(OverflowError, cipher.decrypt, b'9') + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertRaises(OverflowError, cipher.decrypt, b'9' * (max_bytes + 1)) + + def test_bytearray(self): + data = b"1" * 16 + iv = b"\x00" * 6 + b"\xFF\xFF" + + # Encrypt + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=iv) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(self.key_128, AES.MODE_CTR, + nonce=bytearray(self.nonce_64), + initial_value=bytearray(iv)) + ref2 = cipher2.encrypt(bytearray(data)) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + cipher3 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=iv) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(self.key_128, AES.MODE_CTR, + nonce=bytearray(self.nonce_64), + initial_value=bytearray(iv)) + ref4 = cipher4.decrypt(bytearray(data)) + + self.assertEqual(ref3, ref4) + + def test_very_long_data(self): + cipher = AES.new(b'A' * 32, AES.MODE_CTR, nonce=b'') + ct = cipher.encrypt(b'B' * 1000000) + digest = SHA256.new(ct).hexdigest() + self.assertEqual(digest, "96204fc470476561a3a8f3b6fe6d24be85c87510b638142d1d0fb90989f8a6a6") + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + output = bytearray(128) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CTR test vectors found in Section F.5 + of NIST SP 800-38A""" + + def test_aes_128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '874d6191b620e3261bef6864990db6ce' +\ + '9806f66b7970fdff8617187bb9fffdff' +\ + '5ae4df3edbd5d35e5b4f09020db03eab' +\ + '1e031dda2fbe03d1792170a0f3009cee' + key = '2b7e151628aed2a6abf7158809cf4f3c' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '1abc932417521ca24f2b0459fe7e6e0b' +\ + '090339ec0aa6faefd5ccc2c6f4ce8e94' +\ + '1e36b26bd1ebc670d1bd1d665620abf7' +\ + '4f78a7f6d29809585a97daec58c6b050' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '601ec313775789a5b7a7f504bbf3d228' +\ + 'f443e3ca4d62b59aca84e990cacaf5c5' +\ + '2b0930daa23de94ce87017ba2d84988d' +\ + 'dfc9c58db67aada613c2dd08457941a6' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +class RFC3686TestVectors(unittest.TestCase): + + # Each item is a test vector with: + # - plaintext + # - ciphertext + # - key (AES 128, 192 or 256 bits) + # - counter prefix (4 byte nonce + 8 byte nonce) + data = ( + ('53696e676c6520626c6f636b206d7367', + 'e4095d4fb7a7b3792d6175a3261311b8', + 'ae6852f8121067cc4bf7a5765577f39e', + '000000300000000000000000'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '5104a106168a72d9790d41ee8edad388eb2e1efc46da57c8fce630df9141be28', + '7e24067817fae0d743d6ce1f32539163', + '006cb6dbc0543b59da48d90b'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + 'c1cf48a89f2ffdd9cf4652e9efdb72d74540a42bde6d7836d59a5ceaaef3105325b2072f', + '7691be035e5020a8ac6e618529f9a0dc', + '00e0017b27777f3f4a1786f0'), + ('53696e676c6520626c6f636b206d7367', + '4b55384fe259c9c84e7935a003cbe928', + '16af5b145fc9f579c175f93e3bfb0eed863d06ccfdb78515', + '0000004836733c147d6d93cb'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '453243fc609b23327edfaafa7131cd9f8490701c5ad4a79cfc1fe0ff42f4fb00', + '7c5cb2401b3dc33c19e7340819e0f69c678c3db8e6f6a91a', + '0096b03b020c6eadc2cb500d'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + '96893fc55e5c722f540b7dd1ddf7e758d288bc95c69165884536c811662f2188abee0935', + '02bf391ee8ecb159b959617b0965279bf59b60a786d3e0fe', + '0007bdfd5cbd60278dcc0912'), + ('53696e676c6520626c6f636b206d7367', + '145ad01dbf824ec7560863dc71e3e0c0', + '776beff2851db06f4c8a0542c8696f6c6a81af1eec96b4d37fc1d689e6c1c104', + '00000060db5672c97aa8f0b2'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'f05e231b3894612c49ee000b804eb2a9b8306b508f839d6a5530831d9344af1c', + 'f6d66d6bd52d59bb0796365879eff886c66dd51a5b6a99744b50590c87a23884', + '00faac24c1585ef15a43d875'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + 'eb6c52821d0bbbf7ce7594462aca4faab407df866569fd07f48cc0b583d6071f1ec0e6b8', + 'ff7a617ce69148e4f1726e2f43581de2aa62d9f805532edff1eed687fb54153d', + '001cc5b751a51d70a1c11148') + ) + + bindata = [] + for tv in data: + bindata.append([unhexlify(x) for x in tv]) + + def runTest(self): + for pt, ct, key, prefix in self.bindata: + counter = Counter.new(32, prefix=prefix) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + result = cipher.encrypt(pt) + self.assertEqual(hexlify(ct), hexlify(result)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CtrTests) + tests += list_test_cases(SP800TestVectors) + tests += [ RFC3686TestVectors() ] + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py new file mode 100644 index 0000000..92c6f3c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py @@ -0,0 +1,529 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os +import re +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import b, tobytes, bchr +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import ChaCha20 + + +class ChaCha20Test(unittest.TestCase): + + def test_new_positive(self): + cipher = ChaCha20.new(key=b("0")*32, nonce=b"0"*8) + self.assertEqual(cipher.nonce, b"0" * 8) + cipher = ChaCha20.new(key=b("0")*32, nonce=b"0"*12) + self.assertEqual(cipher.nonce, b"0" * 12) + + def test_new_negative(self): + new = ChaCha20.new + self.assertRaises(TypeError, new) + self.assertRaises(TypeError, new, nonce=b("0")) + self.assertRaises(ValueError, new, nonce=b("0")*8, key=b("0")) + self.assertRaises(ValueError, new, nonce=b("0"), key=b("0")*32) + + def test_default_nonce(self): + cipher1 = ChaCha20.new(key=bchr(1) * 32) + cipher2 = ChaCha20.new(key=bchr(1) * 32) + self.assertEqual(len(cipher1.nonce), 8) + self.assertNotEqual(cipher1.nonce, cipher2.nonce) + + def test_nonce(self): + key = b'A' * 32 + + nonce1 = b'P' * 8 + cipher1 = ChaCha20.new(key=key, nonce=nonce1) + self.assertEqual(nonce1, cipher1.nonce) + + nonce2 = b'Q' * 12 + cipher2 = ChaCha20.new(key=key, nonce=nonce2) + self.assertEqual(nonce2, cipher2.nonce) + + def test_eiter_encrypt_or_decrypt(self): + """Verify that a cipher cannot be used for both decrypting and encrypting""" + + c1 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c1.encrypt(b("8")) + self.assertRaises(TypeError, c1.decrypt, b("9")) + + c2 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c2.decrypt(b("8")) + self.assertRaises(TypeError, c2.encrypt, b("9")) + + def test_round_trip(self): + pt = b("A") * 1024 + c1 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c2 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + ct = c1.encrypt(pt) + self.assertEqual(c2.decrypt(ct), pt) + + self.assertEqual(c1.encrypt(b("")), b("")) + self.assertEqual(c2.decrypt(b("")), b("")) + + def test_streaming(self): + """Verify that an arbitrary number of bytes can be encrypted/decrypted""" + from Cryptodome.Hash import SHA1 + + segments = (1, 3, 5, 7, 11, 17, 23) + total = sum(segments) + + pt = b("") + while len(pt) < total: + pt += SHA1.new(pt).digest() + + cipher1 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + ct = cipher1.encrypt(pt) + + cipher2 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + cipher3 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + idx = 0 + for segment in segments: + self.assertEqual(cipher2.decrypt(ct[idx:idx+segment]), pt[idx:idx+segment]) + self.assertEqual(cipher3.encrypt(pt[idx:idx+segment]), ct[idx:idx+segment]) + idx += segment + + def test_seek(self): + cipher1 = ChaCha20.new(key=b("9") * 32, nonce=b("e") * 8) + + offset = 64 * 900 + 7 + pt = b("1") * 64 + + cipher1.encrypt(b("0") * offset) + ct1 = cipher1.encrypt(pt) + + cipher2 = ChaCha20.new(key=b("9") * 32, nonce=b("e") * 8) + cipher2.seek(offset) + ct2 = cipher2.encrypt(pt) + + self.assertEqual(ct1, ct2) + + def test_seek_tv(self): + # Test Vector #4, A.1 from + # http://tools.ietf.org/html/draft-nir-cfrg-chacha20-poly1305-04 + key = bchr(0) + bchr(255) + bchr(0) * 30 + nonce = bchr(0) * 8 + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.seek(64 * 2) + expected_key_stream = unhexlify(b( + "72d54dfbf12ec44b362692df94137f32" + "8fea8da73990265ec1bbbea1ae9af0ca" + "13b25aa26cb4a648cb9b9d1be65b2c09" + "24a66c54d545ec1b7374f4872e99f096" + )) + ct = cipher.encrypt(bchr(0) * len(expected_key_stream)) + self.assertEqual(expected_key_stream, ct) + + def test_rfc7539(self): + # from https://tools.ietf.org/html/rfc7539 Annex A.1 + # Each item is: key, nonce, block #, plaintext, ciphertext + tvs = [ + # Test Vector #1 + ( + "00"*32, + "00"*12, + 0, + "00"*16*4, + "76b8e0ada0f13d90405d6ae55386bd28" + "bdd219b8a08ded1aa836efcc8b770dc7" + "da41597c5157488d7724e03fb8d84a37" + "6a43b8f41518a11cc387b669b2ee6586" + ), + # Test Vector #2 + ( + "00"*31 + "01", + "00"*11 + "02", + 1, + "416e79207375626d697373696f6e2074" + "6f20746865204945544620696e74656e" + "6465642062792074686520436f6e7472" + "696275746f7220666f72207075626c69" + "636174696f6e20617320616c6c206f72" + "2070617274206f6620616e2049455446" + "20496e7465726e65742d447261667420" + "6f722052464320616e6420616e792073" + "746174656d656e74206d616465207769" + "7468696e2074686520636f6e74657874" + "206f6620616e20494554462061637469" + "7669747920697320636f6e7369646572" + "656420616e20224945544620436f6e74" + "7269627574696f6e222e205375636820" + "73746174656d656e747320696e636c75" + "6465206f72616c2073746174656d656e" + "747320696e2049455446207365737369" + "6f6e732c2061732077656c6c20617320" + "7772697474656e20616e6420656c6563" + "74726f6e696320636f6d6d756e696361" + "74696f6e73206d61646520617420616e" + "792074696d65206f7220706c6163652c" + "20776869636820617265206164647265" + "7373656420746f", + "a3fbf07df3fa2fde4f376ca23e827370" + "41605d9f4f4f57bd8cff2c1d4b7955ec" + "2a97948bd3722915c8f3d337f7d37005" + "0e9e96d647b7c39f56e031ca5eb6250d" + "4042e02785ececfa4b4bb5e8ead0440e" + "20b6e8db09d881a7c6132f420e527950" + "42bdfa7773d8a9051447b3291ce1411c" + "680465552aa6c405b7764d5e87bea85a" + "d00f8449ed8f72d0d662ab052691ca66" + "424bc86d2df80ea41f43abf937d3259d" + "c4b2d0dfb48a6c9139ddd7f76966e928" + "e635553ba76c5c879d7b35d49eb2e62b" + "0871cdac638939e25e8a1e0ef9d5280f" + "a8ca328b351c3c765989cbcf3daa8b6c" + "cc3aaf9f3979c92b3720fc88dc95ed84" + "a1be059c6499b9fda236e7e818b04b0b" + "c39c1e876b193bfe5569753f88128cc0" + "8aaa9b63d1a16f80ef2554d7189c411f" + "5869ca52c5b83fa36ff216b9c1d30062" + "bebcfd2dc5bce0911934fda79a86f6e6" + "98ced759c3ff9b6477338f3da4f9cd85" + "14ea9982ccafb341b2384dd902f3d1ab" + "7ac61dd29c6f21ba5b862f3730e37cfd" + "c4fd806c22f221" + ), + # Test Vector #3 + ( + "1c9240a5eb55d38af333888604f6b5f0" + "473917c1402b80099dca5cbc207075c0", + "00"*11 + "02", + 42, + "2754776173206272696c6c69672c2061" + "6e642074686520736c6974687920746f" + "7665730a446964206779726520616e64" + "2067696d626c6520696e207468652077" + "6162653a0a416c6c206d696d73792077" + "6572652074686520626f726f676f7665" + "732c0a416e6420746865206d6f6d6520" + "7261746873206f757467726162652e", + "62e6347f95ed87a45ffae7426f27a1df" + "5fb69110044c0d73118effa95b01e5cf" + "166d3df2d721caf9b21e5fb14c616871" + "fd84c54f9d65b283196c7fe4f60553eb" + "f39c6402c42234e32a356b3e764312a6" + "1a5532055716ead6962568f87d3f3f77" + "04c6a8d1bcd1bf4d50d6154b6da731b1" + "87b58dfd728afa36757a797ac188d1" + ) + ] + + for tv in tvs: + key = unhexlify(tv[0]) + nonce = unhexlify(tv[1]) + offset = tv[2] * 64 + pt = unhexlify(tv[3]) + ct_expect = unhexlify(tv[4]) + + cipher = ChaCha20.new(key=key, nonce=nonce) + if offset != 0: + cipher.seek(offset) + ct = cipher.encrypt(pt) + assert(ct == ct_expect) + + +class XChaCha20Test(unittest.TestCase): + + # From https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + + def test_hchacha20(self): + # Section 2.2.1 + + from Cryptodome.Cipher.ChaCha20 import _HChaCha20 + + key = b"00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f" + key = unhexlify(key.replace(b":", b"")) + + nonce = b"00:00:00:09:00:00:00:4a:00:00:00:00:31:41:59:27" + nonce = unhexlify(nonce.replace(b":", b"")) + + subkey = _HChaCha20(key, nonce) + + expected = b"82413b42 27b27bfe d30e4250 8a877d73 a0f9e4d5 8a74a853 c12ec413 26d3ecdc" + expected = unhexlify(expected.replace(b" ", b"")) + + self.assertEqual(subkey, expected) + + def test_nonce(self): + key = b'A' * 32 + nonce = b'P' * 24 + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertEqual(nonce, cipher.nonce) + + def test_encrypt(self): + # Section A.3.2 + + pt = b""" + 5468652064686f6c65202870726f6e6f756e6365642022646f6c652229206973 + 20616c736f206b6e6f776e2061732074686520417369617469632077696c6420 + 646f672c2072656420646f672c20616e642077686973746c696e6720646f672e + 2049742069732061626f7574207468652073697a65206f662061204765726d61 + 6e20736865706865726420627574206c6f6f6b73206d6f7265206c696b652061 + 206c6f6e672d6c656767656420666f782e205468697320686967686c7920656c + 757369766520616e6420736b696c6c6564206a756d70657220697320636c6173 + 736966696564207769746820776f6c7665732c20636f796f7465732c206a6163 + 6b616c732c20616e6420666f78657320696e20746865207461786f6e6f6d6963 + 2066616d696c792043616e696461652e""" + pt = unhexlify(pt.replace(b"\n", b"").replace(b" ", b"")) + + key = unhexlify(b"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") + iv = unhexlify(b"404142434445464748494a4b4c4d4e4f5051525354555658") + + ct = b""" + 7d0a2e6b7f7c65a236542630294e063b7ab9b555a5d5149aa21e4ae1e4fbce87 + ecc8e08a8b5e350abe622b2ffa617b202cfad72032a3037e76ffdcdc4376ee05 + 3a190d7e46ca1de04144850381b9cb29f051915386b8a710b8ac4d027b8b050f + 7cba5854e028d564e453b8a968824173fc16488b8970cac828f11ae53cabd201 + 12f87107df24ee6183d2274fe4c8b1485534ef2c5fbc1ec24bfc3663efaa08bc + 047d29d25043532db8391a8a3d776bf4372a6955827ccb0cdd4af403a7ce4c63 + d595c75a43e045f0cce1f29c8b93bd65afc5974922f214a40b7c402cdb91ae73 + c0b63615cdad0480680f16515a7ace9d39236464328a37743ffc28f4ddb324f4 + d0f5bbdc270c65b1749a6efff1fbaa09536175ccd29fb9e6057b307320d31683 + 8a9c71f70b5b5907a66f7ea49aadc409""" + ct = unhexlify(ct.replace(b"\n", b"").replace(b" ", b"")) + + cipher = ChaCha20.new(key=key, nonce=iv) + cipher.seek(64) # Counter = 1 + ct_test = cipher.encrypt(pt) + self.assertEqual(ct, ct_test) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_ba = bytearray(data) + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + + cipher1 = ChaCha20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = ChaCha20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_ba) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + ct_ba = bytearray(ct) + + cipher3 = ChaCha20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_ba) + + self.assertEqual(data, pt_test) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_mv = memoryview(bytearray(data)) + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + + cipher1 = ChaCha20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = ChaCha20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_mv) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + ct_mv = memoryview(bytearray(ct)) + + cipher3 = ChaCha20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_mv) + + self.assertEqual(data, pt_test) + + +class ChaCha20_AGL_NIR(unittest.TestCase): + + # From http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04 + # and http://tools.ietf.org/html/draft-nir-cfrg-chacha20-poly1305-04 + tv = [ + ( "00" * 32, + "00" * 8, + "76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc" + "8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11c" + "c387b669b2ee6586" + "9f07e7be5551387a98ba977c732d080d" + "cb0f29a048e3656912c6533e32ee7aed" + "29b721769ce64e43d57133b074d839d5" + "31ed1f28510afb45ace10a1f4b794d6f" + ), + ( "00" * 31 + "01", + "00" * 8, + "4540f05a9f1fb296d7736e7b208e3c96eb4fe1834688d2604f450952" + "ed432d41bbe2a0b6ea7566d2a5d1e7e20d42af2c53d792b1c43fea81" + "7e9ad275ae546963" + "3aeb5224ecf849929b9d828db1ced4dd" + "832025e8018b8160b82284f3c949aa5a" + "8eca00bbb4a73bdad192b5c42f73f2fd" + "4e273644c8b36125a64addeb006c13a0" + ), + ( "00" * 32, + "00" * 7 + "01", + "de9cba7bf3d69ef5e786dc63973f653a0b49e015adbff7134fcb7df1" + "37821031e85a050278a7084527214f73efc7fa5b5277062eb7a0433e" + "445f41e3" + ), + ( "00" * 32, + "01" + "00" * 7, + "ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd1" + "38e50d32111e4caf237ee53ca8ad6426194a88545ddc497a0b466e7d" + "6bbdb0041b2f586b" + ), + ( "000102030405060708090a0b0c0d0e0f101112131415161718191a1b" + "1c1d1e1f", + "0001020304050607", + "f798a189f195e66982105ffb640bb7757f579da31602fc93ec01ac56" + "f85ac3c134a4547b733b46413042c9440049176905d3be59ea1c53f1" + "5916155c2be8241a38008b9a26bc35941e2444177c8ade6689de9526" + "4986d95889fb60e84629c9bd9a5acb1cc118be563eb9b3a4a472f82e" + "09a7e778492b562ef7130e88dfe031c79db9d4f7c7a899151b9a4750" + "32b63fc385245fe054e3dd5a97a5f576fe064025d3ce042c566ab2c5" + "07b138db853e3d6959660996546cc9c4a6eafdc777c040d70eaf46f7" + "6dad3979e5c5360c3317166a1c894c94a371876a94df7628fe4eaaf2" + "ccb27d5aaae0ad7ad0f9d4b6ad3b54098746d4524d38407a6deb3ab7" + "8fab78c9" + ), + ( "00" * 32, + "00" * 7 + "02", + "c2c64d378cd536374ae204b9ef933fcd" + "1a8b2288b3dfa49672ab765b54ee27c7" + "8a970e0e955c14f3a88e741b97c286f7" + "5f8fc299e8148362fa198a39531bed6d" + ), + ] + + def runTest(self): + for (key, nonce, stream) in self.tv: + c = ChaCha20.new(key=unhexlify(b(key)), nonce=unhexlify(b(nonce))) + ct = unhexlify(b(stream)) + pt = b("\x00") * len(ct) + self.assertEqual(c.encrypt(pt), ct) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 8 + cipher = ChaCha20.new(key=key, nonce=nonce) + + pt = b'5' * 300 + ct = cipher.encrypt(pt) + + output = bytearray(len(pt)) + cipher = ChaCha20.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = ChaCha20.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(len(pt))) + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*len(pt)) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*len(pt)) + + shorter_output = bytearray(len(pt) - 1) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ChaCha20Test) + tests += list_test_cases(XChaCha20Test) + tests.append(ChaCha20_AGL_NIR()) + tests.append(ByteArrayTest()) + tests.append(MemoryviewTest()) + tests.append(TestOutput()) + + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py new file mode 100644 index 0000000..495028a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py @@ -0,0 +1,776 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import ChaCha20_Poly1305 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class ChaCha20Poly1305Tests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data_128 = get_tag_random("data_128", 16) + + def test_loopback(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce can only be 8 or 12 bytes + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=b'H' * 8) + self.assertEqual(len(cipher.nonce), 8) + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=b'H' * 12) + self.assertEqual(len(cipher.nonce), 12) + + # If not passed, the nonce is created randomly + cipher = ChaCha20_Poly1305.new(key=self.key_256) + nonce1 = cipher.nonce + cipher = ChaCha20_Poly1305.new(key=self.key_256) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 12) + self.assertNotEqual(nonce1, nonce2) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can only be 8 or 12 bytes long + self.assertRaises(ValueError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=b'0' * 7) + self.assertRaises(ValueError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=b'') + + def test_block_size(self): + # Not based on block ciphers + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertFalse(hasattr(cipher, 'block_size')) + + def test_nonce_attribute(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 12 bytes long nonce is randomly generated + nonce1 = ChaCha20_Poly1305.new(key=self.key_256).nonce + nonce2 = ChaCha20_Poly1305.new(key=self.key_256).nonce + self.assertEqual(len(nonce1), 12) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, + ChaCha20_Poly1305.new, + key=self.key_256, + param=9) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_256) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + data_ba = bytearray(self.data_128) + + cipher1 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_256) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + del data_ba + + cipher3 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_ba) + ct_ba[:3] = b'\xFF\xFF\xFF' + cipher3.verify(tag_ba) + + self.assertEqual(pt_test, self.data_128) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_256)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + data_mv = memoryview(bytearray(self.data_128)) + + cipher1 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_256)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + ct_mv = memoryview(bytearray(ct)) + tag_mv = memoryview(bytearray(tag)) + del data_mv + + cipher3 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_mv) + ct_mv[:3] = b'\x99\x99\x99' + cipher3.verify(tag_mv) + + self.assertEqual(pt_test, self.data_128) + + +class XChaCha20Poly1305Tests(unittest.TestCase): + + def test_nonce(self): + # Nonce can only be 24 bytes + cipher = ChaCha20_Poly1305.new(key=b'Y' * 32, + nonce=b'H' * 24) + self.assertEqual(len(cipher.nonce), 24) + self.assertEqual(cipher.nonce, b'H' * 24) + + def test_encrypt(self): + # From https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + # Section A.3.1 + + pt = b""" + 4c616469657320616e642047656e746c656d656e206f662074686520636c6173 + 73206f66202739393a204966204920636f756c64206f6666657220796f75206f + 6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73 + 637265656e20776f756c642062652069742e""" + pt = unhexlify(pt.replace(b"\n", b"").replace(b" ", b"")) + + aad = unhexlify(b"50515253c0c1c2c3c4c5c6c7") + key = unhexlify(b"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") + iv = unhexlify(b"404142434445464748494a4b4c4d4e4f5051525354555657") + + ct = b""" + bd6d179d3e83d43b9576579493c0e939572a1700252bfaccbed2902c21396cbb + 731c7f1b0b4aa6440bf3a82f4eda7e39ae64c6708c54c216cb96b72e1213b452 + 2f8c9ba40db5d945b11b69b982c1bb9e3f3fac2bc369488f76b2383565d3fff9 + 21f9664c97637da9768812f615c68b13b52e""" + ct = unhexlify(ct.replace(b"\n", b"").replace(b" ", b"")) + + tag = unhexlify(b"c0875924c1c7987947deafd8780acf49") + + cipher = ChaCha20_Poly1305.new(key=key, nonce=iv) + cipher.update(aad) + ct_test, tag_test = cipher.encrypt_and_digest(pt) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=iv) + cipher.update(aad) + cipher.decrypt_and_verify(ct, tag) + + +class ChaCha20Poly1305FSMTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data_128 = get_tag_random("data_128", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + mac = cipher.digest() + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data_128, + self.data_128 + b"3"): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data_128) + method(self.data_128) + method(self.data_128) + method(self.data_128) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + # decrypt_and_verify + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data_128, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data_128) + getattr(cipher, method1_name)(self.data_128) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data_128) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt(self.data_128) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data_128) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + +def compact(x): + return unhexlify(x.replace(" ", "").replace(":", "")) + + +class TestVectorsRFC(unittest.TestCase): + """Test cases from RFC7539""" + + # AAD, PT, CT, MAC, KEY, NONCE + test_vectors_hex = [ + ( '50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7', + '4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c' + '65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73' + '73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63' + '6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f' + '6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20' + '74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73' + '63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69' + '74 2e', + 'd3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2' + 'a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6' + '3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b' + '1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36' + '92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58' + 'fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc' + '3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b' + '61 16', + '1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91', + '80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f' + '90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f', + '07 00 00 00' + '40 41 42 43 44 45 46 47', + ), + ( 'f3 33 88 86 00 00 00 00 00 00 4e 91', + '49 6e 74 65 72 6e 65 74 2d 44 72 61 66 74 73 20' + '61 72 65 20 64 72 61 66 74 20 64 6f 63 75 6d 65' + '6e 74 73 20 76 61 6c 69 64 20 66 6f 72 20 61 20' + '6d 61 78 69 6d 75 6d 20 6f 66 20 73 69 78 20 6d' + '6f 6e 74 68 73 20 61 6e 64 20 6d 61 79 20 62 65' + '20 75 70 64 61 74 65 64 2c 20 72 65 70 6c 61 63' + '65 64 2c 20 6f 72 20 6f 62 73 6f 6c 65 74 65 64' + '20 62 79 20 6f 74 68 65 72 20 64 6f 63 75 6d 65' + '6e 74 73 20 61 74 20 61 6e 79 20 74 69 6d 65 2e' + '20 49 74 20 69 73 20 69 6e 61 70 70 72 6f 70 72' + '69 61 74 65 20 74 6f 20 75 73 65 20 49 6e 74 65' + '72 6e 65 74 2d 44 72 61 66 74 73 20 61 73 20 72' + '65 66 65 72 65 6e 63 65 20 6d 61 74 65 72 69 61' + '6c 20 6f 72 20 74 6f 20 63 69 74 65 20 74 68 65' + '6d 20 6f 74 68 65 72 20 74 68 61 6e 20 61 73 20' + '2f e2 80 9c 77 6f 72 6b 20 69 6e 20 70 72 6f 67' + '72 65 73 73 2e 2f e2 80 9d', + '64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd' + '5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2' + '4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0' + 'bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf' + '33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81' + '14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55' + '97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38' + '36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4' + 'b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9' + '90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e' + 'af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a' + '0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a' + '0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e' + 'ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10' + '49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30' + '30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29' + 'a6 ad 5c b4 02 2b 02 70 9b', + 'ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38', + '1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0' + '47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0', + '00 00 00 00 01 02 03 04 05 06 07 08', + ) + ] + + test_vectors = [[unhexlify(x.replace(" ", "").replace(":", "")) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def load_tests(self, filename): + + def filter_tag(group): + return group['tagSize'] // 8 + + def filter_algo(root): + return root['algorithm'] + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof ChaCha20-Poly1305", + root_tag={'algo': filter_algo}, + group_tag={'tag_size': filter_tag}) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("chacha20_poly1305_test.json")) + self.tv.extend(self.load_tests("xchacha20_poly1305_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt %s Test #%s" % (tv.algo, tv.id) + + try: + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + except ValueError as e: + assert len(tv.iv) not in (8, 12) and "Nonce must be" in str(e) + return + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt %s Test #%s" % (tv.algo, tv.id) + + try: + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + except ValueError as e: + assert len(tv.iv) not in (8, 12) and "Nonce must be" in str(e) + return + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt ChaCha20-Poly1305 Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 12 + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(ChaCha20Poly1305Tests) + tests += list_test_cases(XChaCha20Poly1305Tests) + tests += list_test_cases(ChaCha20Poly1305FSMTests) + tests += [TestVectorsRFC()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py new file mode 100644 index 0000000..df1313a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py @@ -0,0 +1,374 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/DES.py: Self-test for the (Single) DES cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.DES""" + +import unittest + +from Cryptodome.Cipher import DES + +# This is a list of (plaintext, ciphertext, key, description) tuples. +SP800_17_B1_KEY = '01' * 8 +SP800_17_B2_PT = '00' * 8 +test_data = [ + # Test vectors from Appendix A of NIST SP 800-17 + # "Modes of Operation Validation System (MOVS): Requirements and Procedures" + # http://csrc.nist.gov/publications/nistpubs/800-17/800-17.pdf + + # Appendix A - "Sample Round Outputs for the DES" + ('0000000000000000', '82dcbafbdeab6602', '10316e028c8f3b4a', + "NIST SP800-17 A"), + + # Table B.1 - Variable Plaintext Known Answer Test + ('8000000000000000', '95f8a5e5dd31d900', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #0'), + ('4000000000000000', 'dd7f121ca5015619', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #1'), + ('2000000000000000', '2e8653104f3834ea', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #2'), + ('1000000000000000', '4bd388ff6cd81d4f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #3'), + ('0800000000000000', '20b9e767b2fb1456', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #4'), + ('0400000000000000', '55579380d77138ef', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #5'), + ('0200000000000000', '6cc5defaaf04512f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #6'), + ('0100000000000000', '0d9f279ba5d87260', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #7'), + ('0080000000000000', 'd9031b0271bd5a0a', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #8'), + ('0040000000000000', '424250b37c3dd951', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #9'), + ('0020000000000000', 'b8061b7ecd9a21e5', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #10'), + ('0010000000000000', 'f15d0f286b65bd28', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #11'), + ('0008000000000000', 'add0cc8d6e5deba1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #12'), + ('0004000000000000', 'e6d5f82752ad63d1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #13'), + ('0002000000000000', 'ecbfe3bd3f591a5e', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #14'), + ('0001000000000000', 'f356834379d165cd', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #15'), + ('0000800000000000', '2b9f982f20037fa9', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #16'), + ('0000400000000000', '889de068a16f0be6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #17'), + ('0000200000000000', 'e19e275d846a1298', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #18'), + ('0000100000000000', '329a8ed523d71aec', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #19'), + ('0000080000000000', 'e7fce22557d23c97', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #20'), + ('0000040000000000', '12a9f5817ff2d65d', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #21'), + ('0000020000000000', 'a484c3ad38dc9c19', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #22'), + ('0000010000000000', 'fbe00a8a1ef8ad72', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #23'), + ('0000008000000000', '750d079407521363', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #24'), + ('0000004000000000', '64feed9c724c2faf', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #25'), + ('0000002000000000', 'f02b263b328e2b60', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #26'), + ('0000001000000000', '9d64555a9a10b852', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #27'), + ('0000000800000000', 'd106ff0bed5255d7', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #28'), + ('0000000400000000', 'e1652c6b138c64a5', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #29'), + ('0000000200000000', 'e428581186ec8f46', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #30'), + ('0000000100000000', 'aeb5f5ede22d1a36', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #31'), + ('0000000080000000', 'e943d7568aec0c5c', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #32'), + ('0000000040000000', 'df98c8276f54b04b', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #33'), + ('0000000020000000', 'b160e4680f6c696f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #34'), + ('0000000010000000', 'fa0752b07d9c4ab8', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #35'), + ('0000000008000000', 'ca3a2b036dbc8502', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #36'), + ('0000000004000000', '5e0905517bb59bcf', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #37'), + ('0000000002000000', '814eeb3b91d90726', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #38'), + ('0000000001000000', '4d49db1532919c9f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #39'), + ('0000000000800000', '25eb5fc3f8cf0621', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #40'), + ('0000000000400000', 'ab6a20c0620d1c6f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #41'), + ('0000000000200000', '79e90dbc98f92cca', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #42'), + ('0000000000100000', '866ecedd8072bb0e', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #43'), + ('0000000000080000', '8b54536f2f3e64a8', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #44'), + ('0000000000040000', 'ea51d3975595b86b', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #45'), + ('0000000000020000', 'caffc6ac4542de31', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #46'), + ('0000000000010000', '8dd45a2ddf90796c', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #47'), + ('0000000000008000', '1029d55e880ec2d0', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #48'), + ('0000000000004000', '5d86cb23639dbea9', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #49'), + ('0000000000002000', '1d1ca853ae7c0c5f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #50'), + ('0000000000001000', 'ce332329248f3228', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #51'), + ('0000000000000800', '8405d1abe24fb942', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #52'), + ('0000000000000400', 'e643d78090ca4207', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #53'), + ('0000000000000200', '48221b9937748a23', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #54'), + ('0000000000000100', 'dd7c0bbd61fafd54', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #55'), + ('0000000000000080', '2fbc291a570db5c4', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #56'), + ('0000000000000040', 'e07c30d7e4e26e12', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #57'), + ('0000000000000020', '0953e2258e8e90a1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #58'), + ('0000000000000010', '5b711bc4ceebf2ee', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #59'), + ('0000000000000008', 'cc083f1e6d9e85f6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #60'), + ('0000000000000004', 'd2fd8867d50d2dfe', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #61'), + ('0000000000000002', '06e7ea22ce92708f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #62'), + ('0000000000000001', '166b40b44aba4bd6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #63'), + + # Table B.2 - Variable Key Known Answer Test + (SP800_17_B2_PT, '95a8d72813daa94d', '8001010101010101', + 'NIST SP800-17 B.2 #0'), + (SP800_17_B2_PT, '0eec1487dd8c26d5', '4001010101010101', + 'NIST SP800-17 B.2 #1'), + (SP800_17_B2_PT, '7ad16ffb79c45926', '2001010101010101', + 'NIST SP800-17 B.2 #2'), + (SP800_17_B2_PT, 'd3746294ca6a6cf3', '1001010101010101', + 'NIST SP800-17 B.2 #3'), + (SP800_17_B2_PT, '809f5f873c1fd761', '0801010101010101', + 'NIST SP800-17 B.2 #4'), + (SP800_17_B2_PT, 'c02faffec989d1fc', '0401010101010101', + 'NIST SP800-17 B.2 #5'), + (SP800_17_B2_PT, '4615aa1d33e72f10', '0201010101010101', + 'NIST SP800-17 B.2 #6'), + (SP800_17_B2_PT, '2055123350c00858', '0180010101010101', + 'NIST SP800-17 B.2 #7'), + (SP800_17_B2_PT, 'df3b99d6577397c8', '0140010101010101', + 'NIST SP800-17 B.2 #8'), + (SP800_17_B2_PT, '31fe17369b5288c9', '0120010101010101', + 'NIST SP800-17 B.2 #9'), + (SP800_17_B2_PT, 'dfdd3cc64dae1642', '0110010101010101', + 'NIST SP800-17 B.2 #10'), + (SP800_17_B2_PT, '178c83ce2b399d94', '0108010101010101', + 'NIST SP800-17 B.2 #11'), + (SP800_17_B2_PT, '50f636324a9b7f80', '0104010101010101', + 'NIST SP800-17 B.2 #12'), + (SP800_17_B2_PT, 'a8468ee3bc18f06d', '0102010101010101', + 'NIST SP800-17 B.2 #13'), + (SP800_17_B2_PT, 'a2dc9e92fd3cde92', '0101800101010101', + 'NIST SP800-17 B.2 #14'), + (SP800_17_B2_PT, 'cac09f797d031287', '0101400101010101', + 'NIST SP800-17 B.2 #15'), + (SP800_17_B2_PT, '90ba680b22aeb525', '0101200101010101', + 'NIST SP800-17 B.2 #16'), + (SP800_17_B2_PT, 'ce7a24f350e280b6', '0101100101010101', + 'NIST SP800-17 B.2 #17'), + (SP800_17_B2_PT, '882bff0aa01a0b87', '0101080101010101', + 'NIST SP800-17 B.2 #18'), + (SP800_17_B2_PT, '25610288924511c2', '0101040101010101', + 'NIST SP800-17 B.2 #19'), + (SP800_17_B2_PT, 'c71516c29c75d170', '0101020101010101', + 'NIST SP800-17 B.2 #20'), + (SP800_17_B2_PT, '5199c29a52c9f059', '0101018001010101', + 'NIST SP800-17 B.2 #21'), + (SP800_17_B2_PT, 'c22f0a294a71f29f', '0101014001010101', + 'NIST SP800-17 B.2 #22'), + (SP800_17_B2_PT, 'ee371483714c02ea', '0101012001010101', + 'NIST SP800-17 B.2 #23'), + (SP800_17_B2_PT, 'a81fbd448f9e522f', '0101011001010101', + 'NIST SP800-17 B.2 #24'), + (SP800_17_B2_PT, '4f644c92e192dfed', '0101010801010101', + 'NIST SP800-17 B.2 #25'), + (SP800_17_B2_PT, '1afa9a66a6df92ae', '0101010401010101', + 'NIST SP800-17 B.2 #26'), + (SP800_17_B2_PT, 'b3c1cc715cb879d8', '0101010201010101', + 'NIST SP800-17 B.2 #27'), + (SP800_17_B2_PT, '19d032e64ab0bd8b', '0101010180010101', + 'NIST SP800-17 B.2 #28'), + (SP800_17_B2_PT, '3cfaa7a7dc8720dc', '0101010140010101', + 'NIST SP800-17 B.2 #29'), + (SP800_17_B2_PT, 'b7265f7f447ac6f3', '0101010120010101', + 'NIST SP800-17 B.2 #30'), + (SP800_17_B2_PT, '9db73b3c0d163f54', '0101010110010101', + 'NIST SP800-17 B.2 #31'), + (SP800_17_B2_PT, '8181b65babf4a975', '0101010108010101', + 'NIST SP800-17 B.2 #32'), + (SP800_17_B2_PT, '93c9b64042eaa240', '0101010104010101', + 'NIST SP800-17 B.2 #33'), + (SP800_17_B2_PT, '5570530829705592', '0101010102010101', + 'NIST SP800-17 B.2 #34'), + (SP800_17_B2_PT, '8638809e878787a0', '0101010101800101', + 'NIST SP800-17 B.2 #35'), + (SP800_17_B2_PT, '41b9a79af79ac208', '0101010101400101', + 'NIST SP800-17 B.2 #36'), + (SP800_17_B2_PT, '7a9be42f2009a892', '0101010101200101', + 'NIST SP800-17 B.2 #37'), + (SP800_17_B2_PT, '29038d56ba6d2745', '0101010101100101', + 'NIST SP800-17 B.2 #38'), + (SP800_17_B2_PT, '5495c6abf1e5df51', '0101010101080101', + 'NIST SP800-17 B.2 #39'), + (SP800_17_B2_PT, 'ae13dbd561488933', '0101010101040101', + 'NIST SP800-17 B.2 #40'), + (SP800_17_B2_PT, '024d1ffa8904e389', '0101010101020101', + 'NIST SP800-17 B.2 #41'), + (SP800_17_B2_PT, 'd1399712f99bf02e', '0101010101018001', + 'NIST SP800-17 B.2 #42'), + (SP800_17_B2_PT, '14c1d7c1cffec79e', '0101010101014001', + 'NIST SP800-17 B.2 #43'), + (SP800_17_B2_PT, '1de5279dae3bed6f', '0101010101012001', + 'NIST SP800-17 B.2 #44'), + (SP800_17_B2_PT, 'e941a33f85501303', '0101010101011001', + 'NIST SP800-17 B.2 #45'), + (SP800_17_B2_PT, 'da99dbbc9a03f379', '0101010101010801', + 'NIST SP800-17 B.2 #46'), + (SP800_17_B2_PT, 'b7fc92f91d8e92e9', '0101010101010401', + 'NIST SP800-17 B.2 #47'), + (SP800_17_B2_PT, 'ae8e5caa3ca04e85', '0101010101010201', + 'NIST SP800-17 B.2 #48'), + (SP800_17_B2_PT, '9cc62df43b6eed74', '0101010101010180', + 'NIST SP800-17 B.2 #49'), + (SP800_17_B2_PT, 'd863dbb5c59a91a0', '0101010101010140', + 'NIST SP800-17 B.2 #50'), + (SP800_17_B2_PT, 'a1ab2190545b91d7', '0101010101010120', + 'NIST SP800-17 B.2 #51'), + (SP800_17_B2_PT, '0875041e64c570f7', '0101010101010110', + 'NIST SP800-17 B.2 #52'), + (SP800_17_B2_PT, '5a594528bebef1cc', '0101010101010108', + 'NIST SP800-17 B.2 #53'), + (SP800_17_B2_PT, 'fcdb3291de21f0c0', '0101010101010104', + 'NIST SP800-17 B.2 #54'), + (SP800_17_B2_PT, '869efd7f9f265a09', '0101010101010102', + 'NIST SP800-17 B.2 #55'), +] + +class RonRivestTest(unittest.TestCase): + """ Ronald L. Rivest's DES test, see + http://people.csail.mit.edu/rivest/Destest.txt + ABSTRACT + -------- + + We present a simple way to test the correctness of a DES implementation: + Use the recurrence relation: + + X0 = 9474B8E8C73BCA7D (hexadecimal) + + X(i+1) = IF (i is even) THEN E(Xi,Xi) ELSE D(Xi,Xi) + + to compute a sequence of 64-bit values: X0, X1, X2, ..., X16. Here + E(X,K) denotes the DES encryption of X using key K, and D(X,K) denotes + the DES decryption of X using key K. If you obtain + + X16 = 1B1A2DDB4C642438 + + your implementation does not have any of the 36,568 possible single-fault + errors described herein. + """ + def runTest(self): + from binascii import b2a_hex + + X = [] + X[0:] = [b'\x94\x74\xB8\xE8\xC7\x3B\xCA\x7D'] + + for i in range(16): + c = DES.new(X[i],DES.MODE_ECB) + if not (i&1): # (num&1) returns 1 for odd numbers + X[i+1:] = [c.encrypt(X[i])] # even + else: + X[i+1:] = [c.decrypt(X[i])] # odd + + self.assertEqual(b2a_hex(X[16]), + b2a_hex(b'\x1B\x1A\x2D\xDB\x4C\x64\x24\x38')) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = DES.new(b'4'*8, DES.MODE_ECB) + + pt = b'5' * 8 + ct = cipher.encrypt(pt) + + output = bytearray(8) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(8)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*8) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*8) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + tests = make_block_tests(DES, "DES", test_data) + tests += [RonRivestTest()] + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py new file mode 100644 index 0000000..8f8479b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/DES3.py: Self-test for the Triple-DES cipher +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.DES3""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Cipher import DES3 + +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.Util.py3compat import bchr, tostr +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +# This is a list of (plaintext, ciphertext, key, description) tuples. +test_data = [ + # Test vector from Appendix B of NIST SP 800-67 + # "Recommendation for the Triple Data Encryption Algorithm (TDEA) Block + # Cipher" + # http://csrc.nist.gov/publications/nistpubs/800-67/SP800-67.pdf + ('54686520717566636b2062726f776e20666f78206a756d70', + 'a826fd8ce53b855fcce21c8112256fe668d5c05dd9b6b900', + '0123456789abcdef23456789abcdef01456789abcdef0123', + 'NIST SP800-67 B.1'), + + # This test is designed to test the DES3 API, not the correctness of the + # output. + ('21e81b7ade88a259', '5c577d4d9b20c0f8', + '9b397ebf81b1181e282f4bb8adbadc6b', 'Two-key 3DES'), +] + +# NIST CAVP test vectors + +nist_tdes_mmt_files = ("TECBMMT2.rsp", "TECBMMT3.rsp") + +for tdes_file in nist_tdes_mmt_files: + + test_vectors = load_test_vectors( + ("Cipher", "TDES"), + tdes_file, + "TDES ECB (%s)" % tdes_file, + {"count": lambda x: int(x)}) or [] + + for index, tv in enumerate(test_vectors): + + # The test vector file contains some directive lines + if isinstance(tv, str): + continue + + key = tv.key1 + tv.key2 + tv.key3 + test_data_item = (tostr(hexlify(tv.plaintext)), + tostr(hexlify(tv.ciphertext)), + tostr(hexlify(key)), + "%s (%s)" % (tdes_file, index)) + test_data.append(test_data_item) + + +class CheckParity(unittest.TestCase): + + def test_parity_option2(self): + before_2k = unhexlify("CABF326FA56734324FFCCABCDEFACABF") + after_2k = DES3.adjust_key_parity(before_2k) + self.assertEqual(after_2k, + unhexlify("CBBF326EA46734324FFDCBBCDFFBCBBF")) + + def test_parity_option3(self): + before_3k = unhexlify("AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCC") + after_3k = DES3.adjust_key_parity(before_3k) + self.assertEqual(after_3k, + unhexlify("ABABABABABABABABBABABABABABABABACDCDCDCDCDCDCDCD")) + + def test_degradation(self): + sub_key1 = bchr(1) * 8 + sub_key2 = bchr(255) * 8 + + # K1 == K2 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 * 2 + sub_key2) + + # K2 == K3 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 + sub_key2 * 2) + + # K1 == K2 == K3 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 * 3) + + # K1 == K2 (with different parity) + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 + strxor_c(sub_key1, 1) + sub_key2) + + +class DegenerateToDESTest(unittest.TestCase): + + def runTest(self): + sub_key1 = bchr(1) * 8 + sub_key2 = bchr(255) * 8 + + # K1 == K2 + self.assertRaises(ValueError, DES3.new, + sub_key1 * 2 + sub_key2, + DES3.MODE_ECB) + + # K2 == K3 + self.assertRaises(ValueError, DES3.new, + sub_key1 + sub_key2 * 2, + DES3.MODE_ECB) + + # K1 == K2 == K3 + self.assertRaises(ValueError, DES3.new, + sub_key1 * 3, + DES3.MODE_ECB) + + # K2 == K3 (parity is ignored) + self.assertRaises(ValueError, DES3.new, + sub_key1 + sub_key2 + strxor_c(sub_key2, 0x1), + DES3.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = DES3.new(b'4'*8 + b'G'*8 + b'T'*8, DES3.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + + tests = [] + tests = make_block_tests(DES3, "DES3", test_data) + tests.append(DegenerateToDESTest()) + tests += list_test_cases(CheckParity) + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + + def suite(): + unittest.TestSuite(get_tests()) + + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py new file mode 100644 index 0000000..4127a88 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py @@ -0,0 +1,773 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class EaxTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_EAX, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, DES3.MODE_EAX, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # If not passed, the nonce is created randomly + cipher = AES.new(self.key_128, AES.MODE_EAX) + nonce1 = cipher.nonce + cipher = AES.new(self.key_128, AES.MODE_EAX) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + cipher = AES.new(self.key_128, AES.MODE_EAX, self.nonce_96) + ct = cipher.encrypt(self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=bchr(1) * x) + cipher.encrypt(bchr(1)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 16 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_EAX).nonce + nonce2 = AES.new(self.key_128, AES.MODE_EAX).nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, mac_len=2-1) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(2, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + data_ba = bytearray(self.data_128) + + cipher1 = AES.new(self.key_128, + AES.MODE_EAX, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_EAX, + nonce=nonce_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + del data_ba + + cipher3 = AES.new(key_ba, + AES.MODE_EAX, + nonce=nonce_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_ba) + ct_ba[:3] = b'\xFF\xFF\xFF' + cipher3.verify(tag_ba) + + self.assertEqual(pt_test, self.data_128) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + data_mv = memoryview(bytearray(self.data_128)) + + cipher1 = AES.new(self.key_128, + AES.MODE_EAX, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_EAX, + nonce=nonce_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + ct_mv = memoryview(bytearray(ct)) + tag_mv = memoryview(bytearray(tag)) + del data_mv + + cipher3 = AES.new(key_mv, + AES.MODE_EAX, + nonce=nonce_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_mv) + ct_mv[:3] = b'\x99\x99\x99' + cipher3.verify(tag_mv) + + self.assertEqual(pt_test, self.data_128) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 16 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class EaxFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data_128 = get_tag_random("data_128", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data_128, + self.data_128 + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data_128) + method(self.data_128) + method(self.data_128) + method(self.data_128) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data_128, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data_128) + getattr(cipher, method1_name)(self.data_128) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data_128) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(self.data_128) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data_128) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + +class TestVectorsPaper(unittest.TestCase): + """Class exercising the EAX test vectors found in + http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf""" + + test_vectors_hex = [ + ( '6bfb914fd07eae6b', + '', + '', + 'e037830e8389f27b025a2d6527e79d01', + '233952dee4d5ed5f9b9c6d6ff80ff478', + '62EC67F9C3A4A407FCB2A8C49031A8B3' + ), + ( + 'fa3bfd4806eb53fa', + 'f7fb', + '19dd', + '5c4c9331049d0bdab0277408f67967e5', + '91945d3f4dcbee0bf45ef52255f095a4', + 'BECAF043B0A23D843194BA972C66DEBD' + ), + ( '234a3463c1264ac6', + '1a47cb4933', + 'd851d5bae0', + '3a59f238a23e39199dc9266626c40f80', + '01f74ad64077f2e704c0f60ada3dd523', + '70C3DB4F0D26368400A10ED05D2BFF5E' + ), + ( + '33cce2eabff5a79d', + '481c9e39b1', + '632a9d131a', + 'd4c168a4225d8e1ff755939974a7bede', + 'd07cf6cbb7f313bdde66b727afd3c5e8', + '8408DFFF3C1A2B1292DC199E46B7D617' + ), + ( + 'aeb96eaebe2970e9', + '40d0c07da5e4', + '071dfe16c675', + 'cb0677e536f73afe6a14b74ee49844dd', + '35b6d0580005bbc12b0587124557d2c2', + 'FDB6B06676EEDC5C61D74276E1F8E816' + ), + ( + 'd4482d1ca78dce0f', + '4de3b35c3fc039245bd1fb7d', + '835bb4f15d743e350e728414', + 'abb8644fd6ccb86947c5e10590210a4f', + 'bd8e6e11475e60b268784c38c62feb22', + '6EAC5C93072D8E8513F750935E46DA1B' + ), + ( + '65d2017990d62528', + '8b0a79306c9ce7ed99dae4f87f8dd61636', + '02083e3979da014812f59f11d52630da30', + '137327d10649b0aa6e1c181db617d7f2', + '7c77d6e813bed5ac98baa417477a2e7d', + '1A8C98DCD73D38393B2BF1569DEEFC19' + ), + ( + '54b9f04e6a09189a', + '1bda122bce8a8dbaf1877d962b8592dd2d56', + '2ec47b2c4954a489afc7ba4897edcdae8cc3', + '3b60450599bd02c96382902aef7f832a', + '5fff20cafab119ca2fc73549e20f5b0d', + 'DDE59B97D722156D4D9AFF2BC7559826' + ), + ( + '899a175897561d7e', + '6cf36720872b8513f6eab1a8a44438d5ef11', + '0de18fd0fdd91e7af19f1d8ee8733938b1e8', + 'e7f6d2231618102fdb7fe55ff1991700', + 'a4a4782bcffd3ec5e7ef6d8c34a56123', + 'B781FCF2F75FA5A8DE97A9CA48E522EC' + ), + ( + '126735fcc320d25a', + 'ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7', + 'cb8920f87a6c75cff39627b56e3ed197c552d295a7', + 'cfc46afc253b4652b1af3795b124ab6e', + '8395fcf1e95bebd697bd010bc766aac3', + '22E7ADD93CFC6393C57EC0B3C17D6B44' + ), + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = AES.new(key, AES.MODE_EAX, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_EAX, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_eax_test.json", + "Wycheproof EAX", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt EAX Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + except ValueError as e: + assert len(tv.iv) == 0 and "Nonce cannot be empty" in str(e) + return + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt EAX Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + except ValueError as e: + assert len(tv.iv) == 0 and "Nonce cannot be empty" in str(e) + return + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt EAX Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestOtherCiphers(unittest.TestCase): + + @classmethod + def create_test(cls, name, factory, key_size): + + def test_template(self, factory=factory, key_size=key_size): + cipher = factory.new(get_tag_random("cipher", key_size), + factory.MODE_EAX, + nonce=b"nonce") + ct, mac = cipher.encrypt_and_digest(b"plaintext") + + cipher = factory.new(get_tag_random("cipher", key_size), + factory.MODE_EAX, + nonce=b"nonce") + pt2 = cipher.decrypt_and_verify(ct, mac) + + self.assertEqual(b"plaintext", pt2) + + setattr(cls, "test_" + name, test_template) + + +from Cryptodome.Cipher import DES, DES3, ARC2, CAST, Blowfish + +TestOtherCiphers.create_test("DES_" + str(DES.key_size), DES, DES.key_size) +for ks in DES3.key_size: + TestOtherCiphers.create_test("DES3_" + str(ks), DES3, ks) +for ks in ARC2.key_size: + TestOtherCiphers.create_test("ARC2_" + str(ks), ARC2, ks) +for ks in CAST.key_size: + TestOtherCiphers.create_test("CAST_" + str(ks), CAST, ks) +for ks in Blowfish.key_size: + TestOtherCiphers.create_test("Blowfish_" + str(ks), Blowfish, ks) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(EaxTests) + tests += list_test_cases(EaxFSMTests) + tests += [ TestVectorsPaper() ] + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + tests += list_test_cases(TestOtherCiphers) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py new file mode 100644 index 0000000..ac8e741 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py @@ -0,0 +1,951 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from __future__ import print_function + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128, SHA256 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class GcmTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce is optional (a random one will be created) + AES.new(self.key_128, AES.MODE_GCM) + + cipher = AES.new(self.key_128, AES.MODE_GCM, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=bchr(1) * x) + cipher.encrypt(bchr(1)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_GCM).nonce + nonce2 = AES.new(self.key_128, AES.MODE_GCM).nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, mac_len=3) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(5, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_GCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_GCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_GCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_GCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_GCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_GCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class GcmFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data, + self.data + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +class TestVectors(unittest.TestCase): + """Class exercising the GCM test vectors found in + http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf""" + + # List of test vectors, each made up of: + # - authenticated data + # - plaintext + # - ciphertext + # - MAC + # - AES key + # - nonce + test_vectors_hex = [ + ( + '', + '', + '', + '58e2fccefa7e3061367f1d57a4e7455a', + '00000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + '0388dace60b6a392f328c2b971b2fe78', + 'ab6e47d42cec13bdf53a67b21257bddf', + '00000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e' + + '21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985', + '4d5c2af327cd64a62cf35abd2ba6fab4', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e' + + '21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091', + '5bc94fbc3221a5db94fae95ae7121a47', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c7423' + + '73806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598', + '3612d2e79e3b0785561be14aaca2fccb', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca7' + + '01e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5', + '619cc5aefffe0bfa462af43c1699d050', + 'feffe9928665731c6d6a8f9467308308', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ), + ( + '', + '', + '', + 'cd33b28ac773f74ba00ed1f312572435', + '000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + '98e7247c07f0fe411c267e4384b0f600', + '2ff58d80033927ab8ef4d4587514f0fb', + '000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c' + + '7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256', + '9924a7c8587336bfb118024db8674a14', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c' + + '7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710', + '2519498e80f1478f37ba55bd6d27618c', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057' + + 'fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7', + '65dcc57fcf623a24094fcca40d3533f8', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'd27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e45' + + '81e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b', + 'dcf566ff291c25bbb8568fc3d376a6d9', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ), + ( + '', + '', + '', + '530f8afbc74536b9a963b4f1c4cb738b', + '0000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + 'cea7403d4d606b6e074ec5d3baf39d18', + 'd0d1c8a799996bf0265b98b5d48ab919', + '0000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa' + + '8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad', + 'b094dac5d93471bdec1a502270e3cc6c', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa' + + '8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662', + '76fc6ece0f4e1768cddf8853bb2d551b', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0' + + 'feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f', + '3a337dbf46a792c45e454913fe2ea8f2', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf4' + + '0fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f', + 'a44a8266ee1c8eb0c8b5d4cf5ae9f19a', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ) + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + + # Encrypt + cipher = AES.new(key, AES.MODE_GCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_GCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsGueronKrasnov(unittest.TestCase): + """Class exercising the GCM test vectors found in + 'The fragility of AES-GCM authentication algorithm', Gueron, Krasnov + https://eprint.iacr.org/2013/157.pdf""" + + def test_1(self): + key = unhexlify("3da6c536d6295579c0959a7043efb503") + iv = unhexlify("2b926197d34e091ef722db94") + aad = unhexlify("00000000000000000000000000000000" + + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f") + digest = unhexlify("69dd586555ce3fcc89663801a71d957b") + + cipher = AES.new(key, AES.MODE_GCM, iv).update(aad) + self.assertEqual(digest, cipher.digest()) + + def test_2(self): + key = unhexlify("843ffcf5d2b72694d19ed01d01249412") + iv = unhexlify("dbcca32ebf9b804617c3aa9e") + aad = unhexlify("00000000000000000000000000000000" + + "101112131415161718191a1b1c1d1e1f") + pt = unhexlify("000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f") + ct = unhexlify("6268c6fa2a80b2d137467f092f657ac0" + + "4d89be2beaa623d61b5a868c8f03ff95" + + "d3dcee23ad2f1ab3a6c80eaf4b140eb0" + + "5de3457f0fbc111a6b43d0763aa422a3" + + "013cf1dc37fe417d1fbfc449b75d4cc5") + digest = unhexlify("3b629ccfbc1119b7319e1dce2cd6fd6d") + + cipher = AES.new(key, AES.MODE_GCM, iv).update(aad) + ct2, digest2 = cipher.encrypt_and_digest(pt) + + self.assertEqual(ct, ct2) + self.assertEqual(digest, digest2) + + +class NISTTestVectorsGCM(unittest.TestCase): + + def __init__(self, a): + self.use_clmul = True + unittest.TestCase.__init__(self, a) + + +class NISTTestVectorsGCM_no_clmul(unittest.TestCase): + + def __init__(self, a): + self.use_clmul = False + unittest.TestCase.__init__(self, a) + + +test_vectors_nist = load_test_vectors( + ("Cipher", "AES"), + "gcmDecrypt128.rsp", + "GCM decrypt", + {"count": lambda x: int(x)}) or [] + +test_vectors_nist += load_test_vectors( + ("Cipher", "AES"), + "gcmEncryptExtIV128.rsp", + "GCM encrypt", + {"count": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_nist): + + # The test vector file contains some directive lines + if isinstance(tv, str): + continue + + def single_test(self, tv=tv): + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_GCM, nonce=tv.iv, + mac_len=len(tv.tag), use_clmul=self.use_clmul) + cipher.update(tv.aad) + if "FAIL" in tv.others: + self.assertRaises(ValueError, cipher.decrypt_and_verify, + tv.ct, tv.tag) + else: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + self.assertEqual(pt, tv.pt) + + setattr(NISTTestVectorsGCM, "test_%d" % idx, single_test) + setattr(NISTTestVectorsGCM_no_clmul, "test_%d" % idx, single_test) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, **extra_params): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._extra_params = extra_params + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_gcm_test.json", + "Wycheproof GCM", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt GCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) == 0 and "Nonce cannot be empty" in str(e): + return + raise e + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt GCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) == 0 and "Nonce cannot be empty" in str(e): + return + raise e + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt GCM Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestVariableLength(unittest.TestCase): + + def __init__(self, **extra_params): + unittest.TestCase.__init__(self) + self._extra_params = extra_params + + def runTest(self): + key = b'0' * 16 + h = SHA256.new() + + for length in range(160): + nonce = '{0:04d}'.format(length).encode('utf-8') + data = bchr(length) * length + cipher = AES.new(key, AES.MODE_GCM, nonce=nonce, **self._extra_params) + ct, tag = cipher.encrypt_and_digest(data) + h.update(ct) + h.update(tag) + + self.assertEqual(h.hexdigest(), "7b7eb1ffbe67a2e53a912067c0ec8e62ebc7ce4d83490ea7426941349811bdf4") + + +def get_tests(config={}): + from Cryptodome.Util import _cpu_features + + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(GcmTests) + tests += list_test_cases(GcmFSMTests) + tests += [TestVectors()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + tests += list_test_cases(TestVectorsGueronKrasnov) + tests += [TestVariableLength()] + if config.get('slow_tests'): + tests += list_test_cases(NISTTestVectorsGCM) + + if _cpu_features.have_clmul(): + tests += [TestVectorsWycheproof(wycheproof_warnings, use_clmul=False)] + tests += [TestVariableLength(use_clmul=False)] + if config.get('slow_tests'): + tests += list_test_cases(NISTTestVectorsGCM_no_clmul) + else: + print("Skipping test of PCLMULDQD in AES GCM") + + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py new file mode 100644 index 0000000..1f2ffbc --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py @@ -0,0 +1,845 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import b, tobytes, bchr +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class OcbTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct, mac = cipher.encrypt_and_digest(pt) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce is optional + AES.new(self.key_128, AES.MODE_OCB) + + cipher = AES.new(self.key_128, AES.MODE_OCB, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce cannot be empty + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=b("")) + + # nonce can be up to 15 bytes long + for length in range(1, 16): + AES.new(self.key_128, AES.MODE_OCB, nonce=self.data[:length]) + + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.data) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_OCB).nonce + nonce2 = AES.new(self.key_128, AES.MODE_OCB).nonce + self.assertEqual(len(nonce1), 15) + self.assertNotEqual(nonce1, nonce2) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_OCB).nonce + nonce2 = AES.new(self.key_128, AES.MODE_OCB).nonce + self.assertEqual(len(nonce1), 15) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + result = getattr(cipher, func)(b("")) + self.assertEqual(result, b("")) + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt(b("xyz")) + self.assertRaises(TypeError, cipher.decrypt, b("xyz")) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt(b("xyz")) + self.assertRaises(TypeError, cipher.encrypt, b("xyz")) + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, mac_len=7) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(8, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b("") + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + pt2 += cipher.decrypt() + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b("") + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + ct2 += cipher.encrypt() + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_OCB, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + cipher1.encrypt() + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_OCB, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + cipher2.encrypt() + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_OCB, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_OCB, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + cipher1.encrypt() + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_OCB, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + cipher2.encrypt() + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_OCB, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + +class OcbFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->ENCRYPT(NONE)->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + # Verify path INIT->DECRYPT->DECRYPT(NONCE)->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + + def test_invalid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + self.assertRaises(TypeError, cipher.digest) + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.decrypt(ct) + self.assertRaises(TypeError, cipher.verify) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->ENCRYPT(NONE)->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->DECRYPT(NONE)->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + + # Verify path INIT->UPDATE->ENCRYPT->ENCRYPT_AND_DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + ct1 = cipher.encrypt(self.data[:2]) + ct2, mac = cipher.encrypt_and_digest(self.data[2:]) + + # Verify path INIT->UPDATE->DECRYPT->DECRYPT_AND_VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct1) + cipher.decrypt_and_verify(ct2, mac) + + def test_invalid_encrypt_after_final(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.encrypt(self.data) + cipher.encrypt() + self.assertRaises(TypeError, cipher.encrypt, self.data) + + def test_invalid_decrypt_after_final(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(self.data) + cipher.decrypt() + self.assertRaises(TypeError, cipher.decrypt, self.data) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b("333"), self.data, + self.data + b("3")): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + method() + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.encrypt() + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +def algo_rfc7253(keylen, taglen, noncelen): + """Implement the algorithm at page 18 of RFC 7253""" + + key = bchr(0) * (keylen // 8 - 1) + bchr(taglen) + C = b"" + + for i in range(128): + S = bchr(0) * i + + N = long_to_bytes(3 * i + 1, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(S) + C += cipher.encrypt(S) + cipher.encrypt() + cipher.digest() + + N = long_to_bytes(3 * i + 2, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + C += cipher.encrypt(S) + cipher.encrypt() + cipher.digest() + + N = long_to_bytes(3 * i + 3, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(S) + C += cipher.encrypt() + cipher.digest() + + N = long_to_bytes(385, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(C) + return cipher.encrypt() + cipher.digest() + + +class OcbRfc7253Test(unittest.TestCase): + + # Tuple with + # - nonce + # - authenticated data + # - plaintext + # - ciphertext and 16 byte MAC tag + tv1_key = "000102030405060708090A0B0C0D0E0F" + tv1 = ( + ( + "BBAA99887766554433221100", + "", + "", + "785407BFFFC8AD9EDCC5520AC9111EE6" + ), + ( + "BBAA99887766554433221101", + "0001020304050607", + "0001020304050607", + "6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009" + ), + ( + "BBAA99887766554433221102", + "0001020304050607", + "", + "81017F8203F081277152FADE694A0A00" + ), + ( + "BBAA99887766554433221103", + "", + "0001020304050607", + "45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9" + ), + ( + "BBAA99887766554433221104", + "000102030405060708090A0B0C0D0E0F", + "000102030405060708090A0B0C0D0E0F", + "571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5" + "701C1CCEC8FC3358" + ), + ( + "BBAA99887766554433221105", + "000102030405060708090A0B0C0D0E0F", + "", + "8CF761B6902EF764462AD86498CA6B97" + ), + ( + "BBAA99887766554433221106", + "", + "000102030405060708090A0B0C0D0E0F", + "5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436B" + "DF06D8FA1ECA343D" + ), + ( + "BBAA99887766554433221107", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "1CA2207308C87C010756104D8840CE1952F09673A448A122" + "C92C62241051F57356D7F3C90BB0E07F" + ), + ( + "BBAA99887766554433221108", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "", + "6DC225A071FC1B9F7C69F93B0F1E10DE" + ), + ( + "BBAA99887766554433221109", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3C" + "E725F32494B9F914D85C0B1EB38357FF" + ), + ( + "BBAA9988776655443322110A", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "BD6F6C496201C69296C11EFD138A467ABD3C707924B964DE" + "AFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240" + ), + ( + "BBAA9988776655443322110B", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "", + "FE80690BEE8A485D11F32965BC9D2A32" + ), + ( + "BBAA9988776655443322110C", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF4" + "6040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF" + ), + ( + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "D5CA91748410C1751FF8A2F618255B68A0A12E093FF45460" + "6E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483" + "A7035490C5769E60" + ), + ( + "BBAA9988776655443322110E", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "", + "C5CD9D1850C141E358649994EE701B68" + ), + ( + "BBAA9988776655443322110F", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15" + "A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95" + "A98CA5F3000B1479" + ) + ) + + # Tuple with + # - key + # - nonce + # - authenticated data + # - plaintext + # - ciphertext and 12 byte MAC tag + tv2 = ( + "0F0E0D0C0B0A09080706050403020100", + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1" + "A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FD" + "AC4F02AA" + ) + + # Tuple with + # - key length + # - MAC tag length + # - Expected output + tv3 = ( + (128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"), + (192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"), + (256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"), + (128, 96, "77A3D8E73589158D25D01209"), + (192, 96, "05D56EAD2752C86BE6932C5E"), + (256, 96, "5458359AC23B0CBA9E6330DD"), + (128, 64, "192C9B7BD90BA06A"), + (192, 64, "0066BC6E0EF34E24"), + (256, 64, "7D4EA5D445501CBE"), + ) + + def test1(self): + key = unhexlify(b(self.tv1_key)) + for tv in self.tv1: + nonce, aad, pt, ct = [unhexlify(b(x)) for x in tv] + ct, mac_tag = ct[:-16], ct[-16:] + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + cipher.update(aad) + ct2 = cipher.encrypt(pt) + cipher.encrypt() + self.assertEqual(ct, ct2) + self.assertEqual(mac_tag, cipher.digest()) + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + cipher.update(aad) + pt2 = cipher.decrypt(ct) + cipher.decrypt() + self.assertEqual(pt, pt2) + cipher.verify(mac_tag) + + def test2(self): + + key, nonce, aad, pt, ct = [unhexlify(b(x)) for x in self.tv2] + ct, mac_tag = ct[:-12], ct[-12:] + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce, mac_len=12) + cipher.update(aad) + ct2 = cipher.encrypt(pt) + cipher.encrypt() + self.assertEqual(ct, ct2) + self.assertEqual(mac_tag, cipher.digest()) + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce, mac_len=12) + cipher.update(aad) + pt2 = cipher.decrypt(ct) + cipher.decrypt() + self.assertEqual(pt, pt2) + cipher.verify(mac_tag) + + def test3(self): + for keylen, taglen, result in self.tv3: + result2 = algo_rfc7253(keylen, taglen, 96) + self.assertEqual(unhexlify(b(result)), result2) + + +class OcbDkgTest(unittest.TestCase): + """Test vectors from https://gitlab.com/dkg/ocb-test-vectors""" + + def test_1_2(self): + tvs = [] + for fi in (1, 2): + for nb in (104, 112, 120): + tv_file = load_test_vectors(("Cipher", "AES"), + "test-vector-%d-nonce%d.txt" % (fi, nb), + "DKG tests, %d, %d bits" % (fi, nb), + {}) + if tv_file is None: + break + key = tv_file[0].k + for tv in tv_file[1:]: + tv.k = key + tvs.append(tv) + + for tv in tvs: + k, n, a, p, c = tv.k, tv.n, tv.a, tv.p, tv.c + mac_len = len(c) - len(p) + cipher = AES.new(k, AES.MODE_OCB, nonce=n, mac_len=mac_len) + cipher.update(a) + c_out, tag_out = cipher.encrypt_and_digest(p) + self.assertEqual(c, c_out + tag_out) + + def test_3(self): + + def check(keylen, taglen, noncelen, exp): + result = algo_rfc7253(keylen, taglen, noncelen) + self.assertEqual(result, unhexlify(exp)) + + # test-vector-3-nonce104.txt + check(128, 128, 104, "C47F5F0341E15326D4D1C46F47F05062") + check(192, 128, 104, "95B9167A38EB80495DFC561A8486E109") + check(256, 128, 104, "AFE1CDDB97028FD92F8FB3C8CFBA7D83") + check(128, 96, 104, "F471B4983BA80946DF217A54") + check(192, 96, 104, "5AE828BC51C24D85FA5CC7B2") + check(256, 96, 104, "8C8335982E2B734616CAD14C") + check(128, 64, 104, "B553F74B85FD1E5B") + check(192, 64, 104, "3B49D20E513531F9") + check(256, 64, 104, "ED6DA5B1216BF8BB") + + # test-vector-3-nonce112.txt + check(128, 128, 112, "CA8AFCA031BAC3F480A583BD6C50A547") + check(192, 128, 112, "D170C1DF356308079DA9A3F619147148") + check(256, 128, 112, "57F94381F2F9231EFB04AECD323757C3") + check(128, 96, 112, "3A618B2531ED39F260C750DC") + check(192, 96, 112, "9071EB89FEDBADDA88FD286E") + check(256, 96, 112, "FDF0EFB97F21A39AC4BAB5AC") + check(128, 64, 112, "FAB2FF3A8DD82A13") + check(192, 64, 112, "AC01D912BD0737D3") + check(256, 64, 112, "9D1FD0B500EA4ECF") + + # test-vector-3-nonce120.txt + check(128, 128, 120, "9E043A7140A25FB91F43BCC9DD7E0F46") + check(192, 128, 120, "680000E53908323A7F396B955B8EC641") + check(256, 128, 120, "8304B97FAACDA56E676602E1878A7E6F") + check(128, 96, 120, "81F978AC9867E825D339847D") + check(192, 96, 120, "EFCF2D60B24926ADA48CF5B1") + check(256, 96, 120, "84961DC56E917B165E58C174") + check(128, 64, 120, "227AEE6C9D905A61") + check(192, 64, 120, "541DE691B9E1A2F9") + check(256, 64, 120, "B0E761381C7129FC") + + def test_2_bugfix(self): + nonce = unhexlify("EEDDCCBBAA9988776655443322110D") + key = unhexlify("0F0E0D0C0B0A09080706050403020100") + A = unhexlify("000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627") + P = unhexlify("000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627") + C = unhexlify("07E903BFC49552411ABC865F5ECE60F6FAD1F5A9F14D3070" + "FA2F1308A563207FFE14C1EEA44B22059C7484319D8A2C53" + "C236A7B3") + mac_len = len(C) - len(P) + + # Prior to version 3.17, a nonce of maximum length (15 bytes) + # was actually used as a 14 byte nonce. The last byte was erroneously + # ignored. + buggy_result = unhexlify("BA015C4E5AE54D76C890AE81BD40DC57" + "03EDC30E8AC2A58BC5D8FA4D61C5BAE6" + "C39BEAC435B2FD56A2A5085C1B135D77" + "0C8264B7") + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce[:-1], mac_len=mac_len) + cipher.update(A) + C_out2, tag_out2 = cipher.encrypt_and_digest(P) + self.assertEqual(buggy_result, C_out2 + tag_out2) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OcbTests) + tests += list_test_cases(OcbFSMTests) + tests += list_test_cases(OcbRfc7253Test) + tests += list_test_cases(OcbDkgTest) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py new file mode 100644 index 0000000..9a8ef0a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py @@ -0,0 +1,238 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + +class OfbTests(BlockChainingTests): + + aes_mode = AES.MODE_OFB + des3_mode = DES3.MODE_OFB + + # Redefine test_unaligned_data_128/64 + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + +from Cryptodome.SelfTest.Cipher.test_CBC import NistBlockChainingVectors + +class NistOfbVectors(NistBlockChainingVectors): + aes_mode = AES.MODE_OFB + des_mode = DES.MODE_OFB + des3_mode = DES3.MODE_OFB + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "OFBGFSbox128.rsp", + "OFBGFSbox192.rsp", + "OFBGFSbox256.rsp", + "OFBKeySbox128.rsp", + "OFBKeySbox192.rsp", + "OFBKeySbox256.rsp", + "OFBVarKey128.rsp", + "OFBVarKey192.rsp", + "OFBVarKey256.rsp", + "OFBVarTxt128.rsp", + "OFBVarTxt192.rsp", + "OFBVarTxt256.rsp", + # MMT + "OFBMMT128.rsp", + "OFBMMT192.rsp", + "OFBMMT256.rsp", + ) +nist_aes_mct_files = ( + "OFBMCT128.rsp", + "OFBMCT192.rsp", + "OFBMCT256.rsp", + ) + +for file_name in nist_aes_kat_mmt_files: + def new_func(self, file_name=file_name): + self._do_kat_aes_test(file_name) + setattr(NistOfbVectors, "test_AES_" + file_name, new_func) + +for file_name in nist_aes_mct_files: + def new_func(self, file_name=file_name): + self._do_mct_aes_test(file_name) + setattr(NistOfbVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TOFBMMT2.rsp", # 2TDES + "TOFBMMT3.rsp", # 3TDES + "TOFBinvperm.rsp", # Single DES + "TOFBpermop.rsp", + "TOFBsubtab.rsp", + "TOFBvarkey.rsp", + "TOFBvartext.rsp", + ) + +for file_name in nist_tdes_files: + def new_func(self, file_name=file_name): + self._do_tdes_test(file_name) + setattr(NistOfbVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST OFB TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the OFB test vectors found in Section F.4 + of NIST SP 800-3A""" + + def test_aes_128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '3b3fd92eb72dad20333449f8e83cfb4a' +\ + '7789508d16918f03f53c52dac54ed825' +\ + '9740051e9c5fecf64344f7a82260edcc' +\ + '304c6528f659c77866a510d9c1d6ae5e' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + def test_aes_192(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'cdc80d6fddf18cab34c25909c99a4174' +\ + 'fcc28b8d4c63837c09e81700c1100401' +\ + '8d9a9aeac0f6596f559c6d4daf59a5f2' +\ + '6d9f200857ca6c3e9cac524bd9acc92a' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + def test_aes_256(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'dc7e84bfda79164b7ecd8486985d3860' +\ + '4febdc6740d20b3ac88f6ad82a4fb08d' +\ + '71ab47a086e86eedf39d1c5bba97c408' +\ + '0126141d67f37be8538f5a8be740e484' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OfbTests) + if config.get('slow_tests'): + tests += list_test_cases(NistOfbVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py new file mode 100644 index 0000000..4090a1a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py @@ -0,0 +1,218 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + +class OpenPGPTests(BlockChainingTests): + + aes_mode = AES.MODE_OPENPGP + des3_mode = DES3.MODE_OPENPGP + + # Redefine test_unaligned_data_128/64 + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + iv_128 = get_tag_random("iv_128", 16) + iv_64 = get_tag_random("iv_64", 8) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + eiv, ct = ct[:18], ct[18:] + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + eiv, ct = ct[:10], ct[10:] + + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, eiv) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_IV_iv_attributes(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + self.assertEqual(cipher.iv, self.iv_128) + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + self.assertEqual(cipher.iv, self.iv_128) + + def test_null_encryption_decryption(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + self.assertEqual(cipher.decrypt(b""), b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_output_param(self): + pass + + def test_output_param_same_buffer(self): + pass + + def test_output_param_memoryview(self): + pass + + def test_output_param_neg(self): + pass + + +class TestVectors(unittest.TestCase): + + def test_aes(self): + # The following test vectors have been generated with gpg v1.4.0. + # The command line used was: + # + # gpg -c -z 0 --cipher-algo AES --passphrase secret_passphrase \ + # --disable-mdc --s2k-mode 0 --output ct pt + # + # As result, the content of the file 'pt' is encrypted with a key derived + # from 'secret_passphrase' and written to file 'ct'. + # Test vectors must be extracted from 'ct', which is a collection of + # TLVs (see RFC4880 for all details): + # - the encrypted data (with the encrypted IV as prefix) is the payload + # of the TLV with tag 9 (Symmetrical Encrypted Data Packet). + # This is the ciphertext in the test vector. + # - inside the encrypted part, there is a further layer of TLVs. One must + # look for tag 11 (Literal Data Packet); in its payload, after a short + # but time dependent header, there is the content of file 'pt'. + # In the test vector, the plaintext is the complete set of TLVs that gets + # encrypted. It is not just the content of 'pt'. + # - the key is the leftmost 16 bytes of the SHA1 digest of the password. + # The test vector contains such shortened digest. + # + # Note that encryption uses a clear IV, and decryption an encrypted IV + + plaintext = 'ac18620270744fb4f647426c61636b4361745768697465436174' + ciphertext = 'dc6b9e1f095de609765c59983db5956ae4f63aea7405389d2ebb' + key = '5baa61e4c9b93f3f0682250b6cf8331b' + iv = '3d7d3e62282add7eb203eeba5c800733' + encrypted_iv='fd934601ef49cb58b6d9aebca6056bdb96ef' + + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + key = unhexlify(key) + iv = unhexlify(iv) + encrypted_iv = unhexlify(encrypted_iv) + + cipher = AES.new(key, AES.MODE_OPENPGP, iv) + ct = cipher.encrypt(plaintext) + self.assertEqual(ct[:18], encrypted_iv) + self.assertEqual(ct[18:], ciphertext) + + cipher = AES.new(key, AES.MODE_OPENPGP, encrypted_iv) + pt = cipher.decrypt(ciphertext) + self.assertEqual(pt, plaintext) + + def test_des3(self): + # The following test vectors have been generated with gpg v1.4.0. + # The command line used was: + # gpg -c -z 0 --cipher-algo 3DES --passphrase secret_passphrase \ + # --disable-mdc --s2k-mode 0 --output ct pt + # For an explanation, see test_AES.py . + + plaintext = 'ac1762037074324fb53ba3596f73656d69746556616c6c6579' + ciphertext = '9979238528357b90e2e0be549cb0b2d5999b9a4a447e5c5c7d' + key = '7ade65b460f5ea9be35f9e14aa883a2048e3824aa616c0b2' + iv='cd47e2afb8b7e4b0' + encrypted_iv='6a7eef0b58050e8b904a' + + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + key = unhexlify(key) + iv = unhexlify(iv) + encrypted_iv = unhexlify(encrypted_iv) + + cipher = DES3.new(key, DES3.MODE_OPENPGP, iv) + ct = cipher.encrypt(plaintext) + self.assertEqual(ct[:10], encrypted_iv) + self.assertEqual(ct[10:], ciphertext) + + cipher = DES3.new(key, DES3.MODE_OPENPGP, encrypted_iv) + pt = cipher.decrypt(ciphertext) + self.assertEqual(pt, plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OpenPGPTests) + tests += list_test_cases(TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py new file mode 100644 index 0000000..d4bb5a9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py @@ -0,0 +1,552 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class SivTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + key_384 = get_tag_random("key_384", 48) + key_512 = get_tag_random("key_512", 64) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + for key in self.key_256, self.key_384, self.key_512: + cipher = AES.new(key, AES.MODE_SIV, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct, mac = cipher.encrypt_and_digest(pt) + + cipher = AES.new(key, AES.MODE_SIV, nonce=self.nonce_96) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Deterministic encryption + AES.new(self.key_256, AES.MODE_SIV) + + cipher = AES.new(self.key_256, AES.MODE_SIV, self.nonce_96) + ct1, tag1 = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct2, tag2 = cipher.encrypt_and_digest(self.data) + self.assertEqual(ct1 + tag1, ct2 + tag2) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_256, AES.MODE_SIV, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=bchr(1) * x) + cipher.encrypt_and_digest(b'\x01') + + def test_block_size_128(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, no nonce is randomly generated + self.assertFalse(hasattr(AES.new(self.key_256, AES.MODE_SIV), "nonce")) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96, + use_aesni=False) + + def test_encrypt_excludes_decrypt(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.decrypt, self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.decrypt_and_verify, + self.data, self.data) + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt_and_verify, + u'test1234567890-*', b"xxxx") + + def test_mac_len(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_bytearray(self): + + # Encrypt + key = bytearray(self.key_256) + nonce = bytearray(self.nonce_96) + data = bytearray(self.data) + header = bytearray(self.data) + + cipher1 = AES.new(self.key_256, + AES.MODE_SIV, + nonce=self.nonce_96) + cipher1.update(self.data) + ct, tag = cipher1.encrypt_and_digest(self.data) + + cipher2 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher2.update(header) + header[:3] = b'\xFF\xFF\xFF' + ct_test, tag_test = cipher2.encrypt_and_digest(data) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key = bytearray(self.key_256) + nonce = bytearray(self.nonce_96) + header = bytearray(self.data) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + + cipher3 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher3.update(header) + header[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt_and_verify(ct_ba, tag_ba) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key = memoryview(bytearray(self.key_256)) + nonce = memoryview(bytearray(self.nonce_96)) + data = memoryview(bytearray(self.data)) + header = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_256, + AES.MODE_SIV, + nonce=self.nonce_96) + cipher1.update(self.data) + ct, tag = cipher1.encrypt_and_digest(self.data) + + cipher2 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher2.update(header) + header[:3] = b'\xFF\xFF\xFF' + ct_test, tag_test= cipher2.encrypt_and_digest(data) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key = memoryview(bytearray(self.key_256)) + nonce = memoryview(bytearray(self.nonce_96)) + header = memoryview(bytearray(self.data)) + ct_ba = memoryview(bytearray(ct)) + tag_ba = memoryview(bytearray(tag)) + + cipher3 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher3.update(header) + header[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt_and_verify(ct_ba, tag_ba) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + output = bytearray(128) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt_and_digest, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt_and_verify, ct, tag, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt_and_digest, pt, output=shorter_output) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, tag, output=shorter_output) + + +class SivFSMTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data = get_tag_random("data", 128) + + def test_invalid_init_encrypt(self): + # Path INIT->ENCRYPT fails + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, b"xxx") + + def test_invalid_init_decrypt(self): + # Path INIT->DECRYPT fails + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, b"xxx") + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_multiple_encrypt_and_digest(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.encrypt_and_digest, b'') + + def test_invalid_multiple_decrypt_and_verify(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, tag) + self.assertRaises(TypeError, cipher.decrypt_and_verify, ct, tag) + + +def transform(tv): + new_tv = [[unhexlify(x) for x in tv[0].split("-")]] + new_tv += [ unhexlify(x) for x in tv[1:5]] + if tv[5]: + nonce = unhexlify(tv[5]) + else: + nonce = None + new_tv += [ nonce ] + return new_tv + + +class TestVectors(unittest.TestCase): + """Class exercising the SIV test vectors found in RFC5297""" + + # This is a list of tuples with 5 items: + # + # 1. Header + '|' + plaintext + # 2. Header + '|' + ciphertext + '|' + MAC + # 3. AES-128 key + # 4. Description + # 5. Dictionary of parameters to be passed to AES.new(). + # It must include the nonce. + # + # A "Header" is a dash ('-') separated sequece of components. + # + test_vectors_hex = [ + ( + '101112131415161718191a1b1c1d1e1f2021222324252627', + '112233445566778899aabbccddee', + '40c02b9690c4dc04daef7f6afe5c', + '85632d07c6e8f37f950acd320a2ecc93', + 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff', + None + ), + ( + '00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa9988' + + '7766554433221100-102030405060708090a0', + '7468697320697320736f6d6520706c61696e7465787420746f20656e63727970' + + '74207573696e67205349562d414553', + 'cb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829' + + 'ea64ad544a272e9c485b62a3fd5c0d', + '7bdb6e3b432667eb06f4d14bff2fbd0f', + '7f7e7d7c7b7a79787776757473727170404142434445464748494a4b4c4d4e4f', + '09f911029d74e35bd84156c5635688c0' + ), + ] + + test_vectors = [ transform(tv) for tv in test_vectors_hex ] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + + # Encrypt + cipher = AES.new(key, AES.MODE_SIV, nonce=nonce) + for x in assoc_data: + cipher.update(x) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_SIV, nonce=nonce) + for x in assoc_data: + cipher.update(x) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self): + unittest.TestCase.__init__(self) + self._id = "None" + + def setUp(self): + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_siv_cmac_test.json", + "Wycheproof AES SIV") + + def shortDescription(self): + return self._id + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV) + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(tag + ct, tv.ct) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt AES_SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV) + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct[16:], tv.ct[:16]) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + + +class TestVectorsWycheproof2(unittest.TestCase): + + def __init__(self): + unittest.TestCase.__init__(self) + self._id = "None" + + def setUp(self): + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aead_aes_siv_cmac_test.json", + "Wycheproof AEAD SIV") + + def shortDescription(self): + return self._id + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt AEAD-AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV, nonce=tv.iv) + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt AEAD-AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV, nonce=tv.iv) + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(SivTests) + tests += list_test_cases(SivFSMTests) + tests += [ TestVectors() ] + tests += [ TestVectorsWycheproof() ] + tests += [ TestVectorsWycheproof2() ] + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py new file mode 100644 index 0000000..a444906 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/Salsa20.py: Self-test for the Salsa20 stream cipher +# +# Written in 2013 by Fabrizio Tarizzo <fabrizio@fabriziotarizzo.org> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.Salsa20""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import Salsa20 + +from .common import make_stream_tests + +# This is a list of (plaintext, ciphertext, key[, description[, params]]) +# tuples. +test_data = [ + # Test vectors are taken from + # http://www.ecrypt.eu.org/stream/svn/viewcvs.cgi/ecrypt/trunk/submissions/salsa20/full/verified.test-vectors + ( '00' * 512, + '4dfa5e481da23ea09a31022050859936da52fcee218005164f267cb65f5cfd7f' + + '2b4f97e0ff16924a52df269515110a07f9e460bc65ef95da58f740b7d1dbb0aa' + + 'd64cec189c7eb8c6bbf3d7376c80a481d43e628701f6a27afb9fe23919f24114' + + '8db44f70d7063efcc3dd55a0893a613c3c6fe1c127bd6f59910589293bb6ef9e' + + 'e24819066dee1a64f49b0bbad5988635272b169af861f85df881939f29ada6fd' + + '0241410e8d332ae4798d929434a2630de451ec4e0169694cbaa7ebb121ea6a2b' + + 'da9c1581f429e0a00f7d67e23b730676783b262e8eb43a25f55fb90b3e753aef' + + '8c6713ec66c51881111593ccb3e8cb8f8de124080501eeeb389c4bcb6977cf95' + + '7d5789631eb4554400e1e025935dfa7b3e9039d61bdc58a8697d36815bf1985c' + + 'efdf7ae112e5bb81e37ecf0616ce7147fc08a93a367e08631f23c03b00a8da2f' + + 'aa5024e5c8d30aca43fc2d5082067b21b234bc741d68fb292c6012c3764ccee3' + + '1e364a5403e00cfee338a21a01e7d3cefd5a770ca0ab48c435ea6116435f7ad8' + + '30b217b49f978a68e207ed9f462af7fb195b2115fe8f24f152e4ddc32202d6f2' + + 'b52fafbcfbc202d8a259a611e901d3f62d065eb13f09bbc45cd45119b843efaa' + + 'b375703739daced4dd4059fd71c3c47fc2f9939670fad4a46066adcc6a564578' + + '3308b90ffb72be04a6b147cbe38cc0c3b9267c296a92a7c69873f9f263be9703', + '80000000000000000000000000000000', + '128 bits key, set 1, vector 0', + dict (iv='00'*8)), + + ( '00' * 512, + 'e3be8fdd8beca2e3ea8ef9475b29a6e7003951e1097a5c38d23b7a5fad9f6844' + + 'b22c97559e2723c7cbbd3fe4fc8d9a0744652a83e72a9c461876af4d7ef1a117' + + '8da2b74eef1b6283e7e20166abcae538e9716e4669e2816b6b20c5c356802001' + + 'cc1403a9a117d12a2669f456366d6ebb0f1246f1265150f793cdb4b253e348ae' + + '203d89bc025e802a7e0e00621d70aa36b7e07cb1e7d5b38d5e222b8b0e4b8407' + + '0142b1e29504767d76824850320b5368129fdd74e861b498e3be8d16f2d7d169' + + '57be81f47b17d9ae7c4ff15429a73e10acf250ed3a90a93c711308a74c6216a9' + + 'ed84cd126da7f28e8abf8bb63517e1ca98e712f4fb2e1a6aed9fdc73291faa17' + + '958211c4ba2ebd5838c635edb81f513a91a294e194f1c039aeec657dce40aa7e' + + '7c0af57cacefa40c9f14b71a4b3456a63e162ec7d8d10b8ffb1810d71001b618' + + '2f9f73da53b85405c11f7b2d890fa8ae0c7f2e926d8a98c7ec4e91b65120e988' + + '349631a700c6facec3471cb0413656e75e309456584084d7e12c5b43a41c43ed' + + '9a048abd9b880da65f6a665a20fe7b77cd292fe62cae644b7f7df69f32bdb331' + + '903e6505ce44fdc293920c6a9ec7057e23df7dad298f82ddf4efb7fdc7bfc622' + + '696afcfd0cddcc83c7e77f11a649d79acdc3354e9635ff137e929933a0bd6f53' + + '77efa105a3a4266b7c0d089d08f1e855cc32b15b93784a36e56a76cc64bc8477', + '8000000000000000000000000000000000000000000000000000000000000000', + '256 bits key, set 1, vector 0', + dict (iv='00'*8)), + + ( '00' * 512, + '169060ccb42bea7bee4d8012a02f3635eb7bca12859fa159cd559094b3507db8' + + '01735d1a1300102a9c9415546829cbd2021ba217b39b81d89c55b13d0c603359' + + '3f84159a3c84f4b4f4a0edcd9d38ff261a737909e0b66d68b5cac496f3a5be99' + + 'cb12c321ab711afaab36cc0947955e1a9bb952ed54425e7711279fbc81bb83f5' + + '6e55cea44e6daddb05858a153ea6213b3350c12aa1a83ef2726f09485fa71790' + + 'f9b9f922c7dda1113b1f9d56658ed3402803f511bc1f122601d5e7f0ff036e23' + + '23ef24bb24195b9fd574823cd8a40c29d86bd35c191e2038779ff696c712b6d8' + + '2e7014dbe1ac5d527af076c088c4a8d44317958189f6ef54933a7e0816b5b916' + + 'd8f12ed8afe9422b85e5cc9b8adec9d6cfabe8dbc1082bccc02f5a7266aa074c' + + 'a284e583a35837798cc0e69d4ce937653b8cdd65ce414b89138615ccb165ad19' + + '3c6b9c3d05eef4be921a10ea811fe61d11c6867600188e065daff90b509ec56b' + + 'd41e7e8968c478c78d590c2d2ee24ea009c8f49bc3d81672cfc47895a9e21c9a' + + '471ebf8e294bee5d2de436ac8d052bf31111b345f1da23c3a4d13b9fc5f0900a' + + 'a298f98f538973b8fad40d4d159777de2cfe2a3dead1645ddb49794827dba040' + + 'f70a0ff4ecd155e0f033604693a51e2363880e2ecf98699e7174af7c2c6b0fc6' + + '59ae329599a3949272a37b9b2183a0910922a3f325ae124dcbdd735364055ceb', + '09090909090909090909090909090909', + '128 bits key, set 2, vector 9', + dict (iv='00'*8)), + + ( '00' * 512, + '7041e747ceb22ed7812985465f50333124f971da1c5d6efe5ca201b886f31046' + + 'e757e5c3ec914f60ed1f6bce2819b6810953f12b8ba1199bf82d746a8b8a88f1' + + '142002978ec4c35b95dc2c82990f9e847a0ab45f2ca72625f5190c820f29f3aa' + + 'f5f0b5572b06b70a144f2a240c3b3098d4831fa1ce1459f8d1df226a6a79b0ab' + + '41e91799ef31b5ff3d756c19126b19025858ee70fbd69f2be955cb011c005e31' + + '32b271b378f39b0cb594e95c99ce6ff17735a541891845bbf0450afcb4a850b9' + + '4ee90afb713ae7e01295c74381180a3816d7020d5a396c0d97aaa783eaabb6ec' + + '44d5111157f2212d1b1b8fca7893e8b520cd482418c272ab119b569a2b9598eb' + + '355624d12e79adab81153b58cd22eaf1b2a32395dedc4a1c66f4d274070b9800' + + 'ea95766f0245a8295f8aadb36ddbbdfa936417c8dbc6235d19494036964d3e70' + + 'b125b0f800c3d53881d9d11e7970f827c2f9556935cd29e927b0aceb8cae5fd4' + + '0fd88a8854010a33db94c96c98735858f1c5df6844f864feaca8f41539313e7f' + + '3c0610214912cd5e6362197646207e2d64cd5b26c9dfe0822629dcbeb16662e8' + + '9ff5bf5cf2e499138a5e27bd5027329d0e68ddf53103e9e409523662e27f61f6' + + '5cf38c1232023e6a6ef66c315bcb2a4328642faabb7ca1e889e039e7c444b34b' + + 'b3443f596ac730f3df3dfcdb343c307c80f76e43e8898c5e8f43dc3bb280add0', + '0909090909090909090909090909090909090909090909090909090909090909', + '256 bits key, set 2, vector 9', + dict (iv='00'*8)), + + ( '00' * 1024, + '71daee5142d0728b41b6597933ebf467e43279e30978677078941602629cbf68' + + 'b73d6bd2c95f118d2b3e6ec955dabb6dc61c4143bc9a9b32b99dbe6866166dc0' + + '8631b7d6553050303d7252c264d3a90d26c853634813e09ad7545a6ce7e84a5d' + + 'fc75ec43431207d5319970b0faadb0e1510625bb54372c8515e28e2accf0a993' + + '0ad15f431874923d2a59e20d9f2a5367dba6051564f150287debb1db536ff9b0' + + '9ad981f25e5010d85d76ee0c305f755b25e6f09341e0812f95c94f42eead346e' + + '81f39c58c5faa2c88953dc0cac90469db2063cb5cdb22c9eae22afbf0506fca4' + + '1dc710b846fbdfe3c46883dd118f3a5e8b11b6afd9e71680d8666557301a2daa' + + 'fb9496c559784d35a035360885f9b17bd7191977deea932b981ebdb29057ae3c' + + '92cfeff5e6c5d0cb62f209ce342d4e35c69646ccd14e53350e488bb310a32f8b' + + '0248e70acc5b473df537ced3f81a014d4083932bedd62ed0e447b6766cd2604b' + + '706e9b346c4468beb46a34ecf1610ebd38331d52bf33346afec15eefb2a7699e' + + '8759db5a1f636a48a039688e39de34d995df9f27ed9edc8dd795e39e53d9d925' + + 'b278010565ff665269042f05096d94da3433d957ec13d2fd82a0066283d0d1ee' + + 'b81bf0ef133b7fd90248b8ffb499b2414cd4fa003093ff0864575a43749bf596' + + '02f26c717fa96b1d057697db08ebc3fa664a016a67dcef8807577cc3a09385d3' + + 'f4dc79b34364bb3b166ce65fe1dd28e3950fe6fa81063f7b16ce1c0e6daac1f8' + + '188455b77752045e863c9b256ad92bc6e2d08314c5bba191c274f42dfbb3d652' + + 'bb771956555e880f84cd8b827a4c5a52f3a099fa0259bd4aac3efd541f191170' + + '4412d6e85fbcc628b335875b9fef24807f6e1bc66c3186159e1e7f5a13913e02' + + 'd241ce2efdbcaa275039fb14eac5923d17ffbc7f1abd3b45e92127575bfbabf9' + + '3a257ebef0aa1437b326e41b585af572f7239c33b32981a1577a4f629b027e1e' + + 'b49d58cc497e944d79cef44357c2bf25442ab779651e991147bf79d6fd3a8868' + + '0cd3b1748e07fd10d78aceef6db8a5e563570d40127f754146c34a440f2a991a' + + '23fa39d365141f255041f2135c5cba4373452c114da1801bacca38610e3a6524' + + '2b822d32de4ab5a7d3cf9b61b37493c863bd12e2cae10530cddcda2cb7a5436b' + + 'ef8988d4d24e8cdc31b2d2a3586340bc5141f8f6632d0dd543bfed81eb471ba1' + + 'f3dc2225a15ffddcc03eb48f44e27e2aa390598adf83f15c6608a5f18d4dfcf0' + + 'f547d467a4d70b281c83a595d7660d0b62de78b9cca023cca89d7b1f83484638' + + '0e228c25f049184a612ef5bb3d37454e6cfa5b10dceda619d898a699b3c8981a' + + '173407844bb89b4287bf57dd6600c79e352c681d74b03fa7ea0d7bf6ad69f8a6' + + '8ecb001963bd2dd8a2baa0083ec09751cd9742402ad716be16d5c052304cfca1', + '0F62B5085BAE0154A7FA4DA0F34699EC', + '128 bits key, Set 6, vector# 3', + dict (iv='288FF65DC42B92F9')), + + ( '00' * 1024, + '5e5e71f90199340304abb22a37b6625bf883fb89ce3b21f54a10b81066ef87da' + + '30b77699aa7379da595c77dd59542da208e5954f89e40eb7aa80a84a6176663f' + + 'd910cde567cf1ff60f7040548d8f376bfd1f44c4774aac37410ede7d5c3463fc' + + '4508a603201d8495ad257894e5eb1914b53e8da5e4bf2bc83ac87ce55cc67df7' + + '093d9853d2a83a9c8be969175df7c807a17156df768445dd0874a9271c6537f5' + + 'ce0466473582375f067fa4fcdaf65dbc0139cd75e8c21a482f28c0fb8c3d9f94' + + '22606cc8e88fe28fe73ec3cb10ff0e8cc5f2a49e540f007265c65b7130bfdb98' + + '795b1df9522da46e48b30e55d9f0d787955ece720205b29c85f3ad9be33b4459' + + '7d21b54d06c9a60b04b8e640c64e566e51566730e86cf128ab14174f91bd8981' + + 'a6fb00fe587bbd6c38b5a1dfdb04ea7e61536fd229f957aa9b070ca931358e85' + + '11b92c53c523cb54828fb1513c5636fa9a0645b4a3c922c0db94986d92f314ff' + + '7852c03b231e4dceea5dd8cced621869cff818daf3c270ff3c8be2e5c74be767' + + 'a4e1fdf3327a934fe31e46df5a74ae2021cee021d958c4f615263d99a5ddae7f' + + 'eab45e6eccbafefe4761c57750847b7e75ee2e2f14333c0779ce4678f47b1e1b' + + '760a03a5f17d6e91d4b42313b3f1077ee270e432fe04917ed1fc8babebf7c941' + + '42b80dfb44a28a2a3e59093027606f6860bfb8c2e5897078cfccda7314c70035' + + 'f137de6f05daa035891d5f6f76e1df0fce1112a2ff0ac2bd3534b5d1bf4c7165' + + 'fb40a1b6eacb7f295711c4907ae457514a7010f3a342b4427593d61ba993bc59' + + '8bd09c56b9ee53aac5dd861fa4b4bb53888952a4aa9d8ca8671582de716270e1' + + '97375b3ee49e51fa2bf4ef32015dd9a764d966aa2ae541592d0aa650849e99ca' + + '5c6c39beebf516457cc32fe4c105bff314a12f1ec94bdf4d626f5d9b1cbbde42' + + 'e5733f0885765ba29e2e82c829d312f5fc7e180679ac84826c08d0a644b326d0' + + '44da0fdcc75fa53cfe4ced0437fa4df5a7ecbca8b4cb7c4a9ecf9a60d00a56eb' + + '81da52adc21f508dbb60a9503a3cc94a896616d86020d5b0e5c637329b6d396a' + + '41a21ba2c4a9493cf33fa2d4f10f77d5b12fdad7e478ccfe79b74851fc96a7ca' + + '6320c5efd561a222c0ab0fb44bbda0e42149611d2262bb7d1719150fa798718a' + + '0eec63ee297cad459869c8b0f06c4e2b56cbac03cd2605b2a924efedf85ec8f1' + + '9b0b6c90e7cbd933223ffeb1b3a3f9677657905829294c4c70acdb8b0891b47d' + + '0875d0cd6c0f4efe2917fc44b581ef0d1e4280197065d07da34ab33283364552' + + 'efad0bd9257b059acdd0a6f246812feb69e7e76065f27dbc2eee94da9cc41835' + + 'bf826e36e5cebe5d4d6a37a6a666246290ce51a0c082718ab0ec855668db1add' + + 'a658e5f257e0db39384d02e6145c4c00eaa079098f6d820d872de711b6ed08cf', + '0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C', + '256 bits key, Set 6, vector# 3', + dict (iv='288FF65DC42B92F9')), + +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + + nonce = bchr(0) * 8 + for key_length in (15, 30, 33): + key = bchr(1) * key_length + self.assertRaises(ValueError, Salsa20.new, key, nonce) + + +class NonceTests(unittest.TestCase): + + def test_invalid_nonce_length(self): + key = bchr(1) * 16 + self.assertRaises(ValueError, Salsa20.new, key, bchr(0) * 7) + self.assertRaises(ValueError, Salsa20.new, key, bchr(0) * 9) + + def test_default_nonce(self): + + cipher1 = Salsa20.new(bchr(1) * 16) + cipher2 = Salsa20.new(bchr(1) * 16) + self.assertEqual(len(cipher1.nonce), 8) + self.assertNotEqual(cipher1.nonce, cipher2.nonce) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_ba = bytearray(data) + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + + cipher1 = Salsa20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = Salsa20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_ba) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + ct_ba = bytearray(ct) + + cipher3 = Salsa20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_ba) + + self.assertEqual(data, pt_test) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_mv = memoryview(bytearray(data)) + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + + cipher1 = Salsa20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = Salsa20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_mv) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + ct_mv = memoryview(bytearray(ct)) + + cipher3 = Salsa20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_mv) + + self.assertEqual(data, pt_test) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 8 + cipher = Salsa20.new(key=key, nonce=nonce) + + pt = b'5' * 300 + ct = cipher.encrypt(pt) + + output = bytearray(len(pt)) + cipher = Salsa20.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = Salsa20.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(len(pt))) + cipher = Salsa20.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = Salsa20.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*len(pt)) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*len(ct)) + + shorter_output = bytearray(len(pt) - 1) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + tests = make_stream_tests(Salsa20, "Salsa20", test_data) + tests.append(KeyLength()) + tests += list_test_cases(NonceTests) + tests.append(ByteArrayTest()) + tests.append(MemoryviewTest()) + tests.append(TestOutput()) + + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py new file mode 100644 index 0000000..12c09dd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py @@ -0,0 +1,283 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_pkcs1_15.py: Self-test for PKCS#1 v1.5 encryption +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import unittest + +from Cryptodome.PublicKey import RSA +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex +from Cryptodome import Random +from Cryptodome.Cipher import PKCS1_v1_5 as PKCS +from Cryptodome.Util.py3compat import b +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + + +def rws(t): + """Remove white spaces, tabs, and new lines from a string""" + for c in ['\n', '\t', ' ']: + t = t.replace(c, '') + return t + + +def t2b(t): + """Convert a text string with bytes in hex form to a byte string""" + clean = b(rws(t)) + if len(clean) % 2 == 1: + raise ValueError("Even number of characters expected") + return a2b_hex(clean) + + +class PKCS1_15_Tests(unittest.TestCase): + + def setUp(self): + self.rng = Random.new().read + self.key1024 = RSA.generate(1024, self.rng) + + # List of tuples with test data for PKCS#1 v1.5. + # Each tuple is made up by: + # Item #0: dictionary with RSA key component, or key to import + # Item #1: plaintext + # Item #2: ciphertext + # Item #3: random data + + _testData = ( + + # + # Generated with openssl 0.9.8o + # + ( + # Private key + '''-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDAiAnvIAOvqVwJTaYzsKnefZftgtXGE2hPJppGsWl78yz9jeXY +W/FxX/gTPURArNhdnhP6n3p2ZaDIBrO2zizbgIXs0IsljTTcr4vnI8fMXzyNUOjA +zP3nzMqZDZK6757XQAobOssMkBFqRWwilT/3DsBhRpl3iMUhF+wvpTSHewIDAQAB +AoGAC4HV/inOrpgTvSab8Wj0riyZgQOZ3U3ZpSlsfR8ra9Ib9Uee3jCYnKscu6Gk +y6zI/cdt8EPJ4PuwAWSNJzbpbVaDvUq25OD+CX8/uRT08yBS4J8TzBitZJTD4lS7 +atdTnKT0Wmwk+u8tDbhvMKwnUHdJLcuIsycts9rwJVapUtkCQQDvDpx2JMun0YKG +uUttjmL8oJ3U0m3ZvMdVwBecA0eebZb1l2J5PvI3EJD97eKe91Nsw8T3lwpoN40k +IocSVDklAkEAzi1HLHE6EzVPOe5+Y0kGvrIYRRhncOb72vCvBZvD6wLZpQgqo6c4 +d3XHFBBQWA6xcvQb5w+VVEJZzw64y25sHwJBAMYReRl6SzL0qA0wIYrYWrOt8JeQ +8mthulcWHXmqTgC6FEXP9Es5GD7/fuKl4wqLKZgIbH4nqvvGay7xXLCXD/ECQH9a +1JYNMtRen5unSAbIOxRcKkWz92F0LKpm9ZW/S9vFHO+mBcClMGoKJHiuQxLBsLbT +NtEZfSJZAeS2sUtn3/0CQDb2M2zNBTF8LlM0nxmh0k9VGm5TVIyBEMcipmvOgqIs +HKukWBcq9f/UOmS0oEhai/6g+Uf7VHJdWaeO5LzuvwU= +-----END RSA PRIVATE KEY-----''', + # Plaintext + '''THIS IS PLAINTEXT\x0A''', + # Ciphertext + '''3f dc fd 3c cd 5c 9b 12 af 65 32 e3 f7 d0 da 36 + 8f 8f d9 e3 13 1c 7f c8 b3 f9 c1 08 e4 eb 79 9c + 91 89 1f 96 3b 94 77 61 99 a4 b1 ee 5d e6 17 c9 + 5d 0a b5 63 52 0a eb 00 45 38 2a fb b0 71 3d 11 + f7 a1 9e a7 69 b3 af 61 c0 bb 04 5b 5d 4b 27 44 + 1f 5b 97 89 ba 6a 08 95 ee 4f a2 eb 56 64 e5 0f + da 7c f9 9a 61 61 06 62 ed a0 bc 5f aa 6c 31 78 + 70 28 1a bb 98 3c e3 6a 60 3c d1 0b 0f 5a f4 75''', + # Random data + '''eb d7 7d 86 a4 35 23 a3 54 7e 02 0b 42 1d + 61 6c af 67 b8 4e 17 56 80 66 36 04 64 34 26 8a + 47 dd 44 b3 1a b2 17 60 f4 91 2e e2 b5 95 64 cc + f9 da c8 70 94 54 86 4c ef 5b 08 7d 18 c4 ab 8d + 04 06 33 8f ca 15 5f 52 60 8a a1 0c f5 08 b5 4c + bb 99 b8 94 25 04 9c e6 01 75 e6 f9 63 7a 65 61 + 13 8a a7 47 77 81 ae 0d b8 2c 4d 50 a5''' + ), + ) + + def testEncrypt1(self): + for test in self._testData: + # Build the key + key = RSA.importKey(test[0]) + # RNG that takes its random numbers from a pool given + # at initialization + class randGen: + def __init__(self, data): + self.data = data + self.idx = 0 + def __call__(self, N): + r = self.data[self.idx:self.idx+N] + self.idx += N + return r + # The real test + cipher = PKCS.new(key, randfunc=randGen(t2b(test[3]))) + ct = cipher.encrypt(b(test[1])) + self.assertEqual(ct, t2b(test[2])) + + def testEncrypt2(self): + # Verify that encryption fail if plaintext is too long + pt = '\x00'*(128-11+1) + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.encrypt, pt) + + def testVerify1(self): + for test in self._testData: + key = RSA.importKey(test[0]) + expected_pt = b(test[1]) + ct = t2b(test[2]) + cipher = PKCS.new(key) + + # The real test + pt = cipher.decrypt(ct, None) + self.assertEqual(pt, expected_pt) + + pt = cipher.decrypt(ct, b'\xFF' * len(expected_pt)) + self.assertEqual(pt, expected_pt) + + def testVerify2(self): + # Verify that decryption fails if ciphertext is not as long as + # RSA modulus + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.decrypt, '\x00'*127, "---") + self.assertRaises(ValueError, cipher.decrypt, '\x00'*129, "---") + + # Verify that decryption fails if there are less then 8 non-zero padding + # bytes + pt = b('\x00\x02' + '\xFF'*7 + '\x00' + '\x45'*118) + pt_int = bytes_to_long(pt) + ct_int = self.key1024._encrypt(pt_int) + ct = long_to_bytes(ct_int, 128) + self.assertEqual(b"---", cipher.decrypt(ct, b"---")) + + def testEncryptVerify1(self): + # Encrypt/Verify messages of length [0..RSAlen-11] + # and therefore padding [8..117] + for pt_len in range(0, 128 - 11 + 1): + pt = self.rng(pt_len) + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + pt2 = cipher.decrypt(ct, b'\xAA' * pt_len) + self.assertEqual(pt, pt2) + + def test_encrypt_verify_exp_pt_len(self): + + cipher = PKCS.new(self.key1024) + pt = b'5' * 16 + ct = cipher.encrypt(pt) + sentinel = b'\xAA' * 16 + + pt_A = cipher.decrypt(ct, sentinel, 16) + self.assertEqual(pt, pt_A) + + pt_B = cipher.decrypt(ct, sentinel, 15) + self.assertEqual(sentinel, pt_B) + + pt_C = cipher.decrypt(ct, sentinel, 17) + self.assertEqual(sentinel, pt_C) + + def testByteArray(self): + pt = b"XER" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(bytearray(pt)) + pt2 = cipher.decrypt(bytearray(ct), '\xFF' * len(pt)) + self.assertEqual(pt, pt2) + + def testMemoryview(self): + pt = b"XER" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(memoryview(bytearray(pt))) + pt2 = cipher.decrypt(memoryview(bytearray(ct)), b'\xFF' * len(pt)) + self.assertEqual(pt, pt2) + + def test_return_type(self): + pt = b"XYZ" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + self.assertTrue(isinstance(ct, bytes)) + pt2 = cipher.decrypt(ct, b'\xAA' * 3) + self.assertTrue(isinstance(pt2, bytes)) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, skip_slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._skip_slow_tests = skip_slow_tests + self._id = "None" + + def load_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['privateKeyPem']) + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof PKCS#1v1.5 (%s)" % filename, + group_tag={'rsa_key': filter_rsa} + ) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("rsa_pkcs1_2048_test.json")) + if not self._skip_slow_tests: + self.tv.extend(self.load_tests("rsa_pkcs1_3072_test.json")) + self.tv.extend(self.load_tests("rsa_pkcs1_4096_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt PKCS#1v1.5 Test #%s" % tv.id + sentinel = b'\xAA' * max(3, len(tv.msg)) + cipher = PKCS.new(tv.rsa_key) + try: + pt = cipher.decrypt(tv.ct, sentinel=sentinel) + except ValueError: + assert not tv.valid + else: + if pt == sentinel: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_decrypt(tv) + + +def get_tests(config={}): + skip_slow_tests = not config.get('slow_tests') + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PKCS1_15_Tests) + tests += [TestVectorsWycheproof(wycheproof_warnings, skip_slow_tests)] + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py new file mode 100644 index 0000000..aa00c9c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py @@ -0,0 +1,506 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_pkcs1_oaep.py: Self-test for PKCS#1 OAEP encryption +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +from Cryptodome.PublicKey import RSA +from Cryptodome.Cipher import PKCS1_OAEP as PKCS +from Cryptodome.Hash import MD2, MD5, SHA1, SHA256, RIPEMD160, SHA224, SHA384, SHA512 +from Cryptodome import Random +from Cryptodome.Signature.pss import MGF1 + +from Cryptodome.Util.py3compat import b, bchr + + +def rws(t): + """Remove white spaces, tabs, and new lines from a string""" + for c in ['\n', '\t', ' ']: + t = t.replace(c, '') + return t + + +def t2b(t): + """Convert a text string with bytes in hex form to a byte string""" + clean = rws(t) + if len(clean) % 2 == 1: + raise ValueError("Even number of characters expected") + return a2b_hex(clean) + + +class PKCS1_OAEP_Tests(unittest.TestCase): + + def setUp(self): + self.rng = Random.new().read + self.key1024 = RSA.generate(1024, self.rng) + + # List of tuples with test data for PKCS#1 OAEP + # Each tuple is made up by: + # Item #0: dictionary with RSA key component + # Item #1: plaintext + # Item #2: ciphertext + # Item #3: random data (=seed) + # Item #4: hash object + + _testData = ( + + # + # From in oaep-int.txt to be found in + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 + 36 8d 07 ee d4 10 43 a4 40 d6 b6 f0 74 54 f5 1f + b8 df ba af 03 5c 02 ab 61 ea 48 ce eb 6f cd 48 + 76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f + af b8 e0 a3 df c7 37 72 3e e6 b4 b7 d9 3a 25 84 + ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e + e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f + e2 53 72 98 ca 2a 8f 59 46 f8 e5 fd 09 1d bd cb''', + # Public key + 'e':'11', + # In the test vector, only p and q were given... + # d is computed offline as e^{-1} mod (p-1)(q-1) + 'd':'''a5dafc5341faf289c4b988db30c1cdf83f31251e0 + 668b42784813801579641b29410b3c7998d6bc465745e5c3 + 92669d6870da2c082a939e37fdcb82ec93edac97ff3ad595 + 0accfbc111c76f1a9529444e56aaf68c56c092cd38dc3bef + 5d20a939926ed4f74a13eddfbe1a1cecc4894af9428c2b7b + 8883fe4463a4bc85b1cb3c1''' + } + , + # Plaintext + '''d4 36 e9 95 69 fd 32 a7 c8 a0 5b bc 90 d3 2c 49''', + # Ciphertext + '''12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 + 39 a3 3d 1e 99 6f c8 2a 94 cc d3 00 74 c9 5d f7 + 63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6 + 53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb + 6d 84 b1 c3 1d 65 4a 19 70 e5 78 3b d6 eb 96 a0 + 24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48 + da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d + 51 a7 4d df 85 d8 b5 0d e9 68 38 d6 06 3e 09 55''', + # Random + '''aa fd 12 f6 59 ca e6 34 89 b4 79 e5 07 6d de c2 + f0 6c b5 8f''', + # Hash + SHA1, + ), + + # + # From in oaep-vect.txt to be found in Example 1.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''a8 b3 b2 84 af 8e b5 0b 38 70 34 a8 60 f1 46 c4 + 91 9f 31 87 63 cd 6c 55 98 c8 ae 48 11 a1 e0 ab + c4 c7 e0 b0 82 d6 93 a5 e7 fc ed 67 5c f4 66 85 + 12 77 2c 0c bc 64 a7 42 c6 c6 30 f5 33 c8 cc 72 + f6 2a e8 33 c4 0b f2 58 42 e9 84 bb 78 bd bf 97 + c0 10 7d 55 bd b6 62 f5 c4 e0 fa b9 84 5c b5 14 + 8e f7 39 2d d3 aa ff 93 ae 1e 6b 66 7b b3 d4 24 + 76 16 d4 f5 ba 10 d4 cf d2 26 de 88 d3 9f 16 fb''', + 'e':'''01 00 01''', + 'd':'''53 33 9c fd b7 9f c8 46 6a 65 5c 73 16 ac a8 5c + 55 fd 8f 6d d8 98 fd af 11 95 17 ef 4f 52 e8 fd + 8e 25 8d f9 3f ee 18 0f a0 e4 ab 29 69 3c d8 3b + 15 2a 55 3d 4a c4 d1 81 2b 8b 9f a5 af 0e 7f 55 + fe 73 04 df 41 57 09 26 f3 31 1f 15 c4 d6 5a 73 + 2c 48 31 16 ee 3d 3d 2d 0a f3 54 9a d9 bf 7c bf + b7 8a d8 84 f8 4d 5b eb 04 72 4d c7 36 9b 31 de + f3 7d 0c f5 39 e9 cf cd d3 de 65 37 29 ea d5 d1 ''' + } + , + # Plaintext + '''66 28 19 4e 12 07 3d b0 3b a9 4c da 9e f9 53 23 + 97 d5 0d ba 79 b9 87 00 4a fe fe 34''', + # Ciphertext + '''35 4f e6 7b 4a 12 6d 5d 35 fe 36 c7 77 79 1a 3f + 7b a1 3d ef 48 4e 2d 39 08 af f7 22 fa d4 68 fb + 21 69 6d e9 5d 0b e9 11 c2 d3 17 4f 8a fc c2 01 + 03 5f 7b 6d 8e 69 40 2d e5 45 16 18 c2 1a 53 5f + a9 d7 bf c5 b8 dd 9f c2 43 f8 cf 92 7d b3 13 22 + d6 e8 81 ea a9 1a 99 61 70 e6 57 a0 5a 26 64 26 + d9 8c 88 00 3f 84 77 c1 22 70 94 a0 d9 fa 1e 8c + 40 24 30 9c e1 ec cc b5 21 00 35 d4 7a c7 2e 8a''', + # Random + '''18 b7 76 ea 21 06 9d 69 77 6a 33 e9 6b ad 48 e1 + dd a0 a5 ef''', + SHA1 + ), + + # + # From in oaep-vect.txt to be found in Example 2.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''01 94 7c 7f ce 90 42 5f 47 27 9e 70 85 1f 25 d5 + e6 23 16 fe 8a 1d f1 93 71 e3 e6 28 e2 60 54 3e + 49 01 ef 60 81 f6 8c 0b 81 41 19 0d 2a e8 da ba + 7d 12 50 ec 6d b6 36 e9 44 ec 37 22 87 7c 7c 1d + 0a 67 f1 4b 16 94 c5 f0 37 94 51 a4 3e 49 a3 2d + de 83 67 0b 73 da 91 a1 c9 9b c2 3b 43 6a 60 05 + 5c 61 0f 0b af 99 c1 a0 79 56 5b 95 a3 f1 52 66 + 32 d1 d4 da 60 f2 0e da 25 e6 53 c4 f0 02 76 6f + 45''', + 'e':'''01 00 01''', + 'd':'''08 23 f2 0f ad b5 da 89 08 8a 9d 00 89 3e 21 fa + 4a 1b 11 fb c9 3c 64 a3 be 0b aa ea 97 fb 3b 93 + c3 ff 71 37 04 c1 9c 96 3c 1d 10 7a ae 99 05 47 + 39 f7 9e 02 e1 86 de 86 f8 7a 6d de fe a6 d8 cc + d1 d3 c8 1a 47 bf a7 25 5b e2 06 01 a4 a4 b2 f0 + 8a 16 7b 5e 27 9d 71 5b 1b 45 5b dd 7e ab 24 59 + 41 d9 76 8b 9a ce fb 3c cd a5 95 2d a3 ce e7 25 + 25 b4 50 16 63 a8 ee 15 c9 e9 92 d9 24 62 fe 39''' + }, + # Plaintext + '''8f f0 0c aa 60 5c 70 28 30 63 4d 9a 6c 3d 42 c6 + 52 b5 8c f1 d9 2f ec 57 0b ee e7''', + # Ciphertext + '''01 81 af 89 22 b9 fc b4 d7 9d 92 eb e1 98 15 99 + 2f c0 c1 43 9d 8b cd 49 13 98 a0 f4 ad 3a 32 9a + 5b d9 38 55 60 db 53 26 83 c8 b7 da 04 e4 b1 2a + ed 6a ac df 47 1c 34 c9 cd a8 91 ad dc c2 df 34 + 56 65 3a a6 38 2e 9a e5 9b 54 45 52 57 eb 09 9d + 56 2b be 10 45 3f 2b 6d 13 c5 9c 02 e1 0f 1f 8a + bb 5d a0 d0 57 09 32 da cf 2d 09 01 db 72 9d 0f + ef cc 05 4e 70 96 8e a5 40 c8 1b 04 bc ae fe 72 + 0e''', + # Random + '''8c 40 7b 5e c2 89 9e 50 99 c5 3e 8c e7 93 bf 94 + e7 1b 17 82''', + SHA1 + ), + + # + # From in oaep-vect.txt to be found in Example 10.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''ae 45 ed 56 01 ce c6 b8 cc 05 f8 03 93 5c 67 4d + db e0 d7 5c 4c 09 fd 79 51 fc 6b 0c ae c3 13 a8 + df 39 97 0c 51 8b ff ba 5e d6 8f 3f 0d 7f 22 a4 + 02 9d 41 3f 1a e0 7e 4e be 9e 41 77 ce 23 e7 f5 + 40 4b 56 9e 4e e1 bd cf 3c 1f b0 3e f1 13 80 2d + 4f 85 5e b9 b5 13 4b 5a 7c 80 85 ad ca e6 fa 2f + a1 41 7e c3 76 3b e1 71 b0 c6 2b 76 0e de 23 c1 + 2a d9 2b 98 08 84 c6 41 f5 a8 fa c2 6b da d4 a0 + 33 81 a2 2f e1 b7 54 88 50 94 c8 25 06 d4 01 9a + 53 5a 28 6a fe b2 71 bb 9b a5 92 de 18 dc f6 00 + c2 ae ea e5 6e 02 f7 cf 79 fc 14 cf 3b dc 7c d8 + 4f eb bb f9 50 ca 90 30 4b 22 19 a7 aa 06 3a ef + a2 c3 c1 98 0e 56 0c d6 4a fe 77 95 85 b6 10 76 + 57 b9 57 85 7e fd e6 01 09 88 ab 7d e4 17 fc 88 + d8 f3 84 c4 e6 e7 2c 3f 94 3e 0c 31 c0 c4 a5 cc + 36 f8 79 d8 a3 ac 9d 7d 59 86 0e aa da 6b 83 bb''', + 'e':'''01 00 01''', + 'd':'''05 6b 04 21 6f e5 f3 54 ac 77 25 0a 4b 6b 0c 85 + 25 a8 5c 59 b0 bd 80 c5 64 50 a2 2d 5f 43 8e 59 + 6a 33 3a a8 75 e2 91 dd 43 f4 8c b8 8b 9d 5f c0 + d4 99 f9 fc d1 c3 97 f9 af c0 70 cd 9e 39 8c 8d + 19 e6 1d b7 c7 41 0a 6b 26 75 df bf 5d 34 5b 80 + 4d 20 1a dd 50 2d 5c e2 df cb 09 1c e9 99 7b be + be 57 30 6f 38 3e 4d 58 81 03 f0 36 f7 e8 5d 19 + 34 d1 52 a3 23 e4 a8 db 45 1d 6f 4a 5b 1b 0f 10 + 2c c1 50 e0 2f ee e2 b8 8d ea 4a d4 c1 ba cc b2 + 4d 84 07 2d 14 e1 d2 4a 67 71 f7 40 8e e3 05 64 + fb 86 d4 39 3a 34 bc f0 b7 88 50 1d 19 33 03 f1 + 3a 22 84 b0 01 f0 f6 49 ea f7 93 28 d4 ac 5c 43 + 0a b4 41 49 20 a9 46 0e d1 b7 bc 40 ec 65 3e 87 + 6d 09 ab c5 09 ae 45 b5 25 19 01 16 a0 c2 61 01 + 84 82 98 50 9c 1c 3b f3 a4 83 e7 27 40 54 e1 5e + 97 07 50 36 e9 89 f6 09 32 80 7b 52 57 75 1e 79''' + }, + # Plaintext + '''8b ba 6b f8 2a 6c 0f 86 d5 f1 75 6e 97 95 68 70 + b0 89 53 b0 6b 4e b2 05 bc 16 94 ee''', + # Ciphertext + '''53 ea 5d c0 8c d2 60 fb 3b 85 85 67 28 7f a9 15 + 52 c3 0b 2f eb fb a2 13 f0 ae 87 70 2d 06 8d 19 + ba b0 7f e5 74 52 3d fb 42 13 9d 68 c3 c5 af ee + e0 bf e4 cb 79 69 cb f3 82 b8 04 d6 e6 13 96 14 + 4e 2d 0e 60 74 1f 89 93 c3 01 4b 58 b9 b1 95 7a + 8b ab cd 23 af 85 4f 4c 35 6f b1 66 2a a7 2b fc + c7 e5 86 55 9d c4 28 0d 16 0c 12 67 85 a7 23 eb + ee be ff 71 f1 15 94 44 0a ae f8 7d 10 79 3a 87 + 74 a2 39 d4 a0 4c 87 fe 14 67 b9 da f8 52 08 ec + 6c 72 55 79 4a 96 cc 29 14 2f 9a 8b d4 18 e3 c1 + fd 67 34 4b 0c d0 82 9d f3 b2 be c6 02 53 19 62 + 93 c6 b3 4d 3f 75 d3 2f 21 3d d4 5c 62 73 d5 05 + ad f4 cc ed 10 57 cb 75 8f c2 6a ee fa 44 12 55 + ed 4e 64 c1 99 ee 07 5e 7f 16 64 61 82 fd b4 64 + 73 9b 68 ab 5d af f0 e6 3e 95 52 01 68 24 f0 54 + bf 4d 3c 8c 90 a9 7b b6 b6 55 32 84 eb 42 9f cc''', + # Random + '''47 e1 ab 71 19 fe e5 6c 95 ee 5e aa d8 6f 40 d0 + aa 63 bd 33''', + SHA1 + ), + ) + + def testEncrypt1(self): + # Verify encryption using all test vectors + for test in self._testData: + # Build the key + comps = [int(rws(test[0][x]), 16) for x in ('n', 'e')] + key = RSA.construct(comps) + + # RNG that takes its random numbers from a pool given + # at initialization + class randGen: + + def __init__(self, data): + self.data = data + self.idx = 0 + + def __call__(self, N): + r = self.data[self.idx:N] + self.idx += N + return r + + # The real test + cipher = PKCS.new(key, test[4], randfunc=randGen(t2b(test[3]))) + ct = cipher.encrypt(t2b(test[1])) + self.assertEqual(ct, t2b(test[2])) + + def testEncrypt2(self): + # Verify that encryption fails if plaintext is too long + pt = '\x00'*(128-2*20-2+1) + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.encrypt, pt) + + def testDecrypt1(self): + # Verify decryption using all test vectors + for test in self._testData: + # Build the key + comps = [int(rws(test[0][x]),16) for x in ('n', 'e', 'd')] + key = RSA.construct(comps) + # The real test + cipher = PKCS.new(key, test[4]) + pt = cipher.decrypt(t2b(test[2])) + self.assertEqual(pt, t2b(test[1])) + + def testDecrypt2(self): + # Simplest possible negative tests + for ct_size in (127, 128, 129): + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.decrypt, bchr(0x00)*ct_size) + + def testEncryptDecrypt1(self): + # Encrypt/Decrypt messages of length [0..128-2*20-2] + for pt_len in range(0, 128-2*20-2): + pt = self.rng(pt_len) + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def testEncryptDecrypt2(self): + # Helper function to monitor what's requested from RNG + global asked + + def localRng(N): + global asked + asked += N + return self.rng(N) + + # Verify that OAEP is friendly to all hashes + for hashmod in (MD2, MD5, SHA1, SHA256, RIPEMD160): + # Verify that encrypt() asks for as many random bytes + # as the hash output size + asked = 0 + pt = self.rng(40) + cipher = PKCS.new(self.key1024, hashmod, randfunc=localRng) + ct = cipher.encrypt(pt) + self.assertEqual(cipher.decrypt(ct), pt) + self.assertEqual(asked, hashmod.digest_size) + + def testEncryptDecrypt3(self): + # Verify that OAEP supports labels + pt = self.rng(35) + xlabel = self.rng(22) + cipher = PKCS.new(self.key1024, label=xlabel) + ct = cipher.encrypt(pt) + self.assertEqual(cipher.decrypt(ct), pt) + + def testEncryptDecrypt4(self): + # Verify that encrypt() uses the custom MGF + global mgfcalls + # Helper function to monitor what's requested from MGF + + def newMGF(seed, maskLen): + global mgfcalls + mgfcalls += 1 + return b'\x00' * maskLen + + mgfcalls = 0 + pt = self.rng(32) + cipher = PKCS.new(self.key1024, mgfunc=newMGF) + ct = cipher.encrypt(pt) + self.assertEqual(mgfcalls, 2) + self.assertEqual(cipher.decrypt(ct), pt) + + def testByteArray(self): + pt = b("XER") + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(bytearray(pt)) + pt2 = cipher.decrypt(bytearray(ct)) + self.assertEqual(pt, pt2) + + def testMemoryview(self): + pt = b("XER") + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(memoryview(bytearray(pt))) + pt2 = cipher.decrypt(memoryview(bytearray(ct))) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, skip_slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._skip_slow_tests = skip_slow_tests + self._id = "None" + + def load_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['privateKeyPem']) + + def filter_sha(group): + if group['sha'] == "SHA-1": + return SHA1 + elif group['sha'] == "SHA-224": + return SHA224 + elif group['sha'] == "SHA-256": + return SHA256 + elif group['sha'] == "SHA-384": + return SHA384 + elif group['sha'] == "SHA-512": + return SHA512 + else: + raise ValueError("Unknown sha " + group['sha']) + + def filter_mgf(group): + if group['mgfSha'] == "SHA-1": + return lambda x, y: MGF1(x, y, SHA1) + elif group['mgfSha'] == "SHA-224": + return lambda x, y: MGF1(x, y, SHA224) + elif group['mgfSha'] == "SHA-256": + return lambda x, y: MGF1(x, y, SHA256) + elif group['mgfSha'] == "SHA-384": + return lambda x, y: MGF1(x, y, SHA384) + elif group['mgfSha'] == "SHA-512": + return lambda x, y: MGF1(x, y, SHA512) + else: + raise ValueError("Unknown mgf/sha " + group['mgfSha']) + + def filter_algo(group): + return "%s with MGF1/%s" % (group['sha'], group['mgfSha']) + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof PKCS#1 OAEP (%s)" % filename, + group_tag={'rsa_key': filter_rsa, + 'hash_mod': filter_sha, + 'mgf': filter_mgf, + 'algo': filter_algo} + ) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("rsa_oaep_2048_sha1_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha224_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha224_mgf1sha224_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha384_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha384_mgf1sha384_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha512_mgf1sha512_test.json")) + if not self._skip_slow_tests: + self.tv.extend(self.load_tests("rsa_oaep_3072_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_misc_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt %s Test #%s" % (tv.algo, tv.id) + + cipher = PKCS.new(tv.rsa_key, hashAlgo=tv.hash_mod, mgfunc=tv.mgf, label=tv.label) + try: + pt = cipher.decrypt(tv.ct) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_decrypt(tv) + + +def get_tests(config={}): + skip_slow_tests = not config.get('slow_tests') + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PKCS1_OAEP_Tests) + tests += [TestVectorsWycheproof(wycheproof_warnings, skip_slow_tests)] + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py new file mode 100644 index 0000000..d4d9f2e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/__init__.py: Self-test for hash modules +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for hash modules""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Hash import test_HMAC; tests += test_HMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_CMAC; tests += test_CMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD2; tests += test_MD2.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD4; tests += test_MD4.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD5; tests += test_MD5.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_RIPEMD160; tests += test_RIPEMD160.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA1; tests += test_SHA1.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA224; tests += test_SHA224.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA256; tests += test_SHA256.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA384; tests += test_SHA384.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA512; tests += test_SHA512.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_224; tests += test_SHA3_224.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_256; tests += test_SHA3_256.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_384; tests += test_SHA3_384.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_512; tests += test_SHA3_512.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_keccak; tests += test_keccak.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHAKE; tests += test_SHAKE.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_BLAKE2; tests += test_BLAKE2.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_Poly1305; tests += test_Poly1305.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_cSHAKE; tests += test_cSHAKE.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_KMAC; tests += test_KMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_TupleHash; tests += test_TupleHash.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_KangarooTwelve; tests += test_KangarooTwelve.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py new file mode 100644 index 0000000..4ed9234 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py @@ -0,0 +1,290 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/common.py: Common code for Cryptodome.SelfTest.Hash +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-testing for PyCryptodome hash modules""" + +import re +import sys +import unittest +import binascii +import Cryptodome.Hash +from binascii import hexlify, unhexlify +from Cryptodome.Util.py3compat import b, tobytes +from Cryptodome.Util.strxor import strxor_c + +def t2b(hex_string): + shorter = re.sub(br'\s+', b'', tobytes(hex_string)) + return unhexlify(shorter) + + +class HashDigestSizeSelfTest(unittest.TestCase): + + def __init__(self, hashmod, description, expected, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.expected = expected + self.description = description + self.extra_params = extra_params + + def shortDescription(self): + return self.description + + def runTest(self): + if "truncate" not in self.extra_params: + self.assertTrue(hasattr(self.hashmod, "digest_size")) + self.assertEqual(self.hashmod.digest_size, self.expected) + h = self.hashmod.new(**self.extra_params) + self.assertTrue(hasattr(h, "digest_size")) + self.assertEqual(h.digest_size, self.expected) + + +class HashSelfTest(unittest.TestCase): + + def __init__(self, hashmod, description, expected, input, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.expected = expected.lower() + self.input = input + self.description = description + self.extra_params = extra_params + + def shortDescription(self): + return self.description + + def runTest(self): + h = self.hashmod.new(**self.extra_params) + h.update(self.input) + + out1 = binascii.b2a_hex(h.digest()) + out2 = h.hexdigest() + + h = self.hashmod.new(self.input, **self.extra_params) + + out3 = h.hexdigest() + out4 = binascii.b2a_hex(h.digest()) + + # PY3K: hexdigest() should return str(), and digest() bytes + self.assertEqual(self.expected, out1) # h = .new(); h.update(data); h.digest() + if sys.version_info[0] == 2: + self.assertEqual(self.expected, out2) # h = .new(); h.update(data); h.hexdigest() + self.assertEqual(self.expected, out3) # h = .new(data); h.hexdigest() + else: + self.assertEqual(self.expected.decode(), out2) # h = .new(); h.update(data); h.hexdigest() + self.assertEqual(self.expected.decode(), out3) # h = .new(data); h.hexdigest() + self.assertEqual(self.expected, out4) # h = .new(data); h.digest() + + # Verify that the .new() method produces a fresh hash object, except + # for MD5 and SHA1, which are hashlib objects. (But test any .new() + # method that does exist.) + if self.hashmod.__name__ not in ('Cryptodome.Hash.MD5', 'Cryptodome.Hash.SHA1') or hasattr(h, 'new'): + h2 = h.new() + h2.update(self.input) + out5 = binascii.b2a_hex(h2.digest()) + self.assertEqual(self.expected, out5) + + +class HashTestOID(unittest.TestCase): + def __init__(self, hashmod, oid, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.oid = oid + self.extra_params = extra_params + + def runTest(self): + h = self.hashmod.new(**self.extra_params) + self.assertEqual(h.oid, self.oid) + + +class ByteArrayTest(unittest.TestCase): + + def __init__(self, module, extra_params): + unittest.TestCase.__init__(self) + self.module = module + self.extra_params = extra_params + + def runTest(self): + data = b("\x00\x01\x02") + + # Data can be a bytearray (during initialization) + ba = bytearray(data) + + h1 = self.module.new(data, **self.extra_params) + h2 = self.module.new(ba, **self.extra_params) + ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + ba = bytearray(data) + + h1 = self.module.new(**self.extra_params) + h2 = self.module.new(**self.extra_params) + + h1.update(data) + h2.update(ba) + + ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTest(unittest.TestCase): + + def __init__(self, module, extra_params): + unittest.TestCase.__init__(self) + self.module = module + self.extra_params = extra_params + + def runTest(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in get_mv_ro, get_mv_rw: + + # Data can be a memoryview (during initialization) + mv = get_mv(data) + + h1 = self.module.new(data, **self.extra_params) + h2 = self.module.new(mv, **self.extra_params) + if not mv.readonly: + mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + mv = get_mv(data) + + h1 = self.module.new(**self.extra_params) + h2 = self.module.new(**self.extra_params) + h1.update(data) + h2.update(mv) + if not mv.readonly: + mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MACSelfTest(unittest.TestCase): + + def __init__(self, module, description, result, data, key, params): + unittest.TestCase.__init__(self) + self.module = module + self.result = t2b(result) + self.data = t2b(data) + self.key = t2b(key) + self.params = params + self.description = description + + def shortDescription(self): + return self.description + + def runTest(self): + + result_hex = hexlify(self.result) + + # Verify result + h = self.module.new(self.key, **self.params) + h.update(self.data) + self.assertEqual(self.result, h.digest()) + self.assertEqual(hexlify(self.result).decode('ascii'), h.hexdigest()) + + # Verify that correct MAC does not raise any exception + h.verify(self.result) + h.hexverify(result_hex) + + # Verify that incorrect MAC does raise ValueError exception + wrong_mac = strxor_c(self.result, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + # Verify again, with data passed to new() + h = self.module.new(self.key, self.data, **self.params) + self.assertEqual(self.result, h.digest()) + self.assertEqual(hexlify(self.result).decode('ascii'), h.hexdigest()) + + # Test .copy() + try: + h = self.module.new(self.key, self.data, **self.params) + h2 = h.copy() + h3 = h.copy() + + # Verify that changing the copy does not change the original + h2.update(b"bla") + self.assertEqual(h3.digest(), self.result) + + # Verify that both can reach the same state + h.update(b"bla") + self.assertEqual(h.digest(), h2.digest()) + except NotImplementedError: + pass + + # PY3K: Check that hexdigest() returns str and digest() returns bytes + self.assertTrue(isinstance(h.digest(), type(b""))) + self.assertTrue(isinstance(h.hexdigest(), type(""))) + + # PY3K: Check that .hexverify() accepts bytes or str + h.hexverify(h.hexdigest()) + h.hexverify(h.hexdigest().encode('ascii')) + + +def make_hash_tests(module, module_name, test_data, digest_size, oid=None, + extra_params={}): + tests = [] + for i in range(len(test_data)): + row = test_data[i] + (expected, input) = map(tobytes,row[0:2]) + if len(row) < 3: + description = repr(input) + else: + description = row[2] + name = "%s #%d: %s" % (module_name, i+1, description) + tests.append(HashSelfTest(module, name, expected, input, extra_params)) + + name = "%s #%d: digest_size" % (module_name, len(test_data) + 1) + tests.append(HashDigestSizeSelfTest(module, name, digest_size, extra_params)) + + if oid is not None: + tests.append(HashTestOID(module, oid, extra_params)) + + tests.append(ByteArrayTest(module, extra_params)) + + tests.append(MemoryViewTest(module, extra_params)) + + return tests + + +def make_mac_tests(module, module_name, test_data): + tests = [] + for i, row in enumerate(test_data): + if len(row) == 4: + (key, data, results, description, params) = list(row) + [ {} ] + else: + (key, data, results, description, params) = row + name = "%s #%d: %s" % (module_name, i+1, description) + tests.append(MACSelfTest(module, name, results, data, key, params)) + return tests + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py new file mode 100644 index 0000000..e5ed63b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py @@ -0,0 +1,482 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os +import re +import unittest +import warnings +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import BLAKE2b, BLAKE2s + + +class Blake2Test(unittest.TestCase): + + def test_new_positive(self): + + h = self.BLAKE2.new(digest_bits=self.max_bits) + for new_func in self.BLAKE2.new, h.new: + + for dbits in range(8, self.max_bits + 1, 8): + hobj = new_func(digest_bits=dbits) + self.assertEqual(hobj.digest_size, dbits // 8) + + for dbytes in range(1, self.max_bytes + 1): + hobj = new_func(digest_bytes=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + digest1 = new_func(data=b"\x90", digest_bytes=self.max_bytes).digest() + digest2 = new_func(digest_bytes=self.max_bytes).update(b"\x90").digest() + self.assertEqual(digest1, digest2) + + new_func(data=b"A", key=b"5", digest_bytes=self.max_bytes) + + hobj = h.new() + self.assertEqual(hobj.digest_size, self.max_bytes) + + def test_new_negative(self): + + h = self.BLAKE2.new(digest_bits=self.max_bits) + for new_func in self.BLAKE2.new, h.new: + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + digest_bits=self.max_bits) + self.assertRaises(ValueError, new_func, digest_bytes=0) + self.assertRaises(ValueError, new_func, + digest_bytes=self.max_bytes + 1) + self.assertRaises(ValueError, new_func, digest_bits=7) + self.assertRaises(ValueError, new_func, digest_bits=15) + self.assertRaises(ValueError, new_func, + digest_bits=self.max_bits + 1) + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + key=u"string") + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + data=u"string") + + def test_default_digest_size(self): + digest = self.BLAKE2.new(data=b'abc').digest() + self.assertEqual(len(digest), self.max_bytes) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.BLAKE2.new(digest_bits=256, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = self.BLAKE2.new(digest_bits=256, data=msg).digest() + + # With the proper flag, it is allowed + h = self.BLAKE2.new(digest_bits=256, data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + def test_hex_digest(self): + mac = self.BLAKE2.new(digest_bits=self.max_bits) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, key=b"4") + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, key=b"4") + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_oid(self): + + prefix = "1.3.6.1.4.1.1722.12.2." + self.oid_variant + "." + + for digest_bits in self.digest_bits_oid: + h = self.BLAKE2.new(digest_bits=digest_bits) + self.assertEqual(h.oid, prefix + str(digest_bits // 8)) + + h = self.BLAKE2.new(digest_bits=digest_bits, key=b"secret") + self.assertRaises(AttributeError, lambda: h.oid) + + for digest_bits in (8, self.max_bits): + if digest_bits in self.digest_bits_oid: + continue + self.assertRaises(AttributeError, lambda: h.oid) + + def test_bytearray(self): + + key = b'0' * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = self.BLAKE2.new(data=data, key=key) + h2 = self.BLAKE2.new(data=data_ba, key=key_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.BLAKE2.new() + h2 = self.BLAKE2.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + key = b'0' * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = self.BLAKE2.new(data=data, key=key) + h2 = self.BLAKE2.new(data=data_mv, key=key_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.BLAKE2.new() + h2 = self.BLAKE2.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class Blake2bTest(Blake2Test): + #: Module + BLAKE2 = BLAKE2b + #: Max output size (in bits) + max_bits = 512 + #: Max output size (in bytes) + max_bytes = 64 + #: Bit size of the digests for which an ASN OID exists + digest_bits_oid = (160, 256, 384, 512) + # http://tools.ietf.org/html/draft-saarinen-blake2-02 + oid_variant = "1" + + +class Blake2sTest(Blake2Test): + #: Module + BLAKE2 = BLAKE2s + #: Max output size (in bits) + max_bits = 256 + #: Max output size (in bytes) + max_bytes = 32 + #: Bit size of the digests for which an ASN OID exists + digest_bits_oid = (128, 160, 224, 256) + # http://tools.ietf.org/html/draft-saarinen-blake2-02 + oid_variant = "2" + + +class Blake2OfficialTestVector(unittest.TestCase): + + def _load_tests(self, test_vector_file): + expected = "in" + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + + if line.strip() == "" or line.startswith("#"): + continue + + res = re.match("%s:\t([0-9A-Fa-f]*)" % expected, line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + + if res.group(1): + bin_value = unhexlify(tobytes(res.group(1))) + else: + bin_value = b"" + if expected == "in": + input_data = bin_value + expected = "key" + elif expected == "key": + key = bin_value + expected = "hash" + else: + result = bin_value + expected = "in" + test_vectors.append((input_data, key, result)) + return test_vectors + + def setUp(self): + + dir_comps = ("Hash", self.name) + file_name = self.name.lower() + "-test.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors # type: ignore + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + for (input_data, key, result) in self.test_vectors: + mac = self.BLAKE2.new(key=key, digest_bytes=self.max_bytes) + mac.update(input_data) + self.assertEqual(mac.digest(), result) + + +class Blake2bOfficialTestVector(Blake2OfficialTestVector): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + #: Max digest size + max_bytes = 64 + + +class Blake2sOfficialTestVector(Blake2OfficialTestVector): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + #: Max digest size + max_bytes = 32 + + +class Blake2TestVector1(unittest.TestCase): + + def _load_tests(self, test_vector_file): + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + if line.strip() == "" or line.startswith("#"): + continue + res = re.match("digest: ([0-9A-Fa-f]*)", line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + + test_vectors.append(unhexlify(tobytes(res.group(1)))) + return test_vectors + + def setUp(self): + dir_comps = ("Hash", self.name) + file_name = "tv1.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + + for tv in self.test_vectors: + digest_bytes = len(tv) + next_data = b"" + for _ in range(100): + h = self.BLAKE2.new(digest_bytes=digest_bytes) + h.update(next_data) + next_data = h.digest() + next_data + self.assertEqual(h.digest(), tv) + + +class Blake2bTestVector1(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + + +class Blake2sTestVector1(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + + +class Blake2TestVector2(unittest.TestCase): + + def _load_tests(self, test_vector_file): + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + if line.strip() == "" or line.startswith("#"): + continue + res = re.match(r"digest\(([0-9]+)\): ([0-9A-Fa-f]*)", line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + key_size = int(res.group(1)) + result = unhexlify(tobytes(res.group(2))) + test_vectors.append((key_size, result)) + return test_vectors + + def setUp(self): + dir_comps = ("Hash", self.name) + file_name = "tv2.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors # type: ignore + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + + for key_size, result in self.test_vectors: + next_data = b"" + for _ in range(100): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, + key=b"A" * key_size) + h.update(next_data) + next_data = h.digest() + next_data + self.assertEqual(h.digest(), result) + + +class Blake2bTestVector2(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + #: Max digest size in bytes + max_bytes = 64 + + +class Blake2sTestVector2(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + #: Max digest size in bytes + max_bytes = 32 + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(Blake2bTest) + tests.append(Blake2bOfficialTestVector()) + tests.append(Blake2bTestVector1()) + tests.append(Blake2bTestVector2()) + + tests += list_test_cases(Blake2sTest) + tests.append(Blake2sOfficialTestVector()) + tests.append(Blake2sTestVector1()) + tests.append(Blake2sTestVector2()) + + return tests + + +if __name__ == '__main__': + import unittest + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py new file mode 100644 index 0000000..f88f1cd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py @@ -0,0 +1,448 @@ +# +# SelfTest/Hash/CMAC.py: Self-test for the CMAC module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.CMAC""" + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import tobytes + +from Cryptodome.Hash import CMAC +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +# This is a list of (key, data, result, description, module) tuples. +test_data = [ + + ## Test vectors from RFC 4493 ## + ## The are also in NIST SP 800 38B D.2 ## + ( '2b7e151628aed2a6abf7158809cf4f3c', + '', + 'bb1d6929e95937287fa37d129b756746', + 'RFC 4493 #1', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a', + '070a16b46b4d4144f79bdd9dd04a287c', + 'RFC 4493 #2', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + 'dfa66747de9ae63030ca32611497c827', + 'RFC 4493 #3', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + '51f0bebf7e3b9d92fc49741779363cfe', + 'RFC 4493 #4', + AES + ), + + ## The rest of Appendix D of NIST SP 800 38B + ## was not totally correct. + ## Values in Examples 14, 15, 18, and 19 were wrong. + ## The updated test values are published in: + ## http://csrc.nist.gov/publications/nistpubs/800-38B/Updated_CMAC_Examples.pdf + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '', + 'd17ddf46adaacde531cac483de7a9367', + 'NIST SP 800 38B D.2 Example 5', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a', + '9e99a7bf31e710900662f65e617c5184', + 'NIST SP 800 38B D.2 Example 6', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + '8a1de5be2eb31aad089a82e6ee908b0e', + 'NIST SP 800 38B D.2 Example 7', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + 'a1d5df0eed790f794d77589659f39a11', + 'NIST SP 800 38B D.2 Example 8', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '', + '028962f61b7bf89efc6b551f4667d983', + 'NIST SP 800 38B D.3 Example 9', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a', + '28a7023f452e8f82bd4bf28d8c37c35c', + 'NIST SP 800 38B D.3 Example 10', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + 'aaf3d8f1de5640c232f5b169b9c911e6', + 'NIST SP 800 38B D.3 Example 11', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + 'e1992190549f6ed5696a2c056c315410', + 'NIST SP 800 38B D.3 Example 12', + AES + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '', + 'b7a688e122ffaf95', + 'NIST SP 800 38B D.4 Example 13', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96', + '8e8f293136283797', + 'NIST SP 800 38B D.4 Example 14', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a57', + '743ddbe0ce2dc2ed', + 'NIST SP 800 38B D.4 Example 15', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a571e03ac9c'+ + '9eb76fac45af8e51', + '33e6b1092400eae5', + 'NIST SP 800 38B D.4 Example 16', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '', + 'bd2ebf9a3ba00361', + 'NIST SP 800 38B D.7 Example 17', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96', + '4ff2ab813c53ce83', + 'NIST SP 800 38B D.7 Example 18', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a57', + '62dd1b471902bd4e', + 'NIST SP 800 38B D.7 Example 19', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a571e03ac9c'+ + '9eb76fac45af8e51', + '31b1e431dabc4eb8', + 'NIST SP 800 38B D.7 Example 20', + DES3 + ), + +] + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class TestCMAC(unittest.TestCase): + + def test_internal_caching(self): + """Verify that internal caching is implemented correctly""" + + data_to_mac = get_tag_random("data_to_mac", 128) + key = get_tag_random("key", 16) + ref_mac = CMAC.new(key, msg=data_to_mac, ciphermod=AES).digest() + + # Break up in chunks of different length + # The result must always be the same + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + chunks = [data_to_mac[i:i+chunk_length] for i in + range(0, len(data_to_mac), chunk_length)] + + mac = CMAC.new(key, ciphermod=AES) + for chunk in chunks: + mac.update(chunk) + self.assertEqual(ref_mac, mac.digest()) + + def test_update_after_digest(self): + msg = b"rrrrttt" + key = b"4" * 16 + + # Normally, update() cannot be done after digest() + h = CMAC.new(key, msg[:4], ciphermod=AES) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = CMAC.new(key, msg, ciphermod=AES).digest() + + # With the proper flag, it is allowed + h2 = CMAC.new(key, msg[:4], ciphermod=AES, update_after_digest=True) + self.assertEqual(h2.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h2.update(msg[4:]) + self.assertEqual(h2.digest(), dig2) + + +class ByteArrayTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = CMAC.new(key, data, ciphermod=AES) + h2 = CMAC.new(key_ba, data_ba, ciphermod=AES) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = CMAC.new(key, ciphermod=AES) + h2 = CMAC.new(key, ciphermod=AES) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = CMAC.new(key, data, ciphermod=AES) + h2 = CMAC.new(key_mv, data_mv, ciphermod=AES) + if not data_mv.readonly: + key_mv[:1] = b'\xFF' + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = CMAC.new(key, ciphermod=AES) + h2 = CMAC.new(key, ciphermod=AES) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Hash", "wycheproof"), + "aes_cmac_test.json", + "Wycheproof CMAC", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_create_mac(self, tv): + self._id = "Wycheproof MAC creation Test #" + str(tv.id) + + try: + tag = CMAC.new(tv.key, tv.msg, ciphermod=AES, mac_len=tv.tag_size).digest() + except ValueError as e: + if len(tv.key) not in (16, 24, 32) and "key length" in str(e): + return + raise e + if tv.valid: + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_verify_mac(self, tv): + self._id = "Wycheproof MAC verification Test #" + str(tv.id) + + try: + mac = CMAC.new(tv.key, tv.msg, ciphermod=AES, mac_len=tv.tag_size) + except ValueError as e: + if len(tv.key) not in (16, 24, 32) and "key length" in str(e): + return + raise e + try: + mac.verify(tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_create_mac(tv) + self.test_verify_mac(tv) + + +def get_tests(config={}): + global test_data + import types + from .common import make_mac_tests + + wycheproof_warnings = config.get('wycheproof_warnings') + + # Add new() parameters to the back of each test vector + params_test_data = [] + for row in test_data: + t = list(row) + t[4] = dict(ciphermod=t[4]) + params_test_data.append(t) + + tests = make_mac_tests(CMAC, "CMAC", params_test_data) + tests.append(ByteArrayTests()) + tests.append(list_test_cases(TestCMAC)) + tests.append(MemoryViewTests()) + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py new file mode 100644 index 0000000..ecec1a8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py @@ -0,0 +1,548 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/HMAC.py: Self-test for the HMAC module +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.HMAC""" + +import unittest +from binascii import hexlify +from Cryptodome.Util.py3compat import tostr, tobytes + +from Cryptodome.Hash import (HMAC, MD5, SHA1, SHA256, + SHA224, SHA384, SHA512, + RIPEMD160, + SHA3_224, SHA3_256, SHA3_384, SHA3_512) + + +hash_modules = dict(MD5=MD5, SHA1=SHA1, SHA256=SHA256, + SHA224=SHA224, SHA384=SHA384, SHA512=SHA512, + RIPEMD160=RIPEMD160, + SHA3_224=SHA3_224, SHA3_256=SHA3_256, + SHA3_384=SHA3_384, SHA3_512=SHA3_512) + +default_hash = None + +def xl(text): + return tostr(hexlify(tobytes(text))) + +# This is a list of (key, data, results, description) tuples. +test_data = [ + ## Test vectors from RFC 2202 ## + # Test that the default hashmod is MD5 + ('0b' * 16, + '4869205468657265', + dict(default_hash='9294727a3638bb1c13f48ef8158bfc9d'), + 'default-is-MD5'), + + # Test case 1 (MD5) + ('0b' * 16, + '4869205468657265', + dict(MD5='9294727a3638bb1c13f48ef8158bfc9d'), + 'RFC 2202 #1-MD5 (HMAC-MD5)'), + + # Test case 1 (SHA1) + ('0b' * 20, + '4869205468657265', + dict(SHA1='b617318655057264e28bc0b6fb378c8ef146be00'), + 'RFC 2202 #1-SHA1 (HMAC-SHA1)'), + + # Test case 2 + ('4a656665', + '7768617420646f2079612077616e7420666f72206e6f7468696e673f', + dict(MD5='750c783e6ab0b503eaa86e310a5db738', + SHA1='effcdf6ae5eb2fa2d27416d5f184df9c259a7c79'), + 'RFC 2202 #2 (HMAC-MD5/SHA1)'), + + # Test case 3 (MD5) + ('aa' * 16, + 'dd' * 50, + dict(MD5='56be34521d144c88dbb8c733f0e8b3f6'), + 'RFC 2202 #3-MD5 (HMAC-MD5)'), + + # Test case 3 (SHA1) + ('aa' * 20, + 'dd' * 50, + dict(SHA1='125d7342b9ac11cd91a39af48aa17b4f63f175d3'), + 'RFC 2202 #3-SHA1 (HMAC-SHA1)'), + + # Test case 4 + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(MD5='697eaf0aca3a3aea3a75164746ffaa79', + SHA1='4c9007f4026250c6bc8414f9bf50c86c2d7235da'), + 'RFC 2202 #4 (HMAC-MD5/SHA1)'), + + # Test case 5 (MD5) + ('0c' * 16, + '546573742057697468205472756e636174696f6e', + dict(MD5='56461ef2342edc00f9bab995690efd4c'), + 'RFC 2202 #5-MD5 (HMAC-MD5)'), + + # Test case 5 (SHA1) + # NB: We do not implement hash truncation, so we only test the full hash here. + ('0c' * 20, + '546573742057697468205472756e636174696f6e', + dict(SHA1='4c1a03424b55e07fe7f27be1d58bb9324a9a5a04'), + 'RFC 2202 #5-SHA1 (HMAC-SHA1)'), + + # Test case 6 + ('aa' * 80, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b6579202d2048617368204b6579204669727374', + dict(MD5='6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd', + SHA1='aa4ae5e15272d00e95705637ce8a3b55ed402112'), + 'RFC 2202 #6 (HMAC-MD5/SHA1)'), + + # Test case 7 + ('aa' * 80, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b657920616e64204c6172676572205468616e204f6e6520426c6f636b2d' + + '53697a652044617461', + dict(MD5='6f630fad67cda0ee1fb1f562db3aa53e', + SHA1='e8e99d0f45237d786d6bbaa7965c7808bbff1a91'), + 'RFC 2202 #7 (HMAC-MD5/SHA1)'), + + ## Test vectors from RFC 4231 ## + # 4.2. Test Case 1 + ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', + '4869205468657265', + dict(SHA256=''' + b0344c61d8db38535ca8afceaf0bf12b + 881dc200c9833da726e9376c2e32cff7 + '''), + 'RFC 4231 #1 (HMAC-SHA256)'), + + # 4.3. Test Case 2 - Test with a key shorter than the length of the HMAC + # output. + ('4a656665', + '7768617420646f2079612077616e7420666f72206e6f7468696e673f', + dict(SHA256=''' + 5bdcc146bf60754e6a042426089575c7 + 5a003f089d2739839dec58b964ec3843 + '''), + 'RFC 4231 #2 (HMAC-SHA256)'), + + # 4.4. Test Case 3 - Test with a combined length of key and data that is + # larger than 64 bytes (= block-size of SHA-224 and SHA-256). + ('aa' * 20, + 'dd' * 50, + dict(SHA256=''' + 773ea91e36800e46854db8ebd09181a7 + 2959098b3ef8c122d9635514ced565fe + '''), + 'RFC 4231 #3 (HMAC-SHA256)'), + + # 4.5. Test Case 4 - Test with a combined length of key and data that is + # larger than 64 bytes (= block-size of SHA-224 and SHA-256). + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(SHA256=''' + 82558a389a443c0ea4cc819899f2083a + 85f0faa3e578f8077a2e3ff46729665b + '''), + 'RFC 4231 #4 (HMAC-SHA256)'), + + # 4.6. Test Case 5 - Test with a truncation of output to 128 bits. + # + # Not included because we do not implement hash truncation. + # + + # 4.7. Test Case 6 - Test with a key larger than 128 bytes (= block-size of + # SHA-384 and SHA-512). + ('aa' * 131, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b6579202d2048617368204b6579204669727374', + dict(SHA256=''' + 60e431591ee0b67f0d8a26aacbf5b77f + 8e0bc6213728c5140546040f0ee37f54 + '''), + 'RFC 4231 #6 (HMAC-SHA256)'), + + # 4.8. Test Case 7 - Test with a key and data that is larger than 128 bytes + # (= block-size of SHA-384 and SHA-512). + ('aa' * 131, + '5468697320697320612074657374207573696e672061206c6172676572207468' + + '616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074' + + '68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565' + + '647320746f20626520686173686564206265666f7265206265696e6720757365' + + '642062792074686520484d414320616c676f726974686d2e', + dict(SHA256=''' + 9b09ffa71b942fcb27635fbcd5b0e944 + bfdc63644f0713938a7f51535c3a35e2 + '''), + 'RFC 4231 #7 (HMAC-SHA256)'), + + # Test case 8 (SHA224) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA224='a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44'), + 'RFC 4634 8.4 SHA224 (HMAC-SHA224)'), + + # Test case 9 (SHA384) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA384='af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649'), + 'RFC 4634 8.4 SHA384 (HMAC-SHA384)'), + + # Test case 10 (SHA512) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA512='164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737'), + 'RFC 4634 8.4 SHA512 (HMAC-SHA512)'), + + # Test case 11 (RIPEMD) + ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', + xl("Hi There"), + dict(RIPEMD160='24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668'), + 'RFC 2286 #1 (HMAC-RIPEMD)'), + + # Test case 12 (RIPEMD) + (xl("Jefe"), + xl("what do ya want for nothing?"), + dict(RIPEMD160='dda6c0213a485a9e24f4742064a7f033b43c4069'), + 'RFC 2286 #2 (HMAC-RIPEMD)'), + + # Test case 13 (RIPEMD) + ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + 'dd' * 50, + dict(RIPEMD160='b0b105360de759960ab4f35298e116e295d8e7c1'), + 'RFC 2286 #3 (HMAC-RIPEMD)'), + + # Test case 14 (RIPEMD) + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(RIPEMD160='d5ca862f4d21d5e610e18b4cf1beb97a4365ecf4'), + 'RFC 2286 #4 (HMAC-RIPEMD)'), + + # Test case 15 (RIPEMD) + ('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', + xl("Test With Truncation"), + dict(RIPEMD160='7619693978f91d90539ae786500ff3d8e0518e39'), + 'RFC 2286 #5 (HMAC-RIPEMD)'), + + # Test case 16 (RIPEMD) + ('aa' * 80, + xl("Test Using Larger Than Block-Size Key - Hash Key First"), + dict(RIPEMD160='6466ca07ac5eac29e1bd523e5ada7605b791fd8b'), + 'RFC 2286 #6 (HMAC-RIPEMD)'), + + # Test case 17 (RIPEMD) + ('aa' * 80, + xl("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"), + dict(RIPEMD160='69ea60798d71616cce5fd0871e23754cd75d5a0a'), + 'RFC 2286 #7 (HMAC-RIPEMD)'), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-224.pdf + ( + '000102030405060708090a0b0c0d0e0f' + '101112131415161718191a1b', + xl('Sample message for keylen<blocklen'), + dict(SHA3_224='332cfd59347fdb8e576e77260be4aba2d6dc53117b3bfb52c6d18c04'), + 'NIST CSRC Sample #1 (SHA3-224)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '808182838485868788898a8b8c8d8e8f', + xl('Sample message for keylen=blocklen'), + dict(SHA3_224='d8b733bcf66c644a12323d564e24dcf3fc75f231f3b67968359100c7'), + 'NIST CSRC Sample #2 (SHA3-224)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '808182838485868788898a8b8c8d8e8f'\ + '909192939495969798999a9b9c9d9e9f'\ + 'a0a1a2a3a4a5a6a7a8a9aaab', + xl('Sample message for keylen>blocklen'), + dict(SHA3_224='078695eecc227c636ad31d063a15dd05a7e819a66ec6d8de1e193e59'), + 'NIST CSRC Sample #3 (SHA3-224)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-256.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f', + xl('Sample message for keylen<blocklen'), + dict(SHA3_256='4fe8e202c4f058e8dddc23d8c34e467343e23555e24fc2f025d598f558f67205'), + 'NIST CSRC Sample #1 (SHA3-256)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '8081828384858687', + xl('Sample message for keylen=blocklen'), + dict(SHA3_256='68b94e2e538a9be4103bebb5aa016d47961d4d1aa906061313b557f8af2c3faa'), + 'NIST CSRC Sample #2 (SHA3-256)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '808182838485868788898a8b8c8d8e8f'\ + '909192939495969798999a9b9c9d9e9f'\ + 'a0a1a2a3a4a5a6a7', + xl('Sample message for keylen>blocklen'), + dict(SHA3_256='9bcf2c238e235c3ce88404e813bd2f3a97185ac6f238c63d6229a00b07974258'), + 'NIST CSRC Sample #3 (SHA3-256)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-384.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f' + '202122232425262728292a2b2c2d2e2f', + xl('Sample message for keylen<blocklen'), + dict(SHA3_384='d588a3c51f3f2d906e8298c1199aa8ff6296218127f6b38a90b6afe2c5617725bc99987f79b22a557b6520db710b7f42'), + 'NIST CSRC Sample #1 (SHA3-384)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '6061626364656667', + xl('Sample message for keylen=blocklen'), + dict(SHA3_384='a27d24b592e8c8cbf6d4ce6fc5bf62d8fc98bf2d486640d9eb8099e24047837f5f3bffbe92dcce90b4ed5b1e7e44fa90'), + 'NIST CSRC Sample #2 (SHA3-384)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '808182838485868788898a8b8c8d8e8f'\ + '9091929394959697', + xl('Sample message for keylen>blocklen'), + dict(SHA3_384='e5ae4c739f455279368ebf36d4f5354c95aa184c899d3870e460ebc288ef1f9470053f73f7c6da2a71bcaec38ce7d6ac'), + 'NIST CSRC Sample #3 (SHA3-384)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-512.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f', + xl('Sample message for keylen<blocklen'), + dict(SHA3_512='4efd629d6c71bf86162658f29943b1c308ce27cdfa6db0d9c3ce81763f9cbce5f7ebe9868031db1a8f8eb7b6b95e5c5e3f657a8996c86a2f6527e307f0213196'), + 'NIST CSRC Sample #1 (SHA3-512)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '4041424344454647', + xl('Sample message for keylen=blocklen'), + dict(SHA3_512='544e257ea2a3e5ea19a590e6a24b724ce6327757723fe2751b75bf007d80f6b360744bf1b7a88ea585f9765b47911976d3191cf83c039f5ffab0d29cc9d9b6da'), + 'NIST CSRC Sample #2 (SHA3-512)' + ), + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f'\ + '404142434445464748494a4b4c4d4e4f'\ + '505152535455565758595a5b5c5d5e5f'\ + '606162636465666768696a6b6c6d6e6f'\ + '707172737475767778797a7b7c7d7e7f'\ + '8081828384858687', + xl('Sample message for keylen>blocklen'), + dict(SHA3_512='5f464f5e5b7848e3885e49b2c385f0694985d0e38966242dc4a5fe3fea4b37d46b65ceced5dcf59438dd840bab22269f0ba7febdb9fcf74602a35666b2a32915'), + 'NIST CSRC Sample #3 (SHA3-512)' + ), + +] + + +class HMAC_Module_and_Instance_Test(unittest.TestCase): + """Test the HMAC construction and verify that it does not + matter if you initialize it with a hash module or + with an hash instance. + + See https://bugs.launchpad.net/pycrypto/+bug/1209399 + """ + + def __init__(self, hashmods): + """Initialize the test with a dictionary of hash modules + indexed by their names""" + + unittest.TestCase.__init__(self) + self.hashmods = hashmods + self.description = "" + + def shortDescription(self): + return self.description + + def runTest(self): + key = b"\x90\x91\x92\x93" * 4 + payload = b"\x00" * 100 + + for hashname, hashmod in self.hashmods.items(): + if hashmod is None: + continue + self.description = "Test HMAC in combination with " + hashname + one = HMAC.new(key, payload, hashmod).digest() + two = HMAC.new(key, payload, hashmod.new()).digest() + self.assertEqual(one, two) + + +class HMAC_None(unittest.TestCase): + + def runTest(self): + + key = b"\x04" * 20 + one = HMAC.new(key, b"", SHA1).digest() + two = HMAC.new(key, None, SHA1).digest() + self.assertEqual(one, two) + + +class ByteArrayTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = HMAC.new(key, data) + h2 = HMAC.new(key_ba, data_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = HMAC.new(key) + h2 = HMAC.new(key) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = HMAC.new(key, data) + h2 = HMAC.new(key_mv, data_mv) + if not data_mv.readonly: + key_mv[:1] = b'\xFF' + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = HMAC.new(key) + h2 = HMAC.new(key) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +def get_tests(config={}): + global test_data + import types + from .common import make_mac_tests + + # A test vector contains multiple results, each one for a + # different hash algorithm. + # Here we expand each test vector into multiple ones, + # and add the relevant parameters that will be passed to new() + exp_test_data = [] + for row in test_data: + for modname in row[2].keys(): + t = list(row) + t[2] = row[2][modname] + t.append(dict(digestmod=globals()[modname])) + exp_test_data.append(t) + tests = make_mac_tests(HMAC, "HMAC", exp_test_data) + tests.append(HMAC_Module_and_Instance_Test(hash_modules)) + tests.append(HMAC_None()) + + tests.append(ByteArrayTests()) + tests.append(MemoryViewTests()) + + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py new file mode 100644 index 0000000..0543a4c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py @@ -0,0 +1,346 @@ +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import KMAC128, KMAC256 + + +class KMACTest(unittest.TestCase): + + def new(self, *args, **kwargs): + return self.KMAC.new(key=b'X' * (self.minimum_key_bits // 8), *args, **kwargs) + + def test_new_positive(self): + + key = b'X' * 32 + + h = self.new() + for new_func in self.KMAC.new, h.new: + + for dbytes in range(self.minimum_bytes, 128 + 1): + hobj = new_func(key=key, mac_len=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + digest1 = new_func(key=key, data=b"\x90").digest() + digest2 = new_func(key=key).update(b"\x90").digest() + self.assertEqual(digest1, digest2) + + new_func(data=b"A", key=key, custom=b"g") + + hobj = h.new(key=key) + self.assertEqual(hobj.digest_size, self.default_bytes) + + def test_new_negative(self): + + h = self.new() + for new_func in self.KMAC.new, h.new: + self.assertRaises(ValueError, new_func, key=b'X'*32, + mac_len=0) + self.assertRaises(ValueError, new_func, key=b'X'*32, + mac_len=self.minimum_bytes - 1) + self.assertRaises(TypeError, new_func, + key=u"string") + self.assertRaises(TypeError, new_func, + data=u"string") + + def test_default_digest_size(self): + digest = self.new(data=b'abc').digest() + self.assertEqual(len(digest), self.default_bytes) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h = self.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = self.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = self.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.new() + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.new(mac_len=32, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, dig1) + + def test_hex_digest(self): + mac = self.new() + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = self.new() + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = self.new() + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_oid(self): + + oid = "2.16.840.1.101.3.4.2." + self.oid_variant + h = self.new() + self.assertEqual(h.oid, oid) + + def test_bytearray(self): + + key = b'0' * 32 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = self.KMAC.new(data=data, key=key) + h2 = self.KMAC.new(data=data_ba, key=key_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + key = b'0' * 32 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = self.KMAC.new(data=data, key=key) + h2 = self.KMAC.new(data=data_mv, key=key_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class KMAC128Test(KMACTest): + + KMAC = KMAC128 + + minimum_key_bits = 128 + + minimum_bytes = 8 + default_bytes = 64 + + oid_variant = "19" + + +class KMAC256Test(KMACTest): + + KMAC = KMAC256 + + minimum_key_bits = 256 + + minimum_bytes = 8 + default_bytes = 64 + + oid_variant = "20" + + +class NISTExampleTestVectors(unittest.TestCase): + + # https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/KMAC_samples.pdf + test_data = [ + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "", + "E5 78 0B 0D 3E A6 F7 D3 A4 29 C5 70 6A A4 3A 00" + "FA DB D7 D4 96 28 83 9E 31 87 24 3F 45 6E E1 4E", + "Sample #1 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "My Tagged Application", + "3B 1F BA 96 3C D8 B0 B5 9E 8C 1A 6D 71 88 8B 71" + "43 65 1A F8 BA 0A 70 70 C0 97 9E 28 11 32 4A A5", + "Sample #2 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "My Tagged Application", + "1F 5B 4E 6C CA 02 20 9E 0D CB 5C A6 35 B8 9A 15" + "E2 71 EC C7 60 07 1D FD 80 5F AA 38 F9 72 92 30", + "Sample #3 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "My Tagged Application", + "20 C5 70 C3 13 46 F7 03 C9 AC 36 C6 1C 03 CB 64" + "C3 97 0D 0C FC 78 7E 9B 79 59 9D 27 3A 68 D2 F7" + "F6 9D 4C C3 DE 9D 10 4A 35 16 89 F2 7C F6 F5 95" + "1F 01 03 F3 3F 4F 24 87 10 24 D9 C2 77 73 A8 DD", + "Sample #4 NIST", + KMAC256 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "", + "75 35 8C F3 9E 41 49 4E 94 97 07 92 7C EE 0A F2" + "0A 3F F5 53 90 4C 86 B0 8F 21 CC 41 4B CF D6 91" + "58 9D 27 CF 5E 15 36 9C BB FF 8B 9A 4C 2E B1 78" + "00 85 5D 02 35 FF 63 5D A8 25 33 EC 6B 75 9B 69", + "Sample #5 NIST", + KMAC256 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "My Tagged Application", + "B5 86 18 F7 1F 92 E1 D5 6C 1B 8C 55 DD D7 CD 18" + "8B 97 B4 CA 4D 99 83 1E B2 69 9A 83 7D A2 E4 D9" + "70 FB AC FD E5 00 33 AE A5 85 F1 A2 70 85 10 C3" + "2D 07 88 08 01 BD 18 28 98 FE 47 68 76 FC 89 65", + "Sample #6 NIST", + KMAC256 + ), + ] + + def setUp(self): + td = [] + for key, data, custom, mac, text, module in self.test_data: + ni = ( + unhexlify(key.replace(" ", "")), + unhexlify(data.replace(" ", "")), + custom.encode(), + unhexlify(mac.replace(" ", "")), + text, + module + ) + td.append(ni) + self.test_data = td + + def runTest(self): + + for key, data, custom, mac, text, module in self.test_data: + h = module.new(data=data, key=key, custom=custom, mac_len=len(mac)) + mac_tag = h.digest() + self.assertEqual(mac_tag, mac, msg=text) + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(KMAC128Test) + tests += list_test_cases(KMAC256Test) + tests.append(NISTExampleTestVectors()) + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py new file mode 100644 index 0000000..d247217 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py @@ -0,0 +1,324 @@ +# =================================================================== +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.KangarooTwelve""" + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import KangarooTwelve as K12 +from Cryptodome.Util.py3compat import b, bchr + + +class KangarooTwelveTest(unittest.TestCase): + + def test_length_encode(self): + self.assertEqual(K12._length_encode(0), b'\x00') + self.assertEqual(K12._length_encode(12), b'\x0C\x01') + self.assertEqual(K12._length_encode(65538), b'\x01\x00\x02\x03') + + def test_new_positive(self): + + xof1 = K12.new() + xof2 = K12.new(data=b("90")) + xof3 = K12.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + xof1 = K12.new() + ref = xof1.read(10) + xof2 = K12.new(custom=b("")) + xof3 = K12.new(custom=b("foo")) + + self.assertEqual(ref, xof2.read(10)) + self.assertNotEqual(ref, xof3.read(10)) + + xof1 = K12.new(custom=b("foo")) + xof2 = K12.new(custom=b("foo"), data=b("90")) + xof3 = K12.new(custom=b("foo")).update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = K12.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = K12.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = K12.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = K12.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = K12.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + +def txt2bin(txt): + clean = txt.replace(" ", "").replace("\n", "").replace("\r", "") + return unhexlify(clean) + + +def ptn(n): + res = bytearray(n) + pattern = b"".join([bchr(x) for x in range(0, 0xFB)]) + for base in range(0, n - 0xFB, 0xFB): + res[base:base + 0xFB] = pattern + remain = n % 0xFB + if remain: + base = (n // 0xFB) * 0xFB + res[base:] = pattern[:remain] + assert(len(res) == n) + return res + + +def chunked(source, size): + for i in range(0, len(source), size): + yield source[i:i+size] + + +# https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KangarooTwelve.txt +class KangarooTwelveTV(unittest.TestCase): + + def test_zero_1(self): + tv = """1A C2 D4 50 FC 3B 42 05 D1 9D A7 BF CA 1B 37 51 + 3C 08 03 57 7A C7 16 7F 06 FE 2C E1 F0 EF 39 E5""" + + btv = txt2bin(tv) + res = K12.new().read(32) + self.assertEqual(res, btv) + + def test_zero_2(self): + tv = """1A C2 D4 50 FC 3B 42 05 D1 9D A7 BF CA 1B 37 51 + 3C 08 03 57 7A C7 16 7F 06 FE 2C E1 F0 EF 39 E5 + 42 69 C0 56 B8 C8 2E 48 27 60 38 B6 D2 92 96 6C + C0 7A 3D 46 45 27 2E 31 FF 38 50 81 39 EB 0A 71""" + + btv = txt2bin(tv) + res = K12.new().read(64) + self.assertEqual(res, btv) + + def test_zero_3(self): + tv = """E8 DC 56 36 42 F7 22 8C 84 68 4C 89 84 05 D3 A8 + 34 79 91 58 C0 79 B1 28 80 27 7A 1D 28 E2 FF 6D""" + + btv = txt2bin(tv) + res = K12.new().read(10032) + self.assertEqual(res[-32:], btv) + + def test_ptn_1(self): + tv = """2B DA 92 45 0E 8B 14 7F 8A 7C B6 29 E7 84 A0 58 + EF CA 7C F7 D8 21 8E 02 D3 45 DF AA 65 24 4A 1F""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(1)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17(self): + tv = """6B F7 5F A2 23 91 98 DB 47 72 E3 64 78 F8 E1 9B + 0F 37 12 05 F6 A9 A9 3A 27 3F 51 DF 37 12 28 88""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_2(self): + tv = """0C 31 5E BC DE DB F6 14 26 DE 7D CF 8F B7 25 D1 + E7 46 75 D7 F5 32 7A 50 67 F3 67 B1 08 EC B6 7C""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17**2)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_3(self): + tv = """CB 55 2E 2E C7 7D 99 10 70 1D 57 8B 45 7D DF 77 + 2C 12 E3 22 E4 EE 7F E4 17 F9 2C 75 8F 0D 59 D0""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17**3)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_4(self): + tv = """87 01 04 5E 22 20 53 45 FF 4D DA 05 55 5C BB 5C + 3A F1 A7 71 C2 B8 9B AE F3 7D B4 3D 99 98 B9 FE""" + + btv = txt2bin(tv) + data = ptn(17**4) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + # Byte by byte + k12 = K12.new() + for x in data: + k12.update(bchr(x)) + res = k12.read(32) + self.assertEqual(res, btv) + + # Chunks of various prime sizes + for chunk_size in (13, 17, 19, 23, 31): + k12 = K12.new() + for x in chunked(data, chunk_size): + k12.update(x) + res = k12.read(32) + self.assertEqual(res, btv) + + def test_ptn_17_5(self): + tv = """84 4D 61 09 33 B1 B9 96 3C BD EB 5A E3 B6 B0 5C + C7 CB D6 7C EE DF 88 3E B6 78 A0 A8 E0 37 16 82""" + + btv = txt2bin(tv) + data = ptn(17**5) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + # Chunks + k12 = K12.new() + for chunk in chunked(data, 8192): + k12.update(chunk) + res = k12.read(32) + self.assertEqual(res, btv) + + def test_ptn_17_6(self): + tv = """3C 39 07 82 A8 A4 E8 9F A6 36 7F 72 FE AA F1 32 + 55 C8 D9 58 78 48 1D 3C D8 CE 85 F5 8E 88 0A F8""" + + btv = txt2bin(tv) + data = ptn(17**6) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_1(self): + tv = """FA B6 58 DB 63 E9 4A 24 61 88 BF 7A F6 9A 13 30 + 45 F4 6E E9 84 C5 6E 3C 33 28 CA AF 1A A1 A5 83""" + + btv = txt2bin(tv) + custom = ptn(1) + + # All at once + res = K12.new(custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41(self): + tv = """D8 48 C5 06 8C ED 73 6F 44 62 15 9B 98 67 FD 4C + 20 B8 08 AC C3 D5 BC 48 E0 B0 6B A0 A3 76 2E C4""" + + btv = txt2bin(tv) + custom = ptn(41) + + # All at once + res = K12.new(data=b'\xFF', custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41_2(self): + tv = """C3 89 E5 00 9A E5 71 20 85 4C 2E 8C 64 67 0A C0 + 13 58 CF 4C 1B AF 89 44 7A 72 42 34 DC 7C ED 74""" + + btv = txt2bin(tv) + custom = ptn(41**2) + + # All at once + res = K12.new(data=b'\xFF' * 3, custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41_3(self): + tv = """75 D2 F8 6A 2E 64 45 66 72 6B 4F BC FC 56 57 B9 + DB CF 07 0C 7B 0D CA 06 45 0A B2 91 D7 44 3B CF""" + + btv = txt2bin(tv) + custom = ptn(41**3) + + # All at once + res = K12.new(data=b'\xFF' * 7, custom=custom).read(32) + self.assertEqual(res, btv) + + ### + + def test_1(self): + tv = "fd608f91d81904a9916e78a18f65c157a78d63f93d8f6367db0524526a5ea2bb" + + btv = txt2bin(tv) + res = K12.new(data=b'', custom=ptn(100)).read(32) + self.assertEqual(res, btv) + + def test_2(self): + tv4 = "5a4ec9a649f81916d4ce1553492962f7868abf8dd1ceb2f0cb3682ea95cda6a6" + tv3 = "441688fe4fe4ae9425eb3105eb445eb2b3a6f67b66eff8e74ebfbc49371f6d4c" + tv2 = "17269a57759af0214c84a0fd9bc851f4d95f80554cfed4e7da8a6ee1ff080131" + tv1 = "33826990c09dc712ba7224f0d9be319e2720de95a4c1afbd2211507dae1c703a" + tv0 = "9f4d3aba908ddc096e4d3a71da954f917b9752f05052b9d26d916a6fbc75bf3e" + + res = K12.new(data=b'A' * (8192 - 4), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv4)) + + res = K12.new(data=b'A' * (8192 - 3), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv3)) + + res = K12.new(data=b'A' * (8192 - 2), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv2)) + + res = K12.new(data=b'A' * (8192 - 1), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv1)) + + res = K12.new(data=b'A' * (8192 - 0), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv0)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(KangarooTwelveTest) + tests += list_test_cases(KangarooTwelveTV) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py new file mode 100644 index 0000000..beae38a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD2.py: Self-test for the MD2 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD2""" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1319 + ('8350e5a3e24c153df2275c9f80692773', '', "'' (empty string)"), + ('32ec01ec4a6dac72c0ab96fb34c0b5d1', 'a'), + ('da853b0d3f88d99b30283a69e6ded6bb', 'abc'), + ('ab4f496bfb2a530b219ff33031fe06b0', 'message digest'), + + ('4e8ddff3650292ab5a4108c3aa47940b', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('da33def2a42df13975352846c30338cd', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('d5976f79d83d3a0dc9806c3c66f3efd8', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), +] + +def get_tests(config={}): + from Cryptodome.Hash import MD2 + from .common import make_hash_tests + return make_hash_tests(MD2, "MD2", test_data, + digest_size=16, + oid="1.2.840.113549.2.2") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py new file mode 100644 index 0000000..41de977 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD4.py: Self-test for the MD4 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD4""" + +__revision__ = "$Id$" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1320 + ('31d6cfe0d16ae931b73c59d7e0c089c0', '', "'' (empty string)"), + ('bde52cb31de33e46245e05fbdbd6fb24', 'a'), + ('a448017aaf21d8525fc10ae87aa6729d', 'abc'), + ('d9130a8164549fe818874806e1c7014b', 'message digest'), + + ('d79e1c308aa5bbcdeea8ed63df412da9', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('043f8582f241db351ce627e153e7f0e4', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('e33b4ddc9c38f2199c3e7b164fcc0536', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), +] + +def get_tests(config={}): + from Cryptodome.Hash import MD4 + from .common import make_hash_tests + return make_hash_tests(MD4, "MD4", test_data, + digest_size=16, + oid="1.2.840.113549.2.4") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py new file mode 100644 index 0000000..3f7a005 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD5.py: Self-test for the MD5 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD5""" + +from Cryptodome.Util.py3compat import * +from Cryptodome.Hash import MD5 +from binascii import unhexlify +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases + + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1321 + ('d41d8cd98f00b204e9800998ecf8427e', '', "'' (empty string)"), + ('0cc175b9c0f1b6a831c399e269772661', 'a'), + ('900150983cd24fb0d6963f7d28e17f72', 'abc'), + ('f96b697d7cb7938d525a2f31aaf161d0', 'message digest'), + + ('c3fcd3d76192e4007dfb496cca67e13b', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('d174ab98d277d9f5a5611c2c9f419d9f', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('57edf4a22be3c955ac49da2e2107b67a', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), + + # https://www.cosic.esat.kuleuven.be/nessie/testvectors/hash/md5/Md5-128.unverified.test-vectors + ('57EDF4A22BE3C955AC49DA2E2107B67A', '1234567890' * 8, 'Set 1, vector #7'), + ('7707D6AE4E027C70EEA2A935C2296F21', 'a'*1000000, 'Set 1, vector #8'), +] + + +class Md5IterTest(unittest.TestCase): + + def runTest(self): + message = b("\x00") * 16 + result1 = "4AE71336E44BF9BF79D2752E234818A5".lower() + result2 = "1A83F51285E4D89403D00C46EF8508FE".lower() + + h = MD5.new(message) + message = h.digest() + self.assertEqual(h.hexdigest(), result1) + + for _ in range(99999): + h = MD5.new(message) + message = h.digest() + + self.assertEqual(h.hexdigest(), result2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = make_hash_tests(MD5, "MD5", test_data, + digest_size=16, + oid="1.2.840.113549.2.5") + if config.get('slow_tests'): + tests += [ Md5IterTest() ] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py new file mode 100644 index 0000000..19cacb4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py @@ -0,0 +1,542 @@ +# +# SelfTest/Hash/test_Poly1305.py: Self-test for the Poly1305 module +# +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash._Poly1305""" + +import json +import unittest +from binascii import unhexlify, hexlify + +from .common import make_mac_tests +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import Poly1305 +from Cryptodome.Cipher import AES, ChaCha20 + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c + +# This is a list of (r+s keypair, data, result, description, keywords) tuples. +test_data_basic = [ + ( + "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b", + hexlify(b"Cryptographic Forum Research Group").decode(), + "a8061dc1305136c6c22b8baf0c0127a9", + "RFC7539" + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "0000000000000000000000000000000000000000000000000000000000000000", + "49ec78090e481ec6c26b33b91ccc0307", + "https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-00#section-7 A", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "48656c6c6f20776f726c6421", + "a6f745008f81c916a20dcc74eef2b2f0", + "https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-00#section-7 B", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "", + "6b657920666f7220506f6c7931333035", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "FF", + "f7e4e0ef4c46d106219da3d1bdaeb3ff", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "FF00", + "7471eceeb22988fc936da1d6e838b70e", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "AA" * 17, + "32590bc07cb2afaccca3f67f122975fe", + "Generated with pure Python", + ), + ( + "00" * 32, + "00" * 64, + "00" * 16, + "RFC7539 A.3 #1", + ), + ( + "0000000000000000000000000000000036e5f6b5c5e06070f0efca96227a863e", + hexlify( + b"Any submission t" + b"o the IETF inten" + b"ded by the Contr" + b"ibutor for publi" + b"cation as all or" + b" part of an IETF" + b" Internet-Draft " + b"or RFC and any s" + b"tatement made wi" + b"thin the context" + b" of an IETF acti" + b"vity is consider" + b"ed an \"IETF Cont" + b"ribution\". Such " + b"statements inclu" + b"de oral statemen" + b"ts in IETF sessi" + b"ons, as well as " + b"written and elec" + b"tronic communica" + b"tions made at an" + b"y time or place," + b" which are addre" + b"ssed to").decode(), + "36e5f6b5c5e06070f0efca96227a863e", + "RFC7539 A.3 #2", + ), + ( + "36e5f6b5c5e06070f0efca96227a863e00000000000000000000000000000000", + hexlify( + b"Any submission t" + b"o the IETF inten" + b"ded by the Contr" + b"ibutor for publi" + b"cation as all or" + b" part of an IETF" + b" Internet-Draft " + b"or RFC and any s" + b"tatement made wi" + b"thin the context" + b" of an IETF acti" + b"vity is consider" + b"ed an \"IETF Cont" + b"ribution\". Such " + b"statements inclu" + b"de oral statemen" + b"ts in IETF sessi" + b"ons, as well as " + b"written and elec" + b"tronic communica" + b"tions made at an" + b"y time or place," + b" which are addre" + b"ssed to").decode(), + "f3477e7cd95417af89a6b8794c310cf0", + "RFC7539 A.3 #3", + ), + ( + "1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0", + "2754776173206272696c6c69672c2061" + "6e642074686520736c6974687920746f" + "7665730a446964206779726520616e64" + "2067696d626c6520696e207468652077" + "6162653a0a416c6c206d696d73792077" + "6572652074686520626f726f676f7665" + "732c0a416e6420746865206d6f6d6520" + "7261746873206f757467726162652e", + "4541669a7eaaee61e708dc7cbcc5eb62", + "RFC7539 A.3 #4", + ), + ( + "02" + "00" * 31, + "FF" * 16, + "03" + "00" * 15, + "RFC7539 A.3 #5", + ), + ( + "02" + "00" * 15 + "FF" * 16, + "02" + "00" * 15, + "03" + "00" * 15, + "RFC7539 A.3 #6", + ), + ( + "01" + "00" * 31, + "FF" * 16 + "F0" + "FF" * 15 + "11" + "00" * 15, + "05" + "00" * 15, + "RFC7539 A.3 #7", + ), + ( + "01" + "00" * 31, + "FF" * 16 + "FB" + "FE" * 15 + "01" * 16, + "00" * 16, + "RFC7539 A.3 #8", + ), + ( + "02" + "00" * 31, + "FD" + "FF" * 15, + "FA" + "FF" * 15, + "RFC7539 A.3 #9", + ), + ( + "01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "E3 35 94 D7 50 5E 43 B9 00 00 00 00 00 00 00 00" + "33 94 D7 50 5E 43 79 CD 01 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" + "01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 00 00 00 00 00 00 55 00 00 00 00 00 00 00", + "RFC7539 A.3 #10", + ), + ( + "01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "E3 35 94 D7 50 5E 43 B9 00 00 00 00 00 00 00 00" + "33 94 D7 50 5E 43 79 CD 01 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "13" + "00" * 15, + "RFC7539 A.3 #11", + ), +] + +# This is a list of (key(k+r), data, result, description, keywords) tuples. +test_data_aes = [ + ( + "ec074c835580741701425b623235add6851fc40c3467ac0be05cc20404f3f700", + "f3f6", + "f4c633c3044fc145f84f335cb81953de", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("fb447350c4e868c52ac3275cf9d4327e") } + ), + ( + "75deaa25c09f208e1dc4ce6b5cad3fbfa0f3080000f46400d0c7e9076c834403", + "", + "dd3fab2251f11ac759f0887129cc2ee7", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("61ee09218d29b0aaed7e154a2c5509cc") } + ), + ( + "6acb5f61a7176dd320c5c1eb2edcdc7448443d0bb0d21109c89a100b5ce2c208", + "663cea190ffb83d89593f3f476b6bc24" + "d7e679107ea26adb8caf6652d0656136", + "0ee1c16bb73f0f4fd19881753c01cdbe", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("ae212a55399729595dea458bc621ff0e") } + ), + ( + "e1a5668a4d5b66a5f68cc5424ed5982d12976a08c4426d0ce8a82407c4f48207", + "ab0812724a7f1e342742cbed374d94d1" + "36c6b8795d45b3819830f2c04491faf0" + "990c62e48b8018b2c3e4a0fa3134cb67" + "fa83e158c994d961c4cb21095c1bf9", + "5154ad0d2cb26e01274fc51148491f1b", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("9ae831e743978d3a23527c7128149e3a") } + ), +] + +test_data_chacha20 = [ + ( + "00" * 32, + "FF" * 15, + "13cc5bbadc36b03a5163928f0bcb65aa", + "RFC7539 A.4 #1", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 12) } + ), + ( + "00" * 31 + "01", + "FF" * 15, + "0baf33c1d6df211bdd50a6767e98e00a", + "RFC7539 A.4 #2", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 11 + "02") } + ), + ( + "1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0" + "47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0", + "FF" * 15, + "e8b4c6db226cd8939e65e02eebf834ce", + "RFC7539 A.4 #3", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 11 + "02") } + ), + ( + "1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0" + "47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0", + "f3 33 88 86 00 00 00 00 00 00 4e 91 00 00 00 00" + "64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd" + "5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2" + "4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0" + "bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf" + "33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81" + "14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55" + "97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38" + "36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4" + "b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9" + "90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e" + "af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a" + "0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a" + "0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e" + "ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10" + "49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30" + "30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29" + "a6 ad 5c b4 02 2b 02 70 9b 00 00 00 00 00 00 00" + "0c 00 00 00 00 00 00 00 09 01 00 00 00 00 00 00", + "ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38", + "RFC7539 A.5", + { 'cipher':ChaCha20, 'nonce':unhexlify("000000000102030405060708") } + ), +] + + +class Poly1305Test_AES(unittest.TestCase): + + key = b'\x11' * 32 + + def test_new_positive(self): + + data = b'r' * 100 + + h1 = Poly1305.new(key=self.key, cipher=AES) + self.assertEqual(h1.digest_size, 16) + self.assertEqual(len(h1.nonce), 16) + d1 = h1.update(data).digest() + self.assertEqual(len(d1), 16) + + h2 = Poly1305.new(key=self.key, nonce=h1.nonce, data=data, cipher=AES) + d2 = h2.digest() + self.assertEqual(h1.nonce, h2.nonce) + self.assertEqual(d1, d2) + + def test_new_negative(self): + from Cryptodome.Cipher import DES3 + + self.assertRaises(ValueError, Poly1305.new, key=self.key[:31], cipher=AES) + self.assertRaises(ValueError, Poly1305.new, key=self.key, cipher=DES3) + self.assertRaises(ValueError, Poly1305.new, key=self.key, nonce=b'1' * 15, cipher=AES) + self.assertRaises(TypeError, Poly1305.new, key=u"2" * 32, cipher=AES) + self.assertRaises(TypeError, Poly1305.new, key=self.key, data=u"2" * 100, cipher=AES) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h1 = Poly1305.new(key=self.key, cipher=AES) + h1.update(pieces[0]).update(pieces[1]) + d1 = h1.digest() + + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h2.update(pieces[0] + pieces[1]) + d2 = h2.digest() + self.assertEqual(d1, d2) + + def test_update_negative(self): + h = Poly1305.new(key=self.key, cipher=AES) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = Poly1305.new(key=self.key, cipher=AES) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg=b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = Poly1305.new(key=self.key, data=msg[:4], cipher=AES) + h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + + def test_hex_digest(self): + mac = Poly1305.new(key=self.key, cipher=AES) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = Poly1305.new(key=self.key, cipher=AES) + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = Poly1305.new(key=self.key, cipher=AES) + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_bytearray(self): + + data = b"\x00\x01\x02" + h0 = Poly1305.new(key=self.key, data=data, cipher=AES) + d_ref = h0.digest() + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(self.key) + data_ba = bytearray(data) + + h1 = Poly1305.new(key=self.key, data=data, cipher=AES, nonce=h0.nonce) + h2 = Poly1305.new(key=key_ba, data=data_ba, cipher=AES, nonce=h0.nonce) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xEE' + + self.assertEqual(h1.digest(), d_ref) + self.assertEqual(h2.digest(), d_ref) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = Poly1305.new(key=self.key, cipher=AES) + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(self.key) + data_mv = get_mv(data) + + h1 = Poly1305.new(key=self.key, data=data, cipher=AES) + h2 = Poly1305.new(key=key_mv, data=data_mv, cipher=AES, + nonce=h1.nonce) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = Poly1305.new(key=self.key, cipher=AES) + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class Poly1305Test_ChaCha20(unittest.TestCase): + + key = b'\x11' * 32 + + def test_new_positive(self): + data = b'r' * 100 + + h1 = Poly1305.new(key=self.key, cipher=ChaCha20) + self.assertEqual(h1.digest_size, 16) + self.assertEqual(len(h1.nonce), 12) + + h2 = Poly1305.new(key=self.key, cipher=ChaCha20, nonce = b'8' * 8) + self.assertEqual(len(h2.nonce), 8) + self.assertEqual(h2.nonce, b'8' * 8) + + def test_new_negative(self): + + self.assertRaises(ValueError, Poly1305.new, key=self.key, nonce=b'1' * 7, cipher=ChaCha20) + + +# +# make_mac_tests() expect a new() function with signature new(key, data, +# **kwargs), and we need to adapt Poly1305's, as it only uses keywords +# +class Poly1305_New(object): + + @staticmethod + def new(key, *data, **kwds): + _kwds = dict(kwds) + if len(data) == 1: + _kwds['data'] = data[0] + _kwds['key'] = key + return Poly1305.new(**_kwds) + + +class Poly1305_Basic(object): + + @staticmethod + def new(key, *data, **kwds): + from Cryptodome.Hash.Poly1305 import Poly1305_MAC + + if len(data) == 1: + msg = data[0] + else: + msg = None + + return Poly1305_MAC(key[:16], key[16:], msg) + + +class Poly1305AES_MC(unittest.TestCase): + + def runTest(self): + tag = unhexlify(b"fb447350c4e868c52ac3275cf9d4327e") + + msg = b'' + for msg_len in range(5000 + 1): + key = tag + strxor_c(tag, 0xFF) + nonce = tag[::-1] + if msg_len > 0: + msg = msg + tobytes(tag[0]) + auth = Poly1305.new(key=key, nonce=nonce, cipher=AES, data=msg) + tag = auth.digest() + + # Compare against output of original DJB's poly1305aes-20050218 + self.assertEqual("CDFA436DDD629C7DC20E1128530BAED2", auth.hexdigest().upper()) + + +def get_tests(config={}): + tests = make_mac_tests(Poly1305_Basic, "Poly1305", test_data_basic) + tests += make_mac_tests(Poly1305_New, "Poly1305", test_data_aes) + tests += make_mac_tests(Poly1305_New, "Poly1305", test_data_chacha20) + tests += [ Poly1305AES_MC() ] + tests += list_test_cases(Poly1305Test_AES) + tests += list_test_cases(Poly1305Test_ChaCha20) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py new file mode 100644 index 0000000..c05a877 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_RIPEMD160.py: Self-test for the RIPEMD-160 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +#"""Self-test suite for Cryptodome.Hash.RIPEMD160""" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors downloaded 2008-09-12 from + # http://homes.esat.kuleuven.be/~bosselae/ripemd160.html + ('9c1185a5c5e9fc54612808977ee8f548b2258d31', '', "'' (empty string)"), + ('0bdc9d2d256b3ee9daae347be6f4dc835a467ffe', 'a'), + ('8eb208f7e05d987a9b044a8e98c6b087f15a0bfc', 'abc'), + ('5d0689ef49d2fae572b881b123a85ffa21595f36', 'message digest'), + + ('f71c27109c692c1b56bbdceb5b9d2865b3708dbc', + 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('12a053384a9c0c88e405a06c27dcf49ada62eb2b', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', + 'abcdbcd...pnopq'), + + ('b0e20b6e3116640286ed3a87a5713079b21f5189', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('9b752e45573d4b39f4dbd3323cab82bf63326bfb', + '1234567890' * 8, + "'1234567890' * 8"), + + ('52783243c1697bdbe16d37f97f68f08325dc1528', + 'a' * 10**6, + '"a" * 10**6'), +] + +def get_tests(config={}): + from Cryptodome.Hash import RIPEMD160 + from .common import make_hash_tests + return make_hash_tests(RIPEMD160, "RIPEMD160", test_data, + digest_size=20, + oid="1.3.36.3.2.1") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py new file mode 100644 index 0000000..a879e68 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/SHA1.py: Self-test for the SHA-1 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA""" + +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data_various = [ + # FIPS PUB 180-2, A.1 - "One-Block Message" + ('a9993e364706816aba3e25717850c26c9cd0d89d', 'abc'), + + # FIPS PUB 180-2, A.2 - "Multi-Block Message" + ('84983e441c3bd26ebaae4aa1f95129e5e54670f1', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # FIPS PUB 180-2, A.3 - "Long Message" +# ('34aa973cd4c4daa4f61eeb2bdbad27316534016f', +# 'a' * 10**6, +# '"a" * 10**6'), + + # RFC 3174: Section 7.3, "TEST4" (multiple of 512 bits) + ('dea356a2cddd90c7a7ecedc5ebb563934f460452', + '01234567' * 80, + '"01234567" * 80'), +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA1 + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA1"), + "SHA1ShortMsg.rsp", + "KAT SHA-1", + { "len" : lambda x: int(x) } ) or [] + + test_data = test_data_various[:] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA1, "SHA1", test_data, + digest_size=20, + oid="1.3.14.3.2.26") + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py new file mode 100644 index 0000000..da32423 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA224.py: Self-test for the SHA-224 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA224""" + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + + # RFC 3874: Section 3.1, "Test Vector #1 + ('23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7', 'abc'), + + # RFC 3874: Section 3.2, "Test Vector #2 + ('75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # RFC 3874: Section 3.3, "Test Vector #3 + ('20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67', 'a' * 10**6, "'a' * 10**6"), + + # Examples from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f', ''), + + ('49b08defa65e644cbf8a2dd9270bdededabc741997d1dadd42026d7b', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + + ('58911e7fccf2971a7d07f93162d8bd13568e71aa8fc86fc1fe9043d1', + 'Frank jagt im komplett verwahrlosten Taxi quer durch Bayern'), + +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA224 + from .common import make_hash_tests + return make_hash_tests(SHA224, "SHA224", test_data, + digest_size=28, + oid='2.16.840.1.101.3.4.2.4') + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py new file mode 100644 index 0000000..23d1145 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA256.py: Self-test for the SHA-256 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA256""" + +import unittest +from Cryptodome.Util.py3compat import * + +class LargeSHA256Test(unittest.TestCase): + def runTest(self): + """SHA256: 512/520 MiB test""" + from Cryptodome.Hash import SHA256 + zeros = bchr(0x00) * (1024*1024) + + h = SHA256.new(zeros) + for i in range(511): + h.update(zeros) + + # This test vector is from PyCrypto's old testdata.py file. + self.assertEqual('9acca8e8c22201155389f65abbf6bc9723edc7384ead80503839f49dcc56d767', h.hexdigest()) # 512 MiB + + for i in range(8): + h.update(zeros) + + # This test vector is from PyCrypto's old testdata.py file. + self.assertEqual('abf51ad954b246009dfe5a50ecd582fd5b8f1b8b27f30393853c3ef721e7fa6e', h.hexdigest()) # 520 MiB + +def get_tests(config={}): + # Test vectors from FIPS PUB 180-2 + # This is a list of (expected_result, input[, description]) tuples. + test_data = [ + # FIPS PUB 180-2, B.1 - "One-Block Message" + ('ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', + 'abc'), + + # FIPS PUB 180-2, B.2 - "Multi-Block Message" + ('248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # FIPS PUB 180-2, B.3 - "Long Message" + ('cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0', + 'a' * 10**6, + '"a" * 10**6'), + + # Test for an old PyCryptodome bug. + ('f7fd017a3c721ce7ff03f3552c0813adcc48b7f33f07e5e2ba71e23ea393d103', + 'This message is precisely 55 bytes long, to test a bug.', + 'Length = 55 (mod 64)'), + + # Example from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', ''), + + ('d32b568cd1b96d459e7291ebf4b25d007f275c9f13149beeb782fac0716613f8', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + ] + + from Cryptodome.Hash import SHA256 + from .common import make_hash_tests + tests = make_hash_tests(SHA256, "SHA256", test_data, + digest_size=32, + oid="2.16.840.1.101.3.4.2.1") + + if config.get('slow_tests'): + tests += [LargeSHA256Test()] + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py new file mode 100644 index 0000000..5233d13 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA.py: Self-test for the SHA-384 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA384""" + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + + # RFC 4634: Section Page 8.4, "Test 1" + ('cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7', 'abc'), + + # RFC 4634: Section Page 8.4, "Test 2.2" + ('09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'), + + # RFC 4634: Section Page 8.4, "Test 3" + ('9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985', 'a' * 10**6, "'a' * 10**6"), + + # Taken from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b', ''), + + # Example from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('71e8383a4cea32d6fd6877495db2ee353542f46fa44bc23100bca48f3366b84e809f0708e81041f427c6d5219a286677', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA384 + from .common import make_hash_tests + return make_hash_tests(SHA384, "SHA384", test_data, + digest_size=48, + oid='2.16.840.1.101.3.4.2.2') + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py new file mode 100644 index 0000000..3141880 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_224.py: Self-test for the SHA-3/224 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_224""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_224 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-224.txt", + "KAT SHA-3 224", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_224", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.7") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py new file mode 100644 index 0000000..9dee551 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_256.py: Self-test for the SHA-3/256 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_256""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_256 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-256.txt", + "KAT SHA-3 256", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + + tests += make_hash_tests(SHA3, "SHA3_256", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.8") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py new file mode 100644 index 0000000..c5030b5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_384.py: Self-test for the SHA-3/384 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_384""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_384 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-384.txt", + "KAT SHA-3 384", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_384", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.9") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py new file mode 100644 index 0000000..b7a57f8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_512.py: Self-test for the SHA-3/512 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_512""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_512 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-512.txt", + "KAT SHA-3 512", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_512", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.10") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py new file mode 100644 index 0000000..e6c74b3 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA512.py: Self-test for the SHA-512 hash function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA512""" + +from binascii import hexlify + +from Cryptodome.Hash import SHA512 +from .common import make_hash_tests +from Cryptodome.SelfTest.loader import load_test_vectors + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data_512_other = [ + + # RFC 4634: Section Page 8.4, "Test 1" + ('ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f', 'abc'), + + # RFC 4634: Section Page 8.4, "Test 2.1" + ('8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'), + + # RFC 4634: Section Page 8.4, "Test 3" + ('e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b', 'a' * 10**6, "'a' * 10**6"), + + # Taken from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e', ''), + + ('af9ed2de700433b803240a552b41b5a472a6ef3fe1431a722b2063c75e9f07451f67a28e37d09cde769424c96aea6f8971389db9e1993d6c565c3c71b855723c', 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), +] + + +def get_tests_SHA512(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512ShortMsg.rsp", + "KAT SHA-512", + {"len": lambda x: int(x)}) or [] + + test_data = test_data_512_other[:] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512", test_data, + digest_size=64, + oid="2.16.840.1.101.3.4.2.3") + return tests + + +def get_tests_SHA512_224(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512_224ShortMsg.rsp", + "KAT SHA-512/224", + {"len": lambda x: int(x)}) or [] + + test_data = [] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512/224", test_data, + digest_size=28, + oid="2.16.840.1.101.3.4.2.5", + extra_params={ "truncate" : "224" }) + return tests + + +def get_tests_SHA512_256(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512_256ShortMsg.rsp", + "KAT SHA-512/256", + {"len": lambda x: int(x)}) or [] + + test_data = [] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512/256", test_data, + digest_size=32, + oid="2.16.840.1.101.3.4.2.6", + extra_params={ "truncate" : "256" }) + return tests + + +def get_tests(config={}): + + tests = [] + tests += get_tests_SHA512() + tests += get_tests_SHA512_224() + tests += get_tests_SHA512_256() + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py new file mode 100644 index 0000000..2283308 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py @@ -0,0 +1,143 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHAKE128 and SHAKE256""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import SHAKE128, SHAKE256 +from Cryptodome.Util.py3compat import b, bchr, bord, tobytes + +class SHAKETest(unittest.TestCase): + + def test_new_positive(self): + + xof1 = self.shake.new() + xof2 = self.shake.new(data=b("90")) + xof3 = self.shake.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = self.shake.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = self.shake.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = self.shake.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.shake.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = self.shake.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + +class SHAKE128Test(SHAKETest): + shake = SHAKE128 + + +class SHAKE256Test(SHAKETest): + shake = SHAKE256 + + +class SHAKEVectors(unittest.TestCase): + pass + + +test_vectors_128 = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHAKE128.txt", + "Short Messages KAT SHAKE128", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_128): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = SHAKE128.new(data=data) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(SHAKEVectors, "test_128_%d" % idx, new_test) + + +test_vectors_256 = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHAKE256.txt", + "Short Messages KAT SHAKE256", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_256): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = SHAKE256.new(data=data) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(SHAKEVectors, "test_256_%d" % idx, new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(SHAKE128Test) + tests += list_test_cases(SHAKE256Test) + tests += list_test_cases(SHAKEVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py new file mode 100644 index 0000000..b5e6a0a --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py @@ -0,0 +1,286 @@ +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import TupleHash128, TupleHash256 + + +class TupleHashTest(unittest.TestCase): + + def new(self, *args, **kwargs): + return self.TupleHash.new(*args, **kwargs) + + def test_new_positive(self): + + h = self.new() + for new_func in self.TupleHash.new, h.new: + + for dbits in range(64, 1024 + 1, 8): + hobj = new_func(digest_bits=dbits) + self.assertEqual(hobj.digest_size * 8, dbits) + + for dbytes in range(8, 128 + 1): + hobj = new_func(digest_bytes=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + hobj = h.new() + self.assertEqual(hobj.digest_size, self.default_bytes) + + def test_new_negative(self): + + h = self.new() + for new_func in self.TupleHash.new, h.new: + self.assertRaises(TypeError, new_func, + digest_bytes=self.minimum_bytes, + digest_bits=self.minimum_bits) + self.assertRaises(ValueError, new_func, digest_bytes=0) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bits + 7) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bits - 8) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bytes - 1) + + def test_default_digest_size(self): + digest = self.new().digest() + self.assertEqual(len(digest), self.default_bytes) + + def test_update(self): + h = self.new() + h.update(b'') + h.digest() + + h = self.new() + h.update(b'') + h.update(b'STRING1') + h.update(b'STRING2') + mac1 = h.digest() + + h = self.new() + h.update(b'STRING1') + h.update(b'STRING2') + mac2 = h.digest() + + self.assertNotEqual(mac1, mac2) + + def test_update_negative(self): + h = self.new() + self.assertRaises(TypeError, h.update, u"string") + self.assertRaises(TypeError, h.update, None) + + def test_digest(self): + h = self.new() + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.new() + h.update(msg) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, dig1) + + def test_hex_digest(self): + mac = self.new() + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_bytearray(self): + + data = b"\x00\x01\x02" + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class TupleHash128Test(TupleHashTest): + + TupleHash = TupleHash128 + + minimum_bytes = 8 + default_bytes = 64 + + minimum_bits = 64 + default_bits = 512 + + +class TupleHash256Test(TupleHashTest): + + TupleHash = TupleHash256 + + minimum_bytes = 8 + default_bytes = 64 + + minimum_bits = 64 + default_bits = 512 + + +class NISTExampleTestVectors(unittest.TestCase): + + # http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TupleHash_samples.pdf + test_data = [ + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "", + "C5 D8 78 6C 1A FB 9B 82 11 1A B3 4B 65 B2 C0 04" + "8F A6 4E 6D 48 E2 63 26 4C E1 70 7D 3F FC 8E D1", + "KMAC128 Sample #1 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "My Tuple App", + "75 CD B2 0F F4 DB 11 54 E8 41 D7 58 E2 41 60 C5" + "4B AE 86 EB 8C 13 E7 F5 F4 0E B3 55 88 E9 6D FB", + "KMAC128 Sample #2 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + "20 21 22 23 24 25 26 27 28", + ), + "My Tuple App", + "E6 0F 20 2C 89 A2 63 1E DA 8D 4C 58 8C A5 FD 07" + "F3 9E 51 51 99 8D EC CF 97 3A DB 38 04 BB 6E 84", + "KMAC128 Sample #3 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "", + "CF B7 05 8C AC A5 E6 68 F8 1A 12 A2 0A 21 95 CE" + "97 A9 25 F1 DB A3 E7 44 9A 56 F8 22 01 EC 60 73" + "11 AC 26 96 B1 AB 5E A2 35 2D F1 42 3B DE 7B D4" + "BB 78 C9 AE D1 A8 53 C7 86 72 F9 EB 23 BB E1 94", + "KMAC256 Sample #4 NIST", + TupleHash256 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "My Tuple App", + "14 7C 21 91 D5 ED 7E FD 98 DB D9 6D 7A B5 A1 16" + "92 57 6F 5F E2 A5 06 5F 3E 33 DE 6B BA 9F 3A A1" + "C4 E9 A0 68 A2 89 C6 1C 95 AA B3 0A EE 1E 41 0B" + "0B 60 7D E3 62 0E 24 A4 E3 BF 98 52 A1 D4 36 7E", + "KMAC256 Sample #5 NIST", + TupleHash256 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + "20 21 22 23 24 25 26 27 28", + ), + "My Tuple App", + "45 00 0B E6 3F 9B 6B FD 89 F5 47 17 67 0F 69 A9" + "BC 76 35 91 A4 F0 5C 50 D6 88 91 A7 44 BC C6 E7" + "D6 D5 B5 E8 2C 01 8D A9 99 ED 35 B0 BB 49 C9 67" + "8E 52 6A BD 8E 85 C1 3E D2 54 02 1D B9 E7 90 CE", + "KMAC256 Sample #6 NIST", + TupleHash256 + ), + + + + ] + + def setUp(self): + td = [] + for tv_in in self.test_data: + tv_out = [None] * len(tv_in) + + tv_out[0] = [] + for string in tv_in[0]: + tv_out[0].append(unhexlify(string.replace(" ", ""))) + + tv_out[1] = tobytes(tv_in[1]) # Custom + tv_out[2] = unhexlify(tv_in[2].replace(" ", "")) + tv_out[3] = tv_in[3] + tv_out[4] = tv_in[4] + td.append(tv_out) + self.test_data = td + + def runTest(self): + + for data, custom, digest, text, module in self.test_data: + hd = module.new(custom=custom, digest_bytes=len(digest)) + for string in data: + hd.update(string) + self.assertEqual(hd.digest(), digest, msg=text) + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(TupleHash128Test) + tests += list_test_cases(TupleHash256Test) + tests.append(NISTExampleTestVectors()) + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py new file mode 100644 index 0000000..6797160 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py @@ -0,0 +1,178 @@ +# =================================================================== +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.cSHAKE128 and cSHAKE256""" + +import unittest + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import cSHAKE128, cSHAKE256, SHAKE128, SHAKE256 +from Cryptodome.Util.py3compat import b, bchr, tobytes + + +class cSHAKETest(unittest.TestCase): + + def test_left_encode(self): + from Cryptodome.Hash.cSHAKE128 import _left_encode + self.assertEqual(_left_encode(0), b'\x01\x00') + self.assertEqual(_left_encode(1), b'\x01\x01') + self.assertEqual(_left_encode(256), b'\x02\x01\x00') + + def test_bytepad(self): + from Cryptodome.Hash.cSHAKE128 import _bytepad + self.assertEqual(_bytepad(b'', 4), b'\x01\x04\x00\x00') + self.assertEqual(_bytepad(b'A', 4), b'\x01\x04A\x00') + self.assertEqual(_bytepad(b'AA', 4), b'\x01\x04AA') + self.assertEqual(_bytepad(b'AAA', 4), b'\x01\x04AAA\x00\x00\x00') + self.assertEqual(_bytepad(b'AAAA', 4), b'\x01\x04AAAA\x00\x00') + self.assertEqual(_bytepad(b'AAAAA', 4), b'\x01\x04AAAAA\x00') + self.assertEqual(_bytepad(b'AAAAAA', 4), b'\x01\x04AAAAAA') + self.assertEqual(_bytepad(b'AAAAAAA', 4), b'\x01\x04AAAAAAA\x00\x00\x00') + + def test_new_positive(self): + + xof1 = self.cshake.new() + xof2 = self.cshake.new(data=b("90")) + xof3 = self.cshake.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + xof1 = self.cshake.new() + ref = xof1.read(10) + xof2 = self.cshake.new(custom=b("")) + xof3 = self.cshake.new(custom=b("foo")) + + self.assertEqual(ref, xof2.read(10)) + self.assertNotEqual(ref, xof3.read(10)) + + xof1 = self.cshake.new(custom=b("foo")) + xof2 = self.cshake.new(custom=b("foo"), data=b("90")) + xof3 = self.cshake.new(custom=b("foo")).update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = self.cshake.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = self.cshake.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = self.cshake.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.cshake.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = self.cshake.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + def test_shake(self): + # When no customization string is passed, results must match SHAKE + for digest_len in range(64): + xof1 = self.cshake.new(b'TEST') + xof2 = self.shake.new(b'TEST') + self.assertEqual(xof1.read(digest_len), xof2.read(digest_len)) + + +class cSHAKE128Test(cSHAKETest): + cshake = cSHAKE128 + shake = SHAKE128 + + +class cSHAKE256Test(cSHAKETest): + cshake = cSHAKE256 + shake = SHAKE256 + + +class cSHAKEVectors(unittest.TestCase): + pass + + +vector_files = [("ShortMsgSamples_cSHAKE128.txt", "Short Message Samples cSHAKE128", "128_cshake", cSHAKE128), + ("ShortMsgSamples_cSHAKE256.txt", "Short Message Samples cSHAKE256", "256_cshake", cSHAKE256), + ("CustomMsgSamples_cSHAKE128.txt", "Custom Message Samples cSHAKE128", "custom_128_cshake", cSHAKE128), + ("CustomMsgSamples_cSHAKE256.txt", "Custom Message Samples cSHAKE256", "custom_256_cshake", cSHAKE256), + ] + +for file, descr, tag, test_class in vector_files: + + test_vectors = load_test_vectors(("Hash", "SHA3"), file, descr, + {"len": lambda x: int(x), + "nlen": lambda x: int(x), + "slen": lambda x: int(x)}) or [] + + for idx, tv in enumerate(test_vectors): + if getattr(tv, "len", 0) == 0: + data = b("") + else: + data = tobytes(tv.msg) + assert(tv.len == len(tv.msg)*8) + if getattr(tv, "nlen", 0) != 0: + raise ValueError("Unsupported cSHAKE test vector") + if getattr(tv, "slen", 0) == 0: + custom = b("") + else: + custom = tobytes(tv.s) + assert(tv.slen == len(tv.s)*8) + + def new_test(self, data=data, result=tv.md, custom=custom, test_class=test_class): + hobj = test_class.new(data=data, custom=custom) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(cSHAKEVectors, "test_%s_%d" % (tag, idx), new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(cSHAKE128Test) + tests += list_test_cases(cSHAKE256Test) + tests += list_test_cases(cSHAKEVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py new file mode 100644 index 0000000..dcc0d13 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py @@ -0,0 +1,250 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.keccak""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import keccak +from Cryptodome.Util.py3compat import b, tobytes, bchr + +class KeccakTest(unittest.TestCase): + + def test_new_positive(self): + + for digest_bits in (224, 256, 384, 512): + hobj = keccak.new(digest_bits=digest_bits) + self.assertEqual(hobj.digest_size, digest_bits // 8) + + hobj2 = hobj.new() + self.assertEqual(hobj2.digest_size, digest_bits // 8) + + for digest_bytes in (28, 32, 48, 64): + hobj = keccak.new(digest_bytes=digest_bytes) + self.assertEqual(hobj.digest_size, digest_bytes) + + hobj2 = hobj.new() + self.assertEqual(hobj2.digest_size, digest_bytes) + + def test_new_positive2(self): + + digest1 = keccak.new(data=b("\x90"), digest_bytes=64).digest() + digest2 = keccak.new(digest_bytes=64).update(b("\x90")).digest() + self.assertEqual(digest1, digest2) + + def test_new_negative(self): + + # keccak.new needs digest size + self.assertRaises(TypeError, keccak.new) + + h = keccak.new(digest_bits=512) + + # Either bits or bytes can be specified + self.assertRaises(TypeError, keccak.new, + digest_bytes=64, + digest_bits=512) + + # Range + self.assertRaises(ValueError, keccak.new, digest_bytes=0) + self.assertRaises(ValueError, keccak.new, digest_bytes=1) + self.assertRaises(ValueError, keccak.new, digest_bytes=65) + self.assertRaises(ValueError, keccak.new, digest_bits=0) + self.assertRaises(ValueError, keccak.new, digest_bits=1) + self.assertRaises(ValueError, keccak.new, digest_bits=513) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = keccak.new(digest_bytes=64) + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = keccak.new(digest_bytes=64) + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = keccak.new(digest_bytes=64) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = keccak.new(digest_bytes=64) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b("digest")))) + + def test_hex_digest(self): + mac = keccak.new(digest_bits=512) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = keccak.new(digest_bits=512, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = keccak.new(digest_bits=512, data=msg).digest() + + # With the proper flag, it is allowed + h = keccak.new(digest_bits=512, data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +class KeccakVectors(unittest.TestCase): + pass + + # TODO: add ExtremelyLong tests + + +test_vectors_224 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_224.txt", + "Short Messages KAT 224", + {"len": lambda x: int(x)}) or [] + +test_vectors_224 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_224.txt", + "Long Messages KAT 224", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_224): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=224, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_224_%d" % idx, new_test) + +# --- + +test_vectors_256 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_256.txt", + "Short Messages KAT 256", + { "len" : lambda x: int(x) } ) or [] + +test_vectors_256 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_256.txt", + "Long Messages KAT 256", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_256): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=256, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_256_%d" % idx, new_test) + + +# --- + +test_vectors_384 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_384.txt", + "Short Messages KAT 384", + {"len": lambda x: int(x)}) or [] + +test_vectors_384 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_384.txt", + "Long Messages KAT 384", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_384): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=384, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_384_%d" % idx, new_test) + +# --- + +test_vectors_512 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_512.txt", + "Short Messages KAT 512", + {"len": lambda x: int(x)}) or [] + +test_vectors_512 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_512.txt", + "Long Messages KAT 512", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_512): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=512, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_512_%d" % idx, new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(KeccakTest) + tests += list_test_cases(KeccakVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py new file mode 100644 index 0000000..f15f141 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py @@ -0,0 +1,47 @@ +# +# SelfTest/IO/__init__.py: Self-test for input/output module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test for I/O""" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.IO import test_PKCS8; tests += test_PKCS8.get_tests(config=config) + from Cryptodome.SelfTest.IO import test_PBES; tests += test_PBES.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py new file mode 100644 index 0000000..bd055ab --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py @@ -0,0 +1,93 @@ +# +# SelfTest/IO/test_PBES.py: Self-test for the _PBES module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-tests for Cryptodome.IO._PBES module""" + +import unittest +from Cryptodome.Util.py3compat import * + +from Cryptodome.IO._PBES import PBES2 + + +class TestPBES2(unittest.TestCase): + + def setUp(self): + self.ref = b("Test data") + self.passphrase = b("Passphrase") + + def test1(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test2(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndAES128-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test3(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndAES192-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test4(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES128-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test5(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES192-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test6(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES256-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(TestPBES2) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py new file mode 100644 index 0000000..3cef9bc --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py @@ -0,0 +1,425 @@ +# +# SelfTest/IO/test_PKCS8.py: Self-test for the PKCS8 module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-tests for Cryptodome.IO.PKCS8 module""" + +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import * +from Cryptodome.IO import PKCS8 + +from Cryptodome.Util.asn1 import DerNull + +oid_key = '1.2.840.113549.1.1.1' + +# Original RSA key (in DER format) +# hexdump -v -e '32/1 "%02x" "\n"' key.der +clear_key=""" +308201ab020100025a00b94a7f7075ab9e79e8196f47be707781e80dd965cf16 +0c951a870b71783b6aaabbd550c0e65e5a3dfe15b8620009f6d7e5efec42a3f0 +6fe20faeebb0c356e79cdec6db4dd427e82d8ae4a5b90996227b8ba54ccfc4d2 +5c08050203010001025a00afa09c70d528299b7552fe766b5d20f9a221d66938 +c3b68371d48515359863ff96f0978d700e08cd6fd3d8a3f97066fc2e0d5f78eb +3a50b8e17ba297b24d1b8e9cdfd18d608668198d724ad15863ef0329195dee89 +3f039395022d0ebe0518df702a8b25954301ec60a97efdcec8eaa4f2e76ca7e8 +8dfbc3f7e0bb83f9a0e8dc47c0f8c746e9df6b022d0c9195de13f09b7be1fdd7 +1f56ae7d973e08bd9fd2c3dfd8936bb05be9cc67bd32d663c7f00d70932a0be3 +c24f022d0ac334eb6cabf1933633db007b763227b0d9971a9ea36aca8b669ec9 +4fcf16352f6b3dcae28e4bd6137db4ddd3022d0400a09f15ee7b351a2481cb03 +09920905c236d09c87afd3022f3afc2a19e3b746672b635238956ee7e6dd62d5 +022d0cd88ed14fcfbda5bbf0257f700147137bbab9c797af7df866704b889aa3 +7e2e93df3ff1a0fd3490111dcdbc4c +""" + +# Same key as above, wrapped in PKCS#8 but w/o password +# +# openssl pkcs8 -topk8 -inform DER -nocrypt -in key.der -outform DER -out keyp8.der +# hexdump -v -e '32/1 "%02x" "\n"' keyp8.der +wrapped_clear_key=""" +308201c5020100300d06092a864886f70d0101010500048201af308201ab0201 +00025a00b94a7f7075ab9e79e8196f47be707781e80dd965cf160c951a870b71 +783b6aaabbd550c0e65e5a3dfe15b8620009f6d7e5efec42a3f06fe20faeebb0 +c356e79cdec6db4dd427e82d8ae4a5b90996227b8ba54ccfc4d25c0805020301 +0001025a00afa09c70d528299b7552fe766b5d20f9a221d66938c3b68371d485 +15359863ff96f0978d700e08cd6fd3d8a3f97066fc2e0d5f78eb3a50b8e17ba2 +97b24d1b8e9cdfd18d608668198d724ad15863ef0329195dee893f039395022d +0ebe0518df702a8b25954301ec60a97efdcec8eaa4f2e76ca7e88dfbc3f7e0bb +83f9a0e8dc47c0f8c746e9df6b022d0c9195de13f09b7be1fdd71f56ae7d973e +08bd9fd2c3dfd8936bb05be9cc67bd32d663c7f00d70932a0be3c24f022d0ac3 +34eb6cabf1933633db007b763227b0d9971a9ea36aca8b669ec94fcf16352f6b +3dcae28e4bd6137db4ddd3022d0400a09f15ee7b351a2481cb0309920905c236 +d09c87afd3022f3afc2a19e3b746672b635238956ee7e6dd62d5022d0cd88ed1 +4fcfbda5bbf0257f700147137bbab9c797af7df866704b889aa37e2e93df3ff1 +a0fd3490111dcdbc4c +""" + +### +# +# The key above will now be encrypted with different algorithms. +# The password is always 'TestTest'. +# +# Each item in the wrapped_enc_keys list contains: +# * wrap algorithm +# * iteration count +# * Salt +# * IV +# * Expected result +### +wrapped_enc_keys = [] + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der -outform DER -out keyenc.der -v2 des3 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC', +2048, +"47EA7227D8B22E2F", # IV +"E3F7A838AB911A4D", # Salt +""" +30820216304006092a864886f70d01050d3033301b06092a864886f70d01050c +300e0408e3f7a838ab911a4d02020800301406082a864886f70d0307040847ea +7227d8b22e2f048201d0ea388b374d2d0e4ceb7a5139f850fdff274884a6e6c0 +64326e09d00dbba9018834edb5a51a6ae3d1806e6e91eebf33788ce71fee0637 +a2ebf58859dd32afc644110c390274a6128b50c39b8d907823810ec471bada86 +6f5b75d8ea04ad310fad2e73621696db8e426cd511ee93ec1714a1a7db45e036 +4bf20d178d1f16bbb250b32c2d200093169d588de65f7d99aad9ddd0104b44f1 +326962e1520dfac3c2a800e8a14f678dff2b3d0bb23f69da635bf2a643ac934e +219a447d2f4460b67149e860e54f365da130763deefa649c72b0dcd48966a2d3 +4a477444782e3e66df5a582b07bbb19778a79bd355074ce331f4a82eb966b0c4 +52a09eab6116f2722064d314ae433b3d6e81d2436e93fdf446112663cde93b87 +9c8be44beb45f18e2c78fee9b016033f01ecda51b9b142091fa69f65ab784d2c +5ad8d34be6f7f1464adfc1e0ef3f7848f40d3bdea4412758f2fcb655c93d8f4d +f6fa48fc5aa4b75dd1c017ab79ac9d737233a6d668f5364ccf47786debd37334 +9c10c9e6efbe78430a61f71c89948aa32cdc3cc7338cf994147819ce7ab23450 +c8f7d9b94c3bb377d17a3fa204b601526317824b142ff6bc843fa7815ece89c0 +839573f234dac8d80cc571a045353d61db904a4398d8ef3df5ac +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der -outform DER -out keyenc.der +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithMD5AndDES-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d010503300e0408f9b990c89af1d41b020208 +00048201d0c6267fe8592903891933d559e71a7ca68b2e39150f19daca0f7921 +52f97e249d72f670d5140e9150433310ed7c7ee51927693fd39884cb9551cea5 +a7b746f7edf199f8787d4787a35dad930d7db057b2118851211b645ac8b90fa6 +b0e7d49ac8567cbd5fff226e87aa9129a0f52c45e9307752e8575c3b0ff756b7 +31fda6942d15ecb6b27ea19370ccc79773f47891e80d22b440d81259c4c28eac +e0ca839524116bcf52d8c566e49a95ddb0e5493437279a770a39fd333f3fca91 +55884fad0ba5aaf273121f893059d37dd417da7dcfd0d6fa7494968f13b2cc95 +65633f2c891340193e5ec00e4ee0b0e90b3b93da362a4906360845771ade1754 +9df79140be5993f3424c012598eadd3e7c7c0b4db2c72cf103d7943a5cf61420 +93370b9702386c3dd4eb0a47f34b579624a46a108b2d13921fa1b367495fe345 +6aa128aa70f8ca80ae13eb301e96c380724ce67c54380bbea2316c1faf4d058e +b4ca2e23442047606b9bc4b3bf65b432cb271bea4eb35dd3eb360d3be8612a87 +a50e96a2264490aeabdc07c6e78e5dbf4fe3388726d0e2a228346bf3c2907d68 +2a6276b22ae883fb30fa611f4e4193e7a08480fcd7db48308bacbd72bf4807aa +11fd394859f97d22982f7fe890b2e2a0f7e7ffb693 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-SHA1-RC2-64 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithSHA1AndRC2-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d01050b300e04083ee943bdae185008020208 +00048201d0e4614d9371d3ff10ceabc2f6a7a13a0f449f9a714144e46518ea55 +e3e6f0cde24031d01ef1f37ec40081449ef01914faf45983dde0d2bc496712de +8dd15a5527dff4721d9016c13f34fb93e3ce68577e30146266d71b539f854e56 +753a192cf126ed4812734d86f81884374f1100772f78d0646e9946407637c565 +d070acab413c55952f7237437f2e48cae7fa0ff8d370de2bf446dd08049a3663 +d9c813ac197468c02e2b687e7ca994cf7f03f01b6eca87dbfed94502c2094157 +ea39f73fe4e591df1a68b04d19d9adab90bb9898467c1464ad20bf2b8fb9a5ff +d3ec91847d1c67fd768a4b9cfb46572eccc83806601372b6fad0243f58f623b7 +1c5809dea0feb8278fe27e5560eed8448dc93f5612f546e5dd7c5f6404365eb2 +5bf3396814367ae8b15c5c432b57eaed1f882c05c7f6517ee9e42b87b7b8d071 +9d6125d1b52f7b2cca1f6bd5f584334bf90bce1a7d938274cafe27b68e629698 +b16e27ae528db28593af9adcfccbebb3b9e1f2af5cd5531b51968389caa6c091 +e7de1f1b96f0d258e54e540d961a7c0ef51fda45d6da5fddd33e9bbfd3a5f8d7 +d7ab2e971de495cddbc86d38444fee9f0ac097b00adaf7802dabe0cff5b43b45 +4f26b7b547016f89be52676866189911c53e2f2477""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-MD5-RC2-64 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithMD5AndRC2-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d010506300e0408f5cd2fee56d9b4b8020208 +00048201d086454942d6166a19d6b108465bd111e7080911f573d54b1369c676 +df28600e84936bfec04f91023ff16499e2e07178c340904f12ffa6886ab66228 +32bf43c2bff5a0ed14e765918cf5fc543ad49566246f7eb3fc044fa5a9c25f40 +8fc8c8296b91658d3bb1067c0aba008c4fefd9e2bcdbbbd63fdc8085482bccf4 +f150cec9a084259ad441a017e5d81a1034ef2484696a7a50863836d0eeda45cd +8cee8ecabfed703f8d9d4bbdf3a767d32a0ccdc38550ee2928d7fe3fa27eda5b +5c7899e75ad55d076d2c2d3c37d6da3d95236081f9671dab9a99afdb1cbc890e +332d1a91105d9a8ce08b6027aa07367bd1daec3059cb51f5d896124da16971e4 +0ca4bcadb06c854bdf39f42dd24174011414e51626d198775eff3449a982df7b +ace874e77e045eb6d7c3faef0750792b29a068a6291f7275df1123fac5789c51 +27ace42836d81633faf9daf38f6787fff0394ea484bbcd465b57d4dbee3cf8df +b77d1db287b3a6264c466805be5a4fe85cfbca180699859280f2dd8e2c2c10b5 +7a7d2ac670c6039d41952fbb0e4f99b560ebe1d020e1b96d02403283819c00cc +529c51f0b0101555e4c58002ba3c6e3c12e3fde1aec94382792e96d9666a2b33 +3dc397b22ecab67ee38a552fec29a1d4ff8719c748""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-SHA1-DES +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithSHA1AndDES-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d01050a300e04089bacc9cf1e8f734e020208 +00048201d03e502f3ceafe8fd19ab2939576bfdded26d719b2441db1459688f5 +9673218b41ec1f739edf1e460bd927bc28470c87b2d4fc8ea02ba17b47a63c49 +c5c1bee40529dadfd3ef8b4472c730bc136678c78abfb34670ec9d7dcd17ee3f +892f93f2629e6e0f4b24ecb9f954069bf722f466dece3913bb6abbd2c471d9a5 +c5eea89b14aaccda43d30b0dd0f6eb6e9850d9747aa8aa8414c383ad01c374ee +26d3552abec9ba22669cc9622ccf2921e3d0c8ecd1a70e861956de0bec6104b5 +b649ac994970c83f8a9e84b14a7dff7843d4ca3dd4af87cea43b5657e15ae0b5 +a940ce5047f006ab3596506600724764f23757205fe374fee04911336d655acc +03e159ec27789191d1517c4f3f9122f5242d44d25eab8f0658cafb928566ca0e +8f6589aa0c0ab13ca7a618008ae3eafd4671ee8fe0b562e70b3623b0e2a16eee +97fd388087d2e03530c9fe7db6e52eccc7c48fd701ede35e08922861a9508d12 +bc8bbf24f0c6bee6e63dbcb489b603d4c4a78ce45bf2eab1d5d10456c42a65a8 +3a606f4e4b9b46eb13b57f2624b651859d3d2d5192b45dbd5a2ead14ff20ca76 +48f321309aa56d8c0c4a192b580821cc6c70c75e6f19d1c5414da898ec4dd39d +b0eb93d6ba387a80702dfd2db610757ba340f63230 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes128 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES128-CBC', +2048, +"4F66EE5D3BCD531FE6EBF4B4E73016B8", # IV +"479F25156176C53A", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e0408479f25156176c53a02020800301d060960864801650304010204104f +66ee5d3bcd531fe6ebf4b4e73016b8048201d0e33cfa560423f589d097d21533 +3b880a5ebac5b2ac58b4e73b0d787aee7764f034fe34ca1d1bd845c0a7c3316f +afbfb2129e03dcaf5a5031394206492828dacef1e04639bee5935e0f46114202 +10bc6c37182f4889be11c5d0486c398f4be952e5740f65de9d8edeb275e2b406 +e19bc29ad5ebb97fa536344fc3d84c7e755696f12b810898de4e6f069b8a81c8 +0aab0d45d7d062303aaa4a10c2ce84fdb5a03114039cfe138e38bb15b2ced717 +93549cdad85e730b14d9e2198b663dfdc8d04a4349eb3de59b076ad40b116d4a +25ed917c576bc7c883c95ef0f1180e28fc9981bea069594c309f1aa1b253ceab +a2f0313bb1372bcb51a745056be93d77a1f235a762a45e8856512d436b2ca0f7 +dd60fbed394ba28978d2a2b984b028529d0a58d93aba46c6bbd4ac1e4013cbaa +63b00988bc5f11ccc40141c346762d2b28f64435d4be98ec17c1884985e3807e +e550db606600993efccf6de0dfc2d2d70b5336a3b018fa415d6bdd59f5777118 +16806b7bc17c4c7e20ad7176ebfa5a1aa3f6bc10f04b77afd443944642ac9cca +d740e082b4a3bbb8bafdd34a0b3c5f2f3c2aceccccdccd092b78994b845bfa61 +706c3b9df5165ed1dbcbf1244fe41fc9bf993f52f7658e2f87e1baaeacb0f562 +9d905c +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes192 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES192-CBC', +2048, +"5CFC2A4FF7B63201A4A8A5B021148186", # IV +"D718541C264944CE", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e0408d718541c264944ce02020800301d060960864801650304011604105c +fc2a4ff7b63201a4a8a5b021148186048201d08e74aaa21b8bcfb15b9790fe95 +b0e09ddb0f189b6fb1682fdb9f122b804650ddec3c67a1df093a828b3e5fbcc6 +286abbcc5354c482fd796d972e919ca8a5eba1eaa2293af1d648013ddad72106 +75622264dfba55dafdda39e338f058f1bdb9846041ffff803797d3fdf3693135 +8a192729ea8346a7e5e58e925a2e2e4af0818581859e8215d87370eb4194a5ff +bae900857d4c591dbc651a241865a817eaede9987c9f9ae4f95c0bf930eea88c +4d7596e535ffb7ca369988aba75027a96b9d0bc9c8b0b75f359067fd145a378b +02aaa15e9db7a23176224da48a83249005460cc6e429168657f2efa8b1af7537 +d7d7042f2d683e8271b21d591090963eeb57aea6172f88da139e1614d6a7d1a2 +1002d5a7a93d6d21156e2b4777f6fc069287a85a1538c46b7722ccde591ab55c +630e1ceeb1ac42d1b41f3f654e9da86b5efced43775ea68b2594e50e4005e052 +0fe753c0898120c2c07265367ff157f6538a1e4080d6f9d1ca9eb51939c9574e +f2e4e1e87c1434affd5808563cddd376776dbbf790c6a40028f311a8b58dafa2 +0970ed34acd6e3e89d063987893b2b9570ddb8cc032b05a723bba9444933ebf3 +c624204be72f4190e0245197d0cb772bec933fd8442445f9a28bd042d5a3a1e9 +9a8a07 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes192 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES256-CBC', +2048, +"323351F94462AC563E053A056252C2C4", # IV +"02A6CD0D12E727B5", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e040802a6cd0d12e727b502020800301d060960864801650304012a041032 +3351f94462ac563e053a056252c2c4048201d07f4ef1c7be21aae738a20c5632 +b8bdbbb9083b6e7f68822267b1f481fd27fdafd61a90660de6e4058790e4c912 +bf3f319a7c37e6eb3d956daaa143865020d554bf6215e8d7492359aaeef45d6e +d85a686ed26c0bf7c18d071d827a86f0b73e1db0c0e7f3d42201544093302a90 +551ad530692468c47ac15c69500b8ca67d4a17b64d15cecc035ae50b768a36cf +07c395afa091e9e6f86f665455fbdc1b21ad79c0908b73da5de75a9b43508d5d +44dc97a870cd3cd9f01ca24452e9b11c1b4982946702cfcbfda5b2fcc0203fb5 +0b52a115760bd635c94d4c95ac2c640ee9a04ffaf6ccff5a8d953dd5d88ca478 +c377811c521f2191639c643d657a9e364af88bb7c14a356c2b0b4870a23c2f54 +d41f8157afff731471dccc6058b15e1151bcf84b39b5e622a3a1d65859c912a5 +591b85e034a1f6af664f030a6bfc8c3d20c70f32b54bcf4da9c2da83cef49cf8 +e9a74f0e5d358fe50b88acdce6a9db9a7ad61536212fc5f877ebfc7957b8bda4 +b1582a0f10d515a20ee06cf768db9c977aa6fbdca7540d611ff953012d009dac +e8abd059f8e8ffea637c9c7721f817aaf0bb23403e26a0ef0ff0e2037da67d41 +af728481f53443551a9bff4cea023164e9622b5441a309e1f4bff98e5bf76677 +8d7cd9 +""" +)) + +def txt2bin(inputs): + s = b('').join([b(x) for x in inputs if not (x in '\n\r\t ')]) + return unhexlify(s) + +class Rng: + def __init__(self, output): + self.output=output + self.idx=0 + def __call__(self, n): + output = self.output[self.idx:self.idx+n] + self.idx += n + return output + +class PKCS8_Decrypt(unittest.TestCase): + + def setUp(self): + self.oid_key = oid_key + self.clear_key = txt2bin(clear_key) + self.wrapped_clear_key = txt2bin(wrapped_clear_key) + self.wrapped_enc_keys = [] + for t in wrapped_enc_keys: + self.wrapped_enc_keys.append(( + t[0], + t[1], + txt2bin(t[2]), + txt2bin(t[3]), + txt2bin(t[4]) + )) + + ### NO ENCRYTION + + def test1(self): + """Verify unwrapping w/o encryption""" + res1, res2, res3 = PKCS8.unwrap(self.wrapped_clear_key) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + def test2(self): + """Verify wrapping w/o encryption""" + wrapped = PKCS8.wrap(self.clear_key, self.oid_key) + res1, res2, res3 = PKCS8.unwrap(wrapped) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + ## ENCRYPTION + + def test3(self): + """Verify unwrapping with encryption""" + + for t in self.wrapped_enc_keys: + res1, res2, res3 = PKCS8.unwrap(t[4], b("TestTest")) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + def test4(self): + """Verify wrapping with encryption""" + + for t in self.wrapped_enc_keys: + if t[0] == 'skip encryption': + continue + rng = Rng(t[2]+t[3]) + params = { 'iteration_count':t[1] } + wrapped = PKCS8.wrap( + self.clear_key, + self.oid_key, + b("TestTest"), + protection=t[0], + prot_params=params, + key_params=DerNull(), + randfunc=rng) + self.assertEqual(wrapped, t[4]) + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(PKCS8_Decrypt) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py new file mode 100644 index 0000000..f5aa3aa --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py @@ -0,0 +1,49 @@ +# +# SelfTest/Math/__init__.py: Self-test for math module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test for Math""" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Math import test_Numbers + from Cryptodome.SelfTest.Math import test_Primality + from Cryptodome.SelfTest.Math import test_modexp + tests += test_Numbers.get_tests(config=config) + tests += test_Primality.get_tests(config=config) + tests += test_modexp.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py new file mode 100644 index 0000000..9802570 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py @@ -0,0 +1,797 @@ +# +# SelfTest/Math/test_Numbers.py: Self-test for Numbers module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test for Math.Numbers""" + +import sys +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Math._IntegerNative import IntegerNative + + +class TestIntegerBase(unittest.TestCase): + + def setUp(self): + raise NotImplementedError("To be implemented") + + def Integers(self, *arg): + return map(self.Integer, arg) + + def test_init_and_equality(self): + Integer = self.Integer + + v1 = Integer(23) + v2 = Integer(v1) + v3 = Integer(-9) + self.assertRaises(ValueError, Integer, 1.0) + + v4 = Integer(10**10) + v5 = Integer(-10**10) + + v6 = Integer(0xFFFF) + v7 = Integer(0xFFFFFFFF) + v8 = Integer(0xFFFFFFFFFFFFFFFF) + + self.assertEqual(v1, v1) + self.assertEqual(v1, 23) + self.assertEqual(v1, v2) + self.assertEqual(v3, -9) + self.assertEqual(v4, 10 ** 10) + self.assertEqual(v5, -10 ** 10) + self.assertEqual(v6, 0xFFFF) + self.assertEqual(v7, 0xFFFFFFFF) + self.assertEqual(v8, 0xFFFFFFFFFFFFFFFF) + + self.assertFalse(v1 == v4) + + # Init and comparison between Integer's + v6 = Integer(v1) + self.assertEqual(v1, v6) + + self.assertFalse(Integer(0) == None) + + def test_conversion_to_int(self): + v1, v2 = self.Integers(-23, 2 ** 1000) + self.assertEqual(int(v1), -23) + self.assertEqual(int(v2), 2 ** 1000) + + def test_equality_with_ints(self): + v1, v2, v3 = self.Integers(23, -89, 2 ** 1000) + self.assertTrue(v1 == 23) + self.assertTrue(v2 == -89) + self.assertFalse(v1 == 24) + self.assertTrue(v3 == 2 ** 1000) + + def test_conversion_to_str(self): + v1, v2, v3, v4 = self.Integers(20, 0, -20, 2 ** 1000) + self.assertTrue(str(v1) == "20") + self.assertTrue(str(v2) == "0") + self.assertTrue(str(v3) == "-20") + self.assertTrue(str(v4) == "10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376") + + def test_repr(self): + v1, v2 = self.Integers(-1, 2**80) + self.assertEqual(repr(v1), "Integer(-1)") + self.assertEqual(repr(v2), "Integer(1208925819614629174706176)") + + def test_conversion_to_bytes(self): + Integer = self.Integer + + v1 = Integer(0x17) + self.assertEqual(b("\x17"), v1.to_bytes()) + + v2 = Integer(0xFFFE) + self.assertEqual(b("\xFF\xFE"), v2.to_bytes()) + self.assertEqual(b("\x00\xFF\xFE"), v2.to_bytes(3)) + self.assertRaises(ValueError, v2.to_bytes, 1) + + self.assertEqual(b("\xFE\xFF"), v2.to_bytes(byteorder='little')) + self.assertEqual(b("\xFE\xFF\x00"), v2.to_bytes(3, byteorder='little')) + + v3 = Integer(-90) + self.assertRaises(ValueError, v3.to_bytes) + self.assertRaises(ValueError, v3.to_bytes, byteorder='bittle') + + def test_conversion_from_bytes(self): + Integer = self.Integer + + v1 = Integer.from_bytes(b"\x00") + self.assertTrue(isinstance(v1, Integer)) + self.assertEqual(0, v1) + + v2 = Integer.from_bytes(b"\x00\x01") + self.assertEqual(1, v2) + + v3 = Integer.from_bytes(b"\xFF\xFF") + self.assertEqual(0xFFFF, v3) + + v4 = Integer.from_bytes(b"\x00\x01", 'big') + self.assertEqual(1, v4) + + v5 = Integer.from_bytes(b"\x00\x01", byteorder='big') + self.assertEqual(1, v5) + + v6 = Integer.from_bytes(b"\x00\x01", byteorder='little') + self.assertEqual(0x0100, v6) + + self.assertRaises(ValueError, Integer.from_bytes, b'\x09', 'bittle') + + def test_inequality(self): + # Test Integer!=Integer and Integer!=int + v1, v2, v3, v4 = self.Integers(89, 89, 90, -8) + self.assertTrue(v1 != v3) + self.assertTrue(v1 != 90) + self.assertFalse(v1 != v2) + self.assertFalse(v1 != 89) + self.assertTrue(v1 != v4) + self.assertTrue(v4 != v1) + self.assertTrue(self.Integer(0) != None) + + def test_less_than(self): + # Test Integer<Integer and Integer<int + v1, v2, v3, v4, v5 = self.Integers(13, 13, 14, -8, 2 ** 10) + self.assertTrue(v1 < v3) + self.assertTrue(v1 < 14) + self.assertFalse(v1 < v2) + self.assertFalse(v1 < 13) + self.assertTrue(v4 < v1) + self.assertFalse(v1 < v4) + self.assertTrue(v1 < v5) + self.assertFalse(v5 < v1) + + def test_less_than_or_equal(self): + # Test Integer<=Integer and Integer<=int + v1, v2, v3, v4, v5 = self.Integers(13, 13, 14, -4, 2 ** 10) + self.assertTrue(v1 <= v1) + self.assertTrue(v1 <= 13) + self.assertTrue(v1 <= v2) + self.assertTrue(v1 <= 14) + self.assertTrue(v1 <= v3) + self.assertFalse(v1 <= v4) + self.assertTrue(v1 <= v5) + self.assertFalse(v5 <= v1) + + def test_more_than(self): + # Test Integer>Integer and Integer>int + v1, v2, v3, v4, v5 = self.Integers(13, 13, 14, -8, 2 ** 10) + self.assertTrue(v3 > v1) + self.assertTrue(v3 > 13) + self.assertFalse(v1 > v1) + self.assertFalse(v1 > v2) + self.assertFalse(v1 > 13) + self.assertTrue(v1 > v4) + self.assertFalse(v4 > v1) + self.assertTrue(v5 > v1) + self.assertFalse(v1 > v5) + + def test_more_than_or_equal(self): + # Test Integer>=Integer and Integer>=int + v1, v2, v3, v4 = self.Integers(13, 13, 14, -4) + self.assertTrue(v3 >= v1) + self.assertTrue(v3 >= 13) + self.assertTrue(v1 >= v2) + self.assertTrue(v1 >= v1) + self.assertTrue(v1 >= 13) + self.assertFalse(v4 >= v1) + + def test_bool(self): + v1, v2, v3, v4 = self.Integers(0, 10, -9, 2 ** 10) + self.assertFalse(v1) + self.assertFalse(bool(v1)) + self.assertTrue(v2) + self.assertTrue(bool(v2)) + self.assertTrue(v3) + self.assertTrue(v4) + + def test_is_negative(self): + v1, v2, v3, v4, v5 = self.Integers(-3 ** 100, -3, 0, 3, 3**100) + self.assertTrue(v1.is_negative()) + self.assertTrue(v2.is_negative()) + self.assertFalse(v4.is_negative()) + self.assertFalse(v5.is_negative()) + + def test_addition(self): + # Test Integer+Integer and Integer+int + v1, v2, v3 = self.Integers(7, 90, -7) + self.assertTrue(isinstance(v1 + v2, self.Integer)) + self.assertEqual(v1 + v2, 97) + self.assertEqual(v1 + 90, 97) + self.assertEqual(v1 + v3, 0) + self.assertEqual(v1 + (-7), 0) + self.assertEqual(v1 + 2 ** 10, 2 ** 10 + 7) + + def test_subtraction(self): + # Test Integer-Integer and Integer-int + v1, v2, v3 = self.Integers(7, 90, -7) + self.assertTrue(isinstance(v1 - v2, self.Integer)) + self.assertEqual(v2 - v1, 83) + self.assertEqual(v2 - 7, 83) + self.assertEqual(v2 - v3, 97) + self.assertEqual(v1 - (-7), 14) + self.assertEqual(v1 - 2 ** 10, 7 - 2 ** 10) + + def test_multiplication(self): + # Test Integer-Integer and Integer-int + v1, v2, v3, v4 = self.Integers(4, 5, -2, 2 ** 10) + self.assertTrue(isinstance(v1 * v2, self.Integer)) + self.assertEqual(v1 * v2, 20) + self.assertEqual(v1 * 5, 20) + self.assertEqual(v1 * -2, -8) + self.assertEqual(v1 * 2 ** 10, 4 * (2 ** 10)) + + def test_floor_div(self): + v1, v2, v3 = self.Integers(3, 8, 2 ** 80) + self.assertTrue(isinstance(v1 // v2, self.Integer)) + self.assertEqual(v2 // v1, 2) + self.assertEqual(v2 // 3, 2) + self.assertEqual(v2 // -3, -3) + self.assertEqual(v3 // 2 ** 79, 2) + self.assertRaises(ZeroDivisionError, lambda: v1 // 0) + + def test_remainder(self): + # Test Integer%Integer and Integer%int + v1, v2, v3 = self.Integers(23, 5, -4) + self.assertTrue(isinstance(v1 % v2, self.Integer)) + self.assertEqual(v1 % v2, 3) + self.assertEqual(v1 % 5, 3) + self.assertEqual(v3 % 5, 1) + self.assertEqual(v1 % 2 ** 10, 23) + self.assertRaises(ZeroDivisionError, lambda: v1 % 0) + self.assertRaises(ValueError, lambda: v1 % -6) + + def test_simple_exponentiation(self): + v1, v2, v3 = self.Integers(4, 3, -2) + self.assertTrue(isinstance(v1 ** v2, self.Integer)) + self.assertEqual(v1 ** v2, 64) + self.assertEqual(pow(v1, v2), 64) + self.assertEqual(v1 ** 3, 64) + self.assertEqual(pow(v1, 3), 64) + self.assertEqual(v3 ** 2, 4) + self.assertEqual(v3 ** 3, -8) + + self.assertRaises(ValueError, pow, v1, -3) + + def test_modular_exponentiation(self): + v1, v2, v3 = self.Integers(23, 5, 17) + + self.assertTrue(isinstance(pow(v1, v2, v3), self.Integer)) + self.assertEqual(pow(v1, v2, v3), 7) + self.assertEqual(pow(v1, 5, v3), 7) + self.assertEqual(pow(v1, v2, 17), 7) + self.assertEqual(pow(v1, 5, 17), 7) + self.assertEqual(pow(v1, 0, 17), 1) + self.assertEqual(pow(v1, 1, 2 ** 80), 23) + self.assertEqual(pow(v1, 2 ** 80, 89298), 17689) + + self.assertRaises(ZeroDivisionError, pow, v1, 5, 0) + self.assertRaises(ValueError, pow, v1, 5, -4) + self.assertRaises(ValueError, pow, v1, -3, 8) + + def test_inplace_exponentiation(self): + v1 = self.Integer(4) + v1.inplace_pow(2) + self.assertEqual(v1, 16) + + v1 = self.Integer(4) + v1.inplace_pow(2, 15) + self.assertEqual(v1, 1) + + def test_abs(self): + v1, v2, v3, v4, v5 = self.Integers(-2 ** 100, -2, 0, 2, 2 ** 100) + self.assertEqual(abs(v1), 2 ** 100) + self.assertEqual(abs(v2), 2) + self.assertEqual(abs(v3), 0) + self.assertEqual(abs(v4), 2) + self.assertEqual(abs(v5), 2 ** 100) + + def test_sqrt(self): + v1, v2, v3, v4 = self.Integers(-2, 0, 49, 10**100) + + self.assertRaises(ValueError, v1.sqrt) + self.assertEqual(v2.sqrt(), 0) + self.assertEqual(v3.sqrt(), 7) + self.assertEqual(v4.sqrt(), 10**50) + + def test_sqrt_module(self): + + # Invalid modulus (non positive) + self.assertRaises(ValueError, self.Integer(5).sqrt, 0) + self.assertRaises(ValueError, self.Integer(5).sqrt, -1) + + # Simple cases + assert self.Integer(0).sqrt(5) == 0 + assert self.Integer(1).sqrt(5) in (1, 4) + + # Test with all quadratic residues in several fields + for p in (11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53): + for i in range(0, p): + square = i**2 % p + res = self.Integer(square).sqrt(p) + assert res in (i, p - i) + + # 2 is a non-quadratic reside in Z_11 + self.assertRaises(ValueError, self.Integer(2).sqrt, 11) + + # 10 is not a prime + self.assertRaises(ValueError, self.Integer(4).sqrt, 10) + + # 5 is square residue of 4 and 7 + assert self.Integer(5 - 11).sqrt(11) in (4, 7) + assert self.Integer(5 + 11).sqrt(11) in (4, 7) + + def test_in_place_add(self): + v1, v2 = self.Integers(10, 20) + + v1 += v2 + self.assertEqual(v1, 30) + v1 += 10 + self.assertEqual(v1, 40) + v1 += -1 + self.assertEqual(v1, 39) + v1 += 2 ** 1000 + self.assertEqual(v1, 39 + 2 ** 1000) + + def test_in_place_sub(self): + v1, v2 = self.Integers(10, 20) + + v1 -= v2 + self.assertEqual(v1, -10) + v1 -= -100 + self.assertEqual(v1, 90) + v1 -= 90000 + self.assertEqual(v1, -89910) + v1 -= -100000 + self.assertEqual(v1, 10090) + + def test_in_place_mul(self): + v1, v2 = self.Integers(3, 5) + + v1 *= v2 + self.assertEqual(v1, 15) + v1 *= 2 + self.assertEqual(v1, 30) + v1 *= -2 + self.assertEqual(v1, -60) + v1 *= 2 ** 1000 + self.assertEqual(v1, -60 * (2 ** 1000)) + + def test_in_place_modulus(self): + v1, v2 = self.Integers(20, 7) + + v1 %= v2 + self.assertEqual(v1, 6) + v1 %= 2 ** 1000 + self.assertEqual(v1, 6) + v1 %= 2 + self.assertEqual(v1, 0) + def t(): + v3 = self.Integer(9) + v3 %= 0 + self.assertRaises(ZeroDivisionError, t) + + def test_and(self): + v1, v2, v3 = self.Integers(0xF4, 0x31, -0xF) + self.assertTrue(isinstance(v1 & v2, self.Integer)) + self.assertEqual(v1 & v2, 0x30) + self.assertEqual(v1 & 0x31, 0x30) + self.assertEqual(v1 & v3, 0xF0) + self.assertEqual(v1 & -0xF, 0xF0) + self.assertEqual(v3 & -0xF, -0xF) + self.assertEqual(v2 & (2 ** 1000 + 0x31), 0x31) + + def test_or(self): + v1, v2, v3 = self.Integers(0x40, 0x82, -0xF) + self.assertTrue(isinstance(v1 | v2, self.Integer)) + self.assertEqual(v1 | v2, 0xC2) + self.assertEqual(v1 | 0x82, 0xC2) + self.assertEqual(v2 | v3, -0xD) + self.assertEqual(v2 | 2 ** 1000, 2 ** 1000 + 0x82) + + def test_right_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + self.assertEqual(v1 >> 0, v1) + self.assertTrue(isinstance(v1 >> v2, self.Integer)) + self.assertEqual(v1 >> v2, 0x08) + self.assertEqual(v1 >> 1, 0x08) + self.assertRaises(ValueError, lambda: v1 >> -1) + self.assertEqual(v1 >> (2 ** 1000), 0) + + self.assertEqual(v3 >> 1, -0x08) + self.assertEqual(v3 >> (2 ** 1000), -1) + + def test_in_place_right_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + v1 >>= 0 + self.assertEqual(v1, 0x10) + v1 >>= 1 + self.assertEqual(v1, 0x08) + v1 >>= v2 + self.assertEqual(v1, 0x04) + v3 >>= 1 + self.assertEqual(v3, -0x08) + def l(): + v4 = self.Integer(0x90) + v4 >>= -1 + self.assertRaises(ValueError, l) + def m1(): + v4 = self.Integer(0x90) + v4 >>= 2 ** 1000 + return v4 + self.assertEqual(0, m1()) + def m2(): + v4 = self.Integer(-1) + v4 >>= 2 ** 1000 + return v4 + self.assertEqual(-1, m2()) + + def _test_left_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + self.assertEqual(v1 << 0, v1) + self.assertTrue(isinstance(v1 << v2, self.Integer)) + self.assertEqual(v1 << v2, 0x20) + self.assertEqual(v1 << 1, 0x20) + self.assertEqual(v3 << 1, -0x20) + self.assertRaises(ValueError, lambda: v1 << -1) + self.assertRaises(ValueError, lambda: v1 << (2 ** 1000)) + + def test_in_place_left_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + v1 <<= 0 + self.assertEqual(v1, 0x10) + v1 <<= 1 + self.assertEqual(v1, 0x20) + v1 <<= v2 + self.assertEqual(v1, 0x40) + v3 <<= 1 + self.assertEqual(v3, -0x20) + def l(): + v4 = self.Integer(0x90) + v4 <<= -1 + self.assertRaises(ValueError, l) + def m(): + v4 = self.Integer(0x90) + v4 <<= 2 ** 1000 + self.assertRaises(ValueError, m) + + + def test_get_bit(self): + v1, v2, v3 = self.Integers(0x102, -3, 1) + self.assertEqual(v1.get_bit(0), 0) + self.assertEqual(v1.get_bit(1), 1) + self.assertEqual(v1.get_bit(v3), 1) + self.assertEqual(v1.get_bit(8), 1) + self.assertEqual(v1.get_bit(9), 0) + + self.assertRaises(ValueError, v1.get_bit, -1) + self.assertEqual(v1.get_bit(2 ** 1000), 0) + + self.assertRaises(ValueError, v2.get_bit, -1) + self.assertRaises(ValueError, v2.get_bit, 0) + self.assertRaises(ValueError, v2.get_bit, 1) + self.assertRaises(ValueError, v2.get_bit, 2 * 1000) + + def test_odd_even(self): + v1, v2, v3, v4, v5 = self.Integers(0, 4, 17, -4, -17) + + self.assertTrue(v1.is_even()) + self.assertTrue(v2.is_even()) + self.assertFalse(v3.is_even()) + self.assertTrue(v4.is_even()) + self.assertFalse(v5.is_even()) + + self.assertFalse(v1.is_odd()) + self.assertFalse(v2.is_odd()) + self.assertTrue(v3.is_odd()) + self.assertFalse(v4.is_odd()) + self.assertTrue(v5.is_odd()) + + def test_size_in_bits(self): + v1, v2, v3, v4 = self.Integers(0, 1, 0x100, -90) + self.assertEqual(v1.size_in_bits(), 1) + self.assertEqual(v2.size_in_bits(), 1) + self.assertEqual(v3.size_in_bits(), 9) + self.assertRaises(ValueError, v4.size_in_bits) + + def test_size_in_bytes(self): + v1, v2, v3, v4, v5, v6 = self.Integers(0, 1, 0xFF, 0x1FF, 0x10000, -9) + self.assertEqual(v1.size_in_bytes(), 1) + self.assertEqual(v2.size_in_bytes(), 1) + self.assertEqual(v3.size_in_bytes(), 1) + self.assertEqual(v4.size_in_bytes(), 2) + self.assertEqual(v5.size_in_bytes(), 3) + self.assertRaises(ValueError, v6.size_in_bits) + + def test_perfect_square(self): + + self.assertFalse(self.Integer(-9).is_perfect_square()) + self.assertTrue(self.Integer(0).is_perfect_square()) + self.assertTrue(self.Integer(1).is_perfect_square()) + self.assertFalse(self.Integer(2).is_perfect_square()) + self.assertFalse(self.Integer(3).is_perfect_square()) + self.assertTrue(self.Integer(4).is_perfect_square()) + self.assertTrue(self.Integer(39*39).is_perfect_square()) + self.assertFalse(self.Integer(39*39+1).is_perfect_square()) + + for x in range(100, 1000): + self.assertFalse(self.Integer(x**2+1).is_perfect_square()) + self.assertTrue(self.Integer(x**2).is_perfect_square()) + + def test_fail_if_divisible_by(self): + v1, v2, v3 = self.Integers(12, -12, 4) + + # No failure expected + v1.fail_if_divisible_by(7) + v2.fail_if_divisible_by(7) + v2.fail_if_divisible_by(2 ** 80) + + # Failure expected + self.assertRaises(ValueError, v1.fail_if_divisible_by, 4) + self.assertRaises(ValueError, v1.fail_if_divisible_by, v3) + + def test_multiply_accumulate(self): + v1, v2, v3 = self.Integers(4, 3, 2) + v1.multiply_accumulate(v2, v3) + self.assertEqual(v1, 10) + v1.multiply_accumulate(v2, 2) + self.assertEqual(v1, 16) + v1.multiply_accumulate(3, v3) + self.assertEqual(v1, 22) + v1.multiply_accumulate(1, -2) + self.assertEqual(v1, 20) + v1.multiply_accumulate(-2, 1) + self.assertEqual(v1, 18) + v1.multiply_accumulate(1, 2 ** 1000) + self.assertEqual(v1, 18 + 2 ** 1000) + v1.multiply_accumulate(2 ** 1000, 1) + self.assertEqual(v1, 18 + 2 ** 1001) + + def test_set(self): + v1, v2 = self.Integers(3, 6) + v1.set(v2) + self.assertEqual(v1, 6) + v1.set(9) + self.assertEqual(v1, 9) + v1.set(-2) + self.assertEqual(v1, -2) + v1.set(2 ** 1000) + self.assertEqual(v1, 2 ** 1000) + + def test_inverse(self): + v1, v2, v3, v4, v5, v6 = self.Integers(2, 5, -3, 0, 723872, 3433) + + self.assertTrue(isinstance(v1.inverse(v2), self.Integer)) + self.assertEqual(v1.inverse(v2), 3) + self.assertEqual(v1.inverse(5), 3) + self.assertEqual(v3.inverse(5), 3) + self.assertEqual(v5.inverse(92929921), 58610507) + self.assertEqual(v6.inverse(9912), 5353) + + self.assertRaises(ValueError, v2.inverse, 10) + self.assertRaises(ValueError, v1.inverse, -3) + self.assertRaises(ValueError, v4.inverse, 10) + self.assertRaises(ZeroDivisionError, v2.inverse, 0) + + def test_inplace_inverse(self): + v1, v2 = self.Integers(2, 5) + + v1.inplace_inverse(v2) + self.assertEqual(v1, 3) + + def test_gcd(self): + v1, v2, v3, v4 = self.Integers(6, 10, 17, -2) + self.assertTrue(isinstance(v1.gcd(v2), self.Integer)) + self.assertEqual(v1.gcd(v2), 2) + self.assertEqual(v1.gcd(10), 2) + self.assertEqual(v1.gcd(v3), 1) + self.assertEqual(v1.gcd(-2), 2) + self.assertEqual(v4.gcd(6), 2) + + def test_lcm(self): + v1, v2, v3, v4, v5 = self.Integers(6, 10, 17, -2, 0) + self.assertTrue(isinstance(v1.lcm(v2), self.Integer)) + self.assertEqual(v1.lcm(v2), 30) + self.assertEqual(v1.lcm(10), 30) + self.assertEqual(v1.lcm(v3), 102) + self.assertEqual(v1.lcm(-2), 6) + self.assertEqual(v4.lcm(6), 6) + self.assertEqual(v1.lcm(0), 0) + self.assertEqual(v5.lcm(0), 0) + + def test_jacobi_symbol(self): + + data = ( + (1001, 1, 1), + (19, 45, 1), + (8, 21, -1), + (5, 21, 1), + (610, 987, -1), + (1001, 9907, -1), + (5, 3439601197, -1) + ) + + js = self.Integer.jacobi_symbol + + # Jacobi symbol is always 1 for k==1 or n==1 + for k in range(1, 30): + self.assertEqual(js(k, 1), 1) + for n in range(1, 30, 2): + self.assertEqual(js(1, n), 1) + + # Fail if n is not positive odd + self.assertRaises(ValueError, js, 6, -2) + self.assertRaises(ValueError, js, 6, -1) + self.assertRaises(ValueError, js, 6, 0) + self.assertRaises(ValueError, js, 0, 0) + self.assertRaises(ValueError, js, 6, 2) + self.assertRaises(ValueError, js, 6, 4) + self.assertRaises(ValueError, js, 6, 6) + self.assertRaises(ValueError, js, 6, 8) + + for tv in data: + self.assertEqual(js(tv[0], tv[1]), tv[2]) + self.assertEqual(js(self.Integer(tv[0]), tv[1]), tv[2]) + self.assertEqual(js(tv[0], self.Integer(tv[1])), tv[2]) + + def test_jacobi_symbol_wikipedia(self): + + # Test vectors from https://en.wikipedia.org/wiki/Jacobi_symbol + tv = [ + (3, [(1, 1), (2, -1), (3, 0), (4, 1), (5, -1), (6, 0), (7, 1), (8, -1), (9, 0), (10, 1), (11, -1), (12, 0), (13, 1), (14, -1), (15, 0), (16, 1), (17, -1), (18, 0), (19, 1), (20, -1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, -1), (27, 0), (28, 1), (29, -1), (30, 0)]), + (5, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 0), (6, 1), (7, -1), (8, -1), (9, 1), (10, 0), (11, 1), (12, -1), (13, -1), (14, 1), (15, 0), (16, 1), (17, -1), (18, -1), (19, 1), (20, 0), (21, 1), (22, -1), (23, -1), (24, 1), (25, 0), (26, 1), (27, -1), (28, -1), (29, 1), (30, 0)]), + (7, [(1, 1), (2, 1), (3, -1), (4, 1), (5, -1), (6, -1), (7, 0), (8, 1), (9, 1), (10, -1), (11, 1), (12, -1), (13, -1), (14, 0), (15, 1), (16, 1), (17, -1), (18, 1), (19, -1), (20, -1), (21, 0), (22, 1), (23, 1), (24, -1), (25, 1), (26, -1), (27, -1), (28, 0), (29, 1), (30, 1)]), + (9, [(1, 1), (2, 1), (3, 0), (4, 1), (5, 1), (6, 0), (7, 1), (8, 1), (9, 0), (10, 1), (11, 1), (12, 0), (13, 1), (14, 1), (15, 0), (16, 1), (17, 1), (18, 0), (19, 1), (20, 1), (21, 0), (22, 1), (23, 1), (24, 0), (25, 1), (26, 1), (27, 0), (28, 1), (29, 1), (30, 0)]), + (11, [(1, 1), (2, -1), (3, 1), (4, 1), (5, 1), (6, -1), (7, -1), (8, -1), (9, 1), (10, -1), (11, 0), (12, 1), (13, -1), (14, 1), (15, 1), (16, 1), (17, -1), (18, -1), (19, -1), (20, 1), (21, -1), (22, 0), (23, 1), (24, -1), (25, 1), (26, 1), (27, 1), (28, -1), (29, -1), (30, -1)]), + (13, [(1, 1), (2, -1), (3, 1), (4, 1), (5, -1), (6, -1), (7, -1), (8, -1), (9, 1), (10, 1), (11, -1), (12, 1), (13, 0), (14, 1), (15, -1), (16, 1), (17, 1), (18, -1), (19, -1), (20, -1), (21, -1), (22, 1), (23, 1), (24, -1), (25, 1), (26, 0), (27, 1), (28, -1), (29, 1), (30, 1)]), + (15, [(1, 1), (2, 1), (3, 0), (4, 1), (5, 0), (6, 0), (7, -1), (8, 1), (9, 0), (10, 0), (11, -1), (12, 0), (13, -1), (14, -1), (15, 0), (16, 1), (17, 1), (18, 0), (19, 1), (20, 0), (21, 0), (22, -1), (23, 1), (24, 0), (25, 0), (26, -1), (27, 0), (28, -1), (29, -1), (30, 0)]), + (17, [(1, 1), (2, 1), (3, -1), (4, 1), (5, -1), (6, -1), (7, -1), (8, 1), (9, 1), (10, -1), (11, -1), (12, -1), (13, 1), (14, -1), (15, 1), (16, 1), (17, 0), (18, 1), (19, 1), (20, -1), (21, 1), (22, -1), (23, -1), (24, -1), (25, 1), (26, 1), (27, -1), (28, -1), (29, -1), (30, 1)]), + (19, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 1), (6, 1), (7, 1), (8, -1), (9, 1), (10, -1), (11, 1), (12, -1), (13, -1), (14, -1), (15, -1), (16, 1), (17, 1), (18, -1), (19, 0), (20, 1), (21, -1), (22, -1), (23, 1), (24, 1), (25, 1), (26, 1), (27, -1), (28, 1), (29, -1), (30, 1)]), + (21, [(1, 1), (2, -1), (3, 0), (4, 1), (5, 1), (6, 0), (7, 0), (8, -1), (9, 0), (10, -1), (11, -1), (12, 0), (13, -1), (14, 0), (15, 0), (16, 1), (17, 1), (18, 0), (19, -1), (20, 1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, 1), (27, 0), (28, 0), (29, -1), (30, 0)]), + (23, [(1, 1), (2, 1), (3, 1), (4, 1), (5, -1), (6, 1), (7, -1), (8, 1), (9, 1), (10, -1), (11, -1), (12, 1), (13, 1), (14, -1), (15, -1), (16, 1), (17, -1), (18, 1), (19, -1), (20, -1), (21, -1), (22, -1), (23, 0), (24, 1), (25, 1), (26, 1), (27, 1), (28, -1), (29, 1), (30, -1)]), + (25, [(1, 1), (2, 1), (3, 1), (4, 1), (5, 0), (6, 1), (7, 1), (8, 1), (9, 1), (10, 0), (11, 1), (12, 1), (13, 1), (14, 1), (15, 0), (16, 1), (17, 1), (18, 1), (19, 1), (20, 0), (21, 1), (22, 1), (23, 1), (24, 1), (25, 0), (26, 1), (27, 1), (28, 1), (29, 1), (30, 0)]), + (27, [(1, 1), (2, -1), (3, 0), (4, 1), (5, -1), (6, 0), (7, 1), (8, -1), (9, 0), (10, 1), (11, -1), (12, 0), (13, 1), (14, -1), (15, 0), (16, 1), (17, -1), (18, 0), (19, 1), (20, -1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, -1), (27, 0), (28, 1), (29, -1), (30, 0)]), + (29, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 1), (6, 1), (7, 1), (8, -1), (9, 1), (10, -1), (11, -1), (12, -1), (13, 1), (14, -1), (15, -1), (16, 1), (17, -1), (18, -1), (19, -1), (20, 1), (21, -1), (22, 1), (23, 1), (24, 1), (25, 1), (26, -1), (27, -1), (28, 1), (29, 0), (30, 1)]), + ] + + js = self.Integer.jacobi_symbol + + for n, kj in tv: + for k, j in kj: + self.assertEqual(js(k, n), j) + + def test_hex(self): + v1, = self.Integers(0x10) + self.assertEqual(hex(v1), "0x10") + + +class TestIntegerInt(TestIntegerBase): + + def setUp(self): + self.Integer = IntegerNative + + +class testIntegerRandom(unittest.TestCase): + + def test_random_exact_bits(self): + + for _ in range(1000): + a = IntegerNative.random(exact_bits=8) + self.assertFalse(a < 128) + self.assertFalse(a >= 256) + + for bits_value in range(1024, 1024 + 8): + a = IntegerNative.random(exact_bits=bits_value) + self.assertFalse(a < 2**(bits_value - 1)) + self.assertFalse(a >= 2**bits_value) + + def test_random_max_bits(self): + + flag = False + for _ in range(1000): + a = IntegerNative.random(max_bits=8) + flag = flag or a < 128 + self.assertFalse(a>=256) + self.assertTrue(flag) + + for bits_value in range(1024, 1024 + 8): + a = IntegerNative.random(max_bits=bits_value) + self.assertFalse(a >= 2**bits_value) + + def test_random_bits_custom_rng(self): + + class CustomRNG(object): + def __init__(self): + self.counter = 0 + + def __call__(self, size): + self.counter += size + return bchr(0) * size + + custom_rng = CustomRNG() + a = IntegerNative.random(exact_bits=32, randfunc=custom_rng) + self.assertEqual(custom_rng.counter, 4) + + def test_random_range(self): + + func = IntegerNative.random_range + + for x in range(200): + a = func(min_inclusive=1, max_inclusive=15) + self.assertTrue(1 <= a <= 15) + + for x in range(200): + a = func(min_inclusive=1, max_exclusive=15) + self.assertTrue(1 <= a < 15) + + self.assertRaises(ValueError, func, min_inclusive=1, max_inclusive=2, + max_exclusive=3) + self.assertRaises(ValueError, func, max_inclusive=2, max_exclusive=3) + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestIntegerInt) + + try: + from Cryptodome.Math._IntegerGMP import IntegerGMP + + class TestIntegerGMP(TestIntegerBase): + def setUp(self): + self.Integer = IntegerGMP + + tests += list_test_cases(TestIntegerGMP) + except (ImportError, OSError) as e: + if sys.platform == "win32": + sys.stdout.write("Skipping GMP tests on Windows\n") + else: + sys.stdout.write("Skipping GMP tests (%s)\n" % str(e) ) + + try: + from Cryptodome.Math._IntegerCustom import IntegerCustom + + class TestIntegerCustomModexp(TestIntegerBase): + def setUp(self): + self.Integer = IntegerCustom + + tests += list_test_cases(TestIntegerCustomModexp) + except (ImportError, OSError) as e: + sys.stdout.write("Skipping custom modexp tests (%s)\n" % str(e) ) + + tests += list_test_cases(testIntegerRandom) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py new file mode 100644 index 0000000..475d1d4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py @@ -0,0 +1,118 @@ +# +# SelfTest/Math/test_Primality.py: Self-test for Primality module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test for Math.Numbers""" + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import ( + PROBABLY_PRIME, COMPOSITE, + miller_rabin_test, lucas_test, + test_probable_prime, + generate_probable_prime, + generate_probable_safe_prime, + ) + + +class TestPrimality(unittest.TestCase): + + primes = (1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 2**127-1, 175637383534939453397801320455508570374088202376942372758907369518414308188137781042871856139027160010343454418881888953150175357127346872102307696660678617989191485418582475696230580407111841072614783095326672517315988762029036079794994990250662362650625650262324085116467511357592728695033227611029693067539) + composites = (0, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 7*23, (2**19-1)*(2**67-1), 9746347772161,) + + def test_miller_rabin(self): + for prime in self.primes: + self.assertEqual(miller_rabin_test(prime, 3), PROBABLY_PRIME) + for composite in self.composites: + self.assertEqual(miller_rabin_test(composite, 3), COMPOSITE) + self.assertRaises(ValueError, miller_rabin_test, -1, 3) + + def test_lucas(self): + for prime in self.primes: + res = lucas_test(prime) + self.assertEqual(res, PROBABLY_PRIME) + for composite in self.composites: + res = lucas_test(composite) + self.assertEqual(res, COMPOSITE) + self.assertRaises(ValueError, lucas_test, -1) + + def test_is_prime(self): + primes = (170141183460469231731687303715884105727, + 19175002942688032928599, + 1363005552434666078217421284621279933627102780881053358473, + 2 ** 521 - 1) + for p in primes: + self.assertEqual(test_probable_prime(p), PROBABLY_PRIME) + + not_primes = ( + 4754868377601046732119933839981363081972014948522510826417784001, + 1334733877147062382486934807105197899496002201113849920496510541601, + 260849323075371835669784094383812120359260783810157225730623388382401, + ) + for np in not_primes: + self.assertEqual(test_probable_prime(np), COMPOSITE) + + from Cryptodome.Util.number import sieve_base + for p in sieve_base[:100]: + res = test_probable_prime(p) + self.assertEqual(res, PROBABLY_PRIME) + + def test_generate_prime_bit_size(self): + p = generate_probable_prime(exact_bits=512) + self.assertEqual(p.size_in_bits(), 512) + + def test_generate_prime_filter(self): + def ending_with_one(number): + return number % 10 == 1 + + for x in range(20): + q = generate_probable_prime(exact_bits=160, + prime_filter=ending_with_one) + self.assertEqual(q % 10, 1) + + def test_generate_safe_prime(self): + p = generate_probable_safe_prime(exact_bits=161) + self.assertEqual(p.size_in_bits(), 161) + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestPrimality) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py new file mode 100644 index 0000000..d63f43c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py @@ -0,0 +1,201 @@ +# +# SelfTest/Math/test_modexp.py: Self-test for module exponentiation +# +# =================================================================== +# +# Copyright (c) 2017, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-test for the custom module exponentiation""" + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, + c_size_t, + c_ulonglong) + +from Cryptodome.Hash import SHAKE128 +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math._IntegerCustom import _raw_montgomery + +from Cryptodome.Random.random import StrongRandom + + +def create_rng(tag): + rng = StrongRandom(SHAKE128.new(data=tag)) + return rng + +class ExceptionModulus(ValueError): + pass + +def monty_pow(base, exp, modulus): + max_len = len(long_to_bytes(max(base, exp, modulus))) + + base_b, exp_b, modulus_b = [ long_to_bytes(x, max_len) for x in + (base, exp, modulus) ] + + out = create_string_buffer(max_len) + error = _raw_montgomery.monty_pow( + out, + base_b, + exp_b, + modulus_b, + c_size_t(max_len), + c_ulonglong(32) + ) + + if error == 17: + raise ExceptionModulus() + if error: + raise ValueError("monty_pow failed with error: %d" % error) + + result = bytes_to_long(get_raw_buffer(out)) + return result + +exponent1 = 0x2ce0af628901460a419a08ef950d498b9fd6f271a1a52ac293b86fe5c60efe8e8ba93fa1ebe1eb3d614d2e7b328cb60a2591440e163441a190ecf101ceec245f600fffdcf3f5b3a17a7baeacb96a424db1d7ec985e8ec998bb479fecfffed6a75f9a90fc97062fd973303bce855ad7b8d8272a94025e8532be9aabd54a183f303538d2a7e621b4131d59e823a4625f39bd7d518d7784f7c3a8f19061da74974ff42fa1c063dec2db97d461e291a7d6e721708a5229de166c1246363372854e27f3f08ae274bc16bfd205b028a4d81386494433d516dfbb35f495acba5e4e1d1843cb3c3129b6642a85fc7244ce5845fac071c7f622e4ee12ac43fabeeaa0cd01 +modulus1 = 0xd66691b20071be4d66d4b71032b37fa007cfabf579fcb91e50bfc2753b3f0ce7be74e216aef7e26d4ae180bc20d7bd3ea88a6cbf6f87380e613c8979b5b043b200a8ff8856a3b12875e36e98a7569f3852d028e967551000b02c19e9fa52e83115b89309aabb1e1cf1e2cb6369d637d46775ce4523ea31f64ad2794cbc365dd8a35e007ed3b57695877fbf102dbeb8b3212491398e494314e93726926e1383f8abb5889bea954eb8c0ca1c62c8e9d83f41888095c5e645ed6d32515fe0c58c1368cad84694e18da43668c6f43e61d7c9bca633ddcda7aef5b79bc396d4a9f48e2a9abe0836cc455e435305357228e93d25aaed46b952defae0f57339bf26f5a9 + + +class TestModExp(unittest.TestCase): + + def test_small(self): + self.assertEqual(1, monty_pow(11,12,19)) + + def test_large_1(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffffff + expected = pow(base, exponent1, modulus1) + result = monty_pow(base, exponent1, modulus1) + self.assertEqual(result, expected) + + def test_zero_exp(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffffff + result = monty_pow(base, 0, modulus1) + self.assertEqual(result, 1) + + def test_zero_base(self): + result = monty_pow(0, exponent1, modulus1) + self.assertEqual(result, 0) + + def test_zero_modulus(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffff + self.assertRaises(ExceptionModulus, monty_pow, base, exponent1, 0) + self.assertRaises(ExceptionModulus, monty_pow, 0, 0, 0) + + def test_larger_exponent(self): + base = modulus1 - 0xFFFFFFF + expected = pow(base, modulus1<<64, modulus1) + result = monty_pow(base, modulus1<<64, modulus1) + self.assertEqual(result, expected) + + def test_even_modulus(self): + base = modulus1 >> 4 + self.assertRaises(ExceptionModulus, monty_pow, base, exponent1, modulus1-1) + + def test_several_lengths(self): + prng = SHAKE128.new().update(b('Test')) + for length in range(1, 100): + modulus2 = Integer.from_bytes(prng.read(length)) | 1 + base = Integer.from_bytes(prng.read(length)) % modulus2 + exponent2 = Integer.from_bytes(prng.read(length)) + + expected = pow(base, exponent2, modulus2) + result = monty_pow(base, exponent2, modulus2) + self.assertEqual(result, expected) + + def test_variable_exponent(self): + prng = create_rng(b('Test variable exponent')) + for i in range(20): + for j in range(7): + modulus = prng.getrandbits(8*30) | 1 + base = prng.getrandbits(8*30) % modulus + exponent = prng.getrandbits(i*8+j) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + exponent ^= (1 << (i*8+j)) - 1 + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_63(self): + prng = create_rng(b('Test 63')) + length = 63 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_64(self): + prng = create_rng(b('Test 64')) + length = 64 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_65(self): + prng = create_rng(b('Test 65')) + length = 65 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestModExp) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py new file mode 100644 index 0000000..18cf8f5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Protocol/__init__.py: Self-tests for Cryptodome.Protocol +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for Cryptodome.Protocol""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Protocol import test_rfc1751; tests += test_rfc1751.get_tests(config=config) + from Cryptodome.SelfTest.Protocol import test_KDF; tests += test_KDF.get_tests(config=config) + + from Cryptodome.SelfTest.Protocol import test_SecretSharing; + tests += test_SecretSharing.get_tests(config=config) + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py new file mode 100644 index 0000000..f2c5b11 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py @@ -0,0 +1,807 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Protocol/test_KDF.py: Self-test for key derivation functions +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import re +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import b, bchr + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof +from Cryptodome.Hash import SHA1, HMAC, SHA256, MD5, SHA224, SHA384, SHA512 +from Cryptodome.Cipher import AES, DES3 + +from Cryptodome.Protocol.KDF import (PBKDF1, PBKDF2, _S2V, HKDF, scrypt, + bcrypt, bcrypt_check, + SP800_108_Counter) + +from Cryptodome.Protocol.KDF import _bcrypt_decode + + +def t2b(t): + if t is None: + return None + t2 = t.replace(" ", "").replace("\n", "") + return unhexlify(b(t2)) + + +class TestVector(object): + pass + + +class PBKDF1_Tests(unittest.TestCase): + + # List of tuples with test data. + # Each tuple is made up by: + # Item #0: a pass phrase + # Item #1: salt (8 bytes encoded in hex) + # Item #2: output key length + # Item #3: iterations to use + # Item #4: expected result (encoded in hex) + _testData = ( + # From http://www.di-mgt.com.au/cryptoKDFs.html#examplespbkdf + ("password", "78578E5A5D63CB06", 16, 1000, "DC19847E05C64D2FAF10EBFB4A3D2A20"), + ) + + def test1(self): + v = self._testData[0] + res = PBKDF1(v[0], t2b(v[1]), v[2], v[3], SHA1) + self.assertEqual(res, t2b(v[4])) + + +class PBKDF2_Tests(unittest.TestCase): + + # List of tuples with test data. + # Each tuple is made up by: + # Item #0: a pass phrase + # Item #1: salt (encoded in hex) + # Item #2: output key length + # Item #3: iterations to use + # Item #4: hash module + # Item #5: expected result (encoded in hex) + _testData = ( + # From http://www.di-mgt.com.au/cryptoKDFs.html#examplespbkdf + ("password","78578E5A5D63CB06",24,2048, SHA1, "BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643"), + # From RFC 6050 + ("password","73616c74", 20, 1, SHA1, "0c60c80f961f0e71f3a9b524af6012062fe037a6"), + ("password","73616c74", 20, 2, SHA1, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"), + ("password","73616c74", 20, 4096, SHA1, "4b007901b765489abead49d926f721d065a429c1"), + ("passwordPASSWORDpassword","73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74", + 25, 4096, SHA1, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"), + ( 'pass\x00word',"7361006c74",16,4096, SHA1, "56fa6aa75548099dcc37d7f03425e0c3"), + # From draft-josefsson-scrypt-kdf-01, Chapter 10 + ( 'passwd', '73616c74', 64, 1, SHA256, "55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783"), + ( 'Password', '4e61436c', 64, 80000, SHA256, "4ddcd8f60b98be21830cee5ef22701f9641a4418d04c0414aeff08876b34ab56a1d425a1225833549adb841b51c9b3176a272bdebba1d078478f62b397f33c8d"), + ) + + def test1(self): + # Test only for HMAC-SHA1 as PRF + + def prf_SHA1(p,s): + return HMAC.new(p,s,SHA1).digest() + + def prf_SHA256(p,s): + return HMAC.new(p,s,SHA256).digest() + + for i in range(len(self._testData)): + v = self._testData[i] + password = v[0] + salt = t2b(v[1]) + out_len = v[2] + iters = v[3] + hash_mod = v[4] + expected = t2b(v[5]) + + if hash_mod is SHA1: + res = PBKDF2(password, salt, out_len, iters) + self.assertEqual(res, expected) + + res = PBKDF2(password, salt, out_len, iters, prf_SHA1) + self.assertEqual(res, expected) + else: + res = PBKDF2(password, salt, out_len, iters, prf_SHA256) + self.assertEqual(res, expected) + + def test2(self): + # Verify that prf and hmac_hash_module are mutual exclusive + def prf_SHA1(p,s): + return HMAC.new(p,s,SHA1).digest() + + self.assertRaises(ValueError, PBKDF2, b("xxx"), b("yyy"), 16, 100, + prf=prf_SHA1, hmac_hash_module=SHA1) + + def test3(self): + # Verify that hmac_hash_module works like prf + + password = b("xxx") + salt = b("yyy") + + for hashmod in (MD5, SHA1, SHA224, SHA256, SHA384, SHA512): + + pr1 = PBKDF2(password, salt, 16, 100, + prf=lambda p, s: HMAC.new(p,s,hashmod).digest()) + pr2 = PBKDF2(password, salt, 16, 100, hmac_hash_module=hashmod) + + self.assertEqual(pr1, pr2) + + def test4(self): + # Verify that PBKDF2 can take bytes or strings as password or salt + k1 = PBKDF2("xxx", b("yyy"), 16, 10) + k2 = PBKDF2(b("xxx"), b("yyy"), 16, 10) + self.assertEqual(k1, k2) + + k1 = PBKDF2(b("xxx"), "yyy", 16, 10) + k2 = PBKDF2(b("xxx"), b("yyy"), 16, 10) + self.assertEqual(k1, k2) + + +class S2V_Tests(unittest.TestCase): + + # Sequence of test vectors. + # Each test vector is made up by: + # Item #0: a tuple of strings + # Item #1: an AES key + # Item #2: the result + # Item #3: the cipher module S2V is based on + # Everything is hex encoded + _testData = [ + + # RFC5297, A.1 + ( + ( '101112131415161718191a1b1c1d1e1f2021222324252627', + '112233445566778899aabbccddee' ), + 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0', + '85632d07c6e8f37f950acd320a2ecc93', + AES + ), + + # RFC5297, A.2 + ( + ( '00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddcc'+ + 'bbaa99887766554433221100', + '102030405060708090a0', + '09f911029d74e35bd84156c5635688c0', + '7468697320697320736f6d6520706c61'+ + '696e7465787420746f20656e63727970'+ + '74207573696e67205349562d414553'), + '7f7e7d7c7b7a79787776757473727170', + '7bdb6e3b432667eb06f4d14bff2fbd0f', + AES + ), + + ] + + def test1(self): + """Verify correctness of test vector""" + for tv in self._testData: + s2v = _S2V.new(t2b(tv[1]), tv[3]) + for s in tv[0]: + s2v.update(t2b(s)) + result = s2v.derive() + self.assertEqual(result, t2b(tv[2])) + + def test2(self): + """Verify that no more than 127(AES) and 63(TDES) + components are accepted.""" + key = bchr(0) * 8 + bchr(255) * 8 + for module in (AES, DES3): + s2v = _S2V.new(key, module) + max_comps = module.block_size*8-1 + for i in range(max_comps): + s2v.update(b("XX")) + self.assertRaises(TypeError, s2v.update, b("YY")) + + +class HKDF_Tests(unittest.TestCase): + + # Test vectors from RFC5869, Appendix A + # Each tuple is made up by: + # Item #0: hash module + # Item #1: secret + # Item #2: salt + # Item #3: context + # Item #4: expected result + _test_vector = ( + ( + SHA256, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "000102030405060708090a0b0c", + "f0f1f2f3f4f5f6f7f8f9", + 42, + "3cb25f25faacd57a90434f64d0362f2a" + + "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" + + "34007208d5b887185865" + ), + ( + SHA256, + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f", + "606162636465666768696a6b6c6d6e6f" + + "707172737475767778797a7b7c7d7e7f" + + "808182838485868788898a8b8c8d8e8f" + + "909192939495969798999a9b9c9d9e9f" + + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + 82, + "b11e398dc80327a1c8e7f78c596a4934" + + "4f012eda2d4efad8a050cc4c19afa97c" + + "59045a99cac7827271cb41c65e590e09" + + "da3275600c2f09b8367793a9aca3db71" + + "cc30c58179ec3e87c14c01d5c1f3434f" + + "1d87" + ), + ( + SHA256, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + None, + None, + 42, + "8da4e775a563c18f715f802a063c5a31" + + "b8a11f5c5ee1879ec3454e5f3c738d2d" + + "9d201395faa4b61a96c8" + ), + ( + SHA1, + "0b0b0b0b0b0b0b0b0b0b0b", + "000102030405060708090a0b0c", + "f0f1f2f3f4f5f6f7f8f9", + 42, + "085a01ea1b10f36933068b56efa5ad81" + + "a4f14b822f5b091568a9cdd4f155fda2" + + "c22e422478d305f3f896" + ), + ( + SHA1, + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f", + "606162636465666768696a6b6c6d6e6f" + + "707172737475767778797a7b7c7d7e7f" + + "808182838485868788898a8b8c8d8e8f" + + "909192939495969798999a9b9c9d9e9f" + + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + 82, + "0bd770a74d1160f7c9f12cd5912a06eb" + + "ff6adcae899d92191fe4305673ba2ffe" + + "8fa3f1a4e5ad79f3f334b3b202b2173c" + + "486ea37ce3d397ed034c7f9dfeb15c5e" + + "927336d0441f4c4300e2cff0d0900b52" + + "d3b4" + ), + ( + SHA1, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "", + "", + 42, + "0ac1af7002b3d761d1e55298da9d0506" + + "b9ae52057220a306e07b6b87e8df21d0" + + "ea00033de03984d34918" + ), + ( + SHA1, + "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c", + None, + "", + 42, + "2c91117204d745f3500d636a62f64f0a" + + "b3bae548aa53d423b0d1f27ebba6f5e5" + + "673a081d70cce7acfc48" + ) + ) + + def test1(self): + for tv in self._test_vector: + secret, salt, info, exp = [ t2b(tv[x]) for x in (1,2,3,5) ] + key_len, hashmod = [ tv[x] for x in (4,0) ] + + output = HKDF(secret, key_len, salt, hashmod, 1, info) + self.assertEqual(output, exp) + + def test2(self): + ref = HKDF(b("XXXXXX"), 12, b("YYYY"), SHA1) + + # Same output, but this time split over 2 keys + key1, key2 = HKDF(b("XXXXXX"), 6, b("YYYY"), SHA1, 2) + self.assertEqual((ref[:6], ref[6:]), (key1, key2)) + + # Same output, but this time split over 3 keys + key1, key2, key3 = HKDF(b("XXXXXX"), 4, b("YYYY"), SHA1, 3) + self.assertEqual((ref[:4], ref[4:8], ref[8:]), (key1, key2, key3)) + + +class scrypt_Tests(unittest.TestCase): + + # Test vectors taken from + # https://tools.ietf.org/html/rfc7914 + # - password + # - salt + # - N + # - r + # - p + data = ( + ( + "", + "", + 16, # 2K + 1, + 1, + """ + 77 d6 57 62 38 65 7b 20 3b 19 ca 42 c1 8a 04 97 + f1 6b 48 44 e3 07 4a e8 df df fa 3f ed e2 14 42 + fc d0 06 9d ed 09 48 f8 32 6a 75 3a 0f c8 1f 17 + e8 d3 e0 fb 2e 0d 36 28 cf 35 e2 0c 38 d1 89 06 + """ + ), + ( + "password", + "NaCl", + 1024, # 1M + 8, + 16, + """ + fd ba be 1c 9d 34 72 00 78 56 e7 19 0d 01 e9 fe + 7c 6a d7 cb c8 23 78 30 e7 73 76 63 4b 37 31 62 + 2e af 30 d9 2e 22 a3 88 6f f1 09 27 9d 98 30 da + c7 27 af b9 4a 83 ee 6d 83 60 cb df a2 cc 06 40 + """ + ), + ( + "pleaseletmein", + "SodiumChloride", + 16384, # 16M + 8, + 1, + """ + 70 23 bd cb 3a fd 73 48 46 1c 06 cd 81 fd 38 eb + fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54 5d a1 f2 + d5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9 + e6 1e 85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87 + """ + ), + ( + "pleaseletmein", + "SodiumChloride", + 1048576, # 1G + 8, + 1, + """ + 21 01 cb 9b 6a 51 1a ae ad db be 09 cf 70 f8 81 + ec 56 8d 57 4a 2f fd 4d ab e5 ee 98 20 ad aa 47 + 8e 56 fd 8f 4b a5 d0 9f fa 1c 6d 92 7c 40 f4 c3 + 37 30 40 49 e8 a9 52 fb cb f4 5c 6f a7 7a 41 a4 + """ + ), + ) + + def setUp(self): + new_test_vectors = [] + for tv in self.data: + new_tv = TestVector() + new_tv.P = b(tv[0]) + new_tv.S = b(tv[1]) + new_tv.N = tv[2] + new_tv.r = tv[3] + new_tv.p = tv[4] + new_tv.output = t2b(tv[5]) + new_tv.dkLen = len(new_tv.output) + new_test_vectors.append(new_tv) + self.data = new_test_vectors + + def test2(self): + + for tv in self.data: + try: + output = scrypt(tv.P, tv.S, tv.dkLen, tv.N, tv.r, tv.p) + except ValueError as e: + if " 2 " in str(e) and tv.N >= 1048576: + import warnings + warnings.warn("Not enough memory to unit test scrypt() with N=1048576", RuntimeWarning) + continue + else: + raise e + self.assertEqual(output, tv.output) + + def test3(self): + ref = scrypt(b("password"), b("salt"), 12, 16, 1, 1) + + # Same output, but this time split over 2 keys + key1, key2 = scrypt(b("password"), b("salt"), 6, 16, 1, 1, 2) + self.assertEqual((ref[:6], ref[6:]), (key1, key2)) + + # Same output, but this time split over 3 keys + key1, key2, key3 = scrypt(b("password"), b("salt"), 4, 16, 1, 1, 3) + self.assertEqual((ref[:4], ref[4:8], ref[8:]), (key1, key2, key3)) + + +class bcrypt_Tests(unittest.TestCase): + + def test_negative_cases(self): + self.assertRaises(ValueError, bcrypt, b"1" * 73, 10) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 3) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 32) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"") + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"1") + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"1" * 17) + self.assertRaises(ValueError, bcrypt, b"1\x00" * 10, 4) + + def test_bytearray_mismatch(self): + ref = bcrypt("pwd", 4) + bcrypt_check("pwd", ref) + bref = bytearray(ref) + bcrypt_check("pwd", bref) + + wrong = ref[:-1] + bchr(bref[-1] ^ 0x01) + self.assertRaises(ValueError, bcrypt_check, "pwd", wrong) + + wrong = b"x" + ref[1:] + self.assertRaises(ValueError, bcrypt_check, "pwd", wrong) + + # https://github.com/patrickfav/bcrypt/wiki/Published-Test-Vectors + + def test_empty_password(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"", 4, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$04$zVHmKQtGGQob.b/Nc7l9NO8UlrYcW05FiuCj/SxsFO/ZtiN9.mNzy"), + (b"", 5, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$05$zVHmKQtGGQob.b/Nc7l9NOWES.1hkVBgy5IWImh9DOjKNU8atY4Iy"), + (b"", 6, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$06$zVHmKQtGGQob.b/Nc7l9NOjOl7l4oz3WSh5fJ6414Uw8IXRAUoiaO"), + (b"", 7, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$07$zVHmKQtGGQob.b/Nc7l9NOBsj1dQpBA1HYNGpIETIByoNX9jc.hOi"), + (b"", 8, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$08$zVHmKQtGGQob.b/Nc7l9NOiLTUh/9MDpX86/DLyEzyiFjqjBFePgO"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_random_password_and_salt_short_pw(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"<.S.2K(Zq'", 4, b"VYAclAMpaXY/oqAo9yUpku", b"$2a$04$VYAclAMpaXY/oqAo9yUpkuWmoYywaPzyhu56HxXpVltnBIfmO9tgu"), + (b"5.rApO%5jA", 5, b"kVNDrnYKvbNr5AIcxNzeIu", b"$2a$05$kVNDrnYKvbNr5AIcxNzeIuRcyIF5cZk6UrwHGxENbxP5dVv.WQM/G"), + (b"oW++kSrQW^", 6, b"QLKkRMH9Am6irtPeSKN5sO", b"$2a$06$QLKkRMH9Am6irtPeSKN5sObJGr3j47cO6Pdf5JZ0AsJXuze0IbsNm"), + (b"ggJ\\KbTnDG", 7, b"4H896R09bzjhapgCPS/LYu", b"$2a$07$4H896R09bzjhapgCPS/LYuMzAQluVgR5iu/ALF8L8Aln6lzzYXwbq"), + (b"49b0:;VkH/", 8, b"hfvO2retKrSrx5f2RXikWe", b"$2a$08$hfvO2retKrSrx5f2RXikWeFWdtSesPlbj08t/uXxCeZoHRWDz/xFe"), + (b">9N^5jc##'", 9, b"XZLvl7rMB3EvM0c1.JHivu", b"$2a$09$XZLvl7rMB3EvM0c1.JHivuIDPJWeNJPTVrpjZIEVRYYB/mF6cYgJK"), + (b"\\$ch)s4WXp", 10, b"aIjpMOLK5qiS9zjhcHR5TO", b"$2a$10$aIjpMOLK5qiS9zjhcHR5TOU7v2NFDmcsBmSFDt5EHOgp/jeTF3O/q"), + (b"RYoj\\_>2P7", 12, b"esIAHiQAJNNBrsr5V13l7.", b"$2a$12$esIAHiQAJNNBrsr5V13l7.RFWWJI2BZFtQlkFyiWXjou05GyuREZa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_random_password_and_salt_long_pw(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"^Q&\"]A`%/A(BVGt>QaX0M-#<Q148&f", 4, b"vrRP5vQxyD4LrqiLd/oWRO", b"$2a$04$vrRP5vQxyD4LrqiLd/oWROgrrGINsw3gb4Ga5x2sn01jNmiLVECl6"), + (b"nZa!rRf\\U;OL;R?>1ghq_+\":Y0CRmY", 5, b"YuQvhokOGVnevctykUYpKu", b"$2a$05$YuQvhokOGVnevctykUYpKutZD2pWeGGYn3auyLOasguMY3/0BbIyq"), + (b"F%uN/j>[GuB7-jB'_Yj!Tnb7Y!u^6)", 6, b"5L3vpQ0tG9O7k5gQ8nAHAe", b"$2a$06$5L3vpQ0tG9O7k5gQ8nAHAe9xxQiOcOLh8LGcI0PLWhIznsDt.S.C6"), + (b"Z>BobP32ub\"Cfe*Q<<WUq3rc=[GJr-", 7, b"hp8IdLueqE6qFh1zYycUZ.", b"$2a$07$hp8IdLueqE6qFh1zYycUZ.twmUH8eSTPQAEpdNXKMlwms9XfKqfea"), + (b"Ik&8N['7*[1aCc1lOm8\\jWeD*H$eZM", 8, b"2ANDTYCB9m7vf0Prh7rSru", b"$2a$08$2ANDTYCB9m7vf0Prh7rSrupqpO3jJOkIz2oW/QHB4lCmK7qMytGV6"), + (b"O)=%3[E$*q+>-q-=tRSjOBh8\\mLNW.", 9, b"nArqOfdCsD9kIbVnAixnwe", b"$2a$09$nArqOfdCsD9kIbVnAixnwe6s8QvyPYWtQBpEXKir2OJF9/oNBsEFe"), + (b"/MH51`!BP&0tj3%YCA;Xk%e3S`o\\EI", 10, b"ePiAc.s.yoBi3B6p1iQUCe", b"$2a$10$ePiAc.s.yoBi3B6p1iQUCezn3mraLwpVJ5XGelVyYFKyp5FZn/y.u"), + (b"ptAP\"mcg6oH.\";c0U2_oll.OKi<!ku", 12, b"aroG/pwwPj1tU5fl9a9pkO", b"$2a$12$aroG/pwwPj1tU5fl9a9pkO4rydAmkXRj/LqfHZOSnR6LGAZ.z.jwa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_same_password_and_random_salt(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"Q/A:k3DP;X@=<0\"hg&9c", 4, b"wbgDTvLMtyjQlNK7fjqwyO", b"$2a$04$wbgDTvLMtyjQlNK7fjqwyOakBoACQuYh11.VsKNarF4xUIOBWgD6S"), + (b"Q/A:k3DP;X@=<0\"hg&9c", 5, b"zbAaOmloOhxiKItjznRqru", b"$2a$05$zbAaOmloOhxiKItjznRqrunRqHlu3MAa7pMGv26Rr3WwyfGcwoRm6"), + (b"Q/A:k3DP;X@=<0\"hg&9c", 6, b"aOK0bWUvLI0qLkc3ti5jyu", b"$2a$06$aOK0bWUvLI0qLkc3ti5jyuAIQoqRzuqoK09kQqQ6Ou/YKDhW50/qa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_same_password_and_salt_increasing_cost_factor(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"o<&+X'F4AQ8H,LU,N`&r", 4, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$04$BK5u.QHk1Driey7bvnFTH.3smGwxd91PtoK2GxH5nZ7pcBsYX4lMq"), + (b"o<&+X'F4AQ8H,LU,N`&r", 5, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$05$BK5u.QHk1Driey7bvnFTH.t5P.jZvFBMzDB1IY4PwkkRPOyVbEtFG"), + (b"o<&+X'F4AQ8H,LU,N`&r", 6, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$06$BK5u.QHk1Driey7bvnFTH.6Ea1Z5db2p25CPXZbxb/3OyKQagg3pa"), + (b"o<&+X'F4AQ8H,LU,N`&r", 7, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$07$BK5u.QHk1Driey7bvnFTH.sruuQi8Lhv/0LWKDvNp3AGFk7ltdkm6"), + (b"o<&+X'F4AQ8H,LU,N`&r", 8, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$08$BK5u.QHk1Driey7bvnFTH.IE7KsaUzc4m7gzAMlyUPUeiYyACWe0q"), + (b"o<&+X'F4AQ8H,LU,N`&r", 9, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$09$BK5u.QHk1Driey7bvnFTH.1v4Xj1dwkp44QNg0cVAoQt4FQMMrvnS"), + (b"o<&+X'F4AQ8H,LU,N`&r", 10, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$10$BK5u.QHk1Driey7bvnFTH.ESINe9YntUMcVgFDfkC.Vbhc9vMhNX2"), + (b"o<&+X'F4AQ8H,LU,N`&r", 12, b"BK5u.QHk1Driey7bvnFTH.", b"$2a$12$BK5u.QHk1Driey7bvnFTH.QM1/nnGe/f5cTzb6XTTi/vMzcAnycqG"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_long_passwords(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"g*3Q45=\"8NNgpT&mbMJ$Omfr.#ZeW?FP=CE$#roHd?97uL0F-]`?u73c\"\\[.\"*)qU34@VG", + 4, b"T2XJ5MOWvHQZRijl8LIKkO", b"$2a$04$T2XJ5MOWvHQZRijl8LIKkOQKIyX75KBfuLsuRYOJz5OjwBNF2lM8a"), + (b"\\M+*8;&QE=Ll[>5?Ui\"^ai#iQH7ZFtNMfs3AROnIncE9\"BNNoEgO[[*Yk8;RQ(#S,;I+aT", + 5, b"wgkOlGNXIVE2fWkT3gyRoO", b"$2a$05$wgkOlGNXIVE2fWkT3gyRoOqWi4gbi1Wv2Q2Jx3xVs3apl1w.Wtj8C"), + (b"M.E1=dt<.L0Q&p;94NfGm_Oo23+Kpl@M5?WIAL.[@/:'S)W96G8N^AWb7_smmC]>7#fGoB", + 6, b"W9zTCl35nEvUukhhFzkKMe", b"$2a$06$W9zTCl35nEvUukhhFzkKMekjT9/pj7M0lihRVEZrX3m8/SBNZRX7i"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_increasing_password_length(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"a", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.l4WvgHIVg17ZawDIrDM2IjlE64GDNQS"), + (b"aa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.AyUxBk.ThHlsLvRTH7IqcG7yVHJ3SXq"), + (b"aaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.BxOVac5xPB6XFdRc/ZrzM9FgZkqmvbW"), + (b"aaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.Qbr209bpCtfl5hN7UQlG/L4xiD3AKau"), + (b"aaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.oWszihPjDZI0ypReKsaDOW1jBl7oOii"), + (b"aaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ./k.Xxn9YiqtV/sxh3EHbnOHd0Qsq27K"), + (b"aaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.PYJqRFQbgRbIjMd5VNKmdKS4sBVOyDe"), + (b"aaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ..VMYfzaw1wP/SGxowpLeGf13fxCCt.q"), + (b"aaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.5B0p054nO5WgAD1n04XslDY/bqY9RJi"), + (b"aaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.INBTgqm7sdlBJDg.J5mLMSRK25ri04y"), + (b"aaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.s3y7CdFD0OR5p6rsZw/eZ.Dla40KLfm"), + (b"aaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.Jx742Djra6Q7PqJWnTAS.85c28g.Siq"), + (b"aaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.oKMXW3EZcPHcUV0ib5vDBnh9HojXnLu"), + (b"aaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.w6nIjWpDPNSH5pZUvLjC1q25ONEQpeS"), + (b"aaaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.k1b2/r9A/hxdwKEKurg6OCn4MwMdiGq"), + (b"aaaaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.3prCNHVX1Ws.7Hm2bJxFUnQOX9f7DFa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_non_ascii_characters(self): + # password, cost, salt, bcrypt hash + tvs = [ + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 4, b"D3qS2aoTVyqM7z8v8crLm.", b"$2a$04$D3qS2aoTVyqM7z8v8crLm.3nKt4CzBZJbyFB.ZebmfCvRw7BGs.Xm"), + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 5, b"VA1FujiOCMPkUHQ8kF7IaO", b"$2a$05$VA1FujiOCMPkUHQ8kF7IaOg7NGaNvpxwWzSluQutxEVmbZItRTsAa"), + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 6, b"TXiaNrPeBSz5ugiQlehRt.", b"$2a$06$TXiaNrPeBSz5ugiQlehRt.gwpeDQnXWteQL4z2FulouBr6G7D9KUi"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 4, b"YTn1Qlvps8e1odqMn6G5x.", b"$2a$04$YTn1Qlvps8e1odqMn6G5x.85pqKql6w773EZJAExk7/BatYAI4tyO"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 5, b"C.8k5vJKD2NtfrRI9o17DO", b"$2a$05$C.8k5vJKD2NtfrRI9o17DOfIW0XnwItA529vJnh2jzYTb1QdoY0py"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 6, b"xqfRPj3RYAgwurrhcA6uRO", b"$2a$06$xqfRPj3RYAgwurrhcA6uROtGlXDp/U6/gkoDYHwlubtcVcNft5.vW"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 4, b"y8vGgMmr9EdyxP9rmMKjH.", b"$2a$04$y8vGgMmr9EdyxP9rmMKjH.wv2y3r7yRD79gykQtmb3N3zrwjKsyay"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 5, b"iYH4XIKAOOm/xPQs7xKP1u", b"$2a$05$iYH4XIKAOOm/xPQs7xKP1upD0cWyMn3Jf0ZWiizXbEkVpS41K1dcO"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 6, b"wCOob.D0VV8twafNDB2ape", b"$2a$06$wCOob.D0VV8twafNDB2apegiGD5nqF6Y1e6K95q6Y.R8C4QGd265q"), + ("ΔημοσιεÏθηκεστηνΕφημεÏίδατης", 4, b"E5SQtS6P4568MDXW7cyUp.", b"$2a$04$E5SQtS6P4568MDXW7cyUp.18wfDisKZBxifnPZjAI1d/KTYMfHPYO"), + ("ÐБбВвГгДдЕеÐёЖжЗзИиЙйКкЛлМмÐ", 4, b"03e26gQFHhQwRNf81/ww9.", b"$2a$04$03e26gQFHhQwRNf81/ww9.p1UbrNwxpzWjLuT.zpTLH4t/w5WhAhC"), + ("нОоПпРрСÑТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭÑЮю", 4, b"PHNoJwpXCfe32nUtLv2Upu", b"$2a$04$PHNoJwpXCfe32nUtLv2UpuhJXOzd4k7IdFwnEpYwfJVCZ/f/.8Pje"), + ("電电電島岛島兔兔兎龜龟亀國国国å€åŒºåŒº", 4, b"wU4/0i1TmNl2u.1jIwBX.u", b"$2a$04$wU4/0i1TmNl2u.1jIwBX.uZUaOL3Rc5ID7nlQRloQh6q5wwhV/zLW"), + ("诶比伊艾弗豆è´å°”ç»´å¾è‰¾å°ºå¼€è‰¾ä¸ç»´è´¼å¾·", 4, b"P4kreGLhCd26d4WIy7DJXu", b"$2a$04$P4kreGLhCd26d4WIy7DJXusPkhxLvBouzV6OXkL5EB0jux0osjsry"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_special_case_salt(self): + # password, cost, salt, bcrypt hash + tvs = [ + ("-O_=*N!2JP", 4, b"......................", b"$2a$04$......................JjuKLOX9OOwo5PceZZXSkaLDvdmgb82"), + ("7B[$Q<4b>U", 5, b"......................", b"$2a$05$......................DRiedDQZRL3xq5A5FL8y7/6NM8a2Y5W"), + (">d5-I_8^.h", 6, b"......................", b"$2a$06$......................5Mq1Ng8jgDY.uHNU4h5p/x6BedzNH2W"), + (")V`/UM/]1t", 4, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$04$.OC/.OC/.OC/.OC/.OC/.OQIvKRDAam.Hm5/IaV/.hc7P8gwwIbmi"), + (":@t2.bWuH]", 5, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$05$.OC/.OC/.OC/.OC/.OC/.ONDbUvdOchUiKmQORX6BlkPofa/QxW9e"), + ("b(#KljF5s\"", 6, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$06$.OC/.OC/.OC/.OC/.OC/.OHfTd9e7svOu34vi1PCvOcAEq07ST7.K"), + ("@3YaJ^Xs]*", 4, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$04$eGA.eGA.eGA.eGA.eGA.e.stcmvh.R70m.0jbfSFVxlONdj1iws0C"), + ("'\"5\\!k*C(p", 5, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$05$eGA.eGA.eGA.eGA.eGA.e.vR37mVSbfdHwu.F0sNMvgn8oruQRghy"), + ("edEu7C?$'W", 6, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$06$eGA.eGA.eGA.eGA.eGA.e.tSq0FN8MWHQXJXNFnHTPQKtA.n2a..G"), + ("N7dHmg\\PI^", 4, b"999999999999999999999u", b"$2a$04$999999999999999999999uCZfA/pLrlyngNDMq89r1uUk.bQ9icOu"), + ("\"eJuHh!)7*", 5, b"999999999999999999999u", b"$2a$05$999999999999999999999uj8Pfx.ufrJFAoWFLjapYBS5vVEQQ/hK"), + ("ZeDRJ:_tu:", 6, b"999999999999999999999u", b"$2a$06$999999999999999999999u6RB0P9UmbdbQgjoQFEJsrvrKe.BoU6q"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + +class TestVectorsHKDFWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def add_tests(self, filename): + + def filter_algo(root): + algo_name = root['algorithm'] + if algo_name == "HKDF-SHA-1": + return SHA1 + elif algo_name == "HKDF-SHA-256": + return SHA256 + elif algo_name == "HKDF-SHA-384": + return SHA384 + elif algo_name == "HKDF-SHA-512": + return SHA512 + else: + raise ValueError("Unknown algorithm " + algo_name) + + def filter_size(unit): + return int(unit['size']) + + result = load_test_vectors_wycheproof(("Protocol", "wycheproof"), + filename, + "Wycheproof HMAC (%s)" % filename, + root_tag={'hash_module': filter_algo}, + unit_tag={'size': filter_size}) + return result + + def setUp(self): + self.tv = [] + self.add_tests("hkdf_sha1_test.json") + self.add_tests("hkdf_sha256_test.json") + self.add_tests("hkdf_sha384_test.json") + self.add_tests("hkdf_sha512_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof HKDF Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + + try: + key = HKDF(tv.ikm, tv.size, tv.salt, tv.hash_module, 1, tv.info) + except ValueError: + assert not tv.valid + else: + if key != tv.okm: + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class SP800_180_Counter_Tests(unittest.TestCase): + + def test_negative_zeroes(self): + def prf(s, x): + return HMAC.new(s, x, SHA256).digest() + + self.assertRaises(ValueError, SP800_108_Counter, b'0' * 16, 1, prf, + label=b'A\x00B') + self.assertRaises(ValueError, SP800_108_Counter, b'0' * 16, 1, prf, + context=b'A\x00B') + + def test_multiple_keys(self): + def prf(s, x): + return HMAC.new(s, x, SHA256).digest() + + key = b'0' * 16 + expected = SP800_108_Counter(key, 2*3*23, prf) + for r in (1, 2, 3, 23): + dks = SP800_108_Counter(key, r, prf, 138//r) + self.assertEqual(len(dks), 138//r) + self.assertEqual(len(dks[0]), r) + self.assertEqual(b''.join(dks), expected) + + +def add_tests_sp800_108_counter(cls): + + test_vectors_sp800_108_counter = load_test_vectors(("Protocol", ), + "KDF_SP800_108_COUNTER.txt", + "NIST SP 800 108 KDF Counter Mode", + {'count': lambda x: int(x)}, + ) or [] + + mac_type = None + for idx, tv in enumerate(test_vectors_sp800_108_counter): + + if isinstance(tv, str): + res = re.match(r"\[HMAC-(SHA-[0-9]+)\]", tv) + if res: + hash_name = res.group(1).replace("-", "") + hash_module = load_hash_by_name(hash_name) + mac_type = "hmac" + continue + res = re.match(r"\[CMAC-AES-128\]", tv) + if res: + mac_type = "cmac" + continue + assert res + + if mac_type == "hmac": + def prf(s, x, hash_module=hash_module): + return HMAC.new(s, x, hash_module).digest() + elif mac_type == "cmac": + def prf(s, x, hash_module=hash_module): + return CMAC.new(s, x, AES).digest() + continue + + def kdf_test(self, prf=prf, kin=tv.kin, label=tv.label, + context=tv.context, kout=tv.kout, count=tv.count): + result = SP800_108_Counter(kin, len(kout), prf, 1, label, context) + assert(len(result) == len(kout)) + self.assertEqual(result, kout) + + setattr(cls, "test_kdf_sp800_108_counter_%d" % idx, kdf_test) + + +add_tests_sp800_108_counter(SP800_180_Counter_Tests) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + if not config.get('slow_tests'): + PBKDF2_Tests._testData = PBKDF2_Tests._testData[:3] + scrypt_Tests.data = scrypt_Tests.data[:3] + + tests = [] + tests += list_test_cases(PBKDF1_Tests) + tests += list_test_cases(PBKDF2_Tests) + tests += list_test_cases(S2V_Tests) + tests += list_test_cases(HKDF_Tests) + tests += [TestVectorsHKDFWycheproof(wycheproof_warnings)] + tests += list_test_cases(scrypt_Tests) + tests += list_test_cases(bcrypt_Tests) + tests += list_test_cases(SP800_180_Counter_Tests) + + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py new file mode 100644 index 0000000..57d97df --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py @@ -0,0 +1,267 @@ +# +# SelfTest/Protocol/test_secret_sharing.py: Self-test for secret sharing protocols +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from unittest import main, TestCase, TestSuite +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Protocol.SecretSharing import Shamir, _Element, \ + _mult_gf2, _div_gf2 + +class GF2_Tests(TestCase): + + def test_mult_gf2(self): + # Prove mult by zero + x = _mult_gf2(0,0) + self.assertEqual(x, 0) + + # Prove mult by unity + x = _mult_gf2(34, 1) + self.assertEqual(x, 34) + + z = 3 # (x+1) + y = _mult_gf2(z, z) + self.assertEqual(y, 5) # (x+1)^2 = x^2 + 1 + y = _mult_gf2(y, z) + self.assertEqual(y, 15) # (x+1)^3 = x^3 + x^2 + x + 1 + y = _mult_gf2(y, z) + self.assertEqual(y, 17) # (x+1)^4 = x^4 + 1 + + # Prove linearity works + comps = [1, 4, 128, 2**34] + sum_comps = 1+4+128+2**34 + y = 908 + z = _mult_gf2(sum_comps, y) + w = 0 + for x in comps: + w ^= _mult_gf2(x, y) + self.assertEqual(w, z) + + def test_div_gf2(self): + from Cryptodome.Util.number import size as deg + + x, y = _div_gf2(567, 7) + self.assertTrue(deg(y) < deg(7)) + + w = _mult_gf2(x, 7) ^ y + self.assertEqual(567, w) + + x, y = _div_gf2(7, 567) + self.assertEqual(x, 0) + self.assertEqual(y, 7) + +class Element_Tests(TestCase): + + def test1(self): + # Test encondings + e = _Element(256) + self.assertEqual(int(e), 256) + self.assertEqual(e.encode(), bchr(0)*14 + b("\x01\x00")) + + e = _Element(bchr(0)*14 + b("\x01\x10")) + self.assertEqual(int(e), 0x110) + self.assertEqual(e.encode(), bchr(0)*14 + b("\x01\x10")) + + # Only 16 byte string are a valid encoding + self.assertRaises(ValueError, _Element, bchr(0)) + + def test2(self): + # Test addition + e = _Element(0x10) + f = _Element(0x0A) + self.assertEqual(int(e+f), 0x1A) + + def test3(self): + # Test multiplication + zero = _Element(0) + one = _Element(1) + two = _Element(2) + + x = _Element(6) * zero + self.assertEqual(int(x), 0) + + x = _Element(6) * one + self.assertEqual(int(x), 6) + + x = _Element(2**127) * two + self.assertEqual(int(x), 1 + 2 + 4 + 128) + + def test4(self): + # Test inversion + one = _Element(1) + + x = one.inverse() + self.assertEqual(int(x), 1) + + x = _Element(82323923) + y = x.inverse() + self.assertEqual(int(x * y), 1) + +class Shamir_Tests(TestCase): + + def test1(self): + # Test splitting + shares = Shamir.split(2, 3, bchr(90)*16) + self.assertEqual(len(shares), 3) + for index in range(3): + self.assertEqual(shares[index][0], index+1) + self.assertEqual(len(shares[index][1]), 16) + + def test2(self): + # Test recombine + from itertools import permutations + + test_vectors = ( + (2, "d9fe73909bae28b3757854c0af7ad405", + "1-594ae8964294174d95c33756d2504170", + "2-d897459d29da574eb40e93ec552ffe6e", + "3-5823de9bf0e068b054b5f07a28056b1b", + "4-db2c1f8bff46d748f795da995bd080cb"), + (2, "bf4f902d9a7efafd1f3ffd9291fd5de9", + "1-557bd3b0748064b533469722d1cc7935", + "2-6b2717164783c66d47cd28f2119f14d0", + "3-8113548ba97d58256bb4424251ae300c", + "4-179e9e5a218483ddaeda57539139cf04"), + (3, "ec96aa5c14c9faa699354cf1da74e904", + "1-64579fbf1908d66f7239bf6e2b4e41e1", + "2-6cd9428df8017b52322561e8c672ae3e", + "3-e418776ef5c0579bd9299277374806dd", + "4-ab3f77a0107398d23b323e581bb43f5d", + "5-23fe42431db2b41bd03ecdc7ea8e97ac"), + (3, "44cf249b68b80fcdc27b47be60c2c145", + "1-d6515a3905cd755119b86e311c801e31", + "2-16693d9ac9f10c254036ced5f8917fa3", + "3-84f74338a48476b99bf5e75a84d3a0d1", + "4-3fe8878dc4a5d35811cf3cbcd33dbe52", + "5-ad76f92fa9d0a9c4ca0c1533af7f6132"), + (5, "5398717c982db935d968eebe53a47f5a", + "1-be7be2dd4c068e7ef576aaa1b1c11b01", + "2-f821f5848441cb98b3eb467e2733ee21", + "3-25ee52f53e203f6e29a0297b5ab486b5", + "4-fc9fb58ef74dab947fbf9acd9d5d83cd", + "5-b1949cce46d81552e65f248d3f74cc5c", + "6-d64797f59977c4d4a7956ad916da7699", + "7-ab608a6546a8b9af8820ff832b1135c7"), + (5, "4a78db90fbf35da5545d2fb728e87596", + "1-08daf9a25d8aa184cfbf02b30a0ed6a0", + "2-dda28261e36f0b14168c2cf153fb734e", + "3-e9fdec5505d674a57f9836c417c1ecaa", + "4-4dce5636ae06dee42d2c82e65f06c735", + "5-3963dc118afc2ba798fa1d452b28ef00", + "6-6dfe6ff5b09e94d2f84c382b12f42424", + "7-6faea9d4d4a4e201bf6c90b9000630c3"), + (10, "eccbf6d66d680b49b073c4f1ddf804aa", + "01-7d8ac32fe4ae209ead1f3220fda34466", + "02-f9144e76988aad647d2e61353a6e96d5", + "03-b14c3b80179203363922d60760271c98", + "04-770bb2a8c28f6cee89e00f4d5cc7f861", + "05-6e3d7073ea368334ef67467871c66799", + "06-248792bc74a98ce024477c13c8fb5f8d", + "07-fcea4640d2db820c0604851e293d2487", + "08-2776c36fb714bb1f8525a0be36fc7dba", + "09-6ee7ac8be773e473a4bf75ee5f065762", + "10-33657fc073354cf91d4a68c735aacfc8", + "11-7645c65094a5868bf225c516fdee2d0c", + "12-840485aacb8226631ecd9c70e3018086"), + (10, "377e63bdbb5f7d4dc58a483d035212bb", + "01-32c53260103be431c843b1a633afe3bd", + "02-0107eb16cb8695084d452d2cc50bc7d6", + "03-df1e5c66cd755287fb0446faccd72a06", + "04-361bbcd5d40797f49dfa1898652da197", + "05-160d3ad1512f7dec7fd9344aed318591", + "06-659af6d95df4f25beca4fb9bfee3b7e8", + "07-37f3b208977bad50b3724566b72bfa9d", + "08-6c1de2dfc69c2986142c26a8248eb316", + "09-5e19220837a396bd4bc8cd685ff314c3", + "10-86e7b864fb0f3d628e46d50c1ba92f1c", + "11-065d0082c80b1aea18f4abe0c49df72e", + "12-84a09430c1d20ea9f388f3123c3733a3"), + ) + + def get_share(p): + pos = p.find('-') + return int(p[:pos]), unhexlify(p[pos + 1:]) + + for tv in test_vectors: + k = tv[0] + secret = unhexlify(tv[1]) + max_perms = 10 + for perm, shares_idx in enumerate(permutations(range(2, len(tv)), k)): + if perm > max_perms: + break + shares = [ get_share(tv[x]) for x in shares_idx ] + result = Shamir.combine(shares, True) + self.assertEqual(secret, result) + + def test3(self): + # Loopback split/recombine + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret) + + secret2 = Shamir.combine(shares[:2]) + self.assertEqual(secret, secret2) + + secret3 = Shamir.combine([ shares[0], shares[2] ]) + self.assertEqual(secret, secret3) + + def test4(self): + # Loopback split/recombine (SSSS) + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret, ssss=True) + + secret2 = Shamir.combine(shares[:2], ssss=True) + self.assertEqual(secret, secret2) + + def test5(self): + # Detect duplicate shares + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret) + self.assertRaises(ValueError, Shamir.combine, (shares[0], shares[0])) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(GF2_Tests) + tests += list_test_cases(Element_Tests) + tests += list_test_cases(Shamir_Tests) + return tests + +if __name__ == '__main__': + suite = lambda: TestSuite(get_tests()) + main(defaultTest='suite') + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py new file mode 100644 index 0000000..a79769c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py @@ -0,0 +1,62 @@ +# +# Test script for Cryptodome.Util.RFC1751. +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew Kuchling and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +__revision__ = "$Id$" + +import binascii +import unittest +from Cryptodome.Util import RFC1751 +from Cryptodome.Util.py3compat import * + +test_data = [('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'), + ('CCAC2AED591056BE4F90FD441C534766', + 'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'), + ('EFF81F9BFBC65350920CDD7416DE8009', + 'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL') + ] + +class RFC1751Test_k2e (unittest.TestCase): + + def runTest (self): + "Check converting keys to English" + for key, words in test_data: + key=binascii.a2b_hex(b(key)) + self.assertEqual(RFC1751.key_to_english(key), words) + +class RFC1751Test_e2k (unittest.TestCase): + + def runTest (self): + "Check converting English strings to keys" + for key, words in test_data: + key=binascii.a2b_hex(b(key)) + self.assertEqual(RFC1751.english_to_key(words), key) + +# class RFC1751Test + +def get_tests(config={}): + return [RFC1751Test_k2e(), RFC1751Test_e2k()] + +if __name__ == "__main__": + unittest.main() diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py new file mode 100644 index 0000000..7cdd320 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/__init__.py: Self-test for public key crypto +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for public-key crypto""" + +import unittest +from Cryptodome.SelfTest.PublicKey import (test_DSA, test_RSA, + test_ECC_NIST, test_ECC_25519, test_ECC_448, + test_import_DSA, test_import_RSA, + test_import_ECC, test_ElGamal) + + +def get_tests(config={}): + tests = [] + tests += test_DSA.get_tests(config=config) + tests += test_RSA.get_tests(config=config) + tests += test_ECC_NIST.get_tests(config=config) + tests += test_ECC_25519.get_tests(config=config) + tests += test_ECC_448.get_tests(config=config) + + tests += test_import_DSA.get_tests(config=config) + tests += test_import_RSA.get_tests(config=config) + tests += test_import_ECC.get_tests(config=config) + + tests += test_ElGamal.get_tests(config=config) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py new file mode 100644 index 0000000..160d882 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_DSA.py: Self-test for the DSA primitive +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.DSA""" + +import os +from Cryptodome.Util.py3compat import * + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex + +def _sws(s): + """Remove whitespace from a text or byte string""" + if isinstance(s,str): + return "".join(s.split()) + else: + return b("").join(s.split()) + +class DSATest(unittest.TestCase): + # Test vector from "Appendix 5. Example of the DSA" of + # "Digital Signature Standard (DSS)", + # U.S. Department of Commerce/National Institute of Standards and Technology + # FIPS 186-2 (+Change Notice), 2000 January 27. + # http://csrc.nist.gov/publications/fips/fips186-2/fips186-2-change1.pdf + + y = _sws("""19131871 d75b1612 a819f29d 78d1b0d7 346f7aa7 7bb62a85 + 9bfd6c56 75da9d21 2d3a36ef 1672ef66 0b8c7c25 5cc0ec74 + 858fba33 f44c0669 9630a76b 030ee333""") + + g = _sws("""626d0278 39ea0a13 413163a5 5b4cb500 299d5522 956cefcb + 3bff10f3 99ce2c2e 71cb9de5 fa24babf 58e5b795 21925c9c + c42e9f6f 464b088c c572af53 e6d78802""") + + p = _sws("""8df2a494 492276aa 3d25759b b06869cb eac0d83a fb8d0cf7 + cbb8324f 0d7882e5 d0762fc5 b7210eaf c2e9adac 32ab7aac + 49693dfb f83724c2 ec0736ee 31c80291""") + + q = _sws("""c773218c 737ec8ee 993b4f2d ed30f48e dace915f""") + + x = _sws("""2070b322 3dba372f de1c0ffc 7b2e3b49 8b260614""") + + k = _sws("""358dad57 1462710f 50e254cf 1a376b2b deaadfbf""") + k_inverse = _sws("""0d516729 8202e49b 4116ac10 4fc3f415 ae52f917""") + m = b2a_hex(b("abc")) + m_hash = _sws("""a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d""") + r = _sws("""8bac1ab6 6410435c b7181f95 b16ab97c 92b341c0""") + s = _sws("""41e2345f 1f56df24 58f426d1 55b4ba2d b6dcd8c8""") + + def setUp(self): + global DSA, Random, bytes_to_long, size + from Cryptodome.PublicKey import DSA + from Cryptodome import Random + from Cryptodome.Util.number import bytes_to_long, inverse, size + + self.dsa = DSA + + def test_generate_1arg(self): + """DSA (default implementation) generated key (1 argument)""" + dsaObj = self.dsa.generate(1024) + self._check_private_key(dsaObj) + pub = dsaObj.public_key() + self._check_public_key(pub) + + def test_generate_2arg(self): + """DSA (default implementation) generated key (2 arguments)""" + dsaObj = self.dsa.generate(1024, Random.new().read) + self._check_private_key(dsaObj) + pub = dsaObj.public_key() + self._check_public_key(pub) + + def test_construct_4tuple(self): + """DSA (default implementation) constructed key (4-tuple)""" + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + dsaObj = self.dsa.construct((y, g, p, q)) + self._test_verification(dsaObj) + + def test_construct_5tuple(self): + """DSA (default implementation) constructed key (5-tuple)""" + (y, g, p, q, x) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q, self.x)] + dsaObj = self.dsa.construct((y, g, p, q, x)) + self._test_signing(dsaObj) + self._test_verification(dsaObj) + + def test_construct_bad_key4(self): + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + tup = (y, g, p+1, q) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, g, p, q+1) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, 1, p, q) + self.assertRaises(ValueError, self.dsa.construct, tup) + + def test_construct_bad_key5(self): + (y, g, p, q, x) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q, self.x)] + tup = (y, g, p, q, x+1) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, g, p, q, q+10) + self.assertRaises(ValueError, self.dsa.construct, tup) + + def _check_private_key(self, dsaObj): + # Check capabilities + self.assertEqual(1, dsaObj.has_private()) + self.assertEqual(1, dsaObj.can_sign()) + self.assertEqual(0, dsaObj.can_encrypt()) + + # Sanity check key data + self.assertEqual(1, dsaObj.p > dsaObj.q) # p > q + self.assertEqual(160, size(dsaObj.q)) # size(q) == 160 bits + self.assertEqual(0, (dsaObj.p - 1) % dsaObj.q) # q is a divisor of p-1 + self.assertEqual(dsaObj.y, pow(dsaObj.g, dsaObj.x, dsaObj.p)) # y == g**x mod p + self.assertEqual(1, 0 < dsaObj.x < dsaObj.q) # 0 < x < q + + def _check_public_key(self, dsaObj): + k = bytes_to_long(a2b_hex(self.k)) + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + + # Check capabilities + self.assertEqual(0, dsaObj.has_private()) + self.assertEqual(1, dsaObj.can_sign()) + self.assertEqual(0, dsaObj.can_encrypt()) + + # Check that private parameters are all missing + self.assertEqual(0, hasattr(dsaObj, 'x')) + + # Sanity check key data + self.assertEqual(1, dsaObj.p > dsaObj.q) # p > q + self.assertEqual(160, size(dsaObj.q)) # size(q) == 160 bits + self.assertEqual(0, (dsaObj.p - 1) % dsaObj.q) # q is a divisor of p-1 + + # Public-only key objects should raise an error when .sign() is called + self.assertRaises(TypeError, dsaObj._sign, m_hash, k) + + # Check __eq__ and __ne__ + self.assertEqual(dsaObj.public_key() == dsaObj.public_key(),True) # assert_ + self.assertEqual(dsaObj.public_key() != dsaObj.public_key(),False) # assertFalse + + self.assertEqual(dsaObj.public_key(), dsaObj.publickey()) + + def _test_signing(self, dsaObj): + k = bytes_to_long(a2b_hex(self.k)) + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + r = bytes_to_long(a2b_hex(self.r)) + s = bytes_to_long(a2b_hex(self.s)) + (r_out, s_out) = dsaObj._sign(m_hash, k) + self.assertEqual((r, s), (r_out, s_out)) + + def _test_verification(self, dsaObj): + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + r = bytes_to_long(a2b_hex(self.r)) + s = bytes_to_long(a2b_hex(self.s)) + self.assertTrue(dsaObj._verify(m_hash, (r, s))) + self.assertFalse(dsaObj._verify(m_hash + 1, (r, s))) + + def test_repr(self): + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + dsaObj = self.dsa.construct((y, g, p, q)) + repr(dsaObj) + + +class DSADomainTest(unittest.TestCase): + + def test_domain1(self): + """Verify we can generate new keys in a given domain""" + dsa_key_1 = DSA.generate(1024) + domain_params = dsa_key_1.domain() + + dsa_key_2 = DSA.generate(1024, domain=domain_params) + self.assertEqual(dsa_key_1.p, dsa_key_2.p) + self.assertEqual(dsa_key_1.q, dsa_key_2.q) + self.assertEqual(dsa_key_1.g, dsa_key_2.g) + + self.assertEqual(dsa_key_1.domain(), dsa_key_2.domain()) + + def _get_weak_domain(self): + + from Cryptodome.Math.Numbers import Integer + from Cryptodome.Math import Primality + + p = Integer(4) + while p.size_in_bits() != 1024 or Primality.test_probable_prime(p) != Primality.PROBABLY_PRIME: + q1 = Integer.random(exact_bits=80) + q2 = Integer.random(exact_bits=80) + q = q1 * q2 + z = Integer.random(exact_bits=1024-160) + p = z * q + 1 + + h = Integer(2) + g = 1 + while g == 1: + g = pow(h, z, p) + h += 1 + + return (p, q, g) + + + def test_generate_error_weak_domain(self): + """Verify that domain parameters with composite q are rejected""" + + domain_params = self._get_weak_domain() + self.assertRaises(ValueError, DSA.generate, 1024, domain=domain_params) + + + def test_construct_error_weak_domain(self): + """Verify that domain parameters with composite q are rejected""" + + from Cryptodome.Math.Numbers import Integer + + p, q, g = self._get_weak_domain() + y = pow(g, 89, p) + self.assertRaises(ValueError, DSA.construct, (y, g, p, q)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(DSATest) + tests += list_test_cases(DSADomainTest) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py new file mode 100644 index 0000000..1362e58 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py @@ -0,0 +1,333 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHAKE128 + + +class TestEccPoint_Ed25519(unittest.TestCase): + + Gxy = {"x": 15112221349535400772501151409588531511454012693041857206046113283949847762202, + "y": 46316835694926478169428394003475163141307993866256225615783033603165251855960} + + G2xy = {"x": 24727413235106541002554574571675588834622768167397638456726423682521233608206, + "y": 15549675580280190176352668710449542251549572066445060580507079593062643049417} + + G3xy = {"x": 46896733464454938657123544595386787789046198280132665686241321779790909858396, + "y": 8324843778533443976490377120369201138301417226297555316741202210403726505172} + + pointG = EccPoint(Gxy['x'], Gxy['y'], curve="Ed25519") + pointG2 = EccPoint(G2xy['x'], G2xy['y'], curve="Ed25519") + pointG3 = EccPoint(G3xy['x'], G3xy['y'], curve="Ed25519") + + def test_init_xy(self): + EccPoint(self.Gxy['x'], self.Gxy['y'], curve="Ed25519") + + # Neutral point + pai = EccPoint(0, 1, curve="Ed25519") + self.assertEqual(pai.x, 0) + self.assertEqual(pai.y, 1) + self.assertEqual(pai.xy, (0, 1)) + + # G + bp = self.pointG.copy() + self.assertEqual(bp.x, 15112221349535400772501151409588531511454012693041857206046113283949847762202) + self.assertEqual(bp.y, 46316835694926478169428394003475163141307993866256225615783033603165251855960) + self.assertEqual(bp.xy, (bp.x, bp.y)) + + # 2G + bp2 = self.pointG2.copy() + self.assertEqual(bp2.x, 24727413235106541002554574571675588834622768167397638456726423682521233608206) + self.assertEqual(bp2.y, 15549675580280190176352668710449542251549572066445060580507079593062643049417) + self.assertEqual(bp2.xy, (bp2.x, bp2.y)) + + # 5G + EccPoint(x=33467004535436536005251147249499675200073690106659565782908757308821616914995, + y=43097193783671926753355113395909008640284023746042808659097434958891230611693, + curve="Ed25519") + + # Catch if point is not on the curve + self.assertRaises(ValueError, EccPoint, 34, 35, curve="Ed25519") + + def test_set(self): + pointW = EccPoint(0, 1, curve="Ed25519") + pointW.set(self.pointG) + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_copy(self): + pointW = self.pointG.copy() + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_equal(self): + pointH = self.pointG.copy() + pointI = self.pointG2.copy() + self.assertEqual(self.pointG, pointH) + self.assertNotEqual(self.pointG, pointI) + + def test_pai(self): + pai = EccPoint(0, 1, curve="Ed25519") + self.assertTrue(pai.is_point_at_infinity()) + self.assertEqual(pai, pai.point_at_infinity()) + + def test_negate(self): + negG = -self.pointG + sum = self.pointG + negG + self.assertTrue(sum.is_point_at_infinity()) + + def test_addition(self): + self.assertEqual(self.pointG + self.pointG2, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG.point_at_infinity(), self.pointG2) + self.assertEqual(self.pointG.point_at_infinity() + self.pointG2, self.pointG2) + + G5 = self.pointG2 + self.pointG3 + self.assertEqual(G5.x, 33467004535436536005251147249499675200073690106659565782908757308821616914995) + self.assertEqual(G5.y, 43097193783671926753355113395909008640284023746042808659097434958891230611693) + + def test_inplace_addition(self): + pointH = self.pointG.copy() + pointH += self.pointG + self.assertEqual(pointH, self.pointG2) + pointH += self.pointG + self.assertEqual(pointH, self.pointG3) + pointH += self.pointG.point_at_infinity() + self.assertEqual(pointH, self.pointG3) + + def test_doubling(self): + pointH = self.pointG.copy() + pointH.double() + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + # 2*0 + pai = self.pointG.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + def test_scalar_multiply(self): + d = 0 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0) + self.assertEqual(pointH.y, 1) + + d = 1 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG.x) + self.assertEqual(pointH.y, self.pointG.y) + + d = 2 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + d = 3 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG3.x) + self.assertEqual(pointH.y, self.pointG3.y) + + d = 4 + pointH = d * self.pointG + self.assertEqual(pointH.x, 14582954232372986451776170844943001818709880559417862259286374126315108956272) + self.assertEqual(pointH.y, 32483318716863467900234833297694612235682047836132991208333042722294373421359) + + d = 5 + pointH = d * self.pointG + self.assertEqual(pointH.x, 33467004535436536005251147249499675200073690106659565782908757308821616914995) + self.assertEqual(pointH.y, 43097193783671926753355113395909008640284023746042808659097434958891230611693) + + d = 10 + pointH = d * self.pointG + self.assertEqual(pointH.x, 43500613248243327786121022071801015118933854441360174117148262713429272820047) + self.assertEqual(pointH.y, 45005105423099817237495816771148012388779685712352441364231470781391834741548) + + d = 20 + pointH = d * self.pointG + self.assertEqual(pointH.x, 46694936775300686710656303283485882876784402425210400817529601134760286812591) + self.assertEqual(pointH.y, 8786390172762935853260670851718824721296437982862763585171334833968259029560) + + d = 255 + pointH = d * self.pointG + self.assertEqual(pointH.x, 36843863416400016952258312492144504209624961884991522125275155377549541182230) + self.assertEqual(pointH.y, 22327030283879720808995671630924669697661065034121040761798775626517750047180) + + d = 256 + pointH = d * self.pointG + self.assertEqual(pointH.x, 42740085206947573681423002599456489563927820004573071834350074001818321593686) + self.assertEqual(pointH.y, 6935684722522267618220753829624209639984359598320562595061366101608187623111) + + def test_sizes(self): + self.assertEqual(self.pointG.size_in_bits(), 255) + self.assertEqual(self.pointG.size_in_bytes(), 32) + + +class TestEccKey_Ed25519(unittest.TestCase): + + def test_private_key(self): + seed = unhexlify("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + Px = 38815646466658113194383306759739515082307681141926459231621296960732224964046 + Py = 11903303657706407974989296177215005343713679411332034699907763981919547054807 + + key = EccKey(curve="Ed25519", seed=seed) + self.assertEqual(key.seed, seed) + self.assertEqual(key.d, 36144925721603087658594284515452164870581325872720374094707712194495455132720) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, Px) + self.assertEqual(key.pointQ.y, Py) + + point = EccPoint(Px, Py, "ed25519") + key = EccKey(curve="Ed25519", seed=seed, point=point) + self.assertEqual(key.d, 36144925721603087658594284515452164870581325872720374094707712194495455132720) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="ed25519", seed=seed) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="ed25519", d=1) + + def test_public_key(self): + point = EccPoint(_curves['ed25519'].Gx, _curves['ed25519'].Gy, curve='ed25519') + key = EccKey(curve="ed25519", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + priv_key = EccKey(curve="ed25519", seed=b'H'*32) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_seed(self): + self.assertRaises(ValueError, lambda: EccKey(curve="ed25519", seed=b'H' * 31)) + + def test_equality(self): + private_key = ECC.construct(seed=b'H'*32, curve="Ed25519") + private_key2 = ECC.construct(seed=b'H'*32, curve="ed25519") + private_key3 = ECC.construct(seed=b'C'*32, curve="Ed25519") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='ed25519') + self.assertIn("curve='Ed25519'", repr(key)) + self.assertEqual(key.curve, 'Ed25519') + self.assertEqual(key.public_key().curve, 'Ed25519') + + +class TestEccModule_Ed25519(unittest.TestCase): + + def test_generate(self): + key = ECC.generate(curve="Ed25519") + self.assertTrue(key.has_private()) + point = EccPoint(_curves['Ed25519'].Gx, _curves['Ed25519'].Gy, curve="Ed25519") * key.d + self.assertEqual(key.pointQ, point) + + # Always random + key2 = ECC.generate(curve="Ed25519") + self.assertNotEqual(key, key2) + + # Other names + ECC.generate(curve="Ed25519") + + # Random source + key1 = ECC.generate(curve="Ed25519", randfunc=SHAKE128.new().read) + key2 = ECC.generate(curve="Ed25519", randfunc=SHAKE128.new().read) + self.assertEqual(key1, key2) + + def test_construct(self): + seed = unhexlify("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + Px = 38815646466658113194383306759739515082307681141926459231621296960732224964046 + Py = 11903303657706407974989296177215005343713679411332034699907763981919547054807 + d = 36144925721603087658594284515452164870581325872720374094707712194495455132720 + point = EccPoint(Px, Py, curve="Ed25519") + + # Private key only + key = ECC.construct(curve="Ed25519", seed=seed) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Public key only + key = ECC.construct(curve="Ed25519", point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertFalse(key.has_private()) + + # Private and public key + key = ECC.construct(curve="Ed25519", seed=seed, point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Other names + key = ECC.construct(curve="ed25519", seed=seed) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['ed25519'].Gx, point_y=_curves['ed25519'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", **coord) + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", d=2, **coordG) + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", seed=b'H'*31) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint_Ed25519) + tests += list_test_cases(TestEccKey_Ed25519) + tests += list_test_cases(TestEccModule_Ed25519) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py new file mode 100644 index 0000000..fbebaea --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py @@ -0,0 +1,333 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHAKE128 + + +class TestEccPoint_Ed448(unittest.TestCase): + + Gxy = {"x": 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e, + "y": 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14} + + G2xy = {"x": 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555, + "y": 0xae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed} + + G3xy = {"x": 0x865886b9108af6455bd64316cb6943332241b8b8cda82c7e2ba077a4a3fcfe8daa9cbf7f6271fd6e862b769465da8575728173286ff2f8f, + "y": 0xe005a8dbd5125cf706cbda7ad43aa6449a4a8d952356c3b9fce43c82ec4e1d58bb3a331bdb6767f0bffa9a68fed02dafb822ac13588ed6fc} + + pointG = EccPoint(Gxy['x'], Gxy['y'], curve="Ed448") + pointG2 = EccPoint(G2xy['x'], G2xy['y'], curve="Ed448") + pointG3 = EccPoint(G3xy['x'], G3xy['y'], curve="Ed448") + + def test_init_xy(self): + EccPoint(self.Gxy['x'], self.Gxy['y'], curve="Ed448") + + # Neutral point + pai = EccPoint(0, 1, curve="Ed448") + self.assertEqual(pai.x, 0) + self.assertEqual(pai.y, 1) + self.assertEqual(pai.xy, (0, 1)) + + # G + bp = self.pointG.copy() + self.assertEqual(bp.x, 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e) + self.assertEqual(bp.y, 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14) + self.assertEqual(bp.xy, (bp.x, bp.y)) + + # 2G + bp2 = self.pointG2.copy() + self.assertEqual(bp2.x, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555) + self.assertEqual(bp2.y, 0xae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed) + self.assertEqual(bp2.xy, (bp2.x, bp2.y)) + + # 5G + EccPoint(x=0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034, + y=0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb, + curve="Ed448") + + # Catch if point is not on the curve + self.assertRaises(ValueError, EccPoint, 34, 35, curve="Ed448") + + def test_set(self): + pointW = EccPoint(0, 1, curve="Ed448") + pointW.set(self.pointG) + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_copy(self): + pointW = self.pointG.copy() + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_equal(self): + pointH = self.pointG.copy() + pointI = self.pointG2.copy() + self.assertEqual(self.pointG, pointH) + self.assertNotEqual(self.pointG, pointI) + + def test_pai(self): + pai = EccPoint(0, 1, curve="Ed448") + self.assertTrue(pai.is_point_at_infinity()) + self.assertEqual(pai, pai.point_at_infinity()) + + def test_negate(self): + negG = -self.pointG + sum = self.pointG + negG + self.assertTrue(sum.is_point_at_infinity()) + + def test_addition(self): + self.assertEqual(self.pointG + self.pointG2, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG.point_at_infinity(), self.pointG2) + self.assertEqual(self.pointG.point_at_infinity() + self.pointG2, self.pointG2) + + G5 = self.pointG2 + self.pointG3 + self.assertEqual(G5.x, 0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034) + self.assertEqual(G5.y, 0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb) + + def test_inplace_addition(self): + pointH = self.pointG.copy() + pointH += self.pointG + self.assertEqual(pointH, self.pointG2) + pointH += self.pointG + self.assertEqual(pointH, self.pointG3) + pointH += self.pointG.point_at_infinity() + self.assertEqual(pointH, self.pointG3) + + def test_doubling(self): + pointH = self.pointG.copy() + pointH.double() + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + # 2*0 + pai = self.pointG.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + def test_scalar_multiply(self): + d = 0 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0) + self.assertEqual(pointH.y, 1) + + d = 1 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG.x) + self.assertEqual(pointH.y, self.pointG.y) + + d = 2 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + d = 3 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG3.x) + self.assertEqual(pointH.y, self.pointG3.y) + + d = 4 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x49dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30) + self.assertEqual(pointH.y, 0xd49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839) + + d = 5 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034) + self.assertEqual(pointH.y, 0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb) + + d = 10 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x77486f9d19f6411cdd35d30d1c3235f71936452c787e5c034134d3e8172278aca61622bc805761ce3dab65118a0122d73b403165d0ed303d) + self.assertEqual(pointH.y, 0x4d2fea0b026be11024f1f0fe7e94e618e8ac17381ada1d1bf7ee293a68ff5d0bf93c1997dc1aabdc0c7e6381428d85b6b1954a89e4cddf67) + + d = 20 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x3c236422354600fe6763defcc1503737e4ed89e262d0de3ec1e552020f2a56fe3b9e1e012d021072598c3c2821e18268bb8fb8339c0d1216) + self.assertEqual(pointH.y, 0xb555b9721f630ccb05fc466de4c74d3d2781e69eca88e1b040844f04cab39fd946f91c688fa42402bb38fb9c3e61231017020b219b4396e1) + + d = 255 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0xbeb7f8388b05cd9c1aa2e3c0dcf31e2b563659361826225390e7748654f627d5c36cbe627e9019936b56d15d4dad7c337c09bac64ff4197f) + self.assertEqual(pointH.y, 0x1e37312b2dd4e9440c43c6e7725fc4fa3d11e582d4863f1d018e28f50c0efdb1f53f9b01ada7c87fa162b1f0d72401015d57613d25f1ad53) + + d = 256 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0xf19c34feb56730e3e2be761ac0a2a2b24853b281dda019fc35a5ab58e3696beb39609ae756b0d20fb7ccf0d79aaf5f3bca2e4fdb25bfac1c) + self.assertEqual(pointH.y, 0x3beb69cc9111bffcaddc61d363ce6fe5dd44da4aadce78f52e92e985d5442344ced72c4611ed0daac9f4f5661eab73d7a12d25ce8a30241e) + + def test_sizes(self): + self.assertEqual(self.pointG.size_in_bits(), 448) + self.assertEqual(self.pointG.size_in_bytes(), 56) + + +class TestEccKey_Ed448(unittest.TestCase): + + def test_private_key(self): + seed = unhexlify("4adf5d37ac6785e83e99a924f92676d366a78690af59c92b6bdf14f9cdbcf26fdad478109607583d633b60078d61d51d81b7509c5433b0d4c9") + Px = 0x72a01eea003a35f9ac44231dc4aae2a382f351d80bf32508175b0855edcf389aa2bbf308dd961ce361a6e7c2091bc78957f6ebcf3002a617 + Py = 0x9e0d08d84586e9aeefecacb41d049b831f1a3ee0c3eada63e34557b30702b50ab59fb372feff7c30b8cbb7dd51afbe88444ec56238722ec1 + + key = EccKey(curve="Ed448", seed=seed) + self.assertEqual(key.seed, seed) + self.assertEqual(key.d, 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, Px) + self.assertEqual(key.pointQ.y, Py) + + point = EccPoint(Px, Py, "ed448") + key = EccKey(curve="Ed448", seed=seed, point=point) + self.assertEqual(key.d, 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="ed448", seed=seed) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="ed448", d=1) + + def test_public_key(self): + point = EccPoint(_curves['ed448'].Gx, _curves['ed448'].Gy, curve='ed448') + key = EccKey(curve="ed448", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + priv_key = EccKey(curve="ed448", seed=b'H'*57) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_seed(self): + self.assertRaises(ValueError, lambda: EccKey(curve="ed448", seed=b'H' * 56)) + + def test_equality(self): + private_key = ECC.construct(seed=b'H'*57, curve="Ed448") + private_key2 = ECC.construct(seed=b'H'*57, curve="ed448") + private_key3 = ECC.construct(seed=b'C'*57, curve="Ed448") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='ed448') + self.assertIn("curve='Ed448'", repr(key)) + self.assertEqual(key.curve, 'Ed448') + self.assertEqual(key.public_key().curve, 'Ed448') + + +class TestEccModule_Ed448(unittest.TestCase): + + def test_generate(self): + key = ECC.generate(curve="Ed448") + self.assertTrue(key.has_private()) + point = EccPoint(_curves['Ed448'].Gx, _curves['Ed448'].Gy, curve="Ed448") * key.d + self.assertEqual(key.pointQ, point) + + # Always random + key2 = ECC.generate(curve="Ed448") + self.assertNotEqual(key, key2) + + # Other names + ECC.generate(curve="Ed448") + + # Random source + key1 = ECC.generate(curve="Ed448", randfunc=SHAKE128.new().read) + key2 = ECC.generate(curve="Ed448", randfunc=SHAKE128.new().read) + self.assertEqual(key1, key2) + + def test_construct(self): + seed = unhexlify("4adf5d37ac6785e83e99a924f92676d366a78690af59c92b6bdf14f9cdbcf26fdad478109607583d633b60078d61d51d81b7509c5433b0d4c9") + Px = 0x72a01eea003a35f9ac44231dc4aae2a382f351d80bf32508175b0855edcf389aa2bbf308dd961ce361a6e7c2091bc78957f6ebcf3002a617 + Py = 0x9e0d08d84586e9aeefecacb41d049b831f1a3ee0c3eada63e34557b30702b50ab59fb372feff7c30b8cbb7dd51afbe88444ec56238722ec1 + d = 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80 + point = EccPoint(Px, Py, curve="Ed448") + + # Private key only + key = ECC.construct(curve="Ed448", seed=seed) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Public key only + key = ECC.construct(curve="Ed448", point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertFalse(key.has_private()) + + # Private and public key + key = ECC.construct(curve="Ed448", seed=seed, point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Other names + key = ECC.construct(curve="ed448", seed=seed) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['ed448'].Gx, point_y=_curves['ed448'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="Ed448", **coord) + self.assertRaises(ValueError, ECC.construct, curve="Ed448", d=2, **coordG) + self.assertRaises(ValueError, ECC.construct, curve="Ed448", seed=b'H'*58) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint_Ed448) + tests += list_test_cases(TestEccKey_Ed448) + tests += list_test_cases(TestEccModule_Ed448) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py new file mode 100644 index 0000000..cadbd12 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py @@ -0,0 +1,1425 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + + +class TestEccPoint(unittest.TestCase): + + def test_mix(self): + + p1 = ECC.generate(curve='P-256').pointQ + p2 = ECC.generate(curve='P-384').pointQ + + try: + p1 + p2 + assert(False) + except ValueError as e: + assert "not on the same curve" in str(e) + + try: + p1 += p2 + assert(False) + except ValueError as e: + assert "not on the same curve" in str(e) + + class OtherKeyType: + pass + + self.assertFalse(p1 == OtherKeyType()) + self.assertTrue(p1 != OtherKeyType()) + + def test_repr(self): + p1 = ECC.construct(curve='P-256', + d=75467964919405407085864614198393977741148485328036093939970922195112333446269, + point_x=20573031766139722500939782666697015100983491952082159880539639074939225934381, + point_y=108863130203210779921520632367477406025152638284581252625277850513266505911389) + self.assertEqual(repr(p1), "EccKey(curve='NIST P-256', point_x=20573031766139722500939782666697015100983491952082159880539639074939225934381, point_y=108863130203210779921520632367477406025152638284581252625277850513266505911389, d=75467964919405407085864614198393977741148485328036093939970922195112333446269)") + + +class TestEccPoint_NIST_P192(unittest.TestCase): + """Tests defined in section 4.1 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xd458e7d127ae671b0c330266d246769353a012073e97acf8, + 0x325930500d851f336bddc050cf7fb11b5673a1645086df3b, + curve='p192') + + pointT = EccPoint( + 0xf22c4395213e9ebe67ddecdd87fdbd01be16fb059b9753a4, + 0x264424096af2b3597796db48f8dfb41fa9cecc97691a9c79, + curve='p192') + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290 + pointRy = 0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4b + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290 + pointRy = 0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4b + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x30c5bc6b8c7da25354b373dc14dd8a0eba42d25a3f6e6962 + pointRy = 0x0dde14bc4249a721c407aedbf011e2ddbbcb2968c9d889cf + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee + pointRx = 0x1faee4205a4f669d2d0a8f25e3bcec9a62a6952965bf6d31 + pointRy = 0x5ff2cdfa508a2581892367087c696f179e7a4d7e8260fb06 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joint_scalar_multiply(self): + d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee + e = 0xc4be3d53ec3089e71e4de8ceab7cce889bc393cd85b972bc + pointRx = 0x019f64eed8fa9b72b7dfea82c17c9bfa60ecb9e1778b5bde + pointRy = 0x16590c5fcd8655fa4ced33fb800e2a7e3c61f35d83503644 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 192) + self.assertEqual(self.pointS.size_in_bytes(), 24) + + +class TestEccPoint_NIST_P224(unittest.TestCase): + """Tests defined in section 4.2 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0x6eca814ba59a930843dc814edd6c97da95518df3c6fdf16e9a10bb5b, + 0xef4b497f0963bc8b6aec0ca0f259b89cd80994147e05dc6b64d7bf22, + curve='p224') + + pointT = EccPoint( + 0xb72b25aea5cb03fb88d7e842002969648e6ef23c5d39ac903826bd6d, + 0xc42a8a4d34984f0b71b5b4091af7dceb33ea729c1a2dc8b434f10c34, + curve='p224') + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x236f26d9e84c2f7d776b107bd478ee0a6d2bcfcaa2162afae8d2fd15 + pointRy = 0xe53cc0a7904ce6c3746f6a97471297a0b7d5cdf8d536ae25bb0fda70 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x236f26d9e84c2f7d776b107bd478ee0a6d2bcfcaa2162afae8d2fd15 + pointRy = 0xe53cc0a7904ce6c3746f6a97471297a0b7d5cdf8d536ae25bb0fda70 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0xa9c96f2117dee0f27ca56850ebb46efad8ee26852f165e29cb5cdfc7 + pointRy = 0xadf18c84cf77ced4d76d4930417d9579207840bf49bfbf5837dfdd7d + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa78ccc30eaca0fcc8e36b2dd6fbb03df06d37f52711e6363aaf1d73b + pointRx = 0x96a7625e92a8d72bff1113abdb95777e736a14c6fdaacc392702bca4 + pointRy = 0x0f8e5702942a3c5e13cd2fd5801915258b43dfadc70d15dbada3ed10 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joing_scalar_multiply(self): + d = 0xa78ccc30eaca0fcc8e36b2dd6fbb03df06d37f52711e6363aaf1d73b + e = 0x54d549ffc08c96592519d73e71e8e0703fc8177fa88aa77a6ed35736 + pointRx = 0xdbfe2958c7b2cda1302a67ea3ffd94c918c5b350ab838d52e288c83e + pointRy = 0x2f521b83ac3b0549ff4895abcc7f0c5a861aacb87acbc5b8147bb18b + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 224) + self.assertEqual(self.pointS.size_in_bytes(), 28) + + +class TestEccPoint_NIST_P256(unittest.TestCase): + """Tests defined in section 4.3 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xde2444bebc8d36e682edd27e0f271508617519b3221a8fa0b77cab3989da97c9, + 0xc093ae7ff36e5380fc01a5aad1e66659702de80f53cec576b6350b243042a256) + + pointT = EccPoint( + 0x55a8b00f8da1d44e62f6b3b25316212e39540dc861c89575bb8cf92e35e0986b, + 0x5421c3209c2d6c704835d82ac4c3dd90f61a8a52598b9e7ab656e9d8c8b24316) + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x7669e6901606ee3ba1a8eef1e0024c33df6c22f3b17481b82a860ffcdb6127b0 + pointRy = 0xfa878162187a54f6c39f6ee0072f33de389ef3eecd03023de10ca2c1db61d0c7 + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + pointRx = 0x51d08d5f2d4278882946d88d83c97d11e62becc3cfc18bedacc89ba34eeca03f + pointRy = 0x75ee68eb8bf626aa5b673ab51f6e744e06f8fcf8a6c0cf3035beca956a7b41d5 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joing_scalar_multiply(self): + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + e = 0xd37f628ece72a462f0145cbefe3f0b355ee8332d37acdd83a358016aea029db7 + pointRx = 0xd867b4679221009234939221b8046245efcf58413daacbeff857b8588341f6b8 + pointRy = 0xf2504055c03cede12d22720dad69c745106b6607ec7e50dd35d54bd80f615275 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 256) + self.assertEqual(self.pointS.size_in_bytes(), 32) + + +class TestEccPoint_NIST_P384(unittest.TestCase): + """Tests defined in section 4.4 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xfba203b81bbd23f2b3be971cc23997e1ae4d89e69cb6f92385dda82768ada415ebab4167459da98e62b1332d1e73cb0e, + 0x5ffedbaefdeba603e7923e06cdb5d0c65b22301429293376d5c6944e3fa6259f162b4788de6987fd59aed5e4b5285e45, + "p384") + + pointT = EccPoint( + 0xaacc05202e7fda6fc73d82f0a66220527da8117ee8f8330ead7d20ee6f255f582d8bd38c5a7f2b40bcdb68ba13d81051, + 0x84009a263fefba7c2c57cffa5db3634d286131afc0fca8d25afa22a7b5dce0d9470da89233cee178592f49b6fecb5092, + "p384") + + def test_set(self): + pointW = EccPoint(0, 0, "p384") + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x12dc5ce7acdfc5844d939f40b4df012e68f865b89c3213ba97090a247a2fc009075cf471cd2e85c489979b65ee0b5eed + pointRy = 0x167312e58fe0c0afa248f2854e3cddcb557f983b3189b67f21eee01341e7e9fe67f6ee81b36988efa406945c8804a4b0 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def _test_inplace_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x2a2111b1e0aa8b2fc5a1975516bc4d58017ff96b25e1bdff3c229d5fac3bacc319dcbec29f9478f42dee597b4641504c + pointRy = 0xfa2e3d9dc84db8954ce8085ef28d7184fddfd1344b4d4797343af9b5f9d837520b450f726443e4114bd4e5bdb2f65ddd + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa4ebcae5a665983493ab3e626085a24c104311a761b5a8fdac052ed1f111a5c44f76f45659d2d111a61b5fdd97583480 + pointRx = 0xe4f77e7ffeb7f0958910e3a680d677a477191df166160ff7ef6bb5261f791aa7b45e3e653d151b95dad3d93ca0290ef2 + pointRy = 0xac7dee41d8c5f4a7d5836960a773cfc1376289d3373f8cf7417b0c6207ac32e913856612fc9ff2e357eb2ee05cf9667f + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + def test_joing_scalar_multiply(self): + d = 0xa4ebcae5a665983493ab3e626085a24c104311a761b5a8fdac052ed1f111a5c44f76f45659d2d111a61b5fdd97583480 + e = 0xafcf88119a3a76c87acbd6008e1349b29f4ba9aa0e12ce89bcfcae2180b38d81ab8cf15095301a182afbc6893e75385d + pointRx = 0x917ea28bcd641741ae5d18c2f1bd917ba68d34f0f0577387dc81260462aea60e2417b8bdc5d954fc729d211db23a02dc + pointRy = 0x1a29f7ce6d074654d77b40888c73e92546c8f16a5ff6bcbd307f758d4aee684beff26f6742f597e2585c86da908f7186 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 384) + self.assertEqual(self.pointS.size_in_bytes(), 48) + + +class TestEccPoint_NIST_P521(unittest.TestCase): + """Tests defined in section 4.5 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0x000001d5c693f66c08ed03ad0f031f937443458f601fd098d3d0227b4bf62873af50740b0bb84aa157fc847bcf8dc16a8b2b8bfd8e2d0a7d39af04b089930ef6dad5c1b4, + 0x00000144b7770963c63a39248865ff36b074151eac33549b224af5c8664c54012b818ed037b2b7c1a63ac89ebaa11e07db89fcee5b556e49764ee3fa66ea7ae61ac01823, + "p521") + + pointT = EccPoint( + 0x000000f411f2ac2eb971a267b80297ba67c322dba4bb21cec8b70073bf88fc1ca5fde3ba09e5df6d39acb2c0762c03d7bc224a3e197feaf760d6324006fe3be9a548c7d5, + 0x000001fdf842769c707c93c630df6d02eff399a06f1b36fb9684f0b373ed064889629abb92b1ae328fdb45534268384943f0e9222afe03259b32274d35d1b9584c65e305, + "p521") + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x000001264ae115ba9cbc2ee56e6f0059e24b52c8046321602c59a339cfb757c89a59c358a9a8e1f86d384b3f3b255ea3f73670c6dc9f45d46b6a196dc37bbe0f6b2dd9e9 + pointRy = 0x00000062a9c72b8f9f88a271690bfa017a6466c31b9cadc2fc544744aeb817072349cfddc5ad0e81b03f1897bd9c8c6efbdf68237dc3bb00445979fb373b20c9a967ac55 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x000001264ae115ba9cbc2ee56e6f0059e24b52c8046321602c59a339cfb757c89a59c358a9a8e1f86d384b3f3b255ea3f73670c6dc9f45d46b6a196dc37bbe0f6b2dd9e9 + pointRy = 0x00000062a9c72b8f9f88a271690bfa017a6466c31b9cadc2fc544744aeb817072349cfddc5ad0e81b03f1897bd9c8c6efbdf68237dc3bb00445979fb373b20c9a967ac55 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x0000012879442f2450c119e7119a5f738be1f1eba9e9d7c6cf41b325d9ce6d643106e9d61124a91a96bcf201305a9dee55fa79136dc700831e54c3ca4ff2646bd3c36bc6 + pointRy = 0x0000019864a8b8855c2479cbefe375ae553e2393271ed36fadfc4494fc0583f6bd03598896f39854abeae5f9a6515a021e2c0eef139e71de610143f53382f4104dccb543 + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0x000001eb7f81785c9629f136a7e8f8c674957109735554111a2a866fa5a166699419bfa9936c78b62653964df0d6da940a695c7294d41b2d6600de6dfcf0edcfc89fdcb1 + pointRx = 0x00000091b15d09d0ca0353f8f96b93cdb13497b0a4bb582ae9ebefa35eee61bf7b7d041b8ec34c6c00c0c0671c4ae063318fb75be87af4fe859608c95f0ab4774f8c95bb + pointRy = 0x00000130f8f8b5e1abb4dd94f6baaf654a2d5810411e77b7423965e0c7fd79ec1ae563c207bd255ee9828eb7a03fed565240d2cc80ddd2cecbb2eb50f0951f75ad87977f + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + def test_joing_scalar_multiply(self): + d = 0x000001eb7f81785c9629f136a7e8f8c674957109735554111a2a866fa5a166699419bfa9936c78b62653964df0d6da940a695c7294d41b2d6600de6dfcf0edcfc89fdcb1 + e = 0x00000137e6b73d38f153c3a7575615812608f2bab3229c92e21c0d1c83cfad9261dbb17bb77a63682000031b9122c2f0cdab2af72314be95254de4291a8f85f7c70412e3 + pointRx = 0x0000009d3802642b3bea152beb9e05fba247790f7fc168072d363340133402f2585588dc1385d40ebcb8552f8db02b23d687cae46185b27528adb1bf9729716e4eba653d + pointRy = 0x0000000fe44344e79da6f49d87c1063744e5957d9ac0a505bafa8281c9ce9ff25ad53f8da084a2deb0923e46501de5797850c61b229023dd9cf7fc7f04cd35ebb026d89d + + pointR = self.pointS * d + pointR += self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 521) + self.assertEqual(self.pointS.size_in_bytes(), 66) + + +class TestEccPoint_PAI_P192(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p192'] + pointG = EccPoint(curve.Gx, curve.Gy, "p192") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P192.txt", + "P-192 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P192, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P224(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p224'] + pointG = EccPoint(curve.Gx, curve.Gy, "p224") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P224.txt", + "P-224 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P224, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P256(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p256'] + pointG = EccPoint(curve.Gx, curve.Gy, "p256") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P256.txt", + "P-256 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P256, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P384(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p384'] + pointG = EccPoint(curve.Gx, curve.Gy, "p384") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P384.txt", + "P-384 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P384, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P521(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p521'] + pointG = EccPoint(curve.Gx, curve.Gy, "p521") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P521.txt", + "P-521 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P521, "test_%d" % tv.count, new_test) + + +class TestEccKey_P192(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-192", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p192'].Gx) + self.assertEqual(key.pointQ.y, _curves['p192'].Gy) + + point = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, curve='P-192') + key = EccKey(curve="P-192", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp192r1", d=1) + key = EccKey(curve="prime192v1", d=1) + + def test_public_key(self): + + point = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, curve='P-192') + key = EccKey(curve="P-192", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-192", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-193", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-192", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-192", + d=_curves['p192'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-192") + private_key2 = ECC.construct(d=3, curve="P-192") + private_key3 = ECC.construct(d=4, curve="P-192") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p192') + self.assertIn("curve='NIST P-192'", repr(key)) + self.assertEqual(key.curve, 'NIST P-192') + self.assertEqual(key.public_key().curve, 'NIST P-192') + + +class TestEccKey_P224(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-224", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p224'].Gx) + self.assertEqual(key.pointQ.y, _curves['p224'].Gy) + + point = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, curve='P-224') + key = EccKey(curve="P-224", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp224r1", d=1) + key = EccKey(curve="prime224v1", d=1) + + def test_public_key(self): + + point = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, curve='P-224') + key = EccKey(curve="P-224", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-224", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-225", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-224", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-224", + d=_curves['p224'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-224") + private_key2 = ECC.construct(d=3, curve="P-224") + private_key3 = ECC.construct(d=4, curve="P-224") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p224') + self.assertIn("curve='NIST P-224'", repr(key)) + self.assertEqual(key.curve, 'NIST P-224') + self.assertEqual(key.public_key().curve, 'NIST P-224') + + +class TestEccKey_P256(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-256", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p256'].Gx) + self.assertEqual(key.pointQ.y, _curves['p256'].Gy) + + point = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy) + key = EccKey(curve="P-256", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp256r1", d=1) + key = EccKey(curve="prime256v1", d=1) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="p256", seed=b'H'*32) + + def test_public_key(self): + + point = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy) + key = EccKey(curve="P-256", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-256", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-257", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-256", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-256", d=_curves['p256'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-256") + private_key2 = ECC.construct(d=3, curve="P-256") + private_key3 = ECC.construct(d=4, curve="P-256") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p256') + self.assertIn("curve='NIST P-256'", repr(key)) + self.assertEqual(key.curve, 'NIST P-256') + self.assertEqual(key.public_key().curve, 'NIST P-256') + + +class TestEccKey_P384(unittest.TestCase): + + def test_private_key(self): + + p384 = _curves['p384'] + + key = EccKey(curve="P-384", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, p384.Gx) + self.assertEqual(key.pointQ.y, p384.Gy) + + point = EccPoint(p384.Gx, p384.Gy, "p384") + key = EccKey(curve="P-384", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="p384", d=1) + key = EccKey(curve="secp384r1", d=1) + key = EccKey(curve="prime384v1", d=1) + + def test_public_key(self): + + p384 = _curves['p384'] + point = EccPoint(p384.Gx, p384.Gy, 'p384') + key = EccKey(curve="P-384", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-384", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-385", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-384", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-384", + d=_curves['p384'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-384") + private_key2 = ECC.construct(d=3, curve="P-384") + private_key3 = ECC.construct(d=4, curve="P-384") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p384') + self.assertIn("curve='NIST P-384'", repr(key)) + self.assertEqual(key.curve, 'NIST P-384') + self.assertEqual(key.public_key().curve, 'NIST P-384') + + +class TestEccKey_P521(unittest.TestCase): + + def test_private_key(self): + + p521 = _curves['p521'] + + key = EccKey(curve="P-521", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, p521.Gx) + self.assertEqual(key.pointQ.y, p521.Gy) + + point = EccPoint(p521.Gx, p521.Gy, "p521") + key = EccKey(curve="P-521", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="p521", d=1) + key = EccKey(curve="secp521r1", d=1) + key = EccKey(curve="prime521v1", d=1) + + def test_public_key(self): + + p521 = _curves['p521'] + point = EccPoint(p521.Gx, p521.Gy, 'p521') + key = EccKey(curve="P-384", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-521", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-522", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-521", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-521", + d=_curves['p521'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-521") + private_key2 = ECC.construct(d=3, curve="P-521") + private_key3 = ECC.construct(d=4, curve="P-521") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p521') + self.assertIn("curve='NIST P-521'", repr(key)) + self.assertEqual(key.curve, 'NIST P-521') + self.assertEqual(key.public_key().curve, 'NIST P-521') + + +class TestEccModule_P192(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-192") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p192'].Gx, + _curves['p192'].Gy, + "P-192") * key.d, + "p192") + + # Other names + ECC.generate(curve="secp192r1") + ECC.generate(curve="prime192v1") + + def test_construct(self): + + key = ECC.construct(curve="P-192", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p192'].G) + + key = ECC.construct(curve="P-192", point_x=_curves['p192'].Gx, + point_y=_curves['p192'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p192'].G) + + # Other names + ECC.construct(curve="p192", d=1) + ECC.construct(curve="secp192r1", d=1) + ECC.construct(curve="prime192v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p192'].Gx, point_y=_curves['p192'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-192", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-192", d=2, **coordG) + + +class TestEccModule_P224(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-224") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p224'].Gx, + _curves['p224'].Gy, + "P-224") * key.d, + "p224") + + # Other names + ECC.generate(curve="secp224r1") + ECC.generate(curve="prime224v1") + + def test_construct(self): + + key = ECC.construct(curve="P-224", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p224'].G) + + key = ECC.construct(curve="P-224", point_x=_curves['p224'].Gx, + point_y=_curves['p224'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p224'].G) + + # Other names + ECC.construct(curve="p224", d=1) + ECC.construct(curve="secp224r1", d=1) + ECC.construct(curve="prime224v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p224'].Gx, point_y=_curves['p224'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-224", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-224", d=2, **coordG) + + +class TestEccModule_P256(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-256") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p256'].Gx, + _curves['p256'].Gy) * key.d, + "p256") + + # Other names + ECC.generate(curve="secp256r1") + ECC.generate(curve="prime256v1") + + def test_construct(self): + + key = ECC.construct(curve="P-256", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p256'].G) + + key = ECC.construct(curve="P-256", point_x=_curves['p256'].Gx, + point_y=_curves['p256'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p256'].G) + + # Other names + ECC.construct(curve="p256", d=1) + ECC.construct(curve="secp256r1", d=1) + ECC.construct(curve="prime256v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p256'].Gx, point_y=_curves['p256'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-256", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-256", d=2, **coordG) + + +class TestEccModule_P384(unittest.TestCase): + + def test_generate(self): + + curve = _curves['p384'] + key = ECC.generate(curve="P-384") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(curve.Gx, curve.Gy, "p384") * key.d) + + # Other names + ECC.generate(curve="secp384r1") + ECC.generate(curve="prime384v1") + + def test_construct(self): + + curve = _curves['p384'] + key = ECC.construct(curve="P-384", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p384'].G) + + key = ECC.construct(curve="P-384", point_x=curve.Gx, point_y=curve.Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, curve.G) + + # Other names + ECC.construct(curve="p384", d=1) + ECC.construct(curve="secp384r1", d=1) + ECC.construct(curve="prime384v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p384'].Gx, point_y=_curves['p384'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-384", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-384", d=2, **coordG) + + +class TestEccModule_P521(unittest.TestCase): + + def test_generate(self): + + curve = _curves['p521'] + key = ECC.generate(curve="P-521") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(curve.Gx, curve.Gy, "p521") * key.d) + + # Other names + ECC.generate(curve="secp521r1") + ECC.generate(curve="prime521v1") + + def test_construct(self): + + curve = _curves['p521'] + key = ECC.construct(curve="P-521", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p521'].G) + + key = ECC.construct(curve="P-521", point_x=curve.Gx, point_y=curve.Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, curve.G) + + # Other names + ECC.construct(curve="p521", d=1) + ECC.construct(curve="secp521r1", d=1) + ECC.construct(curve="prime521v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p521'].Gx, point_y=_curves['p521'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-521", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-521", d=2, **coordG) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint) + tests += list_test_cases(TestEccPoint_NIST_P192) + tests += list_test_cases(TestEccPoint_NIST_P224) + tests += list_test_cases(TestEccPoint_NIST_P256) + tests += list_test_cases(TestEccPoint_NIST_P384) + tests += list_test_cases(TestEccPoint_NIST_P521) + tests += list_test_cases(TestEccPoint_PAI_P192) + tests += list_test_cases(TestEccPoint_PAI_P224) + tests += list_test_cases(TestEccPoint_PAI_P256) + tests += list_test_cases(TestEccPoint_PAI_P384) + tests += list_test_cases(TestEccPoint_PAI_P521) + tests += list_test_cases(TestEccKey_P192) + tests += list_test_cases(TestEccKey_P224) + tests += list_test_cases(TestEccKey_P256) + tests += list_test_cases(TestEccKey_P384) + tests += list_test_cases(TestEccKey_P521) + tests += list_test_cases(TestEccModule_P192) + tests += list_test_cases(TestEccModule_P224) + tests += list_test_cases(TestEccModule_P256) + tests += list_test_cases(TestEccModule_P384) + tests += list_test_cases(TestEccModule_P521) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py new file mode 100644 index 0000000..67d2e0b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_ElGamal.py: Self-test for the ElGamal primitive +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.ElGamal""" + +__revision__ = "$Id$" + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex +from Cryptodome import Random +from Cryptodome.PublicKey import ElGamal +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.py3compat import * + +class ElGamalTest(unittest.TestCase): + + # + # Test vectors + # + # There seem to be no real ElGamal test vectors available in the + # public domain. The following test vectors have been generated + # with libgcrypt 1.5.0. + # + # Encryption + tve=[ + { + # 256 bits + 'p' :'BA4CAEAAED8CBE952AFD2126C63EB3B345D65C2A0A73D2A3AD4138B6D09BD933', + 'g' :'05', + 'y' :'60D063600ECED7C7C55146020E7A31C4476E9793BEAED420FEC9E77604CAE4EF', + 'x' :'1D391BA2EE3C37FE1BA175A69B2C73A11238AD77675932', + 'k' :'F5893C5BAB4131264066F57AB3D8AD89E391A0B68A68A1', + 'pt' :'48656C6C6F207468657265', + 'ct1':'32BFD5F487966CEA9E9356715788C491EC515E4ED48B58F0F00971E93AAA5EC7', + 'ct2':'7BE8FBFF317C93E82FCEF9BD515284BA506603FEA25D01C0CB874A31F315EE68' + }, + + { + # 512 bits + 'p' :'F1B18AE9F7B4E08FDA9A04832F4E919D89462FD31BF12F92791A93519F75076D6CE3942689CDFF2F344CAFF0F82D01864F69F3AECF566C774CBACF728B81A227', + 'g' :'07', + 'y' :'688628C676E4F05D630E1BE39D0066178CA7AA83836B645DE5ADD359B4825A12B02EF4252E4E6FA9BEC1DB0BE90F6D7C8629CABB6E531F472B2664868156E20C', + 'x' :'14E60B1BDFD33436C0DA8A22FDC14A2CCDBBED0627CE68', + 'k' :'38DBF14E1F319BDA9BAB33EEEADCAF6B2EA5250577ACE7', + 'pt' :'48656C6C6F207468657265', + 'ct1':'290F8530C2CC312EC46178724F196F308AD4C523CEABB001FACB0506BFED676083FE0F27AC688B5C749AB3CB8A80CD6F7094DBA421FB19442F5A413E06A9772B', + 'ct2':'1D69AAAD1DC50493FB1B8E8721D621D683F3BF1321BE21BC4A43E11B40C9D4D9C80DE3AAC2AB60D31782B16B61112E68220889D53C4C3136EE6F6CE61F8A23A0' + } + ] + + # Signature + tvs=[ + { + # 256 bits + 'p' :'D2F3C41EA66530838A704A48FFAC9334F4701ECE3A97CEE4C69DD01AE7129DD7', + 'g' :'05', + 'y' :'C3F9417DC0DAFEA6A05C1D2333B7A95E63B3F4F28CC962254B3256984D1012E7', + 'x' :'165E4A39BE44D5A2D8B1332D416BC559616F536BC735BB', + 'k' :'C7F0C794A7EAD726E25A47FF8928013680E73C51DD3D7D99BFDA8F492585928F', + 'h' :'48656C6C6F207468657265', + 'sig1':'35CA98133779E2073EF31165AFCDEB764DD54E96ADE851715495F9C635E1E7C2', + 'sig2':'0135B88B1151279FE5D8078D4FC685EE81177EE9802AB123A73925FC1CB059A7', + }, + { + # 512 bits + 'p' :'E24CF3A4B8A6AF749DCA6D714282FE4AABEEE44A53BB6ED15FBE32B5D3C3EF9CC4124A2ECA331F3C1C1B667ACA3766825217E7B5F9856648D95F05330C6A19CF', + 'g' :'0B', + 'y' :'2AD3A1049CA5D4ED207B2431C79A8719BB4073D4A94E450EA6CEE8A760EB07ADB67C0D52C275EE85D7B52789061EE45F2F37D9B2AE522A51C28329766BFE68AC', + 'x' :'16CBB4F46D9ECCF24FF9F7E63CAA3BD8936341555062AB', + 'k' :'8A3D89A4E429FD2476D7D717251FB79BF900FFE77444E6BB8299DC3F84D0DD57ABAB50732AE158EA52F5B9E7D8813E81FD9F79470AE22F8F1CF9AEC820A78C69', + 'h' :'48656C6C6F207468657265', + 'sig1':'BE001AABAFFF976EC9016198FBFEA14CBEF96B000CCC0063D3324016F9E91FE80D8F9325812ED24DDB2B4D4CF4430B169880B3CE88313B53255BD4EC0378586F', + 'sig2':'5E266F3F837BA204E3BBB6DBECC0611429D96F8C7CE8F4EFDF9D4CB681C2A954468A357BF4242CEC7418B51DFC081BCD21299EF5B5A0DDEF3A139A1817503DDE', + } + ] + + def test_generate_180(self): + self._test_random_key(180) + + def test_encryption(self): + for tv in self.tve: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + ct = key._encrypt(d['pt'], d['k']) + self.assertEqual(ct[0], d['ct1']) + self.assertEqual(ct[1], d['ct2']) + + def test_decryption(self): + for tv in self.tve: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + pt = key._decrypt((d['ct1'], d['ct2'])) + self.assertEqual(pt, d['pt']) + + def test_signing(self): + for tv in self.tvs: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + sig1, sig2 = key._sign(d['h'], d['k']) + self.assertEqual(sig1, d['sig1']) + self.assertEqual(sig2, d['sig2']) + + def test_verification(self): + for tv in self.tvs: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + # Positive test + res = key._verify( d['h'], (d['sig1'],d['sig2']) ) + self.assertTrue(res) + # Negative test + res = key._verify( d['h'], (d['sig1']+1,d['sig2']) ) + self.assertFalse(res) + + def test_bad_key3(self): + tup = tup0 = list(self.convert_tv(self.tvs[0], 1)['key'])[:3] + tup[0] += 1 # p += 1 (not prime) + self.assertRaises(ValueError, ElGamal.construct, tup) + + tup = tup0 + tup[1] = 1 # g = 1 + self.assertRaises(ValueError, ElGamal.construct, tup) + + tup = tup0 + tup[2] = tup[0]*2 # y = 2*p + self.assertRaises(ValueError, ElGamal.construct, tup) + + def test_bad_key4(self): + tup = tup0 = list(self.convert_tv(self.tvs[0], 1)['key']) + tup[3] += 1 # x += 1 + self.assertRaises(ValueError, ElGamal.construct, tup) + + def convert_tv(self, tv, as_longs=0): + """Convert a test vector from textual form (hexadecimal ascii + to either integers or byte strings.""" + key_comps = 'p','g','y','x' + tv2 = {} + for c in tv.keys(): + tv2[c] = a2b_hex(tv[c]) + if as_longs or c in key_comps or c in ('sig1','sig2'): + tv2[c] = bytes_to_long(tv2[c]) + tv2['key']=[] + for c in key_comps: + tv2['key'] += [tv2[c]] + del tv2[c] + return tv2 + + def _test_random_key(self, bits): + elgObj = ElGamal.generate(bits, Random.new().read) + self._check_private_key(elgObj) + self._exercise_primitive(elgObj) + pub = elgObj.publickey() + self._check_public_key(pub) + self._exercise_public_primitive(elgObj) + + def _check_private_key(self, elgObj): + + # Check capabilities + self.assertTrue(elgObj.has_private()) + + # Sanity check key data + self.assertTrue(1<elgObj.g<(elgObj.p-1)) + self.assertEqual(pow(elgObj.g, elgObj.p-1, elgObj.p), 1) + self.assertTrue(1<elgObj.x<(elgObj.p-1)) + self.assertEqual(pow(elgObj.g, elgObj.x, elgObj.p), elgObj.y) + + def _check_public_key(self, elgObj): + + # Check capabilities + self.assertFalse(elgObj.has_private()) + + # Sanity check key data + self.assertTrue(1<elgObj.g<(elgObj.p-1)) + self.assertEqual(pow(elgObj.g, elgObj.p-1, elgObj.p), 1) + + def _exercise_primitive(self, elgObj): + # Test encryption/decryption + plaintext = 127218 + ciphertext = elgObj._encrypt(plaintext, 123456789) + plaintextP = elgObj._decrypt(ciphertext) + self.assertEqual(plaintext, plaintextP) + + # Test signature/verification + signature = elgObj._sign(plaintext, 987654321) + elgObj._verify(plaintext, signature) + + def _exercise_public_primitive(self, elgObj): + plaintext = 92987276 + ciphertext = elgObj._encrypt(plaintext, 123456789) + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ElGamalTest) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py new file mode 100644 index 0000000..b77dbbf --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py @@ -0,0 +1,320 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_RSA.py: Self-test for the RSA primitive +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.RSA""" + +__revision__ = "$Id$" + +import os +import pickle +from pickle import PicklingError +from Cryptodome.Util.py3compat import * + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex + +class RSATest(unittest.TestCase): + # Test vectors from "RSA-OAEP and RSA-PSS test vectors (.zip file)" + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # See RSADSI's PKCS#1 page at + # http://www.rsa.com/rsalabs/node.asp?id=2125 + + # from oaep-int.txt + + # TODO: PyCryptodome treats the message as starting *after* the leading "00" + # TODO: That behaviour should probably be changed in the future. + plaintext = """ + eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 + ca 82 31 0b 26 dc d8 7d 5c 68 f1 ee a8 f5 52 67 + c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46 26 f5 af + f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db + 4c dc fe 4f f4 77 28 b4 a1 b7 c1 36 2b aa d2 9a + b4 8d 28 69 d5 02 41 21 43 58 11 59 1b e3 92 f9 + 82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f + 7b c2 75 19 52 81 ce 32 d2 f1 b7 6d 4d 35 3e 2d + """ + + ciphertext = """ + 12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 + 39 a3 3d 1e 99 6f c8 2a 94 cc d3 00 74 c9 5d f7 + 63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6 + 53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb + 6d 84 b1 c3 1d 65 4a 19 70 e5 78 3b d6 eb 96 a0 + 24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48 + da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d + 51 a7 4d df 85 d8 b5 0d e9 68 38 d6 06 3e 09 55 + """ + + modulus = """ + bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 + 36 8d 07 ee d4 10 43 a4 40 d6 b6 f0 74 54 f5 1f + b8 df ba af 03 5c 02 ab 61 ea 48 ce eb 6f cd 48 + 76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f + af b8 e0 a3 df c7 37 72 3e e6 b4 b7 d9 3a 25 84 + ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e + e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f + e2 53 72 98 ca 2a 8f 59 46 f8 e5 fd 09 1d bd cb + """ + + e = 0x11 # public exponent + + prime_factor = """ + c9 7f b1 f0 27 f4 53 f6 34 12 33 ea aa d1 d9 35 + 3f 6c 42 d0 88 66 b1 d0 5a 0f 20 35 02 8b 9d 86 + 98 40 b4 16 66 b4 2e 92 ea 0d a3 b4 32 04 b5 cf + ce 33 52 52 4d 04 16 a5 a4 41 e7 00 af 46 15 03 + """ + + def setUp(self): + global RSA, Random, bytes_to_long + from Cryptodome.PublicKey import RSA + from Cryptodome import Random + from Cryptodome.Util.number import bytes_to_long, inverse + self.n = bytes_to_long(a2b_hex(self.modulus)) + self.p = bytes_to_long(a2b_hex(self.prime_factor)) + + # Compute q, d, and u from n, e, and p + self.q = self.n // self.p + self.d = inverse(self.e, (self.p-1)*(self.q-1)) + self.u = inverse(self.p, self.q) # u = e**-1 (mod q) + + self.rsa = RSA + + def test_generate_1arg(self): + """RSA (default implementation) generated key (1 argument)""" + rsaObj = self.rsa.generate(1024) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + + def test_generate_2arg(self): + """RSA (default implementation) generated key (2 arguments)""" + rsaObj = self.rsa.generate(1024, Random.new().read) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + + def test_generate_3args(self): + rsaObj = self.rsa.generate(1024, Random.new().read,e=65537) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + self.assertEqual(65537,rsaObj.e) + + def test_construct_2tuple(self): + """RSA (default implementation) constructed key (2-tuple)""" + pub = self.rsa.construct((self.n, self.e)) + self._check_public_key(pub) + self._check_encryption(pub) + + def test_construct_3tuple(self): + """RSA (default implementation) constructed key (3-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d)) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_4tuple(self): + """RSA (default implementation) constructed key (4-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p)) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_5tuple(self): + """RSA (default implementation) constructed key (5-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q)) + self._check_private_key(rsaObj) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_6tuple(self): + """RSA (default implementation) constructed key (6-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q, self.u)) + self._check_private_key(rsaObj) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_bad_key2(self): + tup = (self.n, 1) + self.assertRaises(ValueError, self.rsa.construct, tup) + + # An even modulus is wrong + tup = (self.n+1, self.e) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key3(self): + tup = (self.n, self.e, self.d+1) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key5(self): + tup = (self.n, self.e, self.d, self.p, self.p) + self.assertRaises(ValueError, self.rsa.construct, tup) + + tup = (self.p*self.p, self.e, self.p, self.p) + self.assertRaises(ValueError, self.rsa.construct, tup) + + tup = (self.p*self.p, 3, self.p, self.q) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key6(self): + tup = (self.n, self.e, self.d, self.p, self.q, 10) + self.assertRaises(ValueError, self.rsa.construct, tup) + + from Cryptodome.Util.number import inverse + tup = (self.n, self.e, self.d, self.p, self.q, inverse(self.q, self.p)) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_factoring(self): + rsaObj = self.rsa.construct([self.n, self.e, self.d]) + self.assertTrue(rsaObj.p==self.p or rsaObj.p==self.q) + self.assertTrue(rsaObj.q==self.p or rsaObj.q==self.q) + self.assertTrue(rsaObj.q*rsaObj.p == self.n) + + self.assertRaises(ValueError, self.rsa.construct, [self.n, self.e, self.n-1]) + + def test_repr(self): + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q)) + repr(rsaObj) + + def test_serialization(self): + """RSA keys are unpickable""" + + rsa_key = self.rsa.generate(1024) + self.assertRaises(PicklingError, pickle.dumps, rsa_key) + + def test_raw_rsa_boundary(self): + # The argument of every RSA raw operation (encrypt/decrypt) must be + # non-negative and no larger than the modulus + rsa_obj = self.rsa.generate(1024) + + self.assertRaises(ValueError, rsa_obj._decrypt, rsa_obj.n) + self.assertRaises(ValueError, rsa_obj._encrypt, rsa_obj.n) + + self.assertRaises(ValueError, rsa_obj._decrypt, -1) + self.assertRaises(ValueError, rsa_obj._encrypt, -1) + + def test_size(self): + pub = self.rsa.construct((self.n, self.e)) + self.assertEqual(pub.size_in_bits(), 1024) + self.assertEqual(pub.size_in_bytes(), 128) + + def _check_private_key(self, rsaObj): + from Cryptodome.Math.Numbers import Integer + + # Check capabilities + self.assertEqual(1, rsaObj.has_private()) + + # Sanity check key data + self.assertEqual(rsaObj.n, rsaObj.p * rsaObj.q) # n = pq + lcm = int(Integer(rsaObj.p-1).lcm(rsaObj.q-1)) + self.assertEqual(1, rsaObj.d * rsaObj.e % lcm) # ed = 1 (mod LCM(p-1, q-1)) + self.assertEqual(1, rsaObj.p * rsaObj.u % rsaObj.q) # pu = 1 (mod q) + self.assertEqual(1, rsaObj.p > 1) # p > 1 + self.assertEqual(1, rsaObj.q > 1) # q > 1 + self.assertEqual(1, rsaObj.e > 1) # e > 1 + self.assertEqual(1, rsaObj.d > 1) # d > 1 + + self.assertEqual(rsaObj.u, rsaObj.invp) + self.assertEqual(1, rsaObj.q * rsaObj.invq % rsaObj.p) + + def _check_public_key(self, rsaObj): + ciphertext = a2b_hex(self.ciphertext) + + # Check capabilities + self.assertEqual(0, rsaObj.has_private()) + + # Check rsaObj.[ne] -> rsaObj.[ne] mapping + self.assertEqual(rsaObj.n, rsaObj.n) + self.assertEqual(rsaObj.e, rsaObj.e) + + # Check that private parameters are all missing + self.assertEqual(0, hasattr(rsaObj, 'd')) + self.assertEqual(0, hasattr(rsaObj, 'p')) + self.assertEqual(0, hasattr(rsaObj, 'q')) + self.assertEqual(0, hasattr(rsaObj, 'u')) + + # Sanity check key data + self.assertEqual(1, rsaObj.e > 1) # e > 1 + + # Public keys should not be able to sign or decrypt + self.assertRaises(TypeError, rsaObj._decrypt, + bytes_to_long(ciphertext)) + + # Check __eq__ and __ne__ + self.assertEqual(rsaObj.public_key() == rsaObj.public_key(),True) # assert_ + self.assertEqual(rsaObj.public_key() != rsaObj.public_key(),False) # assertFalse + + self.assertEqual(rsaObj.publickey(), rsaObj.public_key()) + + def _exercise_primitive(self, rsaObj): + # Since we're using a randomly-generated key, we can't check the test + # vector, but we can make sure encryption and decryption are inverse + # operations. + ciphertext = bytes_to_long(a2b_hex(self.ciphertext)) + + # Test decryption + plaintext = rsaObj._decrypt(ciphertext) + + # Test encryption (2 arguments) + new_ciphertext2 = rsaObj._encrypt(plaintext) + self.assertEqual(ciphertext, new_ciphertext2) + + def _exercise_public_primitive(self, rsaObj): + plaintext = a2b_hex(self.plaintext) + + # Test encryption (2 arguments) + new_ciphertext2 = rsaObj._encrypt(bytes_to_long(plaintext)) + + def _check_encryption(self, rsaObj): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + + # Test encryption + new_ciphertext2 = rsaObj._encrypt(bytes_to_long(plaintext)) + self.assertEqual(bytes_to_long(ciphertext), new_ciphertext2) + + def _check_decryption(self, rsaObj): + plaintext = bytes_to_long(a2b_hex(self.plaintext)) + ciphertext = bytes_to_long(a2b_hex(self.ciphertext)) + + # Test plain decryption + new_plaintext = rsaObj._decrypt(ciphertext) + self.assertEqual(plaintext, new_plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(RSATest) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py new file mode 100644 index 0000000..5ff0113 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py @@ -0,0 +1,554 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_import_DSA.py: Self-test for importing DSA keys +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import unittest +import re + +from Cryptodome.PublicKey import DSA +from Cryptodome.SelfTest.st_common import * +from Cryptodome.Util.py3compat import * + +from binascii import unhexlify + +class ImportKeyTests(unittest.TestCase): + + y = 92137165128186062214622779787483327510946462589285775188003362705875131352591574106484271700740858696583623951844732128165434284507709057439633739849986759064015013893156866539696757799934634945787496920169462601722830899660681779448742875054459716726855443681559131362852474817534616736104831095601710736729 + p = 162452170958135306109773853318304545923250830605675936228618290525164105310663722368377131295055868997377338797580997938253236213714988311430600065853662861806894003694743806769284131194035848116051021923956699231855223389086646903420682639786976554552864568460372266462812137447840653688476258666833303658691 + q = 988791743931120302950649732173330531512663554851 + g = 85583152299197514738065570254868711517748965097380456700369348466136657764813442044039878840094809620913085570225318356734366886985903212775602770761953571967834823306046501307810937486758039063386311593890777319935391363872375452381836756832784184928202587843258855704771836753434368484556809100537243908232 + x = 540873410045082450874416847965843801027716145253 + + def setUp(self): + + # It is easier to write test vectors in text form, + # and convert them to byte strigs dynamically here + for mname, mvalue in ImportKeyTests.__dict__.items(): + if mname[:4] in ('der_', 'pem_', 'ssh_'): + if mname[:4] == 'der_': + mvalue = unhexlify(tobytes(mvalue)) + mvalue = tobytes(mvalue) + setattr(self, mname, mvalue) + + # 1. SubjectPublicKeyInfo + der_public=\ + '308201b73082012b06072a8648ce3804013082011e02818100e756ee1717f4b6'+\ + '794c7c214724a19763742c45572b4b3f8ff3b44f3be9f44ce039a2757695ec91'+\ + '5697da74ef914fcd1b05660e2419c761d639f45d2d79b802dbd23e7ab8b81b47'+\ + '9a380e1f30932584ba2a0b955032342ebc83cb5ca906e7b0d7cd6fe656cecb4c'+\ + '8b5a77123a8c6750a481e3b06057aff6aa6eba620b832d60c3021500ad32f48c'+\ + 'd3ae0c45a198a61fa4b5e20320763b2302818079dfdc3d614fe635fceb7eaeae'+\ + '3718dc2efefb45282993ac6749dc83c223d8c1887296316b3b0b54466cf444f3'+\ + '4b82e3554d0b90a778faaf1306f025dae6a3e36c7f93dd5bac4052b92370040a'+\ + 'ca70b8d5820599711900efbc961812c355dd9beffe0981da85c5548074b41c56'+\ + 'ae43fd300d89262e4efd89943f99a651b03888038185000281810083352a69a1'+\ + '32f34843d2a0eb995bff4e2f083a73f0049d2c91ea2f0ce43d144abda48199e4'+\ + 'b003c570a8af83303d45105f606c5c48d925a40ed9c2630c2fa4cdbf838539de'+\ + 'b9a29f919085f2046369f627ca84b2cb1e2c7940564b670f963ab1164d4e2ca2'+\ + 'bf6ffd39f12f548928bf4d2d1b5e6980b4f1be4c92a91986fba559' + + def testImportKey1(self): + key_obj = DSA.importKey(self.der_public) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey1(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('DER') + self.assertEqual(self.der_public, encoded) + + # 2. + pem_public="""\ +-----BEGIN PUBLIC KEY----- +MIIBtzCCASsGByqGSM44BAEwggEeAoGBAOdW7hcX9LZ5THwhRyShl2N0LEVXK0s/ +j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4uBtH +mjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47BgV6/2 +qm66YguDLWDDAhUArTL0jNOuDEWhmKYfpLXiAyB2OyMCgYB539w9YU/mNfzrfq6u +NxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG8CXa +5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0tBxW +rkP9MA2JJi5O/YmUP5mmUbA4iAOBhQACgYEAgzUqaaEy80hD0qDrmVv/Ti8IOnPw +BJ0skeovDOQ9FEq9pIGZ5LADxXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTne +uaKfkZCF8gRjafYnyoSyyx4seUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmA +tPG+TJKpGYb7pVk= +-----END PUBLIC KEY-----""" + + def testImportKey2(self): + for pem in (self.pem_public, tostr(self.pem_public)): + key_obj = DSA.importKey(pem) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey2(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('PEM') + self.assertEqual(self.pem_public, encoded) + + # 3. OpenSSL/OpenSSH format + der_private=\ + '308201bb02010002818100e756ee1717f4b6794c7c214724a19763742c45572b'+\ + '4b3f8ff3b44f3be9f44ce039a2757695ec915697da74ef914fcd1b05660e2419'+\ + 'c761d639f45d2d79b802dbd23e7ab8b81b479a380e1f30932584ba2a0b955032'+\ + '342ebc83cb5ca906e7b0d7cd6fe656cecb4c8b5a77123a8c6750a481e3b06057'+\ + 'aff6aa6eba620b832d60c3021500ad32f48cd3ae0c45a198a61fa4b5e2032076'+\ + '3b2302818079dfdc3d614fe635fceb7eaeae3718dc2efefb45282993ac6749dc'+\ + '83c223d8c1887296316b3b0b54466cf444f34b82e3554d0b90a778faaf1306f0'+\ + '25dae6a3e36c7f93dd5bac4052b92370040aca70b8d5820599711900efbc9618'+\ + '12c355dd9beffe0981da85c5548074b41c56ae43fd300d89262e4efd89943f99'+\ + 'a651b038880281810083352a69a132f34843d2a0eb995bff4e2f083a73f0049d'+\ + '2c91ea2f0ce43d144abda48199e4b003c570a8af83303d45105f606c5c48d925'+\ + 'a40ed9c2630c2fa4cdbf838539deb9a29f919085f2046369f627ca84b2cb1e2c'+\ + '7940564b670f963ab1164d4e2ca2bf6ffd39f12f548928bf4d2d1b5e6980b4f1'+\ + 'be4c92a91986fba55902145ebd9a3f0b82069d98420986b314215025756065' + + def testImportKey3(self): + key_obj = DSA.importKey(self.der_private) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey3(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('DER', pkcs8=False) + self.assertEqual(self.der_private, encoded) + + # 4. + pem_private="""\ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQDnVu4XF/S2eUx8IUckoZdjdCxFVytLP4/ztE876fRM4DmidXaV +7JFWl9p075FPzRsFZg4kGcdh1jn0XS15uALb0j56uLgbR5o4Dh8wkyWEuioLlVAy +NC68g8tcqQbnsNfNb+ZWzstMi1p3EjqMZ1CkgeOwYFev9qpuumILgy1gwwIVAK0y +9IzTrgxFoZimH6S14gMgdjsjAoGAed/cPWFP5jX8636urjcY3C7++0UoKZOsZ0nc +g8Ij2MGIcpYxazsLVEZs9ETzS4LjVU0LkKd4+q8TBvAl2uaj42x/k91brEBSuSNw +BArKcLjVggWZcRkA77yWGBLDVd2b7/4JgdqFxVSAdLQcVq5D/TANiSYuTv2JlD+Z +plGwOIgCgYEAgzUqaaEy80hD0qDrmVv/Ti8IOnPwBJ0skeovDOQ9FEq9pIGZ5LAD +xXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTneuaKfkZCF8gRjafYnyoSyyx4s +eUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmAtPG+TJKpGYb7pVkCFF69mj8L +ggadmEIJhrMUIVAldWBl +-----END DSA PRIVATE KEY-----""" + + def testImportKey4(self): + for pem in (self.pem_private, tostr(self.pem_private)): + key_obj = DSA.importKey(pem) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey4(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM', pkcs8=False) + self.assertEqual(self.pem_private, encoded) + + # 5. PKCS8 (unencrypted) + der_pkcs8=\ + '3082014a0201003082012b06072a8648ce3804013082011e02818100e756ee17'+\ + '17f4b6794c7c214724a19763742c45572b4b3f8ff3b44f3be9f44ce039a27576'+\ + '95ec915697da74ef914fcd1b05660e2419c761d639f45d2d79b802dbd23e7ab8'+\ + 'b81b479a380e1f30932584ba2a0b955032342ebc83cb5ca906e7b0d7cd6fe656'+\ + 'cecb4c8b5a77123a8c6750a481e3b06057aff6aa6eba620b832d60c3021500ad'+\ + '32f48cd3ae0c45a198a61fa4b5e20320763b2302818079dfdc3d614fe635fceb'+\ + '7eaeae3718dc2efefb45282993ac6749dc83c223d8c1887296316b3b0b54466c'+\ + 'f444f34b82e3554d0b90a778faaf1306f025dae6a3e36c7f93dd5bac4052b923'+\ + '70040aca70b8d5820599711900efbc961812c355dd9beffe0981da85c5548074'+\ + 'b41c56ae43fd300d89262e4efd89943f99a651b03888041602145ebd9a3f0b82'+\ + '069d98420986b314215025756065' + + def testImportKey5(self): + key_obj = DSA.importKey(self.der_pkcs8) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey5(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('DER') + self.assertEqual(self.der_pkcs8, encoded) + encoded = key.export_key('DER', pkcs8=True) + self.assertEqual(self.der_pkcs8, encoded) + + # 6. + pem_pkcs8="""\ +-----BEGIN PRIVATE KEY----- +MIIBSgIBADCCASsGByqGSM44BAEwggEeAoGBAOdW7hcX9LZ5THwhRyShl2N0LEVX +K0s/j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4 +uBtHmjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47Bg +V6/2qm66YguDLWDDAhUArTL0jNOuDEWhmKYfpLXiAyB2OyMCgYB539w9YU/mNfzr +fq6uNxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG +8CXa5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0 +tBxWrkP9MA2JJi5O/YmUP5mmUbA4iAQWAhRevZo/C4IGnZhCCYazFCFQJXVgZQ== +-----END PRIVATE KEY-----""" + + def testImportKey6(self): + for pem in (self.pem_pkcs8, tostr(self.pem_pkcs8)): + key_obj = DSA.importKey(pem) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey6(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM') + self.assertEqual(self.pem_pkcs8, encoded) + encoded = key.export_key('PEM', pkcs8=True) + self.assertEqual(self.pem_pkcs8, encoded) + + # 7. OpenSSH/RFC4253 + ssh_pub="""ssh-dss AAAAB3NzaC1kc3MAAACBAOdW7hcX9LZ5THwhRyShl2N0LEVXK0s/j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4uBtHmjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47BgV6/2qm66YguDLWDDAAAAFQCtMvSM064MRaGYph+kteIDIHY7IwAAAIB539w9YU/mNfzrfq6uNxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG8CXa5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0tBxWrkP9MA2JJi5O/YmUP5mmUbA4iAAAAIEAgzUqaaEy80hD0qDrmVv/Ti8IOnPwBJ0skeovDOQ9FEq9pIGZ5LADxXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTneuaKfkZCF8gRjafYnyoSyyx4seUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmAtPG+TJKpGYb7pVk=""" + + def testImportKey7(self): + for ssh in (self.ssh_pub, tostr(self.ssh_pub)): + key_obj = DSA.importKey(ssh) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey7(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('OpenSSH') + self.assertEqual(self.ssh_pub, encoded) + + # 8. Encrypted OpenSSL/OpenSSH + pem_private_encrypted="""\ +-----BEGIN DSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,70B6908939D65E9F2EB999E8729788CE + +4V6GHRDpCrdZ8MBjbyp5AlGUrjvr2Pn2e2zVxy5RBt4FBj9/pa0ae0nnyUPMLSUU +kKyOR0topRYTVRLElm4qVrb5uNZ3hRwfbklr+pSrB7O9eHz9V5sfOQxyODS07JxK +k1OdOs70/ouMXLF9EWfAZOmWUccZKHNblUwg1p1UrZIz5jXw4dUE/zqhvXh6d+iC +ADsICaBCjCrRQJKDp50h3+ndQjkYBKVH+pj8TiQ79U7lAvdp3+iMghQN6YXs9mdI +gFpWw/f97oWM4GHZFqHJ+VSMNFjBiFhAvYV587d7Lk4dhD8sCfbxj42PnfRgUItc +nnPqHxmhMQozBWzYM4mQuo3XbF2WlsNFbOzFVyGhw1Bx1s91qvXBVWJh2ozrW0s6 +HYDV7ZkcTml/4kjA/d+mve6LZ8kuuR1qCiZx6rkffhh1gDN/1Xz3HVvIy/dQ+h9s +5zp7PwUoWbhqp3WCOr156P6gR8qo7OlT6wMh33FSXK/mxikHK136fV2shwTKQVII +rJBvXpj8nACUmi7scKuTWGeUoXa+dwTZVVe+b+L2U1ZM7+h/neTJiXn7u99PFUwu +xVJtxaV37m3aXxtCsPnbBg== +-----END DSA PRIVATE KEY-----""" + + def testImportKey8(self): + for pem in (self.pem_private_encrypted, tostr(self.pem_private_encrypted)): + key_obj = DSA.importKey(pem, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey8(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM', pkcs8=False, passphrase="PWDTEST") + key = DSA.importKey(encoded, "PWDTEST") + self.assertEqual(self.y, key.y) + self.assertEqual(self.p, key.p) + self.assertEqual(self.q, key.q) + self.assertEqual(self.g, key.g) + self.assertEqual(self.x, key.x) + + # 9. Encrypted PKCS8 + # pbeWithMD5AndDES-CBC + pem_pkcs8_encrypted="""\ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIBcTAbBgkqhkiG9w0BBQMwDgQI0GC3BJ/jSw8CAggABIIBUHc1cXZpExIE9tC7 +7ryiW+5ihtF2Ekurq3e408GYSAu5smJjN2bvQXmzRFBz8W38K8eMf1sbWroZ4+zn +kZSbb9nSm5kAa8lR2+oF2k+WRswMR/PTC3f/D9STO2X0QxdrzKgIHEcSGSHp5jTx +aVvbkCDHo9vhBTl6S3ogZ48As/MEro76+9igUwJ1jNhIQZPJ7e20QH5qDpQFFJN4 +CKl2ENSEuwGiqBszItFy4dqH0g63ZGZV/xt9wSO9Rd7SK/EbA/dklOxBa5Y/VItM +gnIhs9XDMoGYyn6F023EicNJm6g/bVQk81BTTma4tm+12TKGdYm+QkeZvCOMZylr +Wv67cKwO3cAXt5C3QXMDgYR64XvuaT5h7C0igMp2afSXJlnbHEbFxQVJlv83T4FM +eZ4k+NQDbEL8GiHmFxzDWQAuPPZKJWEEEV2p/To+WOh+kSDHQw== +-----END ENCRYPTED PRIVATE KEY-----""" + + def testImportKey9(self): + for pem in (self.pem_pkcs8_encrypted, tostr(self.pem_pkcs8_encrypted)): + key_obj = DSA.importKey(pem, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + # 10. Encrypted PKCS8 + # pkcs5PBES2 / + # pkcs5PBKDF2 (rounds=1000, salt=D725BF1B6B8239F4) / + # des-EDE3-CBC (iv=27A1C66C42AFEECE) + # + der_pkcs8_encrypted=\ + '30820196304006092a864886f70d01050d3033301b06092a864886f70d01050c'+\ + '300e0408d725bf1b6b8239f4020203e8301406082a864886f70d0307040827a1'+\ + 'c66c42afeece048201505cacfde7bf8edabb3e0d387950dc872662ea7e9b1ed4'+\ + '400d2e7e6186284b64668d8d0328c33a9d9397e6f03df7cb68268b0a06b4e22f'+\ + '7d132821449ecf998a8b696dbc6dd2b19e66d7eb2edfeb4153c1771d49702395'+\ + '4f36072868b5fcccf93413a5ac4b2eb47d4b3f681c6bd67ae363ed776f45ae47'+\ + '174a00098a7c930a50f820b227ddf50f9742d8e950d02586ff2dac0e3c372248'+\ + 'e5f9b6a7a02f4004f20c87913e0f7b52bccc209b95d478256a890b31d4c9adec'+\ + '21a4d157a179a93a3dad06f94f3ce486b46dfa7fc15fd852dd7680bbb2f17478'+\ + '7e71bd8dbaf81eca7518d76c1d26256e95424864ba45ca5d47d7c5a421be02fa'+\ + 'b94ab01e18593f66cf9094eb5c94b9ecf3aa08b854a195cf87612fbe5e96c426'+\ + '2b0d573e52dc71ba3f5e468c601e816c49b7d32c698b22175e89aaef0c443770'+\ + '5ef2f88a116d99d8e2869a4fd09a771b84b49e4ccb79aadcb1c9' + + def testImportKey10(self): + key_obj = DSA.importKey(self.der_pkcs8_encrypted, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey10(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + randfunc = BytesIO(unhexlify(b("27A1C66C42AFEECE") + b("D725BF1B6B8239F4"))).read + encoded = key.export_key('DER', pkcs8=True, passphrase="PWDTEST", randfunc=randfunc) + self.assertEqual(self.der_pkcs8_encrypted, encoded) + + # ---- + + def testImportError1(self): + self.assertRaises(ValueError, DSA.importKey, self.der_pkcs8_encrypted, "wrongpwd") + + def testExportError2(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + self.assertRaises(ValueError, key.export_key, 'DER', pkcs8=False, passphrase="PWDTEST") + + def test_import_key(self): + """Verify importKey is an alias to import_key""" + + key_obj = DSA.import_key(self.der_public) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def test_exportKey(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + self.assertEqual(key.exportKey(), key.export_key()) + + + def test_import_empty(self): + self.assertRaises(ValueError, DSA.import_key, b'') + + +class ImportKeyFromX509Cert(unittest.TestCase): + + def test_x509v1(self): + + # Sample V1 certificate with a 1024 bit DSA key + x509_v1_cert = """ +-----BEGIN CERTIFICATE----- +MIIDUjCCArsCAQIwDQYJKoZIhvcNAQEFBQAwfjENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxHDAaBgkqhkiG9w0BCQEWDXNwYW1AYWNtZS5vcmcxEzARBgNVBAcT +Ck1ldHJvcG9saXMxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYDVQQGEwJVUzENMAsG +A1UEAxMEdGVzdDAeFw0xNDA3MTEyMDM4NDNaFw0xNzA0MDYyMDM4NDNaME0xCzAJ +BgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxDzANBgNVBAMTBnBvbGFuZDCCAbYwggErBgcqhkjOOAQBMIIBHgKB +gQDOrN4Ox4+t3T6wKeHfhzArhcrNEFMQ4Ss+4PIKyimDy9Bn64WPkL1B/9dvYIga +23GLu6tVJmXo6EdJnVOHEMhr99EeOwuDWWeP7Awq7RSlKEejokr4BEzMTW/tExSD +cO6/GI7xzh0eTH+VTTPDfyrJMYCkh0rJAfCP+5xrmPNetwIVALtXYOV1yoRrzJ2Q +M5uEjidH6GiZAoGAfUqA1SAm5g5U68SILMVX9l5rq0OpB0waBMpJQ31/R/yXNDqo +c3gGWZTOJFU4IzwNpGhrGNADUByz/lc1SAOAdEJIr0JVrhbGewQjB4pWqoLGbBKz +RoavTNDc/zD7SYa12evWDHADwvlXoeQg+lWop1zS8OqaDC7aLGKpWN3/m8kDgYQA +AoGAKoirPAfcp1rbbl4y2FFAIktfW8f4+T7d2iKSg73aiVfujhNOt1Zz1lfC0NI2 +eonLWO3tAM4XGKf1TLjb5UXngGn40okPsaA81YE6ZIKm20ywjlOY3QkAEdMaLVY3 +9PJvM8RGB9m7pLKxyHfGMfF40MVN4222zKeGp7xhM0CNiCUwDQYJKoZIhvcNAQEF +BQADgYEAfbNZfpYa2KlALEM1FZnwvQDvJHntHz8LdeJ4WM7CXDlKi67wY2HKM30w +s2xej75imkVOFd1kF2d0A8sjfriXLVIt1Hwq9ANZomhu4Edx0xpH8tqdh/bDtnM2 +TmduZNY9OWkb07h0CtWD6Zt8fhRllVsSSrlWd/2or7FXNC5weFQ= +-----END CERTIFICATE----- + """.strip() + + # DSA public key as dumped by openssl + y_str = """ +2a:88:ab:3c:07:dc:a7:5a:db:6e:5e:32:d8:51:40: +22:4b:5f:5b:c7:f8:f9:3e:dd:da:22:92:83:bd:da: +89:57:ee:8e:13:4e:b7:56:73:d6:57:c2:d0:d2:36: +7a:89:cb:58:ed:ed:00:ce:17:18:a7:f5:4c:b8:db: +e5:45:e7:80:69:f8:d2:89:0f:b1:a0:3c:d5:81:3a: +64:82:a6:db:4c:b0:8e:53:98:dd:09:00:11:d3:1a: +2d:56:37:f4:f2:6f:33:c4:46:07:d9:bb:a4:b2:b1: +c8:77:c6:31:f1:78:d0:c5:4d:e3:6d:b6:cc:a7:86: +a7:bc:61:33:40:8d:88:25 + """ + p_str = """ +00:ce:ac:de:0e:c7:8f:ad:dd:3e:b0:29:e1:df:87: +30:2b:85:ca:cd:10:53:10:e1:2b:3e:e0:f2:0a:ca: +29:83:cb:d0:67:eb:85:8f:90:bd:41:ff:d7:6f:60: +88:1a:db:71:8b:bb:ab:55:26:65:e8:e8:47:49:9d: +53:87:10:c8:6b:f7:d1:1e:3b:0b:83:59:67:8f:ec: +0c:2a:ed:14:a5:28:47:a3:a2:4a:f8:04:4c:cc:4d: +6f:ed:13:14:83:70:ee:bf:18:8e:f1:ce:1d:1e:4c: +7f:95:4d:33:c3:7f:2a:c9:31:80:a4:87:4a:c9:01: +f0:8f:fb:9c:6b:98:f3:5e:b7 + """ + q_str = """ +00:bb:57:60:e5:75:ca:84:6b:cc:9d:90:33:9b:84: +8e:27:47:e8:68:99 + """ + g_str = """ +7d:4a:80:d5:20:26:e6:0e:54:eb:c4:88:2c:c5:57: +f6:5e:6b:ab:43:a9:07:4c:1a:04:ca:49:43:7d:7f: +47:fc:97:34:3a:a8:73:78:06:59:94:ce:24:55:38: +23:3c:0d:a4:68:6b:18:d0:03:50:1c:b3:fe:57:35: +48:03:80:74:42:48:af:42:55:ae:16:c6:7b:04:23: +07:8a:56:aa:82:c6:6c:12:b3:46:86:af:4c:d0:dc: +ff:30:fb:49:86:b5:d9:eb:d6:0c:70:03:c2:f9:57: +a1:e4:20:fa:55:a8:a7:5c:d2:f0:ea:9a:0c:2e:da: +2c:62:a9:58:dd:ff:9b:c9 + """ + + key = DSA.importKey(x509_v1_cert) + for comp_name in ('y', 'p', 'q', 'g'): + comp_str = locals()[comp_name + "_str"] + comp = int(re.sub("[^0-9a-f]", "", comp_str), 16) + self.assertEqual(getattr(key, comp_name), comp) + self.assertFalse(key.has_private()) + + def test_x509v3(self): + + # Sample V3 certificate with a 1024 bit DSA key + x509_v3_cert = """ +-----BEGIN CERTIFICATE----- +MIIFhjCCA26gAwIBAgIBAzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL +MAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEQMA4GA1UEAwwHVGVzdCBD +QTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0xNDA3MTMyMDUz +MjBaFw0xNzA0MDgyMDUzMjBaMEAxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJNRDES +MBAGA1UEBwwJQmFsdGltb3JlMRAwDgYDVQQDDAdhdXN0cmlhMIIBtjCCASsGByqG +SM44BAEwggEeAoGBALfd8gyEpVPA0ZI69Kp3nyJcu5N0ZZ3K1K9hleQLNqKEcZOh +7a/C2J1TPdmHTLJ0rAwBZ1nWxnARSgRphziGDFspKCYQwYcSMz8KoFgvXbXpuchy +oFACiQ2LqZnc5MakuLQtLcQciSYGYj3zmZdYMoa904F1aDWr+DxQI6DVC3/bAhUA +hqXMCJ6fQK3G2O9S3/CC/yVZXCsCgYBRXROl3R2khX7l10LQjDEgo3B1IzjXU/jP +McMBl6XO+nBJXxr/scbq8Ajiv7LTnGpSjgryHtvfj887kfvo8QbSS3kp3vq5uSqI +ui7E7r3jguWaLj616AG1HWOctXJUjqsiabZwsp2h09gHTzmHEXBOmiARu8xFxKAH +xsuo7onAbwOBhAACgYBylWjWSnKHE8mHx1A5m/0GQx6xnhWIe3+MJAnEhRGxA2J4 +SCsfWU0OwglIQToh1z5uUU9oDi9cYgNPBevOFRnDhc2yaJY6VAYnI+D+6J5IU6Yd +0iaG/iSc4sV4bFr0axcPpse3SN0XaQxiKeSFBfFnoMqL+dd9Gb3QPZSllBcVD6OB +1TCB0jAdBgNVHQ4EFgQUx5wN0Puotv388M9Tp/fsPbZpzAUwHwYDVR0jBBgwFoAU +a0hkif3RMaraiWtsOOZZlLu9wJwwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwSgYD +VR0RBEMwQYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNvbYIQbWFpbC5leGFt +cGxlLmNvbYIPZnRwLmV4YW1wbGUuY29tMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NM +IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAgEAyWf1TiJI +aNEIA9o/PG8/JiGASTS2/HBVTJbkq03k6NkJVk/GxC1DPziTUJ+CdWlHWcAi1EOW +Ach3QxNDRrVfCOfCMDgElIO1094/reJgdFYG00LRi8QkRJuxANV7YS4tLudhyHJC +kR2lhdMNmEuzWK+s2y+5cLrdm7qdvdENQCcV67uvGPx4sc+EaE7x13SczKjWBtbo +QCs6JTOW+EkPRl4Zo27K4OIZ43/J+GxvwU9QUVH3wPVdbbLNw+QeTFBYMTEcxyc4 +kv50HPBFaithziXBFyvdIs19FjkFzu0Uz/e0zb1+vMzQlJMD94HVOrMnIj5Sb2cL +KKdYXS4uhxFJmdV091Xur5JkYYwEzuaGav7J3zOzYutrIGTgDluLCvA+VQkRcTsy +jZ065SkY/v+38QHp+cmm8WRluupJTs8wYzVp6Fu0iFaaK7ztFmaZmHpiPIfDFjva +aCIgzzT5NweJd/b71A2SyzHXJ14zBXsr1PMylMp2TpHIidhuuNuQL6I0HaollB4M +Z3FsVBMhVDw4Z76qnFPr8mZE2tar33hSlJI/3pS/bBiukuBk8U7VB0X8OqaUnP3C +7b2Z4G8GtqDVcKGMzkvMjT4n9rKd/Le+qHSsQOGO9W/0LB7UDAZSwUsfAPnoBgdS +5t9tIomLCOstByXi+gGZue1TcdCa3Ph4kO0= +-----END CERTIFICATE----- + """.strip() + + # DSA public key as dumped by openssl + y_str = """ +72:95:68:d6:4a:72:87:13:c9:87:c7:50:39:9b:fd: +06:43:1e:b1:9e:15:88:7b:7f:8c:24:09:c4:85:11: +b1:03:62:78:48:2b:1f:59:4d:0e:c2:09:48:41:3a: +21:d7:3e:6e:51:4f:68:0e:2f:5c:62:03:4f:05:eb: +ce:15:19:c3:85:cd:b2:68:96:3a:54:06:27:23:e0: +fe:e8:9e:48:53:a6:1d:d2:26:86:fe:24:9c:e2:c5: +78:6c:5a:f4:6b:17:0f:a6:c7:b7:48:dd:17:69:0c: +62:29:e4:85:05:f1:67:a0:ca:8b:f9:d7:7d:19:bd: +d0:3d:94:a5:94:17:15:0f + """ + p_str = """ +00:b7:dd:f2:0c:84:a5:53:c0:d1:92:3a:f4:aa:77: +9f:22:5c:bb:93:74:65:9d:ca:d4:af:61:95:e4:0b: +36:a2:84:71:93:a1:ed:af:c2:d8:9d:53:3d:d9:87: +4c:b2:74:ac:0c:01:67:59:d6:c6:70:11:4a:04:69: +87:38:86:0c:5b:29:28:26:10:c1:87:12:33:3f:0a: +a0:58:2f:5d:b5:e9:b9:c8:72:a0:50:02:89:0d:8b: +a9:99:dc:e4:c6:a4:b8:b4:2d:2d:c4:1c:89:26:06: +62:3d:f3:99:97:58:32:86:bd:d3:81:75:68:35:ab: +f8:3c:50:23:a0:d5:0b:7f:db + """ + q_str = """ +00:86:a5:cc:08:9e:9f:40:ad:c6:d8:ef:52:df:f0: +82:ff:25:59:5c:2b + """ + g_str = """ +51:5d:13:a5:dd:1d:a4:85:7e:e5:d7:42:d0:8c:31: +20:a3:70:75:23:38:d7:53:f8:cf:31:c3:01:97:a5: +ce:fa:70:49:5f:1a:ff:b1:c6:ea:f0:08:e2:bf:b2: +d3:9c:6a:52:8e:0a:f2:1e:db:df:8f:cf:3b:91:fb: +e8:f1:06:d2:4b:79:29:de:fa:b9:b9:2a:88:ba:2e: +c4:ee:bd:e3:82:e5:9a:2e:3e:b5:e8:01:b5:1d:63: +9c:b5:72:54:8e:ab:22:69:b6:70:b2:9d:a1:d3:d8: +07:4f:39:87:11:70:4e:9a:20:11:bb:cc:45:c4:a0: +07:c6:cb:a8:ee:89:c0:6f + """ + + key = DSA.importKey(x509_v3_cert) + for comp_name in ('y', 'p', 'q', 'g'): + comp_str = locals()[comp_name + "_str"] + comp = int(re.sub("[^0-9a-f]", "", comp_str), 16) + self.assertEqual(getattr(key, comp_name), comp) + self.assertFalse(key.has_private()) + + +if __name__ == '__main__': + unittest.main() + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ImportKeyTests) + tests += list_test_cases(ImportKeyFromX509Cert) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py new file mode 100644 index 0000000..9e3d6ad --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py @@ -0,0 +1,2653 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os +import errno +import warnings +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import bord, tostr, FileNotFoundError +from Cryptodome.Util.asn1 import DerSequence, DerBitString +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.PublicKey import ECC + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +class MissingTestVectorException(ValueError): + pass + + +def load_file(file_name, mode="rb"): + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + dir_comps = ("PublicKey", "ECC") + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name, mode) as file_in: + results = file_in.read() + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for ECC", + UserWarning, + stacklevel=2) + + if results is None: + raise MissingTestVectorException("Missing %s" % file_name) + + return results + + +def compact(lines): + ext = b"".join(lines) + return unhexlify(tostr(ext).replace(" ", "").replace(":", "")) + + +def create_ref_keys_p192(): + key_len = 24 + key_lines = load_file("ecc_p192.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:4])) + public_key_xy = compact(key_lines[5:9]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-192", d=private_key_d), + ECC.construct(curve="P-192", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p224(): + key_len = 28 + key_lines = load_file("ecc_p224.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:4])) + public_key_xy = compact(key_lines[5:9]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-224", d=private_key_d), + ECC.construct(curve="P-224", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p256(): + key_len = 32 + key_lines = load_file("ecc_p256.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:5])) + public_key_xy = compact(key_lines[6:11]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-256", d=private_key_d), + ECC.construct(curve="P-256", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p384(): + key_len = 48 + key_lines = load_file("ecc_p384.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:6])) + public_key_xy = compact(key_lines[7:14]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-384", d=private_key_d), + ECC.construct(curve="P-384", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p521(): + key_len = 66 + key_lines = load_file("ecc_p521.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:7])) + public_key_xy = compact(key_lines[8:17]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-521", d=private_key_d), + ECC.construct(curve="P-521", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_ed25519(): + key_lines = load_file("ecc_ed25519.txt").splitlines() + seed = compact(key_lines[5:8]) + key = ECC.construct(curve="Ed25519", seed=seed) + return (key, key.public_key()) + + +def create_ref_keys_ed448(): + key_lines = load_file("ecc_ed448.txt").splitlines() + seed = compact(key_lines[6:10]) + key = ECC.construct(curve="Ed448", seed=seed) + return (key, key.public_key()) + + +# Create reference key pair +# ref_private, ref_public = create_ref_keys_p521() + +def get_fixed_prng(): + return SHAKE128.new().update(b"SEED").read + + +def extract_bitstring_from_spki(data): + seq = DerSequence() + seq.decode(data) + bs = DerBitString() + bs.decode(seq[1]) + return bs.value + + +class TestImport(unittest.TestCase): + + def test_empty(self): + self.assertRaises(ValueError, ECC.import_key, b"") + + def test_mismatch(self): + # The private key does not match the public key + mismatch = """-----BEGIN PRIVATE KEY----- +MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJChZANiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXk= +-----END PRIVATE KEY-----""" + self.assertRaises(ValueError, ECC.import_key, mismatch) + + +class TestImport_P192(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P192, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p192() + + def test_import_public_der(self): + key_file = load_file("ecc_p192_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P192') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p192_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P192') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p192_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p192_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p192_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p192_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p192_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p192_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p192_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p192_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestImport_P224(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P224, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p224() + + def test_import_public_der(self): + key_file = load_file("ecc_p224_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P224') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p224_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P224') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p224_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p224_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p224_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p224_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p224_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p224_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p224_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p224_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestImport_P256(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P256, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p256() + + def test_import_public_der(self): + key_file = load_file("ecc_p256_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P256') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p256_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P256') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p256_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p256_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p256_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p256_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p256_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p256_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_with_ecparams(self): + key_file = load_file("ecc_p256_private_ecparams.pem") + key = ECC.import_key(key_file) + # We just check if the import succeeds + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p256_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p256_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p256_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p256_private_openssh.pem") + key_file_old = load_file("ecc_p256_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p256_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p256_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestImport_P384(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P384, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p384() + + def test_import_public_der(self): + key_file = load_file("ecc_p384_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P384') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p384_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P384') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p384_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p384_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p384_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p384_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p384_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p384_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p384_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p384_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p384_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p384_private_openssh.pem") + key_file_old = load_file("ecc_p384_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p384_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p384_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestImport_P521(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P521, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p521() + + def test_import_public_der(self): + key_file = load_file("ecc_p521_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P521') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p521_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P521') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p521_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p521_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p521_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p521_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p521_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p521_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p521_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p521_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p521_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p521_private_openssh.pem") + key_file_old = load_file("ecc_p521_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p521_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p521_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestExport_P192(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P192, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p192() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p192_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p192_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p192_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p192_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p192_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p192_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p192_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p192_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p192_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p192_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + def test_compressed_curve(self): + + # Compressed P-192 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MF8CAQEEGHvhXmIW95JxZYfd4AUPu9BwknjuvS36aqAKBggqhkjOPQMBAaE0AzIA + BLJZCyTu35DQIlqvMlBynn3k1Ig+dWfg/brRhHecxptrbloqFSP8ITw0CwbGF+2X + 5g== + -----END EC PRIVATE KEY-----""" + + # Compressed P-192 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MF8CAQEEGA3rAotUaWl7d47eX6tz9JmLzOMJwl13XaAKBggqhkjOPQMBAaE0AzIA + BG4tHlTBBBGokcWmGm2xubVB0NvPC/Ou5AYwivs+3iCxmEjsymVAj6iiuX2Lxr6g + /Q== + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x97E6) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0xA0FD) + + +class TestExport_P224(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P224, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p224() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p224_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p224_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p224_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p224_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p224_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p224_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p224_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p224_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p224_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p224_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + def test_compressed_curve(self): + + # Compressed P-224 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MGgCAQEEHPYicBNI9nd6wDKAX2l+f3A0Q+KWUQeMqSt5GoOgBwYFK4EEACGhPAM6 + AATCL6rUIDT14zXKoS5GQUMDP/tpc+1iI/FyEZikt2roKDkhU5q08srmqaysbfJN + eUr7Xf1lnCVGag== + -----END EC PRIVATE KEY-----""" + + # Compressed P-224 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MGgCAQEEHEFjbaVPLJ3ngZyCibCvT0RLUqSlHjC5Z3e0FtugBwYFK4EEACGhPAM6 + AAT5IvL2V6m48y1JLMGr6ZbnOqNKP9hMf9mxyVkk6/SaRoBoJVkXrNIpYL0P7DS7 + QF8E/OGeZRwvow== + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x466A) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x2FA3) + + +class TestExport_P256(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P256, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p256() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p256_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p256_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p256_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p256_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p256_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p256_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p256_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p256_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p256_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p256_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p256_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p256_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + + def test_compressed_curve(self): + + # Compressed P-256 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MFcCAQEEIHTuc09jC51xXomV6MVCDN+DpAAvSmaJWZPTEHM6D5H1oAoGCCqGSM49 + AwEHoSQDIgACWFuGbHe8yJ43rir7PMTE9w8vHz0BSpXHq90Xi7/s+a0= + -----END EC PRIVATE KEY-----""" + + # Compressed P-256 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MFcCAQEEIFggiPN9SQP+FAPTCPp08fRUz7rHp2qNBRcBJ1DXhb3ZoAoGCCqGSM49 + AwEHoSQDIgADLpph1trTIlVfa8NJvlMUPyWvL+wP+pW3BJITUL/wj9A= + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0xA6FC) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x6E57) + + +class TestExport_P384(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P384, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p384() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p384_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p384_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p384_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p384_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p384_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p384_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p384_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p384_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p384_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p384_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p384_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p384_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + def test_compressed_curve(self): + + # Compressed P-384 curve (Y-point is even) + # openssl ecparam -name secp384p1 -genkey -noout -conv_form compressed -out /tmp/a.pem + # openssl ec -in /tmp/a.pem -text -noout + pem1 = """-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDAM0lEIhvXuekK2SWtdbgOcZtBaxa9TxfpO/GcDFZLCJ3JVXaTgwken +QT+C+XLtD6WgBwYFK4EEACKhZANiAATs0kZMhFDu8DoBC21jrSDPyAUn4aXZ/DM4 +ylhDfWmb4LEbeszXceIzfhIUaaGs5y1xXaqf5KXTiAAYx2pKUzAAM9lcGUHCGKJG +k4AgUmVJON29XoUilcFrzjDmuye3B6Q= +-----END EC PRIVATE KEY-----""" + + # Compressed P-384 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDDHPFTslYLltE16fHdSDTtE/2HTmd3M8mqy5MttAm4wZ833KXiGS9oe +kFdx9sNV0KygBwYFK4EEACKhZANiAASLIE5RqVMtNhtBH/u/p/ifqOAlKnK/+RrQ +YC46ZRsnKNayw3wATdPjgja7L/DSII3nZK0G6KOOVwJBznT/e+zudUJYhZKaBLRx +/bgXyxUtYClOXxb1Y/5N7txLstYRyP0= +-----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x07a4) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0xc8fd) + + +class TestExport_P521(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P521, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p521() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p521_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p521_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + encoded = self.ref_public.export_key(format="raw") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p521_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p521_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + encoded = self.ref_public.export_key(format="raw", compress=True) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p521_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p521_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p521_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p521_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p521_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p521_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p521_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p521_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + def test_compressed_curve(self): + + # Compressed P-521 curve (Y-point is even) + # openssl ecparam -name secp521r1 -genkey -noout -conv_form compressed -out /tmp/a.pem + # openssl ec -in /tmp/a.pem -text -noout + pem1 = """-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIAnm1CEjVjvNfXEN730p+D6su5l+mOztdc5XmTEoti+s2R4GQ4mAv3 +0zYLvyklvOHw0+yy8d0cyGEJGb8T3ZVKmg2gBwYFK4EEACOhgYkDgYYABAHzjTI1 +ckxQ3Togi0LAxiG0PucdBBBs5oIy3df95xv6SInp70z+4qQ2EltEmdNMssH8eOrl +M5CYdZ6nbcHMVaJUvQEzTrYxvFjOgJiOd+E9eBWbLkbMNqsh1UKVO6HbMbW0ohCI +uGxO8tM6r3w89/qzpG2SvFM/fvv3mIR30wSZDD84qA== +-----END EC PRIVATE KEY-----""" + + # Compressed P-521 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIB84OfhJluLBRLn3+cC/RQ37C2SfQVP/t0gQK2tCsTf5avRcWYRrOJ +PmX9lNnkC0Hobd75QFRmdxrB0Wd1/M4jZOWgBwYFK4EEACOhgYkDgYYABAAMZcdJ +1YLCGHt3bHCEzdidVy6+brlJIbv1aQ9fPQLF7WKNv4c8w3H8d5a2+SDZilBOsk5c +6cNJDMz2ExWQvxl4CwDJtJGt1+LHVKFGy73NANqVxMbRu+2F8lOxkNp/ziFTbVyV +vv6oYkMIIi7r5oQWAiQDrR2mlrrFDL9V7GH/r8SWQw== +-----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x38a8) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x9643) + + +class TestImport_Ed25519(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_Ed25519, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed25519() + + def test_import_public_der(self): + key_file = load_file("ecc_ed25519_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_pkcs8_der(self): + key_file = load_file("ecc_ed25519_private.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_ed25519_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_ed25519_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_ed25519_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_ed25519_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_ed25519_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256": + key_file = load_file("ecc_ed25519_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_ed25519_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_ed25519_public_openssh.txt") + key = ECC._import_openssh_public(key_file) + self.failIf(key.has_private()) + key = ECC.import_key(key_file) + self.failIf(key.has_private()) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_ed25519_private_openssh.pem") + key = ECC.import_key(key_file) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_ed25519_private_openssh_pwd.pem") + key = ECC.import_key(key_file, b"password") + + +class TestExport_Ed25519(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_Ed25519, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed25519() + + def test_export_public_der(self): + key_file = load_file("ecc_ed25519_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(True) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_sec1(self): + self.assertRaises(ValueError, self.ref_public.export_key, format="SEC1") + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_ed25519_private.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + self.assertRaises(ValueError, self.ref_private.export_key, + format="DER", use_pkcs8=False) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem(self): + key_file_ref = load_file("ecc_ed25519_public.pem", "rt").strip() + key_file = self.ref_public.export_key(format="PEM").strip() + self.assertEqual(key_file_ref, key_file) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_ed25519_private.pem", "rt").strip() + encoded = self.ref_private.export_key(format="PEM").strip() + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh(self): + key_file = load_file("ecc_ed25519_public_openssh.txt", "rt") + public_key = ECC.import_key(key_file) + key_file = " ".join(key_file.split(' ')[:2]) # remove comment + + encoded = public_key._export_openssh(False) + self.assertEqual(key_file, encoded.strip()) + + encoded = public_key.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded.strip()) + + def test_export_raw(self): + encoded = self.ref_public.export_key(format='raw') + self.assertEqual(encoded, unhexlify(b'bc85b8cf585d20a4de47e84d1cb6183f63d9ba96223fcbc886e363ffdea20cff')) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + +class TestImport_Ed448(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_Ed448, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed448() + + def test_import_public_der(self): + key_file = load_file("ecc_ed448_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_pkcs8_der(self): + key_file = load_file("ecc_ed448_private.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_ed448_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_ed448_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_ed448_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_ed448_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_ed448_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256": + key_file = load_file("ecc_ed448_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_ed448_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestExport_Ed448(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_Ed448, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed448() + + def test_export_public_der(self): + key_file = load_file("ecc_ed448_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(True) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_sec1(self): + self.assertRaises(ValueError, self.ref_public.export_key, format="SEC1") + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_ed448_private.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + self.assertRaises(ValueError, self.ref_private.export_key, + format="DER", use_pkcs8=False) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem(self): + key_file_ref = load_file("ecc_ed448_public.pem", "rt").strip() + key_file = self.ref_public.export_key(format="PEM").strip() + self.assertEqual(key_file_ref, key_file) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_ed448_private.pem", "rt").strip() + encoded = self.ref_private.export_key(format="PEM").strip() + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh(self): + # Not supported + self.assertRaises(ValueError, self.ref_public.export_key, format="OpenSSH") + + def test_export_raw(self): + encoded = self.ref_public.export_key(format='raw') + self.assertEqual(encoded, unhexlify(b'899014ddc0a0e1260cfc1085afdf952019e9fd63372e3e366e26dad32b176624884330a14617237e3081febd9d1a15069e7499433d2f55dd80')) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestImport) + try: + tests += list_test_cases(TestImport_P192) + tests += list_test_cases(TestImport_P224) + tests += list_test_cases(TestImport_P256) + tests += list_test_cases(TestImport_P384) + tests += list_test_cases(TestImport_P521) + tests += list_test_cases(TestImport_Ed25519) + tests += list_test_cases(TestImport_Ed448) + + tests += list_test_cases(TestExport_P192) + tests += list_test_cases(TestExport_P224) + tests += list_test_cases(TestExport_P256) + tests += list_test_cases(TestExport_P384) + tests += list_test_cases(TestExport_P521) + tests += list_test_cases(TestExport_Ed25519) + tests += list_test_cases(TestExport_Ed448) + + except MissingTestVectorException: + pass + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py new file mode 100644 index 0000000..a1a2238 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py @@ -0,0 +1,590 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_importKey.py: Self-test for importing RSA keys +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import os +import re +import errno +import warnings +import unittest + +from Cryptodome.PublicKey import RSA +from Cryptodome.SelfTest.st_common import a2b_hex, list_test_cases +from Cryptodome.Util.py3compat import b, tostr, FileNotFoundError +from Cryptodome.Util.number import inverse +from Cryptodome.Util import asn1 + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +def load_file(file_name, mode="rb"): + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + dir_comps = ("PublicKey", "RSA") + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name, mode) as file_in: + results = file_in.read() + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for RSA", + UserWarning, + stacklevel=2) + + return results + + +def der2pem(der, text='PUBLIC'): + import binascii + chunks = [binascii.b2a_base64(der[i:i+48]) for i in range(0, len(der), 48)] + pem = b('-----BEGIN %s KEY-----\n' % text) + pem += b('').join(chunks) + pem += b('-----END %s KEY-----' % text) + return pem + + +class ImportKeyTests(unittest.TestCase): + # 512-bit RSA key generated with openssl + rsaKeyPEM = u'''-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+TLr7UkvEtFrRhDDKMtuII +q19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQJACUSDEp8RTe32ftq8IwG8 +Wojl5mAd1wFiIOrZ/Uv8b963WJOJiuQcVN29vxU5+My9GPZ7RA3hrDBEAoHUDPrI +OQIhAPIPLz4dphiD9imAkivY31Rc5AfHJiQRA7XixTcjEkojAiEAyh/pJHks/Mlr ++rdPNEpotBjfV4M4BkgGAA/ipcmaAjcCIQCHvhwwKVBLzzTscT2HeUdEeBMoiXXK +JACAr3sJQJGxIQIgarRp+m1WSKV1MciwMaTOnbU7wxFs9DP1pva76lYBzgUCIQC9 +n0CnZCJ6IZYqSt0H5N7+Q+2Ro64nuwV/OSQfM6sBwQ== +-----END RSA PRIVATE KEY-----''' + + # As above, but this is actually an unencrypted PKCS#8 key + rsaKeyPEM8 = u'''-----BEGIN PRIVATE KEY----- +MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvx4nkAqgiyNRGlwS +ga5tkzEsPv6RP5MuvtSS8S0WtGEMMoy24girX0WsvilQgzKY8xIsGfeEkt7fQPDj +wZAzhQIDAQABAkAJRIMSnxFN7fZ+2rwjAbxaiOXmYB3XAWIg6tn9S/xv3rdYk4mK +5BxU3b2/FTn4zL0Y9ntEDeGsMEQCgdQM+sg5AiEA8g8vPh2mGIP2KYCSK9jfVFzk +B8cmJBEDteLFNyMSSiMCIQDKH+kkeSz8yWv6t080Smi0GN9XgzgGSAYAD+KlyZoC +NwIhAIe+HDApUEvPNOxxPYd5R0R4EyiJdcokAICvewlAkbEhAiBqtGn6bVZIpXUx +yLAxpM6dtTvDEWz0M/Wm9rvqVgHOBQIhAL2fQKdkInohlipK3Qfk3v5D7ZGjrie7 +BX85JB8zqwHB +-----END PRIVATE KEY-----''' + + # The same RSA private key as in rsaKeyPEM, but now encrypted + rsaKeyEncryptedPEM = ( + + # PEM encryption + # With DES and passphrase 'test' + ('test', u'''-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-CBC,AF8F9A40BD2FA2FC + +Ckl9ex1kaVEWhYC2QBmfaF+YPiR4NFkRXA7nj3dcnuFEzBnY5XULupqQpQI3qbfA +u8GYS7+b3toWWiHZivHbAAUBPDIZG9hKDyB9Sq2VMARGsX1yW1zhNvZLIiVJzUHs +C6NxQ1IJWOXzTew/xM2I26kPwHIvadq+/VaT8gLQdjdH0jOiVNaevjWnLgrn1mLP +BCNRMdcexozWtAFNNqSzfW58MJL2OdMi21ED184EFytIc1BlB+FZiGZduwKGuaKy +9bMbdb/1PSvsSzPsqW7KSSrTw6MgJAFJg6lzIYvR5F4poTVBxwBX3+EyEmShiaNY +IRX3TgQI0IjrVuLmvlZKbGWP18FXj7I7k9tSsNOOzllTTdq3ny5vgM3A+ynfAaxp +dysKznQ6P+IoqML1WxAID4aGRMWka+uArOJ148Rbj9s= +-----END RSA PRIVATE KEY-----'''), + + # PKCS8 encryption + ('winter', u'''-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIBpjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIeZIsbW3O+JcCAggA +MBQGCCqGSIb3DQMHBAgSM2p0D8FilgSCAWBhFyP2tiGKVpGj3mO8qIBzinU60ApR +3unvP+N6j7LVgnV2lFGaXbJ6a1PbQXe+2D6DUyBLo8EMXrKKVLqOMGkFMHc0UaV6 +R6MmrsRDrbOqdpTuVRW+NVd5J9kQQh4xnfU/QrcPPt7vpJvSf4GzG0n666Ki50OV +M/feuVlIiyGXY6UWdVDpcOV72cq02eNUs/1JWdh2uEBvA9fCL0c07RnMrdT+CbJQ +NjJ7f8ULtp7xvR9O3Al/yJ4Wv3i4VxF1f3MCXzhlUD4I0ONlr0kJWgeQ80q/cWhw +ntvgJwnCn2XR1h6LA8Wp+0ghDTsL2NhJpWd78zClGhyU4r3hqu1XDjoXa7YCXCix +jCV15+ViDJzlNCwg+W6lRg18sSLkCT7alviIE0U5tHc6UPbbHwT5QqAxAABaP+nZ +CGqJGyiwBzrKebjgSm/KRd4C91XqcsysyH2kKPfT51MLAoD4xelOURBP +-----END ENCRYPTED PRIVATE KEY-----''' + ), + ) + + rsaPublicKeyPEM = u'''-----BEGIN PUBLIC KEY----- +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+T +Lr7UkvEtFrRhDDKMtuIIq19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQ== +-----END PUBLIC KEY-----''' + + # Obtained using 'ssh-keygen -i -m PKCS8 -f rsaPublicKeyPEM' + rsaPublicKeyOpenSSH = b('''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQC/HieQCqCLI1EaXBKBrm2TMSw+/pE/ky6+1JLxLRa0YQwyjLbiCKtfRay+KVCDMpjzEiwZ94SS3t9A8OPBkDOF comment\n''') + + # The private key, in PKCS#1 format encoded with DER + rsaKeyDER = a2b_hex( + '''3082013b020100024100bf1e27900aa08b23511a5c1281ae6d93312c3efe + 913f932ebed492f12d16b4610c328cb6e208ab5f45acbe2950833298f312 + 2c19f78492dedf40f0e3c190338502030100010240094483129f114dedf6 + 7edabc2301bc5a88e5e6601dd7016220ead9fd4bfc6fdeb75893898ae41c + 54ddbdbf1539f8ccbd18f67b440de1ac30440281d40cfac839022100f20f + 2f3e1da61883f62980922bd8df545ce407c726241103b5e2c53723124a23 + 022100ca1fe924792cfcc96bfab74f344a68b418df578338064806000fe2 + a5c99a023702210087be1c3029504bcf34ec713d877947447813288975ca + 240080af7b094091b12102206ab469fa6d5648a57531c8b031a4ce9db53b + c3116cf433f5a6f6bbea5601ce05022100bd9f40a764227a21962a4add07 + e4defe43ed91a3ae27bb057f39241f33ab01c1 + '''.replace(" ","")) + + # The private key, in unencrypted PKCS#8 format encoded with DER + rsaKeyDER8 = a2b_hex( + '''30820155020100300d06092a864886f70d01010105000482013f3082013 + b020100024100bf1e27900aa08b23511a5c1281ae6d93312c3efe913f932 + ebed492f12d16b4610c328cb6e208ab5f45acbe2950833298f3122c19f78 + 492dedf40f0e3c190338502030100010240094483129f114dedf67edabc2 + 301bc5a88e5e6601dd7016220ead9fd4bfc6fdeb75893898ae41c54ddbdb + f1539f8ccbd18f67b440de1ac30440281d40cfac839022100f20f2f3e1da + 61883f62980922bd8df545ce407c726241103b5e2c53723124a23022100c + a1fe924792cfcc96bfab74f344a68b418df578338064806000fe2a5c99a0 + 23702210087be1c3029504bcf34ec713d877947447813288975ca240080a + f7b094091b12102206ab469fa6d5648a57531c8b031a4ce9db53bc3116cf + 433f5a6f6bbea5601ce05022100bd9f40a764227a21962a4add07e4defe4 + 3ed91a3ae27bb057f39241f33ab01c1 + '''.replace(" ","")) + + rsaPublicKeyDER = a2b_hex( + '''305c300d06092a864886f70d0101010500034b003048024100bf1e27900a + a08b23511a5c1281ae6d93312c3efe913f932ebed492f12d16b4610c328c + b6e208ab5f45acbe2950833298f3122c19f78492dedf40f0e3c190338502 + 03010001 + '''.replace(" ","")) + + n = int('BF 1E 27 90 0A A0 8B 23 51 1A 5C 12 81 AE 6D 93 31 2C 3E FE 91 3F 93 2E BE D4 92 F1 2D 16 B4 61 0C 32 8C B6 E2 08 AB 5F 45 AC BE 29 50 83 32 98 F3 12 2C 19 F7 84 92 DE DF 40 F0 E3 C1 90 33 85'.replace(" ",""),16) + e = 65537 + d = int('09 44 83 12 9F 11 4D ED F6 7E DA BC 23 01 BC 5A 88 E5 E6 60 1D D7 01 62 20 EA D9 FD 4B FC 6F DE B7 58 93 89 8A E4 1C 54 DD BD BF 15 39 F8 CC BD 18 F6 7B 44 0D E1 AC 30 44 02 81 D4 0C FA C8 39'.replace(" ",""),16) + p = int('00 F2 0F 2F 3E 1D A6 18 83 F6 29 80 92 2B D8 DF 54 5C E4 07 C7 26 24 11 03 B5 E2 C5 37 23 12 4A 23'.replace(" ",""),16) + q = int('00 CA 1F E9 24 79 2C FC C9 6B FA B7 4F 34 4A 68 B4 18 DF 57 83 38 06 48 06 00 0F E2 A5 C9 9A 02 37'.replace(" ",""),16) + + # This is q^{-1} mod p). fastmath and slowmath use pInv (p^{-1} + # mod q) instead! + qInv = int('00 BD 9F 40 A7 64 22 7A 21 96 2A 4A DD 07 E4 DE FE 43 ED 91 A3 AE 27 BB 05 7F 39 24 1F 33 AB 01 C1'.replace(" ",""),16) + pInv = inverse(p,q) + + def testImportKey1(self): + """Verify import of RSAPrivateKey DER SEQUENCE""" + key = RSA.importKey(self.rsaKeyDER) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey2(self): + """Verify import of SubjectPublicKeyInfo DER SEQUENCE""" + key = RSA.importKey(self.rsaPublicKeyDER) + self.assertFalse(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey3unicode(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as unicode""" + key = RSA.importKey(self.rsaKeyPEM) + self.assertEqual(key.has_private(),True) # assert_ + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey3bytes(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as byte string""" + key = RSA.importKey(b(self.rsaKeyPEM)) + self.assertEqual(key.has_private(),True) # assert_ + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey4unicode(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as unicode""" + key = RSA.importKey(self.rsaPublicKeyPEM) + self.assertEqual(key.has_private(),False) # assertFalse + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey4bytes(self): + """Verify import of SubjectPublicKeyInfo DER SEQUENCE, encoded with PEM as byte string""" + key = RSA.importKey(b(self.rsaPublicKeyPEM)) + self.assertEqual(key.has_private(),False) # assertFalse + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey5(self): + """Verifies that the imported key is still a valid RSA pair""" + key = RSA.importKey(self.rsaKeyPEM) + idem = key._encrypt(key._decrypt(89)) + self.assertEqual(idem, 89) + + def testImportKey6(self): + """Verifies that the imported key is still a valid RSA pair""" + key = RSA.importKey(self.rsaKeyDER) + idem = key._encrypt(key._decrypt(65)) + self.assertEqual(idem, 65) + + def testImportKey7(self): + """Verify import of OpenSSH public key""" + key = RSA.importKey(self.rsaPublicKeyOpenSSH) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey8(self): + """Verify import of encrypted PrivateKeyInfo DER SEQUENCE""" + for t in self.rsaKeyEncryptedPEM: + key = RSA.importKey(t[1], t[0]) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey9(self): + """Verify import of unencrypted PrivateKeyInfo DER SEQUENCE""" + key = RSA.importKey(self.rsaKeyDER8) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey10(self): + """Verify import of unencrypted PrivateKeyInfo DER SEQUENCE, encoded with PEM""" + key = RSA.importKey(self.rsaKeyPEM8) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey11(self): + """Verify import of RSAPublicKey DER SEQUENCE""" + der = asn1.DerSequence([17, 3]).encode() + key = RSA.importKey(der) + self.assertEqual(key.n, 17) + self.assertEqual(key.e, 3) + + def testImportKey12(self): + """Verify import of RSAPublicKey DER SEQUENCE, encoded with PEM""" + der = asn1.DerSequence([17, 3]).encode() + pem = der2pem(der) + key = RSA.importKey(pem) + self.assertEqual(key.n, 17) + self.assertEqual(key.e, 3) + + def test_import_key_windows_cr_lf(self): + pem_cr_lf = "\r\n".join(self.rsaKeyPEM.splitlines()) + key = RSA.importKey(pem_cr_lf) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def test_import_empty(self): + self.assertRaises(ValueError, RSA.import_key, b"") + + ### + def testExportKey1(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + derKey = key.export_key("DER") + self.assertEqual(derKey, self.rsaKeyDER) + + def testExportKey2(self): + key = RSA.construct([self.n, self.e]) + derKey = key.export_key("DER") + self.assertEqual(derKey, self.rsaPublicKeyDER) + + def testExportKey3(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + pemKey = key.export_key("PEM") + self.assertEqual(pemKey, b(self.rsaKeyPEM)) + + def testExportKey4(self): + key = RSA.construct([self.n, self.e]) + pemKey = key.export_key("PEM") + self.assertEqual(pemKey, b(self.rsaPublicKeyPEM)) + + def testExportKey5(self): + key = RSA.construct([self.n, self.e]) + openssh_1 = key.export_key("OpenSSH").split() + openssh_2 = self.rsaPublicKeyOpenSSH.split() + self.assertEqual(openssh_1[0], openssh_2[0]) + self.assertEqual(openssh_1[1], openssh_2[1]) + + def testExportKey7(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + derKey = key.export_key("DER", pkcs=8) + self.assertEqual(derKey, self.rsaKeyDER8) + + def testExportKey8(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + pemKey = key.export_key("PEM", pkcs=8) + self.assertEqual(pemKey, b(self.rsaKeyPEM8)) + + def testExportKey9(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertRaises(ValueError, key.export_key, "invalid-format") + + def testExportKey10(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#1, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test') + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN RSA PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey11(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#1, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=1) + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN RSA PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey12(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#8, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=8) + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey13(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#8, PKCS#8 encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=8, + protection='PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC') + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')==-1) + self.assertTrue(tostr(outkey).find('BEGIN ENCRYPTED PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey14(self): + # Export and re-import the encrypted key. It must match. + # DER envelope, PKCS#8, PKCS#8 encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('DER', 'test', pkcs=8) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey15(self): + # Verify that that error an condition is detected when trying to + # use a password with DER encoding and PKCS#1. + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertRaises(ValueError, key.export_key, 'DER', 'test', 1) + + def test_import_key(self): + """Verify that import_key is an alias to importKey""" + key = RSA.import_key(self.rsaPublicKeyDER) + self.assertFalse(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def test_import_key_ba_mv(self): + """Verify that import_key can be used on bytearrays and memoryviews""" + key = RSA.import_key(bytearray(self.rsaPublicKeyDER)) + key = RSA.import_key(memoryview(self.rsaPublicKeyDER)) + + def test_exportKey(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertEqual(key.export_key(), key.exportKey()) + + +class ImportKeyFromX509Cert(unittest.TestCase): + + def test_x509v1(self): + + # Sample V1 certificate with a 1024 bit RSA key + x509_v1_cert = """ +-----BEGIN CERTIFICATE----- +MIICOjCCAaMCAQEwDQYJKoZIhvcNAQEEBQAwfjENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxHDAaBgkqhkiG9w0BCQEWDXNwYW1AYWNtZS5vcmcxEzARBgNVBAcT +Ck1ldHJvcG9saXMxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYDVQQGEwJVUzENMAsG +A1UEAxMEdGVzdDAeFw0xNDA3MTExOTU3MjRaFw0xNzA0MDYxOTU3MjRaME0xCzAJ +BgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxDzANBgNVBAMTBmxhdHZpYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAyG+kytdRj3TFbRmHDYp3TXugVQ81chew0qeOxZWOz80IjtWpgdOaCvKW +NCuc8wUR9BWrEQW+39SaRMLiQfQtyFSQZijc3nsEBu/Lo4uWZ0W/FHDRVSvkJA/V +Ex5NL5ikI+wbUeCV5KajGNDalZ8F1pk32+CBs8h1xNx5DyxuEHUCAwEAATANBgkq +hkiG9w0BAQQFAAOBgQCVQF9Y//Q4Psy+umEM38pIlbZ2hxC5xNz/MbVPwuCkNcGn +KYNpQJP+JyVTsPpO8RLZsAQDzRueMI3S7fbbwTzAflN0z19wvblvu93xkaBytVok +9VBAH28olVhy9b1MMeg2WOt5sUEQaFNPnwwsyiY9+HsRpvpRnPSQF+kyYVsshQ== +-----END CERTIFICATE----- + """.strip() + + # RSA public key as dumped by openssl + exponent = 65537 + modulus_str = """ +00:c8:6f:a4:ca:d7:51:8f:74:c5:6d:19:87:0d:8a: +77:4d:7b:a0:55:0f:35:72:17:b0:d2:a7:8e:c5:95: +8e:cf:cd:08:8e:d5:a9:81:d3:9a:0a:f2:96:34:2b: +9c:f3:05:11:f4:15:ab:11:05:be:df:d4:9a:44:c2: +e2:41:f4:2d:c8:54:90:66:28:dc:de:7b:04:06:ef: +cb:a3:8b:96:67:45:bf:14:70:d1:55:2b:e4:24:0f: +d5:13:1e:4d:2f:98:a4:23:ec:1b:51:e0:95:e4:a6: +a3:18:d0:da:95:9f:05:d6:99:37:db:e0:81:b3:c8: +75:c4:dc:79:0f:2c:6e:10:75 + """ + modulus = int(re.sub("[^0-9a-f]","", modulus_str), 16) + + key = RSA.importKey(x509_v1_cert) + self.assertEqual(key.e, exponent) + self.assertEqual(key.n, modulus) + self.assertFalse(key.has_private()) + + def test_x509v3(self): + + # Sample V3 certificate with a 1024 bit RSA key + x509_v3_cert = """ +-----BEGIN CERTIFICATE----- +MIIEcjCCAlqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL +MAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEQMA4GA1UEAwwHVGVzdCBD +QTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0xNDA3MTIwOTM1 +MTJaFw0xNzA0MDcwOTM1MTJaMEQxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJNRDES +MBAGA1UEBwwJQmFsdGltb3JlMRQwEgYDVQQDDAtUZXN0IFNlcnZlcjCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA/S7GJV2OcFdyNMQ4K75KrYFtMEn3VnEFdPHa +jyS37XlMxSh0oS4GeTGVUCJInl5Cpsv8WQdh03FfeOdvzp5IZ46OcjeOPiWnmjgl +2G5j7e2bDH7RSchGV+OD6Fb1Agvuu2/9iy8fdf3rPQ/7eAddzKUrzwacVbnW+tg2 +QtSXKRcCAwEAAaOB1TCB0jAdBgNVHQ4EFgQU/WwCX7FfWMIPDFfJ+I8a2COG+l8w +HwYDVR0jBBgwFoAUa0hkif3RMaraiWtsOOZZlLu9wJwwCQYDVR0TBAIwADALBgNV +HQ8EBAMCBeAwSgYDVR0RBEMwQYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNv +bYIQbWFpbC5leGFtcGxlLmNvbYIPZnRwLmV4YW1wbGUuY29tMCwGCWCGSAGG+EIB +DQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsF +AAOCAgEAvO6xfdsGbnoK4My3eJthodTAjMjPwFVY133LH04QLcCv54TxKhtUg1fi +PgdjVe1HpTytPBfXy2bSZbXAN0abZCtw1rYrnn7o1g2pN8iypVq3zVn0iMTzQzxs +zEPO3bpR/UhNSf90PmCsS5rqZpAAnXSaAy1ClwHWk/0eG2pYkhE1m1ABVMN2lsAW +e9WxGk6IFqaI9O37NYQwmEypMs4DC+ECJEvbPFiqi3n0gbXCZJJ6omDA5xJldaYK +Oa7KR3s/qjBsu9UAiWpLBuFoSTHIF2aeRKRFmUdmzwo43eVPep65pY6eQ4AdL2RF +rqEuINbGlzI5oQyYhu71IwB+iPZXaZZPlwjLgOsuad/p2hOgDb5WxUi8FnDPursQ +ujfpIpmrOP/zpvvQWnwePI3lI+5n41kTBSbefXEdv6rXpHk3QRzB90uPxnXPdxSC +16ASA8bQT5an/1AgoE3k9CrcD2K0EmgaX0YI0HUhkyzbkg34EhpWJ6vvRUbRiNRo +9cIbt/ya9Y9u0Ja8GLXv6dwX0l0IdJMkL8KifXUFAVCujp1FBrr/gdmwQn8itANy ++qbnWSxmOvtaY0zcaFAcONuHva0h51/WqXOMO1eb8PhR4HIIYU8p1oBwQp7dSni8 +THDi1F+GG5PsymMDj5cWK42f+QzjVw5PrVmFqqrrEoMlx8DWh5Y= +-----END CERTIFICATE----- +""".strip() + + # RSA public key as dumped by openssl + exponent = 65537 + modulus_str = """ +00:fd:2e:c6:25:5d:8e:70:57:72:34:c4:38:2b:be: +4a:ad:81:6d:30:49:f7:56:71:05:74:f1:da:8f:24: +b7:ed:79:4c:c5:28:74:a1:2e:06:79:31:95:50:22: +48:9e:5e:42:a6:cb:fc:59:07:61:d3:71:5f:78:e7: +6f:ce:9e:48:67:8e:8e:72:37:8e:3e:25:a7:9a:38: +25:d8:6e:63:ed:ed:9b:0c:7e:d1:49:c8:46:57:e3: +83:e8:56:f5:02:0b:ee:bb:6f:fd:8b:2f:1f:75:fd: +eb:3d:0f:fb:78:07:5d:cc:a5:2b:cf:06:9c:55:b9: +d6:fa:d8:36:42:d4:97:29:17 + """ + modulus = int(re.sub("[^0-9a-f]","", modulus_str), 16) + + key = RSA.importKey(x509_v3_cert) + self.assertEqual(key.e, exponent) + self.assertEqual(key.n, modulus) + self.assertFalse(key.has_private()) + + +class TestImport_2048(unittest.TestCase): + + def test_import_openssh_public(self): + key_file_ref = load_file("rsa2048_private.pem") + key_file = load_file("rsa2048_public_openssh.txt") + + # Skip test if test vectors are not installed + if None in (key_file_ref, key_file): + return + + key_ref = RSA.import_key(key_file_ref).public_key() + key = RSA.import_key(key_file) + self.assertEqual(key_ref, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("rsa2048_private_openssh.pem") + key_file_old = load_file("rsa2048_private_openssh_old.pem") + + # Skip test if test vectors are not installed + if None in (key_file_old, key_file): + return + + key = RSA.import_key(key_file) + key_old = RSA.import_key(key_file_old) + + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("rsa2048_private_openssh_pwd.pem") + key_file_old = load_file("rsa2048_private_openssh_pwd_old.pem") + + # Skip test if test vectors are not installed + if None in (key_file_old, key_file): + return + + key = RSA.import_key(key_file, b"password") + key_old = RSA.import_key(key_file_old) + self.assertEqual(key, key_old) + + +if __name__ == '__main__': + unittest.main() + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ImportKeyTests) + tests += list_test_cases(ImportKeyFromX509Cert) + tests += list_test_cases(TestImport_2048) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py new file mode 100644 index 0000000..763ee9c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Random/__init__.py: Self-test for random number generation modules +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for random number generators""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Random import test_random; tests += test_random.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py new file mode 100644 index 0000000..30e9194 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_generic.py: Self-test for the Cryptodome.Random.new() function +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Random.new()""" + +import sys +import unittest +from Cryptodome.Util.py3compat import b + +class SimpleTest(unittest.TestCase): + def runTest(self): + """Cryptodome.Random.new()""" + # Import the Random module and try to use it + from Cryptodome import Random + randobj = Random.new() + x = randobj.read(16) + y = randobj.read(16) + self.assertNotEqual(x, y) + z = Random.get_random_bytes(16) + self.assertNotEqual(x, z) + self.assertNotEqual(y, z) + # Test the Random.random module, which + # implements a subset of Python's random API + # Not implemented: + # seed(), getstate(), setstate(), jumpahead() + # random(), uniform(), triangular(), betavariate() + # expovariate(), gammavariate(), gauss(), + # longnormvariate(), normalvariate(), + # vonmisesvariate(), paretovariate() + # weibullvariate() + # WichmannHill(), whseed(), SystemRandom() + from Cryptodome.Random import random + x = random.getrandbits(16*8) + y = random.getrandbits(16*8) + self.assertNotEqual(x, y) + # Test randrange + if x>y: + start = y + stop = x + else: + start = x + stop = y + for step in range(1,10): + x = random.randrange(start,stop,step) + y = random.randrange(start,stop,step) + self.assertNotEqual(x, y) + self.assertEqual(start <= x < stop, True) + self.assertEqual(start <= y < stop, True) + self.assertEqual((x - start) % step, 0) + self.assertEqual((y - start) % step, 0) + for i in range(10): + self.assertEqual(random.randrange(1,2), 1) + self.assertRaises(ValueError, random.randrange, start, start) + self.assertRaises(ValueError, random.randrange, stop, start, step) + self.assertRaises(TypeError, random.randrange, start, stop, step, step) + self.assertRaises(TypeError, random.randrange, start, stop, "1") + self.assertRaises(TypeError, random.randrange, "1", stop, step) + self.assertRaises(TypeError, random.randrange, 1, "2", step) + self.assertRaises(ValueError, random.randrange, start, stop, 0) + # Test randint + x = random.randint(start,stop) + y = random.randint(start,stop) + self.assertNotEqual(x, y) + self.assertEqual(start <= x <= stop, True) + self.assertEqual(start <= y <= stop, True) + for i in range(10): + self.assertEqual(random.randint(1,1), 1) + self.assertRaises(ValueError, random.randint, stop, start) + self.assertRaises(TypeError, random.randint, start, stop, step) + self.assertRaises(TypeError, random.randint, "1", stop) + self.assertRaises(TypeError, random.randint, 1, "2") + # Test choice + seq = range(10000) + x = random.choice(seq) + y = random.choice(seq) + self.assertNotEqual(x, y) + self.assertEqual(x in seq, True) + self.assertEqual(y in seq, True) + for i in range(10): + self.assertEqual(random.choice((1,2,3)) in (1,2,3), True) + self.assertEqual(random.choice([1,2,3]) in [1,2,3], True) + if sys.version_info[0] == 3: + self.assertEqual(random.choice(bytearray(b('123'))) in bytearray(b('123')), True) + self.assertEqual(1, random.choice([1])) + self.assertRaises(IndexError, random.choice, []) + self.assertRaises(TypeError, random.choice, 1) + # Test shuffle. Lacks random parameter to specify function. + # Make copies of seq + seq = range(500) + x = list(seq) + y = list(seq) + random.shuffle(x) + random.shuffle(y) + self.assertNotEqual(x, y) + self.assertEqual(len(seq), len(x)) + self.assertEqual(len(seq), len(y)) + for i in range(len(seq)): + self.assertEqual(x[i] in seq, True) + self.assertEqual(y[i] in seq, True) + self.assertEqual(seq[i] in x, True) + self.assertEqual(seq[i] in y, True) + z = [1] + random.shuffle(z) + self.assertEqual(z, [1]) + if sys.version_info[0] == 3: + z = bytearray(b('12')) + random.shuffle(z) + self.assertEqual(b('1') in z, True) + self.assertRaises(TypeError, random.shuffle, b('12')) + self.assertRaises(TypeError, random.shuffle, 1) + self.assertRaises(TypeError, random.shuffle, "11") + self.assertRaises(TypeError, random.shuffle, (1,2)) + # 2to3 wraps a list() around it, alas - but I want to shoot + # myself in the foot here! :D + # if sys.version_info[0] == 3: + # self.assertRaises(TypeError, random.shuffle, range(3)) + # Test sample + x = random.sample(seq, 20) + y = random.sample(seq, 20) + self.assertNotEqual(x, y) + for i in range(20): + self.assertEqual(x[i] in seq, True) + self.assertEqual(y[i] in seq, True) + z = random.sample([1], 1) + self.assertEqual(z, [1]) + z = random.sample((1,2,3), 1) + self.assertEqual(z[0] in (1,2,3), True) + z = random.sample("123", 1) + self.assertEqual(z[0] in "123", True) + z = random.sample(range(3), 1) + self.assertEqual(z[0] in range(3), True) + if sys.version_info[0] == 3: + z = random.sample(b("123"), 1) + self.assertEqual(z[0] in b("123"), True) + z = random.sample(bytearray(b("123")), 1) + self.assertEqual(z[0] in bytearray(b("123")), True) + self.assertRaises(TypeError, random.sample, 1) + +def get_tests(config={}): + return [SimpleTest()] + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py new file mode 100644 index 0000000..83cf0f3 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Signature/__init__.py: Self-test for signature modules +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for signature modules""" + +import unittest +from . import test_pkcs1_15, test_pss, test_dss, test_eddsa + + +def get_tests(config={}): + tests = [] + tests += test_pkcs1_15.get_tests(config=config) + tests += test_pss.get_tests(config=config) + tests += test_dss.get_tests(config=config) + tests += test_eddsa.get_tests(config=config) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py new file mode 100644 index 0000000..156ee67 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py @@ -0,0 +1,1369 @@ +# +# SelfTest/Signature/test_dss.py: Self-test for DSS signatures +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import re +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import tobytes, bord, bchr + +from Cryptodome.Hash import (SHA1, SHA224, SHA256, SHA384, SHA512, + SHA3_224, SHA3_256, SHA3_384, SHA3_512) +from Cryptodome.Signature import DSS +from Cryptodome.PublicKey import DSA, ECC +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof +from Cryptodome.Util.number import bytes_to_long, long_to_bytes + + +def t2b(hexstring): + ws = hexstring.replace(" ", "").replace("\n", "") + return unhexlify(tobytes(ws)) + + +def t2l(hexstring): + ws = hexstring.replace(" ", "").replace("\n", "") + return int(ws, 16) + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class StrRNG: + + def __init__(self, randomness): + length = len(randomness) + self._idx = 0 + # Fix required to get the right K (see how randint() works!) + self._randomness = long_to_bytes(bytes_to_long(randomness) - 1, length) + + def __call__(self, n): + out = self._randomness[self._idx:self._idx + n] + self._idx += n + return out + + +class FIPS_DSA_Tests(unittest.TestCase): + + # 1st 1024 bit key from SigGen.txt + P = 0xa8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283 + Q = 0xf85f0f83ac4df7ea0cdf8f469bfeeaea14156495 + G = 0x2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33 + X = 0xc53eae6d45323164c7d07af5715703744a63fc3a + Y = 0x313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761bbb2450b33f1b18b409ce9ab7c4cd8fda3391e8e34868357c199e16a6b2eba06d6749def791d79e95d3a4d09b24c392ad89dbf100995ae19c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32786d96f5a31aedf75364008ad4fffebb970b + + key_pub = DSA.construct((Y, G, P, Q)) + key_priv = DSA.construct((Y, G, P, Q, X)) + + def shortDescription(self): + return "FIPS DSA Tests" + + def test_loopback(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv, 'fips-186-3') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub, 'fips-186-3') + verifier.verify(hashed_msg, signature) + + def test_negative_unapproved_hashes(self): + """Verify that unapproved hashes are rejected""" + + from Cryptodome.Hash import RIPEMD160 + + self.description = "Unapproved hash (RIPEMD160) test" + hash_obj = RIPEMD160.new() + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertRaises(ValueError, signer.sign, hash_obj) + self.assertRaises(ValueError, signer.verify, hash_obj, b"\x00" * 40) + + def test_negative_unknown_modes_encodings(self): + """Verify that unknown modes/encodings are rejected""" + + self.description = "Unknown mode test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-0') + + self.description = "Unknown encoding test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-3', 'xml') + + def test_asn1_encoding(self): + """Verify ASN.1 encoding""" + + self.description = "ASN.1 encoding test" + hash_obj = SHA1.new() + signer = DSS.new(self.key_priv, 'fips-186-3', 'der') + signature = signer.sign(hash_obj) + + # Verify that output looks like a DER SEQUENCE + self.assertEqual(bord(signature[0]), 48) + signer.verify(hash_obj, signature) + + # Verify that ASN.1 parsing fails as expected + signature = bchr(7) + signature[1:] + self.assertRaises(ValueError, signer.verify, hash_obj, signature) + + def test_sign_verify(self): + """Verify public/private method""" + + self.description = "can_sign() test" + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertTrue(signer.can_sign()) + + signer = DSS.new(self.key_pub, 'fips-186-3') + self.assertFalse(signer.can_sign()) + + try: + signer.sign(SHA256.new(b'xyz')) + except TypeError as e: + msg = str(e) + else: + msg = "" + self.assertTrue("Private key is needed" in msg) + + +class FIPS_DSA_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "DSA"), + "FIPS_186_3_SigVer.rsp", + "Signature Verification 186-3", + {'result': lambda x: x}) or [] + +for idx, tv in enumerate(test_vectors_verify): + + if isinstance(tv, str): + res = re.match(r"\[mod = L=([0-9]+), N=([0-9]+), ([a-zA-Z0-9-]+)\]", tv) + assert(res) + hash_name = res.group(3).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + if hasattr(tv, "p"): + modulus = tv.p + generator = tv.g + suborder = tv.q + continue + + hash_obj = hash_module.new(tv.msg) + + comps = [bytes_to_long(x) for x in (tv.y, generator, modulus, suborder)] + key = DSA.construct(comps, False) # type: ignore + verifier = DSS.new(key, 'fips-186-3') + + def positive_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'p': + setattr(FIPS_DSA_Tests_KAT, "test_verify_positive_%d" % idx, positive_test) + else: + setattr(FIPS_DSA_Tests_KAT, "test_verify_negative_%d" % idx, negative_test) + + +test_vectors_sign = load_test_vectors(("Signature", "DSA"), + "FIPS_186_3_SigGen.txt", + "Signature Creation 186-3", + {}) or [] + +for idx, tv in enumerate(test_vectors_sign): + + if isinstance(tv, str): + res = re.match(r"\[mod = L=([0-9]+), N=([0-9]+), ([a-zA-Z0-9-]+)\]", tv) + assert(res) + hash_name = res.group(3).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + if hasattr(tv, "p"): + modulus = tv.p + generator = tv.g + suborder = tv.q + continue + + hash_obj = hash_module.new(tv.msg) + comps_dsa = [bytes_to_long(x) for x in (tv.y, generator, modulus, suborder, tv.x)] + key = DSA.construct(comps_dsa, False) # type: ignore + signer = DSS.new(key, 'fips-186-3', randfunc=StrRNG(tv.k)) + + def new_test(self, signer=signer, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertEqual(signer.sign(hash_obj), signature) + setattr(FIPS_DSA_Tests_KAT, "test_sign_%d" % idx, new_test) + + +class FIPS_ECDSA_Tests(unittest.TestCase): + + key_priv = ECC.generate(curve="P-256") + key_pub = key_priv.public_key() + + def shortDescription(self): + return "FIPS ECDSA Tests" + + def test_loopback(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv, 'fips-186-3') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub, 'fips-186-3') + verifier.verify(hashed_msg, signature) + + def test_negative_unapproved_hashes(self): + """Verify that unapproved hashes are rejected""" + + from Cryptodome.Hash import SHA1 + + self.description = "Unapproved hash (SHA-1) test" + hash_obj = SHA1.new() + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertRaises(ValueError, signer.sign, hash_obj) + self.assertRaises(ValueError, signer.verify, hash_obj, b"\x00" * 40) + + def test_negative_eddsa_key(self): + key = ECC.generate(curve="ed25519") + self.assertRaises(ValueError, DSS.new, key, 'fips-186-3') + + def test_sign_verify(self): + """Verify public/private method""" + + self.description = "can_sign() test" + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertTrue(signer.can_sign()) + + signer = DSS.new(self.key_pub, 'fips-186-3') + self.assertFalse(signer.can_sign()) + self.assertRaises(TypeError, signer.sign, SHA256.new(b'xyz')) + + try: + signer.sign(SHA256.new(b'xyz')) + except TypeError as e: + msg = str(e) + else: + msg = "" + self.assertTrue("Private key is needed" in msg) + + def test_negative_unknown_modes_encodings(self): + """Verify that unknown modes/encodings are rejected""" + + self.description = "Unknown mode test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-0') + + self.description = "Unknown encoding test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-3', 'xml') + + def test_asn1_encoding(self): + """Verify ASN.1 encoding""" + + self.description = "ASN.1 encoding test" + hash_obj = SHA256.new() + signer = DSS.new(self.key_priv, 'fips-186-3', 'der') + signature = signer.sign(hash_obj) + + # Verify that output looks like a DER SEQUENCE + self.assertEqual(bord(signature[0]), 48) + signer.verify(hash_obj, signature) + + # Verify that ASN.1 parsing fails as expected + signature = bchr(7) + signature[1:] + self.assertRaises(ValueError, signer.verify, hash_obj, signature) + + +class FIPS_ECDSA_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "ECDSA"), + "SigVer.rsp", + "ECDSA Signature Verification 186-3", + {'result': lambda x: x, + 'qx': lambda x: int(x, 16), + 'qy': lambda x: int(x, 16), + }) or [] +test_vectors_verify += load_test_vectors(("Signature", "ECDSA"), + "SigVer_TruncatedSHAs.rsp", + "ECDSA Signature Verification 186-3", + {'result': lambda x: x, + 'qx': lambda x: int(x, 16), + 'qy': lambda x: int(x, 16), + }) or [] + + +for idx, tv in enumerate(test_vectors_verify): + + if isinstance(tv, str): + res = re.match(r"\[(P-[0-9]+),(SHA-[0-9]+)\]", tv) + assert res + curve_name = res.group(1) + hash_name = res.group(2).replace("-", "") + if hash_name in ("SHA512224", "SHA512256"): + truncate = hash_name[-3:] + hash_name = hash_name[:-3] + else: + truncate = None + hash_module = load_hash_by_name(hash_name) + continue + + if truncate is None: + hash_obj = hash_module.new(tv.msg) + else: + hash_obj = hash_module.new(tv.msg, truncate=truncate) + ecc_key = ECC.construct(curve=curve_name, point_x=tv.qx, point_y=tv.qy) + verifier = DSS.new(ecc_key, 'fips-186-3') + + def positive_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result.startswith('p'): + setattr(FIPS_ECDSA_Tests_KAT, "test_verify_positive_%d" % idx, positive_test) + else: + setattr(FIPS_ECDSA_Tests_KAT, "test_verify_negative_%d" % idx, negative_test) + + +test_vectors_sign = load_test_vectors(("Signature", "ECDSA"), + "SigGen.txt", + "ECDSA Signature Verification 186-3", + {'d': lambda x: int(x, 16)}) or [] + +for idx, tv in enumerate(test_vectors_sign): + + if isinstance(tv, str): + res = re.match(r"\[(P-[0-9]+),(SHA-[0-9]+)\]", tv) + assert res + curve_name = res.group(1) + hash_name = res.group(2).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + hash_obj = hash_module.new(tv.msg) + ecc_key = ECC.construct(curve=curve_name, d=tv.d) + signer = DSS.new(ecc_key, 'fips-186-3', randfunc=StrRNG(tv.k)) + + def sign_test(self, signer=signer, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertEqual(signer.sign(hash_obj), signature) + setattr(FIPS_ECDSA_Tests_KAT, "test_sign_%d" % idx, sign_test) + + +class Det_DSA_Tests(unittest.TestCase): + """Tests from rfc6979""" + + # Each key is (p, q, g, x, y, desc) + keys = [ + ( + """ + 86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447 + E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED88 + 73ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C + 881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779""", + "996F967F6C8E388D9E28D01E205FBA957A5698B1", + """ + 07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D + 89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD + 87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA4 + 17BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD""", + "411602CB19A6CCC34494D79D98EF1E7ED5AF25F7", + """ + 5DF5E01DED31D0297E274E1691C192FE5868FEF9E19A84776454B100CF16F653 + 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D + 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6 + 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B""", + "DSA1024" + ), + ( + """ + 9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48 + C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44F + FE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5 + B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE2 + 35567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41 + F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE + 92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA15 + 3E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B""", + "F2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F", + """ + 5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613 + D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C4 + 6A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472 + 085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5 + AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA + 3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71 + BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0 + DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7""", + "69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC", + """ + 667098C654426C78D7F8201EAC6C203EF030D43605032C2F1FA937E5237DBD94 + 9F34A0A2564FE126DC8B715C5141802CE0979C8246463C40E6B6BDAA2513FA61 + 1728716C2E4FD53BC95B89E69949D96512E873B9C8F8DFD499CC312882561ADE + CB31F658E934C0C197F2C4D96B05CBAD67381E7B768891E4DA3843D24D94CDFB + 5126E9B8BF21E8358EE0E0A30EF13FD6A664C0DCE3731F7FB49A4845A4FD8254 + 687972A2D382599C9BAC4E0ED7998193078913032558134976410B89D2C171D1 + 23AC35FD977219597AA7D15C1A9A428E59194F75C721EBCBCFAE44696A499AFA + 74E04299F132026601638CB87AB79190D4A0986315DA8EEC6561C938996BEADF""", + "DSA2048" + ), + ] + + # This is a sequence of items: + # message, k, r, s, hash module + signatures = [ + ( + "sample", + "7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B", + "2E1A0C2562B2912CAAF89186FB0F42001585DA55", + "29EFB6B0AFF2D7A68EB70CA313022253B9A88DF5", + SHA1, + 'DSA1024' + ), + ( + "sample", + "562097C06782D60C3037BA7BE104774344687649", + "4BC3B686AEA70145856814A6F1BB53346F02101E", + "410697B92295D994D21EDD2F4ADA85566F6F94C1", + SHA224, + 'DSA1024' + ), + ( + "sample", + "519BA0546D0C39202A7D34D7DFA5E760B318BCFB", + "81F2F5850BE5BC123C43F71A3033E9384611C545", + "4CDD914B65EB6C66A8AAAD27299BEE6B035F5E89", + SHA256, + 'DSA1024' + ), + ( + "sample", + "95897CD7BBB944AA932DBC579C1C09EB6FCFC595", + "07F2108557EE0E3921BC1774F1CA9B410B4CE65A", + "54DF70456C86FAC10FAB47C1949AB83F2C6F7595", + SHA384, + 'DSA1024' + ), + ( + "sample", + "09ECE7CA27D0F5A4DD4E556C9DF1D21D28104F8B", + "16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B", + "02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C", + SHA512, + 'DSA1024' + ), + ( + "test", + "5C842DF4F9E344EE09F056838B42C7A17F4A6433", + "42AB2052FD43E123F0607F115052A67DCD9C5C77", + "183916B0230D45B9931491D4C6B0BD2FB4AAF088", + SHA1, + 'DSA1024' + ), + ( + "test", + "4598B8EFC1A53BC8AECD58D1ABBB0C0C71E67297", + "6868E9964E36C1689F6037F91F28D5F2C30610F2", + "49CEC3ACDC83018C5BD2674ECAAD35B8CD22940F", + SHA224, + 'DSA1024' + ), + ( + "test", + "5A67592E8128E03A417B0484410FB72C0B630E1A", + "22518C127299B0F6FDC9872B282B9E70D0790812", + "6837EC18F150D55DE95B5E29BE7AF5D01E4FE160", + SHA256, + 'DSA1024' + ), + ( + "test", + "220156B761F6CA5E6C9F1B9CF9C24BE25F98CD89", + "854CF929B58D73C3CBFDC421E8D5430CD6DB5E66", + "91D0E0F53E22F898D158380676A871A157CDA622", + SHA384, + 'DSA1024' + ), + ( + "test", + "65D2C2EEB175E370F28C75BFCDC028D22C7DBE9C", + "8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A0", + "7C670C7AD72B6C050C109E1790008097125433E8", + SHA512, + 'DSA1024' + ), + ( + "sample", + "888FA6F7738A41BDC9846466ABDB8174C0338250AE50CE955CA16230F9CBD53E", + "3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445A", + "D26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF", + SHA1, + 'DSA2048' + ), + ( + "sample", + "BC372967702082E1AA4FCE892209F71AE4AD25A6DFD869334E6F153BD0C4D806", + "DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2C", + "A65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC", + SHA224, + 'DSA2048' + ), + ( + "sample", + "8926A27C40484216F052F4427CFD5647338B7B3939BC6573AF4333569D597C52", + "EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC809", + "7081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53", + SHA256, + 'DSA2048' + ), + ( + "sample", + "C345D5AB3DA0A5BCB7EC8F8FB7A7E96069E03B206371EF7D83E39068EC564920", + "B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B", + "19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B", + SHA384, + 'DSA2048' + ), + ( + "sample", + "5A12994431785485B3F5F067221517791B85A597B7A9436995C89ED0374668FC", + "2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942E", + "D0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351", + SHA512, + 'DSA2048' + ), + ( + "test", + "6EEA486F9D41A037B2C640BC5645694FF8FF4B98D066A25F76BE641CCB24BA4F", + "C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0", + "414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA", + SHA1, + 'DSA2048' + ), + ( + "test", + "06BD4C05ED74719106223BE33F2D95DA6B3B541DAD7BFBD7AC508213B6DA6670", + "272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3", + "E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806", + SHA224, + 'DSA2048' + ), + ( + "test", + "1D6CE6DDA1C5D37307839CD03AB0A5CBB18E60D800937D67DFB4479AAC8DEAD7", + "8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F0", + "7452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E", + SHA256, + 'DSA2048' + ), + ( + "test", + "206E61F73DBE1B2DC8BE736B22B079E9DACD974DB00EEBBC5B64CAD39CF9F91C", + "239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE", + "6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961", + SHA384, + 'DSA2048' + ), + ( + "test", + "AFF1651E4CD6036D57AA8B2A05CCF1A9D5A40166340ECBBDC55BE10B568AA0AA", + "89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307", + "C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1", + SHA512, + 'DSA2048' + ) + ] + + def setUp(self): + # Convert DSA key components from hex strings to integers + # Each key is (p, q, g, x, y, desc) + + from collections import namedtuple + + TestKey = namedtuple('TestKey', 'p q g x y') + new_keys = {} + for k in self.keys: + tk = TestKey(*[t2l(y) for y in k[:-1]]) + new_keys[k[-1]] = tk + self.keys = new_keys + + # Convert signature encoding + TestSig = namedtuple('TestSig', 'message nonce result module test_key') + new_signatures = [] + for message, nonce, r, s, module, test_key in self.signatures: + tsig = TestSig( + tobytes(message), + t2l(nonce), + t2b(r) + t2b(s), + module, + self.keys[test_key] + ) + new_signatures.append(tsig) + self.signatures = new_signatures + + def test1(self): + q = 0x4000000000000000000020108A2E0CC0D99F8A5EF + x = 0x09A4D6792295A7F730FC3F2B49CBC0F62E862272F + p = 2 * q + 1 + y = pow(2, x, p) + key = DSA.construct([pow(y, 2, p), 2, p, q, x], False) + signer = DSS.new(key, 'deterministic-rfc6979') + + # Test _int2octets + self.assertEqual(hexlify(signer._int2octets(x)), + b'009a4d6792295a7f730fc3f2b49cbc0f62e862272f') + + # Test _bits2octets + h1 = SHA256.new(b"sample").digest() + self.assertEqual(hexlify(signer._bits2octets(h1)), + b'01795edf0d54db760f156d0dac04c0322b3a204224') + + def test2(self): + + for sig in self.signatures: + tk = sig.test_key + key = DSA.construct([tk.y, tk.g, tk.p, tk.q, tk.x], False) + signer = DSS.new(key, 'deterministic-rfc6979') + + hash_obj = sig.module.new(sig.message) + result = signer.sign(hash_obj) + self.assertEqual(sig.result, result) + + +class Det_ECDSA_Tests(unittest.TestCase): + + key_priv_p192 = ECC.construct(curve="P-192", d=0x6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4) + key_pub_p192 = key_priv_p192.public_key() + + key_priv_p224 = ECC.construct(curve="P-224", d=0xF220266E1105BFE3083E03EC7A3A654651F45E37167E88600BF257C1) + key_pub_p224 = key_priv_p224.public_key() + + key_priv_p256 = ECC.construct(curve="P-256", d=0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721) + key_pub_p256 = key_priv_p256.public_key() + + key_priv_p384 = ECC.construct(curve="P-384", d=0x6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5) + key_pub_p384 = key_priv_p384.public_key() + + key_priv_p521 = ECC.construct(curve="P-521", d=0x0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538) + key_pub_p521 = key_priv_p521.public_key() + + # This is a sequence of items: + # message, k, r, s, hash module + # taken from RFC6979 + signatures_p192_ = ( + ( + "sample", + "37D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021", + "98C6BD12B23EAF5E2A2045132086BE3EB8EBD62ABF6698FF", + "57A22B07DEA9530F8DE9471B1DC6624472E8E2844BC25B64", + SHA1 + ), + ( + "sample", + "4381526B3FC1E7128F202E194505592F01D5FF4C5AF015D8", + "A1F00DAD97AEEC91C95585F36200C65F3C01812AA60378F5", + "E07EC1304C7C6C9DEBBE980B9692668F81D4DE7922A0F97A", + SHA224 + ), + ( + "sample", + "32B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496", + "4B0B8CE98A92866A2820E20AA6B75B56382E0F9BFD5ECB55", + "CCDB006926EA9565CBADC840829D8C384E06DE1F1E381B85", + SHA256 + ), + ( + "sample", + "4730005C4FCB01834C063A7B6760096DBE284B8252EF4311", + "DA63BF0B9ABCF948FBB1E9167F136145F7A20426DCC287D5", + "C3AA2C960972BD7A2003A57E1C4C77F0578F8AE95E31EC5E", + SHA384 + ), + ( + "sample", + "A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1", + "4D60C5AB1996BD848343B31C00850205E2EA6922DAC2E4B8", + "3F6E837448F027A1BF4B34E796E32A811CBB4050908D8F67", + SHA512 + ), + ( + "test", + "D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25", + "0F2141A0EBBC44D2E1AF90A50EBCFCE5E197B3B7D4DE036D", + "EB18BC9E1F3D7387500CB99CF5F7C157070A8961E38700B7", + SHA1 + ), + ( + "test", + "F5DC805F76EF851800700CCE82E7B98D8911B7D510059FBE", + "6945A1C1D1B2206B8145548F633BB61CEF04891BAF26ED34", + "B7FB7FDFC339C0B9BD61A9F5A8EAF9BE58FC5CBA2CB15293", + SHA224 + ), + ( + "test", + "5C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6C", + "3A718BD8B4926C3B52EE6BBE67EF79B18CB6EB62B1AD97AE", + "5662E6848A4A19B1F1AE2F72ACD4B8BBE50F1EAC65D9124F", + SHA256 + ), + ( + "test", + "5AFEFB5D3393261B828DB6C91FBC68C230727B030C975693", + "B234B60B4DB75A733E19280A7A6034BD6B1EE88AF5332367", + "7994090B2D59BB782BE57E74A44C9A1C700413F8ABEFE77A", + SHA384 + ), + ( + "test", + "0758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527", + "FE4F4AE86A58B6507946715934FE2D8FF9D95B6B098FE739", + "74CF5605C98FBA0E1EF34D4B5A1577A7DCF59457CAE52290", + SHA512 + ) + ) + + signatures_p224_ = ( + ( + "sample", + "7EEFADD91110D8DE6C2C470831387C50D3357F7F4D477054B8B426BC", + "22226F9D40A96E19C4A301CE5B74B115303C0F3A4FD30FC257FB57AC", + "66D1CDD83E3AF75605DD6E2FEFF196D30AA7ED7A2EDF7AF475403D69", + SHA1 + ), + ( + "sample", + "C1D1F2F10881088301880506805FEB4825FE09ACB6816C36991AA06D", + "1CDFE6662DDE1E4A1EC4CDEDF6A1F5A2FB7FBD9145C12113E6ABFD3E", + "A6694FD7718A21053F225D3F46197CA699D45006C06F871808F43EBC", + SHA224 + ), + ( + "sample", + "AD3029E0278F80643DE33917CE6908C70A8FF50A411F06E41DEDFCDC", + "61AA3DA010E8E8406C656BC477A7A7189895E7E840CDFE8FF42307BA", + "BC814050DAB5D23770879494F9E0A680DC1AF7161991BDE692B10101", + SHA256 + ), + ( + "sample", + "52B40F5A9D3D13040F494E83D3906C6079F29981035C7BD51E5CAC40", + "0B115E5E36F0F9EC81F1325A5952878D745E19D7BB3EABFABA77E953", + "830F34CCDFE826CCFDC81EB4129772E20E122348A2BBD889A1B1AF1D", + SHA384 + ), + ( + "sample", + "9DB103FFEDEDF9CFDBA05184F925400C1653B8501BAB89CEA0FBEC14", + "074BD1D979D5F32BF958DDC61E4FB4872ADCAFEB2256497CDAC30397", + "A4CECA196C3D5A1FF31027B33185DC8EE43F288B21AB342E5D8EB084", + SHA512 + ), + ( + "test", + "2519178F82C3F0E4F87ED5883A4E114E5B7A6E374043D8EFD329C253", + "DEAA646EC2AF2EA8AD53ED66B2E2DDAA49A12EFD8356561451F3E21C", + "95987796F6CF2062AB8135271DE56AE55366C045F6D9593F53787BD2", + SHA1 + ), + ( + "test", + "DF8B38D40DCA3E077D0AC520BF56B6D565134D9B5F2EAE0D34900524", + "C441CE8E261DED634E4CF84910E4C5D1D22C5CF3B732BB204DBEF019", + "902F42847A63BDC5F6046ADA114953120F99442D76510150F372A3F4", + SHA224 + ), + ( + "test", + "FF86F57924DA248D6E44E8154EB69F0AE2AEBAEE9931D0B5A969F904", + "AD04DDE87B84747A243A631EA47A1BA6D1FAA059149AD2440DE6FBA6", + "178D49B1AE90E3D8B629BE3DB5683915F4E8C99FDF6E666CF37ADCFD", + SHA256 + ), + ( + "test", + "7046742B839478C1B5BD31DB2E862AD868E1A45C863585B5F22BDC2D", + "389B92682E399B26518A95506B52C03BC9379A9DADF3391A21FB0EA4", + "414A718ED3249FF6DBC5B50C27F71F01F070944DA22AB1F78F559AAB", + SHA384 + ), + ( + "test", + "E39C2AA4EA6BE2306C72126D40ED77BF9739BB4D6EF2BBB1DCB6169D", + "049F050477C5ADD858CAC56208394B5A55BAEBBE887FDF765047C17C", + "077EB13E7005929CEFA3CD0403C7CDCC077ADF4E44F3C41B2F60ECFF", + SHA512 + ) + ) + + signatures_p256_ = ( + ( + "sample", + "882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4", + "61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D32", + "6D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB", + SHA1 + ), + ( + "sample", + "103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473", + "53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F", + "B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C", + SHA224 + ), + ( + "sample", + "A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60", + "EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716", + "F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8", + SHA256 + ), + ( + "sample", + "09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4", + "0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719", + "4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954", + SHA384 + ), + ( + "sample", + "5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5", + "8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F00", + "2362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE", + SHA512 + ), + ( + "test", + "8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E", + "0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89", + "01B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1", + SHA1 + ), + ( + "test", + "669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7", + "C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692", + "C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D", + SHA224 + ), + ( + "test", + "D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0", + "F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367", + "019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083", + SHA256 + ), + ( + "test", + "16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8", + "83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB6", + "8DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C", + SHA384 + ), + ( + "test", + "6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F", + "461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04", + "39AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55", + SHA512 + ) + ) + + signatures_p384_ = ( + ( + "sample", + "4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB096630F29E5938D25106C3C340045A2DB01A7", + "EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2", + "A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443", + SHA1 + ), + ( + "sample", + "A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB8083EE4E3C45B06A5899EA56C51B5879", + "42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE060122", + "9DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D", + SHA224 + ), + ( + "sample", + "180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E375572342863C899F9F2EDF9747A9B60", + "21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD", + "F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0", + SHA256 + ), + ( + "sample", + "94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA2907E3E83BA95368623B8C4686915CF9", + "94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46", + "99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8", + SHA384 + ), + ( + "sample", + "92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331A4E966532593A52980D0E3AAA5E10EC3", + "ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD7882433709", + "512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5", + SHA512 + ), + ( + "test", + "66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47EC3727F3A3C186C15054492E30698497", + "4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7", + "D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282", + SHA1 + ), + ( + "test", + "18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E3D33BE4DC5EB8886A8ECD093F2935726", + "E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E72", + "07041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66", + SHA224 + ), + ( + "test", + "0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FAA48DD070BA79921A3457ABFF2D630AD7", + "6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B", + "2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265", + SHA256 + ), + ( + "test", + "015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092ADA71F4A459BC0DA98ADB95837DB8312EA", + "8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB", + "DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5", + SHA384 + ), + ( + "test", + "3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE0E2CC8A136036DC4B9C00E6888F66B6C", + "A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277", + "976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736", + SHA512 + ), + ) + + signatures_p521_ = ( + ( + "sample", + "0089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9", + "00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D", + "00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16", + SHA1 + ), + ( + "sample", + "0121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B92113F3", + "01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E", + "0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F", + SHA224 + ), + ( + "sample", + "00EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0", + "01511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A7", + "004A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC", + SHA256 + ), + ( + "sample", + "01546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FFAD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4211", + "01EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67451", + "01F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61", + SHA384 + ), + ( + "sample", + "01DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F10198B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBFFD3", + "00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA", + "00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A", + SHA512 + ), + ( + "test", + "00BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DDBA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B222", + "013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0367", + "01E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF", + SHA1 + ), + ( + "test", + "0040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A01136987E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F706", + "01C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB", + "0177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4", + SHA224 + ), + ( + "test", + "001DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E843841AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909258", + "000E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA8", + "00CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86", + SHA256 + ), + ( + "test", + "01F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5DCEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0C88", + "014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C", + "0133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979", + SHA384 + ), + ( + "test", + "016200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D", + "013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D", + "01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3", + SHA512 + ), + ) + + signatures_p192 = [] + for a, b, c, d, e in signatures_p192_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p192.append(new_tv) + + signatures_p224 = [] + for a, b, c, d, e in signatures_p224_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p224.append(new_tv) + + signatures_p256 = [] + for a, b, c, d, e in signatures_p256_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p256.append(new_tv) + + signatures_p384 = [] + for a, b, c, d, e in signatures_p384_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p384.append(new_tv) + + signatures_p521 = [] + for a, b, c, d, e in signatures_p521_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p521.append(new_tv) + + def shortDescription(self): + return "Deterministic ECDSA Tests" + + def test_loopback_p192(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p192, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p192, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p224(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p224, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p224, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p256(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p256, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p256, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p384(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p384, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p384, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p521(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p521, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p521, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_data_rfc6979_p192(self): + signer = DSS.new(self.key_priv_p192, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p192: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p224(self): + signer = DSS.new(self.key_priv_p224, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p224: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p256(self): + signer = DSS.new(self.key_priv_p256, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p256: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p384(self): + signer = DSS.new(self.key_priv_p384, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p384: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p521(self): + signer = DSS.new(self.key_priv_p521, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p521: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + +def get_hash_module(hash_name): + if hash_name == "SHA-512": + hash_module = SHA512 + elif hash_name == "SHA-512/224": + hash_module = SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + hash_module = SHA512.new(truncate="256") + elif hash_name == "SHA-384": + hash_module = SHA384 + elif hash_name == "SHA-256": + hash_module = SHA256 + elif hash_name == "SHA-224": + hash_module = SHA224 + elif hash_name == "SHA-1": + hash_module = SHA1 + elif hash_name == "SHA3-224": + hash_module = SHA3_224 + elif hash_name == "SHA3-256": + hash_module = SHA3_256 + elif hash_name == "SHA3-384": + hash_module = SHA3_384 + elif hash_name == "SHA3-512": + hash_module = SHA3_512 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + return hash_module + + +class TestVectorsDSAWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._slow_tests = slow_tests + self._id = "None" + self.tv = [] + + def setUp(self): + + def filter_dsa(group): + return DSA.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_type(group): + sig_type = group['type'] + if sig_type != 'DsaVerify': + raise ValueError("Unknown signature type " + sig_type) + return sig_type + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + "dsa_test.json", + "Wycheproof DSA signature", + group_tag={'key': filter_dsa, + 'hash_module': filter_sha, + 'sig_type': filter_type}) + self.tv += result + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof DSA Test #" + str(tv.id) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = DSS.new(tv.key, 'fips-186-3', encoding='der') + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +class TestVectorsECDSAWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._slow_tests = slow_tests + self._id = "None" + + def add_tests(self, filename): + + def filter_ecc(group): + # These are the only curves we accept to skip + if group['key']['curve'] in ('secp224k1', 'secp256k1', + 'brainpoolP224r1', 'brainpoolP224t1', + 'brainpoolP256r1', 'brainpoolP256t1', + 'brainpoolP320r1', 'brainpoolP320t1', + 'brainpoolP384r1', 'brainpoolP384t1', + 'brainpoolP512r1', 'brainpoolP512t1', + ): + return None + return ECC.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_encoding(group): + encoding_name = group['type'] + if encoding_name == "EcdsaVerify": + return "der" + elif encoding_name == "EcdsaP1363Verify": + return "binary" + else: + raise ValueError("Unknown signature type " + encoding_name) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof ECDSA signature (%s)" % filename, + group_tag={'key': filter_ecc, + 'hash_module': filter_sha, + 'encoding': filter_encoding, + }) + self.tv += result + + def setUp(self): + self.tv = [] + self.add_tests("ecdsa_secp224r1_sha224_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha224_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp224r1_sha256_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha256_test.json") + self.add_tests("ecdsa_secp224r1_sha3_224_test.json") + self.add_tests("ecdsa_secp224r1_sha3_256_test.json") + self.add_tests("ecdsa_secp224r1_sha3_512_test.json") + self.add_tests("ecdsa_secp224r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha512_test.json") + self.add_tests("ecdsa_secp256r1_sha256_p1363_test.json") + self.add_tests("ecdsa_secp256r1_sha256_test.json") + self.add_tests("ecdsa_secp256r1_sha3_256_test.json") + self.add_tests("ecdsa_secp256r1_sha3_512_test.json") + self.add_tests("ecdsa_secp256r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp256r1_sha512_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp384r1_sha3_384_test.json") + self.add_tests("ecdsa_secp384r1_sha3_512_test.json") + self.add_tests("ecdsa_secp384r1_sha384_p1363_test.json") + self.add_tests("ecdsa_secp384r1_sha384_test.json") + self.add_tests("ecdsa_secp384r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp384r1_sha512_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp521r1_sha3_512_test.json") + self.add_tests("ecdsa_secp521r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp521r1_sha512_test.json") + self.add_tests("ecdsa_test.json") + self.add_tests("ecdsa_webcrypto_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof ECDSA Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + + # Skip tests with unsupported curves + if tv.key is None: + return + + hashed_msg = tv.hash_module.new(tv.msg) + signer = DSS.new(tv.key, 'fips-186-3', encoding=tv.encoding) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + if tv.comment == "k*G has a large x-coordinate": + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(FIPS_DSA_Tests) + tests += list_test_cases(FIPS_ECDSA_Tests) + tests += list_test_cases(Det_DSA_Tests) + tests += list_test_cases(Det_ECDSA_Tests) + + slow_tests = config.get('slow_tests') + if slow_tests: + tests += list_test_cases(FIPS_DSA_Tests_KAT) + tests += list_test_cases(FIPS_ECDSA_Tests_KAT) + + tests += [TestVectorsDSAWycheproof(wycheproof_warnings, slow_tests)] + tests += [TestVectorsECDSAWycheproof(wycheproof_warnings, slow_tests)] + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py new file mode 100644 index 0000000..015e247 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py @@ -0,0 +1,578 @@ +# +# Copyright (c) 2022, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.PublicKey import ECC +from Cryptodome.Signature import eddsa +from Cryptodome.Hash import SHA512, SHAKE256 +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.number import bytes_to_long + +rfc8032_tv_str = ( + # 7.1 Ed25519 + ( + "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "", + None, + "", + "e5564300c360ac729086e2cc806e828a" + "84877f1eb8e5d974d873e06522490155" + "5fb8821590a33bacc61e39701cf9b46b" + "d25bf5f0595bbe24655141438e7a100b" + ), + ( + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "72", + None, + "", + "92a009a9f0d4cab8720e820b5f642540" + "a2b27b5416503f8fb3762223ebdb69da" + "085ac1e43e15996e458f3613d0f11d8c" + "387b2eaeb4302aeeb00d291612bb0c00" + ), + ( + "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", + "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "af82", + None, + "", + "6291d657deec24024827e69c3abe01a3" + "0ce548a284743a445e3680d7db5ac3ac" + "18ff9b538d16f290ae67f760984dc659" + "4a7c15e9716ed28dc027beceea1ec40a" + ), + ( + "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", + "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", + "08b8b2b733424243760fe426a4b54908" + "632110a66c2f6591eabd3345e3e4eb98" + "fa6e264bf09efe12ee50f8f54e9f77b1" + "e355f6c50544e23fb1433ddf73be84d8" + "79de7c0046dc4996d9e773f4bc9efe57" + "38829adb26c81b37c93a1b270b20329d" + "658675fc6ea534e0810a4432826bf58c" + "941efb65d57a338bbd2e26640f89ffbc" + "1a858efcb8550ee3a5e1998bd177e93a" + "7363c344fe6b199ee5d02e82d522c4fe" + "ba15452f80288a821a579116ec6dad2b" + "3b310da903401aa62100ab5d1a36553e" + "06203b33890cc9b832f79ef80560ccb9" + "a39ce767967ed628c6ad573cb116dbef" + "efd75499da96bd68a8a97b928a8bbc10" + "3b6621fcde2beca1231d206be6cd9ec7" + "aff6f6c94fcd7204ed3455c68c83f4a4" + "1da4af2b74ef5c53f1d8ac70bdcb7ed1" + "85ce81bd84359d44254d95629e9855a9" + "4a7c1958d1f8ada5d0532ed8a5aa3fb2" + "d17ba70eb6248e594e1a2297acbbb39d" + "502f1a8c6eb6f1ce22b3de1a1f40cc24" + "554119a831a9aad6079cad88425de6bd" + "e1a9187ebb6092cf67bf2b13fd65f270" + "88d78b7e883c8759d2c4f5c65adb7553" + "878ad575f9fad878e80a0c9ba63bcbcc" + "2732e69485bbc9c90bfbd62481d9089b" + "eccf80cfe2df16a2cf65bd92dd597b07" + "07e0917af48bbb75fed413d238f5555a" + "7a569d80c3414a8d0859dc65a46128ba" + "b27af87a71314f318c782b23ebfe808b" + "82b0ce26401d2e22f04d83d1255dc51a" + "ddd3b75a2b1ae0784504df543af8969b" + "e3ea7082ff7fc9888c144da2af58429e" + "c96031dbcad3dad9af0dcbaaaf268cb8" + "fcffead94f3c7ca495e056a9b47acdb7" + "51fb73e666c6c655ade8297297d07ad1" + "ba5e43f1bca32301651339e22904cc8c" + "42f58c30c04aafdb038dda0847dd988d" + "cda6f3bfd15c4b4c4525004aa06eeff8" + "ca61783aacec57fb3d1f92b0fe2fd1a8" + "5f6724517b65e614ad6808d6f6ee34df" + "f7310fdc82aebfd904b01e1dc54b2927" + "094b2db68d6f903b68401adebf5a7e08" + "d78ff4ef5d63653a65040cf9bfd4aca7" + "984a74d37145986780fc0b16ac451649" + "de6188a7dbdf191f64b5fc5e2ab47b57" + "f7f7276cd419c17a3ca8e1b939ae49e4" + "88acba6b965610b5480109c8b17b80e1" + "b7b750dfc7598d5d5011fd2dcc5600a3" + "2ef5b52a1ecc820e308aa342721aac09" + "43bf6686b64b2579376504ccc493d97e" + "6aed3fb0f9cd71a43dd497f01f17c0e2" + "cb3797aa2a2f256656168e6c496afc5f" + "b93246f6b1116398a346f1a641f3b041" + "e989f7914f90cc2c7fff357876e506b5" + "0d334ba77c225bc307ba537152f3f161" + "0e4eafe595f6d9d90d11faa933a15ef1" + "369546868a7f3a45a96768d40fd9d034" + "12c091c6315cf4fde7cb68606937380d" + "b2eaaa707b4c4185c32eddcdd306705e" + "4dc1ffc872eeee475a64dfac86aba41c" + "0618983f8741c5ef68d3a101e8a3b8ca" + "c60c905c15fc910840b94c00a0b9d0", + None, + "", + "0aab4c900501b3e24d7cdf4663326a3a" + "87df5e4843b2cbdb67cbf6e460fec350" + "aa5371b1508f9f4528ecea23c436d94b" + "5e8fcd4f681e30a6ac00a9704a188a03" + ), + # 7.2 Ed25519ctx + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "f726936d19c800494e3fdaff20b276a8", + None, + "666f6f", + "55a4cc2f70a54e04288c5f4cd1e45a7b" + "b520b36292911876cada7323198dd87a" + "8b36950b95130022907a7fb7c4e9b2d5" + "f6cca685a587b4b21f4b888e4e7edb0d" + ), + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "f726936d19c800494e3fdaff20b276a8", + None, + "626172", + "fc60d5872fc46b3aa69f8b5b4351d580" + "8f92bcc044606db097abab6dbcb1aee3" + "216c48e8b3b66431b5b186d1d28f8ee1" + "5a5ca2df6668346291c2043d4eb3e90d" + ), + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "508e9e6882b979fea900f62adceaca35", + None, + "666f6f", + "8b70c1cc8310e1de20ac53ce28ae6e72" + "07f33c3295e03bb5c0732a1d20dc6490" + "8922a8b052cf99b7c4fe107a5abb5b2c" + "4085ae75890d02df26269d8945f84b0b" + ), + ( + "ab9c2853ce297ddab85c993b3ae14bca" + "d39b2c682beabc27d6d4eb20711d6560", + "0f1d1274943b91415889152e893d80e9" + "3275a1fc0b65fd71b4b0dda10ad7d772", + "f726936d19c800494e3fdaff20b276a8", + None, + "666f6f", + "21655b5f1aa965996b3f97b3c849eafb" + "a922a0a62992f73b3d1b73106a84ad85" + "e9b86a7b6005ea868337ff2d20a7f5fb" + "d4cd10b0be49a68da2b2e0dc0ad8960f" + ), + # 7.3 Ed25519ph + ( + "833fe62409237b9d62ec77587520911e" + "9a759cec1d19755b7da901b96dca3d42", + "ec172b93ad5e563bf4932c70e1245034" + "c35467ef2efd4d64ebf819683467e2bf", + "616263", + SHA512, + "", + "98a70222f0b8121aa9d30f813d683f80" + "9e462b469c7ff87639499bb94e6dae41" + "31f85042463c2a355a2003d062adf5aa" + "a10b8c61e636062aaad11c2a26083406" + ), + # 7.4 Ed448 + ( + "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3" + "528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b", + "5fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778" + "edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", + "", + None, + "", + "533a37f6bbe457251f023c0d88f976ae2dfb504a843e34d2074fd823d41a591f" + "2b233f034f628281f2fd7a22ddd47d7828c59bd0a21bfd3980ff0d2028d4b18a" + "9df63e006c5d1c2d345b925d8dc00b4104852db99ac5c7cdda8530a113a0f4db" + "b61149f05a7363268c71d95808ff2e652600" + ), + ( + "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463a" + "fbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", + "43ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c086" + "6aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", + "03", + None, + "", + "26b8f91727bd62897af15e41eb43c377efb9c610d48f2335cb0bd0087810f435" + "2541b143c4b981b7e18f62de8ccdf633fc1bf037ab7cd779805e0dbcc0aae1cb" + "cee1afb2e027df36bc04dcecbf154336c19f0af7e0a6472905e799f1953d2a0f" + "f3348ab21aa4adafd1d234441cf807c03a00", + ), + ( + "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463a" + "fbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", + "43ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c086" + "6aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", + "03", + None, + "666f6f", + "d4f8f6131770dd46f40867d6fd5d5055de43541f8c5e35abbcd001b32a89f7d2" + "151f7647f11d8ca2ae279fb842d607217fce6e042f6815ea000c85741de5c8da" + "1144a6a1aba7f96de42505d7a7298524fda538fccbbb754f578c1cad10d54d0d" + "5428407e85dcbc98a49155c13764e66c3c00", + ), + ( + "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffd" + "f60500553abc0e05cd02184bdb89c4ccd67e187951267eb328", + "dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e3" + "65fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", + "0c3e544074ec63b0265e0c", + None, + "", + "1f0a8888ce25e8d458a21130879b840a9089d999aaba039eaf3e3afa090a09d3" + "89dba82c4ff2ae8ac5cdfb7c55e94d5d961a29fe0109941e00b8dbdeea6d3b05" + "1068df7254c0cdc129cbe62db2dc957dbb47b51fd3f213fb8698f064774250a5" + "028961c9bf8ffd973fe5d5c206492b140e00", + ), + ( + "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d93" + "9f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b", + "3ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc" + "24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", + "64a65f3cdedcdd66811e2915", + None, + "", + "7eeeab7c4e50fb799b418ee5e3197ff6bf15d43a14c34389b59dd1a7b1b85b4a" + "e90438aca634bea45e3a2695f1270f07fdcdf7c62b8efeaf00b45c2c96ba457e" + "b1a8bf075a3db28e5c24f6b923ed4ad747c3c9e03c7079efb87cb110d3a99861" + "e72003cbae6d6b8b827e4e6c143064ff3c00", + ), + ( + "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b29" + "49c1bb60700314611732a6c2fea98eebc0266a11a93970100e", + "b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb381" + "5c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", + "64a65f3cdedcdd66811e2915e7", + None, + "", + "6a12066f55331b6c22acd5d5bfc5d71228fbda80ae8dec26bdd306743c5027cb" + "4890810c162c027468675ecf645a83176c0d7323a2ccde2d80efe5a1268e8aca" + "1d6fbc194d3f77c44986eb4ab4177919ad8bec33eb47bbb5fc6e28196fd1caf5" + "6b4e7e0ba5519234d047155ac727a1053100", + ), + ( + "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bf" + "f21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01", + "df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a" + "39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", + "bd0f6a3747cd561bdddf4640a332461a4a30a12a434cd0bf40d766d9c6d458e5" + "512204a30c17d1f50b5079631f64eb3112182da3005835461113718d1a5ef944", + None, + "", + "554bc2480860b49eab8532d2a533b7d578ef473eeb58c98bb2d0e1ce488a98b1" + "8dfde9b9b90775e67f47d4a1c3482058efc9f40d2ca033a0801b63d45b3b722e" + "f552bad3b4ccb667da350192b61c508cf7b6b5adadc2c8d9a446ef003fb05cba" + "5f30e88e36ec2703b349ca229c2670833900", + ), + ( + "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d3756" + "9b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5", + "79756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9b" + "fe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", + "15777532b0bdd0d1389f636c5f6b9ba734c90af572877e2d272dd078aa1e567c" + "fa80e12928bb542330e8409f3174504107ecd5efac61ae7504dabe2a602ede89" + "e5cca6257a7c77e27a702b3ae39fc769fc54f2395ae6a1178cab4738e543072f" + "c1c177fe71e92e25bf03e4ecb72f47b64d0465aaea4c7fad372536c8ba516a60" + "39c3c2a39f0e4d832be432dfa9a706a6e5c7e19f397964ca4258002f7c0541b5" + "90316dbc5622b6b2a6fe7a4abffd96105eca76ea7b98816af0748c10df048ce0" + "12d901015a51f189f3888145c03650aa23ce894c3bd889e030d565071c59f409" + "a9981b51878fd6fc110624dcbcde0bf7a69ccce38fabdf86f3bef6044819de11", + None, + "", + "c650ddbb0601c19ca11439e1640dd931f43c518ea5bea70d3dcde5f4191fe53f" + "00cf966546b72bcc7d58be2b9badef28743954e3a44a23f880e8d4f1cfce2d7a" + "61452d26da05896f0a50da66a239a8a188b6d825b3305ad77b73fbac0836ecc6" + "0987fd08527c1a8e80d5823e65cafe2a3d00", + ), + ( + "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec" + "44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8", + "a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799d" + "a08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", + "6ddf802e1aae4986935f7f981ba3f0351d6273c0a0c22c9c0e8339168e675412" + "a3debfaf435ed651558007db4384b650fcc07e3b586a27a4f7a00ac8a6fec2cd" + "86ae4bf1570c41e6a40c931db27b2faa15a8cedd52cff7362c4e6e23daec0fbc" + "3a79b6806e316efcc7b68119bf46bc76a26067a53f296dafdbdc11c77f7777e9" + "72660cf4b6a9b369a6665f02e0cc9b6edfad136b4fabe723d2813db3136cfde9" + "b6d044322fee2947952e031b73ab5c603349b307bdc27bc6cb8b8bbd7bd32321" + "9b8033a581b59eadebb09b3c4f3d2277d4f0343624acc817804728b25ab79717" + "2b4c5c21a22f9c7839d64300232eb66e53f31c723fa37fe387c7d3e50bdf9813" + "a30e5bb12cf4cd930c40cfb4e1fc622592a49588794494d56d24ea4b40c89fc0" + "596cc9ebb961c8cb10adde976a5d602b1c3f85b9b9a001ed3c6a4d3b1437f520" + "96cd1956d042a597d561a596ecd3d1735a8d570ea0ec27225a2c4aaff26306d1" + "526c1af3ca6d9cf5a2c98f47e1c46db9a33234cfd4d81f2c98538a09ebe76998" + "d0d8fd25997c7d255c6d66ece6fa56f11144950f027795e653008f4bd7ca2dee" + "85d8e90f3dc315130ce2a00375a318c7c3d97be2c8ce5b6db41a6254ff264fa6" + "155baee3b0773c0f497c573f19bb4f4240281f0b1f4f7be857a4e59d416c06b4" + "c50fa09e1810ddc6b1467baeac5a3668d11b6ecaa901440016f389f80acc4db9" + "77025e7f5924388c7e340a732e554440e76570f8dd71b7d640b3450d1fd5f041" + "0a18f9a3494f707c717b79b4bf75c98400b096b21653b5d217cf3565c9597456" + "f70703497a078763829bc01bb1cbc8fa04eadc9a6e3f6699587a9e75c94e5bab" + "0036e0b2e711392cff0047d0d6b05bd2a588bc109718954259f1d86678a579a3" + "120f19cfb2963f177aeb70f2d4844826262e51b80271272068ef5b3856fa8535" + "aa2a88b2d41f2a0e2fda7624c2850272ac4a2f561f8f2f7a318bfd5caf969614" + "9e4ac824ad3460538fdc25421beec2cc6818162d06bbed0c40a387192349db67" + "a118bada6cd5ab0140ee273204f628aad1c135f770279a651e24d8c14d75a605" + "9d76b96a6fd857def5e0b354b27ab937a5815d16b5fae407ff18222c6d1ed263" + "be68c95f32d908bd895cd76207ae726487567f9a67dad79abec316f683b17f2d" + "02bf07e0ac8b5bc6162cf94697b3c27cd1fea49b27f23ba2901871962506520c" + "392da8b6ad0d99f7013fbc06c2c17a569500c8a7696481c1cd33e9b14e40b82e" + "79a5f5db82571ba97bae3ad3e0479515bb0e2b0f3bfcd1fd33034efc6245eddd" + "7ee2086ddae2600d8ca73e214e8c2b0bdb2b047c6a464a562ed77b73d2d841c4" + "b34973551257713b753632efba348169abc90a68f42611a40126d7cb21b58695" + "568186f7e569d2ff0f9e745d0487dd2eb997cafc5abf9dd102e62ff66cba87", + None, + "", + "e301345a41a39a4d72fff8df69c98075a0cc082b802fc9b2b6bc503f926b65bd" + "df7f4c8f1cb49f6396afc8a70abe6d8aef0db478d4c6b2970076c6a0484fe76d" + "76b3a97625d79f1ce240e7c576750d295528286f719b413de9ada3e8eb78ed57" + "3603ce30d8bb761785dc30dbc320869e1a00" + ), + # 7.5 Ed448ph + ( + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42" + "ef7822e0d5104127dc05d6dbefde69e3ab2cec7c867c6e2c49", + "259b71c19f83ef77a7abd26524cbdb3161b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276d5ed3d5d01c0f53880", + "616263", + SHAKE256, + "", + "822f6901f7480f3d5f562c592994d9693602875614483256505600bbc281ae38" + "1f54d6bce2ea911574932f52a4e6cadd78769375ec3ffd1b801a0d9b3f4030cd" + "433964b6457ea39476511214f97469b57dd32dbc560a9a94d00bff07620464a3" + "ad203df7dc7ce360c3cd3696d9d9fab90f00" + ), + ( + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42" + "ef7822e0d5104127dc05d6dbefde69e3ab2cec7c867c6e2c49", + "259b71c19f83ef77a7abd26524cbdb3161b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276d5ed3d5d01c0f53880", + "616263", + SHAKE256, + "666f6f", + "c32299d46ec8ff02b54540982814dce9a05812f81962b649d528095916a2aa48" + "1065b1580423ef927ecf0af5888f90da0f6a9a85ad5dc3f280d91224ba9911a3" + "653d00e484e2ce232521481c8658df304bb7745a73514cdb9bf3e15784ab7128" + "4f8d0704a608c54a6b62d97beb511d132100", + ), +) + + +rfc8032_tv_bytes = [] +for tv_str in rfc8032_tv_str: + rfc8032_tv_bytes.append([unhexlify(i) if isinstance(i, str) else i for i in tv_str]) + + +class TestEdDSA(unittest.TestCase): + + def test_sign(self): + for sk, _, msg, hashmod, ctx, exp_signature in rfc8032_tv_bytes: + key = eddsa.import_private_key(sk) + signer = eddsa.new(key, 'rfc8032', context=ctx) + if hashmod is None: + # PureEdDSA + signature = signer.sign(msg) + else: + # HashEdDSA + hashobj = hashmod.new(msg) + signature = signer.sign(hashobj) + self.assertEqual(exp_signature, signature) + + def test_verify(self): + for _, pk, msg, hashmod, ctx, exp_signature in rfc8032_tv_bytes: + key = eddsa.import_public_key(pk) + verifier = eddsa.new(key, 'rfc8032', context=ctx) + if hashmod is None: + # PureEdDSA + verifier.verify(msg, exp_signature) + else: + # HashEdDSA + hashobj = hashmod.new(msg) + verifier.verify(hashobj, exp_signature) + + def test_negative(self): + key = ECC.generate(curve="ed25519") + self.assertRaises(ValueError, eddsa.new, key, 'rfc9999') + + nist_key = ECC.generate(curve="p256") + self.assertRaises(ValueError, eddsa.new, nist_key, 'rfc8032') + + +class TestExport_Ed25519(unittest.TestCase): + + def test_raw(self): + key = ECC.generate(curve="Ed25519") + x, y = key.pointQ.xy + raw = bytearray(key._export_eddsa()) + sign_x = raw[31] >> 7 + raw[31] &= 0x7F + yt = bytes_to_long(raw[::-1]) + self.assertEqual(y, yt) + self.assertEqual(x & 1, sign_x) + + key = ECC.construct(point_x=0, point_y=1, curve="Ed25519") + out = key._export_eddsa() + self.assertEqual(b'\x01' + b'\x00' * 31, out) + + +class TestExport_Ed448(unittest.TestCase): + + def test_raw(self): + key = ECC.generate(curve="Ed448") + x, y = key.pointQ.xy + raw = bytearray(key._export_eddsa()) + sign_x = raw[56] >> 7 + raw[56] &= 0x7F + yt = bytes_to_long(raw[::-1]) + self.assertEqual(y, yt) + self.assertEqual(x & 1, sign_x) + + key = ECC.construct(point_x=0, point_y=1, curve="Ed448") + out = key._export_eddsa() + self.assertEqual(b'\x01' + b'\x00' * 56, out) + + +class TestImport_Ed25519(unittest.TestCase): + + def test_raw(self): + Px = 24407857220263921307776619664228778204996144802740950419837658238229122415920 + Py = 56480760040633817885061096979765646085062883740629155052073094891081309750690 + encoded = b'\xa2\x05\xd6\x00\xe1 \xe1\xc0\xff\x96\xee?V\x8e\xba/\xd3\x89\x06\xd7\xc4c\xe8$\xc2d\xd7a1\xfa\xde|' + key = eddsa.import_public_key(encoded) + self.assertEqual(Py, key.pointQ.y) + self.assertEqual(Px, key.pointQ.x) + + encoded = b'\x01' + b'\x00' * 31 + key = eddsa.import_public_key(encoded) + self.assertEqual(1, key.pointQ.y) + self.assertEqual(0, key.pointQ.x) + + +class TestImport_Ed448(unittest.TestCase): + + def test_raw(self): + Px = 0x153f42025aba3b0daecaa5cd79458b3146c7c9378c16c17b4a59bc3561113d90c169045bc12966c3f93e140c2ca0a3acc33d9205b9daf9b1 + Py = 0x38f5c0015d3dedd576c232810dd90373b5b1d631a12894c043b7be529cbae03ede177d8fa490b56131dbcb2465d2aba777ef839fc1719b25 + encoded = unhexlify("259b71c19f83ef77a7abd26524cbdb31" + "61b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276" + "d5ed3d5d01c0f53880") + key = eddsa.import_public_key(encoded) + self.assertEqual(Py, key.pointQ.y) + self.assertEqual(Px, key.pointQ.x) + + encoded = b'\x01' + b'\x00' * 56 + key = eddsa.import_public_key(encoded) + self.assertEqual(1, key.pointQ.y) + self.assertEqual(0, key.pointQ.x) + + +class TestVectorsEdDSAWycheproof(unittest.TestCase): + + def add_tests(self, filename): + + def pk(group): + elem = group['key']['pk'] + return unhexlify(elem) + + def sk(group): + elem = group['key']['sk'] + return unhexlify(elem) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof ECDSA signature (%s)" + % filename, + group_tag={'pk': pk, 'sk': sk}) + self.tv += result + + def setUp(self): + self.tv = [] + self.add_tests("eddsa_test.json") + self.add_tests("ed448_test.json") + + def test_sign(self, tv): + if not tv.valid: + return + + self._id = "Wycheproof EdDSA Sign Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + key = eddsa.import_private_key(tv.sk) + signer = eddsa.new(key, 'rfc8032') + signature = signer.sign(tv.msg) + self.assertEqual(signature, tv.sig) + + def test_verify(self, tv): + self._id = "Wycheproof EdDSA Verify Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + key = eddsa.import_public_key(tv.pk) + verifier = eddsa.new(key, 'rfc8032') + try: + verifier.verify(tv.msg, tv.sig) + except ValueError: + assert not tv.valid + else: + assert tv.valid + + def runTest(self): + for tv in self.tv: + self.test_sign(tv) + self.test_verify(tv) + + +def get_tests(config={}): + + tests = [] + tests += list_test_cases(TestExport_Ed25519) + tests += list_test_cases(TestExport_Ed448) + tests += list_test_cases(TestImport_Ed25519) + tests += list_test_cases(TestImport_Ed448) + tests += list_test_cases(TestEdDSA) + tests += [TestVectorsEdDSAWycheproof()] + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py new file mode 100644 index 0000000..3a3e30b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py @@ -0,0 +1,348 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bchr +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.strxor import strxor +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Hash import (SHA1, SHA224, SHA256, SHA384, SHA512, SHA3_384, + SHA3_224, SHA3_256, SHA3_512) +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pkcs1_15 +from Cryptodome.Signature import PKCS1_v1_5 + +from Cryptodome.Util._file_system import pycryptodome_filename +from Cryptodome.Util.strxor import strxor + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class FIPS_PKCS1_Verify_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Verify)" + + def test_can_sign(self): + test_public_key = RSA.generate(1024).public_key() + verifier = pkcs1_15.new(test_public_key) + self.assertEqual(verifier.can_sign(), False) + + +class FIPS_PKCS1_Verify_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigVer15_186-3.rsp", + "Signature Verification 186-3", + {'shaalg': lambda x: x, + 'd': lambda x: int(x), + 'result': lambda x: x}) or [] + + +for count, tv in enumerate(test_vectors_verify): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + public_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e)]) # type: ignore + verifier = pkcs1_15.new(public_key) + + def positive_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'f': + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_negative_%d" % count, negative_test) + else: + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_positive_%d" % count, positive_test) + + +class FIPS_PKCS1_Sign_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Sign)" + + def test_can_sign(self): + test_private_key = RSA.generate(1024) + signer = pkcs1_15.new(test_private_key) + self.assertEqual(signer.can_sign(), True) + + +class FIPS_PKCS1_Sign_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_sign = load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigGen15_186-2.txt", + "Signature Generation 186-2", + {'shaalg': lambda x: x}) or [] + +test_vectors_sign += load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigGen15_186-3.txt", + "Signature Generation 186-3", + {'shaalg': lambda x: x}) or [] + +for count, tv in enumerate(test_vectors_sign): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "e"): + private_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e, tv.d)]) # type: ignore + signer = pkcs1_15.new(private_key) + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + + def new_test(self, hash_obj=hash_obj, signer=signer, result=tv.s): + signature = signer.sign(hash_obj) + self.assertEqual(signature, result) + + setattr(FIPS_PKCS1_Sign_Tests_KAT, "test_%d" % count, new_test) + + +class PKCS1_15_NoParams(unittest.TestCase): + """Verify that PKCS#1 v1.5 signatures pass even without NULL parameters in + the algorithm identifier (PyCrypto/LP bug #1119552).""" + + rsakey = """-----BEGIN RSA PRIVATE KEY----- + MIIBOwIBAAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+TLr7UkvEtFrRhDDKMtuII + q19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQJACUSDEp8RTe32ftq8IwG8 + Wojl5mAd1wFiIOrZ/Uv8b963WJOJiuQcVN29vxU5+My9GPZ7RA3hrDBEAoHUDPrI + OQIhAPIPLz4dphiD9imAkivY31Rc5AfHJiQRA7XixTcjEkojAiEAyh/pJHks/Mlr + +rdPNEpotBjfV4M4BkgGAA/ipcmaAjcCIQCHvhwwKVBLzzTscT2HeUdEeBMoiXXK + JACAr3sJQJGxIQIgarRp+m1WSKV1MciwMaTOnbU7wxFs9DP1pva76lYBzgUCIQC9 + n0CnZCJ6IZYqSt0H5N7+Q+2Ro64nuwV/OSQfM6sBwQ== + -----END RSA PRIVATE KEY-----""" + + msg = b"This is a test\x0a" + + # PKCS1 v1.5 signature of the message computed using SHA-1. + # The digestAlgorithm SEQUENCE does NOT contain the NULL parameter. + sig_str = "a287a13517f716e72fb14eea8e33a8db4a4643314607e7ca3e3e28"\ + "1893db74013dda8b855fd99f6fecedcb25fcb7a434f35cd0a101f8"\ + "b19348e0bd7b6f152dfc" + signature = unhexlify(sig_str) + + def runTest(self): + verifier = pkcs1_15.new(RSA.importKey(self.rsakey)) + hashed = SHA1.new(self.msg) + verifier.verify(hashed, self.signature) + + +class PKCS1_Legacy_Module_Tests(unittest.TestCase): + """Verify that the legacy module Cryptodome.Signature.PKCS1_v1_5 + behaves as expected. The only difference is that the verify() + method returns True/False and does not raise exceptions.""" + + def shortDescription(self): + return "Test legacy Cryptodome.Signature.PKCS1_v1_5" + + def runTest(self): + key = RSA.importKey(PKCS1_15_NoParams.rsakey) + hashed = SHA1.new(b"Test") + good_signature = PKCS1_v1_5.new(key).sign(hashed) + verifier = PKCS1_v1_5.new(key.public_key()) + + self.assertEqual(verifier.verify(hashed, good_signature), True) + + # Flip a few bits in the signature + bad_signature = strxor(good_signature, bchr(1) * len(good_signature)) + self.assertEqual(verifier.verify(hashed, bad_signature), False) + + +class PKCS1_All_Hashes_Tests(unittest.TestCase): + + def shortDescription(self): + return "Test PKCS#1v1.5 signature in combination with all hashes" + + def runTest(self): + + key = RSA.generate(1024) + signer = pkcs1_15.new(key) + hash_names = ("MD2", "MD4", "MD5", "RIPEMD160", "SHA1", + "SHA224", "SHA256", "SHA384", "SHA512", + "SHA3_224", "SHA3_256", "SHA3_384", "SHA3_512") + + for name in hash_names: + hashed = load_hash_by_name(name).new(b"Test") + signer.sign(hashed) + + from Cryptodome.Hash import BLAKE2b, BLAKE2s + for hash_size in (20, 32, 48, 64): + hashed_b = BLAKE2b.new(digest_bytes=hash_size, data=b"Test") + signer.sign(hashed_b) + for hash_size in (16, 20, 28, 32): + hashed_s = BLAKE2s.new(digest_bytes=hash_size, data=b"Test") + signer.sign(hashed_s) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + self.tv = [] + self.add_tests("rsa_sig_gen_misc_test.json") + self.add_tests("rsa_signature_2048_sha224_test.json") + self.add_tests("rsa_signature_2048_sha256_test.json") + self.add_tests("rsa_signature_2048_sha384_test.json") + self.add_tests("rsa_signature_2048_sha3_224_test.json") + self.add_tests("rsa_signature_2048_sha3_256_test.json") + self.add_tests("rsa_signature_2048_sha3_384_test.json") + self.add_tests("rsa_signature_2048_sha3_512_test.json") + self.add_tests("rsa_signature_2048_sha512_test.json") + self.add_tests("rsa_signature_2048_sha512_224_test.json") + self.add_tests("rsa_signature_2048_sha512_256_test.json") + self.add_tests("rsa_signature_3072_sha256_test.json") + self.add_tests("rsa_signature_3072_sha384_test.json") + self.add_tests("rsa_signature_3072_sha3_256_test.json") + self.add_tests("rsa_signature_3072_sha3_384_test.json") + self.add_tests("rsa_signature_3072_sha3_512_test.json") + self.add_tests("rsa_signature_3072_sha512_test.json") + self.add_tests("rsa_signature_3072_sha512_256_test.json") + self.add_tests("rsa_signature_4096_sha384_test.json") + self.add_tests("rsa_signature_4096_sha512_test.json") + self.add_tests("rsa_signature_4096_sha512_256_test.json") + self.add_tests("rsa_signature_test.json") + + def add_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['keyPem']) + + def filter_sha(group): + hash_name = group['sha'] + if hash_name == "SHA-512": + return SHA512 + elif hash_name == "SHA-512/224": + return SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + return SHA512.new(truncate="256") + elif hash_name == "SHA3-512": + return SHA3_512 + elif hash_name == "SHA-384": + return SHA384 + elif hash_name == "SHA3-384": + return SHA3_384 + elif hash_name == "SHA-256": + return SHA256 + elif hash_name == "SHA3-256": + return SHA3_256 + elif hash_name == "SHA-224": + return SHA224 + elif hash_name == "SHA3-224": + return SHA3_224 + elif hash_name == "SHA-1": + return SHA1 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + + def filter_type(group): + type_name = group['type'] + if type_name not in ("RsassaPkcs1Verify", "RsassaPkcs1Generate"): + raise ValueError("Unknown type name " + type_name) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof PKCS#1v1.5 signature (%s)" % filename, + group_tag={'rsa_key': filter_rsa, + 'hash_mod': filter_sha, + 'type': filter_type}) + return result + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof RSA PKCS$#1 Test #" + str(tv.id) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = pkcs1_15.new(tv.key) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(FIPS_PKCS1_Verify_Tests) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests) + tests += list_test_cases(PKCS1_15_NoParams) + tests += list_test_cases(PKCS1_Legacy_Module_Tests) + tests += list_test_cases(PKCS1_All_Hashes_Tests) + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + + if config.get('slow_tests'): + tests += list_test_cases(FIPS_PKCS1_Verify_Tests_KAT) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests_KAT) + + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py new file mode 100644 index 0000000..c3b1ce5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py @@ -0,0 +1,377 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest + +from Cryptodome.Util.py3compat import b, bchr +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.strxor import strxor +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Hash import SHA1, SHA224, SHA256, SHA384, SHA512 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pss +from Cryptodome.Signature import PKCS1_PSS + +from Cryptodome.Signature.pss import MGF1 + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class PRNG(object): + + def __init__(self, stream): + self.stream = stream + self.idx = 0 + + def __call__(self, rnd_size): + result = self.stream[self.idx:self.idx + rnd_size] + self.idx += rnd_size + return result + + +class PSS_Tests(unittest.TestCase): + + rsa_key = b'-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAsvI34FgiTK8+txBvmooNGpNwk23YTU51dwNZi5yha3W4lA/Q\nvcZrDalkmD7ekWQwnduxVKa6pRSI13KBgeUOIqJoGXSWhntEtY3FEwvWOHW5AE7Q\njUzTzCiYT6TVaCcpa/7YLai+p6ai2g5f5Zfh4jSawa9uYeuggFygQq4IVW796MgV\nyqxYMM/arEj+/sKz3Viua9Rp9fFosertCYCX4DUTgW0mX9bwEnEOgjSI3pLOPXz1\n8vx+DRZS5wMCmwCUa0sKonLn3cAUPq+sGix7+eo7T0Z12MU8ud7IYVX/75r3cXiF\nPaYE2q8Le0kgOApIXbb+x74x0rNgyIh1yGygkwIDAQABAoIBABz4t1A0pLT6qHI2\nEIOaNz3mwhK0dZEqkz0GB1Dhtoax5ATgvKCFB98J3lYB08IBURe1snOsnMpOVUtg\naBRSM+QqnCUG6bnzKjAkuFP5liDE+oNQv1YpKp9CsUovuzdmI8Au3ewihl+ZTIN2\nUVNYMEOR1b5m+z2SSwWNOYsiJwpBrT7zkpdlDyjat7FiiPhMMIMXjhQFVxURMIcB\njUBtPzGvV/PG90cVDWi1wRGeeP1dDqti/jsnvykQ15KW1MqGrpeNKRmDdTy/Ucl1\nWIoYklKw3U456lgZ/rDTDB818+Tlnk35z4yF7d5ANPM8CKfqOPcnO1BCKVFzf4eq\n54wvUtkCgYEA1Zv2lp06l7rXMsvNtyYQjbFChezRDRnPwZmN4NCdRtTgGG1G0Ryd\nYz6WWoPGqZp0b4LAaaHd3W2GTcpXF8WXMKfMX1W+tMAxMozfsXRKMcHoypwuS5wT\nfJRXJCG4pvd57AB0iVUEJW2we+uGKU5Zxcx//id2nXGCpoRyViIplQsCgYEA1nVC\neHupHChht0Fh4N09cGqZHZzuwXjOUMzR3Vsfz+4WzVS3NvIgN4g5YgmQFOeKwo5y\niRq5yvubcNdFvf85eHWClg0zPAyxJCVUWigCrrOanGEhJo6re4idJvNVzu4Ucg0v\n6B3SJ1HsCda+ZSNz24bSyqRep8A+RoAaoVSFx5kCgYEAn3RvXPs9s+obnqWYiPF3\nRe5etE6Vt2vfNKwFxx6zaR6bsmBQjuUHcABWiHb6I71S0bMPI0tbrWGG8ibrYKl1\nNTLtUvVVCOS3VP7oNTWT9RTFTAnOXU7DFSo+6o/poWn3r36ff6zhDXeWWMr2OXtt\ndEQ1/2lCGEGVv+v61eVmmQUCgYABFHITPTwqwiFL1O5zPWnzyPWgaovhOYSAb6eW\n38CXQXGn8wdBJZL39J2lWrr4//l45VK6UgIhfYbY2JynSkO10ZGow8RARygVMILu\nOUlaK9lZdDvAf/NpGdUAvzTtZ9F+iYZ2OsA2JnlzyzsGM1l//3vMPWukmJk3ral0\nqoJJ8QKBgGRG3eVHnIegBbFVuMDp2NTcfuSuDVUQ1fGAwtPiFa8u81IodJnMk2pq\niXu2+0ytNA/M+SVrAnE2AgIzcaJbtr0p2srkuVM7KMWnG1vWFNjtXN8fAhf/joOv\nD+NmPL/N4uE57e40tbiU/H7KdyZaDt+5QiTmdhuyAe6CBjKsF2jy\n-----END RSA PRIVATE KEY-----' + msg = b'AAA' + tag = b'\x00[c5\xd8\xb0\x8b!D\x81\x83\x07\xc0\xdd\xb9\xb4\xb2`\x92\xe7\x02\xf1\xe1P\xea\xc3\xf0\xe3>\xddX5\xdd\x8e\xc5\x89\xef\xf3\xc2\xdc\xfeP\x02\x7f\x12+\xc9\xaf\xbb\xec\xfe\xb0\xa5\xb9\x08\x11P\x8fL\xee5\x9b\xb0k{=_\xd2\x14\xfb\x01R\xb7\xfe\x14}b\x03\x8d5Y\x89~}\xfc\xf2l\xd01-\xbd\xeb\x11\xcdV\x11\xe9l\x19k/o5\xa2\x0f\x15\xe7Q$\t=\xec\x1dAB\x19\xa5P\x9a\xaf\xa3G\x86"\xd6~\xf0<p5\x00\x86\xe0\xf3\x99\xc7+\xcfc,\\\x13)v\xcd\xff\x08o\x90\xc5\xd1\xca\x869\xf45\x1e\xfd\xa2\xf1n\xa3\xa6e\xc5\x11Q\xe4@\xbd\x17\x83x\xc9\x9b\xb5\xc7\xea\x03U\x9b\xa0\xccC\x17\xc9T\x86/\x05\x1c\xc7\x95hC\xf9b1\xbb\x05\xc3\xf0\x9a>j\xfcqkbs\x13\x84b\xe4\xbdm(\xed`\xa4F\xfb\x8f.\xe1\x8c)/_\x9eS\x98\xa4v\xb8\xdc\xfe\xf7/D\x18\x19\xb3T\x97:\xe2\x96s\xe8<\xa2\xb4\xb9\xf8/' + + def test_positive_1(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg) + verifier = pss.new(key) + verifier.verify(h, self.tag) + + def test_negative_1(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg + b'A') + verifier = pss.new(key) + tag = bytearray(self.tag) + self.assertRaises(ValueError, verifier.verify, h, tag) + + def test_negative_2(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg) + verifier = pss.new(key, salt_bytes=1000) + tag = bytearray(self.tag) + self.assertRaises(ValueError, verifier.verify, h, tag) + + +class FIPS_PKCS1_Verify_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Verify)" + + def verify_positive(self, hashmod, message, public_key, salt, signature): + prng = PRNG(salt) + hashed = hashmod.new(message) + verifier = pss.new(public_key, salt_bytes=len(salt), rand_func=prng) + verifier.verify(hashed, signature) + + def verify_negative(self, hashmod, message, public_key, salt, signature): + prng = PRNG(salt) + hashed = hashmod.new(message) + verifier = pss.new(public_key, salt_bytes=len(salt), rand_func=prng) + self.assertRaises(ValueError, verifier.verify, hashed, signature) + + def test_can_sign(self): + test_public_key = RSA.generate(1024).public_key() + verifier = pss.new(test_public_key) + self.assertEqual(verifier.can_sign(), False) + + +class FIPS_PKCS1_Verify_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "PKCS1-PSS"), + "SigVerPSS_186-3.rsp", + "Signature Verification 186-3", + {'shaalg': lambda x: x, + 'result': lambda x: x}) or [] + + +for count, tv in enumerate(test_vectors_verify): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "p"): + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + public_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e)]) # type: ignore + if tv.saltval != b("\x00"): + prng = PRNG(tv.saltval) + verifier = pss.new(public_key, salt_bytes=len(tv.saltval), rand_func=prng) + else: + verifier = pss.new(public_key, salt_bytes=0) + + def positive_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'p': + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_positive_%d" % count, positive_test) + else: + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_negative_%d" % count, negative_test) + + +class FIPS_PKCS1_Sign_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Sign)" + + def test_can_sign(self): + test_private_key = RSA.generate(1024) + signer = pss.new(test_private_key) + self.assertEqual(signer.can_sign(), True) + + +class FIPS_PKCS1_Sign_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_sign = load_test_vectors(("Signature", "PKCS1-PSS"), + "SigGenPSS_186-2.txt", + "Signature Generation 186-2", + {'shaalg': lambda x: x}) or [] + +test_vectors_sign += load_test_vectors(("Signature", "PKCS1-PSS"), + "SigGenPSS_186-3.txt", + "Signature Generation 186-3", + {'shaalg': lambda x: x}) or [] + +for count, tv in enumerate(test_vectors_sign): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "e"): + private_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e, tv.d)]) # type: ignore + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + if tv.saltval != b("\x00"): + prng = PRNG(tv.saltval) + signer = pss.new(private_key, salt_bytes=len(tv.saltval), rand_func=prng) + else: + signer = pss.new(private_key, salt_bytes=0) + + def new_test(self, hash_obj=hash_obj, signer=signer, result=tv.s): + signature = signer.sign(hash_obj) + self.assertEqual(signature, result) + + setattr(FIPS_PKCS1_Sign_Tests_KAT, "test_%d" % count, new_test) + + +class PKCS1_Legacy_Module_Tests(unittest.TestCase): + """Verify that the legacy module Cryptodome.Signature.PKCS1_PSS + behaves as expected. The only difference is that the verify() + method returns True/False and does not raise exceptions.""" + + def shortDescription(self): + return "Test legacy Cryptodome.Signature.PKCS1_PSS" + + def runTest(self): + key = RSA.generate(1024) + hashed = SHA1.new(b("Test")) + good_signature = PKCS1_PSS.new(key).sign(hashed) + verifier = PKCS1_PSS.new(key.public_key()) + + self.assertEqual(verifier.verify(hashed, good_signature), True) + + # Flip a few bits in the signature + bad_signature = strxor(good_signature, bchr(1) * len(good_signature)) + self.assertEqual(verifier.verify(hashed, bad_signature), False) + + +class PKCS1_All_Hashes_Tests(unittest.TestCase): + + def shortDescription(self): + return "Test PKCS#1 PSS signature in combination with all hashes" + + def runTest(self): + + key = RSA.generate(1280) + signer = pss.new(key) + hash_names = ("MD2", "MD4", "MD5", "RIPEMD160", "SHA1", + "SHA224", "SHA256", "SHA384", "SHA512", + "SHA3_224", "SHA3_256", "SHA3_384", "SHA3_512") + + for name in hash_names: + hashed = load_hash_by_name(name).new(b("Test")) + signer.sign(hashed) + + from Cryptodome.Hash import BLAKE2b, BLAKE2s + for hash_size in (20, 32, 48, 64): + hashed_b = BLAKE2b.new(digest_bytes=hash_size, data=b("Test")) + signer.sign(hashed_b) + for hash_size in (16, 20, 28, 32): + hashed_s = BLAKE2s.new(digest_bytes=hash_size, data=b("Test")) + signer.sign(hashed_s) + + +def get_hash_module(hash_name): + if hash_name == "SHA-512": + hash_module = SHA512 + elif hash_name == "SHA-512/224": + hash_module = SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + hash_module = SHA512.new(truncate="256") + elif hash_name == "SHA-384": + hash_module = SHA384 + elif hash_name == "SHA-256": + hash_module = SHA256 + elif hash_name == "SHA-224": + hash_module = SHA224 + elif hash_name == "SHA-1": + hash_module = SHA1 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + return hash_module + + +class TestVectorsPSSWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def add_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_type(group): + type_name = group['type'] + if type_name not in ("RsassaPssVerify", ): + raise ValueError("Unknown type name " + type_name) + + def filter_slen(group): + return group['sLen'] + + def filter_mgf(group): + mgf = group['mgf'] + if mgf not in ("MGF1", ): + raise ValueError("Unknown MGF " + mgf) + mgf1_hash = get_hash_module(group['mgfSha']) + + def mgf(x, y, mh=mgf1_hash): + return MGF1(x, y, mh) + + return mgf + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof PSS signature (%s)" % filename, + group_tag={'key': filter_rsa, + 'hash_module': filter_sha, + 'sLen': filter_slen, + 'mgf': filter_mgf, + 'type': filter_type}) + return result + + def setUp(self): + self.tv = [] + self.add_tests("rsa_pss_2048_sha1_mgf1_20_test.json") + self.add_tests("rsa_pss_2048_sha256_mgf1_0_test.json") + self.add_tests("rsa_pss_2048_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_2048_sha512_256_mgf1_28_test.json") + self.add_tests("rsa_pss_2048_sha512_256_mgf1_32_test.json") + self.add_tests("rsa_pss_3072_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_4096_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_4096_sha512_mgf1_32_test.json") + self.add_tests("rsa_pss_misc_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof RSA PSS Test #%d (%s)" % (tv.id, tv.comment) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = pss.new(tv.key, mask_func=tv.mgf, salt_bytes=tv.sLen) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PSS_Tests) + tests += list_test_cases(FIPS_PKCS1_Verify_Tests) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests) + tests += list_test_cases(PKCS1_Legacy_Module_Tests) + tests += list_test_cases(PKCS1_All_Hashes_Tests) + + if config.get('slow_tests'): + tests += list_test_cases(FIPS_PKCS1_Verify_Tests_KAT) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests_KAT) + + tests += [TestVectorsPSSWycheproof(wycheproof_warnings)] + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py new file mode 100644 index 0000000..e52c490 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/__init__.py: Self-test for utility modules +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-test for utility modules""" + +__revision__ = "$Id$" + +import os + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Util import test_number; tests += test_number.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_Counter; tests += test_Counter.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_Padding; tests += test_Padding.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_strxor; tests += test_strxor.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_asn1; tests += test_asn1.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_rfc1751; tests += test_rfc1751.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py new file mode 100644 index 0000000..0d1e089 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_Counter: Self-test for the Cryptodome.Util.Counter module +# +# Written in 2009 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-tests for Cryptodome.Util.Counter""" + +from Cryptodome.Util.py3compat import * + +import unittest + +class CounterTests(unittest.TestCase): + def setUp(self): + global Counter + from Cryptodome.Util import Counter + + def test_BE(self): + """Big endian""" + c = Counter.new(128) + c = Counter.new(128, little_endian=False) + + def test_LE(self): + """Little endian""" + c = Counter.new(128, little_endian=True) + + def test_nbits(self): + c = Counter.new(nbits=128) + self.assertRaises(ValueError, Counter.new, 129) + + def test_prefix(self): + c = Counter.new(128, prefix=b("xx")) + + def test_suffix(self): + c = Counter.new(128, suffix=b("xx")) + + def test_iv(self): + c = Counter.new(128, initial_value=2) + self.assertRaises(ValueError, Counter.new, 16, initial_value=0x1FFFF) + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + return list_test_cases(CounterTests) + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py new file mode 100644 index 0000000..d6a794e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py @@ -0,0 +1,154 @@ +# +# SelfTest/Util/test_Padding.py: Self-test for padding functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify as uh + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.Padding import pad, unpad + +class PKCS7_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4) + self.assertTrue(padded == uh(b("04040404"))) + padded = pad(b(""), 4, 'pkcs7') + self.assertTrue(padded == uh(b("04040404"))) + back = unpad(padded, 4) + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4) + self.assertTrue(padded == uh(b("1234567804040404"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4) + self.assertTrue(padded == uh(b("12345601"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4) + self.assertTrue(padded == uh(b("1234567890030303"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, pad, uh(b("12")), 4, 'pkcs8') + + def testn2(self): + self.assertRaises(ValueError, unpad, b("\0\0\0"), 4) + self.assertRaises(ValueError, unpad, b(""), 4) + + def testn3(self): + self.assertRaises(ValueError, unpad, b("123456\x02"), 4) + self.assertRaises(ValueError, unpad, b("123456\x00"), 4) + self.assertRaises(ValueError, unpad, b("123456\x05\x05\x05\x05\x05"), 4) + +class X923_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4, 'x923') + self.assertTrue(padded == uh(b("00000004"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4, 'x923') + self.assertTrue(padded == uh(b("1234567800000004"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4, 'x923') + self.assertTrue(padded == uh(b("12345601"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4, 'x923') + self.assertTrue(padded == uh(b("1234567890000003"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, unpad, b("123456\x02"), 4, 'x923') + self.assertRaises(ValueError, unpad, b("123456\x00"), 4, 'x923') + self.assertRaises(ValueError, unpad, b("123456\x00\x00\x00\x00\x05"), 4, 'x923') + self.assertRaises(ValueError, unpad, b(""), 4, 'x923') + +class ISO7816_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4, 'iso7816') + self.assertTrue(padded == uh(b("80000000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4, 'iso7816') + self.assertTrue(padded == uh(b("1234567880000000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4, 'iso7816') + self.assertTrue(padded == uh(b("12345680"))) + #import pdb; pdb.set_trace() + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4, 'iso7816') + self.assertTrue(padded == uh(b("1234567890800000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, unpad, b("123456\x81"), 4, 'iso7816') + self.assertRaises(ValueError, unpad, b(""), 4, 'iso7816') + +def get_tests(config={}): + tests = [] + tests += list_test_cases(PKCS7_Tests) + tests += list_test_cases(X923_Tests) + tests += list_test_cases(ISO7816_Tests) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py new file mode 100644 index 0000000..811ac84 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py @@ -0,0 +1,851 @@ +# +# SelfTest/Util/test_asn.py: Self-test for the Cryptodome.Util.asn1 module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Self-tests for Cryptodome.Util.asn1""" + +import unittest + +from Cryptodome.Util.py3compat import * +from Cryptodome.Util.asn1 import (DerObject, DerSetOf, DerInteger, + DerBitString, + DerObjectId, DerNull, DerOctetString, + DerSequence, DerBoolean) + +class DerObjectTests(unittest.TestCase): + + def testObjInit1(self): + # Fail with invalid tag format (must be 1 byte) + self.assertRaises(ValueError, DerObject, b('\x00\x99')) + # Fail with invalid implicit tag (must be <0x1F) + self.assertRaises(ValueError, DerObject, 0x1F) + + # ------ + + def testObjEncode1(self): + # No payload + der = DerObject(b('\x02')) + self.assertEqual(der.encode(), b('\x02\x00')) + # Small payload (primitive) + der.payload = b('\x45') + self.assertEqual(der.encode(), b('\x02\x01\x45')) + # Invariant + self.assertEqual(der.encode(), b('\x02\x01\x45')) + # Initialize with numerical tag + der = DerObject(0x04) + der.payload = b('\x45') + self.assertEqual(der.encode(), b('\x04\x01\x45')) + # Initialize with constructed type + der = DerObject(b('\x10'), constructed=True) + self.assertEqual(der.encode(), b('\x30\x00')) + + def testObjEncode2(self): + # Initialize with payload + der = DerObject(0x03, b('\x12\x12')) + self.assertEqual(der.encode(), b('\x03\x02\x12\x12')) + + def testObjEncode3(self): + # Long payload + der = DerObject(b('\x10')) + der.payload = b("0")*128 + self.assertEqual(der.encode(), b('\x10\x81\x80' + "0"*128)) + + def testObjEncode4(self): + # Implicit tags (constructed) + der = DerObject(0x10, implicit=1, constructed=True) + der.payload = b('ppll') + self.assertEqual(der.encode(), b('\xa1\x04ppll')) + # Implicit tags (primitive) + der = DerObject(0x02, implicit=0x1E, constructed=False) + der.payload = b('ppll') + self.assertEqual(der.encode(), b('\x9E\x04ppll')) + + def testObjEncode5(self): + # Encode type with explicit tag + der = DerObject(0x10, explicit=5) + der.payload = b("xxll") + self.assertEqual(der.encode(), b("\xa5\x06\x10\x04xxll")) + + # ----- + + def testObjDecode1(self): + # Decode short payload + der = DerObject(0x02) + der.decode(b('\x02\x02\x01\x02')) + self.assertEqual(der.payload, b("\x01\x02")) + self.assertEqual(der._tag_octet, 0x02) + + def testObjDecode2(self): + # Decode long payload + der = DerObject(0x02) + der.decode(b('\x02\x81\x80' + "1"*128)) + self.assertEqual(der.payload, b("1")*128) + self.assertEqual(der._tag_octet, 0x02) + + def testObjDecode3(self): + # Decode payload with too much data gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02\xFF')) + # Decode payload with too little data gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01')) + + def testObjDecode4(self): + # Decode implicit tag (primitive) + der = DerObject(0x02, constructed=False, implicit=0xF) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) + der.decode(b('\x8F\x01\x00')) + self.assertEqual(der.payload, b('\x00')) + # Decode implicit tag (constructed) + der = DerObject(0x02, constructed=True, implicit=0xF) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) + der.decode(b('\xAF\x01\x00')) + self.assertEqual(der.payload, b('\x00')) + + def testObjDecode5(self): + # Decode payload with unexpected tag gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x03\x02\x01\x02')) + + def testObjDecode6(self): + # Arbitrary DER object + der = DerObject() + der.decode(b('\x65\x01\x88')) + self.assertEqual(der._tag_octet, 0x65) + self.assertEqual(der.payload, b('\x88')) + + def testObjDecode7(self): + # Decode explicit tag + der = DerObject(0x10, explicit=5) + der.decode(b("\xa5\x06\x10\x04xxll")) + self.assertEqual(der._inner_tag_octet, 0x10) + self.assertEqual(der.payload, b('xxll')) + + # Explicit tag may be 0 + der = DerObject(0x10, explicit=0) + der.decode(b("\xa0\x06\x10\x04xxll")) + self.assertEqual(der._inner_tag_octet, 0x10) + self.assertEqual(der.payload, b('xxll')) + + def testObjDecode8(self): + # Verify that decode returns the object + der = DerObject(0x02) + self.assertEqual(der, der.decode(b('\x02\x02\x01\x02'))) + +class DerIntegerTests(unittest.TestCase): + + def testInit1(self): + der = DerInteger(1) + self.assertEqual(der.encode(), b('\x02\x01\x01')) + + def testEncode1(self): + # Single-byte integers + # Value 0 + der = DerInteger(0) + self.assertEqual(der.encode(), b('\x02\x01\x00')) + # Value 1 + der = DerInteger(1) + self.assertEqual(der.encode(), b('\x02\x01\x01')) + # Value 127 + der = DerInteger(127) + self.assertEqual(der.encode(), b('\x02\x01\x7F')) + + def testEncode2(self): + # Multi-byte integers + # Value 128 + der = DerInteger(128) + self.assertEqual(der.encode(), b('\x02\x02\x00\x80')) + # Value 0x180 + der = DerInteger(0x180) + self.assertEqual(der.encode(), b('\x02\x02\x01\x80')) + # One very long integer + der = DerInteger(2**2048) + self.assertEqual(der.encode(), + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + + def testEncode3(self): + # Negative integers + # Value -1 + der = DerInteger(-1) + self.assertEqual(der.encode(), b('\x02\x01\xFF')) + # Value -128 + der = DerInteger(-128) + self.assertEqual(der.encode(), b('\x02\x01\x80')) + # Value + der = DerInteger(-87873) + self.assertEqual(der.encode(), b('\x02\x03\xFE\xA8\xBF')) + + def testEncode4(self): + # Explicit encoding + number = DerInteger(0x34, explicit=3) + self.assertEqual(number.encode(), b('\xa3\x03\x02\x01\x34')) + + # ----- + + def testDecode1(self): + # Single-byte integer + der = DerInteger() + # Value 0 + der.decode(b('\x02\x01\x00')) + self.assertEqual(der.value, 0) + # Value 1 + der.decode(b('\x02\x01\x01')) + self.assertEqual(der.value, 1) + # Value 127 + der.decode(b('\x02\x01\x7F')) + self.assertEqual(der.value, 127) + + def testDecode2(self): + # Multi-byte integer + der = DerInteger() + # Value 0x180L + der.decode(b('\x02\x02\x01\x80')) + self.assertEqual(der.value,0x180) + # One very long integer + der.decode( + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + self.assertEqual(der.value,2**2048) + + def testDecode3(self): + # Negative integer + der = DerInteger() + # Value -1 + der.decode(b('\x02\x01\xFF')) + self.assertEqual(der.value, -1) + # Value -32768 + der.decode(b('\x02\x02\x80\x00')) + self.assertEqual(der.value, -32768) + + def testDecode5(self): + # We still accept BER integer format + der = DerInteger() + # Redundant leading zeroes + der.decode(b('\x02\x02\x00\x01')) + self.assertEqual(der.value, 1) + # Redundant leading 0xFF + der.decode(b('\x02\x02\xFF\xFF')) + self.assertEqual(der.value, -1) + # Empty payload + der.decode(b('\x02\x00')) + self.assertEqual(der.value, 0) + + def testDecode6(self): + # Explicit encoding + number = DerInteger(explicit=3) + number.decode(b('\xa3\x03\x02\x01\x34')) + self.assertEqual(number.value, 0x34) + + def testDecode7(self): + # Verify decode returns the DerInteger + der = DerInteger() + self.assertEqual(der, der.decode(b('\x02\x01\x7F'))) + + ### + + def testStrict1(self): + number = DerInteger() + + number.decode(b'\x02\x02\x00\x01') + number.decode(b'\x02\x02\x00\x7F') + self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x01', strict=True) + self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x7F', strict=True) + + ### + + def testErrDecode1(self): + # Wide length field + der = DerInteger() + self.assertRaises(ValueError, der.decode, b('\x02\x81\x01\x01')) + + +class DerSequenceTests(unittest.TestCase): + + def testInit1(self): + der = DerSequence([1, DerInteger(2), b('0\x00')]) + self.assertEqual(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00')) + + def testEncode1(self): + # Empty sequence + der = DerSequence() + self.assertEqual(der.encode(), b('0\x00')) + self.assertFalse(der.hasOnlyInts()) + # One single-byte integer (zero) + der.append(0) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) + self.assertEqual(der.hasInts(),1) + self.assertEqual(der.hasInts(False),1) + self.assertTrue(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # Invariant + self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) + + def testEncode2(self): + # Indexing + der = DerSequence() + der.append(0) + der[0] = 1 + self.assertEqual(len(der),1) + self.assertEqual(der[0],1) + self.assertEqual(der[-1],1) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) + # + der[:] = [1] + self.assertEqual(len(der),1) + self.assertEqual(der[0],1) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) + + def testEncode3(self): + # One multi-byte integer (non-zero) + der = DerSequence() + der.append(0x180) + self.assertEqual(der.encode(), b('0\x04\x02\x02\x01\x80')) + + def testEncode4(self): + # One very long integer + der = DerSequence() + der.append(2**2048) + self.assertEqual(der.encode(), b('0\x82\x01\x05')+ + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + + def testEncode5(self): + der = DerSequence() + der += 1 + der += b('\x30\x00') + self.assertEqual(der.encode(), b('\x30\x05\x02\x01\x01\x30\x00')) + + def testEncode6(self): + # Two positive integers + der = DerSequence() + der.append(0x180) + der.append(0xFF) + self.assertEqual(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertTrue(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # Two mixed integers + der = DerSequence() + der.append(2) + der.append(-2) + self.assertEqual(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE')) + self.assertEqual(der.hasInts(), 1) + self.assertEqual(der.hasInts(False), 2) + self.assertFalse(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # + der.append(0x01) + der[1:] = [9,8] + self.assertEqual(len(der),3) + self.assertEqual(der[1:],[9,8]) + self.assertEqual(der[1:-1],[9]) + self.assertEqual(der.encode(), b('0\x09\x02\x01\x02\x02\x01\x09\x02\x01\x08')) + + def testEncode7(self): + # One integer and another type (already encoded) + der = DerSequence() + der.append(0x180) + der.append(b('0\x03\x02\x01\x05')) + self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) + self.assertFalse(der.hasOnlyInts()) + + def testEncode8(self): + # One integer and another type (yet to encode) + der = DerSequence() + der.append(0x180) + der.append(DerSequence([5])) + self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) + self.assertFalse(der.hasOnlyInts()) + + #### + + def testDecode1(self): + # Empty sequence + der = DerSequence() + der.decode(b('0\x00')) + self.assertEqual(len(der),0) + # One single-byte integer (zero) + der.decode(b('0\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],0) + # Invariant + der.decode(b('0\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],0) + + def testDecode2(self): + # One single-byte integer (non-zero) + der = DerSequence() + der.decode(b('0\x03\x02\x01\x7f')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],127) + + def testDecode4(self): + # One very long integer + der = DerSequence() + der.decode(b('0\x82\x01\x05')+ + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],2**2048) + + def testDecode6(self): + # Two integers + der = DerSequence() + der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertEqual(len(der),2) + self.assertEqual(der[0],0x180) + self.assertEqual(der[1],0xFF) + + def testDecode7(self): + # One integer and 2 other types + der = DerSequence() + der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) + self.assertEqual(len(der),3) + self.assertEqual(der[0],0x180) + self.assertEqual(der[1],b('\x24\x02\xb6\x63')) + self.assertEqual(der[2],b('\x12\x00')) + + def testDecode8(self): + # Only 2 other types + der = DerSequence() + der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00')) + self.assertEqual(len(der),2) + self.assertEqual(der[0],b('\x24\x02\xb6\x63')) + self.assertEqual(der[1],b('\x12\x00')) + self.assertEqual(der.hasInts(), 0) + self.assertEqual(der.hasInts(False), 0) + self.assertFalse(der.hasOnlyInts()) + self.assertFalse(der.hasOnlyInts(False)) + + def testDecode9(self): + # Verify that decode returns itself + der = DerSequence() + self.assertEqual(der, der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))) + + ### + + def testErrDecode1(self): + # Not a sequence + der = DerSequence() + self.assertRaises(ValueError, der.decode, b('')) + self.assertRaises(ValueError, der.decode, b('\x00')) + self.assertRaises(ValueError, der.decode, b('\x30')) + + def testErrDecode2(self): + der = DerSequence() + # Too much data + self.assertRaises(ValueError, der.decode, b('\x30\x00\x00')) + + def testErrDecode3(self): + # Wrong length format + der = DerSequence() + # Missing length in sub-item + self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x01\x00')) + # Valid BER, but invalid DER length + self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01')) + self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01')) + + def test_expected_nr_elements(self): + der_bin = DerSequence([1, 2, 3]).encode() + + DerSequence().decode(der_bin, nr_elements=3) + DerSequence().decode(der_bin, nr_elements=(2,3)) + self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=1) + self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=(4,5)) + + def test_expected_only_integers(self): + + der_bin1 = DerSequence([1, 2, 3]).encode() + der_bin2 = DerSequence([1, 2, DerSequence([3, 4])]).encode() + + DerSequence().decode(der_bin1, only_ints_expected=True) + DerSequence().decode(der_bin1, only_ints_expected=False) + DerSequence().decode(der_bin2, only_ints_expected=False) + self.assertRaises(ValueError, DerSequence().decode, der_bin2, only_ints_expected=True) + + +class DerOctetStringTests(unittest.TestCase): + + def testInit1(self): + der = DerOctetString(b('\xFF')) + self.assertEqual(der.encode(), b('\x04\x01\xFF')) + + def testEncode1(self): + # Empty sequence + der = DerOctetString() + self.assertEqual(der.encode(), b('\x04\x00')) + # Small payload + der.payload = b('\x01\x02') + self.assertEqual(der.encode(), b('\x04\x02\x01\x02')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerOctetString() + der.decode(b('\x04\x00')) + self.assertEqual(der.payload, b('')) + # Small payload + der.decode(b('\x04\x02\x01\x02')) + self.assertEqual(der.payload, b('\x01\x02')) + + def testDecode2(self): + # Verify that decode returns the object + der = DerOctetString() + self.assertEqual(der, der.decode(b('\x04\x00'))) + + def testErrDecode1(self): + # No leftovers allowed + der = DerOctetString() + self.assertRaises(ValueError, der.decode, b('\x04\x01\x01\xff')) + +class DerNullTests(unittest.TestCase): + + def testEncode1(self): + der = DerNull() + self.assertEqual(der.encode(), b('\x05\x00')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerNull() + self.assertEqual(der, der.decode(b('\x05\x00'))) + +class DerObjectIdTests(unittest.TestCase): + + def testInit1(self): + der = DerObjectId("1.1") + self.assertEqual(der.encode(), b'\x06\x01)') + + def testEncode1(self): + der = DerObjectId('1.2.840.113549.1.1.1') + self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + + der = DerObjectId() + der.value = '1.2.840.113549.1.1.1' + self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + + der = DerObjectId('2.999.1234') + self.assertEqual(der.encode(), b'\x06\x04\x88\x37\x89\x52') + + def testEncode2(self): + der = DerObjectId('3.4') + self.assertRaises(ValueError, der.encode) + + der = DerObjectId('1.40') + self.assertRaises(ValueError, der.encode) + + #### + + def testDecode1(self): + # Empty sequence + der = DerObjectId() + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + self.assertEqual(der.value, '1.2.840.113549.1.1.1') + + def testDecode2(self): + # Verify that decode returns the object + der = DerObjectId() + self.assertEqual(der, + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) + + def testDecode3(self): + der = DerObjectId() + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x00\x01') + self.assertEqual(der.value, '1.2.840.113549.1.0.1') + + def testDecode4(self): + der = DerObjectId() + der.decode(b'\x06\x04\x88\x37\x89\x52') + self.assertEqual(der.value, '2.999.1234') + + +class DerBitStringTests(unittest.TestCase): + + def testInit1(self): + der = DerBitString(b("\xFF")) + self.assertEqual(der.encode(), b('\x03\x02\x00\xFF')) + + def testInit2(self): + der = DerBitString(DerInteger(1)) + self.assertEqual(der.encode(), b('\x03\x04\x00\x02\x01\x01')) + + def testEncode1(self): + # Empty sequence + der = DerBitString() + self.assertEqual(der.encode(), b('\x03\x01\x00')) + # Small payload + der = DerBitString(b('\x01\x02')) + self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) + # Small payload + der = DerBitString() + der.value = b('\x01\x02') + self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerBitString() + der.decode(b('\x03\x00')) + self.assertEqual(der.value, b('')) + # Small payload + der.decode(b('\x03\x03\x00\x01\x02')) + self.assertEqual(der.value, b('\x01\x02')) + + def testDecode2(self): + # Verify that decode returns the object + der = DerBitString() + self.assertEqual(der, der.decode(b('\x03\x00'))) + + +class DerSetOfTests(unittest.TestCase): + + def testInit1(self): + der = DerSetOf([DerInteger(1), DerInteger(2)]) + self.assertEqual(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02')) + + def testEncode1(self): + # Empty set + der = DerSetOf() + self.assertEqual(der.encode(), b('1\x00')) + # One single-byte integer (zero) + der.add(0) + self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) + # Invariant + self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) + + def testEncode2(self): + # Two integers + der = DerSetOf() + der.add(0x180) + der.add(0xFF) + self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) + # Initialize with integers + der = DerSetOf([0x180, 0xFF]) + self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) + + def testEncode3(self): + # One integer and another type (no matter what it is) + der = DerSetOf() + der.add(0x180) + self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00')) + + def testEncode4(self): + # Only non integers + der = DerSetOf() + der.add(b('\x01\x00')) + der.add(b('\x01\x01\x01')) + self.assertEqual(der.encode(), b('1\x05\x01\x00\x01\x01\x01')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerSetOf() + der.decode(b('1\x00')) + self.assertEqual(len(der),0) + # One single-byte integer (zero) + der.decode(b('1\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(list(der),[0]) + + def testDecode2(self): + # Two integers + der = DerSetOf() + der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertEqual(len(der),2) + l = list(der) + self.assertTrue(0x180 in l) + self.assertTrue(0xFF in l) + + def testDecode3(self): + # One integer and 2 other types + der = DerSetOf() + #import pdb; pdb.set_trace() + self.assertRaises(ValueError, der.decode, + b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) + + def testDecode4(self): + # Verify that decode returns the object + der = DerSetOf() + self.assertEqual(der, + der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff'))) + + ### + + def testErrDecode1(self): + # No leftovers allowed + der = DerSetOf() + self.assertRaises(ValueError, der.decode, + b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA')) + + +class DerBooleanTests(unittest.TestCase): + + def testEncode1(self): + der = DerBoolean(False) + self.assertEqual(der.encode(), b'\x01\x01\x00') + + def testEncode2(self): + der = DerBoolean(True) + self.assertEqual(der.encode(), b'\x01\x01\xFF') + + def testEncode3(self): + der = DerBoolean(False, implicit=0x12) + self.assertEqual(der.encode(), b'\x92\x01\x00') + + def testEncode4(self): + der = DerBoolean(False, explicit=0x05) + self.assertEqual(der.encode(), b'\xA5\x03\x01\x01\x00') + #### + + def testDecode1(self): + der = DerBoolean() + der.decode(b'\x01\x01\x00') + self.assertEqual(der.value, False) + + def testDecode2(self): + der = DerBoolean() + der.decode(b'\x01\x01\xFF') + self.assertEqual(der.value, True) + + def testDecode3(self): + der = DerBoolean(implicit=0x12) + der.decode(b'\x92\x01\x00') + self.assertEqual(der.value, False) + + def testDecode4(self): + der = DerBoolean(explicit=0x05) + der.decode(b'\xA5\x03\x01\x01\x00') + self.assertEqual(der.value, False) + + def testErrorDecode1(self): + der = DerBoolean() + # Wrong tag + self.assertRaises(ValueError, der.decode, b'\x02\x01\x00') + + def testErrorDecode2(self): + der = DerBoolean() + # Payload too long + self.assertRaises(ValueError, der.decode, b'\x01\x01\x00\xFF') + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(DerObjectTests) + listTests += list_test_cases(DerIntegerTests) + listTests += list_test_cases(DerSequenceTests) + listTests += list_test_cases(DerOctetStringTests) + listTests += list_test_cases(DerNullTests) + listTests += list_test_cases(DerObjectIdTests) + listTests += list_test_cases(DerBitStringTests) + listTests += list_test_cases(DerSetOfTests) + listTests += list_test_cases(DerBooleanTests) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py new file mode 100644 index 0000000..8221443 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_number.py: Self-test for parts of the Cryptodome.Util.number module +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self-tests for (some of) Cryptodome.Util.number""" + +import math +import unittest + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util import number +from Cryptodome.Util.number import long_to_bytes + + +class MyError(Exception): + """Dummy exception used for tests""" + +# NB: In some places, we compare tuples instead of just output values so that +# if any inputs cause a test failure, we'll be able to tell which ones. + +class MiscTests(unittest.TestCase): + + def test_ceil_div(self): + """Util.number.ceil_div""" + self.assertRaises(TypeError, number.ceil_div, "1", 1) + self.assertRaises(ZeroDivisionError, number.ceil_div, 1, 0) + self.assertRaises(ZeroDivisionError, number.ceil_div, -1, 0) + + # b = 1 + self.assertEqual(0, number.ceil_div(0, 1)) + self.assertEqual(1, number.ceil_div(1, 1)) + self.assertEqual(2, number.ceil_div(2, 1)) + self.assertEqual(3, number.ceil_div(3, 1)) + + # b = 2 + self.assertEqual(0, number.ceil_div(0, 2)) + self.assertEqual(1, number.ceil_div(1, 2)) + self.assertEqual(1, number.ceil_div(2, 2)) + self.assertEqual(2, number.ceil_div(3, 2)) + self.assertEqual(2, number.ceil_div(4, 2)) + self.assertEqual(3, number.ceil_div(5, 2)) + + # b = 3 + self.assertEqual(0, number.ceil_div(0, 3)) + self.assertEqual(1, number.ceil_div(1, 3)) + self.assertEqual(1, number.ceil_div(2, 3)) + self.assertEqual(1, number.ceil_div(3, 3)) + self.assertEqual(2, number.ceil_div(4, 3)) + self.assertEqual(2, number.ceil_div(5, 3)) + self.assertEqual(2, number.ceil_div(6, 3)) + self.assertEqual(3, number.ceil_div(7, 3)) + + # b = 4 + self.assertEqual(0, number.ceil_div(0, 4)) + self.assertEqual(1, number.ceil_div(1, 4)) + self.assertEqual(1, number.ceil_div(2, 4)) + self.assertEqual(1, number.ceil_div(3, 4)) + self.assertEqual(1, number.ceil_div(4, 4)) + self.assertEqual(2, number.ceil_div(5, 4)) + self.assertEqual(2, number.ceil_div(6, 4)) + self.assertEqual(2, number.ceil_div(7, 4)) + self.assertEqual(2, number.ceil_div(8, 4)) + self.assertEqual(3, number.ceil_div(9, 4)) + + def test_getPrime(self): + """Util.number.getPrime""" + self.assertRaises(ValueError, number.getPrime, -100) + self.assertRaises(ValueError, number.getPrime, 0) + self.assertRaises(ValueError, number.getPrime, 1) + + bits = 4 + for i in range(100): + x = number.getPrime(bits) + self.assertEqual(x >= (1 << bits - 1), 1) + self.assertEqual(x < (1 << bits), 1) + + bits = 512 + x = number.getPrime(bits) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x >= (1 << bits - 1), 1) + self.assertEqual(x < (1 << bits), 1) + + def test_getStrongPrime(self): + """Util.number.getStrongPrime""" + self.assertRaises(ValueError, number.getStrongPrime, 256) + self.assertRaises(ValueError, number.getStrongPrime, 513) + bits = 512 + x = number.getStrongPrime(bits) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + e = 2**16+1 + x = number.getStrongPrime(bits, e) + self.assertEqual(number.GCD(x-1, e), 1) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + e = 2**16+2 + x = number.getStrongPrime(bits, e) + self.assertEqual(number.GCD((x-1)>>1, e), 1) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + + def test_isPrime(self): + """Util.number.isPrime""" + self.assertEqual(number.isPrime(-3), False) # Regression test: negative numbers should not be prime + self.assertEqual(number.isPrime(-2), False) # Regression test: negative numbers should not be prime + self.assertEqual(number.isPrime(1), False) # Regression test: isPrime(1) caused some versions of PyCryptodome to crash. + self.assertEqual(number.isPrime(2), True) + self.assertEqual(number.isPrime(3), True) + self.assertEqual(number.isPrime(4), False) + self.assertEqual(number.isPrime(2**1279-1), True) + self.assertEqual(number.isPrime(-(2**1279-1)), False) # Regression test: negative numbers should not be prime + # test some known gmp pseudo-primes taken from + # http://www.trnicely.net/misc/mpzspsp.html + for composite in (43 * 127 * 211, 61 * 151 * 211, 15259 * 30517, + 346141 * 692281, 1007119 * 2014237, 3589477 * 7178953, + 4859419 * 9718837, 2730439 * 5460877, + 245127919 * 490255837, 963939391 * 1927878781, + 4186358431 * 8372716861, 1576820467 * 3153640933): + self.assertEqual(number.isPrime(int(composite)), False) + + def test_size(self): + self.assertEqual(number.size(2),2) + self.assertEqual(number.size(3),2) + self.assertEqual(number.size(0xa2),8) + self.assertEqual(number.size(0xa2ba40),8*3) + self.assertEqual(number.size(0xa2ba40ee07e3b2bd2f02ce227f36a195024486e49c19cb41bbbdfbba98b22b0e577c2eeaffa20d883a76e65e394c69d4b3c05a1e8fadda27edb2a42bc000fe888b9b32c22d15add0cd76b3e7936e19955b220dd17d4ea904b1ec102b2e4de7751222aa99151024c7cb41cc5ea21d00eeb41f7c800834d2c6e06bce3bce7ea9a5), 1024) + self.assertRaises(ValueError, number.size, -1) + + +class LongTests(unittest.TestCase): + + def test1(self): + self.assertEqual(long_to_bytes(0), b'\x00') + self.assertEqual(long_to_bytes(1), b'\x01') + self.assertEqual(long_to_bytes(0x100), b'\x01\x00') + self.assertEqual(long_to_bytes(0xFF00000000), b'\xFF\x00\x00\x00\x00') + self.assertEqual(long_to_bytes(0xFF00000000), b'\xFF\x00\x00\x00\x00') + self.assertEqual(long_to_bytes(0x1122334455667788), b'\x11\x22\x33\x44\x55\x66\x77\x88') + self.assertEqual(long_to_bytes(0x112233445566778899), b'\x11\x22\x33\x44\x55\x66\x77\x88\x99') + + def test2(self): + self.assertEqual(long_to_bytes(0, 1), b'\x00') + self.assertEqual(long_to_bytes(0, 2), b'\x00\x00') + self.assertEqual(long_to_bytes(1, 3), b'\x00\x00\x01') + self.assertEqual(long_to_bytes(65535, 2), b'\xFF\xFF') + self.assertEqual(long_to_bytes(65536, 2), b'\x00\x01\x00\x00') + self.assertEqual(long_to_bytes(0x100, 1), b'\x01\x00') + self.assertEqual(long_to_bytes(0xFF00000001, 6), b'\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 8), b'\x00\x00\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 10), b'\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 11), b'\x00\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x01') + + def test_err1(self): + self.assertRaises(ValueError, long_to_bytes, -1) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(MiscTests) + tests += list_test_cases(LongTests) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py new file mode 100644 index 0000000..43b137d --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py @@ -0,0 +1,38 @@ +import unittest + +import binascii +from Cryptodome.Util.RFC1751 import key_to_english, english_to_key + + +class RFC1751_Tests(unittest.TestCase): + + def test1(self): + data = [ + ('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'), + ('CCAC2AED591056BE4F90FD441C534766', 'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'), + ('EFF81F9BFBC65350920CDD7416DE8009', 'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL') + ] + + for key_hex, words in data: + key_bin = binascii.a2b_hex(key_hex) + + w2 = key_to_english(key_bin) + self.assertEqual(w2, words) + + k2 = english_to_key(words) + self.assertEqual(k2, key_bin) + + def test_error_key_to_english(self): + + self.assertRaises(ValueError, key_to_english, b'0' * 7) + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + tests = list_test_cases(RFC1751_Tests) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py new file mode 100644 index 0000000..6a96129 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py @@ -0,0 +1,280 @@ +# +# SelfTest/Util/test_strxor.py: Self-test for XORing +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.strxor import strxor, strxor_c + + +class StrxorTests(unittest.TestCase): + + def test1(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + self.assertEqual(strxor(term1, term2), result) + self.assertEqual(strxor(term2, term1), result) + + def test2(self): + es = b"" + self.assertEqual(strxor(es, es), es) + + def test3(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + all_zeros = b"\x00" * len(term1) + self.assertEqual(strxor(term1, term1), all_zeros) + + def test_wrong_length(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"ff339a83e5cd4cdf564990") + self.assertRaises(ValueError, strxor, term1, term2) + + def test_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_ba = bytearray(term1) + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + + self.assertEqual(strxor(term1_ba, term2), result) + + def test_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_mv = memoryview(term1) + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + + self.assertEqual(strxor(term1_mv, term2), result) + + def test_output_bytearray(self): + """Verify result can be stored in pre-allocated memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + original_term1 = term1[:] + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + output = bytearray(len(term1)) + + result = strxor(term1, term2, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_xor) + self.assertEqual(term1, original_term1) + self.assertEqual(term2, original_term2) + + def test_output_memoryview(self): + """Verify result can be stored in pre-allocated memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + original_term1 = term1[:] + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + output = memoryview(bytearray(len(term1))) + + result = strxor(term1, term2, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_xor) + self.assertEqual(term1, original_term1) + self.assertEqual(term2, original_term2) + + def test_output_overlapping_bytearray(self): + """Verify result can be stored in overlapping memory""" + + term1 = bytearray(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + + result = strxor(term1, term2, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + self.assertEqual(term2, original_term2) + + def test_output_overlapping_memoryview(self): + """Verify result can be stored in overlapping memory""" + + term1 = memoryview(bytearray(unhexlify(b"ff339a83e5cd4cdf5649"))) + term2 = unhexlify(b"383d4ba020573314395b") + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + + result = strxor(term1, term2, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + self.assertEqual(term2, original_term2) + + def test_output_ro_bytes(self): + """Verify result cannot be stored in read-only memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor, term1, term2, output=term1) + + def test_output_ro_memoryview(self): + """Verify result cannot be stored in read-only memory""" + + term1 = memoryview(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor, term1, term2, output=term1) + + def test_output_incorrect_length(self): + """Verify result cannot be stored in memory of incorrect length""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + output = bytearray(len(term1) - 1) + + self.assertRaises(ValueError, strxor, term1, term2, output=output) + + +class Strxor_cTests(unittest.TestCase): + + def test1(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + result = unhexlify(b"be72dbc2a48c0d9e1708") + self.assertEqual(strxor_c(term1, 65), result) + + def test2(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + self.assertEqual(strxor_c(term1, 0), term1) + + def test3(self): + self.assertEqual(strxor_c(b"", 90), b"") + + def test_wrong_range(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + self.assertRaises(ValueError, strxor_c, term1, -1) + self.assertRaises(ValueError, strxor_c, term1, 256) + + def test_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_ba = bytearray(term1) + result = unhexlify(b"be72dbc2a48c0d9e1708") + + self.assertEqual(strxor_c(term1_ba, 65), result) + + def test_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_mv = memoryview(term1) + result = unhexlify(b"be72dbc2a48c0d9e1708") + + self.assertEqual(strxor_c(term1_mv, 65), result) + + def test_output_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + original_term1 = term1[:] + expected_result = unhexlify(b"be72dbc2a48c0d9e1708") + output = bytearray(len(term1)) + + result = strxor_c(term1, 65, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_result) + self.assertEqual(term1, original_term1) + + def test_output_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + original_term1 = term1[:] + expected_result = unhexlify(b"be72dbc2a48c0d9e1708") + output = memoryview(bytearray(len(term1))) + + result = strxor_c(term1, 65, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_result) + self.assertEqual(term1, original_term1) + + def test_output_overlapping_bytearray(self): + """Verify result can be stored in overlapping memory""" + + term1 = bytearray(unhexlify(b"ff339a83e5cd4cdf5649")) + expected_xor = unhexlify(b"be72dbc2a48c0d9e1708") + + result = strxor_c(term1, 65, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + + def test_output_overlapping_memoryview(self): + """Verify result can be stored in overlapping memory""" + + term1 = memoryview(bytearray(unhexlify(b"ff339a83e5cd4cdf5649"))) + expected_xor = unhexlify(b"be72dbc2a48c0d9e1708") + + result = strxor_c(term1, 65, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + + def test_output_ro_bytes(self): + """Verify result cannot be stored in read-only memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + + self.assertRaises(TypeError, strxor_c, term1, 65, output=term1) + + def test_output_ro_memoryview(self): + """Verify result cannot be stored in read-only memory""" + + term1 = memoryview(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor_c, term1, 65, output=term1) + + def test_output_incorrect_length(self): + """Verify result cannot be stored in memory of incorrect length""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + output = bytearray(len(term1) - 1) + + self.assertRaises(ValueError, strxor_c, term1, 65, output=output) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(StrxorTests) + tests += list_test_cases(Strxor_cTests) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py new file mode 100644 index 0000000..dcc6ce6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/__init__.py: Self-test for PyCrypto +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Self tests + +These tests should perform quickly and can ideally be used every time an +application runs. +""" + +__revision__ = "$Id$" + +import sys +import unittest +from Cryptodome.Util.py3compat import StringIO + +class SelfTestError(Exception): + def __init__(self, message, result): + Exception.__init__(self, message, result) + self.message = message + self.result = result + +def run(module=None, verbosity=0, stream=None, tests=None, config=None, **kwargs): + """Execute self-tests. + + This raises SelfTestError if any test is unsuccessful. + + You may optionally pass in a sub-module of SelfTest if you only want to + perform some of the tests. For example, the following would test only the + hash modules: + + Cryptodome.SelfTest.run(Cryptodome.SelfTest.Hash) + + """ + + if config is None: + config = {} + suite = unittest.TestSuite() + if module is None: + if tests is None: + tests = get_tests(config=config) + suite.addTests(tests) + else: + if tests is None: + suite.addTests(module.get_tests(config=config)) + else: + raise ValueError("'module' and 'tests' arguments are mutually exclusive") + if stream is None: + kwargs['stream'] = StringIO() + else: + kwargs['stream'] = stream + runner = unittest.TextTestRunner(verbosity=verbosity, **kwargs) + result = runner.run(suite) + if not result.wasSuccessful(): + if stream is None: + sys.stderr.write(kwargs['stream'].getvalue()) + raise SelfTestError("Self-test failed", result) + return result + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest import Cipher; tests += Cipher.get_tests(config=config) + from Cryptodome.SelfTest import Hash; tests += Hash.get_tests(config=config) + from Cryptodome.SelfTest import Protocol; tests += Protocol.get_tests(config=config) + from Cryptodome.SelfTest import PublicKey; tests += PublicKey.get_tests(config=config) + from Cryptodome.SelfTest import Random; tests += Random.get_tests(config=config) + from Cryptodome.SelfTest import Util; tests += Util.get_tests(config=config) + from Cryptodome.SelfTest import Signature; tests += Signature.get_tests(config=config) + from Cryptodome.SelfTest import IO; tests += IO.get_tests(config=config) + from Cryptodome.SelfTest import Math; tests += Math.get_tests(config=config) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py new file mode 100644 index 0000000..28f0d37 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py @@ -0,0 +1,38 @@ +#! /usr/bin/env python +# +# __main__.py : Stand-along loader for PyCryptodome test suite +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import sys + +from Cryptodome import SelfTest + +slow_tests = not "--skip-slow-tests" in sys.argv +if not slow_tests: + print("Skipping slow tests") + +wycheproof_warnings = "--wycheproof-warnings" in sys.argv +if wycheproof_warnings: + print("Printing Wycheproof warnings") + +config = {'slow_tests' : slow_tests, 'wycheproof_warnings' : wycheproof_warnings } +SelfTest.run(stream=sys.stdout, verbosity=1, config=config) diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py new file mode 100644 index 0000000..34d5bd9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py @@ -0,0 +1,235 @@ +# =================================================================== +# +# Copyright (c) 2016, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os +import re +import json +import errno +import binascii +import warnings +from binascii import unhexlify +from Cryptodome.Util.py3compat import FileNotFoundError + + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +def _load_tests(dir_comps, file_in, description, conversions): + """Load and parse a test vector file + + Return a list of objects, one per group of adjacent + KV lines or for a single line in the form "[.*]". + + For a group of lines, the object has one attribute per line. + """ + + line_number = 0 + results = [] + + class TestVector(object): + def __init__(self, description, count): + self.desc = description + self.count = count + self.others = [] + + test_vector = None + count = 0 + new_group = True + + while True: + line_number += 1 + line = file_in.readline() + if not line: + if test_vector is not None: + results.append(test_vector) + break + line = line.strip() + + # Skip comments and empty lines + if line.startswith('#') or not line: + new_group = True + continue + + if line.startswith("["): + if test_vector is not None: + results.append(test_vector) + test_vector = None + results.append(line) + continue + + if new_group: + count += 1 + new_group = False + if test_vector is not None: + results.append(test_vector) + test_vector = TestVector("%s (#%d)" % (description, count), count) + + res = re.match("([A-Za-z0-9]+) = ?(.*)", line) + if not res: + test_vector.others += [line] + else: + token = res.group(1).lower() + data = res.group(2).lower() + + conversion = conversions.get(token, None) + if conversion is None: + if len(data) % 2 != 0: + data = "0" + data + setattr(test_vector, token, binascii.unhexlify(data)) + else: + setattr(test_vector, token, conversion(data)) + + # This line is ignored + return results + + +def load_test_vectors(dir_comps, file_name, description, conversions): + """Load and parse a test vector file, formatted using the NIST style. + + Args: + dir_comps (list of strings): + The path components under the ``pycryptodome_test_vectors`` package. + For instance ``("Cipher", "AES")``. + file_name (string): + The name of the file with the test vectors. + description (string): + A description applicable to the test vectors in the file. + conversions (dictionary): + The dictionary contains functions. + Values in the file that have an entry in this dictionary + will be converted usign the matching function. + Otherwise, values will be considered as hexadecimal and + converted to binary. + + Returns: + A list of test vector objects. + + The file is formatted in the following way: + + - Lines starting with "#" are comments and will be ignored. + - Each test vector is a sequence of 1 or more adjacent lines, where + each lines is an assignement. + - Test vectors are separated by an empty line, a comment, or + a line starting with "[". + + A test vector object has the following attributes: + + - desc (string): description + - counter (int): the order of the test vector in the file (from 1) + - others (list): zero or more lines of the test vector that were not assignments + - left-hand side of each assignment (lowercase): the value of the + assignement, either converted or bytes. + """ + + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + description = "%s test (%s)" % (description, file_name) + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name) as file_in: + results = _load_tests(dir_comps, file_in, description, conversions) + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for " + description, + UserWarning, + stacklevel=2) + + return results + + +def load_test_vectors_wycheproof(dir_comps, file_name, description, + root_tag={}, group_tag={}, unit_tag={}): + + result = [] + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name) as file_in: + tv_tree = json.load(file_in) + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for " + description, + UserWarning, + stacklevel=2) + return result + + class TestVector(object): + pass + + common_root = {} + for k, v in root_tag.items(): + common_root[k] = v(tv_tree) + + for group in tv_tree['testGroups']: + + common_group = {} + for k, v in group_tag.items(): + common_group[k] = v(group) + + for test in group['tests']: + tv = TestVector() + + for k, v in common_root.items(): + setattr(tv, k, v) + for k, v in common_group.items(): + setattr(tv, k, v) + + tv.id = test['tcId'] + tv.comment = test['comment'] + for attr in 'key', 'iv', 'aad', 'msg', 'ct', 'tag', 'label', 'ikm', 'salt', 'info', 'okm', 'sig': + if attr in test: + setattr(tv, attr, unhexlify(test[attr])) + tv.filename = file_name + + for k, v in unit_tag.items(): + setattr(tv, k, v(test)) + + tv.valid = test['result'] != "invalid" + tv.warning = test['result'] == "acceptable" + result.append(tv) + + return result + diff --git a/python/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py new file mode 100644 index 0000000..3565251 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/st_common.py: Common functions for SelfTest modules +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Common functions for SelfTest modules""" + +import unittest +import binascii +from Cryptodome.Util.py3compat import b + + +def list_test_cases(class_): + """Return a list of TestCase instances given a TestCase class + + This is useful when you have defined test* methods on your TestCase class. + """ + return unittest.TestLoader().loadTestsFromTestCase(class_) + +def strip_whitespace(s): + """Remove whitespace from a text or byte string""" + if isinstance(s,str): + return b("".join(s.split())) + else: + return b("").join(s.split()) + +def a2b_hex(s): + """Convert hexadecimal to binary, ignoring whitespace""" + return binascii.a2b_hex(strip_whitespace(s)) + +def b2a_hex(s): + """Convert binary to hexadecimal""" + # For completeness + return binascii.b2a_hex(s) + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py new file mode 100644 index 0000000..67f23ac --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py @@ -0,0 +1,403 @@ +# +# Signature/DSS.py : DSS.py +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.asn1 import DerSequence +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import HMAC +from Cryptodome.PublicKey.ECC import EccKey +from Cryptodome.PublicKey.DSA import DsaKey + +__all__ = ['DssSigScheme', 'new'] + + +class DssSigScheme(object): + """A (EC)DSA signature object. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.DSS.new`. + """ + + def __init__(self, key, encoding, order): + """Create a new Digital Signature Standard (DSS) object. + + Do not instantiate this object directly, + use `Cryptodome.Signature.DSS.new` instead. + """ + + self._key = key + self._encoding = encoding + self._order = order + + self._order_bits = self._order.size_in_bits() + self._order_bytes = (self._order_bits - 1) // 8 + 1 + + def can_sign(self): + """Return ``True`` if this signature object can be used + for signing messages.""" + + return self._key.has_private() + + def _compute_nonce(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def _valid_hash(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def sign(self, msg_hash): + """Compute the DSA/ECDSA signature of a message. + + Args: + msg_hash (hash object): + The hash that was carried out over the message. + The object belongs to the :mod:`Cryptodome.Hash` package. + Under mode ``'fips-186-3'``, the hash must be a FIPS + approved secure hash (SHA-2 or SHA-3). + + :return: The signature as ``bytes`` + :raise ValueError: if the hash algorithm is incompatible to the (EC)DSA key + :raise TypeError: if the (EC)DSA key has no private half + """ + + if not self._key.has_private(): + raise TypeError("Private key is needed to sign") + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + # Generate the nonce k (critical!) + nonce = self._compute_nonce(msg_hash) + + # Perform signature using the raw API + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + sig_pair = self._key._sign(z, nonce) + + # Encode the signature into a single byte string + if self._encoding == 'binary': + output = b"".join([long_to_bytes(x, self._order_bytes) + for x in sig_pair]) + else: + # Dss-sig ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + # Ecdsa-Sig-Value ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + output = DerSequence(sig_pair).encode() + + return output + + def verify(self, msg_hash, signature): + """Check if a certain (EC)DSA signature is authentic. + + Args: + msg_hash (hash object): + The hash that was carried out over the message. + This is an object belonging to the :mod:`Cryptodome.Hash` module. + Under mode ``'fips-186-3'``, the hash must be a FIPS + approved secure hash (SHA-2 or SHA-3). + + signature (``bytes``): + The signature that needs to be validated. + + :raise ValueError: if the signature is not authentic + """ + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + if self._encoding == 'binary': + if len(signature) != (2 * self._order_bytes): + raise ValueError("The signature is not authentic (length)") + r_prime, s_prime = [Integer.from_bytes(x) + for x in (signature[:self._order_bytes], + signature[self._order_bytes:])] + else: + try: + der_seq = DerSequence().decode(signature, strict=True) + except (ValueError, IndexError): + raise ValueError("The signature is not authentic (DER)") + if len(der_seq) != 2 or not der_seq.hasOnlyInts(): + raise ValueError("The signature is not authentic (DER content)") + r_prime, s_prime = Integer(der_seq[0]), Integer(der_seq[1]) + + if not (0 < r_prime < self._order) or not (0 < s_prime < self._order): + raise ValueError("The signature is not authentic (d)") + + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + result = self._key._verify(z, (r_prime, s_prime)) + if not result: + raise ValueError("The signature is not authentic") + # Make PyCryptodome code to fail + return False + + +class DeterministicDsaSigScheme(DssSigScheme): + # Also applicable to ECDSA + + def __init__(self, key, encoding, order, private_key): + super(DeterministicDsaSigScheme, self).__init__(key, encoding, order) + self._private_key = private_key + + def _bits2int(self, bstr): + """See 2.3.2 in RFC6979""" + + result = Integer.from_bytes(bstr) + q_len = self._order.size_in_bits() + b_len = len(bstr) * 8 + if b_len > q_len: + # Only keep leftmost q_len bits + result >>= (b_len - q_len) + return result + + def _int2octets(self, int_mod_q): + """See 2.3.3 in RFC6979""" + + assert 0 < int_mod_q < self._order + return long_to_bytes(int_mod_q, self._order_bytes) + + def _bits2octets(self, bstr): + """See 2.3.4 in RFC6979""" + + z1 = self._bits2int(bstr) + if z1 < self._order: + z2 = z1 + else: + z2 = z1 - self._order + return self._int2octets(z2) + + def _compute_nonce(self, mhash): + """Generate k in a deterministic way""" + + # See section 3.2 in RFC6979.txt + # Step a + h1 = mhash.digest() + # Step b + mask_v = b'\x01' * mhash.digest_size + # Step c + nonce_k = b'\x00' * mhash.digest_size + + for int_oct in (b'\x00', b'\x01'): + # Step d/f + nonce_k = HMAC.new(nonce_k, + mask_v + int_oct + + self._int2octets(self._private_key) + + self._bits2octets(h1), mhash).digest() + # Step e/g + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + nonce = -1 + while not (0 < nonce < self._order): + # Step h.C (second part) + if nonce != -1: + nonce_k = HMAC.new(nonce_k, mask_v + b'\x00', + mhash).digest() + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + # Step h.A + mask_t = b"" + + # Step h.B + while len(mask_t) < self._order_bytes: + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + mask_t += mask_v + + # Step h.C (first part) + nonce = self._bits2int(mask_t) + return nonce + + def _valid_hash(self, msg_hash): + return True + + +class FipsDsaSigScheme(DssSigScheme): + + #: List of L (bit length of p) and N (bit length of q) combinations + #: that are allowed by FIPS 186-3. The security level is provided in + #: Table 2 of FIPS 800-57 (rev3). + _fips_186_3_L_N = ( + (1024, 160), # 80 bits (SHA-1 or stronger) + (2048, 224), # 112 bits (SHA-224 or stronger) + (2048, 256), # 128 bits (SHA-256 or stronger) + (3072, 256) # 256 bits (SHA-512) + ) + + def __init__(self, key, encoding, order, randfunc): + super(FipsDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + L = Integer(key.p).size_in_bits() + if (L, self._order_bits) not in self._fips_186_3_L_N: + error = ("L/N (%d, %d) is not compliant to FIPS 186-3" + % (L, self._order_bits)) + raise ValueError(error) + + def _compute_nonce(self, msg_hash): + # hash is not used + return Integer.random_range(min_inclusive=1, + max_exclusive=self._order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that SHA-1, SHA-2 or SHA-3 are used""" + return (msg_hash.oid == "1.3.14.3.2.26" or + msg_hash.oid.startswith("2.16.840.1.101.3.4.2.")) + + +class FipsEcDsaSigScheme(DssSigScheme): + + def __init__(self, key, encoding, order, randfunc): + super(FipsEcDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + def _compute_nonce(self, msg_hash): + return Integer.random_range(min_inclusive=1, + max_exclusive=self._key._curve.order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that the strength of the hash matches or exceeds + the strength of the EC. We fail if the hash is too weak.""" + + modulus_bits = self._key.pointQ.size_in_bits() + + # SHS: SHA-2, SHA-3, truncated SHA-512 + sha224 = ("2.16.840.1.101.3.4.2.4", "2.16.840.1.101.3.4.2.7", "2.16.840.1.101.3.4.2.5") + sha256 = ("2.16.840.1.101.3.4.2.1", "2.16.840.1.101.3.4.2.8", "2.16.840.1.101.3.4.2.6") + sha384 = ("2.16.840.1.101.3.4.2.2", "2.16.840.1.101.3.4.2.9") + sha512 = ("2.16.840.1.101.3.4.2.3", "2.16.840.1.101.3.4.2.10") + shs = sha224 + sha256 + sha384 + sha512 + + try: + result = msg_hash.oid in shs + except AttributeError: + result = False + return result + + +def new(key, mode, encoding='binary', randfunc=None): + """Create a signature object :class:`DssSigScheme` that + can perform (EC)DSA signature or verification. + + .. note:: + Refer to `NIST SP 800 Part 1 Rev 4`_ (or newer release) for an + overview of the recommended key lengths. + + Args: + key (:class:`Cryptodome.PublicKey.DSA` or :class:`Cryptodome.PublicKey.ECC`): + The key to use for computing the signature (*private* keys only) + or for verifying one. + For DSA keys, let ``L`` and ``N`` be the bit lengths of the modulus ``p`` + and of ``q``: the pair ``(L,N)`` must appear in the following list, + in compliance to section 4.2 of `FIPS 186-4`_: + + - (1024, 160) *legacy only; do not create new signatures with this* + - (2048, 224) *deprecated; do not create new signatures with this* + - (2048, 256) + - (3072, 256) + + For ECC, only keys over P-224, P-256, P-384, and P-521 are accepted. + + mode (string): + The parameter can take these values: + + - ``'fips-186-3'``. The signature generation is randomized and carried out + according to `FIPS 186-3`_: the nonce ``k`` is taken from the RNG. + - ``'deterministic-rfc6979'``. The signature generation is not + randomized. See RFC6979_. + + encoding (string): + How the signature is encoded. This value determines the output of + :meth:`sign` and the input to :meth:`verify`. + + The following values are accepted: + + - ``'binary'`` (default), the signature is the raw concatenation + of ``r`` and ``s``. It is defined in the IEEE P.1363 standard. + For DSA, the size in bytes of the signature is ``N/4`` bytes + (e.g. 64 for ``N=256``). + For ECDSA, the signature is always twice the length of a point + coordinate (e.g. 64 bytes for P-256). + + - ``'der'``, the signature is a ASN.1 DER SEQUENCE + with two INTEGERs (``r`` and ``s``). It is defined in RFC3279_. + The size of the signature is variable. + + randfunc (callable): + A function that returns random ``bytes``, of a given length. + If omitted, the internal RNG is used. + Only applicable for the *'fips-186-3'* mode. + + .. _FIPS 186-3: http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + .. _NIST SP 800 Part 1 Rev 4: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf + .. _RFC6979: http://tools.ietf.org/html/rfc6979 + .. _RFC3279: https://tools.ietf.org/html/rfc3279#section-2.2.2 + """ + + # The goal of the 'mode' parameter is to avoid to + # have the current version of the standard as default. + # + # Over time, such version will be superseded by (for instance) + # FIPS 186-4 and it will be odd to have -3 as default. + + if encoding not in ('binary', 'der'): + raise ValueError("Unknown encoding '%s'" % encoding) + + if isinstance(key, EccKey): + order = key._curve.order + private_key_attr = 'd' + if key._curve.name == "ed25519": + raise ValueError("ECC key is not on a NIST P curve") + elif isinstance(key, DsaKey): + order = Integer(key.q) + private_key_attr = 'x' + else: + raise ValueError("Unsupported key type " + str(type(key))) + + if key.has_private(): + private_key = getattr(key, private_key_attr) + else: + private_key = None + + if mode == 'deterministic-rfc6979': + return DeterministicDsaSigScheme(key, encoding, order, private_key) + elif mode == 'fips-186-3': + if isinstance(key, EccKey): + return FipsEcDsaSigScheme(key, encoding, order, randfunc) + else: + return FipsDsaSigScheme(key, encoding, order, randfunc) + else: + raise ValueError("Unknown DSS mode '%s'" % mode) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi new file mode 100644 index 0000000..52ecc8f --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi @@ -0,0 +1,27 @@ +from typing import Union, Optional, Callable +from typing_extensions import Protocol + +from Cryptodome.PublicKey.DSA import DsaKey +from Cryptodome.PublicKey.ECC import EccKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +__all__ = ['new'] + +class DssSigScheme: + def __init__(self, key: Union[DsaKey, EccKey], encoding: str, order: int) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> bool: ... + +class DeterministicDsaSigScheme(DssSigScheme): + def __init__(self, key, encoding, order, private_key) -> None: ... + +class FipsDsaSigScheme(DssSigScheme): + def __init__(self, key: DsaKey, encoding: str, order: int, randfunc: Callable) -> None: ... + +class FipsEcDsaSigScheme(DssSigScheme): + def __init__(self, key: EccKey, encoding: str, order: int, randfunc: Callable) -> None: ... + +def new(key: Union[DsaKey, EccKey], mode: str, encoding: Optional[str]='binary', randfunc: Optional[Callable]=None) -> Union[DeterministicDsaSigScheme, FipsDsaSigScheme, FipsEcDsaSigScheme]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py new file mode 100644 index 0000000..1e7e5b5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py @@ -0,0 +1,55 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Legacy module for PKCS#1 PSS signatures. + +:undocumented: __package__ +""" + +import types + +from Cryptodome.Signature import pss + + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + + +def new(rsa_key, mgfunc=None, saltLen=None, randfunc=None): + pkcs1 = pss.new(rsa_key, mask_func=mgfunc, + salt_bytes=saltLen, rand_func=randfunc) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi new file mode 100644 index 0000000..e7424f5 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi @@ -0,0 +1,28 @@ +from typing import Union, Callable, Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + + +class Hash(Protocol): + def digest(self) -> bytes: ... + def update(self, bytes) -> None: ... + + +class HashModule(Protocol): + @staticmethod + def new(data: Optional[bytes]) -> Hash: ... + + +MaskFunction = Callable[[bytes, int, Union[Hash, HashModule]], bytes] +RndFunction = Callable[[int], bytes] + +class PSS_SigScheme: + def __init__(self, key: RsaKey, mgfunc: MaskFunction, saltLen: int, randfunc: RndFunction) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> bool: ... + + + +def new(rsa_key: RsaKey, mgfunc: Optional[MaskFunction]=None, saltLen: Optional[int]=None, randfunc: Optional[RndFunction]=None) -> PSS_SigScheme: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py new file mode 100644 index 0000000..d560663 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py @@ -0,0 +1,53 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +""" +Legacy module for PKCS#1 v1.5 signatures. + +:undocumented: __package__ +""" + +import types + +from Cryptodome.Signature import pkcs1_15 + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + +def new(rsa_key): + pkcs1 = pkcs1_15.new(rsa_key) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi new file mode 100644 index 0000000..d02555c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi @@ -0,0 +1,16 @@ +from typing import Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +class PKCS115_SigScheme: + def __init__(self, rsa_key: RsaKey) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> bool: ... + + +def new(rsa_key: RsaKey) -> PKCS115_SigScheme: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py new file mode 100644 index 0000000..11ca64c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py @@ -0,0 +1,36 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +"""Digital signature protocols + +A collection of standardized protocols to carry out digital signatures. +""" + +__all__ = ['PKCS1_v1_5', 'PKCS1_PSS', 'DSS', 'pkcs1_15', 'pss', 'eddsa'] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py new file mode 100644 index 0000000..638b96b --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py @@ -0,0 +1,343 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHA512, SHAKE256 +from Cryptodome.Util.py3compat import bchr, is_bytes +from Cryptodome.PublicKey.ECC import (EccKey, + construct, + _import_ed25519_public_key, + _import_ed448_public_key) + + +def import_public_key(encoded): + """Create a new Ed25519 or Ed448 public key object, + starting from the key encoded as raw ``bytes``, + in the format described in RFC8032. + + Args: + encoded (bytes): + The EdDSA public key to import. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + Returns: + :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object. + + Raises: + ValueError: when the given key cannot be parsed. + """ + + if len(encoded) == 32: + x, y = _import_ed25519_public_key(encoded) + curve_name = "Ed25519" + elif len(encoded) == 57: + x, y = _import_ed448_public_key(encoded) + curve_name = "Ed448" + else: + raise ValueError("Not an EdDSA key (%d bytes)" % len(encoded)) + return construct(curve=curve_name, point_x=x, point_y=y) + + +def import_private_key(encoded): + """Create a new Ed25519 or Ed448 private key object, + starting from the key encoded as raw ``bytes``, + in the format described in RFC8032. + + Args: + encoded (bytes): + The EdDSA private key to import. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + Returns: + :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object. + + Raises: + ValueError: when the given key cannot be parsed. + """ + + if len(encoded) == 32: + curve_name = "ed25519" + elif len(encoded) == 57: + curve_name = "ed448" + else: + raise ValueError("Incorrect length. Only EdDSA private keys are supported.") + + # Note that the private key is truly a sequence of random bytes, + # so we cannot check its correctness in any way. + + return construct(seed=encoded, curve=curve_name) + + +class EdDSASigScheme(object): + """An EdDSA signature object. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.eddsa.new`. + """ + + def __init__(self, key, context): + """Create a new EdDSA object. + + Do not instantiate this object directly, + use `Cryptodome.Signature.DSS.new` instead. + """ + + self._key = key + self._context = context + self._A = key._export_eddsa() + self._order = key._curve.order + + def can_sign(self): + """Return ``True`` if this signature object can be used + for signing messages.""" + + return self._key.has_private() + + def sign(self, msg_or_hash): + """Compute the EdDSA signature of a message. + + Args: + msg_or_hash (bytes or a hash object): + The message to sign (``bytes``, in case of *PureEdDSA*) or + the hash that was carried out over the message (hash object, for *HashEdDSA*). + + The hash object must be :class:`Cryptodome.Hash.SHA512` for Ed25519, + and :class:`Cryptodome.Hash.SHAKE256` object for Ed448. + + :return: The signature as ``bytes``. It is always 64 bytes for Ed25519, and 114 bytes for Ed448. + :raise TypeError: if the EdDSA key has no private half + """ + + if not self._key.has_private(): + raise TypeError("Private key is needed to sign") + + if self._key._curve.name == "ed25519": + ph = isinstance(msg_or_hash, SHA512.SHA512Hash) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHA-512 hash") + eddsa_sign_method = self._sign_ed25519 + + elif self._key._curve.name == "ed448": + ph = isinstance(msg_or_hash, SHAKE256.SHAKE256_XOF) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHAKE256 hash") + eddsa_sign_method = self._sign_ed448 + + else: + raise ValueError("Incorrect curve for EdDSA") + + return eddsa_sign_method(msg_or_hash, ph) + + def _sign_ed25519(self, msg_or_hash, ph): + + if self._context or ph: + flag = int(ph) + # dom2(flag, self._context) + dom2 = b'SigEd25519 no Ed25519 collisions' + bchr(flag) + \ + bchr(len(self._context)) + self._context + else: + dom2 = b'' + + PHM = msg_or_hash.digest() if ph else msg_or_hash + + # See RFC 8032, section 5.1.6 + + # Step 2 + r_hash = SHA512.new(dom2 + self._key._prefix + PHM).digest() + r = Integer.from_bytes(r_hash, 'little') % self._order + # Step 3 + R_pk = EccKey(point=r * self._key._curve.G)._export_eddsa() + # Step 4 + k_hash = SHA512.new(dom2 + R_pk + self._A + PHM).digest() + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 5 + s = (r + k * self._key.d) % self._order + + return R_pk + s.to_bytes(32, 'little') + + def _sign_ed448(self, msg_or_hash, ph): + + flag = int(ph) + # dom4(flag, self._context) + dom4 = b'SigEd448' + bchr(flag) + \ + bchr(len(self._context)) + self._context + + PHM = msg_or_hash.read(64) if ph else msg_or_hash + + # See RFC 8032, section 5.2.6 + + # Step 2 + r_hash = SHAKE256.new(dom4 + self._key._prefix + PHM).read(114) + r = Integer.from_bytes(r_hash, 'little') % self._order + # Step 3 + R_pk = EccKey(point=r * self._key._curve.G)._export_eddsa() + # Step 4 + k_hash = SHAKE256.new(dom4 + R_pk + self._A + PHM).read(114) + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 5 + s = (r + k * self._key.d) % self._order + + return R_pk + s.to_bytes(57, 'little') + + def verify(self, msg_or_hash, signature): + """Check if an EdDSA signature is authentic. + + Args: + msg_or_hash (bytes or a hash object): + The message to verify (``bytes``, in case of *PureEdDSA*) or + the hash that was carried out over the message (hash object, for *HashEdDSA*). + + The hash object must be :class:`Cryptodome.Hash.SHA512` object for Ed25519, + and :class:`Cryptodome.Hash.SHAKE256` for Ed448. + + signature (``bytes``): + The signature that needs to be validated. + It must be 64 bytes for Ed25519, and 114 bytes for Ed448. + + :raise ValueError: if the signature is not authentic + """ + + if self._key._curve.name == "ed25519": + ph = isinstance(msg_or_hash, SHA512.SHA512Hash) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHA-512 hash") + eddsa_verify_method = self._verify_ed25519 + + elif self._key._curve.name == "ed448": + ph = isinstance(msg_or_hash, SHAKE256.SHAKE256_XOF) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHAKE256 hash") + eddsa_verify_method = self._verify_ed448 + + else: + raise ValueError("Incorrect curve for EdDSA") + + return eddsa_verify_method(msg_or_hash, signature, ph) + + def _verify_ed25519(self, msg_or_hash, signature, ph): + + if len(signature) != 64: + raise ValueError("The signature is not authentic (length)") + + if self._context or ph: + flag = int(ph) + dom2 = b'SigEd25519 no Ed25519 collisions' + bchr(flag) + \ + bchr(len(self._context)) + self._context + else: + dom2 = b'' + + PHM = msg_or_hash.digest() if ph else msg_or_hash + + # Section 5.1.7 + + # Step 1 + try: + R = import_public_key(signature[:32]).pointQ + except ValueError: + raise ValueError("The signature is not authentic (R)") + s = Integer.from_bytes(signature[32:], 'little') + if s > self._order: + raise ValueError("The signature is not authentic (S)") + # Step 2 + k_hash = SHA512.new(dom2 + signature[:32] + self._A + PHM).digest() + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 3 + point1 = s * 8 * self._key._curve.G + # OPTIMIZE: with double-scalar multiplication, with no SCA + # countermeasures because it is public values + point2 = 8 * R + k * 8 * self._key.pointQ + if point1 != point2: + raise ValueError("The signature is not authentic") + + def _verify_ed448(self, msg_or_hash, signature, ph): + + if len(signature) != 114: + raise ValueError("The signature is not authentic (length)") + + flag = int(ph) + # dom4(flag, self._context) + dom4 = b'SigEd448' + bchr(flag) + \ + bchr(len(self._context)) + self._context + + PHM = msg_or_hash.read(64) if ph else msg_or_hash + + # Section 5.2.7 + + # Step 1 + try: + R = import_public_key(signature[:57]).pointQ + except ValueError: + raise ValueError("The signature is not authentic (R)") + s = Integer.from_bytes(signature[57:], 'little') + if s > self._order: + raise ValueError("The signature is not authentic (S)") + # Step 2 + k_hash = SHAKE256.new(dom4 + signature[:57] + self._A + PHM).read(114) + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 3 + point1 = s * 8 * self._key._curve.G + # OPTIMIZE: with double-scalar multiplication, with no SCA + # countermeasures because it is public values + point2 = 8 * R + k * 8 * self._key.pointQ + if point1 != point2: + raise ValueError("The signature is not authentic") + + +def new(key, mode, context=None): + """Create a signature object :class:`EdDSASigScheme` that + can perform or verify an EdDSA signature. + + Args: + key (:class:`Cryptodome.PublicKey.ECC` object): + The key to use for computing the signature (*private* keys only) + or for verifying one. + The key must be on the curve ``Ed25519`` or ``Ed448``. + + mode (string): + This parameter must be ``'rfc8032'``. + + context (bytes): + Up to 255 bytes of `context <https://datatracker.ietf.org/doc/html/rfc8032#page-41>`_, + which is a constant byte string to segregate different protocols or + different applications of the same key. + """ + + if not isinstance(key, EccKey) or not key._is_eddsa(): + raise ValueError("EdDSA can only be used with EdDSA keys") + + if mode != 'rfc8032': + raise ValueError("Mode must be 'rfc8032'") + + if context is None: + context = b'' + elif len(context) > 255: + raise ValueError("Context for EdDSA must not be longer than 255 bytes") + + return EdDSASigScheme(key, context) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi new file mode 100644 index 0000000..809a7ad --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi @@ -0,0 +1,21 @@ +from typing import Union, Optional +from typing_extensions import Protocol +from Cryptodome.PublicKey.ECC import EccKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +class XOF(Protocol): + def read(self, len: int) -> bytes: ... + +def import_public_key(encoded: bytes) -> EccKey: ... +def import_private_key(encoded: bytes) -> EccKey: ... + +class EdDSASigScheme(object): + + def __init__(self, key: EccKey, context: bytes) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_or_hash: Union[bytes, Hash, XOF]) -> bytes: ... + def verify(self, msg_or_hash: Union[bytes, Hash, XOF], signature: bytes) -> None: ... + +def new(key: EccKey, mode: str, context: Optional[bytes]=None) -> EdDSASigScheme: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py new file mode 100644 index 0000000..ae9257e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py @@ -0,0 +1,222 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import Cryptodome.Util.number +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Cryptodome.Util.asn1 import DerSequence, DerNull, DerOctetString, DerObjectId + +class PKCS115_SigScheme: + """A signature object for ``RSASSA-PKCS1-v1_5``. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.pkcs1_15.new`. + """ + + def __init__(self, rsa_key): + """Initialize this PKCS#1 v1.5 signature scheme object. + + :Parameters: + rsa_key : an RSA key object + Creation of signatures is only possible if this is a *private* + RSA key. Verification of signatures is always possible. + """ + self._key = rsa_key + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 v1.5 signature of a message. + + This function is also called ``RSASSA-PKCS1-V1_5-SIGN`` and + it is specified in + `section 8.2.1 of RFC8017 <https://tools.ietf.org/html/rfc8017#page-36>`_. + + :parameter msg_hash: + This is an object from the :mod:`Cryptodome.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # See 8.2.1 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits,8) # Convert from bits to bytes + + # Step 1 + em = _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k) + # Step 2a (OS2IP) + em_int = bytes_to_long(em) + # Step 2b (RSASP1) + m_int = self._key._decrypt(em_int) + # Step 2c (I2OSP) + signature = long_to_bytes(m_int, k) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 v1.5 signature over a message is valid. + + This function is also called ``RSASSA-PKCS1-V1_5-VERIFY`` and + it is specified in + `section 8.2.2 of RFC8037 <https://tools.ietf.org/html/rfc8017#page-37>`_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Cryptodome.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: byte string + + :raise ValueError: if the signature is not valid. + """ + + # See 8.2.2 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + + # Step 1 + if len(signature) != k: + raise ValueError("Invalid signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + em1 = long_to_bytes(em_int, k) + # Step 3 + try: + possible_em1 = [ _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, True) ] + # MD2/4/5 hashes always require NULL params in AlgorithmIdentifier. + # For all others, it is optional. + try: + algorithm_is_md = msg_hash.oid.startswith('1.2.840.113549.2.') + except AttributeError: + algorithm_is_md = False + if not algorithm_is_md: # MD2/MD4/MD5 + possible_em1.append(_EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, False)) + except ValueError: + raise ValueError("Invalid signature") + # Step 4 + # By comparing the full encodings (as opposed to checking each + # of its components one at a time) we avoid attacks to the padding + # scheme like Bleichenbacher's (see http://www.mail-archive.com/cryptography@metzdowd.com/msg06537). + # + if em1 not in possible_em1: + raise ValueError("Invalid signature") + pass + + +def _EMSA_PKCS1_V1_5_ENCODE(msg_hash, emLen, with_hash_parameters=True): + """ + Implement the ``EMSA-PKCS1-V1_5-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.2). + + ``_EMSA-PKCS1-V1_5-ENCODE`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + msg_hash : hash object + The hash object that holds the digest of the message being signed. + emLen : int + The length the final encoding must have, in bytes. + with_hash_parameters : bool + If True (default), include NULL parameters for the hash + algorithm in the ``digestAlgorithm`` SEQUENCE. + + :attention: the early standard (RFC2313) stated that ``DigestInfo`` + had to be BER-encoded. This means that old signatures + might have length tags in indefinite form, which + is not supported in DER. Such encoding cannot be + reproduced by this function. + + :Return: An ``emLen`` byte long string that encodes the hash. + """ + + # First, build the ASN.1 DER object DigestInfo: + # + # DigestInfo ::= SEQUENCE { + # digestAlgorithm AlgorithmIdentifier, + # digest OCTET STRING + # } + # + # where digestAlgorithm identifies the hash function and shall be an + # algorithm ID with an OID in the set PKCS1-v1-5DigestAlgorithms. + # + # PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= { + # { OID id-md2 PARAMETERS NULL }| + # { OID id-md5 PARAMETERS NULL }| + # { OID id-sha1 PARAMETERS NULL }| + # { OID id-sha256 PARAMETERS NULL }| + # { OID id-sha384 PARAMETERS NULL }| + # { OID id-sha512 PARAMETERS NULL } + # } + # + # Appendix B.1 also says that for SHA-1/-2 algorithms, the parameters + # should be omitted. They may be present, but when they are, they shall + # have NULL value. + + digestAlgo = DerSequence([ DerObjectId(msg_hash.oid).encode() ]) + + if with_hash_parameters: + digestAlgo.append(DerNull().encode()) + + digest = DerOctetString(msg_hash.digest()) + digestInfo = DerSequence([ + digestAlgo.encode(), + digest.encode() + ]).encode() + + # We need at least 11 bytes for the remaining data: 3 fixed bytes and + # at least 8 bytes of padding). + if emLen<len(digestInfo)+11: + raise TypeError("Selected hash algorithm has a too long digest (%d bytes)." % len(digest)) + PS = b'\xFF' * (emLen - len(digestInfo) - 3) + return b'\x00\x01' + PS + b'\x00' + digestInfo + +def new(rsa_key): + """Create a signature object for creating + or verifying PKCS#1 v1.5 signatures. + + :parameter rsa_key: + The RSA key to use for signing or verifying the message. + This is a :class:`Cryptodome.PublicKey.RSA` object. + Signing is only possible when ``rsa_key`` is a **private** RSA key. + :type rsa_key: RSA object + + :return: a :class:`PKCS115_SigScheme` signature object + """ + return PKCS115_SigScheme(rsa_key) + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi new file mode 100644 index 0000000..04faf60 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi @@ -0,0 +1,17 @@ +from typing import Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +class PKCS115_SigScheme: + def __init__(self, rsa_key: RsaKey) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> None: ... + +def _EMSA_PKCS1_V1_5_ENCODE(msg_hash: Hash, emLen: int, with_hash_parameters: Optional[bool]=True) -> bytes: ... + +def new(rsa_key: RsaKey) -> PKCS115_SigScheme: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.py b/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.py new file mode 100644 index 0000000..0b05ed2 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.py @@ -0,0 +1,386 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util.py3compat import bchr, bord, iter_range +import Cryptodome.Util.number +from Cryptodome.Util.number import (ceil_div, + long_to_bytes, + bytes_to_long + ) +from Cryptodome.Util.strxor import strxor +from Cryptodome import Random + + +class PSS_SigScheme: + """A signature object for ``RSASSA-PSS``. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.pss.new`. + """ + + def __init__(self, key, mgfunc, saltLen, randfunc): + """Initialize this PKCS#1 PSS signature scheme object. + + :Parameters: + key : an RSA key object + If a private half is given, both signature and + verification are possible. + If a public half is given, only verification is possible. + mgfunc : callable + A mask generation function that accepts two parameters: + a string to use as seed, and the lenth of the mask to + generate, in bytes. + saltLen : integer + Length of the salt, in bytes. + randfunc : callable + A function that returns random bytes. + """ + + self._key = key + self._saltLen = saltLen + self._mgfunc = mgfunc + self._randfunc = randfunc + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 PSS signature of a message. + + This function is also called ``RSASSA-PSS-SIGN`` and + it is specified in + `section 8.1.1 of RFC8017 <https://tools.ietf.org/html/rfc8017#section-8.1.1>`_. + + :parameter msg_hash: + This is an object from the :mod:`Cryptodome.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + + if self._mgfunc is None: + mgf = lambda x, y: MGF1(x, y, msg_hash) + else: + mgf = self._mgfunc + + modBits = Cryptodome.Util.number.size(self._key.n) + + # See 8.1.1 in RFC3447 + k = ceil_div(modBits, 8) # k is length in bytes of the modulus + # Step 1 + em = _EMSA_PSS_ENCODE(msg_hash, modBits-1, self._randfunc, mgf, sLen) + # Step 2a (OS2IP) + em_int = bytes_to_long(em) + # Step 2b (RSASP1) + m_int = self._key._decrypt(em_int) + # Step 2c (I2OSP) + signature = long_to_bytes(m_int, k) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 PSS signature over a message is valid. + + This function is also called ``RSASSA-PSS-VERIFY`` and + it is specified in + `section 8.1.2 of RFC8037 <https://tools.ietf.org/html/rfc8017#section-8.1.2>`_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Cryptodome.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: bytes + + :raise ValueError: if the signature is not valid. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + if self._mgfunc: + mgf = self._mgfunc + else: + mgf = lambda x, y: MGF1(x, y, msg_hash) + + modBits = Cryptodome.Util.number.size(self._key.n) + + # See 8.1.2 in RFC3447 + k = ceil_div(modBits, 8) # Convert from bits to bytes + # Step 1 + if len(signature) != k: + raise ValueError("Incorrect signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + emLen = ceil_div(modBits - 1, 8) + em = long_to_bytes(em_int, emLen) + # Step 3/4 + _EMSA_PSS_VERIFY(msg_hash, em, modBits-1, mgf, sLen) + + +def MGF1(mgfSeed, maskLen, hash_gen): + """Mask Generation Function, described in `B.2.1 of RFC8017 + <https://tools.ietf.org/html/rfc8017>`_. + + :param mfgSeed: + seed from which the mask is generated + :type mfgSeed: byte string + + :param maskLen: + intended length in bytes of the mask + :type maskLen: integer + + :param hash_gen: + A module or a hash object from :mod:`Cryptodome.Hash` + :type hash_object: + + :return: the mask, as a *byte string* + """ + + T = b"" + for counter in iter_range(ceil_div(maskLen, hash_gen.digest_size)): + c = long_to_bytes(counter, 4) + hobj = hash_gen.new() + hobj.update(mgfSeed + c) + T = T + hobj.digest() + assert(len(T) >= maskLen) + return T[:maskLen] + + +def _EMSA_PSS_ENCODE(mhash, emBits, randFunc, mgf, sLen): + r""" + Implement the ``EMSA-PSS-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.1). + + The original ``EMSA-PSS-ENCODE`` actually accepts the message ``M`` + as input, and hash it internally. Here, we expect that the message + has already been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message being signed. + emBits : int + Maximum length of the final encoding, in bits. + randFunc : callable + An RNG function that accepts as only parameter an int, and returns + a string of random bytes, to be used as salt. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Return: An ``emLen`` byte long string that encodes the hash + (with ``emLen = \ceil(emBits/8)``). + + :Raise ValueError: + When digest or salt length are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Digest or salt length are too long" + " for given key size.") + # Step 4 + salt = randFunc(sLen) + # Step 5 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 6 + h = mhash.new() + h.update(m_prime) + # Step 7 + ps = bchr(0)*(emLen-sLen-mhash.digest_size-2) + # Step 8 + db = ps + bchr(1) + salt + # Step 9 + dbMask = mgf(h.digest(), emLen-mhash.digest_size-1) + # Step 10 + maskedDB = strxor(db, dbMask) + # Step 11 + maskedDB = bchr(bord(maskedDB[0]) & ~lmask) + maskedDB[1:] + # Step 12 + em = maskedDB + h.digest() + bchr(0xBC) + return em + + +def _EMSA_PSS_VERIFY(mhash, em, emBits, mgf, sLen): + """ + Implement the ``EMSA-PSS-VERIFY`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.2). + + ``EMSA-PSS-VERIFY`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message to be verified. + em : string + The signature to verify, therefore proving that the sender really + signed the message that was received. + emBits : int + Length of the final encoding (em), in bits. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Raise ValueError: + When the encoding is inconsistent, or the digest or salt lengths + are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Incorrect signature") + # Step 4 + if ord(em[-1:]) != 0xBC: + raise ValueError("Incorrect signature") + # Step 5 + maskedDB = em[:emLen-mhash.digest_size-1] + h = em[emLen-mhash.digest_size-1:-1] + # Step 6 + if lmask & bord(em[0]): + raise ValueError("Incorrect signature") + # Step 7 + dbMask = mgf(h, emLen-mhash.digest_size-1) + # Step 8 + db = strxor(maskedDB, dbMask) + # Step 9 + db = bchr(bord(db[0]) & ~lmask) + db[1:] + # Step 10 + if not db.startswith(bchr(0)*(emLen-mhash.digest_size-sLen-2) + bchr(1)): + raise ValueError("Incorrect signature") + # Step 11 + if sLen > 0: + salt = db[-sLen:] + else: + salt = b"" + # Step 12 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 13 + hobj = mhash.new() + hobj.update(m_prime) + hp = hobj.digest() + # Step 14 + if h != hp: + raise ValueError("Incorrect signature") + + +def new(rsa_key, **kwargs): + """Create an object for making or verifying PKCS#1 PSS signatures. + + :parameter rsa_key: + The RSA key to use for signing or verifying the message. + This is a :class:`Cryptodome.PublicKey.RSA` object. + Signing is only possible when ``rsa_key`` is a **private** RSA key. + :type rsa_key: RSA object + + :Keyword Arguments: + + * *mask_func* (``callable``) -- + A function that returns the mask (as `bytes`). + It must accept two parameters: a seed (as `bytes`) + and the length of the data to return. + + If not specified, it will be the function :func:`MGF1` defined in + `RFC8017 <https://tools.ietf.org/html/rfc8017#page-67>`_ and + combined with the same hash algorithm applied to the + message to sign or verify. + + If you want to use a different function, for instance still :func:`MGF1` + but together with another hash, you can do:: + + from Cryptodome.Hash import SHA256 + from Cryptodome.Signature.pss import MGF1 + mgf = lambda x, y: MGF1(x, y, SHA256) + + * *salt_bytes* (``integer``) -- + Length of the salt, in bytes. + It is a value between 0 and ``emLen - hLen - 2``, where ``emLen`` + is the size of the RSA modulus and ``hLen`` is the size of the digest + applied to the message to sign or verify. + + The salt is generated internally, you don't need to provide it. + + If not specified, the salt length will be ``hLen``. + If it is zero, the signature scheme becomes deterministic. + + Note that in some implementations such as OpenSSL the default + salt length is ``emLen - hLen - 2`` (even though it is not more + secure than ``hLen``). + + * *rand_func* (``callable``) -- + A function that returns random ``bytes``, of the desired length. + The default is :func:`Cryptodome.Random.get_random_bytes`. + + :return: a :class:`PSS_SigScheme` signature object + """ + + mask_func = kwargs.pop("mask_func", None) + salt_len = kwargs.pop("salt_bytes", None) + rand_func = kwargs.pop("rand_func", None) + if rand_func is None: + rand_func = Random.get_random_bytes + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys())) + return PSS_SigScheme(rsa_key, mask_func, salt_len, rand_func) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi b/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi new file mode 100644 index 0000000..84a960e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi @@ -0,0 +1,30 @@ +from typing import Union, Callable, Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + + +class Hash(Protocol): + def digest(self) -> bytes: ... + def update(self, bytes) -> None: ... + + +class HashModule(Protocol): + @staticmethod + def new(data: Optional[bytes]) -> Hash: ... + + +MaskFunction = Callable[[bytes, int, Union[Hash, HashModule]], bytes] +RndFunction = Callable[[int], bytes] + +class PSS_SigScheme: + def __init__(self, key: RsaKey, mgfunc: MaskFunction, saltLen: int, randfunc: RndFunction) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> None: ... + + +MGF1 : MaskFunction +def _EMSA_PSS_ENCODE(mhash: Hash, emBits: int, randFunc: RndFunction, mgf:MaskFunction, sLen: int) -> str: ... +def _EMSA_PSS_VERIFY(mhash: Hash, em: str, emBits: int, mgf: MaskFunction, sLen: int) -> None: ... +def new(rsa_key: RsaKey, **kwargs: Union[MaskFunction, RndFunction, int]) -> PSS_SigScheme: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.py b/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.py new file mode 100644 index 0000000..c67bc95 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.py @@ -0,0 +1,77 @@ +# -*- coding: ascii -*- +# +# Util/Counter.py : Fast counter for use with CTR-mode ciphers +# +# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net> +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +def new(nbits, prefix=b"", suffix=b"", initial_value=1, little_endian=False, allow_wraparound=False): + """Create a stateful counter block function suitable for CTR encryption modes. + + Each call to the function returns the next counter block. + Each counter block is made up by three parts: + + +------+--------------+-------+ + |prefix| counter value|postfix| + +------+--------------+-------+ + + The counter value is incremented by 1 at each call. + + Args: + nbits (integer): + Length of the desired counter value, in bits. It must be a multiple of 8. + prefix (byte string): + The constant prefix of the counter block. By default, no prefix is + used. + suffix (byte string): + The constant postfix of the counter block. By default, no suffix is + used. + initial_value (integer): + The initial value of the counter. Default value is 1. + Its length in bits must not exceed the argument ``nbits``. + little_endian (boolean): + If ``True``, the counter number will be encoded in little endian format. + If ``False`` (default), in big endian format. + allow_wraparound (boolean): + This parameter is ignored. + Returns: + An object that can be passed with the :data:`counter` parameter to a CTR mode + cipher. + + It must hold that *len(prefix) + nbits//8 + len(suffix)* matches the + block size of the underlying block cipher. + """ + + if (nbits % 8) != 0: + raise ValueError("'nbits' must be a multiple of 8") + + iv_bl = initial_value.bit_length() + if iv_bl > nbits: + raise ValueError("Initial value takes %d bits but it is longer than " + "the counter (%d bits)" % + (iv_bl, nbits)) + + # Ignore wraparound + return {"counter_len": nbits // 8, + "prefix": prefix, + "suffix": suffix, + "initial_value": initial_value, + "little_endian": little_endian + } diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi new file mode 100644 index 0000000..fa2ffdd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi @@ -0,0 +1,5 @@ +from typing import Optional, Union, Dict + +def new(nbits: int, prefix: Optional[bytes]=..., suffix: Optional[bytes]=..., initial_value: Optional[int]=1, + little_endian: Optional[bool]=False, allow_wraparound: Optional[bool]=False) -> \ + Dict[str, Union[int, bytes, bool]]: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.py b/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.py new file mode 100644 index 0000000..b525475 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.py @@ -0,0 +1,108 @@ +# +# Util/Padding.py : Functions to manage padding +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +__all__ = [ 'pad', 'unpad' ] + +from Cryptodome.Util.py3compat import * + + +def pad(data_to_pad, block_size, style='pkcs7'): + """Apply standard padding. + + Args: + data_to_pad (byte string): + The data that needs to be padded. + block_size (integer): + The block boundary to use for padding. The output length is guaranteed + to be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + + Return: + byte string : the original data with the appropriate padding added at the end. + """ + + padding_len = block_size-len(data_to_pad)%block_size + if style == 'pkcs7': + padding = bchr(padding_len)*padding_len + elif style == 'x923': + padding = bchr(0)*(padding_len-1) + bchr(padding_len) + elif style == 'iso7816': + padding = bchr(128) + bchr(0)*(padding_len-1) + else: + raise ValueError("Unknown padding style") + return data_to_pad + padding + + +def unpad(padded_data, block_size, style='pkcs7'): + """Remove standard padding. + + Args: + padded_data (byte string): + A piece of data with padding that needs to be stripped. + block_size (integer): + The block boundary to use for padding. The input length + must be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + Return: + byte string : data without padding. + Raises: + ValueError: if the padding is incorrect. + """ + + pdata_len = len(padded_data) + if pdata_len == 0: + raise ValueError("Zero-length input cannot be unpadded") + if pdata_len % block_size: + raise ValueError("Input data is not padded") + if style in ('pkcs7', 'x923'): + padding_len = bord(padded_data[-1]) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if style == 'pkcs7': + if padded_data[-padding_len:]!=bchr(padding_len)*padding_len: + raise ValueError("PKCS#7 padding is incorrect.") + else: + if padded_data[-padding_len:-1]!=bchr(0)*(padding_len-1): + raise ValueError("ANSI X.923 padding is incorrect.") + elif style == 'iso7816': + padding_len = pdata_len - padded_data.rfind(bchr(128)) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if padding_len>1 and padded_data[1-padding_len:]!=bchr(0)*(padding_len-1): + raise ValueError("ISO 7816-4 padding is incorrect.") + else: + raise ValueError("Unknown padding style") + return padded_data[:-padding_len] + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi new file mode 100644 index 0000000..4d8d30d --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi @@ -0,0 +1,6 @@ +from typing import Optional + +__all__ = [ 'pad', 'unpad' ] + +def pad(data_to_pad: bytes, block_size: int, style: Optional[str]='pkcs7') -> bytes: ... +def unpad(padded_data: bytes, block_size: int, style: Optional[str]='pkcs7') -> bytes: ... \ No newline at end of file diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py b/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py new file mode 100644 index 0000000..10859c3 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py @@ -0,0 +1,386 @@ +# rfc1751.py : Converts between 128-bit strings and a human-readable +# sequence of words, as defined in RFC1751: "A Convention for +# Human-Readable 128-bit Keys", by Daniel L. McDonald. +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import binascii + +from Cryptodome.Util.py3compat import bord, bchr + +binary = {0: '0000', 1: '0001', 2: '0010', 3: '0011', 4: '0100', 5: '0101', + 6: '0110', 7: '0111', 8: '1000', 9: '1001', 10: '1010', 11: '1011', + 12: '1100', 13: '1101', 14: '1110', 15: '1111'} + + +def _key2bin(s): + "Convert a key into a string of binary digits" + kl = map(lambda x: bord(x), s) + kl = map(lambda x: binary[x >> 4] + binary[x & 15], kl) + return ''.join(kl) + + +def _extract(key, start, length): + """Extract a bitstring(2.x)/bytestring(2.x) from a string of binary digits, and return its + numeric value.""" + + result = 0 + for y in key[start:start+length]: + result = result * 2 + ord(y) - 48 + return result + + +def key_to_english(key): + """Transform an arbitrary key into a string containing English words. + + Example:: + + >>> from Cryptodome.Util.RFC1751 import key_to_english + >>> key_to_english(b'66666666') + 'RAM LOIS GOAD CREW CARE HIT' + + Args: + key (byte string): + The key to convert. Its length must be a multiple of 8. + Return: + A string of English words. + """ + + if len(key) % 8 != 0: + raise ValueError('The length of the key must be a multiple of 8.') + + english = '' + for index in range(0, len(key), 8): # Loop over 8-byte subkeys + subkey = key[index:index + 8] + # Compute the parity of the key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + # Append parity bits to the subkey + skbin = _key2bin(subkey + bchr((p << 6) & 255)) + for i in range(0, 64, 11): + english = english + wordlist[_extract(skbin, i, 11)] + ' ' + + return english.strip() + + +def english_to_key(s): + """Transform a string into a corresponding key. + + Example:: + + >>> from Cryptodome.Util.RFC1751 import english_to_key + >>> english_to_key('RAM LOIS GOAD CREW CARE HIT') + b'66666666' + + Args: + s (string): the string with the words separated by whitespace; + the number of words must be a multiple of 6. + Return: + A byte string. + """ + + L = s.upper().split() + key = b'' + for index in range(0, len(L), 6): + sublist = L[index:index + 6] + char = 9 * [0] + bits = 0 + for i in sublist: + index = wordlist.index(i) + shift = (8 - (bits + 11) % 8) % 8 + y = index << shift + cl, cc, cr = (y >> 16), (y >> 8) & 0xff, y & 0xff + if (shift > 5): + char[bits >> 3] = char[bits >> 3] | cl + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cc + char[(bits >> 3) + 2] = char[(bits >> 3) + 2] | cr + elif shift > -3: + char[bits >> 3] = char[bits >> 3] | cc + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cr + else: + char[bits >> 3] = char[bits >> 3] | cr + bits = bits + 11 + + subkey = b'' + for y in char: + subkey = subkey + bchr(y) + + # Check the parity of the resulting key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + if (p & 3) != _extract(skbin, 64, 2): + raise ValueError("Parity error in resulting key") + key = key + subkey[0:8] + return key + + +wordlist = [ + "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", + "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA", + "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK", + "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE", + "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", + "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", + "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO", + "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT", + "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", + "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY", + "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN", + "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG", + "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", + "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO", + "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE", + "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW", + "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", + "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP", + "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO", + "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD", + "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", + "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT", + "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE", + "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL", + "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", + "ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET", + "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", + "KAY", "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", + "LAC", "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", + "LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT", + "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG", + "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW", + "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", + "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG", + "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED", + "NEE", "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD", + "NON", "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", + "OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", + "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT", + "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD", + "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", + "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT", + "PLY", "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB", + "PUG", "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT", + "RAW", "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", + "RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", + "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", + "SAN", "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET", + "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", + "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY", + "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN", + "TAP", "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE", + "TIM", "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", + "TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP", + "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", + "WAY", "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", + "WOK", "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", + "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT", + "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", + "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", + "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", + "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", + "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW", + "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA", + "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", "ATOM", + "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW", + "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL", + "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", + "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", + "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", + "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT", + "BEAU", "BECK", "BEEF", "BEEN", "BEER", + "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", + "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", + "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", + "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", + "BLOW", "BLUE", "BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", + "BODE", "BODY", "BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT", + "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN", "BONY", "BOOK", + "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", + "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN", + "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", + "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", + "BURL", "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", + "BUSY", "BYTE", "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", + "CALL", "CALM", "CAME", "CANE", "CANT", "CARD", "CARE", "CARL", + "CARR", "CART", "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", + "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF", + "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG", + "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY", + "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", + "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", + "COKE", "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK", + "COOL", "COON", "COOT", "CORD", "CORE", "CORK", "CORN", "COST", + "COVE", "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB", + "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY", + "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS", "DADE", "DALE", + "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK", "DARN", + "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS", + "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", + "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", + "DIAL", "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT", + "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", + "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA", + "DOSE", "DOTE", "DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG", + "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK", + "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK", + "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", + "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", + "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", + "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", + "FACE", "FACT", "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", + "FAME", "FANG", "FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT", + "FEED", "FEEL", "FEET", "FELL", "FELT", "FEND", "FERN", "FEST", + "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", + "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE", + "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW", + "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", + "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", + "FOOT", "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", + "FOUR", "FOWL", "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", + "FROG", "FROM", "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", + "FUSE", "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA", + "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY", "GASH", + "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE", + "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT", + "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", + "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", + "GOAL", "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", + "GOOD", "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", + "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN", + "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH", + "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR", + "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG", "HANK", + "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE", + "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", + "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", + "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", + "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", + "HIRE", "HISS", "HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", + "HOLM", "HOLT", "HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK", + "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL", + "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", + "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE", + "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", + "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", + "ITCH", "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", + "JAVA", "JEAN", "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", + "JILT", "JIVE", "JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", + "JOIN", "JOKE", "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", + "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST", + "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE", "KEEL", + "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL", + "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", + "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", + "KURT", "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", + "LAIR", "LAKE", "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", + "LARK", "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS", + "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER", + "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK", "LESS", "LEST", + "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU", + "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB", + "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST", + "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", + "LOIS", "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", + "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", + "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE", + "LURK", "LUSH", "LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE", + "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI", + "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE", "MARK", + "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE", + "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", + "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", + "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", + "MIMI", "MIND", "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", + "MIST", "MITE", "MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD", + "MOLE", "MOLL", "MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON", + "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", + "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK", + "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL", + "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", + "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", + "NEST", "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", + "NINE", "NOAH", "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", + "NORM", "NOSE", "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", + "OATH", "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY", + "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE", + "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS", + "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY", + "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", + "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", + "RASH", "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", + "RECK", "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA", + "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE", "RIFT", + "RILL", "RIME", "RING", "RINK", "RISE", "RISK", "RITE", "ROAD", + "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME", + "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS", + "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", + "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", + "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", + "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", + "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", + "SCAT", "SCOT", "SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK", + "SEEM", "SEEN", "SEES", "SELF", "SELL", "SEND", "SENT", "SETS", + "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN", + "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", + "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE", + "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", + "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", + "SLED", "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", + "SLOW", "SLUG", "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", + "SNOW", "SNUB", "SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA", + "SOFT", "SOIL", "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", + "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR", + "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN", "SUCH", + "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF", + "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", + "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", + "TASK", "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", + "TEEN", "TEET", "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", + "TEST", "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN", + "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER", + "TILE", "TILL", "TILT", "TIME", "TINA", "TINE", "TINT", "TINY", + "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG", + "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR", + "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", + "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", + "TUCK", "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", + "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", + "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST", + "VEAL", "VEDA", "VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY", + "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE", + "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK", + "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM", + "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", + "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", + "WELD", "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", + "WHAT", "WHEE", "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", + "WILD", "WILL", "WIND", "WINE", "WING", "WINK", "WINO", "WIRE", + "WISE", "WISH", "WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD", + "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", + "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR", + "YELL", "YOGA", "YOKE" ] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi new file mode 100644 index 0000000..6ad07ff --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi @@ -0,0 +1,7 @@ +from typing import Dict, List + +binary: Dict[int, str] +wordlist: List[str] + +def key_to_english(key: bytes) -> str: ... +def english_to_key(s: str) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/Util/__init__.py new file mode 100644 index 0000000..1862b82 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Miscellaneous modules + +Contains useful modules that don't belong into any of the +other Cryptodome.* subpackages. + +======================== ============================================= +Module Description +======================== ============================================= +`Cryptodome.Util.number` Number-theoretic functions (primality testing, etc.) +`Cryptodome.Util.Counter` Fast counter functions for CTR cipher modes. +`Cryptodome.Util.RFC1751` Converts between 128-bit keys and human-readable + strings of words. +`Cryptodome.Util.asn1` Minimal support for ASN.1 DER encoding +`Cryptodome.Util.Padding` Set of functions for adding and removing padding. +======================== ============================================= + +:undocumented: _galois, _number_new, cpuid, py3compat, _raw_api +""" + +__all__ = ['RFC1751', 'number', 'strxor', 'asn1', 'Counter', 'Padding'] + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py b/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py new file mode 100644 index 0000000..4794a02 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py @@ -0,0 +1,46 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util._raw_api import load_pycryptodome_raw_lib + + +_raw_cpuid_lib = load_pycryptodome_raw_lib("Cryptodome.Util._cpuid_c", + """ + int have_aes_ni(void); + int have_clmul(void); + """) + + +def have_aes_ni(): + return _raw_cpuid_lib.have_aes_ni() + + +def have_clmul(): + return _raw_cpuid_lib.have_clmul() diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi new file mode 100644 index 0000000..10e669e --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi @@ -0,0 +1,2 @@ +def have_aes_ni() -> int: ... +def have_clmul() -> int: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..51e31b74f5844907c19e0fcba72a1662b897402e GIT binary patch literal 19304 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 aToQ4Qr$Ub?mmjs_UmI}Z2R#8EQT!9yG}<cw literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.py b/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.py new file mode 100644 index 0000000..282f0dc --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.py @@ -0,0 +1,54 @@ +# =================================================================== +# +# Copyright (c) 2016, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os + + +def pycryptodome_filename(dir_comps, filename): + """Return the complete file name for the module + + dir_comps : list of string + The list of directory names in the PyCryptodome package. + The first element must be "Cryptodome". + + filename : string + The filename (inclusing extension) in the target directory. + """ + + if dir_comps[0] != "Cryptodome": + raise ValueError("Only available for modules under 'Cryptodome'") + + dir_comps = list(dir_comps[1:]) + [filename] + + util_lib, _ = os.path.split(os.path.abspath(__file__)) + root_lib = os.path.join(util_lib, "..") + + return os.path.join(root_lib, *dir_comps) + diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi new file mode 100644 index 0000000..d54a126 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi @@ -0,0 +1,4 @@ +from typing import List + + +def pycryptodome_filename(dir_comps: List[str], filename: str) -> str: ... \ No newline at end of file diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py b/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py new file mode 100644 index 0000000..c2e0187 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py @@ -0,0 +1,319 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +import os +import abc +import sys +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._file_system import pycryptodome_filename + +# +# List of file suffixes for Python extensions +# +if sys.version_info[0] < 3: + + import imp + extension_suffixes = [] + for ext, mod, typ in imp.get_suffixes(): + if typ == imp.C_EXTENSION: + extension_suffixes.append(ext) + +else: + + from importlib import machinery + extension_suffixes = machinery.EXTENSION_SUFFIXES + +# Which types with buffer interface we support (apart from byte strings) +_buffer_type = (bytearray, memoryview) + + +class _VoidPointer(object): + @abc.abstractmethod + def get(self): + """Return the memory location we point to""" + return + + @abc.abstractmethod + def address_of(self): + """Return a raw pointer to this pointer""" + return + + +try: + # Starting from v2.18, pycparser (used by cffi for in-line ABI mode) + # stops working correctly when PYOPTIMIZE==2 or the parameter -OO is + # passed. In that case, we fall back to ctypes. + # Note that PyPy ships with an old version of pycparser so we can keep + # using cffi there. + # See https://github.com/Legrandin/pycryptodome/issues/228 + if '__pypy__' not in sys.builtin_module_names and sys.flags.optimize == 2: + raise ImportError("CFFI with optimize=2 fails due to pycparser bug.") + + from cffi import FFI + + ffi = FFI() + null_pointer = ffi.NULL + uint8_t_type = ffi.typeof(ffi.new("const uint8_t*")) + + _Array = ffi.new("uint8_t[1]").__class__.__bases__ + + def load_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, either an absolute path or the name of a library + in the system search path. + + @cdecl, the C function declarations. + """ + + if hasattr(ffi, "RTLD_DEEPBIND") and not os.getenv('PYCRYPTODOME_DISABLE_DEEPBIND'): + lib = ffi.dlopen(name, ffi.RTLD_DEEPBIND) + else: + lib = ffi.dlopen(name) + ffi.cdef(cdecl) + return lib + + def c_ulong(x): + """Convert a Python integer to unsigned long""" + return x + + c_ulonglong = c_ulong + c_uint = c_ulong + c_ubyte = c_ulong + + def c_size_t(x): + """Convert a Python integer to size_t""" + return x + + def create_string_buffer(init_or_size, size=None): + """Allocate the given amount of bytes (initially set to 0)""" + + if isinstance(init_or_size, bytes): + size = max(len(init_or_size) + 1, size) + result = ffi.new("uint8_t[]", size) + result[:] = init_or_size + else: + if size: + raise ValueError("Size must be specified once only") + result = ffi.new("uint8_t[]", init_or_size) + return result + + def get_c_string(c_string): + """Convert a C string into a Python byte sequence""" + return ffi.string(c_string) + + def get_raw_buffer(buf): + """Convert a C buffer into a Python byte sequence""" + return ffi.buffer(buf)[:] + + def c_uint8_ptr(data): + if isinstance(data, _buffer_type): + # This only works for cffi >= 1.7 + return ffi.cast(uint8_t_type, ffi.from_buffer(data)) + elif byte_string(data) or isinstance(data, _Array): + return data + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + class VoidPointer_cffi(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._pp = ffi.new("void *[1]") + + def get(self): + return self._pp[0] + + def address_of(self): + return self._pp + + def VoidPointer(): + return VoidPointer_cffi() + + backend = "cffi" + +except ImportError: + + import ctypes + from ctypes import (CDLL, c_void_p, byref, c_ulong, c_ulonglong, c_size_t, + create_string_buffer, c_ubyte, c_uint) + from ctypes.util import find_library + from ctypes import Array as _Array + + null_pointer = None + cached_architecture = [] + + def c_ubyte(c): + if not (0 <= c < 256): + raise OverflowError() + return ctypes.c_ubyte(c) + + def load_lib(name, cdecl): + if not cached_architecture: + # platform.architecture() creates a subprocess, so caching the + # result makes successive imports faster. + import platform + cached_architecture[:] = platform.architecture() + bits, linkage = cached_architecture + if "." not in name and not linkage.startswith("Win"): + full_name = find_library(name) + if full_name is None: + raise OSError("Cannot load library '%s'" % name) + name = full_name + return CDLL(name) + + def get_c_string(c_string): + return c_string.value + + def get_raw_buffer(buf): + return buf.raw + + # ---- Get raw pointer --- + + _c_ssize_t = ctypes.c_ssize_t + + _PyBUF_SIMPLE = 0 + _PyObject_GetBuffer = ctypes.pythonapi.PyObject_GetBuffer + _PyBuffer_Release = ctypes.pythonapi.PyBuffer_Release + _py_object = ctypes.py_object + _c_ssize_p = ctypes.POINTER(_c_ssize_t) + + # See Include/object.h for CPython + # and https://github.com/pallets/click/blob/master/src/click/_winconsole.py + class _Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', ctypes.py_object), + ('len', _c_ssize_t), + ('itemsize', _c_ssize_t), + ('readonly', ctypes.c_int), + ('ndim', ctypes.c_int), + ('format', ctypes.c_char_p), + ('shape', _c_ssize_p), + ('strides', _c_ssize_p), + ('suboffsets', _c_ssize_p), + ('internal', c_void_p) + ] + + # Extra field for CPython 2.6/2.7 + if sys.version_info[0] == 2: + _fields_.insert(-1, ('smalltable', _c_ssize_t * 2)) + + def c_uint8_ptr(data): + if byte_string(data) or isinstance(data, _Array): + return data + elif isinstance(data, _buffer_type): + obj = _py_object(data) + buf = _Py_buffer() + _PyObject_GetBuffer(obj, byref(buf), _PyBUF_SIMPLE) + try: + buffer_type = ctypes.c_ubyte * buf.len + return buffer_type.from_address(buf.buf) + finally: + _PyBuffer_Release(byref(buf)) + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + # --- + + class VoidPointer_ctypes(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._p = c_void_p() + + def get(self): + return self._p + + def address_of(self): + return byref(self._p) + + def VoidPointer(): + return VoidPointer_ctypes() + + backend = "ctypes" + + +class SmartPointer(object): + """Class to hold a non-managed piece of memory""" + + def __init__(self, raw_pointer, destructor): + self._raw_pointer = raw_pointer + self._destructor = destructor + + def get(self): + return self._raw_pointer + + def release(self): + rp, self._raw_pointer = self._raw_pointer, None + return rp + + def __del__(self): + try: + if self._raw_pointer is not None: + self._destructor(self._raw_pointer) + self._raw_pointer = None + except AttributeError: + pass + + +def load_pycryptodome_raw_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, the name of the library expressed as a PyCryptodome module, + for instance Cryptodome.Cipher._raw_cbc. + + @cdecl, the C function declarations. + """ + + split = name.split(".") + dir_comps, basename = split[:-1], split[-1] + attempts = [] + for ext in extension_suffixes: + try: + filename = basename + ext + full_name = pycryptodome_filename(dir_comps, filename) + if not os.path.isfile(full_name): + attempts.append("Not found '%s'" % filename) + continue + return load_lib(full_name, cdecl) + except OSError as exp: + attempts.append("Cannot load '%s': %s" % (filename, str(exp))) + raise OSError("Cannot load native module '%s': %s" % (name, ", ".join(attempts))) + + +def is_buffer(x): + """Return True if object x supports the buffer interface""" + return isinstance(x, (bytes, bytearray, memoryview)) + + +def is_writeable_buffer(x): + return (isinstance(x, bytearray) or + (isinstance(x, memoryview) and not x.readonly)) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi new file mode 100644 index 0000000..2bc5301 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi @@ -0,0 +1,27 @@ +from typing import Any, Optional, Union + +def load_lib(name: str, cdecl: str) -> Any : ... +def c_ulong(x: int ) -> Any : ... +def c_ulonglong(x: int ) -> Any : ... +def c_size_t(x: int) -> Any : ... +def create_string_buffer(init_or_size: Union[bytes,int], size: Optional[int]) -> Any : ... +def get_c_string(c_string: Any) -> bytes : ... +def get_raw_buffer(buf: Any) -> bytes : ... +def c_uint8_ptr(data: Union[bytes, memoryview, bytearray]) -> Any : ... + +class VoidPointer(object): + def get(self) -> Any : ... + def address_of(self) -> Any : ... + +class SmartPointer(object): + def __init__(self, raw_pointer: Any, destructor: Any) -> None : ... + def get(self) -> Any : ... + def release(self) -> Any : ... + +backend : str +null_pointer : Any +ffi: Any + +def load_pycryptodome_raw_lib(name: str, cdecl: str) -> Any : ... +def is_buffer(x: Any) -> bool : ... +def is_writeable_buffer(x: Any) -> bool : ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so b/python/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..f0f3784dbd744491d6bacecae5604aa045bee150 GIT binary patch literal 20376 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 G*?$7dsyU4S literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.py b/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.py new file mode 100644 index 0000000..36f2d72 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.py @@ -0,0 +1,1064 @@ +# -*- coding: ascii -*- +# +# Util/asn1.py : Minimal support for ASN.1 DER binary encoding. +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +import struct + +from Cryptodome.Util.py3compat import byte_string, bchr, bord + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +__all__ = ['DerObject', 'DerInteger', 'DerBoolean', 'DerOctetString', + 'DerNull', 'DerSequence', 'DerObjectId', 'DerBitString', 'DerSetOf'] + +# Useful references: +# - https://luca.ntop.org/Teaching/Appunti/asn1.html +# - https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/ +# - https://www.zytrax.com/tech/survival/asn1.html +# - https://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf +# - https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf +# - https://misc.daniel-marschall.de/asn.1/oid-converter/online.php + +def _is_number(x, only_non_negative=False): + test = 0 + try: + test = x + test + except TypeError: + return False + return not only_non_negative or x >= 0 + + +class BytesIO_EOF(object): + """This class differs from BytesIO in that a ValueError exception is + raised whenever EOF is reached.""" + + def __init__(self, initial_bytes): + self._buffer = initial_bytes + self._index = 0 + self._bookmark = None + + def set_bookmark(self): + self._bookmark = self._index + + def data_since_bookmark(self): + assert self._bookmark is not None + return self._buffer[self._bookmark:self._index] + + def remaining_data(self): + return len(self._buffer) - self._index + + def read(self, length): + new_index = self._index + length + if new_index > len(self._buffer): + raise ValueError("Not enough data for DER decoding: expected %d bytes and found %d" % (new_index, len(self._buffer))) + + result = self._buffer[self._index:new_index] + self._index = new_index + return result + + def read_byte(self): + return bord(self.read(1)[0]) + + +class DerObject(object): + """Base class for defining a single DER object. + + This class should never be directly instantiated. + """ + + def __init__(self, asn1Id=None, payload=b'', implicit=None, + constructed=False, explicit=None): + """Initialize the DER object according to a specific ASN.1 type. + + :Parameters: + asn1Id : integer or byte + The universal DER tag number for this object + (e.g. 0x10 for a SEQUENCE). + If None, the tag is not known yet. + + payload : byte string + The initial payload of the object (that it, + the content octets). + If not specified, the payload is empty. + + implicit : integer or byte + The IMPLICIT tag number (< 0x1F) to use for the encoded object. + It overrides the universal tag *asn1Id*. + It cannot be combined with the ``explicit`` parameter. + By default, there is no IMPLICIT tag. + + constructed : bool + True when the ASN.1 type is *constructed*. + False when it is *primitive* (default). + + explicit : integer or byte + The EXPLICIT tag number (< 0x1F) to use for the encoded object. + It cannot be combined with the ``implicit`` parameter. + By default, there is no EXPLICIT tag. + """ + + if asn1Id is None: + # The tag octet will be read in with ``decode`` + self._tag_octet = None + return + asn1Id = self._convertTag(asn1Id) + + self.payload = payload + + # In a BER/DER identifier octet: + # * bits 4-0 contain the tag value + # * bit 5 is set if the type is 'constructed' + # and unset if 'primitive' + # * bits 7-6 depend on the encoding class + # + # Class | Bit 7, Bit 6 + # ---------------------------------- + # universal | 0 0 + # application | 0 1 + # context-spec | 1 0 (default for IMPLICIT/EXPLICIT) + # private | 1 1 + # + + constructed_bit = 0x20 if constructed else 0x00 + + if None not in (explicit, implicit): + raise ValueError("Explicit and implicit tags are" + " mutually exclusive") + + if implicit is not None: + # IMPLICIT tag overrides asn1Id + self._tag_octet = 0x80 | constructed_bit | self._convertTag(implicit) + elif explicit is not None: + # 'constructed bit' is always asserted for an EXPLICIT tag + self._tag_octet = 0x80 | 0x20 | self._convertTag(explicit) + self._inner_tag_octet = constructed_bit | asn1Id + else: + # Neither IMPLICIT nor EXPLICIT + self._tag_octet = constructed_bit | asn1Id + + def _convertTag(self, tag): + """Check if *tag* is a real DER tag (5 bits). + Convert it from a character to number if necessary. + """ + if not _is_number(tag): + if len(tag) == 1: + tag = bord(tag[0]) + # Ensure that tag is a low tag + if not (_is_number(tag) and 0 <= tag < 0x1F): + raise ValueError("Wrong DER tag") + return tag + + @staticmethod + def _definite_form(length): + """Build length octets according to BER/DER + definite form. + """ + if length > 127: + encoding = long_to_bytes(length) + return bchr(len(encoding) + 128) + encoding + return bchr(length) + + def encode(self): + """Return this DER element, fully encoded as a binary byte string.""" + + # Concatenate identifier octets, length octets, + # and contents octets + + output_payload = self.payload + + # In case of an EXTERNAL tag, first encode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + output_payload = (bchr(self._inner_tag_octet) + + self._definite_form(len(self.payload)) + + self.payload) + + return (bchr(self._tag_octet) + + self._definite_form(len(output_payload)) + + output_payload) + + def _decodeLen(self, s): + """Decode DER length octets from a file.""" + + length = s.read_byte() + + if length > 127: + encoded_length = s.read(length & 0x7F) + if bord(encoded_length[0]) == 0: + raise ValueError("Invalid DER: length has leading zero") + length = bytes_to_long(encoded_length) + if length <= 127: + raise ValueError("Invalid DER: length in long form but smaller than 128") + + return length + + def decode(self, der_encoded, strict=False): + """Decode a complete DER element, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + if not byte_string(der_encoded): + raise ValueError("Input is not a byte string") + + s = BytesIO_EOF(der_encoded) + self._decodeFromStream(s, strict) + + # There shouldn't be other bytes left + if s.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + return self + + def _decodeFromStream(self, s, strict): + """Decode a complete DER element from a file.""" + + idOctet = s.read_byte() + if self._tag_octet is not None: + if idOctet != self._tag_octet: + raise ValueError("Unexpected DER tag") + else: + self._tag_octet = idOctet + length = self._decodeLen(s) + self.payload = s.read(length) + + # In case of an EXTERNAL tag, further decode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + p = BytesIO_EOF(self.payload) + inner_octet = p.read_byte() + if inner_octet != self._inner_tag_octet: + raise ValueError("Unexpected internal DER tag") + length = self._decodeLen(p) + self.payload = p.read(length) + + # There shouldn't be other bytes left + if p.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + +class DerInteger(DerObject): + """Class to model a DER INTEGER. + + An example of encoding is:: + + >>> from Cryptodome.Util.asn1 import DerInteger + >>> from binascii import hexlify, unhexlify + >>> int_der = DerInteger(9) + >>> print hexlify(int_der.encode()) + + which will show ``020109``, the DER encoding of 9. + + And for decoding:: + + >>> s = unhexlify(b'020109') + >>> try: + >>> int_der = DerInteger() + >>> int_der.decode(s) + >>> print int_der.value + >>> except ValueError: + >>> print "Not a valid DER INTEGER" + + the output will be ``9``. + + :ivar value: The integer value + :vartype value: integer + """ + + def __init__(self, value=0, implicit=None, explicit=None): + """Initialize the DER object as an INTEGER. + + :Parameters: + value : integer + The value of the integer. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for INTEGER (2). + """ + + DerObject.__init__(self, 0x02, b'', implicit, + False, explicit) + self.value = value # The integer value + + def encode(self): + """Return the DER INTEGER, fully encoded as a + binary string.""" + + number = self.value + self.payload = b'' + while True: + self.payload = bchr(int(number & 255)) + self.payload + if 128 <= number <= 255: + self.payload = bchr(0x00) + self.payload + if -128 <= number <= 255: + break + number >>= 8 + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a DER-encoded INTEGER, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete INTEGER DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict=strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER INTEGER from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + if strict: + if len(self.payload) == 0: + raise ValueError("Invalid encoding for DER INTEGER: empty payload") + if len(self.payload) >= 2 and struct.unpack('>H', self.payload[:2])[0] < 0x80: + raise ValueError("Invalid encoding for DER INTEGER: leading zero") + + # Derive self.value from self.payload + self.value = 0 + bits = 1 + for i in self.payload: + self.value *= 256 + self.value += bord(i) + bits <<= 8 + if self.payload and bord(self.payload[0]) & 0x80: + self.value -= bits + + +class DerBoolean(DerObject): + """Class to model a DER-encoded BOOLEAN. + + An example of encoding is:: + + >>> from Cryptodome.Util.asn1 import DerBoolean + >>> bool_der = DerBoolean(True) + >>> print(bool_der.encode().hex()) + + which will show ``0101ff``, the DER encoding of True. + + And for decoding:: + + >>> s = bytes.fromhex('0101ff') + >>> try: + >>> bool_der = DerBoolean() + >>> bool_der.decode(s) + >>> print(bool_der.value) + >>> except ValueError: + >>> print "Not a valid DER BOOLEAN" + + the output will be ``True``. + + :ivar value: The boolean value + :vartype value: boolean + """ + def __init__(self, value=False, implicit=None, explicit=None): + """Initialize the DER object as a BOOLEAN. + + Args: + value (boolean): + The value of the boolean. Default is False. + + implicit (integer or byte): + The IMPLICIT tag number (< 0x1F) to use for the encoded object. + It overrides the universal tag for BOOLEAN (1). + It cannot be combined with the ``explicit`` parameter. + By default, there is no IMPLICIT tag. + + explicit (integer or byte): + The EXPLICIT tag number (< 0x1F) to use for the encoded object. + It cannot be combined with the ``implicit`` parameter. + By default, there is no EXPLICIT tag. + """ + + DerObject.__init__(self, 0x01, b'', implicit, False, explicit) + self.value = value # The boolean value + + def encode(self): + """Return the DER BOOLEAN, fully encoded as a binary string.""" + + self.payload = b'\xFF' if self.value else b'\x00' + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a DER-encoded BOOLEAN, and re-initializes this object with it. + + Args: + der_encoded (byte string): A DER-encoded BOOLEAN. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a DER-encoded BOOLEAN from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + if len(self.payload) != 1: + raise ValueError("Invalid encoding for DER BOOLEAN: payload is not 1 byte") + + if bord(self.payload[0]) == 0: + self.value = False + elif bord(self.payload[0]) == 0xFF: + self.value = True + else: + raise ValueError("Invalid payload for DER BOOLEAN") + + +class DerSequence(DerObject): + """Class to model a DER SEQUENCE. + + This object behaves like a dynamic Python sequence. + + Sub-elements that are INTEGERs behave like Python integers. + + Any other sub-element is a binary string encoded as a complete DER + sub-element (TLV). + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerSequence, DerInteger + >>> from binascii import hexlify, unhexlify + >>> obj_der = unhexlify('070102') + >>> seq_der = DerSequence([4]) + >>> seq_der.append(9) + >>> seq_der.append(obj_der.encode()) + >>> print hexlify(seq_der.encode()) + + which will show ``3009020104020109070102``, the DER encoding of the + sequence containing ``4``, ``9``, and the object with payload ``02``. + + For decoding: + + >>> s = unhexlify(b'3009020104020109070102') + >>> try: + >>> seq_der = DerSequence() + >>> seq_der.decode(s) + >>> print len(seq_der) + >>> print seq_der[0] + >>> print seq_der[:] + >>> except ValueError: + >>> print "Not a valid DER SEQUENCE" + + the output will be:: + + 3 + 4 + [4, 9, b'\x07\x01\x02'] + + """ + + def __init__(self, startSeq=None, implicit=None, explicit=None): + """Initialize the DER object as a SEQUENCE. + + :Parameters: + startSeq : Python sequence + A sequence whose element are either integers or + other DER objects. + + implicit : integer or byte + The IMPLICIT tag number (< 0x1F) to use for the encoded object. + It overrides the universal tag for SEQUENCE (16). + It cannot be combined with the ``explicit`` parameter. + By default, there is no IMPLICIT tag. + + explicit : integer or byte + The EXPLICIT tag number (< 0x1F) to use for the encoded object. + It cannot be combined with the ``implicit`` parameter. + By default, there is no EXPLICIT tag. + """ + + DerObject.__init__(self, 0x10, b'', implicit, True, explicit) + if startSeq is None: + self._seq = [] + else: + self._seq = startSeq + + # A few methods to make it behave like a python sequence + + def __delitem__(self, n): + del self._seq[n] + + def __getitem__(self, n): + return self._seq[n] + + def __setitem__(self, key, value): + self._seq[key] = value + + def __setslice__(self, i, j, sequence): + self._seq[i:j] = sequence + + def __delslice__(self, i, j): + del self._seq[i:j] + + def __getslice__(self, i, j): + return self._seq[max(0, i):max(0, j)] + + def __len__(self): + return len(self._seq) + + def __iadd__(self, item): + self._seq.append(item) + return self + + def append(self, item): + self._seq.append(item) + return self + + def insert(self, index, item): + self._seq.insert(index, item) + return self + + def hasInts(self, only_non_negative=True): + """Return the number of items in this sequence that are + integers. + + Args: + only_non_negative (boolean): + If ``True``, negative integers are not counted in. + """ + + items = [x for x in self._seq if _is_number(x, only_non_negative)] + return len(items) + + def hasOnlyInts(self, only_non_negative=True): + """Return ``True`` if all items in this sequence are integers + or non-negative integers. + + This function returns False is the sequence is empty, + or at least one member is not an integer. + + Args: + only_non_negative (boolean): + If ``True``, the presence of negative integers + causes the method to return ``False``.""" + return self._seq and self.hasInts(only_non_negative) == len(self._seq) + + def encode(self): + """Return this DER SEQUENCE, fully encoded as a + binary string. + + Raises: + ValueError: if some elements in the sequence are neither integers + nor byte strings. + """ + self.payload = b'' + for item in self._seq: + if byte_string(item): + self.payload += item + elif _is_number(item): + self.payload += DerInteger(item).encode() + else: + self.payload += item.encode() + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False, nr_elements=None, only_ints_expected=False): + """Decode a complete DER SEQUENCE, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete SEQUENCE DER element. + nr_elements (None or integer or list of integers): + The number of members the SEQUENCE can have + only_ints_expected (boolean): + Whether the SEQUENCE is expected to contain only integers. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + + DER INTEGERs are decoded into Python integers. Any other DER + element is not decoded. Its validity is not checked. + """ + + self._nr_elements = nr_elements + result = DerObject.decode(self, der_encoded, strict=strict) + + if only_ints_expected and not self.hasOnlyInts(): + raise ValueError("Some members are not INTEGERs") + + return result + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SEQUENCE from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Parse INTEGERs differently + if der._tag_octet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + data = p.data_since_bookmark() + derInt.decode(data, strict=strict) + self._seq.append(derInt.value) + + ok = True + if self._nr_elements is not None: + try: + ok = len(self._seq) in self._nr_elements + except TypeError: + ok = len(self._seq) == self._nr_elements + + if not ok: + raise ValueError("Unexpected number of members (%d)" + " in the sequence" % len(self._seq)) + + +class DerOctetString(DerObject): + """Class to model a DER OCTET STRING. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerOctetString + >>> from binascii import hexlify, unhexlify + >>> os_der = DerOctetString(b'\\xaa') + >>> os_der.payload += b'\\xbb' + >>> print hexlify(os_der.encode()) + + which will show ``0402aabb``, the DER encoding for the byte string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = unhexlify(b'0402aabb') + >>> try: + >>> os_der = DerOctetString() + >>> os_der.decode(s) + >>> print hexlify(os_der.payload) + >>> except ValueError: + >>> print "Not a valid DER OCTET STRING" + + the output will be ``aabb``. + + :ivar payload: The content of the string + :vartype payload: byte string + """ + + def __init__(self, value=b'', implicit=None): + """Initialize the DER object as an OCTET STRING. + + :Parameters: + value : byte string + The initial payload of the object. + If not specified, the payload is empty. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OCTET STRING (4). + """ + DerObject.__init__(self, 0x04, value, implicit, False) + + +class DerNull(DerObject): + """Class to model a DER NULL element.""" + + def __init__(self): + """Initialize the DER object as a NULL.""" + + DerObject.__init__(self, 0x05, b'', None, False) + + +class DerObjectId(DerObject): + """Class to model a DER OBJECT ID. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerObjectId + >>> from binascii import hexlify, unhexlify + >>> oid_der = DerObjectId("1.2") + >>> oid_der.value += ".840.113549.1.1.1" + >>> print hexlify(oid_der.encode()) + + which will show ``06092a864886f70d010101``, the DER encoding for the + RSA Object Identifier ``1.2.840.113549.1.1.1``. + + For decoding: + + >>> s = unhexlify(b'06092a864886f70d010101') + >>> try: + >>> oid_der = DerObjectId() + >>> oid_der.decode(s) + >>> print oid_der.value + >>> except ValueError: + >>> print "Not a valid DER OBJECT ID" + + the output will be ``1.2.840.113549.1.1.1``. + + :ivar value: The Object ID (OID), a dot separated list of integers + :vartype value: string + """ + + def __init__(self, value='', implicit=None, explicit=None): + """Initialize the DER object as an OBJECT ID. + + :Parameters: + value : string + The initial Object Identifier (e.g. "1.2.0.0.6.2"). + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OBJECT ID (6). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x06, b'', implicit, False, explicit) + self.value = value + + def encode(self): + """Return the DER OBJECT ID, fully encoded as a + binary string.""" + + comps = [int(x) for x in self.value.split(".")] + + if len(comps) < 2: + raise ValueError("Not a valid Object Identifier string") + if comps[0] > 2: + raise ValueError("First component must be 0, 1 or 2") + if comps[0] < 2 and comps[1] > 39: + raise ValueError("Second component must be 39 at most") + + subcomps = [40 * comps[0] + comps[1]] + comps[2:] + + encoding = [] + for v in reversed(subcomps): + encoding.append(v & 0x7F) + v >>= 7 + while v: + encoding.append((v & 0x7F) | 0x80) + v >>= 7 + + self.payload = b''.join([bchr(x) for x in reversed(encoding)]) + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER OBJECT ID, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete DER OBJECT ID. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER OBJECT ID from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Derive self.value from self.payload + p = BytesIO_EOF(self.payload) + + subcomps = [] + v = 0 + while p.remaining_data(): + c = p.read_byte() + v = (v << 7) + (c & 0x7F) + if not (c & 0x80): + subcomps.append(v) + v = 0 + + if len(subcomps) == 0: + raise ValueError("Empty payload") + + if subcomps[0] < 40: + subcomps[:1] = [0, subcomps[0]] + elif subcomps[0] < 80: + subcomps[:1] = [1, subcomps[0] - 40] + else: + subcomps[:1] = [2, subcomps[0] - 80] + + self.value = ".".join([str(x) for x in subcomps]) + + +class DerBitString(DerObject): + """Class to model a DER BIT STRING. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerBitString + >>> bs_der = DerBitString(b'\\xAA') + >>> bs_der.value += b'\\xBB' + >>> print(bs_der.encode().hex()) + + which will show ``030300aabb``, the DER encoding for the bit string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = bytes.fromhex('030300aabb') + >>> try: + >>> bs_der = DerBitString() + >>> bs_der.decode(s) + >>> print(bs_der.value.hex()) + >>> except ValueError: + >>> print "Not a valid DER BIT STRING" + + the output will be ``aabb``. + + :ivar value: The content of the string + :vartype value: byte string + """ + + def __init__(self, value=b'', implicit=None, explicit=None): + """Initialize the DER object as a BIT STRING. + + :Parameters: + value : byte string or DER object + The initial, packed bit string. + If not specified, the bit string is empty. + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for BIT STRING (3). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x03, b'', implicit, False, explicit) + + # The bitstring value (packed) + if isinstance(value, DerObject): + self.value = value.encode() + else: + self.value = value + + def encode(self): + """Return the DER BIT STRING, fully encoded as a + byte string.""" + + # Add padding count byte + self.payload = b'\x00' + self.value + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER BIT STRING, and re-initializes this + object with it. + + Args: + der_encoded (byte string): a complete DER BIT STRING. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER BIT STRING DER from a file.""" + + # Fill-up self.payload + DerObject._decodeFromStream(self, s, strict) + + if self.payload and bord(self.payload[0]) != 0: + raise ValueError("Not a valid BIT STRING") + + # Fill-up self.value + self.value = b'' + # Remove padding count byte + if self.payload: + self.value = self.payload[1:] + + +class DerSetOf(DerObject): + """Class to model a DER SET OF. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerBitString + >>> from binascii import hexlify, unhexlify + >>> so_der = DerSetOf([4,5]) + >>> so_der.add(6) + >>> print hexlify(so_der.encode()) + + which will show ``3109020104020105020106``, the DER encoding + of a SET OF with items 4,5, and 6. + + For decoding: + + >>> s = unhexlify(b'3109020104020105020106') + >>> try: + >>> so_der = DerSetOf() + >>> so_der.decode(s) + >>> print [x for x in so_der] + >>> except ValueError: + >>> print "Not a valid DER SET OF" + + the output will be ``[4, 5, 6]``. + """ + + def __init__(self, startSet=None, implicit=None): + """Initialize the DER object as a SET OF. + + :Parameters: + startSet : container + The initial set of integers or DER encoded objects. + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for SET OF (17). + """ + DerObject.__init__(self, 0x11, b'', implicit, True) + self._seq = [] + + # All elements must be of the same type (and therefore have the + # same leading octet) + self._elemOctet = None + + if startSet: + for e in startSet: + self.add(e) + + def __getitem__(self, n): + return self._seq[n] + + def __iter__(self): + return iter(self._seq) + + def __len__(self): + return len(self._seq) + + def add(self, elem): + """Add an element to the set. + + Args: + elem (byte string or integer): + An element of the same type of objects already in the set. + It can be an integer or a DER encoded object. + """ + + if _is_number(elem): + eo = 0x02 + elif isinstance(elem, DerObject): + eo = self._tag_octet + else: + eo = bord(elem[0]) + + if self._elemOctet != eo: + if self._elemOctet is not None: + raise ValueError("New element does not belong to the set") + self._elemOctet = eo + + if elem not in self._seq: + self._seq.append(elem) + + def decode(self, der_encoded, strict=False): + """Decode a complete SET OF DER element, and re-initializes this + object with it. + + DER INTEGERs are decoded into Python integers. Any other DER + element is left undecoded; its validity is not checked. + + Args: + der_encoded (byte string): a complete DER BIT SET OF. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SET OF from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + setIdOctet = -1 + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Verify that all members are of the same type + if setIdOctet < 0: + setIdOctet = der._tag_octet + else: + if setIdOctet != der._tag_octet: + raise ValueError("Not all elements are of the same DER type") + + # Parse INTEGERs differently + if setIdOctet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + derInt.decode(p.data_since_bookmark(), strict) + self._seq.append(derInt.value) + # end + + def encode(self): + """Return this SET OF DER element, fully encoded as a + binary string. + """ + + # Elements in the set must be ordered in lexicographic order + ordered = [] + for item in self._seq: + if _is_number(item): + bys = DerInteger(item).encode() + elif isinstance(item, DerObject): + bys = item.encode() + else: + bys = item + ordered.append(bys) + ordered.sort() + self.payload = b''.join(ordered) + return DerObject.encode(self) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi new file mode 100644 index 0000000..ee4891c --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi @@ -0,0 +1,80 @@ +from typing import Optional, Sequence, Union, Set, Iterable + +__all__ = ['DerObject', 'DerInteger', 'DerOctetString', 'DerNull', + 'DerSequence', 'DerObjectId', 'DerBitString', 'DerSetOf'] + +# TODO: Make the encoded DerObjects their own type, so that DerSequence and +# DerSetOf can check their contents better + +class BytesIO_EOF: + def __init__(self, initial_bytes: bytes) -> None: ... + def set_bookmark(self) -> None: ... + def data_since_bookmark(self) -> bytes: ... + def remaining_data(self) -> int: ... + def read(self, length: int) -> bytes: ... + def read_byte(self) -> bytes: ... + +class DerObject: + payload: bytes + def __init__(self, asn1Id: Optional[int]=None, payload: Optional[bytes]=..., implicit: Optional[int]=None, + constructed: Optional[bool]=False, explicit: Optional[int]=None) -> None: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerObject: ... + +class DerInteger(DerObject): + value: int + def __init__(self, value: Optional[int]= 0, implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerInteger: ... + +class DerBoolean(DerObject): + value: bool + def __init__(self, value: bool=..., implicit: Optional[Union[int, bytes]]=..., explicit: Optional[Union[int, bytes]]=...) -> None: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerBoolean: ... + +class DerSequence(DerObject): + def __init__(self, startSeq: Optional[Sequence[Union[int, DerInteger, DerObject]]]=None, implicit: Optional[int]=None) -> None: ... + def __delitem__(self, n: int) -> None: ... + def __getitem__(self, n: int) -> None: ... + def __setitem__(self, key: int, value: DerObject) -> None: ... + def __setslice__(self, i: int, j: int, sequence: Sequence) -> None: ... + def __delslice__(self, i: int, j: int) -> None: ... + def __getslice__(self, i: int, j: int) -> DerSequence: ... + def __len__(self) -> int: ... + def __iadd__(self, item: DerObject) -> DerSequence: ... + def append(self, item: DerObject) -> DerSequence: ... + def hasInts(self, only_non_negative: Optional[bool]=True) -> int: ... + def hasOnlyInts(self, only_non_negative: Optional[bool]=True) -> bool: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=..., nr_elements: Optional[int]=None, only_ints_expected: Optional[bool]=False) -> DerSequence: ... + +class DerOctetString(DerObject): + payload: bytes + def __init__(self, value: Optional[bytes]=..., implicit: Optional[int]=None) -> None: ... + +class DerNull(DerObject): + def __init__(self) -> None: ... + +class DerObjectId(DerObject): + value: str + def __init__(self, value: Optional[str]=..., implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerObjectId: ... + +class DerBitString(DerObject): + value: bytes + def __init__(self, value: Optional[bytes]=..., implicit: Optional[int]=None, explicit: Optional[int]=None) -> None: ... + def encode(self) -> bytes: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerBitString: ... + +DerSetElement = Union[bytes, int] + +class DerSetOf(DerObject): + def __init__(self, startSet: Optional[Set[DerSetElement]]=None, implicit: Optional[int]=None) -> None: ... + def __getitem__(self, n: int) -> DerSetElement: ... + def __iter__(self) -> Iterable: ... + def __len__(self) -> int: ... + def add(self, elem: DerSetElement) -> None: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerObject: ... + def encode(self) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/number.py b/python/lib/python3.11/site-packages/Cryptodome/Util/number.py new file mode 100644 index 0000000..6d59fd9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/number.py @@ -0,0 +1,1525 @@ +# +# number.py : Number-theoretic functions +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling, Barry A. Warsaw, and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== +# + +import math +import sys +import struct +from Cryptodome import Random +from Cryptodome.Util.py3compat import iter_range + +# Backward compatibility +_fastmath = None + + +def ceil_div(n, d): + """Return ceil(n/d), that is, the smallest integer r such that r*d >= n""" + + if d == 0: + raise ZeroDivisionError() + if (n < 0) or (d < 0): + raise ValueError("Non positive values") + r, q = divmod(n, d) + if (n != 0) and (q != 0): + r += 1 + return r + + +def size (N): + """Returns the size of the number N in bits.""" + + if N < 0: + raise ValueError("Size in bits only available for non-negative numbers") + return N.bit_length() + + +def getRandomInteger(N, randfunc=None): + """Return a random number at most N bits long. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Cryptodome.Random.random.getrandbits` instead. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + S = randfunc(N>>3) + odd_bits = N % 8 + if odd_bits != 0: + rand_bits = ord(randfunc(1)) >> (8-odd_bits) + S = struct.pack('B', rand_bits) + S + value = bytes_to_long(S) + return value + +def getRandomRange(a, b, randfunc=None): + """Return a random number *n* so that *a <= n < b*. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Cryptodome.Random.random.randrange` instead. + """ + + range_ = b - a - 1 + bits = size(range_) + value = getRandomInteger(bits, randfunc) + while value > range_: + value = getRandomInteger(bits, randfunc) + return a + value + +def getRandomNBitInteger(N, randfunc=None): + """Return a random number with exactly N-bits, + i.e. a random number between 2**(N-1) and (2**N)-1. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + value = getRandomInteger (N-1, randfunc) + value |= 2 ** (N-1) # Ensure high bit is set + assert size(value) >= N + return value + + +if sys.version_info[:2] >= (3, 5): + + GCD = math.gcd + +else: + + def GCD(x,y): + """Greatest Common Denominator of :data:`x` and :data:`y`. + """ + + x = abs(x) ; y = abs(y) + while x > 0: + x, y = y % x, x + return y + + +if sys.version_info[:2] >= (3, 8): + + def inverse(u, v): + """The inverse of :data:`u` *mod* :data:`v`.""" + + if v == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if v < 0: + raise ValueError("Modulus cannot be negative") + + return pow(u, -1, v) + +else: + + def inverse(u, v): + """The inverse of :data:`u` *mod* :data:`v`.""" + + if v == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if v < 0: + raise ValueError("Modulus cannot be negative") + + u3, v3 = u, v + u1, v1 = 1, 0 + while v3 > 0: + q = u3 // v3 + u1, v1 = v1, u1 - v1*q + u3, v3 = v3, u3 - v3*q + if u3 != 1: + raise ValueError("No inverse value can be computed") + while u1<0: + u1 = u1 + v + return u1 + +# Given a number of bits to generate and a random generation function, +# find a prime number of the appropriate size. + +def getPrime(N, randfunc=None): + """Return a random N-bit prime number. + + N must be an integer larger than 1. + If randfunc is omitted, then :meth:`Random.get_random_bytes` is used. + """ + if randfunc is None: + randfunc = Random.get_random_bytes + + if N < 2: + raise ValueError("N must be larger than 1") + + while True: + number = getRandomNBitInteger(N, randfunc) | 1 + if isPrime(number, randfunc=randfunc): + break + return number + + +def _rabinMillerTest(n, rounds, randfunc=None): + """_rabinMillerTest(n:long, rounds:int, randfunc:callable):int + Tests if n is prime. + Returns 0 when n is definitely composite. + Returns 1 when n is probably prime. + Returns 2 when n is definitely prime. + + If randfunc is omitted, then Random.new().read is used. + + This function is for internal use only and may be renamed or removed in + the future. + """ + # check special cases (n==2, n even, n < 2) + if n < 3 or (n & 1) == 0: + return n == 2 + # n might be very large so it might be beneficial to precalculate n-1 + n_1 = n - 1 + # determine m and b so that 2**b * m = n - 1 and b maximal + b = 0 + m = n_1 + while (m & 1) == 0: + b += 1 + m >>= 1 + + tested = [] + # we need to do at most n-2 rounds. + for i in iter_range (min (rounds, n-2)): + # randomly choose a < n and make sure it hasn't been tested yet + a = getRandomRange (2, n, randfunc) + while a in tested: + a = getRandomRange (2, n, randfunc) + tested.append (a) + # do the rabin-miller test + z = pow (a, m, n) # (a**m) % n + if z == 1 or z == n_1: + continue + composite = 1 + for r in iter_range(b): + z = (z * z) % n + if z == 1: + return 0 + elif z == n_1: + composite = 0 + break + if composite: + return 0 + return 1 + +def getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None): + r""" + Return a random strong *N*-bit prime number. + In this context, *p* is a strong prime if *p-1* and *p+1* have at + least one large prime factor. + + Args: + N (integer): the exact length of the strong prime. + It must be a multiple of 128 and > 512. + e (integer): if provided, the returned prime (minus 1) + will be coprime to *e* and thus suitable for RSA where + *e* is the public exponent. + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. This is + just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Cryptodome.Random.get_random_bytes` is used. + Return: + The new strong prime. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + # This function was implemented following the + # instructions found in the paper: + # "FAST GENERATION OF RANDOM, STRONG RSA PRIMES" + # by Robert D. Silverman + # RSA Laboratories + # May 17, 1997 + # which by the time of writing could be freely downloaded here: + # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf + + if randfunc is None: + randfunc = Random.get_random_bytes + + # Use the accelerator if available + if _fastmath is not None: + return _fastmath.getStrongPrime(long(N), long(e), false_positive_prob, + randfunc) + + if (N < 512) or ((N % 128) != 0): + raise ValueError ("bits must be multiple of 128 and > 512") + + rabin_miller_rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + + # calculate range for X + # lower_bound = sqrt(2) * 2^{511 + 128*x} + # upper_bound = 2^{512 + 128*x} - 1 + x = (N - 512) >> 7 + # We need to approximate the sqrt(2) in the lower_bound by an integer + # expression because floating point math overflows with these numbers + lower_bound = (14142135623730950489 * (2 ** (511 + 128*x))) // 10000000000000000000 + upper_bound = (1 << (512 + 128*x)) - 1 + # Randomly choose X in calculated range + X = getRandomRange (lower_bound, upper_bound, randfunc) + + # generate p1 and p2 + p = [0, 0] + for i in (0, 1): + # randomly choose 101-bit y + y = getRandomNBitInteger (101, randfunc) + # initialize the field for sieving + field = [0] * 5 * len (sieve_base) + # sieve the field + for prime in sieve_base: + offset = y % prime + for j in iter_range((prime - offset) % prime, len (field), prime): + field[j] = 1 + + # look for suitable p[i] starting at y + result = 0 + for j in range(len(field)): + composite = field[j] + # look for next canidate + if composite: + continue + tmp = y + j + result = _rabinMillerTest (tmp, rabin_miller_rounds) + if result > 0: + p[i] = tmp + break + if result == 0: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + + # Calculate R + # R = (p2^{-1} mod p1) * p2 - (p1^{-1} mod p2) * p1 + tmp1 = inverse (p[1], p[0]) * p[1] # (p2^-1 mod p1)*p2 + tmp2 = inverse (p[0], p[1]) * p[0] # (p1^-1 mod p2)*p1 + R = tmp1 - tmp2 # (p2^-1 mod p1)*p2 - (p1^-1 mod p2)*p1 + + # search for final prime number starting by Y0 + # Y0 = X + (R - X mod p1p2) + increment = p[0] * p[1] + X = X + (R - (X % increment)) + while 1: + is_possible_prime = 1 + # first check candidate against sieve_base + for prime in sieve_base: + if (X % prime) == 0: + is_possible_prime = 0 + break + # if e is given make sure that e and X-1 are coprime + # this is not necessarily a strong prime criterion but useful when + # creating them for RSA where the p-1 and q-1 should be coprime to + # the public exponent e + if e and is_possible_prime: + if e & 1: + if GCD(e, X-1) != 1: + is_possible_prime = 0 + else: + if GCD(e, (X-1) // 2) != 1: + is_possible_prime = 0 + + # do some Rabin-Miller-Tests + if is_possible_prime: + result = _rabinMillerTest (X, rabin_miller_rounds) + if result > 0: + break + X += increment + # abort when X has more bits than requested + # TODO: maybe we shouldn't abort but rather start over. + if X >= 1 << N: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + return X + +def isPrime(N, false_positive_prob=1e-6, randfunc=None): + r"""Test if a number *N* is a prime. + + Args: + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. + This is just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Cryptodome.Random.get_random_bytes` is used. + + Return: + `True` is the input is indeed prime. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + if _fastmath is not None: + return _fastmath.isPrime(long(N), false_positive_prob, randfunc) + + if N < 3 or N & 1 == 0: + return N == 2 + for p in sieve_base: + if N == p: + return True + if N % p == 0: + return False + + rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + return bool(_rabinMillerTest(N, rounds, randfunc)) + + +# Improved conversion functions contributed by Barry Warsaw, after +# careful benchmarking + +import struct + +def long_to_bytes(n, blocksize=0): + """Convert a positive integer to a byte string using big endian encoding. + + If :data:`blocksize` is absent or zero, the byte string will + be of minimal length. + + Otherwise, the length of the byte string is guaranteed to be a multiple + of :data:`blocksize`. If necessary, zeroes (``\\x00``) are added at the left. + + .. note:: + In Python 3, if you are sure that :data:`n` can fit into + :data:`blocksize` bytes, you can simply use the native method instead:: + + >>> n.to_bytes(blocksize, 'big') + + For instance:: + + >>> n = 80 + >>> n.to_bytes(2, 'big') + b'\\x00P' + + However, and unlike this ``long_to_bytes()`` function, + an ``OverflowError`` exception is raised if :data:`n` does not fit. + """ + + if n < 0 or blocksize < 0: + raise ValueError("Values must be non-negative") + + result = [] + pack = struct.pack + + # Fill the first block independently from the value of n + bsr = blocksize + while bsr >= 8: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + bsr -= 8 + + while bsr >= 4: + result.insert(0, pack('>I', n & 0xFFFFFFFF)) + n = n >> 32 + bsr -= 4 + + while bsr > 0: + result.insert(0, pack('>B', n & 0xFF)) + n = n >> 8 + bsr -= 1 + + if n == 0: + if len(result) == 0: + bresult = b'\x00' + else: + bresult = b''.join(result) + else: + # The encoded number exceeds the block size + while n > 0: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + result[0] = result[0].lstrip(b'\x00') + bresult = b''.join(result) + # bresult has minimum length here + if blocksize > 0: + target_len = ((len(bresult) - 1) // blocksize + 1) * blocksize + bresult = b'\x00' * (target_len - len(bresult)) + bresult + + return bresult + + +def bytes_to_long(s): + """Convert a byte string to a long integer (big endian). + + In Python 3.2+, use the native method instead:: + + >>> int.from_bytes(s, 'big') + + For instance:: + + >>> int.from_bytes(b'\x00P', 'big') + 80 + + This is (essentially) the inverse of :func:`long_to_bytes`. + """ + acc = 0 + + unpack = struct.unpack + + # Up to Python 2.7.4, struct.unpack can't work with bytearrays nor + # memoryviews + if sys.version_info[0:3] < (2, 7, 4): + if isinstance(s, bytearray): + s = bytes(s) + elif isinstance(s, memoryview): + s = s.tobytes() + + length = len(s) + if length % 4: + extra = (4 - length % 4) + s = b'\x00' * extra + s + length = length + extra + for i in range(0, length, 4): + acc = (acc << 32) + unpack('>I', s[i:i+4])[0] + return acc + + +# For backwards compatibility... +import warnings +def long2str(n, blocksize=0): + warnings.warn("long2str() has been replaced by long_to_bytes()") + return long_to_bytes(n, blocksize) +def str2long(s): + warnings.warn("str2long() has been replaced by bytes_to_long()") + return bytes_to_long(s) + + +# The first 10000 primes used for checking primality. +# This should be enough to eliminate most of the odd +# numbers before needing to do a Rabin-Miller test at all. +sieve_base = ( + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, + 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, + 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, + 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, + 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, + 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, + 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, + 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, + 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, + 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, + 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, + 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, + 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, + 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, + 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, + 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, + 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, + 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, + 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, + 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, + 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, + 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, + 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, + 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, + 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, + 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, + 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, + 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, + 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, + 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, + 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, + 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, + 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, + 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, + 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, + 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, + 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, + 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, + 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, + 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, + 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, + 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, + 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, + 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, + 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, + 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, + 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, + 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, + 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, + 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, + 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, + 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, + 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, + 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, + 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, + 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, + 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, + 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, + 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, + 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, + 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, + 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, + 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, + 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, + 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, + 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, + 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, + 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, + 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, + 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, + 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, + 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, + 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, + 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, + 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, + 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, + 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, + 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, + 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, + 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, + 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, + 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, + 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, + 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, + 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, + 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, + 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, + 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, + 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, + 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, + 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, + 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, + 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, + 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, + 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, + 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, + 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, + 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, + 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, + 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, + 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, + 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, + 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, + 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, + 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, + 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, + 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, + 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, + 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, + 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, + 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, + 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, + 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, + 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, + 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, + 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, + 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, + 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, + 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, + 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, + 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, + 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, + 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, + 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, + 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, + 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, + 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, + 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, + 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, + 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, + 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, + 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, + 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, + 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, + 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, + 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, + 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, + 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, + 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, + 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, + 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, + 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, + 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, + 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, + 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, + 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, + 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, + 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, + 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, + 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, + 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, + 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, + 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, + 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, + 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, + 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, + 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, + 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, + 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, + 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, + 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, + 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, + 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, + 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, + 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, + 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, + 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, + 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, + 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, + 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, + 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, + 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, + 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, + 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, + 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, + 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, + 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, + 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, + 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, + 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, + 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, + 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, + 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, + 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, + 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, + 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, + 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, + 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, + 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, + 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, + 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, + 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, + 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, + 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, + 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, + 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, + 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, + 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, + 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, + 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, + 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, + 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, + 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, + 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, + 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, + 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, + 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, + 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, + 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, + 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, + 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, + 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, + 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, + 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, + 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, + 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, + 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, + 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, + 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, + 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, + 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, + 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, + 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, + 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, + 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, + 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, + 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, + 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, + 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, + 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, + 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, + 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, + 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, + 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, + 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, + 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, + 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, + 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, + 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, + 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, + 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, + 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, + 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, + 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, + 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, + 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, + 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, + 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, + 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, + 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, + 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, + 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, + 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, + 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, + 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, + 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, + 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, + 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, + 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, + 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, + 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, + 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, + 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, + 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, + 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, + 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, + 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, + 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, + 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, + 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, + 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, + 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, + 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, + 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, + 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, + 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, + 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, + 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, + 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, + 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, + 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, + 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, + 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, + 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, + 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, + 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, + 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, + 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, + 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, + 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, + 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, + 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, + 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, + 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, + 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, + 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, + 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, + 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, + 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, + 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, + 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, + 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, + 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, + 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, + 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, + 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, + 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, + 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, + 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, + 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, + 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, + 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, + 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, + 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, + 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, + 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, + 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, + 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, + 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, + 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, + 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, + 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, + 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, + 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, + 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, + 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, + 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, + 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, + 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, + 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, + 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, + 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, + 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, + 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, + 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, + 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, + 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, + 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, + 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, + 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, + 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, + 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, + 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, + 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, + 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, + 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, + 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, + 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, + 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, + 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, + 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, + 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, + 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, + 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, + 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, + 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, + 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, + 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, + 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, + 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, + 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, + 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, + 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, + 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, + 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, + 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, + 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, + 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, + 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, + 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, + 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, + 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, + 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, + 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, + 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, + 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, + 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, + 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, + 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, + 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, + 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, + 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, + 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, + 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, + 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, + 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, + 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, + 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, + 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, + 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, + 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, + 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, + 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, + 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, + 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, + 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, + 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, + 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, + 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, + 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, + 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, + 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, + 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, + 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, + 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, + 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, + 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, + 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, + 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, + 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, + 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, + 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, + 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, + 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, + 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, + 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, + 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, + 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, + 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, + 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, + 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, + 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, + 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, + 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, + 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, + 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, + 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, + 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, + 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, + 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, + 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, + 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, + 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, + 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, + 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, + 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, + 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, + 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, + 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, + 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, + 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, + 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, + 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, + 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, + 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, + 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, + 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, + 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, + 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, + 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, + 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, + 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, + 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, + 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, + 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, + 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, + 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, + 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, + 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, + 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, + 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, + 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, + 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, + 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, + 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, + 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, + 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, + 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, + 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, + 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, + 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, + 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, + 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, + 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, + 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, + 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, + 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, + 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, + 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, + 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, + 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, + 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, + 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, + 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, + 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, + 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, + 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, + 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, + 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, + 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, + 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, + 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, + 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, + 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, + 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, + 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, + 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, + 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, + 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, + 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, + 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, + 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, + 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, + 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, + 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, + 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, + 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, + 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, + 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, + 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, + 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, + 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, + 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, + 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, + 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, + 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, + 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, + 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, + 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, + 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, + 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, + 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, + 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, + 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, + 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, + 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, + 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, + 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, + 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, + 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, + 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, + 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, + 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, + 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, + 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, + 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, + 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, + 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, + 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, + 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, + 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, + 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, + 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, + 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, + 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, + 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, + 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, + 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, + 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, + 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, + 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, + 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, + 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, + 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, + 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, + 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, + 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, + 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, + 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, + 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, + 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, + 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, + 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, + 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, + 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, + 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, + 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, + 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, + 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, + 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, + 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, + 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, + 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, + 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, + 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, + 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, + 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, + 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, + 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, + 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, + 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, + 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, + 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, + 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, + 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, + 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, + 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, + 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, + 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, + 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, + 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, + 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, + 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, + 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, + 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, + 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, + 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, + 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, + 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, + 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, + 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, + 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, + 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, + 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, + 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, + 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, + 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, + 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, + 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, + 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, + 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, + 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, + 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, + 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, + 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, + 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, + 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, + 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, + 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, + 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, + 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, + 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, + 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, + 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, + 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, + 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, + 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, + 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, + 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, + 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, + 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, + 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, + 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, + 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, + 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, + 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, + 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, + 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, + 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, + 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, + 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, + 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, + 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, + 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, + 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, + 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, + 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, + 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, + 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, + 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, + 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, + 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, + 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, + 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, + 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, + 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, + 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, + 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, + 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, + 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, + 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, + 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, + 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, + 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, + 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, + 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, + 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, + 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, + 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, + 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, + 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, + 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, + 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, + 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, + 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, + 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, + 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, + 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, + 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, + 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, + 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, + 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, + 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, + 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, + 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, + 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, + 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, + 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, + 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, + 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, + 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, + 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, + 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, + 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, + 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, + 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, + 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, + 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, + 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, + 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, + 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, + 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, + 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, + 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, + 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, + 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, + 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, + 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, + 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, + 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, + 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, + 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, + 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, + 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, + 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, + 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, + 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, + 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, + 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, + 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, + 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, + 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, + 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, + 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, + 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, + 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, + 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, + 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, + 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, + 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, + 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, + 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, + 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, + 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, + 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, + 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, + 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, + 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, + 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, + 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, + 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, + 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, + 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, + 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, + 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, + 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, + 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, + 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, + 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, + 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, + 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, + 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, + 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, + 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, + 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, + 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, + 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, + 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, + 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, + 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, + 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, + 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, + 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, + 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, + 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, + 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, + 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, + 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, + 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, + 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, + 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, + 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, + 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, + 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, + 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, + 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, + 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, + 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, +100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, +100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, +100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, +100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, +100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, +100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, +100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, +100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, +101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, +101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, +101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, +101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, +101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, +101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, +101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, +101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, +101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, +102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, +102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, +102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, +102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, +102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, +102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, +102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, +102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, +102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, +103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, +103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, +103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, +103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, +103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, +103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, +103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, +103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, +104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, +104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, +104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, +104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, +104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, +104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, +) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/number.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/number.pyi new file mode 100644 index 0000000..f8680bf --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/number.pyi @@ -0,0 +1,19 @@ +from typing import List, Optional, Callable + + +def ceil_div(n: int, d: int) -> int: ... +def size (N: int) -> int: ... +def getRandomInteger(N: int, randfunc: Optional[Callable]=None) -> int: ... +def getRandomRange(a: int, b: int, randfunc: Optional[Callable]=None) -> int: ... +def getRandomNBitInteger(N: int, randfunc: Optional[Callable]=None) -> int: ... +def GCD(x: int,y: int) -> int: ... +def inverse(u: int, v: int) -> int: ... +def getPrime(N: int, randfunc: Optional[Callable]=None) -> int: ... +def getStrongPrime(N: int, e: Optional[int]=0, false_positive_prob: Optional[float]=1e-6, randfunc: Optional[Callable]=None) -> int: ... +def isPrime(N: int, false_positive_prob: Optional[float]=1e-6, randfunc: Optional[Callable]=None) -> bool: ... +def long_to_bytes(n: int, blocksize: Optional[int]=0) -> bytes: ... +def bytes_to_long(s: bytes) -> int: ... +def long2str(n: int, blocksize: Optional[int]=0) -> bytes: ... +def str2long(s: bytes) -> int: ... + +sieve_base: List[int] diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py b/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py new file mode 100644 index 0000000..9a982e9 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# Util/py3compat.py : Compatibility code for handling Py3k / Python 2.x +# +# Written in 2010 by Thorsten Behrens +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# 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. +# =================================================================== + +"""Compatibility code for handling string/bytes changes from Python 2.x to Py3k + +In Python 2.x, strings (of type ''str'') contain binary data, including encoded +Unicode text (e.g. UTF-8). The separate type ''unicode'' holds Unicode text. +Unicode literals are specified via the u'...' prefix. Indexing or slicing +either type always produces a string of the same type as the original. +Data read from a file is always of '''str'' type. + +In Python 3.x, strings (type ''str'') may only contain Unicode text. The u'...' +prefix and the ''unicode'' type are now redundant. A new type (called +''bytes'') has to be used for binary data (including any particular +''encoding'' of a string). The b'...' prefix allows one to specify a binary +literal. Indexing or slicing a string produces another string. Slicing a byte +string produces another byte string, but the indexing operation produces an +integer. Data read from a file is of '''str'' type if the file was opened in +text mode, or of ''bytes'' type otherwise. + +Since PyCryptodome aims at supporting both Python 2.x and 3.x, the following helper +functions are used to keep the rest of the library as independent as possible +from the actual Python version. + +In general, the code should always deal with binary strings, and use integers +instead of 1-byte character strings. + +b(s) + Take a text string literal (with no prefix or with u'...' prefix) and + make a byte string. +bchr(c) + Take an integer and make a 1-character byte string. +bord(c) + Take the result of indexing on a byte string and make an integer. +tobytes(s) + Take a text string, a byte string, or a sequence of character taken from + a byte string and make a byte string. +""" + +import sys +import abc + + +if sys.version_info[0] == 2: + def b(s): + return s + def bchr(s): + return chr(s) + def bstr(s): + return str(s) + def bord(s): + return ord(s) + def tobytes(s, encoding="latin-1"): + if isinstance(s, unicode): + return s.encode(encoding) + elif isinstance(s, str): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s, memoryview): + return s.tobytes() + else: + return ''.join(s) + def tostr(bs): + return bs + def byte_string(s): + return isinstance(s, str) + + from StringIO import StringIO + BytesIO = StringIO + + from sys import maxint + + iter_range = xrange + + def is_native_int(x): + return isinstance(x, (int, long)) + + def is_string(x): + return isinstance(x, basestring) + + def is_bytes(x): + return isinstance(x, str) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + FileNotFoundError = IOError + +else: + def b(s): + return s.encode("latin-1") # utf-8 would cause some side-effects we don't want + def bchr(s): + return bytes([s]) + def bstr(s): + if isinstance(s,str): + return bytes(s,"latin-1") + else: + return bytes(s) + def bord(s): + return s + def tobytes(s, encoding="latin-1"): + if isinstance(s, bytes): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s,str): + return s.encode(encoding) + elif isinstance(s, memoryview): + return s.tobytes() + else: + return bytes([s]) + def tostr(bs): + return bs.decode("latin-1") + def byte_string(s): + return isinstance(s, bytes) + + from io import BytesIO + from io import StringIO + from sys import maxsize as maxint + + iter_range = range + + def is_native_int(x): + return isinstance(x, int) + + def is_string(x): + return isinstance(x, str) + + def is_bytes(x): + return isinstance(x, bytes) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + from abc import ABC + + FileNotFoundError = FileNotFoundError + + +def _copy_bytes(start, end, seq): + """Return an immutable copy of a sequence (byte string, byte array, memoryview) + in a certain interval [start:seq]""" + + if isinstance(seq, memoryview): + return seq[start:end].tobytes() + elif isinstance(seq, bytearray): + return bytes(seq[start:end]) + else: + return seq[start:end] + +del sys +del abc diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi new file mode 100644 index 0000000..74e04a2 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi @@ -0,0 +1,33 @@ +from typing import Union, Any, Optional, IO + +Buffer = Union[bytes, bytearray, memoryview] + +import sys + +def b(s: str) -> bytes: ... +def bchr(s: int) -> bytes: ... +def bord(s: bytes) -> int: ... +def tobytes(s: Union[bytes, str]) -> bytes: ... +def tostr(b: bytes) -> str: ... +def bytestring(x: Any) -> bool: ... + +def is_native_int(s: Any) -> bool: ... +def is_string(x: Any) -> bool: ... +def is_bytes(x: Any) -> bool: ... + +def BytesIO(b: bytes) -> IO[bytes]: ... +def StringIO(s: str) -> IO[str]: ... + +if sys.version_info[0] == 2: + from sys import maxint + iter_range = xrange + +else: + from sys import maxsize as maxint + iter_range = range + +class FileNotFoundError: + def __init__(self, err: int, msg: str, filename: str) -> None: + pass + +def _copy_bytes(start: Optional[int], end: Optional[int], seq: Buffer) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.py b/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.py new file mode 100644 index 0000000..6b16155 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.py @@ -0,0 +1,146 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin <helderijs@gmail.com> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER 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. +# =================================================================== + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + create_string_buffer, get_raw_buffer, + c_uint8_ptr, is_writeable_buffer) + +_raw_strxor = load_pycryptodome_raw_lib( + "Cryptodome.Util._strxor", + """ + void strxor(const uint8_t *in1, + const uint8_t *in2, + uint8_t *out, size_t len); + void strxor_c(const uint8_t *in, + uint8_t c, + uint8_t *out, + size_t len); + """) + + +def strxor(term1, term2, output=None): + """From two byte strings of equal length, + create a third one which is the byte-by-byte XOR of the two. + + Args: + term1 (bytes/bytearray/memoryview): + The first byte string to XOR. + term2 (bytes/bytearray/memoryview): + The second byte string to XOR. + output (bytearray/memoryview): + The location where the result will be written to. + It must have the same length as ``term1`` and ``term2``. + If ``None``, the result is returned. + :Return: + If ``output`` is ``None``, a new byte string with the result. + Otherwise ``None``. + + .. note:: + ``term1`` and ``term2`` must have the same length. + """ + + if len(term1) != len(term2): + raise ValueError("Only byte strings of equal length can be xored") + + if output is None: + result = create_string_buffer(len(term1)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term1) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term1)) + + _raw_strxor.strxor(c_uint8_ptr(term1), + c_uint8_ptr(term2), + c_uint8_ptr(result), + c_size_t(len(term1))) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def strxor_c(term, c, output=None): + """From a byte string, create a second one of equal length + where each byte is XOR-red with the same value. + + Args: + term(bytes/bytearray/memoryview): + The byte string to XOR. + c (int): + Every byte in the string will be XOR-ed with this value. + It must be between 0 and 255 (included). + output (None or bytearray/memoryview): + The location where the result will be written to. + It must have the same length as ``term``. + If ``None``, the result is returned. + + Return: + If ``output`` is ``None``, a new ``bytes`` string with the result. + Otherwise ``None``. + """ + + if not 0 <= c < 256: + raise ValueError("c must be in range(256)") + + if output is None: + result = create_string_buffer(len(term)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term)) + + _raw_strxor.strxor_c(c_uint8_ptr(term), + c, + c_uint8_ptr(result), + c_size_t(len(term)) + ) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def _strxor_direct(term1, term2, result): + """Very fast XOR - check conditions!""" + _raw_strxor.strxor(term1, term2, result, c_size_t(len(term1))) diff --git a/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi b/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi new file mode 100644 index 0000000..ca896f3 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi @@ -0,0 +1,6 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +def strxor(term1: bytes, term2: bytes, output: Optional[Buffer]=...) -> bytes: ... +def strxor_c(term: bytes, c: int, output: Optional[Buffer]=...) -> bytes: ... diff --git a/python/lib/python3.11/site-packages/Cryptodome/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/__init__.py new file mode 100644 index 0000000..bfd02cd --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/__init__.py @@ -0,0 +1,6 @@ +__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util', 'Signature', + 'IO', 'Math'] + +version_info = (3, 18, '0') + +__version__ = ".".join([str(x) for x in version_info]) diff --git a/python/lib/python3.11/site-packages/Cryptodome/__init__.pyi b/python/lib/python3.11/site-packages/Cryptodome/__init__.pyi new file mode 100644 index 0000000..bc73446 --- /dev/null +++ b/python/lib/python3.11/site-packages/Cryptodome/__init__.pyi @@ -0,0 +1,4 @@ +from typing import Tuple, Union + +version_info : Tuple[int, int, Union[int, str]] +__version__ : str diff --git a/lib/site-packages/pip/_vendor/chardet/metadata/__init__.py b/python/lib/python3.11/site-packages/Cryptodome/py.typed similarity index 100% rename from lib/site-packages/pip/_vendor/chardet/metadata/__init__.py rename to python/lib/python3.11/site-packages/Cryptodome/py.typed diff --git a/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER 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. diff --git a/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA new file mode 100644 index 0000000..2526be4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 2.2.5 +Summary: A simple framework for building complex web applications. +Home-page: https://palletsprojects.com/p/flask +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: Werkzeug (>=2.2.2) +Requires-Dist: Jinja2 (>=3.0) +Requires-Dist: itsdangerous (>=2.0) +Requires-Dist: click (>=8.0) +Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10" +Provides-Extra: async +Requires-Dist: asgiref (>=3.2) ; extra == 'async' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Website: https://palletsprojects.com/p/flask/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD rename to python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD diff --git a/lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py rename to python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED diff --git a/lib/site-packages/pip-23.2.1.dist-info/WHEEL b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL similarity index 100% rename from lib/site-packages/pip-23.2.1.dist-info/WHEEL rename to python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL diff --git a/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt new file mode 100644 index 0000000..137232d --- /dev/null +++ b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +flask = flask.cli:main diff --git a/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/python/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER 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. diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA new file mode 100644 index 0000000..f54bb5c --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA @@ -0,0 +1,113 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.0) +Provides-Extra: i18n +Requires-Dist: Babel (>=2.7) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + <ul> + {% for user in users %} + <li><a href="{{ user.url }}">{{ user.username }}</a></li> + {% endfor %} + </ul> + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Website: https://palletsprojects.com/p/jinja/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD rename to python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD diff --git a/lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py rename to python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt new file mode 100644 index 0000000..7b9666c --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/python/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER 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. diff --git a/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA new file mode 100644 index 0000000..bced165 --- /dev/null +++ b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA @@ -0,0 +1,93 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.3 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("<script>alert(document.cookie);</script>") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("<strong>Hello</strong>") + Markup('<strong>hello</strong>') + + >>> escape(Markup("<strong>Hello</strong>")) + Markup('<strong>hello</strong>') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello <em>{name}</em>") + >>> template.format(name='"World"') + Markup('Hello <em>"World"</em>') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD rename to python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD diff --git a/lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py rename to python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL rename to python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL diff --git a/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/python/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER 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. diff --git a/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA new file mode 100644 index 0000000..647bfc8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA @@ -0,0 +1,126 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 2.2.3 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/werkzeug/ +Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.1.1) +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug doesn't enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. It can be used to build all sorts of end user applications +such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Donate +------ + +The Pallets organization develops and supports Werkzeug and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://werkzeug.palletsprojects.com/ +- Changes: https://werkzeug.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Werkzeug/ +- Source Code: https://github.com/pallets/werkzeug/ +- Issue Tracker: https://github.com/pallets/werkzeug/issues/ +- Website: https://palletsprojects.com/p/werkzeug/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD rename to python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD diff --git a/lib/site-packages/pip/_vendor/urllib3/packages/__init__.py b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED similarity index 100% rename from lib/site-packages/pip/_vendor/urllib3/packages/__init__.py rename to python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED diff --git a/lib/python3.11/site-packages/zipp-3.15.0.dist-info/WHEEL b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL similarity index 100% rename from lib/python3.11/site-packages/zipp-3.15.0.dist-info/WHEEL rename to python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL diff --git a/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/python/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so b/python/lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so similarity index 100% rename from lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so rename to python/lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so diff --git a/lib/python3.11/site-packages/_distutils_hack/__init__.py b/python/lib/python3.11/site-packages/_distutils_hack/__init__.py similarity index 100% rename from lib/python3.11/site-packages/_distutils_hack/__init__.py rename to python/lib/python3.11/site-packages/_distutils_hack/__init__.py diff --git a/python/lib/python3.11/site-packages/_distutils_hack/override.py b/python/lib/python3.11/site-packages/_distutils_hack/override.py new file mode 100644 index 0000000..2cc433a --- /dev/null +++ b/python/lib/python3.11/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/python/lib/python3.11/site-packages/apscheduler/__init__.py b/python/lib/python3.11/site-packages/apscheduler/__init__.py new file mode 100644 index 0000000..968169a --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/__init__.py @@ -0,0 +1,10 @@ +from pkg_resources import get_distribution, DistributionNotFound + +try: + release = get_distribution('APScheduler').version.split('-')[0] +except DistributionNotFound: + release = '3.5.0' + +version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.')) +version = __version__ = '.'.join(str(x) for x in version_info[:3]) +del get_distribution, DistributionNotFound diff --git a/python/lib/python3.11/site-packages/apscheduler/events.py b/python/lib/python3.11/site-packages/apscheduler/events.py new file mode 100644 index 0000000..016da03 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/events.py @@ -0,0 +1,94 @@ +__all__ = ('EVENT_SCHEDULER_STARTED', 'EVENT_SCHEDULER_SHUTDOWN', 'EVENT_SCHEDULER_PAUSED', + 'EVENT_SCHEDULER_RESUMED', 'EVENT_EXECUTOR_ADDED', 'EVENT_EXECUTOR_REMOVED', + 'EVENT_JOBSTORE_ADDED', 'EVENT_JOBSTORE_REMOVED', 'EVENT_ALL_JOBS_REMOVED', + 'EVENT_JOB_ADDED', 'EVENT_JOB_REMOVED', 'EVENT_JOB_MODIFIED', 'EVENT_JOB_EXECUTED', + 'EVENT_JOB_ERROR', 'EVENT_JOB_MISSED', 'EVENT_JOB_SUBMITTED', 'EVENT_JOB_MAX_INSTANCES', + 'SchedulerEvent', 'JobEvent', 'JobExecutionEvent', 'JobSubmissionEvent') + + +EVENT_SCHEDULER_STARTED = EVENT_SCHEDULER_START = 2 ** 0 +EVENT_SCHEDULER_SHUTDOWN = 2 ** 1 +EVENT_SCHEDULER_PAUSED = 2 ** 2 +EVENT_SCHEDULER_RESUMED = 2 ** 3 +EVENT_EXECUTOR_ADDED = 2 ** 4 +EVENT_EXECUTOR_REMOVED = 2 ** 5 +EVENT_JOBSTORE_ADDED = 2 ** 6 +EVENT_JOBSTORE_REMOVED = 2 ** 7 +EVENT_ALL_JOBS_REMOVED = 2 ** 8 +EVENT_JOB_ADDED = 2 ** 9 +EVENT_JOB_REMOVED = 2 ** 10 +EVENT_JOB_MODIFIED = 2 ** 11 +EVENT_JOB_EXECUTED = 2 ** 12 +EVENT_JOB_ERROR = 2 ** 13 +EVENT_JOB_MISSED = 2 ** 14 +EVENT_JOB_SUBMITTED = 2 ** 15 +EVENT_JOB_MAX_INSTANCES = 2 ** 16 +EVENT_ALL = (EVENT_SCHEDULER_STARTED | EVENT_SCHEDULER_SHUTDOWN | EVENT_SCHEDULER_PAUSED | + EVENT_SCHEDULER_RESUMED | EVENT_EXECUTOR_ADDED | EVENT_EXECUTOR_REMOVED | + EVENT_JOBSTORE_ADDED | EVENT_JOBSTORE_REMOVED | EVENT_ALL_JOBS_REMOVED | + EVENT_JOB_ADDED | EVENT_JOB_REMOVED | EVENT_JOB_MODIFIED | EVENT_JOB_EXECUTED | + EVENT_JOB_ERROR | EVENT_JOB_MISSED | EVENT_JOB_SUBMITTED | EVENT_JOB_MAX_INSTANCES) + + +class SchedulerEvent(object): + """ + An event that concerns the scheduler itself. + + :ivar code: the type code of this event + :ivar alias: alias of the job store or executor that was added or removed (if applicable) + """ + + def __init__(self, code, alias=None): + super(SchedulerEvent, self).__init__() + self.code = code + self.alias = alias + + def __repr__(self): + return '<%s (code=%d)>' % (self.__class__.__name__, self.code) + + +class JobEvent(SchedulerEvent): + """ + An event that concerns a job. + + :ivar code: the type code of this event + :ivar job_id: identifier of the job in question + :ivar jobstore: alias of the job store containing the job in question + """ + + def __init__(self, code, job_id, jobstore): + super(JobEvent, self).__init__(code) + self.code = code + self.job_id = job_id + self.jobstore = jobstore + + +class JobSubmissionEvent(JobEvent): + """ + An event that concerns the submission of a job to its executor. + + :ivar scheduled_run_times: a list of datetimes when the job was intended to run + """ + + def __init__(self, code, job_id, jobstore, scheduled_run_times): + super(JobSubmissionEvent, self).__init__(code, job_id, jobstore) + self.scheduled_run_times = scheduled_run_times + + +class JobExecutionEvent(JobEvent): + """ + An event that concerns the running of a job within its executor. + + :ivar scheduled_run_time: the time when the job was scheduled to be run + :ivar retval: the return value of the successfully executed job + :ivar exception: the exception raised by the job + :ivar traceback: a formatted traceback for the exception + """ + + def __init__(self, code, job_id, jobstore, scheduled_run_time, retval=None, exception=None, + traceback=None): + super(JobExecutionEvent, self).__init__(code, job_id, jobstore) + self.scheduled_run_time = scheduled_run_time + self.retval = retval + self.exception = exception + self.traceback = traceback diff --git a/lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/python/lib/python3.11/site-packages/apscheduler/executors/__init__.py similarity index 100% rename from lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py rename to python/lib/python3.11/site-packages/apscheduler/executors/__init__.py diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/asyncio.py b/python/lib/python3.11/site-packages/apscheduler/executors/asyncio.py new file mode 100644 index 0000000..7d45d6c --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/asyncio.py @@ -0,0 +1,52 @@ +from __future__ import absolute_import + +import sys + +from apscheduler.executors.base import BaseExecutor, run_job +from apscheduler.executors.base_py3 import run_coroutine_job +from apscheduler.util import iscoroutinefunction_partial + + +class AsyncIOExecutor(BaseExecutor): + """ + Runs jobs in the default executor of the event loop. + + If the job function is a native coroutine function, it is scheduled to be run directly in the + event loop as soon as possible. All other functions are run in the event loop's default + executor which is usually a thread pool. + + Plugin alias: ``asyncio`` + """ + + def start(self, scheduler, alias): + super(AsyncIOExecutor, self).start(scheduler, alias) + self._eventloop = scheduler._eventloop + self._pending_futures = set() + + def shutdown(self, wait=True): + # There is no way to honor wait=True without converting this method into a coroutine method + for f in self._pending_futures: + if not f.done(): + f.cancel() + + self._pending_futures.clear() + + def _do_submit_job(self, job, run_times): + def callback(f): + self._pending_futures.discard(f) + try: + events = f.result() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + if iscoroutinefunction_partial(job.func): + coro = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) + f = self._eventloop.create_task(coro) + else: + f = self._eventloop.run_in_executor(None, run_job, job, job._jobstore_alias, run_times, + self._logger.name) + + f.add_done_callback(callback) + self._pending_futures.add(f) diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/base.py b/python/lib/python3.11/site-packages/apscheduler/executors/base.py new file mode 100644 index 0000000..4c09fc1 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/base.py @@ -0,0 +1,146 @@ +from abc import ABCMeta, abstractmethod +from collections import defaultdict +from datetime import datetime, timedelta +from traceback import format_tb +import logging +import sys + +from pytz import utc +import six + +from apscheduler.events import ( + JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) + + +class MaxInstancesReachedError(Exception): + def __init__(self, job): + super(MaxInstancesReachedError, self).__init__( + 'Job "%s" has already reached its maximum number of instances (%d)' % + (job.id, job.max_instances)) + + +class BaseExecutor(six.with_metaclass(ABCMeta, object)): + """Abstract base class that defines the interface that every executor must implement.""" + + _scheduler = None + _lock = None + _logger = logging.getLogger('apscheduler.executors') + + def __init__(self): + super(BaseExecutor, self).__init__() + self._instances = defaultdict(lambda: 0) + + def start(self, scheduler, alias): + """ + Called by the scheduler when the scheduler is being started or when the executor is being + added to an already running scheduler. + + :param apscheduler.schedulers.base.BaseScheduler scheduler: the scheduler that is starting + this executor + :param str|unicode alias: alias of this executor as it was assigned to the scheduler + + """ + self._scheduler = scheduler + self._lock = scheduler._create_lock() + self._logger = logging.getLogger('apscheduler.executors.%s' % alias) + + def shutdown(self, wait=True): + """ + Shuts down this executor. + + :param bool wait: ``True`` to wait until all submitted jobs + have been executed + """ + + def submit_job(self, job, run_times): + """ + Submits job for execution. + + :param Job job: job to execute + :param list[datetime] run_times: list of datetimes specifying + when the job should have been run + :raises MaxInstancesReachedError: if the maximum number of + allowed instances for this job has been reached + + """ + assert self._lock is not None, 'This executor has not been started yet' + with self._lock: + if self._instances[job.id] >= job.max_instances: + raise MaxInstancesReachedError(job) + + self._do_submit_job(job, run_times) + self._instances[job.id] += 1 + + @abstractmethod + def _do_submit_job(self, job, run_times): + """Performs the actual task of scheduling `run_job` to be called.""" + + def _run_job_success(self, job_id, events): + """ + Called by the executor with the list of generated events when :func:`run_job` has been + successfully called. + + """ + with self._lock: + self._instances[job_id] -= 1 + if self._instances[job_id] == 0: + del self._instances[job_id] + + for event in events: + self._scheduler._dispatch_event(event) + + def _run_job_error(self, job_id, exc, traceback=None): + """Called by the executor with the exception if there is an error calling `run_job`.""" + with self._lock: + self._instances[job_id] -= 1 + if self._instances[job_id] == 0: + del self._instances[job_id] + + exc_info = (exc.__class__, exc, traceback) + self._logger.error('Error running job %s', job_id, exc_info=exc_info) + + +def run_job(job, jobstore_alias, run_times, logger_name): + """ + Called by executors to run the job. Returns a list of scheduler events to be dispatched by the + scheduler. + + """ + events = [] + logger = logging.getLogger(logger_name) + for run_time in run_times: + # See if the job missed its run time window, and handle + # possible misfires accordingly + if job.misfire_grace_time is not None: + difference = datetime.now(utc) - run_time + grace_time = timedelta(seconds=job.misfire_grace_time) + if difference > grace_time: + events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, + run_time)) + logger.warning('Run time of job "%s" was missed by %s', job, difference) + continue + + logger.info('Running job "%s" (scheduled at %s)', job, run_time) + try: + retval = job.func(*job.args, **job.kwargs) + except BaseException: + exc, tb = sys.exc_info()[1:] + formatted_tb = ''.join(format_tb(tb)) + events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, + exception=exc, traceback=formatted_tb)) + logger.exception('Job "%s" raised an exception', job) + + # This is to prevent cyclic references that would lead to memory leaks + if six.PY2: + sys.exc_clear() + del tb + else: + import traceback + traceback.clear_frames(tb) + del tb + else: + events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, + retval=retval)) + logger.info('Job "%s" executed successfully', job) + + return events diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/base_py3.py b/python/lib/python3.11/site-packages/apscheduler/executors/base_py3.py new file mode 100644 index 0000000..7111d2a --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/base_py3.py @@ -0,0 +1,43 @@ +import logging +import sys +import traceback +from datetime import datetime, timedelta +from traceback import format_tb + +from pytz import utc + +from apscheduler.events import ( + JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) + + +async def run_coroutine_job(job, jobstore_alias, run_times, logger_name): + """Coroutine version of run_job().""" + events = [] + logger = logging.getLogger(logger_name) + for run_time in run_times: + # See if the job missed its run time window, and handle possible misfires accordingly + if job.misfire_grace_time is not None: + difference = datetime.now(utc) - run_time + grace_time = timedelta(seconds=job.misfire_grace_time) + if difference > grace_time: + events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, + run_time)) + logger.warning('Run time of job "%s" was missed by %s', job, difference) + continue + + logger.info('Running job "%s" (scheduled at %s)', job, run_time) + try: + retval = await job.func(*job.args, **job.kwargs) + except BaseException: + exc, tb = sys.exc_info()[1:] + formatted_tb = ''.join(format_tb(tb)) + events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, + exception=exc, traceback=formatted_tb)) + logger.exception('Job "%s" raised an exception', job) + traceback.clear_frames(tb) + else: + events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, + retval=retval)) + logger.info('Job "%s" executed successfully', job) + + return events diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/debug.py b/python/lib/python3.11/site-packages/apscheduler/executors/debug.py new file mode 100644 index 0000000..ac739ae --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/debug.py @@ -0,0 +1,20 @@ +import sys + +from apscheduler.executors.base import BaseExecutor, run_job + + +class DebugExecutor(BaseExecutor): + """ + A special executor that executes the target callable directly instead of deferring it to a + thread or process. + + Plugin alias: ``debug`` + """ + + def _do_submit_job(self, job, run_times): + try: + events = run_job(job, job._jobstore_alias, run_times, self._logger.name) + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/gevent.py b/python/lib/python3.11/site-packages/apscheduler/executors/gevent.py new file mode 100644 index 0000000..1235bb6 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/gevent.py @@ -0,0 +1,30 @@ +from __future__ import absolute_import +import sys + +from apscheduler.executors.base import BaseExecutor, run_job + + +try: + import gevent +except ImportError: # pragma: nocover + raise ImportError('GeventExecutor requires gevent installed') + + +class GeventExecutor(BaseExecutor): + """ + Runs jobs as greenlets. + + Plugin alias: ``gevent`` + """ + + def _do_submit_job(self, job, run_times): + def callback(greenlet): + try: + events = greenlet.get() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + gevent.spawn(run_job, job, job._jobstore_alias, run_times, self._logger.name).\ + link(callback) diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/pool.py b/python/lib/python3.11/site-packages/apscheduler/executors/pool.py new file mode 100644 index 0000000..c85896e --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/pool.py @@ -0,0 +1,71 @@ +from abc import abstractmethod +import concurrent.futures + +from apscheduler.executors.base import BaseExecutor, run_job + +try: + from concurrent.futures.process import BrokenProcessPool +except ImportError: + BrokenProcessPool = None + + +class BasePoolExecutor(BaseExecutor): + @abstractmethod + def __init__(self, pool): + super(BasePoolExecutor, self).__init__() + self._pool = pool + + def _do_submit_job(self, job, run_times): + def callback(f): + exc, tb = (f.exception_info() if hasattr(f, 'exception_info') else + (f.exception(), getattr(f.exception(), '__traceback__', None))) + if exc: + self._run_job_error(job.id, exc, tb) + else: + self._run_job_success(job.id, f.result()) + + try: + f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) + except BrokenProcessPool: + self._logger.warning('Process pool is broken; replacing pool with a fresh instance') + self._pool = self._pool.__class__(self._pool._max_workers) + f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) + + f.add_done_callback(callback) + + def shutdown(self, wait=True): + self._pool.shutdown(wait) + + +class ThreadPoolExecutor(BasePoolExecutor): + """ + An executor that runs jobs in a concurrent.futures thread pool. + + Plugin alias: ``threadpool`` + + :param max_workers: the maximum number of spawned threads. + :param pool_kwargs: dict of keyword arguments to pass to the underlying + ThreadPoolExecutor constructor + """ + + def __init__(self, max_workers=10, pool_kwargs=None): + pool_kwargs = pool_kwargs or {} + pool = concurrent.futures.ThreadPoolExecutor(int(max_workers), **pool_kwargs) + super(ThreadPoolExecutor, self).__init__(pool) + + +class ProcessPoolExecutor(BasePoolExecutor): + """ + An executor that runs jobs in a concurrent.futures process pool. + + Plugin alias: ``processpool`` + + :param max_workers: the maximum number of spawned processes. + :param pool_kwargs: dict of keyword arguments to pass to the underlying + ProcessPoolExecutor constructor + """ + + def __init__(self, max_workers=10, pool_kwargs=None): + pool_kwargs = pool_kwargs or {} + pool = concurrent.futures.ProcessPoolExecutor(int(max_workers), **pool_kwargs) + super(ProcessPoolExecutor, self).__init__(pool) diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/tornado.py b/python/lib/python3.11/site-packages/apscheduler/executors/tornado.py new file mode 100644 index 0000000..3b97eec --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/tornado.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import + +import sys +from concurrent.futures import ThreadPoolExecutor + +from tornado.gen import convert_yielded + +from apscheduler.executors.base import BaseExecutor, run_job + +try: + from apscheduler.executors.base_py3 import run_coroutine_job + from apscheduler.util import iscoroutinefunction_partial +except ImportError: + def iscoroutinefunction_partial(func): + return False + + +class TornadoExecutor(BaseExecutor): + """ + Runs jobs either in a thread pool or directly on the I/O loop. + + If the job function is a native coroutine function, it is scheduled to be run directly in the + I/O loop as soon as possible. All other functions are run in a thread pool. + + Plugin alias: ``tornado`` + + :param int max_workers: maximum number of worker threads in the thread pool + """ + + def __init__(self, max_workers=10): + super(TornadoExecutor, self).__init__() + self.executor = ThreadPoolExecutor(max_workers) + + def start(self, scheduler, alias): + super(TornadoExecutor, self).start(scheduler, alias) + self._ioloop = scheduler._ioloop + + def _do_submit_job(self, job, run_times): + def callback(f): + try: + events = f.result() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + if iscoroutinefunction_partial(job.func): + f = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) + else: + f = self.executor.submit(run_job, job, job._jobstore_alias, run_times, + self._logger.name) + + f = convert_yielded(f) + f.add_done_callback(callback) diff --git a/python/lib/python3.11/site-packages/apscheduler/executors/twisted.py b/python/lib/python3.11/site-packages/apscheduler/executors/twisted.py new file mode 100644 index 0000000..c7bcf64 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/executors/twisted.py @@ -0,0 +1,25 @@ +from __future__ import absolute_import + +from apscheduler.executors.base import BaseExecutor, run_job + + +class TwistedExecutor(BaseExecutor): + """ + Runs jobs in the reactor's thread pool. + + Plugin alias: ``twisted`` + """ + + def start(self, scheduler, alias): + super(TwistedExecutor, self).start(scheduler, alias) + self._reactor = scheduler._reactor + + def _do_submit_job(self, job, run_times): + def callback(success, result): + if success: + self._run_job_success(job.id, result) + else: + self._run_job_error(job.id, result.value, result.tb) + + self._reactor.getThreadPool().callInThreadWithCallback( + callback, run_job, job, job._jobstore_alias, run_times, self._logger.name) diff --git a/python/lib/python3.11/site-packages/apscheduler/job.py b/python/lib/python3.11/site-packages/apscheduler/job.py new file mode 100644 index 0000000..445d9a8 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/job.py @@ -0,0 +1,302 @@ +from inspect import ismethod, isclass +from uuid import uuid4 + +import six + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + ref_to_obj, obj_to_ref, datetime_repr, repr_escape, get_callable_name, check_callable_args, + convert_to_datetime) + +try: + from collections.abc import Iterable, Mapping +except ImportError: + from collections import Iterable, Mapping + + +class Job(object): + """ + Contains the options given when scheduling callables and its current schedule and other state. + This class should never be instantiated by the user. + + :var str id: the unique identifier of this job + :var str name: the description of this job + :var func: the callable to execute + :var tuple|list args: positional arguments to the callable + :var dict kwargs: keyword arguments to the callable + :var bool coalesce: whether to only run the job once when several run times are due + :var trigger: the trigger object that controls the schedule of this job + :var str executor: the name of the executor that will run this job + :var int misfire_grace_time: the time (in seconds) how much this job's execution is allowed to + be late (``None`` means "allow the job to run no matter how late it is") + :var int max_instances: the maximum number of concurrently executing instances allowed for this + job + :var datetime.datetime next_run_time: the next scheduled run time of this job + + .. note:: + The ``misfire_grace_time`` has some non-obvious effects on job execution. See the + :ref:`missed-job-executions` section in the documentation for an in-depth explanation. + """ + + __slots__ = ('_scheduler', '_jobstore_alias', 'id', 'trigger', 'executor', 'func', 'func_ref', + 'args', 'kwargs', 'name', 'misfire_grace_time', 'coalesce', 'max_instances', + 'next_run_time', '__weakref__') + + def __init__(self, scheduler, id=None, **kwargs): + super(Job, self).__init__() + self._scheduler = scheduler + self._jobstore_alias = None + self._modify(id=id or uuid4().hex, **kwargs) + + def modify(self, **changes): + """ + Makes the given changes to this job and saves it in the associated job store. + + Accepted keyword arguments are the same as the variables on this class. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.modify_job` + + :return Job: this job instance + + """ + self._scheduler.modify_job(self.id, self._jobstore_alias, **changes) + return self + + def reschedule(self, trigger, **trigger_args): + """ + Shortcut for switching the trigger on this job. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.reschedule_job` + + :return Job: this job instance + + """ + self._scheduler.reschedule_job(self.id, self._jobstore_alias, trigger, **trigger_args) + return self + + def pause(self): + """ + Temporarily suspend the execution of this job. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.pause_job` + + :return Job: this job instance + + """ + self._scheduler.pause_job(self.id, self._jobstore_alias) + return self + + def resume(self): + """ + Resume the schedule of this job if previously paused. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.resume_job` + + :return Job: this job instance + + """ + self._scheduler.resume_job(self.id, self._jobstore_alias) + return self + + def remove(self): + """ + Unschedules this job and removes it from its associated job store. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.remove_job` + + """ + self._scheduler.remove_job(self.id, self._jobstore_alias) + + @property + def pending(self): + """ + Returns ``True`` if the referenced job is still waiting to be added to its designated job + store. + + """ + return self._jobstore_alias is None + + # + # Private API + # + + def _get_run_times(self, now): + """ + Computes the scheduled run times between ``next_run_time`` and ``now`` (inclusive). + + :type now: datetime.datetime + :rtype: list[datetime.datetime] + + """ + run_times = [] + next_run_time = self.next_run_time + while next_run_time and next_run_time <= now: + run_times.append(next_run_time) + next_run_time = self.trigger.get_next_fire_time(next_run_time, now) + + return run_times + + def _modify(self, **changes): + """ + Validates the changes to the Job and makes the modifications if and only if all of them + validate. + + """ + approved = {} + + if 'id' in changes: + value = changes.pop('id') + if not isinstance(value, six.string_types): + raise TypeError("id must be a nonempty string") + if hasattr(self, 'id'): + raise ValueError('The job ID may not be changed') + approved['id'] = value + + if 'func' in changes or 'args' in changes or 'kwargs' in changes: + func = changes.pop('func') if 'func' in changes else self.func + args = changes.pop('args') if 'args' in changes else self.args + kwargs = changes.pop('kwargs') if 'kwargs' in changes else self.kwargs + + if isinstance(func, six.string_types): + func_ref = func + func = ref_to_obj(func) + elif callable(func): + try: + func_ref = obj_to_ref(func) + except ValueError: + # If this happens, this Job won't be serializable + func_ref = None + else: + raise TypeError('func must be a callable or a textual reference to one') + + if not hasattr(self, 'name') and changes.get('name', None) is None: + changes['name'] = get_callable_name(func) + + if isinstance(args, six.string_types) or not isinstance(args, Iterable): + raise TypeError('args must be a non-string iterable') + if isinstance(kwargs, six.string_types) or not isinstance(kwargs, Mapping): + raise TypeError('kwargs must be a dict-like object') + + check_callable_args(func, args, kwargs) + + approved['func'] = func + approved['func_ref'] = func_ref + approved['args'] = args + approved['kwargs'] = kwargs + + if 'name' in changes: + value = changes.pop('name') + if not value or not isinstance(value, six.string_types): + raise TypeError("name must be a nonempty string") + approved['name'] = value + + if 'misfire_grace_time' in changes: + value = changes.pop('misfire_grace_time') + if value is not None and (not isinstance(value, six.integer_types) or value <= 0): + raise TypeError('misfire_grace_time must be either None or a positive integer') + approved['misfire_grace_time'] = value + + if 'coalesce' in changes: + value = bool(changes.pop('coalesce')) + approved['coalesce'] = value + + if 'max_instances' in changes: + value = changes.pop('max_instances') + if not isinstance(value, six.integer_types) or value <= 0: + raise TypeError('max_instances must be a positive integer') + approved['max_instances'] = value + + if 'trigger' in changes: + trigger = changes.pop('trigger') + if not isinstance(trigger, BaseTrigger): + raise TypeError('Expected a trigger instance, got %s instead' % + trigger.__class__.__name__) + + approved['trigger'] = trigger + + if 'executor' in changes: + value = changes.pop('executor') + if not isinstance(value, six.string_types): + raise TypeError('executor must be a string') + approved['executor'] = value + + if 'next_run_time' in changes: + value = changes.pop('next_run_time') + approved['next_run_time'] = convert_to_datetime(value, self._scheduler.timezone, + 'next_run_time') + + if changes: + raise AttributeError('The following are not modifiable attributes of Job: %s' % + ', '.join(changes)) + + for key, value in six.iteritems(approved): + setattr(self, key, value) + + def __getstate__(self): + # Don't allow this Job to be serialized if the function reference could not be determined + if not self.func_ref: + raise ValueError( + 'This Job cannot be serialized since the reference to its callable (%r) could not ' + 'be determined. Consider giving a textual reference (module:function name) ' + 'instead.' % (self.func,)) + + # Instance methods cannot survive serialization as-is, so store the "self" argument + # explicitly + func = self.func + if ismethod(func) and not isclass(func.__self__) and obj_to_ref(func) == self.func_ref: + args = (func.__self__,) + tuple(self.args) + else: + args = self.args + + return { + 'version': 1, + 'id': self.id, + 'func': self.func_ref, + 'trigger': self.trigger, + 'executor': self.executor, + 'args': args, + 'kwargs': self.kwargs, + 'name': self.name, + 'misfire_grace_time': self.misfire_grace_time, + 'coalesce': self.coalesce, + 'max_instances': self.max_instances, + 'next_run_time': self.next_run_time + } + + def __setstate__(self, state): + if state.get('version', 1) > 1: + raise ValueError('Job has version %s, but only version 1 can be handled' % + state['version']) + + self.id = state['id'] + self.func_ref = state['func'] + self.func = ref_to_obj(self.func_ref) + self.trigger = state['trigger'] + self.executor = state['executor'] + self.args = state['args'] + self.kwargs = state['kwargs'] + self.name = state['name'] + self.misfire_grace_time = state['misfire_grace_time'] + self.coalesce = state['coalesce'] + self.max_instances = state['max_instances'] + self.next_run_time = state['next_run_time'] + + def __eq__(self, other): + if isinstance(other, Job): + return self.id == other.id + return NotImplemented + + def __repr__(self): + return '<Job (id=%s name=%s)>' % (repr_escape(self.id), repr_escape(self.name)) + + def __str__(self): + return repr_escape(self.__unicode__()) + + def __unicode__(self): + if hasattr(self, 'next_run_time'): + status = ('next run at: ' + datetime_repr(self.next_run_time) if + self.next_run_time else 'paused') + else: + status = 'pending' + + return u'%s (trigger: %s, %s)' % (self.name, self.trigger, status) diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/__init__.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/base.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/base.py new file mode 100644 index 0000000..9cff66c --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/base.py @@ -0,0 +1,143 @@ +from abc import ABCMeta, abstractmethod +import logging + +import six + + +class JobLookupError(KeyError): + """Raised when the job store cannot find a job for update or removal.""" + + def __init__(self, job_id): + super(JobLookupError, self).__init__(u'No job by the id of %s was found' % job_id) + + +class ConflictingIdError(KeyError): + """Raised when the uniqueness of job IDs is being violated.""" + + def __init__(self, job_id): + super(ConflictingIdError, self).__init__( + u'Job identifier (%s) conflicts with an existing job' % job_id) + + +class TransientJobError(ValueError): + """ + Raised when an attempt to add transient (with no func_ref) job to a persistent job store is + detected. + """ + + def __init__(self, job_id): + super(TransientJobError, self).__init__( + u'Job (%s) cannot be added to this job store because a reference to the callable ' + u'could not be determined.' % job_id) + + +class BaseJobStore(six.with_metaclass(ABCMeta)): + """Abstract base class that defines the interface that every job store must implement.""" + + _scheduler = None + _alias = None + _logger = logging.getLogger('apscheduler.jobstores') + + def start(self, scheduler, alias): + """ + Called by the scheduler when the scheduler is being started or when the job store is being + added to an already running scheduler. + + :param apscheduler.schedulers.base.BaseScheduler scheduler: the scheduler that is starting + this job store + :param str|unicode alias: alias of this job store as it was assigned to the scheduler + """ + + self._scheduler = scheduler + self._alias = alias + self._logger = logging.getLogger('apscheduler.jobstores.%s' % alias) + + def shutdown(self): + """Frees any resources still bound to this job store.""" + + def _fix_paused_jobs_sorting(self, jobs): + for i, job in enumerate(jobs): + if job.next_run_time is not None: + if i > 0: + paused_jobs = jobs[:i] + del jobs[:i] + jobs.extend(paused_jobs) + break + + @abstractmethod + def lookup_job(self, job_id): + """ + Returns a specific job, or ``None`` if it isn't found.. + + The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of + the returned job to point to the scheduler and itself, respectively. + + :param str|unicode job_id: identifier of the job + :rtype: Job + """ + + @abstractmethod + def get_due_jobs(self, now): + """ + Returns the list of jobs that have ``next_run_time`` earlier or equal to ``now``. + The returned jobs must be sorted by next run time (ascending). + + :param datetime.datetime now: the current (timezone aware) datetime + :rtype: list[Job] + """ + + @abstractmethod + def get_next_run_time(self): + """ + Returns the earliest run time of all the jobs stored in this job store, or ``None`` if + there are no active jobs. + + :rtype: datetime.datetime + """ + + @abstractmethod + def get_all_jobs(self): + """ + Returns a list of all jobs in this job store. + The returned jobs should be sorted by next run time (ascending). + Paused jobs (next_run_time == None) should be sorted last. + + The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of + the returned jobs to point to the scheduler and itself, respectively. + + :rtype: list[Job] + """ + + @abstractmethod + def add_job(self, job): + """ + Adds the given job to this store. + + :param Job job: the job to add + :raises ConflictingIdError: if there is another job in this store with the same ID + """ + + @abstractmethod + def update_job(self, job): + """ + Replaces the job in the store with the given newer version. + + :param Job job: the job to update + :raises JobLookupError: if the job does not exist + """ + + @abstractmethod + def remove_job(self, job_id): + """ + Removes the given job from this store. + + :param str|unicode job_id: identifier of the job + :raises JobLookupError: if the job does not exist + """ + + @abstractmethod + def remove_all_jobs(self): + """Removes all jobs from this store.""" + + def __repr__(self): + return '<%s>' % self.__class__.__name__ diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/memory.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/memory.py new file mode 100644 index 0000000..abfe7c6 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/memory.py @@ -0,0 +1,108 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import datetime_to_utc_timestamp + + +class MemoryJobStore(BaseJobStore): + """ + Stores jobs in an array in RAM. Provides no persistence support. + + Plugin alias: ``memory`` + """ + + def __init__(self): + super(MemoryJobStore, self).__init__() + # list of (job, timestamp), sorted by next_run_time and job id (ascending) + self._jobs = [] + self._jobs_index = {} # id -> (job, timestamp) lookup table + + def lookup_job(self, job_id): + return self._jobs_index.get(job_id, (None, None))[0] + + def get_due_jobs(self, now): + now_timestamp = datetime_to_utc_timestamp(now) + pending = [] + for job, timestamp in self._jobs: + if timestamp is None or timestamp > now_timestamp: + break + pending.append(job) + + return pending + + def get_next_run_time(self): + return self._jobs[0][0].next_run_time if self._jobs else None + + def get_all_jobs(self): + return [j[0] for j in self._jobs] + + def add_job(self, job): + if job.id in self._jobs_index: + raise ConflictingIdError(job.id) + + timestamp = datetime_to_utc_timestamp(job.next_run_time) + index = self._get_job_index(timestamp, job.id) + self._jobs.insert(index, (job, timestamp)) + self._jobs_index[job.id] = (job, timestamp) + + def update_job(self, job): + old_job, old_timestamp = self._jobs_index.get(job.id, (None, None)) + if old_job is None: + raise JobLookupError(job.id) + + # If the next run time has not changed, simply replace the job in its present index. + # Otherwise, reinsert the job to the list to preserve the ordering. + old_index = self._get_job_index(old_timestamp, old_job.id) + new_timestamp = datetime_to_utc_timestamp(job.next_run_time) + if old_timestamp == new_timestamp: + self._jobs[old_index] = (job, new_timestamp) + else: + del self._jobs[old_index] + new_index = self._get_job_index(new_timestamp, job.id) + self._jobs.insert(new_index, (job, new_timestamp)) + + self._jobs_index[old_job.id] = (job, new_timestamp) + + def remove_job(self, job_id): + job, timestamp = self._jobs_index.get(job_id, (None, None)) + if job is None: + raise JobLookupError(job_id) + + index = self._get_job_index(timestamp, job_id) + del self._jobs[index] + del self._jobs_index[job.id] + + def remove_all_jobs(self): + self._jobs = [] + self._jobs_index = {} + + def shutdown(self): + self.remove_all_jobs() + + def _get_job_index(self, timestamp, job_id): + """ + Returns the index of the given job, or if it's not found, the index where the job should be + inserted based on the given timestamp. + + :type timestamp: int + :type job_id: str + + """ + lo, hi = 0, len(self._jobs) + timestamp = float('inf') if timestamp is None else timestamp + while lo < hi: + mid = (lo + hi) // 2 + mid_job, mid_timestamp = self._jobs[mid] + mid_timestamp = float('inf') if mid_timestamp is None else mid_timestamp + if mid_timestamp > timestamp: + hi = mid + elif mid_timestamp < timestamp: + lo = mid + 1 + elif mid_job.id > job_id: + hi = mid + elif mid_job.id < job_id: + lo = mid + 1 + else: + return mid + + return lo diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py new file mode 100644 index 0000000..5a00f94 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py @@ -0,0 +1,141 @@ +from __future__ import absolute_import +import warnings + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from bson.binary import Binary + from pymongo.errors import DuplicateKeyError + from pymongo import MongoClient, ASCENDING +except ImportError: # pragma: nocover + raise ImportError('MongoDBJobStore requires PyMongo installed') + + +class MongoDBJobStore(BaseJobStore): + """ + Stores jobs in a MongoDB database. Any leftover keyword arguments are directly passed to + pymongo's `MongoClient + <http://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient>`_. + + Plugin alias: ``mongodb`` + + :param str database: database to store jobs in + :param str collection: collection to store jobs in + :param client: a :class:`~pymongo.mongo_client.MongoClient` instance to use instead of + providing connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, database='apscheduler', collection='jobs', client=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(MongoDBJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + + if not database: + raise ValueError('The "database" parameter must not be empty') + if not collection: + raise ValueError('The "collection" parameter must not be empty') + + if client: + self.client = maybe_ref(client) + else: + connect_args.setdefault('w', 1) + self.client = MongoClient(**connect_args) + + self.collection = self.client[database][collection] + + def start(self, scheduler, alias): + super(MongoDBJobStore, self).start(scheduler, alias) + self.collection.create_index('next_run_time', sparse=True) + + @property + def connection(self): + warnings.warn('The "connection" member is deprecated -- use "client" instead', + DeprecationWarning) + return self.client + + def lookup_job(self, job_id): + document = self.collection.find_one(job_id, ['job_state']) + return self._reconstitute_job(document['job_state']) if document else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + return self._get_jobs({'next_run_time': {'$lte': timestamp}}) + + def get_next_run_time(self): + document = self.collection.find_one({'next_run_time': {'$ne': None}}, + projection=['next_run_time'], + sort=[('next_run_time', ASCENDING)]) + return utc_timestamp_to_datetime(document['next_run_time']) if document else None + + def get_all_jobs(self): + jobs = self._get_jobs({}) + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + try: + self.collection.insert_one({ + '_id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + }) + except DuplicateKeyError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + result = self.collection.update_one({'_id': job.id}, {'$set': changes}) + if result and result.matched_count == 0: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + result = self.collection.delete_one({'_id': job_id}) + if result and result.deleted_count == 0: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + self.collection.delete_many({}) + + def shutdown(self): + self.client.close() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, conditions): + jobs = [] + failed_job_ids = [] + for document in self.collection.find(conditions, ['_id', 'job_state'], + sort=[('next_run_time', ASCENDING)]): + try: + jobs.append(self._reconstitute_job(document['job_state'])) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', + document['_id']) + failed_job_ids.append(document['_id']) + + # Remove all the jobs we failed to restore + if failed_job_ids: + self.collection.delete_many({'_id': {'$in': failed_job_ids}}) + + return jobs + + def __repr__(self): + return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/redis.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/redis.py new file mode 100644 index 0000000..5bb69d6 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/redis.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import +from datetime import datetime + +from pytz import utc +import six + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from redis import Redis +except ImportError: # pragma: nocover + raise ImportError('RedisJobStore requires redis installed') + + +class RedisJobStore(BaseJobStore): + """ + Stores jobs in a Redis database. Any leftover keyword arguments are directly passed to redis's + :class:`~redis.StrictRedis`. + + Plugin alias: ``redis`` + + :param int db: the database number to store jobs in + :param str jobs_key: key to store jobs in + :param str run_times_key: key to store the jobs' run times in + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, db=0, jobs_key='apscheduler.jobs', run_times_key='apscheduler.run_times', + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(RedisJobStore, self).__init__() + + if db is None: + raise ValueError('The "db" parameter must not be empty') + if not jobs_key: + raise ValueError('The "jobs_key" parameter must not be empty') + if not run_times_key: + raise ValueError('The "run_times_key" parameter must not be empty') + + self.pickle_protocol = pickle_protocol + self.jobs_key = jobs_key + self.run_times_key = run_times_key + self.redis = Redis(db=int(db), **connect_args) + + def lookup_job(self, job_id): + job_state = self.redis.hget(self.jobs_key, job_id) + return self._reconstitute_job(job_state) if job_state else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + job_ids = self.redis.zrangebyscore(self.run_times_key, 0, timestamp) + if job_ids: + job_states = self.redis.hmget(self.jobs_key, *job_ids) + return self._reconstitute_jobs(six.moves.zip(job_ids, job_states)) + return [] + + def get_next_run_time(self): + next_run_time = self.redis.zrange(self.run_times_key, 0, 0, withscores=True) + if next_run_time: + return utc_timestamp_to_datetime(next_run_time[0][1]) + + def get_all_jobs(self): + job_states = self.redis.hgetall(self.jobs_key) + jobs = self._reconstitute_jobs(six.iteritems(job_states)) + paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) + return sorted(jobs, key=lambda job: job.next_run_time or paused_sort_key) + + def add_job(self, job): + if self.redis.hexists(self.jobs_key, job.id): + raise ConflictingIdError(job.id) + + with self.redis.pipeline() as pipe: + pipe.multi() + pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), + self.pickle_protocol)) + if job.next_run_time: + pipe.zadd(self.run_times_key, + {job.id: datetime_to_utc_timestamp(job.next_run_time)}) + + pipe.execute() + + def update_job(self, job): + if not self.redis.hexists(self.jobs_key, job.id): + raise JobLookupError(job.id) + + with self.redis.pipeline() as pipe: + pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), + self.pickle_protocol)) + if job.next_run_time: + pipe.zadd(self.run_times_key, + {job.id: datetime_to_utc_timestamp(job.next_run_time)}) + else: + pipe.zrem(self.run_times_key, job.id) + + pipe.execute() + + def remove_job(self, job_id): + if not self.redis.hexists(self.jobs_key, job_id): + raise JobLookupError(job_id) + + with self.redis.pipeline() as pipe: + pipe.hdel(self.jobs_key, job_id) + pipe.zrem(self.run_times_key, job_id) + pipe.execute() + + def remove_all_jobs(self): + with self.redis.pipeline() as pipe: + pipe.delete(self.jobs_key) + pipe.delete(self.run_times_key) + pipe.execute() + + def shutdown(self): + self.redis.connection_pool.disconnect() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _reconstitute_jobs(self, job_states): + jobs = [] + failed_job_ids = [] + for job_id, job_state in job_states: + try: + jobs.append(self._reconstitute_job(job_state)) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', job_id) + failed_job_ids.append(job_id) + + # Remove all the jobs we failed to restore + if failed_job_ids: + with self.redis.pipeline() as pipe: + pipe.hdel(self.jobs_key, *failed_job_ids) + pipe.zrem(self.run_times_key, *failed_job_ids) + pipe.execute() + + return jobs + + def __repr__(self): + return '<%s>' % self.__class__.__name__ diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py new file mode 100644 index 0000000..d8a78cd --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from rethinkdb import RethinkDB +except ImportError: # pragma: nocover + raise ImportError('RethinkDBJobStore requires rethinkdb installed') + + +class RethinkDBJobStore(BaseJobStore): + """ + Stores jobs in a RethinkDB database. Any leftover keyword arguments are directly passed to + rethinkdb's `RethinkdbClient <http://www.rethinkdb.com/api/#connect>`_. + + Plugin alias: ``rethinkdb`` + + :param str database: database to store jobs in + :param str collection: collection to store jobs in + :param client: a :class:`rethinkdb.net.Connection` instance to use instead of providing + connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, database='apscheduler', table='jobs', client=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(RethinkDBJobStore, self).__init__() + + if not database: + raise ValueError('The "database" parameter must not be empty') + if not table: + raise ValueError('The "table" parameter must not be empty') + + self.database = database + self.table_name = table + self.table = None + self.client = client + self.pickle_protocol = pickle_protocol + self.connect_args = connect_args + self.r = RethinkDB() + self.conn = None + + def start(self, scheduler, alias): + super(RethinkDBJobStore, self).start(scheduler, alias) + + if self.client: + self.conn = maybe_ref(self.client) + else: + self.conn = self.r.connect(db=self.database, **self.connect_args) + + if self.database not in self.r.db_list().run(self.conn): + self.r.db_create(self.database).run(self.conn) + + if self.table_name not in self.r.table_list().run(self.conn): + self.r.table_create(self.table_name).run(self.conn) + + if 'next_run_time' not in self.r.table(self.table_name).index_list().run(self.conn): + self.r.table(self.table_name).index_create('next_run_time').run(self.conn) + + self.table = self.r.db(self.database).table(self.table_name) + + def lookup_job(self, job_id): + results = list(self.table.get_all(job_id).pluck('job_state').run(self.conn)) + return self._reconstitute_job(results[0]['job_state']) if results else None + + def get_due_jobs(self, now): + return self._get_jobs(self.r.row['next_run_time'] <= datetime_to_utc_timestamp(now)) + + def get_next_run_time(self): + results = list( + self.table + .filter(self.r.row['next_run_time'] != None) # noqa + .order_by(self.r.asc('next_run_time')) + .map(lambda x: x['next_run_time']) + .limit(1) + .run(self.conn) + ) + return utc_timestamp_to_datetime(results[0]) if results else None + + def get_all_jobs(self): + jobs = self._get_jobs() + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + job_dict = { + 'id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + results = self.table.insert(job_dict).run(self.conn) + if results['errors'] > 0: + raise ConflictingIdError(job.id) + + def update_job(self, job): + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + results = self.table.get_all(job.id).update(changes).run(self.conn) + skipped = False in map(lambda x: results[x] == 0, results.keys()) + if results['skipped'] > 0 or results['errors'] > 0 or not skipped: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + results = self.table.get_all(job_id).delete().run(self.conn) + if results['deleted'] + results['skipped'] != 1: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + self.table.delete().run(self.conn) + + def shutdown(self): + self.conn.close() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, predicate=None): + jobs = [] + failed_job_ids = [] + query = (self.table.filter(self.r.row['next_run_time'] != None).filter(predicate) # noqa + if predicate else self.table) + query = query.order_by('next_run_time', 'id').pluck('id', 'job_state') + + for document in query.run(self.conn): + try: + jobs.append(self._reconstitute_job(document['job_state'])) + except Exception: + self._logger.exception('Unable to restore job "%s" -- removing it', document['id']) + failed_job_ids.append(document['id']) + + # Remove all the jobs we failed to restore + if failed_job_ids: + self.r.expr(failed_job_ids).for_each( + lambda job_id: self.table.get_all(job_id).delete()).run(self.conn) + + return jobs + + def __repr__(self): + connection = self.conn + return '<%s (connection=%s)>' % (self.__class__.__name__, connection) diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py new file mode 100644 index 0000000..716549b --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py @@ -0,0 +1,161 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from sqlalchemy import ( + create_engine, Table, Column, MetaData, Unicode, Float, LargeBinary, select, and_) + from sqlalchemy.exc import IntegrityError + from sqlalchemy.sql.expression import null +except ImportError: # pragma: nocover + raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed') + + +class SQLAlchemyJobStore(BaseJobStore): + """ + Stores jobs in a database table using SQLAlchemy. + The table will be created if it doesn't exist in the database. + + Plugin alias: ``sqlalchemy`` + + :param str url: connection string (see + :ref:`SQLAlchemy documentation <sqlalchemy:database_urls>` on this) + :param engine: an SQLAlchemy :class:`~sqlalchemy.engine.Engine` to use instead of creating a + new one based on ``url`` + :param str tablename: name of the table to store jobs in + :param metadata: a :class:`~sqlalchemy.schema.MetaData` instance to use instead of creating a + new one + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + :param str tableschema: name of the (existing) schema in the target database where the table + should be + :param dict engine_options: keyword arguments to :func:`~sqlalchemy.create_engine` + (ignored if ``engine`` is given) + """ + + def __init__(self, url=None, engine=None, tablename='apscheduler_jobs', metadata=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, tableschema=None, engine_options=None): + super(SQLAlchemyJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + metadata = maybe_ref(metadata) or MetaData() + + if engine: + self.engine = maybe_ref(engine) + elif url: + self.engine = create_engine(url, **(engine_options or {})) + else: + raise ValueError('Need either "engine" or "url" defined') + + # 191 = max key length in MySQL for InnoDB/utf8mb4 tables, + # 25 = precision that translates to an 8-byte float + self.jobs_t = Table( + tablename, metadata, + Column('id', Unicode(191), primary_key=True), + Column('next_run_time', Float(25), index=True), + Column('job_state', LargeBinary, nullable=False), + schema=tableschema + ) + + def start(self, scheduler, alias): + super(SQLAlchemyJobStore, self).start(scheduler, alias) + self.jobs_t.create(self.engine, True) + + def lookup_job(self, job_id): + selectable = select(self.jobs_t.c.job_state).where(self.jobs_t.c.id == job_id) + with self.engine.begin() as connection: + job_state = connection.execute(selectable).scalar() + return self._reconstitute_job(job_state) if job_state else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + return self._get_jobs(self.jobs_t.c.next_run_time <= timestamp) + + def get_next_run_time(self): + selectable = select(self.jobs_t.c.next_run_time).\ + where(self.jobs_t.c.next_run_time != null()).\ + order_by(self.jobs_t.c.next_run_time).limit(1) + with self.engine.begin() as connection: + next_run_time = connection.execute(selectable).scalar() + return utc_timestamp_to_datetime(next_run_time) + + def get_all_jobs(self): + jobs = self._get_jobs() + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + insert = self.jobs_t.insert().values(**{ + 'id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) + }) + with self.engine.begin() as connection: + try: + connection.execute(insert) + except IntegrityError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + update = self.jobs_t.update().values(**{ + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) + }).where(self.jobs_t.c.id == job.id) + with self.engine.begin() as connection: + result = connection.execute(update) + if result.rowcount == 0: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + delete = self.jobs_t.delete().where(self.jobs_t.c.id == job_id) + with self.engine.begin() as connection: + result = connection.execute(delete) + if result.rowcount == 0: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + delete = self.jobs_t.delete() + with self.engine.begin() as connection: + connection.execute(delete) + + def shutdown(self): + self.engine.dispose() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job_state['jobstore'] = self + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, *conditions): + jobs = [] + selectable = select(self.jobs_t.c.id, self.jobs_t.c.job_state).\ + order_by(self.jobs_t.c.next_run_time) + selectable = selectable.where(and_(*conditions)) if conditions else selectable + failed_job_ids = set() + with self.engine.begin() as connection: + for row in connection.execute(selectable): + try: + jobs.append(self._reconstitute_job(row.job_state)) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', row.id) + failed_job_ids.add(row.id) + + # Remove all the jobs we failed to restore + if failed_job_ids: + delete = self.jobs_t.delete().where(self.jobs_t.c.id.in_(failed_job_ids)) + connection.execute(delete) + + return jobs + + def __repr__(self): + return '<%s (url=%s)>' % (self.__class__.__name__, self.engine.url) diff --git a/python/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py b/python/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py new file mode 100644 index 0000000..5253069 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import + +from datetime import datetime + +from pytz import utc +from kazoo.exceptions import NoNodeError, NodeExistsError + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from kazoo.client import KazooClient +except ImportError: # pragma: nocover + raise ImportError('ZooKeeperJobStore requires Kazoo installed') + + +class ZooKeeperJobStore(BaseJobStore): + """ + Stores jobs in a ZooKeeper tree. Any leftover keyword arguments are directly passed to + kazoo's `KazooClient + <http://kazoo.readthedocs.io/en/latest/api/client.html>`_. + + Plugin alias: ``zookeeper`` + + :param str path: path to store jobs in + :param client: a :class:`~kazoo.client.KazooClient` instance to use instead of + providing connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, path='/apscheduler', client=None, close_connection_on_exit=False, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(ZooKeeperJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + self.close_connection_on_exit = close_connection_on_exit + + if not path: + raise ValueError('The "path" parameter must not be empty') + + self.path = path + + if client: + self.client = maybe_ref(client) + else: + self.client = KazooClient(**connect_args) + self._ensured_path = False + + def _ensure_paths(self): + if not self._ensured_path: + self.client.ensure_path(self.path) + self._ensured_path = True + + def start(self, scheduler, alias): + super(ZooKeeperJobStore, self).start(scheduler, alias) + if not self.client.connected: + self.client.start() + + def lookup_job(self, job_id): + self._ensure_paths() + node_path = self.path + "/" + str(job_id) + try: + content, _ = self.client.get(node_path) + doc = pickle.loads(content) + job = self._reconstitute_job(doc['job_state']) + return job + except BaseException: + return None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + jobs = [job_def['job'] for job_def in self._get_jobs() + if job_def['next_run_time'] is not None and job_def['next_run_time'] <= timestamp] + return jobs + + def get_next_run_time(self): + next_runs = [job_def['next_run_time'] for job_def in self._get_jobs() + if job_def['next_run_time'] is not None] + return utc_timestamp_to_datetime(min(next_runs)) if len(next_runs) > 0 else None + + def get_all_jobs(self): + jobs = [job_def['job'] for job_def in self._get_jobs()] + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + self._ensure_paths() + node_path = self.path + "/" + str(job.id) + value = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': job.__getstate__() + } + data = pickle.dumps(value, self.pickle_protocol) + try: + self.client.create(node_path, value=data) + except NodeExistsError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + self._ensure_paths() + node_path = self.path + "/" + str(job.id) + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': job.__getstate__() + } + data = pickle.dumps(changes, self.pickle_protocol) + try: + self.client.set(node_path, value=data) + except NoNodeError: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + self._ensure_paths() + node_path = self.path + "/" + str(job_id) + try: + self.client.delete(node_path) + except NoNodeError: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + try: + self.client.delete(self.path, recursive=True) + except NoNodeError: + pass + self._ensured_path = False + + def shutdown(self): + if self.close_connection_on_exit: + self.client.stop() + self.client.close() + + def _reconstitute_job(self, job_state): + job_state = job_state + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self): + self._ensure_paths() + jobs = [] + failed_job_ids = [] + all_ids = self.client.get_children(self.path) + for node_name in all_ids: + try: + node_path = self.path + "/" + node_name + content, _ = self.client.get(node_path) + doc = pickle.loads(content) + job_def = { + 'job_id': node_name, + 'next_run_time': doc['next_run_time'] if doc['next_run_time'] else None, + 'job_state': doc['job_state'], + 'job': self._reconstitute_job(doc['job_state']), + 'creation_time': _.ctime + } + jobs.append(job_def) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it' % node_name) + failed_job_ids.append(node_name) + + # Remove all the jobs we failed to restore + if failed_job_ids: + for failed_id in failed_job_ids: + self.remove_job(failed_id) + paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) + return sorted(jobs, key=lambda job_def: (job_def['job'].next_run_time or paused_sort_key, + job_def['creation_time'])) + + def __repr__(self): + self._logger.exception('<%s (client=%s)>' % (self.__class__.__name__, self.client)) + return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py new file mode 100644 index 0000000..bd8a790 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py @@ -0,0 +1,12 @@ +class SchedulerAlreadyRunningError(Exception): + """Raised when attempting to start or configure the scheduler when it's already running.""" + + def __str__(self): + return 'Scheduler is already running' + + +class SchedulerNotRunningError(Exception): + """Raised when attempting to shutdown the scheduler when it's not running.""" + + def __str__(self): + return 'Scheduler is not running' diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py new file mode 100644 index 0000000..8bcdfda --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py @@ -0,0 +1,66 @@ +from __future__ import absolute_import +import asyncio +from functools import wraps, partial + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + + +def run_in_event_loop(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + wrapped = partial(func, self, *args, **kwargs) + self._eventloop.call_soon_threadsafe(wrapped) + return wrapper + + +class AsyncIOScheduler(BaseScheduler): + """ + A scheduler that runs on an asyncio (:pep:`3156`) event loop. + + The default executor can run jobs based on native coroutines (``async def``). + + Extra options: + + ============== ============================================================= + ``event_loop`` AsyncIO event loop to use (defaults to the global event loop) + ============== ============================================================= + """ + + _eventloop = None + _timeout = None + + def start(self, paused=False): + if not self._eventloop: + self._eventloop = asyncio.get_event_loop() + + super(AsyncIOScheduler, self).start(paused) + + @run_in_event_loop + def shutdown(self, wait=True): + super(AsyncIOScheduler, self).shutdown(wait) + self._stop_timer() + + def _configure(self, config): + self._eventloop = maybe_ref(config.pop('event_loop', None)) + super(AsyncIOScheduler, self)._configure(config) + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._timeout = self._eventloop.call_later(wait_seconds, self.wakeup) + + def _stop_timer(self): + if self._timeout: + self._timeout.cancel() + del self._timeout + + @run_in_event_loop + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) + + def _create_default_executor(self): + from apscheduler.executors.asyncio import AsyncIOExecutor + return AsyncIOExecutor() diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/background.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/background.py new file mode 100644 index 0000000..bb8f77d --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/background.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import + +from threading import Thread, Event + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.schedulers.blocking import BlockingScheduler +from apscheduler.util import asbool + + +class BackgroundScheduler(BlockingScheduler): + """ + A scheduler that runs in the background using a separate thread + (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will return immediately). + + Extra options: + + ========== ============================================================================= + ``daemon`` Set the ``daemon`` option in the background thread (defaults to ``True``, see + `the documentation + <https://docs.python.org/3.4/library/threading.html#thread-objects>`_ + for further details) + ========== ============================================================================= + """ + + _thread = None + + def _configure(self, config): + self._daemon = asbool(config.pop('daemon', True)) + super(BackgroundScheduler, self)._configure(config) + + def start(self, *args, **kwargs): + if self._event is None or self._event.is_set(): + self._event = Event() + + BaseScheduler.start(self, *args, **kwargs) + self._thread = Thread(target=self._main_loop, name='APScheduler') + self._thread.daemon = self._daemon + self._thread.start() + + def shutdown(self, *args, **kwargs): + super(BackgroundScheduler, self).shutdown(*args, **kwargs) + self._thread.join() + del self._thread diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/base.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/base.py new file mode 100644 index 0000000..444de8e --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/base.py @@ -0,0 +1,1026 @@ +from __future__ import print_function + +from abc import ABCMeta, abstractmethod +from threading import RLock +from datetime import datetime, timedelta +from logging import getLogger +import warnings +import sys + +from pkg_resources import iter_entry_points +from tzlocal import get_localzone +import six + +from apscheduler.schedulers import SchedulerAlreadyRunningError, SchedulerNotRunningError +from apscheduler.executors.base import MaxInstancesReachedError, BaseExecutor +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.jobstores.base import ConflictingIdError, JobLookupError, BaseJobStore +from apscheduler.jobstores.memory import MemoryJobStore +from apscheduler.job import Job +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + asbool, asint, astimezone, maybe_ref, timedelta_seconds, undefined, TIMEOUT_MAX) +from apscheduler.events import ( + SchedulerEvent, JobEvent, JobSubmissionEvent, EVENT_SCHEDULER_START, EVENT_SCHEDULER_SHUTDOWN, + EVENT_JOBSTORE_ADDED, EVENT_JOBSTORE_REMOVED, EVENT_ALL, EVENT_JOB_MODIFIED, EVENT_JOB_REMOVED, + EVENT_JOB_ADDED, EVENT_EXECUTOR_ADDED, EVENT_EXECUTOR_REMOVED, EVENT_ALL_JOBS_REMOVED, + EVENT_JOB_SUBMITTED, EVENT_JOB_MAX_INSTANCES, EVENT_SCHEDULER_RESUMED, EVENT_SCHEDULER_PAUSED) + +try: + from collections.abc import MutableMapping +except ImportError: + from collections import MutableMapping + +#: constant indicating a scheduler's stopped state +STATE_STOPPED = 0 +#: constant indicating a scheduler's running state (started and processing jobs) +STATE_RUNNING = 1 +#: constant indicating a scheduler's paused state (started but not processing jobs) +STATE_PAUSED = 2 + + +class BaseScheduler(six.with_metaclass(ABCMeta)): + """ + Abstract base class for all schedulers. + + Takes the following keyword arguments: + + :param str|logging.Logger logger: logger to use for the scheduler's logging (defaults to + apscheduler.scheduler) + :param str|datetime.tzinfo timezone: the default time zone (defaults to the local timezone) + :param int|float jobstore_retry_interval: the minimum number of seconds to wait between + retries in the scheduler's main loop if the job store raises an exception when getting + the list of due jobs + :param dict job_defaults: default values for newly added jobs + :param dict jobstores: a dictionary of job store alias -> job store instance or configuration + dict + :param dict executors: a dictionary of executor alias -> executor instance or configuration + dict + + :ivar int state: current running state of the scheduler (one of the following constants from + ``apscheduler.schedulers.base``: ``STATE_STOPPED``, ``STATE_RUNNING``, ``STATE_PAUSED``) + + .. seealso:: :ref:`scheduler-config` + """ + + _trigger_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.triggers')) + _trigger_classes = {} + _executor_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.executors')) + _executor_classes = {} + _jobstore_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.jobstores')) + _jobstore_classes = {} + + # + # Public API + # + + def __init__(self, gconfig={}, **options): + super(BaseScheduler, self).__init__() + self._executors = {} + self._executors_lock = self._create_lock() + self._jobstores = {} + self._jobstores_lock = self._create_lock() + self._listeners = [] + self._listeners_lock = self._create_lock() + self._pending_jobs = [] + self.state = STATE_STOPPED + self.configure(gconfig, **options) + + def __getstate__(self): + raise TypeError("Schedulers cannot be serialized. Ensure that you are not passing a " + "scheduler instance as an argument to a job, or scheduling an instance " + "method where the instance contains a scheduler as an attribute.") + + def configure(self, gconfig={}, prefix='apscheduler.', **options): + """ + Reconfigures the scheduler with the given options. + + Can only be done when the scheduler isn't running. + + :param dict gconfig: a "global" configuration dictionary whose values can be overridden by + keyword arguments to this method + :param str|unicode prefix: pick only those keys from ``gconfig`` that are prefixed with + this string (pass an empty string or ``None`` to use all keys) + :raises SchedulerAlreadyRunningError: if the scheduler is already running + + """ + if self.state != STATE_STOPPED: + raise SchedulerAlreadyRunningError + + # If a non-empty prefix was given, strip it from the keys in the + # global configuration dict + if prefix: + prefixlen = len(prefix) + gconfig = dict((key[prefixlen:], value) for key, value in six.iteritems(gconfig) + if key.startswith(prefix)) + + # Create a structure from the dotted options + # (e.g. "a.b.c = d" -> {'a': {'b': {'c': 'd'}}}) + config = {} + for key, value in six.iteritems(gconfig): + parts = key.split('.') + parent = config + key = parts.pop(0) + while parts: + parent = parent.setdefault(key, {}) + key = parts.pop(0) + parent[key] = value + + # Override any options with explicit keyword arguments + config.update(options) + self._configure(config) + + def start(self, paused=False): + """ + Start the configured executors and job stores and begin processing scheduled jobs. + + :param bool paused: if ``True``, don't start job processing until :meth:`resume` is called + :raises SchedulerAlreadyRunningError: if the scheduler is already running + :raises RuntimeError: if running under uWSGI with threads disabled + + """ + if self.state != STATE_STOPPED: + raise SchedulerAlreadyRunningError + + self._check_uwsgi() + + with self._executors_lock: + # Create a default executor if nothing else is configured + if 'default' not in self._executors: + self.add_executor(self._create_default_executor(), 'default') + + # Start all the executors + for alias, executor in six.iteritems(self._executors): + executor.start(self, alias) + + with self._jobstores_lock: + # Create a default job store if nothing else is configured + if 'default' not in self._jobstores: + self.add_jobstore(self._create_default_jobstore(), 'default') + + # Start all the job stores + for alias, store in six.iteritems(self._jobstores): + store.start(self, alias) + + # Schedule all pending jobs + for job, jobstore_alias, replace_existing in self._pending_jobs: + self._real_add_job(job, jobstore_alias, replace_existing) + del self._pending_jobs[:] + + self.state = STATE_PAUSED if paused else STATE_RUNNING + self._logger.info('Scheduler started') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_START)) + + if not paused: + self.wakeup() + + @abstractmethod + def shutdown(self, wait=True): + """ + Shuts down the scheduler, along with its executors and job stores. + + Does not interrupt any currently running jobs. + + :param bool wait: ``True`` to wait until all currently executing jobs have finished + :raises SchedulerNotRunningError: if the scheduler has not been started yet + + """ + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + + self.state = STATE_STOPPED + + # Shut down all executors + with self._executors_lock, self._jobstores_lock: + for executor in six.itervalues(self._executors): + executor.shutdown(wait) + + # Shut down all job stores + for jobstore in six.itervalues(self._jobstores): + jobstore.shutdown() + + self._logger.info('Scheduler has been shut down') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_SHUTDOWN)) + + def pause(self): + """ + Pause job processing in the scheduler. + + This will prevent the scheduler from waking up to do job processing until :meth:`resume` + is called. It will not however stop any already running job processing. + + """ + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + elif self.state == STATE_RUNNING: + self.state = STATE_PAUSED + self._logger.info('Paused scheduler job processing') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_PAUSED)) + + def resume(self): + """Resume job processing in the scheduler.""" + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + elif self.state == STATE_PAUSED: + self.state = STATE_RUNNING + self._logger.info('Resumed scheduler job processing') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_RESUMED)) + self.wakeup() + + @property + def running(self): + """ + Return ``True`` if the scheduler has been started. + + This is a shortcut for ``scheduler.state != STATE_STOPPED``. + + """ + return self.state != STATE_STOPPED + + def add_executor(self, executor, alias='default', **executor_opts): + """ + Adds an executor to this scheduler. + + Any extra keyword arguments will be passed to the executor plugin's constructor, assuming + that the first argument is the name of an executor plugin. + + :param str|unicode|apscheduler.executors.base.BaseExecutor executor: either an executor + instance or the name of an executor plugin + :param str|unicode alias: alias for the scheduler + :raises ValueError: if there is already an executor by the given alias + + """ + with self._executors_lock: + if alias in self._executors: + raise ValueError('This scheduler already has an executor by the alias of "%s"' % + alias) + + if isinstance(executor, BaseExecutor): + self._executors[alias] = executor + elif isinstance(executor, six.string_types): + self._executors[alias] = executor = self._create_plugin_instance( + 'executor', executor, executor_opts) + else: + raise TypeError('Expected an executor instance or a string, got %s instead' % + executor.__class__.__name__) + + # Start the executor right away if the scheduler is running + if self.state != STATE_STOPPED: + executor.start(self, alias) + + self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_ADDED, alias)) + + def remove_executor(self, alias, shutdown=True): + """ + Removes the executor by the given alias from this scheduler. + + :param str|unicode alias: alias of the executor + :param bool shutdown: ``True`` to shut down the executor after + removing it + + """ + with self._executors_lock: + executor = self._lookup_executor(alias) + del self._executors[alias] + + if shutdown: + executor.shutdown() + + self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_REMOVED, alias)) + + def add_jobstore(self, jobstore, alias='default', **jobstore_opts): + """ + Adds a job store to this scheduler. + + Any extra keyword arguments will be passed to the job store plugin's constructor, assuming + that the first argument is the name of a job store plugin. + + :param str|unicode|apscheduler.jobstores.base.BaseJobStore jobstore: job store to be added + :param str|unicode alias: alias for the job store + :raises ValueError: if there is already a job store by the given alias + + """ + with self._jobstores_lock: + if alias in self._jobstores: + raise ValueError('This scheduler already has a job store by the alias of "%s"' % + alias) + + if isinstance(jobstore, BaseJobStore): + self._jobstores[alias] = jobstore + elif isinstance(jobstore, six.string_types): + self._jobstores[alias] = jobstore = self._create_plugin_instance( + 'jobstore', jobstore, jobstore_opts) + else: + raise TypeError('Expected a job store instance or a string, got %s instead' % + jobstore.__class__.__name__) + + # Start the job store right away if the scheduler isn't stopped + if self.state != STATE_STOPPED: + jobstore.start(self, alias) + + # Notify listeners that a new job store has been added + self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_ADDED, alias)) + + # Notify the scheduler so it can scan the new job store for jobs + if self.state != STATE_STOPPED: + self.wakeup() + + def remove_jobstore(self, alias, shutdown=True): + """ + Removes the job store by the given alias from this scheduler. + + :param str|unicode alias: alias of the job store + :param bool shutdown: ``True`` to shut down the job store after removing it + + """ + with self._jobstores_lock: + jobstore = self._lookup_jobstore(alias) + del self._jobstores[alias] + + if shutdown: + jobstore.shutdown() + + self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_REMOVED, alias)) + + def add_listener(self, callback, mask=EVENT_ALL): + """ + add_listener(callback, mask=EVENT_ALL) + + Adds a listener for scheduler events. + + When a matching event occurs, ``callback`` is executed with the event object as its + sole argument. If the ``mask`` parameter is not provided, the callback will receive events + of all types. + + :param callback: any callable that takes one argument + :param int mask: bitmask that indicates which events should be + listened to + + .. seealso:: :mod:`apscheduler.events` + .. seealso:: :ref:`scheduler-events` + + """ + with self._listeners_lock: + self._listeners.append((callback, mask)) + + def remove_listener(self, callback): + """Removes a previously added event listener.""" + + with self._listeners_lock: + for i, (cb, _) in enumerate(self._listeners): + if callback == cb: + del self._listeners[i] + + def add_job(self, func, trigger=None, args=None, kwargs=None, id=None, name=None, + misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, + next_run_time=undefined, jobstore='default', executor='default', + replace_existing=False, **trigger_args): + """ + add_job(func, trigger=None, args=None, kwargs=None, id=None, \ + name=None, misfire_grace_time=undefined, coalesce=undefined, \ + max_instances=undefined, next_run_time=undefined, \ + jobstore='default', executor='default', \ + replace_existing=False, **trigger_args) + + Adds the given job to the job list and wakes up the scheduler if it's already running. + + Any option that defaults to ``undefined`` will be replaced with the corresponding default + value when the job is scheduled (which happens when the scheduler is started, or + immediately if the scheduler is already running). + + The ``func`` argument can be given either as a callable object or a textual reference in + the ``package.module:some.object`` format, where the first half (separated by ``:``) is an + importable module and the second half is a reference to the callable object, relative to + the module. + + The ``trigger`` argument can either be: + #. the alias name of the trigger (e.g. ``date``, ``interval`` or ``cron``), in which case + any extra keyword arguments to this method are passed on to the trigger's constructor + #. an instance of a trigger class + + :param func: callable (or a textual reference to one) to run at the given time + :param str|apscheduler.triggers.base.BaseTrigger trigger: trigger that determines when + ``func`` is called + :param list|tuple args: list of positional arguments to call func with + :param dict kwargs: dict of keyword arguments to call func with + :param str|unicode id: explicit identifier for the job (for modifying it later) + :param str|unicode name: textual description of the job + :param int misfire_grace_time: seconds after the designated runtime that the job is still + allowed to be run (or ``None`` to allow the job to run no matter how late it is) + :param bool coalesce: run once instead of many times if the scheduler determines that the + job should be run more than once in succession + :param int max_instances: maximum number of concurrently running instances allowed for this + job + :param datetime next_run_time: when to first run the job, regardless of the trigger (pass + ``None`` to add the job as paused) + :param str|unicode jobstore: alias of the job store to store the job in + :param str|unicode executor: alias of the executor to run the job with + :param bool replace_existing: ``True`` to replace an existing job with the same ``id`` + (but retain the number of runs from the existing one) + :rtype: Job + + """ + job_kwargs = { + 'trigger': self._create_trigger(trigger, trigger_args), + 'executor': executor, + 'func': func, + 'args': tuple(args) if args is not None else (), + 'kwargs': dict(kwargs) if kwargs is not None else {}, + 'id': id, + 'name': name, + 'misfire_grace_time': misfire_grace_time, + 'coalesce': coalesce, + 'max_instances': max_instances, + 'next_run_time': next_run_time + } + job_kwargs = dict((key, value) for key, value in six.iteritems(job_kwargs) if + value is not undefined) + job = Job(self, **job_kwargs) + + # Don't really add jobs to job stores before the scheduler is up and running + with self._jobstores_lock: + if self.state == STATE_STOPPED: + self._pending_jobs.append((job, jobstore, replace_existing)) + self._logger.info('Adding job tentatively -- it will be properly scheduled when ' + 'the scheduler starts') + else: + self._real_add_job(job, jobstore, replace_existing) + + return job + + def scheduled_job(self, trigger, args=None, kwargs=None, id=None, name=None, + misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, + next_run_time=undefined, jobstore='default', executor='default', + **trigger_args): + """ + scheduled_job(trigger, args=None, kwargs=None, id=None, \ + name=None, misfire_grace_time=undefined, \ + coalesce=undefined, max_instances=undefined, \ + next_run_time=undefined, jobstore='default', \ + executor='default',**trigger_args) + + A decorator version of :meth:`add_job`, except that ``replace_existing`` is always + ``True``. + + .. important:: The ``id`` argument must be given if scheduling a job in a persistent job + store. The scheduler cannot, however, enforce this requirement. + + """ + def inner(func): + self.add_job(func, trigger, args, kwargs, id, name, misfire_grace_time, coalesce, + max_instances, next_run_time, jobstore, executor, True, **trigger_args) + return func + return inner + + def modify_job(self, job_id, jobstore=None, **changes): + """ + Modifies the properties of a single job. + + Modifications are passed to this method as extra keyword arguments. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job: the relevant job instance + + """ + with self._jobstores_lock: + job, jobstore = self._lookup_job(job_id, jobstore) + job._modify(**changes) + if jobstore: + self._lookup_jobstore(jobstore).update_job(job) + + self._dispatch_event(JobEvent(EVENT_JOB_MODIFIED, job_id, jobstore)) + + # Wake up the scheduler since the job's next run time may have been changed + if self.state == STATE_RUNNING: + self.wakeup() + + return job + + def reschedule_job(self, job_id, jobstore=None, trigger=None, **trigger_args): + """ + Constructs a new trigger for a job and updates its next run time. + + Extra keyword arguments are passed directly to the trigger's constructor. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :param trigger: alias of the trigger type or a trigger instance + :return Job: the relevant job instance + + """ + trigger = self._create_trigger(trigger, trigger_args) + now = datetime.now(self.timezone) + next_run_time = trigger.get_next_fire_time(None, now) + return self.modify_job(job_id, jobstore, trigger=trigger, next_run_time=next_run_time) + + def pause_job(self, job_id, jobstore=None): + """ + Causes the given job not to be executed until it is explicitly resumed. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job: the relevant job instance + + """ + return self.modify_job(job_id, jobstore, next_run_time=None) + + def resume_job(self, job_id, jobstore=None): + """ + Resumes the schedule of the given job, or removes the job if its schedule is finished. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job|None: the relevant job instance if the job was rescheduled, or ``None`` if no + next run time could be calculated and the job was removed + + """ + with self._jobstores_lock: + job, jobstore = self._lookup_job(job_id, jobstore) + now = datetime.now(self.timezone) + next_run_time = job.trigger.get_next_fire_time(None, now) + if next_run_time: + return self.modify_job(job_id, jobstore, next_run_time=next_run_time) + else: + self.remove_job(job.id, jobstore) + + def get_jobs(self, jobstore=None, pending=None): + """ + Returns a list of pending jobs (if the scheduler hasn't been started yet) and scheduled + jobs, either from a specific job store or from all of them. + + If the scheduler has not been started yet, only pending jobs can be returned because the + job stores haven't been started yet either. + + :param str|unicode jobstore: alias of the job store + :param bool pending: **DEPRECATED** + :rtype: list[Job] + + """ + if pending is not None: + warnings.warn('The "pending" option is deprecated -- get_jobs() always returns ' + 'scheduled jobs if the scheduler has been started and pending jobs ' + 'otherwise', DeprecationWarning) + + with self._jobstores_lock: + jobs = [] + if self.state == STATE_STOPPED: + for job, alias, replace_existing in self._pending_jobs: + if jobstore is None or alias == jobstore: + jobs.append(job) + else: + for alias, store in six.iteritems(self._jobstores): + if jobstore is None or alias == jobstore: + jobs.extend(store.get_all_jobs()) + + return jobs + + def get_job(self, job_id, jobstore=None): + """ + Returns the Job that matches the given ``job_id``. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that most likely contains the job + :return: the Job by the given ID, or ``None`` if it wasn't found + :rtype: Job + + """ + with self._jobstores_lock: + try: + return self._lookup_job(job_id, jobstore)[0] + except JobLookupError: + return + + def remove_job(self, job_id, jobstore=None): + """ + Removes a job, preventing it from being run any more. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :raises JobLookupError: if the job was not found + + """ + jobstore_alias = None + with self._jobstores_lock: + # Check if the job is among the pending jobs + if self.state == STATE_STOPPED: + for i, (job, alias, replace_existing) in enumerate(self._pending_jobs): + if job.id == job_id and jobstore in (None, alias): + del self._pending_jobs[i] + jobstore_alias = alias + break + else: + # Otherwise, try to remove it from each store until it succeeds or we run out of + # stores to check + for alias, store in six.iteritems(self._jobstores): + if jobstore in (None, alias): + try: + store.remove_job(job_id) + jobstore_alias = alias + break + except JobLookupError: + continue + + if jobstore_alias is None: + raise JobLookupError(job_id) + + # Notify listeners that a job has been removed + event = JobEvent(EVENT_JOB_REMOVED, job_id, jobstore_alias) + self._dispatch_event(event) + + self._logger.info('Removed job %s', job_id) + + def remove_all_jobs(self, jobstore=None): + """ + Removes all jobs from the specified job store, or all job stores if none is given. + + :param str|unicode jobstore: alias of the job store + + """ + with self._jobstores_lock: + if self.state == STATE_STOPPED: + if jobstore: + self._pending_jobs = [pending for pending in self._pending_jobs if + pending[1] != jobstore] + else: + self._pending_jobs = [] + else: + for alias, store in six.iteritems(self._jobstores): + if jobstore in (None, alias): + store.remove_all_jobs() + + self._dispatch_event(SchedulerEvent(EVENT_ALL_JOBS_REMOVED, jobstore)) + + def print_jobs(self, jobstore=None, out=None): + """ + print_jobs(jobstore=None, out=sys.stdout) + + Prints out a textual listing of all jobs currently scheduled on either all job stores or + just a specific one. + + :param str|unicode jobstore: alias of the job store, ``None`` to list jobs from all stores + :param file out: a file-like object to print to (defaults to **sys.stdout** if nothing is + given) + + """ + out = out or sys.stdout + with self._jobstores_lock: + if self.state == STATE_STOPPED: + print(u'Pending jobs:', file=out) + if self._pending_jobs: + for job, jobstore_alias, replace_existing in self._pending_jobs: + if jobstore in (None, jobstore_alias): + print(u' %s' % job, file=out) + else: + print(u' No pending jobs', file=out) + else: + for alias, store in sorted(six.iteritems(self._jobstores)): + if jobstore in (None, alias): + print(u'Jobstore %s:' % alias, file=out) + jobs = store.get_all_jobs() + if jobs: + for job in jobs: + print(u' %s' % job, file=out) + else: + print(u' No scheduled jobs', file=out) + + @abstractmethod + def wakeup(self): + """ + Notifies the scheduler that there may be jobs due for execution. + Triggers :meth:`_process_jobs` to be run in an implementation specific manner. + """ + + # + # Private API + # + + def _configure(self, config): + # Set general options + self._logger = maybe_ref(config.pop('logger', None)) or getLogger('apscheduler.scheduler') + self.timezone = astimezone(config.pop('timezone', None)) or get_localzone() + self.jobstore_retry_interval = float(config.pop('jobstore_retry_interval', 10)) + + # Set the job defaults + job_defaults = config.get('job_defaults', {}) + self._job_defaults = { + 'misfire_grace_time': asint(job_defaults.get('misfire_grace_time', 1)), + 'coalesce': asbool(job_defaults.get('coalesce', True)), + 'max_instances': asint(job_defaults.get('max_instances', 1)) + } + + # Configure executors + self._executors.clear() + for alias, value in six.iteritems(config.get('executors', {})): + if isinstance(value, BaseExecutor): + self.add_executor(value, alias) + elif isinstance(value, MutableMapping): + executor_class = value.pop('class', None) + plugin = value.pop('type', None) + if plugin: + executor = self._create_plugin_instance('executor', plugin, value) + elif executor_class: + cls = maybe_ref(executor_class) + executor = cls(**value) + else: + raise ValueError( + 'Cannot create executor "%s" -- either "type" or "class" must be defined' % + alias) + + self.add_executor(executor, alias) + else: + raise TypeError( + "Expected executor instance or dict for executors['%s'], got %s instead" % + (alias, value.__class__.__name__)) + + # Configure job stores + self._jobstores.clear() + for alias, value in six.iteritems(config.get('jobstores', {})): + if isinstance(value, BaseJobStore): + self.add_jobstore(value, alias) + elif isinstance(value, MutableMapping): + jobstore_class = value.pop('class', None) + plugin = value.pop('type', None) + if plugin: + jobstore = self._create_plugin_instance('jobstore', plugin, value) + elif jobstore_class: + cls = maybe_ref(jobstore_class) + jobstore = cls(**value) + else: + raise ValueError( + 'Cannot create job store "%s" -- either "type" or "class" must be ' + 'defined' % alias) + + self.add_jobstore(jobstore, alias) + else: + raise TypeError( + "Expected job store instance or dict for jobstores['%s'], got %s instead" % + (alias, value.__class__.__name__)) + + def _create_default_executor(self): + """Creates a default executor store, specific to the particular scheduler type.""" + return ThreadPoolExecutor() + + def _create_default_jobstore(self): + """Creates a default job store, specific to the particular scheduler type.""" + return MemoryJobStore() + + def _lookup_executor(self, alias): + """ + Returns the executor instance by the given name from the list of executors that were added + to this scheduler. + + :type alias: str + :raises KeyError: if no executor by the given alias is not found + + """ + try: + return self._executors[alias] + except KeyError: + raise KeyError('No such executor: %s' % alias) + + def _lookup_jobstore(self, alias): + """ + Returns the job store instance by the given name from the list of job stores that were + added to this scheduler. + + :type alias: str + :raises KeyError: if no job store by the given alias is not found + + """ + try: + return self._jobstores[alias] + except KeyError: + raise KeyError('No such job store: %s' % alias) + + def _lookup_job(self, job_id, jobstore_alias): + """ + Finds a job by its ID. + + :type job_id: str + :param str jobstore_alias: alias of a job store to look in + :return tuple[Job, str]: a tuple of job, jobstore alias (jobstore alias is None in case of + a pending job) + :raises JobLookupError: if no job by the given ID is found. + + """ + if self.state == STATE_STOPPED: + # Check if the job is among the pending jobs + for job, alias, replace_existing in self._pending_jobs: + if job.id == job_id: + return job, None + else: + # Look in all job stores + for alias, store in six.iteritems(self._jobstores): + if jobstore_alias in (None, alias): + job = store.lookup_job(job_id) + if job is not None: + return job, alias + + raise JobLookupError(job_id) + + def _dispatch_event(self, event): + """ + Dispatches the given event to interested listeners. + + :param SchedulerEvent event: the event to send + + """ + with self._listeners_lock: + listeners = tuple(self._listeners) + + for cb, mask in listeners: + if event.code & mask: + try: + cb(event) + except BaseException: + self._logger.exception('Error notifying listener') + + def _check_uwsgi(self): + """Check if we're running under uWSGI with threads disabled.""" + uwsgi_module = sys.modules.get('uwsgi') + if not getattr(uwsgi_module, 'has_threads', True): + raise RuntimeError('The scheduler seems to be running under uWSGI, but threads have ' + 'been disabled. You must run uWSGI with the --enable-threads ' + 'option for the scheduler to work.') + + def _real_add_job(self, job, jobstore_alias, replace_existing): + """ + :param Job job: the job to add + :param bool replace_existing: ``True`` to use update_job() in case the job already exists + in the store + + """ + # Fill in undefined values with defaults + replacements = {} + for key, value in six.iteritems(self._job_defaults): + if not hasattr(job, key): + replacements[key] = value + + # Calculate the next run time if there is none defined + if not hasattr(job, 'next_run_time'): + now = datetime.now(self.timezone) + replacements['next_run_time'] = job.trigger.get_next_fire_time(None, now) + + # Apply any replacements + job._modify(**replacements) + + # Add the job to the given job store + store = self._lookup_jobstore(jobstore_alias) + try: + store.add_job(job) + except ConflictingIdError: + if replace_existing: + store.update_job(job) + else: + raise + + # Mark the job as no longer pending + job._jobstore_alias = jobstore_alias + + # Notify listeners that a new job has been added + event = JobEvent(EVENT_JOB_ADDED, job.id, jobstore_alias) + self._dispatch_event(event) + + self._logger.info('Added job "%s" to job store "%s"', job.name, jobstore_alias) + + # Notify the scheduler about the new job + if self.state == STATE_RUNNING: + self.wakeup() + + def _create_plugin_instance(self, type_, alias, constructor_kwargs): + """Creates an instance of the given plugin type, loading the plugin first if necessary.""" + plugin_container, class_container, base_class = { + 'trigger': (self._trigger_plugins, self._trigger_classes, BaseTrigger), + 'jobstore': (self._jobstore_plugins, self._jobstore_classes, BaseJobStore), + 'executor': (self._executor_plugins, self._executor_classes, BaseExecutor) + }[type_] + + try: + plugin_cls = class_container[alias] + except KeyError: + if alias in plugin_container: + plugin_cls = class_container[alias] = plugin_container[alias].load() + if not issubclass(plugin_cls, base_class): + raise TypeError('The {0} entry point does not point to a {0} class'. + format(type_)) + else: + raise LookupError('No {0} by the name "{1}" was found'.format(type_, alias)) + + return plugin_cls(**constructor_kwargs) + + def _create_trigger(self, trigger, trigger_args): + if isinstance(trigger, BaseTrigger): + return trigger + elif trigger is None: + trigger = 'date' + elif not isinstance(trigger, six.string_types): + raise TypeError('Expected a trigger instance or string, got %s instead' % + trigger.__class__.__name__) + + # Use the scheduler's time zone if nothing else is specified + trigger_args.setdefault('timezone', self.timezone) + + # Instantiate the trigger class + return self._create_plugin_instance('trigger', trigger, trigger_args) + + def _create_lock(self): + """Creates a reentrant lock object.""" + return RLock() + + def _process_jobs(self): + """ + Iterates through jobs in every jobstore, starts jobs that are due and figures out how long + to wait for the next round. + + If the ``get_due_jobs()`` call raises an exception, a new wakeup is scheduled in at least + ``jobstore_retry_interval`` seconds. + + """ + if self.state == STATE_PAUSED: + self._logger.debug('Scheduler is paused -- not processing jobs') + return None + + self._logger.debug('Looking for jobs to run') + now = datetime.now(self.timezone) + next_wakeup_time = None + events = [] + + with self._jobstores_lock: + for jobstore_alias, jobstore in six.iteritems(self._jobstores): + try: + due_jobs = jobstore.get_due_jobs(now) + except Exception as e: + # Schedule a wakeup at least in jobstore_retry_interval seconds + self._logger.warning('Error getting due jobs from job store %r: %s', + jobstore_alias, e) + retry_wakeup_time = now + timedelta(seconds=self.jobstore_retry_interval) + if not next_wakeup_time or next_wakeup_time > retry_wakeup_time: + next_wakeup_time = retry_wakeup_time + + continue + + for job in due_jobs: + # Look up the job's executor + try: + executor = self._lookup_executor(job.executor) + except BaseException: + self._logger.error( + 'Executor lookup ("%s") failed for job "%s" -- removing it from the ' + 'job store', job.executor, job) + self.remove_job(job.id, jobstore_alias) + continue + + run_times = job._get_run_times(now) + run_times = run_times[-1:] if run_times and job.coalesce else run_times + if run_times: + try: + executor.submit_job(job, run_times) + except MaxInstancesReachedError: + self._logger.warning( + 'Execution of job "%s" skipped: maximum number of running ' + 'instances reached (%d)', job, job.max_instances) + event = JobSubmissionEvent(EVENT_JOB_MAX_INSTANCES, job.id, + jobstore_alias, run_times) + events.append(event) + except BaseException: + self._logger.exception('Error submitting job "%s" to executor "%s"', + job, job.executor) + else: + event = JobSubmissionEvent(EVENT_JOB_SUBMITTED, job.id, jobstore_alias, + run_times) + events.append(event) + + # Update the job if it has a next execution time. + # Otherwise remove it from the job store. + job_next_run = job.trigger.get_next_fire_time(run_times[-1], now) + if job_next_run: + job._modify(next_run_time=job_next_run) + jobstore.update_job(job) + else: + self.remove_job(job.id, jobstore_alias) + + # Set a new next wakeup time if there isn't one yet or + # the jobstore has an even earlier one + jobstore_next_run_time = jobstore.get_next_run_time() + if jobstore_next_run_time and (next_wakeup_time is None or + jobstore_next_run_time < next_wakeup_time): + next_wakeup_time = jobstore_next_run_time.astimezone(self.timezone) + + # Dispatch collected events + for event in events: + self._dispatch_event(event) + + # Determine the delay until this method should be called again + if self.state == STATE_PAUSED: + wait_seconds = None + self._logger.debug('Scheduler is paused; waiting until resume() is called') + elif next_wakeup_time is None: + wait_seconds = None + self._logger.debug('No jobs; waiting until a job is added') + else: + wait_seconds = min(max(timedelta_seconds(next_wakeup_time - now), 0), TIMEOUT_MAX) + self._logger.debug('Next wakeup is due at %s (in %f seconds)', next_wakeup_time, + wait_seconds) + + return wait_seconds diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py new file mode 100644 index 0000000..4ecc9f6 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from threading import Event + +from apscheduler.schedulers.base import BaseScheduler, STATE_STOPPED +from apscheduler.util import TIMEOUT_MAX + + +class BlockingScheduler(BaseScheduler): + """ + A scheduler that runs in the foreground + (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will block). + """ + _event = None + + def start(self, *args, **kwargs): + if self._event is None or self._event.is_set(): + self._event = Event() + + super(BlockingScheduler, self).start(*args, **kwargs) + self._main_loop() + + def shutdown(self, wait=True): + super(BlockingScheduler, self).shutdown(wait) + self._event.set() + + def _main_loop(self): + wait_seconds = TIMEOUT_MAX + while self.state != STATE_STOPPED: + self._event.wait(wait_seconds) + self._event.clear() + wait_seconds = self._process_jobs() + + def wakeup(self): + self._event.set() diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py new file mode 100644 index 0000000..d48ed74 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from apscheduler.schedulers.blocking import BlockingScheduler +from apscheduler.schedulers.base import BaseScheduler + +try: + from gevent.event import Event + from gevent.lock import RLock + import gevent +except ImportError: # pragma: nocover + raise ImportError('GeventScheduler requires gevent installed') + + +class GeventScheduler(BlockingScheduler): + """A scheduler that runs as a Gevent greenlet.""" + + _greenlet = None + + def start(self, *args, **kwargs): + self._event = Event() + BaseScheduler.start(self, *args, **kwargs) + self._greenlet = gevent.spawn(self._main_loop) + return self._greenlet + + def shutdown(self, *args, **kwargs): + super(GeventScheduler, self).shutdown(*args, **kwargs) + self._greenlet.join() + del self._greenlet + + def _create_lock(self): + return RLock() + + def _create_default_executor(self): + from apscheduler.executors.gevent import GeventExecutor + return GeventExecutor() diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/qt.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/qt.py new file mode 100644 index 0000000..890a44a --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/qt.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import + +from apscheduler.schedulers.base import BaseScheduler + +try: + from PyQt5.QtCore import QObject, QTimer +except (ImportError, RuntimeError): # pragma: nocover + try: + from PyQt4.QtCore import QObject, QTimer + except ImportError: + try: + from PySide6.QtCore import QObject, QTimer # noqa + except ImportError: + try: + from PySide2.QtCore import QObject, QTimer # noqa + except ImportError: + try: + from PySide.QtCore import QObject, QTimer # noqa + except ImportError: + raise ImportError('QtScheduler requires either PyQt5, PyQt4, PySide6, PySide2 ' + 'or PySide installed') + + +class QtScheduler(BaseScheduler): + """A scheduler that runs in a Qt event loop.""" + + _timer = None + + def shutdown(self, *args, **kwargs): + super(QtScheduler, self).shutdown(*args, **kwargs) + self._stop_timer() + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + wait_time = min(int(wait_seconds * 1000), 2147483647) + self._timer = QTimer.singleShot(wait_time, self._process_jobs) + + def _stop_timer(self): + if self._timer: + if self._timer.isActive(): + self._timer.stop() + del self._timer + + def wakeup(self): + self._start_timer(0) + + def _process_jobs(self): + wait_seconds = super(QtScheduler, self)._process_jobs() + self._start_timer(wait_seconds) diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py new file mode 100644 index 0000000..0a9171f --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +from datetime import timedelta +from functools import wraps + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + +try: + from tornado.ioloop import IOLoop +except ImportError: # pragma: nocover + raise ImportError('TornadoScheduler requires tornado installed') + + +def run_in_ioloop(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + self._ioloop.add_callback(func, self, *args, **kwargs) + return wrapper + + +class TornadoScheduler(BaseScheduler): + """ + A scheduler that runs on a Tornado IOLoop. + + The default executor can run jobs based on native coroutines (``async def``). + + =========== =============================================================== + ``io_loop`` Tornado IOLoop instance to use (defaults to the global IO loop) + =========== =============================================================== + """ + + _ioloop = None + _timeout = None + + @run_in_ioloop + def shutdown(self, wait=True): + super(TornadoScheduler, self).shutdown(wait) + self._stop_timer() + + def _configure(self, config): + self._ioloop = maybe_ref(config.pop('io_loop', None)) or IOLoop.current() + super(TornadoScheduler, self)._configure(config) + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._timeout = self._ioloop.add_timeout(timedelta(seconds=wait_seconds), self.wakeup) + + def _stop_timer(self): + if self._timeout: + self._ioloop.remove_timeout(self._timeout) + del self._timeout + + def _create_default_executor(self): + from apscheduler.executors.tornado import TornadoExecutor + return TornadoExecutor() + + @run_in_ioloop + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) diff --git a/python/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py b/python/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py new file mode 100644 index 0000000..6b43a84 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py @@ -0,0 +1,62 @@ +from __future__ import absolute_import + +from functools import wraps + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + +try: + from twisted.internet import reactor as default_reactor +except ImportError: # pragma: nocover + raise ImportError('TwistedScheduler requires Twisted installed') + + +def run_in_reactor(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + self._reactor.callFromThread(func, self, *args, **kwargs) + return wrapper + + +class TwistedScheduler(BaseScheduler): + """ + A scheduler that runs on a Twisted reactor. + + Extra options: + + =========== ======================================================== + ``reactor`` Reactor instance to use (defaults to the global reactor) + =========== ======================================================== + """ + + _reactor = None + _delayedcall = None + + def _configure(self, config): + self._reactor = maybe_ref(config.pop('reactor', default_reactor)) + super(TwistedScheduler, self)._configure(config) + + @run_in_reactor + def shutdown(self, wait=True): + super(TwistedScheduler, self).shutdown(wait) + self._stop_timer() + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._delayedcall = self._reactor.callLater(wait_seconds, self.wakeup) + + def _stop_timer(self): + if self._delayedcall and self._delayedcall.active(): + self._delayedcall.cancel() + del self._delayedcall + + @run_in_reactor + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) + + def _create_default_executor(self): + from apscheduler.executors.twisted import TwistedExecutor + return TwistedExecutor() diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/__init__.py b/python/lib/python3.11/site-packages/apscheduler/triggers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/base.py b/python/lib/python3.11/site-packages/apscheduler/triggers/base.py new file mode 100644 index 0000000..55d010d --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/base.py @@ -0,0 +1,37 @@ +from abc import ABCMeta, abstractmethod +from datetime import timedelta +import random + +import six + + +class BaseTrigger(six.with_metaclass(ABCMeta)): + """Abstract base class that defines the interface that every trigger must implement.""" + + __slots__ = () + + @abstractmethod + def get_next_fire_time(self, previous_fire_time, now): + """ + Returns the next datetime to fire on, If no such datetime can be calculated, returns + ``None``. + + :param datetime.datetime previous_fire_time: the previous time the trigger was fired + :param datetime.datetime now: current datetime + """ + + def _apply_jitter(self, next_fire_time, jitter, now): + """ + Randomize ``next_fire_time`` by adding a random value (the jitter). + + :param datetime.datetime|None next_fire_time: next fire time without jitter applied. If + ``None``, returns ``None``. + :param int|None jitter: maximum number of seconds to add to ``next_fire_time`` + (if ``None`` or ``0``, returns ``next_fire_time``) + :param datetime.datetime now: current datetime + :return datetime.datetime|None: next fire time with a jitter. + """ + if next_fire_time is None or not jitter: + return next_fire_time + + return next_fire_time + timedelta(seconds=random.uniform(0, jitter)) diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/combining.py b/python/lib/python3.11/site-packages/apscheduler/triggers/combining.py new file mode 100644 index 0000000..bb90006 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/combining.py @@ -0,0 +1,95 @@ +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import obj_to_ref, ref_to_obj + + +class BaseCombiningTrigger(BaseTrigger): + __slots__ = ('triggers', 'jitter') + + def __init__(self, triggers, jitter=None): + self.triggers = triggers + self.jitter = jitter + + def __getstate__(self): + return { + 'version': 1, + 'triggers': [(obj_to_ref(trigger.__class__), trigger.__getstate__()) + for trigger in self.triggers], + 'jitter': self.jitter + } + + def __setstate__(self, state): + if state.get('version', 1) > 1: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 1 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.jitter = state['jitter'] + self.triggers = [] + for clsref, state in state['triggers']: + cls = ref_to_obj(clsref) + trigger = cls.__new__(cls) + trigger.__setstate__(state) + self.triggers.append(trigger) + + def __repr__(self): + return '<{}({}{})>'.format(self.__class__.__name__, self.triggers, + ', jitter={}'.format(self.jitter) if self.jitter else '') + + +class AndTrigger(BaseCombiningTrigger): + """ + Always returns the earliest next fire time that all the given triggers can agree on. + The trigger is considered to be finished when any of the given triggers has finished its + schedule. + + Trigger alias: ``and`` + + :param list triggers: triggers to combine + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + """ + + __slots__ = () + + def get_next_fire_time(self, previous_fire_time, now): + while True: + fire_times = [trigger.get_next_fire_time(previous_fire_time, now) + for trigger in self.triggers] + if None in fire_times: + return None + elif min(fire_times) == max(fire_times): + return self._apply_jitter(fire_times[0], self.jitter, now) + else: + now = max(fire_times) + + def __str__(self): + return 'and[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) + + +class OrTrigger(BaseCombiningTrigger): + """ + Always returns the earliest next fire time produced by any of the given triggers. + The trigger is considered finished when all the given triggers have finished their schedules. + + Trigger alias: ``or`` + + :param list triggers: triggers to combine + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + + .. note:: Triggers that depends on the previous fire time, such as the interval trigger, may + seem to behave strangely since they are always passed the previous fire time produced by + any of the given triggers. + """ + + __slots__ = () + + def get_next_fire_time(self, previous_fire_time, now): + fire_times = [trigger.get_next_fire_time(previous_fire_time, now) + for trigger in self.triggers] + fire_times = [fire_time for fire_time in fire_times if fire_time is not None] + if fire_times: + return self._apply_jitter(min(fire_times), self.jitter, now) + else: + return None + + def __str__(self): + return 'or[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py new file mode 100644 index 0000000..b5389dd --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py @@ -0,0 +1,239 @@ +from datetime import datetime, timedelta + +from tzlocal import get_localzone +import six + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.triggers.cron.fields import ( + BaseField, MonthField, WeekField, DayOfMonthField, DayOfWeekField, DEFAULT_VALUES) +from apscheduler.util import ( + datetime_ceil, convert_to_datetime, datetime_repr, astimezone, localize, normalize) + + +class CronTrigger(BaseTrigger): + """ + Triggers when current time matches all specified time constraints, + similarly to how the UNIX cron scheduler works. + + :param int|str year: 4-digit year + :param int|str month: month (1-12) + :param int|str day: day of month (1-31) + :param int|str week: ISO week (1-53) + :param int|str day_of_week: number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) + :param int|str hour: hour (0-23) + :param int|str minute: minute (0-59) + :param int|str second: second (0-59) + :param datetime|str start_date: earliest possible date/time to trigger on (inclusive) + :param datetime|str end_date: latest possible date/time to trigger on (inclusive) + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations (defaults + to scheduler timezone) + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + + .. note:: The first weekday is always **monday**. + """ + + FIELD_NAMES = ('year', 'month', 'day', 'week', 'day_of_week', 'hour', 'minute', 'second') + FIELDS_MAP = { + 'year': BaseField, + 'month': MonthField, + 'week': WeekField, + 'day': DayOfMonthField, + 'day_of_week': DayOfWeekField, + 'hour': BaseField, + 'minute': BaseField, + 'second': BaseField + } + + __slots__ = 'timezone', 'start_date', 'end_date', 'fields', 'jitter' + + def __init__(self, year=None, month=None, day=None, week=None, day_of_week=None, hour=None, + minute=None, second=None, start_date=None, end_date=None, timezone=None, + jitter=None): + if timezone: + self.timezone = astimezone(timezone) + elif isinstance(start_date, datetime) and start_date.tzinfo: + self.timezone = start_date.tzinfo + elif isinstance(end_date, datetime) and end_date.tzinfo: + self.timezone = end_date.tzinfo + else: + self.timezone = get_localzone() + + self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') + self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') + + self.jitter = jitter + + values = dict((key, value) for (key, value) in six.iteritems(locals()) + if key in self.FIELD_NAMES and value is not None) + self.fields = [] + assign_defaults = False + for field_name in self.FIELD_NAMES: + if field_name in values: + exprs = values.pop(field_name) + is_default = False + assign_defaults = not values + elif assign_defaults: + exprs = DEFAULT_VALUES[field_name] + is_default = True + else: + exprs = '*' + is_default = True + + field_class = self.FIELDS_MAP[field_name] + field = field_class(field_name, exprs, is_default) + self.fields.append(field) + + @classmethod + def from_crontab(cls, expr, timezone=None): + """ + Create a :class:`~CronTrigger` from a standard crontab expression. + + See https://en.wikipedia.org/wiki/Cron for more information on the format accepted here. + + :param expr: minute, hour, day of month, month, day of week + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations ( + defaults to scheduler timezone) + :return: a :class:`~CronTrigger` instance + + """ + values = expr.split() + if len(values) != 5: + raise ValueError('Wrong number of fields; got {}, expected 5'.format(len(values))) + + return cls(minute=values[0], hour=values[1], day=values[2], month=values[3], + day_of_week=values[4], timezone=timezone) + + def _increment_field_value(self, dateval, fieldnum): + """ + Increments the designated field and resets all less significant fields to their minimum + values. + + :type dateval: datetime + :type fieldnum: int + :return: a tuple containing the new date, and the number of the field that was actually + incremented + :rtype: tuple + """ + + values = {} + i = 0 + while i < len(self.fields): + field = self.fields[i] + if not field.REAL: + if i == fieldnum: + fieldnum -= 1 + i -= 1 + else: + i += 1 + continue + + if i < fieldnum: + values[field.name] = field.get_value(dateval) + i += 1 + elif i > fieldnum: + values[field.name] = field.get_min(dateval) + i += 1 + else: + value = field.get_value(dateval) + maxval = field.get_max(dateval) + if value == maxval: + fieldnum -= 1 + i -= 1 + else: + values[field.name] = value + 1 + i += 1 + + difference = datetime(**values) - dateval.replace(tzinfo=None) + return normalize(dateval + difference), fieldnum + + def _set_field_value(self, dateval, fieldnum, new_value): + values = {} + for i, field in enumerate(self.fields): + if field.REAL: + if i < fieldnum: + values[field.name] = field.get_value(dateval) + elif i > fieldnum: + values[field.name] = field.get_min(dateval) + else: + values[field.name] = new_value + + return localize(datetime(**values), self.timezone) + + def get_next_fire_time(self, previous_fire_time, now): + if previous_fire_time: + start_date = min(now, previous_fire_time + timedelta(microseconds=1)) + if start_date == previous_fire_time: + start_date += timedelta(microseconds=1) + else: + start_date = max(now, self.start_date) if self.start_date else now + + fieldnum = 0 + next_date = datetime_ceil(start_date).astimezone(self.timezone) + while 0 <= fieldnum < len(self.fields): + field = self.fields[fieldnum] + curr_value = field.get_value(next_date) + next_value = field.get_next_value(next_date) + + if next_value is None: + # No valid value was found + next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) + elif next_value > curr_value: + # A valid, but higher than the starting value, was found + if field.REAL: + next_date = self._set_field_value(next_date, fieldnum, next_value) + fieldnum += 1 + else: + next_date, fieldnum = self._increment_field_value(next_date, fieldnum) + else: + # A valid value was found, no changes necessary + fieldnum += 1 + + # Return if the date has rolled past the end date + if self.end_date and next_date > self.end_date: + return None + + if fieldnum >= 0: + next_date = self._apply_jitter(next_date, self.jitter, now) + return min(next_date, self.end_date) if self.end_date else next_date + + def __getstate__(self): + return { + 'version': 2, + 'timezone': self.timezone, + 'start_date': self.start_date, + 'end_date': self.end_date, + 'fields': self.fields, + 'jitter': self.jitter, + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 2: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 2 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.timezone = state['timezone'] + self.start_date = state['start_date'] + self.end_date = state['end_date'] + self.fields = state['fields'] + self.jitter = state.get('jitter') + + def __str__(self): + options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] + return 'cron[%s]' % (', '.join(options)) + + def __repr__(self): + options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] + if self.start_date: + options.append("start_date=%r" % datetime_repr(self.start_date)) + if self.end_date: + options.append("end_date=%r" % datetime_repr(self.end_date)) + if self.jitter: + options.append('jitter=%s' % self.jitter) + + return "<%s (%s, timezone='%s')>" % ( + self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py new file mode 100644 index 0000000..55a3716 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py @@ -0,0 +1,251 @@ +"""This module contains the expressions applicable for CronTrigger's fields.""" + +from calendar import monthrange +import re + +from apscheduler.util import asint + +__all__ = ('AllExpression', 'RangeExpression', 'WeekdayRangeExpression', + 'WeekdayPositionExpression', 'LastDayOfMonthExpression') + + +WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] +MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] + + +class AllExpression(object): + value_re = re.compile(r'\*(?:/(?P<step>\d+))?$') + + def __init__(self, step=None): + self.step = asint(step) + if self.step == 0: + raise ValueError('Increment must be higher than 0') + + def validate_range(self, field_name): + from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES + + value_range = MAX_VALUES[field_name] - MIN_VALUES[field_name] + if self.step and self.step > value_range: + raise ValueError('the step value ({}) is higher than the total range of the ' + 'expression ({})'.format(self.step, value_range)) + + def get_next_value(self, date, field): + start = field.get_value(date) + minval = field.get_min(date) + maxval = field.get_max(date) + start = max(start, minval) + + if not self.step: + next = start + else: + distance_to_next = (self.step - (start - minval)) % self.step + next = start + distance_to_next + + if next <= maxval: + return next + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.step == other.step + + def __str__(self): + if self.step: + return '*/%d' % self.step + return '*' + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, self.step) + + +class RangeExpression(AllExpression): + value_re = re.compile( + r'(?P<first>\d+)(?:-(?P<last>\d+))?(?:/(?P<step>\d+))?$') + + def __init__(self, first, last=None, step=None): + super(RangeExpression, self).__init__(step) + first = asint(first) + last = asint(last) + if last is None and step is None: + last = first + if last is not None and first > last: + raise ValueError('The minimum value in a range must not be higher than the maximum') + self.first = first + self.last = last + + def validate_range(self, field_name): + from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES + + super(RangeExpression, self).validate_range(field_name) + if self.first < MIN_VALUES[field_name]: + raise ValueError('the first value ({}) is lower than the minimum value ({})' + .format(self.first, MIN_VALUES[field_name])) + if self.last is not None and self.last > MAX_VALUES[field_name]: + raise ValueError('the last value ({}) is higher than the maximum value ({})' + .format(self.last, MAX_VALUES[field_name])) + value_range = (self.last or MAX_VALUES[field_name]) - self.first + if self.step and self.step > value_range: + raise ValueError('the step value ({}) is higher than the total range of the ' + 'expression ({})'.format(self.step, value_range)) + + def get_next_value(self, date, field): + startval = field.get_value(date) + minval = field.get_min(date) + maxval = field.get_max(date) + + # Apply range limits + minval = max(minval, self.first) + maxval = min(maxval, self.last) if self.last is not None else maxval + nextval = max(minval, startval) + + # Apply the step if defined + if self.step: + distance_to_next = (self.step - (nextval - minval)) % self.step + nextval += distance_to_next + + return nextval if nextval <= maxval else None + + def __eq__(self, other): + return (isinstance(other, self.__class__) and self.first == other.first and + self.last == other.last) + + def __str__(self): + if self.last != self.first and self.last is not None: + range = '%d-%d' % (self.first, self.last) + else: + range = str(self.first) + + if self.step: + return '%s/%d' % (range, self.step) + return range + + def __repr__(self): + args = [str(self.first)] + if self.last != self.first and self.last is not None or self.step: + args.append(str(self.last)) + if self.step: + args.append(str(self.step)) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class MonthRangeExpression(RangeExpression): + value_re = re.compile(r'(?P<first>[a-z]+)(?:-(?P<last>[a-z]+))?', re.IGNORECASE) + + def __init__(self, first, last=None): + try: + first_num = MONTHS.index(first.lower()) + 1 + except ValueError: + raise ValueError('Invalid month name "%s"' % first) + + if last: + try: + last_num = MONTHS.index(last.lower()) + 1 + except ValueError: + raise ValueError('Invalid month name "%s"' % last) + else: + last_num = None + + super(MonthRangeExpression, self).__init__(first_num, last_num) + + def __str__(self): + if self.last != self.first and self.last is not None: + return '%s-%s' % (MONTHS[self.first - 1], MONTHS[self.last - 1]) + return MONTHS[self.first - 1] + + def __repr__(self): + args = ["'%s'" % MONTHS[self.first]] + if self.last != self.first and self.last is not None: + args.append("'%s'" % MONTHS[self.last - 1]) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class WeekdayRangeExpression(RangeExpression): + value_re = re.compile(r'(?P<first>[a-z]+)(?:-(?P<last>[a-z]+))?', re.IGNORECASE) + + def __init__(self, first, last=None): + try: + first_num = WEEKDAYS.index(first.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % first) + + if last: + try: + last_num = WEEKDAYS.index(last.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % last) + else: + last_num = None + + super(WeekdayRangeExpression, self).__init__(first_num, last_num) + + def __str__(self): + if self.last != self.first and self.last is not None: + return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last]) + return WEEKDAYS[self.first] + + def __repr__(self): + args = ["'%s'" % WEEKDAYS[self.first]] + if self.last != self.first and self.last is not None: + args.append("'%s'" % WEEKDAYS[self.last]) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class WeekdayPositionExpression(AllExpression): + options = ['1st', '2nd', '3rd', '4th', '5th', 'last'] + value_re = re.compile(r'(?P<option_name>%s) +(?P<weekday_name>(?:\d+|\w+))' % + '|'.join(options), re.IGNORECASE) + + def __init__(self, option_name, weekday_name): + super(WeekdayPositionExpression, self).__init__(None) + try: + self.option_num = self.options.index(option_name.lower()) + except ValueError: + raise ValueError('Invalid weekday position "%s"' % option_name) + + try: + self.weekday = WEEKDAYS.index(weekday_name.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % weekday_name) + + def get_next_value(self, date, field): + # Figure out the weekday of the month's first day and the number of days in that month + first_day_wday, last_day = monthrange(date.year, date.month) + + # Calculate which day of the month is the first of the target weekdays + first_hit_day = self.weekday - first_day_wday + 1 + if first_hit_day <= 0: + first_hit_day += 7 + + # Calculate what day of the month the target weekday would be + if self.option_num < 5: + target_day = first_hit_day + self.option_num * 7 + else: + target_day = first_hit_day + ((last_day - first_hit_day) // 7) * 7 + + if target_day <= last_day and target_day >= date.day: + return target_day + + def __eq__(self, other): + return (super(WeekdayPositionExpression, self).__eq__(other) and + self.option_num == other.option_num and self.weekday == other.weekday) + + def __str__(self): + return '%s %s' % (self.options[self.option_num], WEEKDAYS[self.weekday]) + + def __repr__(self): + return "%s('%s', '%s')" % (self.__class__.__name__, self.options[self.option_num], + WEEKDAYS[self.weekday]) + + +class LastDayOfMonthExpression(AllExpression): + value_re = re.compile(r'last', re.IGNORECASE) + + def __init__(self): + super(LastDayOfMonthExpression, self).__init__(None) + + def get_next_value(self, date, field): + return monthrange(date.year, date.month)[1] + + def __str__(self): + return 'last' + + def __repr__(self): + return "%s()" % self.__class__.__name__ diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py new file mode 100644 index 0000000..86d620c --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py @@ -0,0 +1,111 @@ +"""Fields represent CronTrigger options which map to :class:`~datetime.datetime` fields.""" + +from calendar import monthrange +import re + +import six + +from apscheduler.triggers.cron.expressions import ( + AllExpression, RangeExpression, WeekdayPositionExpression, LastDayOfMonthExpression, + WeekdayRangeExpression, MonthRangeExpression) + + +__all__ = ('MIN_VALUES', 'MAX_VALUES', 'DEFAULT_VALUES', 'BaseField', 'WeekField', + 'DayOfMonthField', 'DayOfWeekField') + + +MIN_VALUES = {'year': 1970, 'month': 1, 'day': 1, 'week': 1, 'day_of_week': 0, 'hour': 0, + 'minute': 0, 'second': 0} +MAX_VALUES = {'year': 9999, 'month': 12, 'day': 31, 'week': 53, 'day_of_week': 6, 'hour': 23, + 'minute': 59, 'second': 59} +DEFAULT_VALUES = {'year': '*', 'month': 1, 'day': 1, 'week': '*', 'day_of_week': '*', 'hour': 0, + 'minute': 0, 'second': 0} +SEPARATOR = re.compile(' *, *') + + +class BaseField(object): + REAL = True + COMPILERS = [AllExpression, RangeExpression] + + def __init__(self, name, exprs, is_default=False): + self.name = name + self.is_default = is_default + self.compile_expressions(exprs) + + def get_min(self, dateval): + return MIN_VALUES[self.name] + + def get_max(self, dateval): + return MAX_VALUES[self.name] + + def get_value(self, dateval): + return getattr(dateval, self.name) + + def get_next_value(self, dateval): + smallest = None + for expr in self.expressions: + value = expr.get_next_value(dateval, self) + if smallest is None or (value is not None and value < smallest): + smallest = value + + return smallest + + def compile_expressions(self, exprs): + self.expressions = [] + + # Split a comma-separated expression list, if any + for expr in SEPARATOR.split(str(exprs).strip()): + self.compile_expression(expr) + + def compile_expression(self, expr): + for compiler in self.COMPILERS: + match = compiler.value_re.match(expr) + if match: + compiled_expr = compiler(**match.groupdict()) + + try: + compiled_expr.validate_range(self.name) + except ValueError as e: + exc = ValueError('Error validating expression {!r}: {}'.format(expr, e)) + six.raise_from(exc, None) + + self.expressions.append(compiled_expr) + return + + raise ValueError('Unrecognized expression "%s" for field "%s"' % (expr, self.name)) + + def __eq__(self, other): + return isinstance(self, self.__class__) and self.expressions == other.expressions + + def __str__(self): + expr_strings = (str(e) for e in self.expressions) + return ','.join(expr_strings) + + def __repr__(self): + return "%s('%s', '%s')" % (self.__class__.__name__, self.name, self) + + +class WeekField(BaseField): + REAL = False + + def get_value(self, dateval): + return dateval.isocalendar()[1] + + +class DayOfMonthField(BaseField): + COMPILERS = BaseField.COMPILERS + [WeekdayPositionExpression, LastDayOfMonthExpression] + + def get_max(self, dateval): + return monthrange(dateval.year, dateval.month)[1] + + +class DayOfWeekField(BaseField): + REAL = False + COMPILERS = BaseField.COMPILERS + [WeekdayRangeExpression] + + def get_value(self, dateval): + return dateval.weekday() + + +class MonthField(BaseField): + COMPILERS = BaseField.COMPILERS + [MonthRangeExpression] diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/date.py b/python/lib/python3.11/site-packages/apscheduler/triggers/date.py new file mode 100644 index 0000000..0768100 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/date.py @@ -0,0 +1,51 @@ +from datetime import datetime + +from tzlocal import get_localzone + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import convert_to_datetime, datetime_repr, astimezone + + +class DateTrigger(BaseTrigger): + """ + Triggers once on the given datetime. If ``run_date`` is left empty, current time is used. + + :param datetime|str run_date: the date/time to run the job at + :param datetime.tzinfo|str timezone: time zone for ``run_date`` if it doesn't have one already + """ + + __slots__ = 'run_date' + + def __init__(self, run_date=None, timezone=None): + timezone = astimezone(timezone) or get_localzone() + if run_date is not None: + self.run_date = convert_to_datetime(run_date, timezone, 'run_date') + else: + self.run_date = datetime.now(timezone) + + def get_next_fire_time(self, previous_fire_time, now): + return self.run_date if previous_fire_time is None else None + + def __getstate__(self): + return { + 'version': 1, + 'run_date': self.run_date + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 1: + raise ValueError( + 'Got serialized data for version %s of %s, but only version 1 can be handled' % + (state['version'], self.__class__.__name__)) + + self.run_date = state['run_date'] + + def __str__(self): + return 'date[%s]' % datetime_repr(self.run_date) + + def __repr__(self): + return "<%s (run_date='%s')>" % (self.__class__.__name__, datetime_repr(self.run_date)) diff --git a/python/lib/python3.11/site-packages/apscheduler/triggers/interval.py b/python/lib/python3.11/site-packages/apscheduler/triggers/interval.py new file mode 100644 index 0000000..b0e2dbd --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/triggers/interval.py @@ -0,0 +1,108 @@ +from datetime import timedelta, datetime +from math import ceil + +from tzlocal import get_localzone + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + convert_to_datetime, normalize, timedelta_seconds, datetime_repr, + astimezone) + + +class IntervalTrigger(BaseTrigger): + """ + Triggers on specified intervals, starting on ``start_date`` if specified, ``datetime.now()`` + + interval otherwise. + + :param int weeks: number of weeks to wait + :param int days: number of days to wait + :param int hours: number of hours to wait + :param int minutes: number of minutes to wait + :param int seconds: number of seconds to wait + :param datetime|str start_date: starting point for the interval calculation + :param datetime|str end_date: latest possible date/time to trigger on + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + """ + + __slots__ = 'timezone', 'start_date', 'end_date', 'interval', 'interval_length', 'jitter' + + def __init__(self, weeks=0, days=0, hours=0, minutes=0, seconds=0, start_date=None, + end_date=None, timezone=None, jitter=None): + self.interval = timedelta(weeks=weeks, days=days, hours=hours, minutes=minutes, + seconds=seconds) + self.interval_length = timedelta_seconds(self.interval) + if self.interval_length == 0: + self.interval = timedelta(seconds=1) + self.interval_length = 1 + + if timezone: + self.timezone = astimezone(timezone) + elif isinstance(start_date, datetime) and start_date.tzinfo: + self.timezone = start_date.tzinfo + elif isinstance(end_date, datetime) and end_date.tzinfo: + self.timezone = end_date.tzinfo + else: + self.timezone = get_localzone() + + start_date = start_date or (datetime.now(self.timezone) + self.interval) + self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') + self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') + + self.jitter = jitter + + def get_next_fire_time(self, previous_fire_time, now): + if previous_fire_time: + next_fire_time = previous_fire_time + self.interval + elif self.start_date > now: + next_fire_time = self.start_date + else: + timediff_seconds = timedelta_seconds(now - self.start_date) + next_interval_num = int(ceil(timediff_seconds / self.interval_length)) + next_fire_time = self.start_date + self.interval * next_interval_num + + if self.jitter is not None: + next_fire_time = self._apply_jitter(next_fire_time, self.jitter, now) + + if not self.end_date or next_fire_time <= self.end_date: + return normalize(next_fire_time) + + def __getstate__(self): + return { + 'version': 2, + 'timezone': self.timezone, + 'start_date': self.start_date, + 'end_date': self.end_date, + 'interval': self.interval, + 'jitter': self.jitter, + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 2: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 2 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.timezone = state['timezone'] + self.start_date = state['start_date'] + self.end_date = state['end_date'] + self.interval = state['interval'] + self.interval_length = timedelta_seconds(self.interval) + self.jitter = state.get('jitter') + + def __str__(self): + return 'interval[%s]' % str(self.interval) + + def __repr__(self): + options = ['interval=%r' % self.interval, 'start_date=%r' % datetime_repr(self.start_date)] + if self.end_date: + options.append("end_date=%r" % datetime_repr(self.end_date)) + if self.jitter: + options.append('jitter=%s' % self.jitter) + + return "<%s (%s, timezone='%s')>" % ( + self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/python/lib/python3.11/site-packages/apscheduler/util.py b/python/lib/python3.11/site-packages/apscheduler/util.py new file mode 100644 index 0000000..64b27d7 --- /dev/null +++ b/python/lib/python3.11/site-packages/apscheduler/util.py @@ -0,0 +1,430 @@ +"""This module contains several handy functions primarily meant for internal use.""" + +from __future__ import division + +from asyncio import iscoroutinefunction +from datetime import date, datetime, time, timedelta, tzinfo +from calendar import timegm +from functools import partial +from inspect import isclass, ismethod +import re +import sys + +from pytz import timezone, utc, FixedOffset +import six + +try: + from inspect import signature +except ImportError: # pragma: nocover + from funcsigs import signature + +try: + from threading import TIMEOUT_MAX +except ImportError: + TIMEOUT_MAX = 4294967 # Maximum value accepted by Event.wait() on Windows + +__all__ = ('asint', 'asbool', 'astimezone', 'convert_to_datetime', 'datetime_to_utc_timestamp', + 'utc_timestamp_to_datetime', 'timedelta_seconds', 'datetime_ceil', 'get_callable_name', + 'obj_to_ref', 'ref_to_obj', 'maybe_ref', 'repr_escape', 'check_callable_args', + 'normalize', 'localize', 'TIMEOUT_MAX') + + +class _Undefined(object): + def __nonzero__(self): + return False + + def __bool__(self): + return False + + def __repr__(self): + return '<undefined>' + + +undefined = _Undefined() #: a unique object that only signifies that no value is defined + + +def asint(text): + """ + Safely converts a string to an integer, returning ``None`` if the string is ``None``. + + :type text: str + :rtype: int + + """ + if text is not None: + return int(text) + + +def asbool(obj): + """ + Interprets an object as a boolean value. + + :rtype: bool + + """ + if isinstance(obj, str): + obj = obj.strip().lower() + if obj in ('true', 'yes', 'on', 'y', 't', '1'): + return True + if obj in ('false', 'no', 'off', 'n', 'f', '0'): + return False + raise ValueError('Unable to interpret value "%s" as boolean' % obj) + return bool(obj) + + +def astimezone(obj): + """ + Interprets an object as a timezone. + + :rtype: tzinfo + + """ + if isinstance(obj, six.string_types): + return timezone(obj) + if isinstance(obj, tzinfo): + if obj.tzname(None) == 'local': + raise ValueError( + 'Unable to determine the name of the local timezone -- you must explicitly ' + 'specify the name of the local timezone. Please refrain from using timezones like ' + 'EST to prevent problems with daylight saving time. Instead, use a locale based ' + 'timezone name (such as Europe/Helsinki).') + return obj + if obj is not None: + raise TypeError('Expected tzinfo, got %s instead' % obj.__class__.__name__) + + +_DATE_REGEX = re.compile( + r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})' + r'(?:[ T](?P<hour>\d{1,2}):(?P<minute>\d{1,2}):(?P<second>\d{1,2})' + r'(?:\.(?P<microsecond>\d{1,6}))?' + r'(?P<timezone>Z|[+-]\d\d:\d\d)?)?$') + + +def convert_to_datetime(input, tz, arg_name): + """ + Converts the given object to a timezone aware datetime object. + + If a timezone aware datetime object is passed, it is returned unmodified. + If a native datetime object is passed, it is given the specified timezone. + If the input is a string, it is parsed as a datetime with the given timezone. + + Date strings are accepted in three different forms: date only (Y-m-d), date with time + (Y-m-d H:M:S) or with date+time with microseconds (Y-m-d H:M:S.micro). Additionally you can + override the time zone by giving a specific offset in the format specified by ISO 8601: + Z (UTC), +HH:MM or -HH:MM. + + :param str|datetime input: the datetime or string to convert to a timezone aware datetime + :param datetime.tzinfo tz: timezone to interpret ``input`` in + :param str arg_name: the name of the argument (used in an error message) + :rtype: datetime + + """ + if input is None: + return + elif isinstance(input, datetime): + datetime_ = input + elif isinstance(input, date): + datetime_ = datetime.combine(input, time()) + elif isinstance(input, six.string_types): + m = _DATE_REGEX.match(input) + if not m: + raise ValueError('Invalid date string') + + values = m.groupdict() + tzname = values.pop('timezone') + if tzname == 'Z': + tz = utc + elif tzname: + hours, minutes = (int(x) for x in tzname[1:].split(':')) + sign = 1 if tzname[0] == '+' else -1 + tz = FixedOffset(sign * (hours * 60 + minutes)) + + values = {k: int(v or 0) for k, v in values.items()} + datetime_ = datetime(**values) + else: + raise TypeError('Unsupported type for %s: %s' % (arg_name, input.__class__.__name__)) + + if datetime_.tzinfo is not None: + return datetime_ + if tz is None: + raise ValueError( + 'The "tz" argument must be specified if %s has no timezone information' % arg_name) + if isinstance(tz, six.string_types): + tz = timezone(tz) + + return localize(datetime_, tz) + + +def datetime_to_utc_timestamp(timeval): + """ + Converts a datetime instance to a timestamp. + + :type timeval: datetime + :rtype: float + + """ + if timeval is not None: + return timegm(timeval.utctimetuple()) + timeval.microsecond / 1000000 + + +def utc_timestamp_to_datetime(timestamp): + """ + Converts the given timestamp to a datetime instance. + + :type timestamp: float + :rtype: datetime + + """ + if timestamp is not None: + return datetime.fromtimestamp(timestamp, utc) + + +def timedelta_seconds(delta): + """ + Converts the given timedelta to seconds. + + :type delta: timedelta + :rtype: float + + """ + return delta.days * 24 * 60 * 60 + delta.seconds + \ + delta.microseconds / 1000000.0 + + +def datetime_ceil(dateval): + """ + Rounds the given datetime object upwards. + + :type dateval: datetime + + """ + if dateval.microsecond > 0: + return dateval + timedelta(seconds=1, microseconds=-dateval.microsecond) + return dateval + + +def datetime_repr(dateval): + return dateval.strftime('%Y-%m-%d %H:%M:%S %Z') if dateval else 'None' + + +def get_callable_name(func): + """ + Returns the best available display name for the given function/callable. + + :rtype: str + + """ + # the easy case (on Python 3.3+) + if hasattr(func, '__qualname__'): + return func.__qualname__ + + # class methods, bound and unbound methods + f_self = getattr(func, '__self__', None) or getattr(func, 'im_self', None) + if f_self and hasattr(func, '__name__'): + f_class = f_self if isclass(f_self) else f_self.__class__ + else: + f_class = getattr(func, 'im_class', None) + + if f_class and hasattr(func, '__name__'): + return '%s.%s' % (f_class.__name__, func.__name__) + + # class or class instance + if hasattr(func, '__call__'): + # class + if hasattr(func, '__name__'): + return func.__name__ + + # instance of a class with a __call__ method + return func.__class__.__name__ + + raise TypeError('Unable to determine a name for %r -- maybe it is not a callable?' % func) + + +def obj_to_ref(obj): + """ + Returns the path to the given callable. + + :rtype: str + :raises TypeError: if the given object is not callable + :raises ValueError: if the given object is a :class:`~functools.partial`, lambda or a nested + function + + """ + if isinstance(obj, partial): + raise ValueError('Cannot create a reference to a partial()') + + name = get_callable_name(obj) + if '<lambda>' in name: + raise ValueError('Cannot create a reference to a lambda') + if '<locals>' in name: + raise ValueError('Cannot create a reference to a nested function') + + if ismethod(obj): + if hasattr(obj, 'im_self') and obj.im_self: + # bound method + module = obj.im_self.__module__ + elif hasattr(obj, 'im_class') and obj.im_class: + # unbound method + module = obj.im_class.__module__ + else: + module = obj.__module__ + else: + module = obj.__module__ + return '%s:%s' % (module, name) + + +def ref_to_obj(ref): + """ + Returns the object pointed to by ``ref``. + + :type ref: str + + """ + if not isinstance(ref, six.string_types): + raise TypeError('References must be strings') + if ':' not in ref: + raise ValueError('Invalid reference') + + modulename, rest = ref.split(':', 1) + try: + obj = __import__(modulename, fromlist=[rest]) + except ImportError: + raise LookupError('Error resolving reference %s: could not import module' % ref) + + try: + for name in rest.split('.'): + obj = getattr(obj, name) + return obj + except Exception: + raise LookupError('Error resolving reference %s: error looking up object' % ref) + + +def maybe_ref(ref): + """ + Returns the object that the given reference points to, if it is indeed a reference. + If it is not a reference, the object is returned as-is. + + """ + if not isinstance(ref, str): + return ref + return ref_to_obj(ref) + + +if six.PY2: + def repr_escape(string): + if isinstance(string, six.text_type): + return string.encode('ascii', 'backslashreplace') + return string +else: + def repr_escape(string): + return string + + +def check_callable_args(func, args, kwargs): + """ + Ensures that the given callable can be called with the given arguments. + + :type args: tuple + :type kwargs: dict + + """ + pos_kwargs_conflicts = [] # parameters that have a match in both args and kwargs + positional_only_kwargs = [] # positional-only parameters that have a match in kwargs + unsatisfied_args = [] # parameters in signature that don't have a match in args or kwargs + unsatisfied_kwargs = [] # keyword-only arguments that don't have a match in kwargs + unmatched_args = list(args) # args that didn't match any of the parameters in the signature + # kwargs that didn't match any of the parameters in the signature + unmatched_kwargs = list(kwargs) + # indicates if the signature defines *args and **kwargs respectively + has_varargs = has_var_kwargs = False + + try: + if sys.version_info >= (3, 5): + sig = signature(func, follow_wrapped=False) + else: + sig = signature(func) + except ValueError: + # signature() doesn't work against every kind of callable + return + + for param in six.itervalues(sig.parameters): + if param.kind == param.POSITIONAL_OR_KEYWORD: + if param.name in unmatched_kwargs and unmatched_args: + pos_kwargs_conflicts.append(param.name) + elif unmatched_args: + del unmatched_args[0] + elif param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + elif param.default is param.empty: + unsatisfied_args.append(param.name) + elif param.kind == param.POSITIONAL_ONLY: + if unmatched_args: + del unmatched_args[0] + elif param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + positional_only_kwargs.append(param.name) + elif param.default is param.empty: + unsatisfied_args.append(param.name) + elif param.kind == param.KEYWORD_ONLY: + if param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + elif param.default is param.empty: + unsatisfied_kwargs.append(param.name) + elif param.kind == param.VAR_POSITIONAL: + has_varargs = True + elif param.kind == param.VAR_KEYWORD: + has_var_kwargs = True + + # Make sure there are no conflicts between args and kwargs + if pos_kwargs_conflicts: + raise ValueError('The following arguments are supplied in both args and kwargs: %s' % + ', '.join(pos_kwargs_conflicts)) + + # Check if keyword arguments are being fed to positional-only parameters + if positional_only_kwargs: + raise ValueError('The following arguments cannot be given as keyword arguments: %s' % + ', '.join(positional_only_kwargs)) + + # Check that the number of positional arguments minus the number of matched kwargs matches the + # argspec + if unsatisfied_args: + raise ValueError('The following arguments have not been supplied: %s' % + ', '.join(unsatisfied_args)) + + # Check that all keyword-only arguments have been supplied + if unsatisfied_kwargs: + raise ValueError( + 'The following keyword-only arguments have not been supplied in kwargs: %s' % + ', '.join(unsatisfied_kwargs)) + + # Check that the callable can accept the given number of positional arguments + if not has_varargs and unmatched_args: + raise ValueError( + 'The list of positional arguments is longer than the target callable can handle ' + '(allowed: %d, given in args: %d)' % (len(args) - len(unmatched_args), len(args))) + + # Check that the callable can accept the given keyword arguments + if not has_var_kwargs and unmatched_kwargs: + raise ValueError( + 'The target callable does not accept the following keyword arguments: %s' % + ', '.join(unmatched_kwargs)) + + +def iscoroutinefunction_partial(f): + while isinstance(f, partial): + f = f.func + + # The asyncio version of iscoroutinefunction includes testing for @coroutine + # decorations vs. the inspect version which does not. + return iscoroutinefunction(f) + + +def normalize(dt): + return datetime.fromtimestamp(dt.timestamp(), dt.tzinfo) + + +def localize(dt, tzinfo): + if hasattr(tzinfo, 'localize'): + return tzinfo.localize(dt) + + return normalize(dt.replace(tzinfo=tzinfo)) diff --git a/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE new file mode 100644 index 0000000..033c86b --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE @@ -0,0 +1,13 @@ +Copyright 2016-2020 aio-libs collaboration. + +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/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA new file mode 100644 index 0000000..e68d234 --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA @@ -0,0 +1,133 @@ +Metadata-Version: 2.1 +Name: async-timeout +Version: 4.0.2 +Summary: Timeout context manager for asyncio programs +Home-page: https://github.com/aio-libs/async-timeout +Author: Andrew Svetlov <andrew.svetlov@gmail.com> +Author-email: andrew.svetlov@gmail.com +License: Apache 2 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/async-timeout/actions +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/async-timeout +Project-URL: GitHub: issues, https://github.com/aio-libs/async-timeout/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/async-timeout +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Topic :: Software Development :: Libraries +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: typing-extensions (>=3.6.5) ; python_version < "3.8" + +async-timeout +============= +.. image:: https://travis-ci.com/aio-libs/async-timeout.svg?branch=master + :target: https://travis-ci.com/aio-libs/async-timeout +.. image:: https://codecov.io/gh/aio-libs/async-timeout/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/async-timeout +.. image:: https://img.shields.io/pypi/v/async-timeout.svg + :target: https://pypi.python.org/pypi/async-timeout +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + +asyncio-compatible timeout context manager. + + +Usage example +------------- + + +The context manager is useful in cases when you want to apply timeout +logic around block of code or in cases when ``asyncio.wait_for()`` is +not suitable. Also it's much faster than ``asyncio.wait_for()`` +because ``timeout`` doesn't create a new task. + +The ``timeout(delay, *, loop=None)`` call returns a context manager +that cancels a block on *timeout* expiring:: + + async with timeout(1.5): + await inner() + +1. If ``inner()`` is executed faster than in ``1.5`` seconds nothing + happens. +2. Otherwise ``inner()`` is cancelled internally by sending + ``asyncio.CancelledError`` into but ``asyncio.TimeoutError`` is + raised outside of context manager scope. + +*timeout* parameter could be ``None`` for skipping timeout functionality. + + +Alternatively, ``timeout_at(when)`` can be used for scheduling +at the absolute time:: + + loop = asyncio.get_event_loop() + now = loop.time() + + async with timeout_at(now + 1.5): + await inner() + + +Please note: it is not POSIX time but a time with +undefined starting base, e.g. the time of the system power on. + + +Context manager has ``.expired`` property for check if timeout happens +exactly in context manager:: + + async with timeout(1.5) as cm: + await inner() + print(cm.expired) + +The property is ``True`` if ``inner()`` execution is cancelled by +timeout context manager. + +If ``inner()`` call explicitly raises ``TimeoutError`` ``cm.expired`` +is ``False``. + +The scheduled deadline time is available as ``.deadline`` property:: + + async with timeout(1.5) as cm: + cm.deadline + +Not finished yet timeout can be rescheduled by ``shift_by()`` +or ``shift_to()`` methods:: + + async with timeout(1.5) as cm: + cm.shift(1) # add another second on waiting + cm.update(loop.time() + 5) # reschedule to now+5 seconds + +Rescheduling is forbidden if the timeout is expired or after exit from ``async with`` +code block. + + +Installation +------------ + +:: + + $ pip install async-timeout + +The library is Python 3 only! + + + +Authors and License +------------------- + +The module is written by Andrew Svetlov. + +It's *Apache 2* licensed and freely available. + + diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD rename to python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD diff --git a/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..ad29955 --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +async_timeout diff --git a/lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/zip-safe b/python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe similarity index 100% rename from lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/zip-safe rename to python/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe diff --git a/python/lib/python3.11/site-packages/async_timeout/__init__.py b/python/lib/python3.11/site-packages/async_timeout/__init__.py new file mode 100644 index 0000000..179d1b0 --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout/__init__.py @@ -0,0 +1,247 @@ +import asyncio +import enum +import sys +import warnings +from types import TracebackType +from typing import Any, Optional, Type + + +if sys.version_info >= (3, 8): + from typing import final +else: + from typing_extensions import final + + +__version__ = "4.0.2" + + +__all__ = ("timeout", "timeout_at", "Timeout") + + +def timeout(delay: Optional[float]) -> "Timeout": + """timeout context manager. + + Useful in cases when you want to apply timeout logic around block + of code or in cases when asyncio.wait_for is not suitable. For example: + + >>> async with timeout(0.001): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + delay - value in seconds or None to disable timeout logic + """ + loop = _get_running_loop() + if delay is not None: + deadline = loop.time() + delay # type: Optional[float] + else: + deadline = None + return Timeout(deadline, loop) + + +def timeout_at(deadline: Optional[float]) -> "Timeout": + """Schedule the timeout at absolute time. + + deadline argument points on the time in the same clock system + as loop.time(). + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + + >>> async with timeout_at(loop.time() + 10): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + """ + loop = _get_running_loop() + return Timeout(deadline, loop) + + +class _State(enum.Enum): + INIT = "INIT" + ENTER = "ENTER" + TIMEOUT = "TIMEOUT" + EXIT = "EXIT" + + +@final +class Timeout: + # Internal class, please don't instantiate it directly + # Use timeout() and timeout_at() public factories instead. + # + # Implementation note: `async with timeout()` is preferred + # over `with timeout()`. + # While technically the Timeout class implementation + # doesn't need to be async at all, + # the `async with` statement explicitly points that + # the context manager should be used from async function context. + # + # This design allows to avoid many silly misusages. + # + # TimeoutError is raised immadiatelly when scheduled + # if the deadline is passed. + # The purpose is to time out as sson as possible + # without waiting for the next await expression. + + __slots__ = ("_deadline", "_loop", "_state", "_timeout_handler") + + def __init__( + self, deadline: Optional[float], loop: asyncio.AbstractEventLoop + ) -> None: + self._loop = loop + self._state = _State.INIT + + self._timeout_handler = None # type: Optional[asyncio.Handle] + if deadline is None: + self._deadline = None # type: Optional[float] + else: + self.update(deadline) + + def __enter__(self) -> "Timeout": + warnings.warn( + "with timeout() is deprecated, use async with timeout() instead", + DeprecationWarning, + stacklevel=2, + ) + self._do_enter() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + async def __aenter__(self) -> "Timeout": + self._do_enter() + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + @property + def expired(self) -> bool: + """Is timeout expired during execution?""" + return self._state == _State.TIMEOUT + + @property + def deadline(self) -> Optional[float]: + return self._deadline + + def reject(self) -> None: + """Reject scheduled timeout if any.""" + # cancel is maybe better name but + # task.cancel() raises CancelledError in asyncio world. + if self._state not in (_State.INIT, _State.ENTER): + raise RuntimeError(f"invalid state {self._state.value}") + self._reject() + + def _reject(self) -> None: + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._timeout_handler = None + + def shift(self, delay: float) -> None: + """Advance timeout on delay seconds. + + The delay can be negative. + + Raise RuntimeError if shift is called when deadline is not scheduled + """ + deadline = self._deadline + if deadline is None: + raise RuntimeError("cannot shift timeout if deadline is not scheduled") + self.update(deadline + delay) + + def update(self, deadline: float) -> None: + """Set deadline to absolute value. + + deadline argument points on the time in the same clock system + as loop.time(). + + If new deadline is in the past the timeout is raised immediatelly. + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + """ + if self._state == _State.EXIT: + raise RuntimeError("cannot reschedule after exit from context manager") + if self._state == _State.TIMEOUT: + raise RuntimeError("cannot reschedule expired timeout") + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._deadline = deadline + if self._state != _State.INIT: + self._reschedule() + + def _reschedule(self) -> None: + assert self._state == _State.ENTER + deadline = self._deadline + if deadline is None: + return + + now = self._loop.time() + if self._timeout_handler is not None: + self._timeout_handler.cancel() + + task = _current_task(self._loop) + if deadline <= now: + self._timeout_handler = self._loop.call_soon(self._on_timeout, task) + else: + self._timeout_handler = self._loop.call_at(deadline, self._on_timeout, task) + + def _do_enter(self) -> None: + if self._state != _State.INIT: + raise RuntimeError(f"invalid state {self._state.value}") + self._state = _State.ENTER + self._reschedule() + + def _do_exit(self, exc_type: Optional[Type[BaseException]]) -> None: + if exc_type is asyncio.CancelledError and self._state == _State.TIMEOUT: + self._timeout_handler = None + raise asyncio.TimeoutError + # timeout has not expired + self._state = _State.EXIT + self._reject() + return None + + def _on_timeout(self, task: "asyncio.Task[None]") -> None: + task.cancel() + self._state = _State.TIMEOUT + # drop the reference early + self._timeout_handler = None + + +if sys.version_info >= (3, 7): + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.current_task(loop=loop) + +else: + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.Task.current_task(loop=loop) + + +if sys.version_info >= (3, 7): + + def _get_running_loop() -> asyncio.AbstractEventLoop: + return asyncio.get_running_loop() + +else: + + def _get_running_loop() -> asyncio.AbstractEventLoop: + loop = asyncio.get_event_loop() + if not loop.is_running(): + raise RuntimeError("no running event loop") + return loop diff --git a/python/lib/python3.11/site-packages/async_timeout/py.typed b/python/lib/python3.11/site-packages/async_timeout/py.typed new file mode 100644 index 0000000..3b94f91 --- /dev/null +++ b/python/lib/python3.11/site-packages/async_timeout/py.typed @@ -0,0 +1 @@ +Placeholder diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA new file mode 100644 index 0000000..f1d7204 --- /dev/null +++ b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: beautifulsoup4 +Version: 4.12.2 +Summary: Screen-scraping library +Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/ +Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/ +Author-email: Leonard Richardson <leonardr@segfault.org> +License-Expression: MIT +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.6.0 +Requires-Dist: soupsieve>1.2 +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("<p>Some<b>bad<i>HTML") +>>> print(soup.prettify()) +<html> + <body> + <p> + Some + <b> + bad + <i> + HTML + </i> + </b> + </p> + </body> +</html> +>>> soup.find(text="bad") +'bad' +>>> soup.i +<i>HTML</i> +# +>>> soup = BeautifulSoup("<tag1>Some<tag2/>bad<tag3>XML", "xml") +# +>>> print(soup.prettify()) +<?xml version="1.0" encoding="utf-8"?> +<tag1> + Some + <tag2/> + bad + <tag3> + XML + </tag3> +</tag1> +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD similarity index 100% rename from lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD rename to python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL new file mode 100644 index 0000000..9d72767 --- /dev/null +++ b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.13.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS new file mode 100644 index 0000000..1f14fe0 --- /dev/null +++ b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore and Isaac Muse have made significant contributions to the +code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppänen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skyttä, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE new file mode 100644 index 0000000..08e3a9c --- /dev/null +++ b/python/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE @@ -0,0 +1,31 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + 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. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse diff --git a/python/lib/python3.11/site-packages/brotli.py b/python/lib/python3.11/site-packages/brotli.py new file mode 100644 index 0000000..d66966b --- /dev/null +++ b/python/lib/python3.11/site-packages/brotli.py @@ -0,0 +1,56 @@ +# Copyright 2016 The Brotli Authors. All rights reserved. +# +# Distributed under MIT license. +# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT + +"""Functions to compress and decompress data using the Brotli library.""" + +import _brotli + + +# The library version. +__version__ = _brotli.__version__ + +# The compression mode. +MODE_GENERIC = _brotli.MODE_GENERIC +MODE_TEXT = _brotli.MODE_TEXT +MODE_FONT = _brotli.MODE_FONT + +# The Compressor object. +Compressor = _brotli.Compressor + +# The Decompressor object. +Decompressor = _brotli.Decompressor + +# Compress a byte string. +def compress(string, mode=MODE_GENERIC, quality=11, lgwin=22, lgblock=0): + """Compress a byte string. + + Args: + string (bytes): The input data. + mode (int, optional): The compression mode can be MODE_GENERIC (default), + MODE_TEXT (for UTF-8 format text input) or MODE_FONT (for WOFF 2.0). + quality (int, optional): Controls the compression-speed vs compression- + density tradeoff. The higher the quality, the slower the compression. + Range is 0 to 11. Defaults to 11. + lgwin (int, optional): Base 2 logarithm of the sliding window size. Range + is 10 to 24. Defaults to 22. + lgblock (int, optional): Base 2 logarithm of the maximum input block size. + Range is 16 to 24. If set to 0, the value will be set based on the + quality. Defaults to 0. + + Returns: + The compressed byte string. + + Raises: + brotli.error: If arguments are invalid, or compressor fails. + """ + compressor = Compressor(mode=mode, quality=quality, lgwin=lgwin, + lgblock=lgblock) + return compressor.process(string) + compressor.finish() + +# Decompress a compressed byte string. +decompress = _brotli.decompress + +# Raised if compression or decompression fails. +error = _brotli.error diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt diff --git a/lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/dependency_links.txt b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt similarity index 100% rename from lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/dependency_links.txt rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt similarity index 100% rename from lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt diff --git a/lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/dependency_links.txt b/python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt similarity index 100% rename from lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/dependency_links.txt rename to python/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt diff --git a/python/lib/python3.11/site-packages/bs4/__init__.py b/python/lib/python3.11/site-packages/bs4/__init__.py new file mode 100644 index 0000000..3d2ab09 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/__init__.py @@ -0,0 +1,840 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.6 and up. It works better if lxml +and/or html5lib is installed. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.12.2" +__copyright__ = "Copyright (c) 2004-2023 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = ['BeautifulSoup'] + +from collections import Counter +import os +import re +import sys +import traceback +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError('You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3.') + +from .builder import ( + builder_registry, + ParserRejectedMarkup, + XMLParsedAsHTMLWarning, + HTMLParserTreeBuilder +) +from .dammit import UnicodeDammit +from .element import ( + CData, + Comment, + CSS, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + SoupStrainer, + Tag, + TemplateString, + ) + +# Define some custom warnings. +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + +class MarkupResemblesLocatorWarning(UserWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's <br> tag), call handle_starttag and then + handle_endtag. + """ + + # Since BeautifulSoup subclasses Tag, it's possible to treat it as + # a Tag with a .name. This name makes it clear the BeautifulSoup + # object isn't a real markup tag. + ROOT_TAG_NAME = '[document]' + + # If the end-user gives no indication which tree builder they + # want, look for one with these features. + DEFAULT_BUILDER_FEATURES = ['html', 'fast'] + + # A string containing all ASCII whitespace characters, used in + # endData() to detect data chunks that seem 'empty'. + ASCII_SPACES = '\x20\x0a\x09\x0c\x0d' + + NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n" + + def __init__(self, markup="", features=None, builder=None, + parse_only=None, from_encoding=None, exclude_encodings=None, + element_classes=None, **kwargs): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if 'convertEntities' in kwargs: + del kwargs['convertEntities'] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters.") + + if 'markupMassage' in kwargs: + del kwargs['markupMassage'] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage.") + + if 'smartQuotesTo' in kwargs: + del kwargs['smartQuotesTo'] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters.") + + if 'selfClosingTags' in kwargs: + del kwargs['selfClosingTags'] + warnings.warn( + "BS4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags.") + + if 'isHTML' in kwargs: + del kwargs['isHTML'] + warnings.warn( + "BS4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML.") + + def deprecated_argument(old_name, new_name): + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'has been renamed to "%s."' % (old_name, new_name), + DeprecationWarning, stacklevel=3 + ) + return kwargs.pop(old_name) + return None + + parse_only = parse_only or deprecated_argument( + "parseOnlyThese", "parse_only") + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding") + + if from_encoding and isinstance(markup, str): + warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.") + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + builder_class = builder_registry.lookup(*features) + if builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features)) + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + builder = builder_class(**kwargs) + if not original_builder and not ( + original_features == builder.NAME or + original_features in builder.ALTERNATE_NAMES + ) and markup: + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number= 1 + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type + ) + warnings.warn( + self.NO_PARSER_SPECIFIED_WARNING % values, + GuessedAtParserWarning, stacklevel=2 + ) + else: + if kwargs: + warnings.warn("Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`.") + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + elif len(markup) <= 256 and ( + (isinstance(markup, bytes) and not b'<' in markup) + or (isinstance(markup, str) and not '<' in markup) + ): + # Issue warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # since that is sometimes the intended behavior. + if not self._markup_is_url(markup): + self._markup_resembles_filename(markup) + + rejections = [] + success = False + for (self.markup, self.original_encoding, self.declared_html_encoding, + self.contains_replacement_characters) in ( + self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings)): + self.reset() + self.builder.initialize_soup(self) + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def _clone(self): + """Create a new BeautifulSoup object with the same TreeBuilder, + but not associated with any markup. + + This is the first step of the deepcopy process. + """ + clone = type(self)("", None, self.builder) + + # Keep track of the encoding of the original document, + # since we won't be parsing it again. + clone.original_encoding = self.original_encoding + return clone + + def __getstate__(self): + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if 'builder' in d and d['builder'] is not None and not self.builder.picklable: + d['builder'] = type(self.builder) + # Store the contents as a Unicode string. + d['contents'] = [] + d['markup'] = self.decode() + + # If _most_recent_element is present, it's a Tag object left + # over from initial parse. It might not be picklable and we + # don't need it. + if '_most_recent_element' in d: + del d['_most_recent_element'] + return d + + def __setstate__(self, state): + # If necessary, restore the TreeBuilder by looking it up. + self.__dict__ = state + if isinstance(self.builder, type): + self.builder = self.builder() + elif not self.builder: + # We don't know which builder was used to build this + # parse tree, so use a default we know is always available. + self.builder = HTMLParserTreeBuilder() + self.builder.soup = self + self.reset() + self._feed() + return state + + + @classmethod + def _decode_markup(cls, markup): + """Ensure `markup` is bytes so it's safe to send into warnings.warn. + + TODO: warnings.warn had this problem back in 2010 but it might not + anymore. + """ + if isinstance(markup, bytes): + decoded = markup.decode('utf-8', 'replace') + else: + decoded = markup + return decoded + + @classmethod + def _markup_is_url(cls, markup): + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string. + :return: Whether or not the markup resembles a URL + closely enough to justify a warning. + """ + if isinstance(markup, bytes): + space = b' ' + cant_start_with = (b"http:", b"https:") + elif isinstance(markup, str): + space = ' ' + cant_start_with = ("http:", "https:") + else: + return False + + if any(markup.startswith(prefix) for prefix in cant_start_with): + if not space in markup: + warnings.warn( + 'The input looks more like a URL than markup. You may want to use' + ' an HTTP client like requests to get the document behind' + ' the URL, and feed that document to Beautiful Soup.', + MarkupResemblesLocatorWarning, + stacklevel=3 + ) + return True + return False + + @classmethod + def _markup_resembles_filename(cls, markup): + """Error-handling method to raise a warning if incoming markup + resembles a filename. + + :param markup: A bytestring or string. + :return: Whether or not the markup resembles a filename + closely enough to justify a warning. + """ + path_characters = '/\\' + extensions = ['.html', '.htm', '.xml', '.xhtml', '.txt'] + if isinstance(markup, bytes): + path_characters = path_characters.encode("utf8") + extensions = [x.encode('utf8') for x in extensions] + filelike = False + if any(x in markup for x in path_characters): + filelike = True + else: + lower = markup.lower() + if any(lower.endswith(ext) for ext in extensions): + filelike = True + if filelike: + warnings.warn( + 'The input looks more like a filename than markup. You may' + ' want to open this file and pass the filehandle into' + ' Beautiful Soup.', + MarkupResemblesLocatorWarning, stacklevel=3 + ) + return True + return False + + def _feed(self): + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def reset(self): + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = 1 + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self._most_recent_element = None + self.pushTag(self) + + def new_tag(self, name, namespace=None, nsprefix=None, attrs={}, + sourceline=None, sourcepos=None, **kwattrs): + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of `kwattrs` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within `sourceline` where this + tag was (purportedly) found. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + kwattrs.update(attrs) + return self.element_classes.get(Tag, Tag)( + None, self.builder, name, namespace, nsprefix, kwattrs, + sourceline=sourceline, sourcepos=sourcepos + ) + + def string_container(self, base_class=None): + container = base_class or NavigableString + + # There may be a general override of NavigableString. + container = self.element_classes.get( + container, container + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string(self, s, subclass=None): + """Create a new NavigableString associated with this BeautifulSoup + object. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_before().") + + def insert_after(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self): + """Internal method called by _popToTag when a tag is closed.""" + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]: + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + #print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + """Internal method called by handle_starttag when a tag is opened.""" + #print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass=None): + """Method called by the TreeBuilder when the end of a data segment + occurs. + """ + if self.current_data: + current_data = ''.join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if '\n' in current_data: + current_data = '\n' + else: + current_data = ' ' + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if self.parse_only and len(self.tagStack) <= 1 and \ + (not self.parse_only.text or \ + not self.parse_only.search(current_data)): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed(self, o, parent=None, most_recent_element=None): + """Method called by the TreeBuilder to integrate an object into the parse tree.""" + if parent is None: + parent = self.currentTag + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el): + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + descendant = child._last_descendant(False) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + target = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag(self, name, nsprefix=None, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + """ + #print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if (name == t.name and nsprefix == t.prefix): + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None, + sourcepos=None, namespaces=None): + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param namespaces: A dictionary of all namespace prefix mappings + currently in scope in the document. + + If this method returns None, the tag was rejected by an active + SoupStrainer. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if (self.parse_only and len(self.tagStack) <= 1 + and (self.parse_only.text + or not self.parse_only.search_tag(name, attrs))): + return None + + tag = self.element_classes.get(Tag, Tag)( + self, self.builder, name, namespace, nsprefix, attrs, + self.currentTag, self._most_recent_element, + sourceline=sourceline, sourcepos=sourcepos, + namespaces=namespaces + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name, nsprefix=None): + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + """ + #print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data): + """Called by the tree builder when a chunk of textual data is encountered.""" + self.current_data.append(data) + + def decode(self, pretty_print=False, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal", iterator=None): + """Returns a string or Unicode representation of the parse tree + as an HTML or XML document. + + :param pretty_print: If this is True, indentation will be used to + make the document more readable. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = '' + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + eventual_encoding = None + if eventual_encoding != None: + encoding_part = ' encoding="%s"' % eventual_encoding + prefix = '<?xml version="1.0"%s?>\n' % encoding_part + else: + prefix = '' + if not pretty_print: + indent_level = None + else: + indent_level = 0 + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter, iterator) + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args, **kwargs): + kwargs['features'] = 'xml' + warnings.warn( + 'The BeautifulStoneSoup class is deprecated. Instead of using ' + 'it, pass features="xml" into the BeautifulSoup constructor.', + DeprecationWarning, stacklevel=2 + ) + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +class StopParsing(Exception): + """Exception raised by a TreeBuilder if it's unable to continue parsing.""" + pass + +class FeatureNotFound(ValueError): + """Exception raised by the BeautifulSoup constructor if no parser with the + requested features is found. + """ + pass + + +#If this file is run as a script, act as an HTML pretty-printer. +if __name__ == '__main__': + import sys + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/python/lib/python3.11/site-packages/bs4/builder/__init__.py b/python/lib/python3.11/site-packages/bs4/builder/__init__.py new file mode 100644 index 0000000..2e39745 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/builder/__init__.py @@ -0,0 +1,631 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import itertools +import re +import warnings +import sys +from bs4.element import ( + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + RubyParenthesisString, + RubyTextString, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re +) + +__all__ = [ + 'HTMLTreeBuilder', + 'SAXTreeBuilder', + 'TreeBuilder', + 'TreeBuilderRegistry', + ] + +# Some useful features for a TreeBuilder to have. +FAST = 'fast' +PERMISSIVE = 'permissive' +STRICT = 'strict' +XML = 'xml' +HTML = 'html' +HTML_5 = 'html5' + +class XMLParsedAsHTMLWarning(UserWarning): + """The warning issued when an HTML parser is used to parse + XML that is not XHTML. + """ + MESSAGE = """It looks like you're parsing an XML document using an HTML parser. If this really is an HTML document (maybe it's XHTML?), you can ignore or filter this warning. If it's XML, you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the lxml package installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor.""" + + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + def __init__(self): + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class): + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of Treebuilder. its .features + attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features): + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + features = list(features) + features.reverse() + candidates = None + candidate_set = None + while len(features) > 0: + feature = features.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + else: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection( + set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + +# The BeautifulSoup class will take feature lists from developers and use them +# to look up builders in this registry. +builder_registry = TreeBuilderRegistry() + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree.""" + + NAME = "[Unknown tree builder]" + ALTERNATE_NAMES = [] + features = [] + + is_xml = False + picklable = False + empty_element_tags = None # A tag will be considered an empty-element + # tag when and only when it has no contents. + + # A value for these tag/attribute combinations is a space- or + # comma-separated list of CDATA, rather than a single CDATA. + DEFAULT_CDATA_LIST_ATTRIBUTES = defaultdict(list) + + # Whitespace should be preserved inside these tags. + DEFAULT_PRESERVE_WHITESPACE_TAGS = set() + + # The textual contents of tags with these names should be + # instantiated with some class other than NavigableString. + DEFAULT_STRING_CONTAINERS = {} + + USE_DEFAULT = object() + + # Most parsers don't keep track of line numbers. + TRACKS_LINE_NUMBERS = False + + def __init__(self, multi_valued_attributes=USE_DEFAULT, + preserve_whitespace_tags=USE_DEFAULT, + store_line_numbers=USE_DEFAULT, + string_containers=USE_DEFAULT, + ): + """Constructor. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is `multi_valued_attributes`. + + :param preserve_whitespace_tags: A list of tags to treat + the way <pre> tags are treated in HTML. Tags in this list + are immune from pretty-printing; their contents will always be + output as-is. + + :param string_containers: A dictionary mapping tag names to + the classes that should be instantiated to contain the textual + contents of those tags. The default is to use NavigableString + for every tag, no matter what the name. You can override the + default by changing DEFAULT_STRING_CONTAINERS. + + :param store_line_numbers: If the parser keeps track of the + line numbers and positions of the original markup, that + information will, by default, be stored in each corresponding + `Tag` object. You can turn this off by passing + store_line_numbers=False. If the parser you're using doesn't + keep track of this information, then setting store_line_numbers=True + will do nothing. + """ + self.soup = None + if multi_valued_attributes is self.USE_DEFAULT: + multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES + self.cdata_list_attributes = multi_valued_attributes + if preserve_whitespace_tags is self.USE_DEFAULT: + preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS + self.preserve_whitespace_tags = preserve_whitespace_tags + if store_line_numbers == self.USE_DEFAULT: + store_line_numbers = self.TRACKS_LINE_NUMBERS + self.store_line_numbers = store_line_numbers + if string_containers == self.USE_DEFAULT: + string_containers = self.DEFAULT_STRING_CONTAINERS + self.string_containers = string_containers + + def initialize_soup(self, soup): + """The BeautifulSoup object has been initialized and is now + being associated with the TreeBuilder. + + :param soup: A BeautifulSoup object. + """ + self.soup = soup + + def reset(self): + """Do any work necessary to reset the underlying parser + for a new document. + + By default, this does nothing. + """ + pass + + def can_be_empty_element(self, tag_name): + """Might a tag with this name be an empty-element tag? + + The final markup may or may not actually present this tag as + self-closing. + + For instance: an HTMLBuilder does not consider a <p> tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty <p> tag + will be presented as "<p></p>", not "<p/>" or "<p>". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "<foo></foo>" will become "<foo/>", and "<foo>bar</foo>" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup): + """Run some incoming markup through some parsing process, + populating the `BeautifulSoup` object in self.soup. + + This method is not implemented in TreeBuilder; it must be + implemented in subclasses. + + :return: None. + """ + raise NotImplementedError() + + def prepare_markup(self, markup, user_specified_encoding=None, + document_declared_encoding=None, exclude_encodings=None): + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: Some markup -- probably a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment): + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty <head> tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of tests. + + :param fragment: A string -- fragment of HTML. + :return: A string -- a full HTML document. + """ + return fragment + + def set_up_substitutions(self, tag): + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :param tag: A `Tag` + :return: Whether or not a substitution was performed. + """ + return False + + def _replace_cdata_list_attribute_values(self, tag_name, attrs): + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + """ + if not attrs: + return attrs + if self.cdata_list_attributes: + universal = self.cdata_list_attributes.get('*', []) + tag_specific = self.cdata_list_attributes.get( + tag_name.lower(), None) + for attr in list(attrs.keys()): + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + value = attrs[attr] + if isinstance(value, str): + values = nonwhitespace_re.findall(value) + else: + # html5lib sometimes calls setAttributes twice + # for the same tag when rearranging the parse + # tree. On the second call the attribute value + # here is already a list. If this happens, + # leave the value alone rather than trying to + # split it again. + values = value + attrs[attr] = values + return attrs + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, but it demonstrates + how a simple TreeBuilder would work. + """ + + def feed(self, markup): + raise NotImplementedError() + + def close(self): + pass + + def startElement(self, name, attrs): + attrs = dict((key[1], value) for key, value in list(attrs.items())) + #print("Start %s, %r" % (name, attrs)) + self.soup.handle_starttag(name, attrs) + + def endElement(self, name): + #print("End %s" % name) + self.soup.handle_endtag(name) + + def startElementNS(self, nsTuple, nodeName, attrs): + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple, nodeName): + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + #handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix, nodeValue): + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix): + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content): + self.soup.handle_data(content) + + def startDocument(self): + pass + + def endDocument(self): + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML. + + Such as which tags are empty-element tags. + """ + + empty_element_tags = set([ + # These are from HTML5. + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', + + # These are from earlier versions of HTML and are removed in HTML5. + 'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer' + ]) + + # The HTML standard defines these as block-level elements. Beautiful + # Soup does not treat these elements differently from other elements, + # but it may do so eventually, and this information is available if + # you need to use it. + block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"]) + + # These HTML tags need special treatment so they can be + # represented by a string class other than NavigableString. + # + # For some of these tags, it's because the HTML standard defines + # an unusual content model for them. I made this list by going + # through the HTML spec + # (https://html.spec.whatwg.org/#metadata-content) and looking for + # "metadata content" elements that can contain strings. + # + # The Ruby tags (<rt> and <rp>) are here despite being normal + # "phrasing content" tags, because the content they contain is + # qualitatively different from other text in the document, and it + # can be useful to be able to distinguish it. + # + # TODO: Arguably <noscript> could go here but it seems + # qualitatively different from the other tags. + DEFAULT_STRING_CONTAINERS = { + 'rt' : RubyTextString, + 'rp' : RubyParenthesisString, + 'style': Stylesheet, + 'script': Script, + 'template': TemplateString, + } + + # The HTML standard defines these attributes as containing a + # space-separated list of values, not a single value. That is, + # class="foo bar" means that the 'class' attribute has two values, + # 'foo' and 'bar', not the single value 'foo bar'. When we + # encounter one of these attributes, we will parse its value into + # a list of values if possible. Upon output, the list will be + # converted back into a string. + DEFAULT_CDATA_LIST_ATTRIBUTES = { + "*" : ['class', 'accesskey', 'dropzone'], + "a" : ['rel', 'rev'], + "link" : ['rel', 'rev'], + "td" : ["headers"], + "th" : ["headers"], + "td" : ["headers"], + "form" : ["accept-charset"], + "object" : ["archive"], + + # These are HTML5 specific, as are *.accesskey and *.dropzone above. + "area" : ["rel"], + "icon" : ["sizes"], + "iframe" : ["sandbox"], + "output" : ["for"], + } + + DEFAULT_PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) + + def set_up_substitutions(self, tag): + """Replace the declared encoding in a <meta> tag with a placeholder, + to be substituted when the tag is output to a string. + + An HTML document may come in to Beautiful Soup as one + encoding, but exit in a different encoding, and the <meta> tag + needs to be changed to reflect this. + + :param tag: A `Tag` + :return: Whether or not a substitution was performed. + """ + # We are only interested in <meta> tags + if tag.name != 'meta': + return False + + http_equiv = tag.get('http-equiv') + content = tag.get('content') + charset = tag.get('charset') + + # We are interested in <meta> tags that say what encoding the + # document was originally in. This means HTML 5-style <meta> + # tags that provide the "charset" attribute. It also means + # HTML 4-style <meta> tags that provide the "content" + # attribute and have "http-equiv" set to "content-type". + # + # In both cases we will replace the value of the appropriate + # attribute with a standin object that can take on any + # encoding. + meta_encoding = None + if charset is not None: + # HTML 5 style: + # <meta charset="utf8"> + meta_encoding = charset + tag['charset'] = CharsetMetaAttributeValue(charset) + + elif (content is not None and http_equiv is not None + and http_equiv.lower() == 'content-type'): + # HTML 4 style: + # <meta http-equiv="content-type" content="text/html; charset=utf8"> + tag['content'] = ContentMetaAttributeValue(content) + + return (meta_encoding is not None) + +class DetectsXMLParsedAsHTML(object): + """A mixin class for any class (a TreeBuilder, or some class used by a + TreeBuilder) that's in a position to detect whether an XML + document is being incorrectly parsed as HTML, and issue an + appropriate warning. + + This requires being able to observe an incoming processing + instruction that might be an XML declaration, and also able to + observe tags as they're opened. If you can't do that for a given + TreeBuilder, there's a less reliable implementation based on + examining the raw markup. + """ + + # Regular expression for seeing if markup has an <html> tag. + LOOKS_LIKE_HTML = re.compile("<[^ +]html", re.I) + LOOKS_LIKE_HTML_B = re.compile(b"<[^ +]html", re.I) + + XML_PREFIX = '<?xml' + XML_PREFIX_B = b'<?xml' + + @classmethod + def warn_if_markup_looks_like_xml(cls, markup): + """Perform a check on some markup to see if it looks like XML + that's not XHTML. If so, issue a warning. + + This is much less reliable than doing the check while parsing, + but some of the tree builders can't do that. + + :return: True if the markup looks like non-XHTML XML, False + otherwise. + """ + if isinstance(markup, bytes): + prefix = cls.XML_PREFIX_B + looks_like_html = cls.LOOKS_LIKE_HTML_B + else: + prefix = cls.XML_PREFIX + looks_like_html = cls.LOOKS_LIKE_HTML + + if (markup is not None + and markup.startswith(prefix) + and not looks_like_html.search(markup[:500]) + ): + cls._warn() + return True + return False + + @classmethod + def _warn(cls): + """Issue a warning about XML being parsed as HTML.""" + warnings.warn( + XMLParsedAsHTMLWarning.MESSAGE, XMLParsedAsHTMLWarning + ) + + def _initialize_xml_detector(self): + """Call this method before parsing a document.""" + self._first_processing_instruction = None + self._root_tag = None + + def _document_might_be_xml(self, processing_instruction): + """Call this method when encountering an XML declaration, or a + "processing instruction" that might be an XML declaration. + """ + if (self._first_processing_instruction is not None + or self._root_tag is not None): + # The document has already started. Don't bother checking + # anymore. + return + + self._first_processing_instruction = processing_instruction + + # We won't know until we encounter the first tag whether or + # not this is actually a problem. + + def _root_tag_encountered(self, name): + """Call this when you encounter the document's root tag. + + This is where we actually check whether an XML document is + being incorrectly parsed as HTML, and issue the warning. + """ + if self._root_tag is not None: + # This method was incorrectly called multiple times. Do + # nothing. + return + + self._root_tag = name + if (name != 'html' and self._first_processing_instruction is not None + and self._first_processing_instruction.lower().startswith('xml ')): + # We encountered an XML declaration and then a tag other + # than 'html'. This is a reliable indicator that a + # non-XHTML document is being parsed as XML. + self._warn() + + +def register_treebuilders_from(module): + """Copy TreeBuilders from the given module into this module.""" + this_module = sys.modules[__name__] + for name in module.__all__: + obj = getattr(module, name) + + if issubclass(obj, TreeBuilder): + setattr(this_module, name, obj) + this_module.__all__.append(name) + # Register the builder while we're at it. + this_module.builder_registry.register(obj) + +class ParserRejectedMarkup(Exception): + """An Exception to be raised when the underlying parser simply + refuses to parse the given markup. + """ + def __init__(self, message_or_exception): + """Explain why the parser rejected the given markup, either + with a textual explanation or another exception. + """ + if isinstance(message_or_exception, Exception): + e = message_or_exception + message_or_exception = "%s: %s" % (e.__class__.__name__, str(e)) + super(ParserRejectedMarkup, self).__init__(message_or_exception) + +# Builders are registered in reverse order of priority, so that custom +# builder registrations will take precedence. In general, we want lxml +# to take precedence over html5lib, because it's faster. And we only +# want to use HTMLParser as a last resort. +from . import _htmlparser +register_treebuilders_from(_htmlparser) +try: + from . import _html5lib + register_treebuilders_from(_html5lib) +except ImportError: + # They don't have html5lib installed. + pass +try: + from . import _lxml + register_treebuilders_from(_lxml) +except ImportError: + # They don't have lxml installed. + pass diff --git a/python/lib/python3.11/site-packages/bs4/builder/_html5lib.py b/python/lib/python3.11/site-packages/bs4/builder/_html5lib.py new file mode 100644 index 0000000..dac2173 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/builder/_html5lib.py @@ -0,0 +1,479 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + 'HTML5TreeBuilder', + ] + +import warnings +import re +from bs4.builder import ( + DetectsXMLParsedAsHTML, + PERMISSIVE, + HTML, + HTML_5, + HTMLTreeBuilder, + ) +from bs4.element import ( + NamespacedAttribute, + nonwhitespace_re, +) +import html5lib +from html5lib.constants import ( + namespaces, + prefixes, + ) +from bs4.element import ( + Comment, + Doctype, + NavigableString, + Tag, + ) + +try: + # Pre-0.99999999 + from html5lib.treebuilders import _base as treebuilder_base + new_html5lib = False +except ImportError as e: + # 0.99999999 and up + from html5lib.treebuilders import base as treebuilder_base + new_html5lib = True + +class HTML5TreeBuilder(HTMLTreeBuilder): + """Use html5lib to build a tree. + + Note that this TreeBuilder does not support some features common + to HTML TreeBuilders. Some of these features could theoretically + be implemented, but at the very least it's quite difficult, + because html5lib moves the parse tree around as it's being built. + + * This TreeBuilder doesn't use different subclasses of NavigableString + based on the name of the tag in which the string was found. + + * You can't use a SoupStrainer to parse only part of a document. + """ + + NAME = "html5lib" + + features = [NAME, PERMISSIVE, HTML_5, HTML] + + # html5lib can tell us which line number and position in the + # original file is the source of an element. + TRACKS_LINE_NUMBERS = True + + def prepare_markup(self, markup, user_specified_encoding, + document_declared_encoding=None, exclude_encodings=None): + # Store the user-specified encoding for use later on. + self.user_specified_encoding = user_specified_encoding + + # document_declared_encoding and exclude_encodings aren't used + # ATM because the html5lib TreeBuilder doesn't use + # UnicodeDammit. + if exclude_encodings: + warnings.warn( + "You provided a value for exclude_encoding, but the html5lib tree builder doesn't support exclude_encoding.", + stacklevel=3 + ) + + # html5lib only parses HTML, so if it's given XML that's worth + # noting. + DetectsXMLParsedAsHTML.warn_if_markup_looks_like_xml(markup) + + yield (markup, None, None, False) + + # These methods are defined by Beautiful Soup. + def feed(self, markup): + if self.soup.parse_only is not None: + warnings.warn( + "You provided a value for parse_only, but the html5lib tree builder doesn't support parse_only. The entire document will be parsed.", + stacklevel=4 + ) + parser = html5lib.HTMLParser(tree=self.create_treebuilder) + self.underlying_builder.parser = parser + extra_kwargs = dict() + if not isinstance(markup, str): + if new_html5lib: + extra_kwargs['override_encoding'] = self.user_specified_encoding + else: + extra_kwargs['encoding'] = self.user_specified_encoding + doc = parser.parse(markup, **extra_kwargs) + + # Set the character encoding detected by the tokenizer. + if isinstance(markup, str): + # We need to special-case this because html5lib sets + # charEncoding to UTF-8 if it gets Unicode input. + doc.original_encoding = None + else: + original_encoding = parser.tokenizer.stream.charEncoding[0] + if not isinstance(original_encoding, str): + # In 0.99999999 and up, the encoding is an html5lib + # Encoding object. We want to use a string for compatibility + # with other tree builders. + original_encoding = original_encoding.name + doc.original_encoding = original_encoding + self.underlying_builder.parser = None + + def create_treebuilder(self, namespaceHTMLElements): + self.underlying_builder = TreeBuilderForHtml5lib( + namespaceHTMLElements, self.soup, + store_line_numbers=self.store_line_numbers + ) + return self.underlying_builder + + def test_fragment_to_document(self, fragment): + """See `TreeBuilder`.""" + return '<html><head></head><body>%s</body></html>' % fragment + + +class TreeBuilderForHtml5lib(treebuilder_base.TreeBuilder): + + def __init__(self, namespaceHTMLElements, soup=None, + store_line_numbers=True, **kwargs): + if soup: + self.soup = soup + else: + from bs4 import BeautifulSoup + # TODO: Why is the parser 'html.parser' here? To avoid an + # infinite loop? + self.soup = BeautifulSoup( + "", "html.parser", store_line_numbers=store_line_numbers, + **kwargs + ) + # TODO: What are **kwargs exactly? Should they be passed in + # here in addition to/instead of being passed to the BeautifulSoup + # constructor? + super(TreeBuilderForHtml5lib, self).__init__(namespaceHTMLElements) + + # This will be set later to an html5lib.html5parser.HTMLParser + # object, which we can use to track the current line number. + self.parser = None + self.store_line_numbers = store_line_numbers + + def documentClass(self): + self.soup.reset() + return Element(self.soup, self.soup, None) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = Doctype.for_name_and_ids(name, publicId, systemId) + self.soup.object_was_parsed(doctype) + + def elementClass(self, name, namespace): + kwargs = {} + if self.parser and self.store_line_numbers: + # This represents the point immediately after the end of the + # tag. We don't know when the tag started, but we do know + # where it ended -- the character just before this one. + sourceline, sourcepos = self.parser.tokenizer.stream.position() + kwargs['sourceline'] = sourceline + kwargs['sourcepos'] = sourcepos-1 + tag = self.soup.new_tag(name, namespace, **kwargs) + + return Element(tag, self.soup, namespace) + + def commentClass(self, data): + return TextNode(Comment(data), self.soup) + + def fragmentClass(self): + from bs4 import BeautifulSoup + # TODO: Why is the parser 'html.parser' here? To avoid an + # infinite loop? + self.soup = BeautifulSoup("", "html.parser") + self.soup.name = "[document_fragment]" + return Element(self.soup, self.soup, None) + + def appendChild(self, node): + # XXX This code is not covered by the BS4 tests. + self.soup.append(node.element) + + def getDocument(self): + return self.soup + + def getFragment(self): + return treebuilder_base.TreeBuilder.getFragment(self).element + + def testSerializer(self, element): + from bs4 import BeautifulSoup + rv = [] + doctype_re = re.compile(r'^(.*?)(?: PUBLIC "(.*?)"(?: "(.*?)")?| SYSTEM "(.*?)")?$') + + def serializeElement(element, indent=0): + if isinstance(element, BeautifulSoup): + pass + if isinstance(element, Doctype): + m = doctype_re.match(element) + if m: + name = m.group(1) + if m.lastindex > 1: + publicId = m.group(2) or "" + systemId = m.group(3) or m.group(4) or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif isinstance(element, Comment): + rv.append("|%s<!-- %s -->" % (' ' * indent, element)) + elif isinstance(element, NavigableString): + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + if element.namespace: + name = "%s %s" % (prefixes[element.namespace], + element.name) + else: + name = element.name + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.attrs: + attributes = [] + for name, value in list(element.attrs.items()): + if isinstance(name, NamespacedAttribute): + name = "%s %s" % (prefixes[name.namespace], name.name) + if isinstance(value, list): + value = " ".join(value) + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.children: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + +class AttrList(object): + def __init__(self, element): + self.element = element + self.attrs = dict(self.element.attrs) + def __iter__(self): + return list(self.attrs.items()).__iter__() + def __setitem__(self, name, value): + # If this attribute is a multi-valued attribute for this element, + # turn its value into a list. + list_attr = self.element.cdata_list_attributes or {} + if (name in list_attr.get('*', []) + or (self.element.name in list_attr + and name in list_attr.get(self.element.name, []))): + # A node that is being cloned may have already undergone + # this procedure. + if not isinstance(value, list): + value = nonwhitespace_re.findall(value) + self.element[name] = value + def items(self): + return list(self.attrs.items()) + def keys(self): + return list(self.attrs.keys()) + def __len__(self): + return len(self.attrs) + def __getitem__(self, name): + return self.attrs[name] + def __contains__(self, name): + return name in list(self.attrs.keys()) + + +class Element(treebuilder_base.Node): + def __init__(self, element, soup, namespace): + treebuilder_base.Node.__init__(self, element.name) + self.element = element + self.soup = soup + self.namespace = namespace + + def appendChild(self, node): + string_child = child = None + if isinstance(node, str): + # Some other piece of code decided to pass in a string + # instead of creating a TextElement object to contain the + # string. + string_child = child = node + elif isinstance(node, Tag): + # Some other piece of code decided to pass in a Tag + # instead of creating an Element object to contain the + # Tag. + child = node + elif node.element.__class__ == NavigableString: + string_child = child = node.element + node.parent = self + else: + child = node.element + node.parent = self + + if not isinstance(child, str) and child.parent is not None: + node.element.extract() + + if (string_child is not None and self.element.contents + and self.element.contents[-1].__class__ == NavigableString): + # We are appending a string onto another string. + # TODO This has O(n^2) performance, for input like + # "a</a>a</a>a</a>..." + old_element = self.element.contents[-1] + new_element = self.soup.new_string(old_element + string_child) + old_element.replace_with(new_element) + self.soup._most_recent_element = new_element + else: + if isinstance(node, str): + # Create a brand new NavigableString from this string. + child = self.soup.new_string(node) + + # Tell Beautiful Soup to act as if it parsed this element + # immediately after the parent's last descendant. (Or + # immediately after the parent, if it has no children.) + if self.element.contents: + most_recent_element = self.element._last_descendant(False) + elif self.element.next_element is not None: + # Something from further ahead in the parse tree is + # being inserted into this earlier element. This is + # very annoying because it means an expensive search + # for the last element in the tree. + most_recent_element = self.soup._last_descendant() + else: + most_recent_element = self.element + + self.soup.object_was_parsed( + child, parent=self.element, + most_recent_element=most_recent_element) + + def getAttributes(self): + if isinstance(self.element, Comment): + return {} + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes is not None and len(attributes) > 0: + converted_attributes = [] + for name, value in list(attributes.items()): + if isinstance(name, tuple): + new_name = NamespacedAttribute(*name) + del attributes[name] + attributes[new_name] = value + + self.soup.builder._replace_cdata_list_attribute_values( + self.name, attributes) + for name, value in list(attributes.items()): + self.element[name] = value + + # The attributes may contain variables that need substitution. + # Call set_up_substitutions manually. + # + # The Tag constructor called this method when the Tag was created, + # but we just set/changed the attributes, so call it again. + self.soup.builder.set_up_substitutions(self.element) + attributes = property(getAttributes, setAttributes) + + def insertText(self, data, insertBefore=None): + text = TextNode(self.soup.new_string(data), self.soup) + if insertBefore: + self.insertBefore(text, insertBefore) + else: + self.appendChild(text) + + def insertBefore(self, node, refNode): + index = self.element.index(refNode.element) + if (node.element.__class__ == NavigableString and self.element.contents + and self.element.contents[index-1].__class__ == NavigableString): + # (See comments in appendChild) + old_node = self.element.contents[index-1] + new_str = self.soup.new_string(old_node + node.element) + old_node.replace_with(new_str) + else: + self.element.insert(index, node.element) + node.parent = self + + def removeChild(self, node): + node.element.extract() + + def reparentChildren(self, new_parent): + """Move all of this tag's children into another tag.""" + # print("MOVE", self.element.contents) + # print("FROM", self.element) + # print("TO", new_parent.element) + + element = self.element + new_parent_element = new_parent.element + # Determine what this tag's next_element will be once all the children + # are removed. + final_next_element = element.next_sibling + + new_parents_last_descendant = new_parent_element._last_descendant(False, False) + if len(new_parent_element.contents) > 0: + # The new parent already contains children. We will be + # appending this tag's children to the end. + new_parents_last_child = new_parent_element.contents[-1] + new_parents_last_descendant_next_element = new_parents_last_descendant.next_element + else: + # The new parent contains no children. + new_parents_last_child = None + new_parents_last_descendant_next_element = new_parent_element.next_element + + to_append = element.contents + if len(to_append) > 0: + # Set the first child's previous_element and previous_sibling + # to elements within the new parent + first_child = to_append[0] + if new_parents_last_descendant is not None: + first_child.previous_element = new_parents_last_descendant + else: + first_child.previous_element = new_parent_element + first_child.previous_sibling = new_parents_last_child + if new_parents_last_descendant is not None: + new_parents_last_descendant.next_element = first_child + else: + new_parent_element.next_element = first_child + if new_parents_last_child is not None: + new_parents_last_child.next_sibling = first_child + + # Find the very last element being moved. It is now the + # parent's last descendant. It has no .next_sibling and + # its .next_element is whatever the previous last + # descendant had. + last_childs_last_descendant = to_append[-1]._last_descendant(False, True) + + last_childs_last_descendant.next_element = new_parents_last_descendant_next_element + if new_parents_last_descendant_next_element is not None: + # TODO: This code has no test coverage and I'm not sure + # how to get html5lib to go through this path, but it's + # just the other side of the previous line. + new_parents_last_descendant_next_element.previous_element = last_childs_last_descendant + last_childs_last_descendant.next_sibling = None + + for child in to_append: + child.parent = new_parent_element + new_parent_element.contents.append(child) + + # Now that this element has no children, change its .next_element. + element.contents = [] + element.next_element = final_next_element + + # print("DONE WITH MOVE") + # print("FROM", self.element) + # print("TO", new_parent_element) + + def cloneNode(self): + tag = self.soup.new_tag(self.element.name, self.namespace) + node = Element(tag, self.soup, self.namespace) + for key,value in self.attributes: + node.attributes[key] = value + return node + + def hasContent(self): + return self.element.contents + + def getNameTuple(self): + if self.namespace == None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + +class TextNode(Element): + def __init__(self, element, soup): + treebuilder_base.Node.__init__(self, None) + self.element = element + self.soup = soup + + def cloneNode(self): + raise NotImplementedError diff --git a/python/lib/python3.11/site-packages/bs4/builder/_htmlparser.py b/python/lib/python3.11/site-packages/bs4/builder/_htmlparser.py new file mode 100644 index 0000000..e065096 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/builder/_htmlparser.py @@ -0,0 +1,387 @@ +# encoding: utf-8 +"""Use the HTMLParser library to parse HTML files that aren't too bad.""" + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + 'HTMLParserTreeBuilder', + ] + +from html.parser import HTMLParser + +import sys +import warnings + +from bs4.element import ( + CData, + Comment, + Declaration, + Doctype, + ProcessingInstruction, + ) +from bs4.dammit import EntitySubstitution, UnicodeDammit + +from bs4.builder import ( + DetectsXMLParsedAsHTML, + ParserRejectedMarkup, + HTML, + HTMLTreeBuilder, + STRICT, + ) + + +HTMLPARSER = 'html.parser' + +class BeautifulSoupHTMLParser(HTMLParser, DetectsXMLParsedAsHTML): + """A subclass of the Python standard library's HTMLParser class, which + listens for HTMLParser events and translates them into calls + to Beautiful Soup's tree construction API. + """ + + # Strategies for handling duplicate attributes + IGNORE = 'ignore' + REPLACE = 'replace' + + def __init__(self, *args, **kwargs): + """Constructor. + + :param on_duplicate_attribute: A strategy for what to do if a + tag includes the same attribute more than once. Accepted + values are: REPLACE (replace earlier values with later + ones, the default), IGNORE (keep the earliest value + encountered), or a callable. A callable must take three + arguments: the dictionary of attributes already processed, + the name of the duplicate attribute, and the most recent value + encountered. + """ + self.on_duplicate_attribute = kwargs.pop( + 'on_duplicate_attribute', self.REPLACE + ) + HTMLParser.__init__(self, *args, **kwargs) + + # Keep a list of empty-element tags that were encountered + # without an explicit closing tag. If we encounter a closing tag + # of this type, we'll associate it with one of those entries. + # + # This isn't a stack because we don't care about the + # order. It's a list of closing tags we've already handled and + # will ignore, assuming they ever show up. + self.already_closed_empty_element = [] + + self._initialize_xml_detector() + + def error(self, message): + # NOTE: This method is required so long as Python 3.9 is + # supported. The corresponding code is removed from HTMLParser + # in 3.5, but not removed from ParserBase until 3.10. + # https://github.com/python/cpython/issues/76025 + # + # The original implementation turned the error into a warning, + # but in every case I discovered, this made HTMLParser + # immediately crash with an error message that was less + # helpful than the warning. The new implementation makes it + # more clear that html.parser just can't parse this + # markup. The 3.10 implementation does the same, though it + # raises AssertionError rather than calling a method. (We + # catch this error and wrap it in a ParserRejectedMarkup.) + raise ParserRejectedMarkup(message) + + def handle_startendtag(self, name, attrs): + """Handle an incoming empty-element tag. + + This is only called when the markup looks like <tag/>. + + :param name: Name of the tag. + :param attrs: Dictionary of the tag's attributes. + """ + # is_startend() tells handle_starttag not to close the tag + # just because its name matches a known empty-element tag. We + # know that this is an empty-element tag and we want to call + # handle_endtag ourselves. + tag = self.handle_starttag(name, attrs, handle_empty_element=False) + self.handle_endtag(name) + + def handle_starttag(self, name, attrs, handle_empty_element=True): + """Handle an opening tag, e.g. '<tag>' + + :param name: Name of the tag. + :param attrs: Dictionary of the tag's attributes. + :param handle_empty_element: True if this tag is known to be + an empty-element tag (i.e. there is not expected to be any + closing tag). + """ + # XXX namespace + attr_dict = {} + for key, value in attrs: + # Change None attribute values to the empty string + # for consistency with the other tree builders. + if value is None: + value = '' + if key in attr_dict: + # A single attribute shows up multiple times in this + # tag. How to handle it depends on the + # on_duplicate_attribute setting. + on_dupe = self.on_duplicate_attribute + if on_dupe == self.IGNORE: + pass + elif on_dupe in (None, self.REPLACE): + attr_dict[key] = value + else: + on_dupe(attr_dict, key, value) + else: + attr_dict[key] = value + attrvalue = '""' + #print("START", name) + sourceline, sourcepos = self.getpos() + tag = self.soup.handle_starttag( + name, None, None, attr_dict, sourceline=sourceline, + sourcepos=sourcepos + ) + if tag and tag.is_empty_element and handle_empty_element: + # Unlike other parsers, html.parser doesn't send separate end tag + # events for empty-element tags. (It's handled in + # handle_startendtag, but only if the original markup looked like + # <tag/>.) + # + # So we need to call handle_endtag() ourselves. Since we + # know the start event is identical to the end event, we + # don't want handle_endtag() to cross off any previous end + # events for tags of this name. + self.handle_endtag(name, check_already_closed=False) + + # But we might encounter an explicit closing tag for this tag + # later on. If so, we want to ignore it. + self.already_closed_empty_element.append(name) + + if self._root_tag is None: + self._root_tag_encountered(name) + + def handle_endtag(self, name, check_already_closed=True): + """Handle a closing tag, e.g. '</tag>' + + :param name: A tag name. + :param check_already_closed: True if this tag is expected to + be the closing portion of an empty-element tag, + e.g. '<tag></tag>'. + """ + #print("END", name) + if check_already_closed and name in self.already_closed_empty_element: + # This is a redundant end tag for an empty-element tag. + # We've already called handle_endtag() for it, so just + # check it off the list. + #print("ALREADY CLOSED", name) + self.already_closed_empty_element.remove(name) + else: + self.soup.handle_endtag(name) + + def handle_data(self, data): + """Handle some textual data that shows up between tags.""" + self.soup.handle_data(data) + + def handle_charref(self, name): + """Handle a numeric character reference by converting it to the + corresponding Unicode character and treating it as textual + data. + + :param name: Character number, possibly in hexadecimal. + """ + # TODO: This was originally a workaround for a bug in + # HTMLParser. (http://bugs.python.org/issue13633) The bug has + # been fixed, but removing this code still makes some + # Beautiful Soup tests fail. This needs investigation. + if name.startswith('x'): + real_name = int(name.lstrip('x'), 16) + elif name.startswith('X'): + real_name = int(name.lstrip('X'), 16) + else: + real_name = int(name) + + data = None + if real_name < 256: + # HTML numeric entities are supposed to reference Unicode + # code points, but sometimes they reference code points in + # some other encoding (ahem, Windows-1252). E.g. “ + # instead of É for LEFT DOUBLE QUOTATION MARK. This + # code tries to detect this situation and compensate. + for encoding in (self.soup.original_encoding, 'windows-1252'): + if not encoding: + continue + try: + data = bytearray([real_name]).decode(encoding) + except UnicodeDecodeError as e: + pass + if not data: + try: + data = chr(real_name) + except (ValueError, OverflowError) as e: + pass + data = data or "\N{REPLACEMENT CHARACTER}" + self.handle_data(data) + + def handle_entityref(self, name): + """Handle a named entity reference by converting it to the + corresponding Unicode character(s) and treating it as textual + data. + + :param name: Name of the entity reference. + """ + character = EntitySubstitution.HTML_ENTITY_TO_CHARACTER.get(name) + if character is not None: + data = character + else: + # If this were XML, it would be ambiguous whether "&foo" + # was an character entity reference with a missing + # semicolon or the literal string "&foo". Since this is + # HTML, we have a complete list of all character entity references, + # and this one wasn't found, so assume it's the literal string "&foo". + data = "&%s" % name + self.handle_data(data) + + def handle_comment(self, data): + """Handle an HTML comment. + + :param data: The text of the comment. + """ + self.soup.endData() + self.soup.handle_data(data) + self.soup.endData(Comment) + + def handle_decl(self, data): + """Handle a DOCTYPE declaration. + + :param data: The text of the declaration. + """ + self.soup.endData() + data = data[len("DOCTYPE "):] + self.soup.handle_data(data) + self.soup.endData(Doctype) + + def unknown_decl(self, data): + """Handle a declaration of unknown type -- probably a CDATA block. + + :param data: The text of the declaration. + """ + if data.upper().startswith('CDATA['): + cls = CData + data = data[len('CDATA['):] + else: + cls = Declaration + self.soup.endData() + self.soup.handle_data(data) + self.soup.endData(cls) + + def handle_pi(self, data): + """Handle a processing instruction. + + :param data: The text of the instruction. + """ + self.soup.endData() + self.soup.handle_data(data) + self._document_might_be_xml(data) + self.soup.endData(ProcessingInstruction) + + +class HTMLParserTreeBuilder(HTMLTreeBuilder): + """A Beautiful soup `TreeBuilder` that uses the `HTMLParser` parser, + found in the Python standard library. + """ + is_xml = False + picklable = True + NAME = HTMLPARSER + features = [NAME, HTML, STRICT] + + # The html.parser knows which line number and position in the + # original file is the source of an element. + TRACKS_LINE_NUMBERS = True + + def __init__(self, parser_args=None, parser_kwargs=None, **kwargs): + """Constructor. + + :param parser_args: Positional arguments to pass into + the BeautifulSoupHTMLParser constructor, once it's + invoked. + :param parser_kwargs: Keyword arguments to pass into + the BeautifulSoupHTMLParser constructor, once it's + invoked. + :param kwargs: Keyword arguments for the superclass constructor. + """ + # Some keyword arguments will be pulled out of kwargs and placed + # into parser_kwargs. + extra_parser_kwargs = dict() + for arg in ('on_duplicate_attribute',): + if arg in kwargs: + value = kwargs.pop(arg) + extra_parser_kwargs[arg] = value + super(HTMLParserTreeBuilder, self).__init__(**kwargs) + parser_args = parser_args or [] + parser_kwargs = parser_kwargs or {} + parser_kwargs.update(extra_parser_kwargs) + parser_kwargs['convert_charrefs'] = False + self.parser_args = (parser_args, parser_kwargs) + + def prepare_markup(self, markup, user_specified_encoding=None, + document_declared_encoding=None, exclude_encodings=None): + + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: Some markup -- probably a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + """ + if isinstance(markup, str): + # Parse Unicode as-is. + yield (markup, None, None, False) + return + + # Ask UnicodeDammit to sniff the most likely encoding. + + # This was provided by the end-user; treat it as a known + # definite encoding per the algorithm laid out in the HTML5 + # spec. (See the EncodingDetector class for details.) + known_definite_encodings = [user_specified_encoding] + + # This was found in the document; treat it as a slightly lower-priority + # user encoding. + user_encodings = [document_declared_encoding] + + try_encodings = [user_specified_encoding, document_declared_encoding] + dammit = UnicodeDammit( + markup, + known_definite_encodings=known_definite_encodings, + user_encodings=user_encodings, + is_html=True, + exclude_encodings=exclude_encodings + ) + yield (dammit.markup, dammit.original_encoding, + dammit.declared_html_encoding, + dammit.contains_replacement_characters) + + def feed(self, markup): + """Run some incoming markup through some parsing process, + populating the `BeautifulSoup` object in self.soup. + """ + args, kwargs = self.parser_args + parser = BeautifulSoupHTMLParser(*args, **kwargs) + parser.soup = self.soup + try: + parser.feed(markup) + except AssertionError as e: + # html.parser raises AssertionError in rare cases to + # indicate a fatal problem with the markup, especially + # when there's an error in the doctype declaration. + raise ParserRejectedMarkup(e) + parser.close() + parser.already_closed_empty_element = [] diff --git a/python/lib/python3.11/site-packages/bs4/builder/_lxml.py b/python/lib/python3.11/site-packages/bs4/builder/_lxml.py new file mode 100644 index 0000000..971c81e --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/builder/_lxml.py @@ -0,0 +1,386 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + 'LXMLTreeBuilderForXML', + 'LXMLTreeBuilder', + ] + +try: + from collections.abc import Callable # Python 3.6 +except ImportError as e: + from collections import Callable + +from io import BytesIO +from io import StringIO +from lxml import etree +from bs4.element import ( + Comment, + Doctype, + NamespacedAttribute, + ProcessingInstruction, + XMLProcessingInstruction, +) +from bs4.builder import ( + DetectsXMLParsedAsHTML, + FAST, + HTML, + HTMLTreeBuilder, + PERMISSIVE, + ParserRejectedMarkup, + TreeBuilder, + XML) +from bs4.dammit import EncodingDetector + +LXML = 'lxml' + +def _invert(d): + "Invert a dictionary." + return dict((v,k) for k, v in list(d.items())) + +class LXMLTreeBuilderForXML(TreeBuilder): + DEFAULT_PARSER_CLASS = etree.XMLParser + + is_xml = True + processing_instruction_class = XMLProcessingInstruction + + NAME = "lxml-xml" + ALTERNATE_NAMES = ["xml"] + + # Well, it's permissive by XML parser standards. + features = [NAME, LXML, XML, FAST, PERMISSIVE] + + CHUNK_SIZE = 512 + + # This namespace mapping is specified in the XML Namespace + # standard. + DEFAULT_NSMAPS = dict(xml='http://www.w3.org/XML/1998/namespace') + + DEFAULT_NSMAPS_INVERTED = _invert(DEFAULT_NSMAPS) + + # NOTE: If we parsed Element objects and looked at .sourceline, + # we'd be able to see the line numbers from the original document. + # But instead we build an XMLParser or HTMLParser object to serve + # as the target of parse messages, and those messages don't include + # line numbers. + # See: https://bugs.launchpad.net/lxml/+bug/1846906 + + def initialize_soup(self, soup): + """Let the BeautifulSoup object know about the standard namespace + mapping. + + :param soup: A `BeautifulSoup`. + """ + super(LXMLTreeBuilderForXML, self).initialize_soup(soup) + self._register_namespaces(self.DEFAULT_NSMAPS) + + def _register_namespaces(self, mapping): + """Let the BeautifulSoup object know about namespaces encountered + while parsing the document. + + This might be useful later on when creating CSS selectors. + + This will track (almost) all namespaces, even ones that were + only in scope for part of the document. If two namespaces have + the same prefix, only the first one encountered will be + tracked. Un-prefixed namespaces are not tracked. + + :param mapping: A dictionary mapping namespace prefixes to URIs. + """ + for key, value in list(mapping.items()): + # This is 'if key' and not 'if key is not None' because we + # don't track un-prefixed namespaces. Soupselect will + # treat an un-prefixed namespace as the default, which + # causes confusion in some cases. + if key and key not in self.soup._namespaces: + # Let the BeautifulSoup object know about a new namespace. + # If there are multiple namespaces defined with the same + # prefix, the first one in the document takes precedence. + self.soup._namespaces[key] = value + + def default_parser(self, encoding): + """Find the default parser for the given encoding. + + :param encoding: A string. + :return: Either a parser object or a class, which + will be instantiated with default arguments. + """ + if self._default_parser is not None: + return self._default_parser + return etree.XMLParser( + target=self, strip_cdata=False, recover=True, encoding=encoding) + + def parser_for(self, encoding): + """Instantiate an appropriate parser for the given encoding. + + :param encoding: A string. + :return: A parser object such as an `etree.XMLParser`. + """ + # Use the default parser. + parser = self.default_parser(encoding) + + if isinstance(parser, Callable): + # Instantiate the parser with default arguments + parser = parser( + target=self, strip_cdata=False, recover=True, encoding=encoding + ) + return parser + + def __init__(self, parser=None, empty_element_tags=None, **kwargs): + # TODO: Issue a warning if parser is present but not a + # callable, since that means there's no way to create new + # parsers for different encodings. + self._default_parser = parser + if empty_element_tags is not None: + self.empty_element_tags = set(empty_element_tags) + self.soup = None + self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED] + self.active_namespace_prefixes = [dict(self.DEFAULT_NSMAPS)] + super(LXMLTreeBuilderForXML, self).__init__(**kwargs) + + def _getNsTag(self, tag): + # Split the namespace URL out of a fully-qualified lxml tag + # name. Copied from lxml's src/lxml/sax.py. + if tag[0] == '{': + return tuple(tag[1:].split('}', 1)) + else: + return (None, tag) + + def prepare_markup(self, markup, user_specified_encoding=None, + exclude_encodings=None, + document_declared_encoding=None): + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + lxml really wants to get a bytestring and convert it to + Unicode itself. So instead of using UnicodeDammit to convert + the bytestring to Unicode using different encodings, this + implementation uses EncodingDetector to iterate over the + encodings, and tell lxml to try to parse the document as each + one in turn. + + :param markup: Some markup -- hopefully a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + """ + is_html = not self.is_xml + if is_html: + self.processing_instruction_class = ProcessingInstruction + # We're in HTML mode, so if we're given XML, that's worth + # noting. + DetectsXMLParsedAsHTML.warn_if_markup_looks_like_xml(markup) + else: + self.processing_instruction_class = XMLProcessingInstruction + + if isinstance(markup, str): + # We were given Unicode. Maybe lxml can parse Unicode on + # this system? + + # TODO: This is a workaround for + # https://bugs.launchpad.net/lxml/+bug/1948551. + # We can remove it once the upstream issue is fixed. + if len(markup) > 0 and markup[0] == u'\N{BYTE ORDER MARK}': + markup = markup[1:] + yield markup, None, document_declared_encoding, False + + if isinstance(markup, str): + # No, apparently not. Convert the Unicode to UTF-8 and + # tell lxml to parse it as UTF-8. + yield (markup.encode("utf8"), "utf8", + document_declared_encoding, False) + + # This was provided by the end-user; treat it as a known + # definite encoding per the algorithm laid out in the HTML5 + # spec. (See the EncodingDetector class for details.) + known_definite_encodings = [user_specified_encoding] + + # This was found in the document; treat it as a slightly lower-priority + # user encoding. + user_encodings = [document_declared_encoding] + detector = EncodingDetector( + markup, known_definite_encodings=known_definite_encodings, + user_encodings=user_encodings, is_html=is_html, + exclude_encodings=exclude_encodings + ) + for encoding in detector.encodings: + yield (detector.markup, encoding, document_declared_encoding, False) + + def feed(self, markup): + if isinstance(markup, bytes): + markup = BytesIO(markup) + elif isinstance(markup, str): + markup = StringIO(markup) + + # Call feed() at least once, even if the markup is empty, + # or the parser won't be initialized. + data = markup.read(self.CHUNK_SIZE) + try: + self.parser = self.parser_for(self.soup.original_encoding) + self.parser.feed(data) + while len(data) != 0: + # Now call feed() on the rest of the data, chunk by chunk. + data = markup.read(self.CHUNK_SIZE) + if len(data) != 0: + self.parser.feed(data) + self.parser.close() + except (UnicodeDecodeError, LookupError, etree.ParserError) as e: + raise ParserRejectedMarkup(e) + + def close(self): + self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED] + + def start(self, name, attrs, nsmap={}): + # Make sure attrs is a mutable dict--lxml may send an immutable dictproxy. + attrs = dict(attrs) + nsprefix = None + # Invert each namespace map as it comes in. + if len(nsmap) == 0 and len(self.nsmaps) > 1: + # There are no new namespaces for this tag, but + # non-default namespaces are in play, so we need a + # separate tag stack to know when they end. + self.nsmaps.append(None) + elif len(nsmap) > 0: + # A new namespace mapping has come into play. + + # First, Let the BeautifulSoup object know about it. + self._register_namespaces(nsmap) + + # Then, add it to our running list of inverted namespace + # mappings. + self.nsmaps.append(_invert(nsmap)) + + # The currently active namespace prefixes have + # changed. Calculate the new mapping so it can be stored + # with all Tag objects created while these prefixes are in + # scope. + current_mapping = dict(self.active_namespace_prefixes[-1]) + current_mapping.update(nsmap) + + # We should not track un-prefixed namespaces as we can only hold one + # and it will be recognized as the default namespace by soupsieve, + # which may be confusing in some situations. + if '' in current_mapping: + del current_mapping[''] + self.active_namespace_prefixes.append(current_mapping) + + # Also treat the namespace mapping as a set of attributes on the + # tag, so we can recreate it later. + attrs = attrs.copy() + for prefix, namespace in list(nsmap.items()): + attribute = NamespacedAttribute( + "xmlns", prefix, "http://www.w3.org/2000/xmlns/") + attrs[attribute] = namespace + + # Namespaces are in play. Find any attributes that came in + # from lxml with namespaces attached to their names, and + # turn then into NamespacedAttribute objects. + new_attrs = {} + for attr, value in list(attrs.items()): + namespace, attr = self._getNsTag(attr) + if namespace is None: + new_attrs[attr] = value + else: + nsprefix = self._prefix_for_namespace(namespace) + attr = NamespacedAttribute(nsprefix, attr, namespace) + new_attrs[attr] = value + attrs = new_attrs + + namespace, name = self._getNsTag(name) + nsprefix = self._prefix_for_namespace(namespace) + self.soup.handle_starttag( + name, namespace, nsprefix, attrs, + namespaces=self.active_namespace_prefixes[-1] + ) + + def _prefix_for_namespace(self, namespace): + """Find the currently active prefix for the given namespace.""" + if namespace is None: + return None + for inverted_nsmap in reversed(self.nsmaps): + if inverted_nsmap is not None and namespace in inverted_nsmap: + return inverted_nsmap[namespace] + return None + + def end(self, name): + self.soup.endData() + completed_tag = self.soup.tagStack[-1] + namespace, name = self._getNsTag(name) + nsprefix = None + if namespace is not None: + for inverted_nsmap in reversed(self.nsmaps): + if inverted_nsmap is not None and namespace in inverted_nsmap: + nsprefix = inverted_nsmap[namespace] + break + self.soup.handle_endtag(name, nsprefix) + if len(self.nsmaps) > 1: + # This tag, or one of its parents, introduced a namespace + # mapping, so pop it off the stack. + out_of_scope_nsmap = self.nsmaps.pop() + + if out_of_scope_nsmap is not None: + # This tag introduced a namespace mapping which is no + # longer in scope. Recalculate the currently active + # namespace prefixes. + self.active_namespace_prefixes.pop() + + def pi(self, target, data): + self.soup.endData() + data = target + ' ' + data + self.soup.handle_data(data) + self.soup.endData(self.processing_instruction_class) + + def data(self, content): + self.soup.handle_data(content) + + def doctype(self, name, pubid, system): + self.soup.endData() + doctype = Doctype.for_name_and_ids(name, pubid, system) + self.soup.object_was_parsed(doctype) + + def comment(self, content): + "Handle comments as Comment objects." + self.soup.endData() + self.soup.handle_data(content) + self.soup.endData(Comment) + + def test_fragment_to_document(self, fragment): + """See `TreeBuilder`.""" + return '<?xml version="1.0" encoding="utf-8"?>\n%s' % fragment + + +class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML): + + NAME = LXML + ALTERNATE_NAMES = ["lxml-html"] + + features = ALTERNATE_NAMES + [NAME, HTML, FAST, PERMISSIVE] + is_xml = False + processing_instruction_class = ProcessingInstruction + + def default_parser(self, encoding): + return etree.HTMLParser + + def feed(self, markup): + encoding = self.soup.original_encoding + try: + self.parser = self.parser_for(encoding) + self.parser.feed(markup) + self.parser.close() + except (UnicodeDecodeError, LookupError, etree.ParserError) as e: + raise ParserRejectedMarkup(e) + + + def test_fragment_to_document(self, fragment): + """See `TreeBuilder`.""" + return '<html><body>%s</body></html>' % fragment diff --git a/python/lib/python3.11/site-packages/bs4/css.py b/python/lib/python3.11/site-packages/bs4/css.py new file mode 100644 index 0000000..245ac60 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/css.py @@ -0,0 +1,280 @@ +"""Integration code for CSS selectors using Soup Sieve (pypi: soupsieve).""" + +import warnings +try: + import soupsieve +except ImportError as e: + soupsieve = None + warnings.warn( + 'The soupsieve package is not installed. CSS selectors cannot be used.' + ) + + +class CSS(object): + """A proxy object against the soupsieve library, to simplify its + CSS selector API. + + Acquire this object through the .css attribute on the + BeautifulSoup object, or on the Tag you want to use as the + starting point for a CSS selector. + + The main advantage of doing this is that the tag to be selected + against doesn't need to be explicitly specified in the function + calls, since it's already scoped to a tag. + """ + + def __init__(self, tag, api=soupsieve): + """Constructor. + + You don't need to instantiate this class yourself; instead, + access the .css attribute on the BeautifulSoup object, or on + the Tag you want to use as the starting point for your CSS + selector. + + :param tag: All CSS selectors will use this as their starting + point. + + :param api: A plug-in replacement for the soupsieve module, + designed mainly for use in tests. + """ + if api is None: + raise NotImplementedError( + "Cannot execute CSS selectors because the soupsieve package is not installed." + ) + self.api = api + self.tag = tag + + def escape(self, ident): + """Escape a CSS identifier. + + This is a simple wrapper around soupselect.escape(). See the + documentation for that function for more information. + """ + if soupsieve is None: + raise NotImplementedError( + "Cannot escape CSS identifiers because the soupsieve package is not installed." + ) + return self.api.escape(ident) + + def _ns(self, ns, select): + """Normalize a dictionary of namespaces.""" + if not isinstance(select, self.api.SoupSieve) and ns is None: + # If the selector is a precompiled pattern, it already has + # a namespace context compiled in, which cannot be + # replaced. + ns = self.tag._namespaces + return ns + + def _rs(self, results): + """Normalize a list of results to a Resultset. + + A ResultSet is more consistent with the rest of Beautiful + Soup's API, and ResultSet.__getattr__ has a helpful error + message if you try to treat a list of results as a single + result (a common mistake). + """ + # Import here to avoid circular import + from bs4.element import ResultSet + return ResultSet(None, results) + + def compile(self, select, namespaces=None, flags=0, **kwargs): + """Pre-compile a selector and return the compiled object. + + :param selector: A CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will use the prefixes it encountered while + parsing the document. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.compile() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.compile() method. + + :return: A precompiled selector object. + :rtype: soupsieve.SoupSieve + """ + return self.api.compile( + select, self._ns(namespaces, select), flags, **kwargs + ) + + def select_one(self, select, namespaces=None, flags=0, **kwargs): + """Perform a CSS selection operation on the current Tag and return the + first result. + + This uses the Soup Sieve library. For more information, see + that library's documentation for the soupsieve.select_one() + method. + + :param selector: A CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will use the prefixes it encountered while + parsing the document. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.select_one() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.select_one() method. + + :return: A Tag, or None if the selector has no match. + :rtype: bs4.element.Tag + + """ + return self.api.select_one( + select, self.tag, self._ns(namespaces, select), flags, **kwargs + ) + + def select(self, select, namespaces=None, limit=0, flags=0, **kwargs): + """Perform a CSS selection operation on the current Tag. + + This uses the Soup Sieve library. For more information, see + that library's documentation for the soupsieve.select() + method. + + :param selector: A string containing a CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will pass in the prefixes it encountered while + parsing the document. + + :param limit: After finding this number of results, stop looking. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.select() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.select() method. + + :return: A ResultSet of Tag objects. + :rtype: bs4.element.ResultSet + + """ + if limit is None: + limit = 0 + + return self._rs( + self.api.select( + select, self.tag, self._ns(namespaces, select), limit, flags, + **kwargs + ) + ) + + def iselect(self, select, namespaces=None, limit=0, flags=0, **kwargs): + """Perform a CSS selection operation on the current Tag. + + This uses the Soup Sieve library. For more information, see + that library's documentation for the soupsieve.iselect() + method. It is the same as select(), but it returns a generator + instead of a list. + + :param selector: A string containing a CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will pass in the prefixes it encountered while + parsing the document. + + :param limit: After finding this number of results, stop looking. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.iselect() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.iselect() method. + + :return: A generator + :rtype: types.GeneratorType + """ + return self.api.iselect( + select, self.tag, self._ns(namespaces, select), limit, flags, **kwargs + ) + + def closest(self, select, namespaces=None, flags=0, **kwargs): + """Find the Tag closest to this one that matches the given selector. + + This uses the Soup Sieve library. For more information, see + that library's documentation for the soupsieve.closest() + method. + + :param selector: A string containing a CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will pass in the prefixes it encountered while + parsing the document. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.closest() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.closest() method. + + :return: A Tag, or None if there is no match. + :rtype: bs4.Tag + + """ + return self.api.closest( + select, self.tag, self._ns(namespaces, select), flags, **kwargs + ) + + def match(self, select, namespaces=None, flags=0, **kwargs): + """Check whether this Tag matches the given CSS selector. + + This uses the Soup Sieve library. For more information, see + that library's documentation for the soupsieve.match() + method. + + :param: a CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will pass in the prefixes it encountered while + parsing the document. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.match() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.match() method. + + :return: True if this Tag matches the selector; False otherwise. + :rtype: bool + """ + return self.api.match( + select, self.tag, self._ns(namespaces, select), flags, **kwargs + ) + + def filter(self, select, namespaces=None, flags=0, **kwargs): + """Filter this Tag's direct children based on the given CSS selector. + + This uses the Soup Sieve library. It works the same way as + passing this Tag into that library's soupsieve.filter() + method. More information, for more information see the + documentation for soupsieve.filter(). + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will pass in the prefixes it encountered while + parsing the document. + + :param flags: Flags to be passed into Soup Sieve's + soupsieve.filter() method. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.filter() method. + + :return: A ResultSet of Tag objects. + :rtype: bs4.element.ResultSet + + """ + return self._rs( + self.api.filter( + select, self.tag, self._ns(namespaces, select), flags, **kwargs + ) + ) diff --git a/python/lib/python3.11/site-packages/bs4/dammit.py b/python/lib/python3.11/site-packages/bs4/dammit.py new file mode 100644 index 0000000..692433c --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/dammit.py @@ -0,0 +1,1095 @@ +# -*- coding: utf-8 -*- +"""Beautiful Soup bonus library: Unicode, Dammit + +This library converts a bytestream to Unicode through any means +necessary. It is heavily based on code from Mark Pilgrim's Universal +Feed Parser. It works best on XML and HTML, but it does not rewrite the +XML or HTML to reflect a new encoding; that's the tree builder's job. +""" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from html.entities import codepoint2name +from collections import defaultdict +import codecs +import re +import logging +import string + +# Import a library to autodetect character encodings. We'll support +# any of a number of libraries that all support the same API: +# +# * cchardet +# * chardet +# * charset-normalizer +chardet_module = None +try: + # PyPI package: cchardet + import cchardet as chardet_module +except ImportError: + try: + # Debian package: python-chardet + # PyPI package: chardet + import chardet as chardet_module + except ImportError: + try: + # PyPI package: charset-normalizer + import charset_normalizer as chardet_module + except ImportError: + # No chardet available. + chardet_module = None + +if chardet_module: + def chardet_dammit(s): + if isinstance(s, str): + return None + return chardet_module.detect(s)['encoding'] +else: + def chardet_dammit(s): + return None + +# Build bytestring and Unicode versions of regular expressions for finding +# a declared encoding inside an XML or HTML document. +xml_encoding = '^\\s*<\\?.*encoding=[\'"](.*?)[\'"].*\\?>' +html_meta = '<\\s*meta[^>]+charset\\s*=\\s*["\']?([^>]*?)[ /;\'">]' +encoding_res = dict() +encoding_res[bytes] = { + 'html' : re.compile(html_meta.encode("ascii"), re.I), + 'xml' : re.compile(xml_encoding.encode("ascii"), re.I), +} +encoding_res[str] = { + 'html' : re.compile(html_meta, re.I), + 'xml' : re.compile(xml_encoding, re.I) +} + +from html.entities import html5 + +class EntitySubstitution(object): + """The ability to substitute XML or HTML entities for certain characters.""" + + def _populate_class_variables(): + """Initialize variables used by this class to manage the plethora of + HTML5 named entities. + + This function returns a 3-tuple containing two dictionaries + and a regular expression: + + unicode_to_name - A mapping of Unicode strings like "⦨" to + entity names like "angmsdaa". When a single Unicode string has + multiple entity names, we try to choose the most commonly-used + name. + + name_to_unicode: A mapping of entity names like "angmsdaa" to + Unicode strings like "⦨". + + named_entity_re: A regular expression matching (almost) any + Unicode string that corresponds to an HTML5 named entity. + """ + unicode_to_name = {} + name_to_unicode = {} + + short_entities = set() + long_entities_by_first_character = defaultdict(set) + + for name_with_semicolon, character in sorted(html5.items()): + # "It is intentional, for legacy compatibility, that many + # code points have multiple character reference names. For + # example, some appear both with and without the trailing + # semicolon, or with different capitalizations." + # - https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references + # + # The parsers are in charge of handling (or not) character + # references with no trailing semicolon, so we remove the + # semicolon whenever it appears. + if name_with_semicolon.endswith(';'): + name = name_with_semicolon[:-1] + else: + name = name_with_semicolon + + # When parsing HTML, we want to recognize any known named + # entity and convert it to a sequence of Unicode + # characters. + if name not in name_to_unicode: + name_to_unicode[name] = character + + # When _generating_ HTML, we want to recognize special + # character sequences that _could_ be converted to named + # entities. + unicode_to_name[character] = name + + # We also need to build a regular expression that lets us + # _find_ those characters in output strings so we can + # replace them. + # + # This is tricky, for two reasons. + + if (len(character) == 1 and ord(character) < 128 + and character not in '<>&'): + # First, it would be annoying to turn single ASCII + # characters like | into named entities like + # |. The exceptions are <>&, which we _must_ + # turn into named entities to produce valid HTML. + continue + + if len(character) > 1 and all(ord(x) < 128 for x in character): + # We also do not want to turn _combinations_ of ASCII + # characters like 'fj' into named entities like 'fj', + # though that's more debateable. + continue + + # Second, some named entities have a Unicode value that's + # a subset of the Unicode value for some _other_ named + # entity. As an example, \u2267' is ≧, + # but '\u2267\u0338' is ≧̸. Our regular + # expression needs to match the first two characters of + # "\u2267\u0338foo", but only the first character of + # "\u2267foo". + # + # In this step, we build two sets of characters that + # _eventually_ need to go into the regular expression. But + # we won't know exactly what the regular expression needs + # to look like until we've gone through the entire list of + # named entities. + if len(character) == 1: + short_entities.add(character) + else: + long_entities_by_first_character[character[0]].add(character) + + # Now that we've been through the entire list of entities, we + # can create a regular expression that matches any of them. + particles = set() + for short in short_entities: + long_versions = long_entities_by_first_character[short] + if not long_versions: + particles.add(short) + else: + ignore = "".join([x[1] for x in long_versions]) + # This finds, e.g. \u2267 but only if it is _not_ + # followed by \u0338. + particles.add("%s(?![%s])" % (short, ignore)) + + for long_entities in list(long_entities_by_first_character.values()): + for long_entity in long_entities: + particles.add(long_entity) + + re_definition = "(%s)" % "|".join(particles) + + # If an entity shows up in both html5 and codepoint2name, it's + # likely that HTML5 gives it several different names, such as + # 'rsquo' and 'rsquor'. When converting Unicode characters to + # named entities, the codepoint2name name should take + # precedence where possible, since that's the more easily + # recognizable one. + for codepoint, name in list(codepoint2name.items()): + character = chr(codepoint) + unicode_to_name[character] = name + + return unicode_to_name, name_to_unicode, re.compile(re_definition) + (CHARACTER_TO_HTML_ENTITY, HTML_ENTITY_TO_CHARACTER, + CHARACTER_TO_HTML_ENTITY_RE) = _populate_class_variables() + + CHARACTER_TO_XML_ENTITY = { + "'": "apos", + '"': "quot", + "&": "amp", + "<": "lt", + ">": "gt", + } + + BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" + "&(?!#\\d+;|#x[0-9a-fA-F]+;|\\w+;)" + ")") + + AMPERSAND_OR_BRACKET = re.compile("([<>&])") + + @classmethod + def _substitute_html_entity(cls, matchobj): + """Used with a regular expression to substitute the + appropriate HTML entity for a special character string.""" + entity = cls.CHARACTER_TO_HTML_ENTITY.get(matchobj.group(0)) + return "&%s;" % entity + + @classmethod + def _substitute_xml_entity(cls, matchobj): + """Used with a regular expression to substitute the + appropriate XML entity for a special character string.""" + entity = cls.CHARACTER_TO_XML_ENTITY[matchobj.group(0)] + return "&%s;" % entity + + @classmethod + def quoted_attribute_value(self, value): + """Make a value into a quoted XML attribute, possibly escaping it. + + Most strings will be quoted using double quotes. + + Bob's Bar -> "Bob's Bar" + + If a string contains double quotes, it will be quoted using + single quotes. + + Welcome to "my bar" -> 'Welcome to "my bar"' + + If a string contains both single and double quotes, the + double quotes will be escaped, and the string will be quoted + using double quotes. + + Welcome to "Bob's Bar" -> "Welcome to "Bob's bar" + """ + quote_with = '"' + if '"' in value: + if "'" in value: + # The string contains both single and double + # quotes. Turn the double quotes into + # entities. We quote the double quotes rather than + # the single quotes because the entity name is + # """ whether this is HTML or XML. If we + # quoted the single quotes, we'd have to decide + # between ' and &squot;. + replace_with = """ + value = value.replace('"', replace_with) + else: + # There are double quotes but no single quotes. + # We can use single quotes to quote the attribute. + quote_with = "'" + return quote_with + value + quote_with + + @classmethod + def substitute_xml(cls, value, make_quoted_attribute=False): + """Substitute XML entities for special XML characters. + + :param value: A string to be substituted. The less-than sign + will become <, the greater-than sign will become >, + and any ampersands will become &. If you want ampersands + that appear to be part of an entity definition to be left + alone, use substitute_xml_containing_entities() instead. + + :param make_quoted_attribute: If True, then the string will be + quoted, as befits an attribute value. + """ + # Escape angle brackets and ampersands. + value = cls.AMPERSAND_OR_BRACKET.sub( + cls._substitute_xml_entity, value) + + if make_quoted_attribute: + value = cls.quoted_attribute_value(value) + return value + + @classmethod + def substitute_xml_containing_entities( + cls, value, make_quoted_attribute=False): + """Substitute XML entities for special XML characters. + + :param value: A string to be substituted. The less-than sign will + become <, the greater-than sign will become >, and any + ampersands that are not part of an entity defition will + become &. + + :param make_quoted_attribute: If True, then the string will be + quoted, as befits an attribute value. + """ + # Escape angle brackets, and ampersands that aren't part of + # entities. + value = cls.BARE_AMPERSAND_OR_BRACKET.sub( + cls._substitute_xml_entity, value) + + if make_quoted_attribute: + value = cls.quoted_attribute_value(value) + return value + + @classmethod + def substitute_html(cls, s): + """Replace certain Unicode characters with named HTML entities. + + This differs from data.encode(encoding, 'xmlcharrefreplace') + in that the goal is to make the result more readable (to those + with ASCII displays) rather than to recover from + errors. There's absolutely nothing wrong with a UTF-8 string + containg a LATIN SMALL LETTER E WITH ACUTE, but replacing that + character with "é" will make it more readable to some + people. + + :param s: A Unicode string. + """ + return cls.CHARACTER_TO_HTML_ENTITY_RE.sub( + cls._substitute_html_entity, s) + + +class EncodingDetector: + """Suggests a number of possible encodings for a bytestring. + + Order of precedence: + + 1. Encodings you specifically tell EncodingDetector to try first + (the known_definite_encodings argument to the constructor). + + 2. An encoding determined by sniffing the document's byte-order mark. + + 3. Encodings you specifically tell EncodingDetector to try if + byte-order mark sniffing fails (the user_encodings argument to the + constructor). + + 4. An encoding declared within the bytestring itself, either in an + XML declaration (if the bytestring is to be interpreted as an XML + document), or in a <meta> tag (if the bytestring is to be + interpreted as an HTML document.) + + 5. An encoding detected through textual analysis by chardet, + cchardet, or a similar external library. + + 4. UTF-8. + + 5. Windows-1252. + + """ + def __init__(self, markup, known_definite_encodings=None, + is_html=False, exclude_encodings=None, + user_encodings=None, override_encodings=None): + """Constructor. + + :param markup: Some markup in an unknown encoding. + + :param known_definite_encodings: When determining the encoding + of `markup`, these encodings will be tried first, in + order. In HTML terms, this corresponds to the "known + definite encoding" step defined here: + https://html.spec.whatwg.org/multipage/parsing.html#parsing-with-a-known-character-encoding + + :param user_encodings: These encodings will be tried after the + `known_definite_encodings` have been tried and failed, and + after an attempt to sniff the encoding by looking at a + byte order mark has failed. In HTML terms, this + corresponds to the step "user has explicitly instructed + the user agent to override the document's character + encoding", defined here: + https://html.spec.whatwg.org/multipage/parsing.html#determining-the-character-encoding + + :param override_encodings: A deprecated alias for + known_definite_encodings. Any encodings here will be tried + immediately after the encodings in + known_definite_encodings. + + :param is_html: If True, this markup is considered to be + HTML. Otherwise it's assumed to be XML. + + :param exclude_encodings: These encodings will not be tried, + even if they otherwise would be. + + """ + self.known_definite_encodings = list(known_definite_encodings or []) + if override_encodings: + self.known_definite_encodings += override_encodings + self.user_encodings = user_encodings or [] + exclude_encodings = exclude_encodings or [] + self.exclude_encodings = set([x.lower() for x in exclude_encodings]) + self.chardet_encoding = None + self.is_html = is_html + self.declared_encoding = None + + # First order of business: strip a byte-order mark. + self.markup, self.sniffed_encoding = self.strip_byte_order_mark(markup) + + def _usable(self, encoding, tried): + """Should we even bother to try this encoding? + + :param encoding: Name of an encoding. + :param tried: Encodings that have already been tried. This will be modified + as a side effect. + """ + if encoding is not None: + encoding = encoding.lower() + if encoding in self.exclude_encodings: + return False + if encoding not in tried: + tried.add(encoding) + return True + return False + + @property + def encodings(self): + """Yield a number of encodings that might work for this markup. + + :yield: A sequence of strings. + """ + tried = set() + + # First, try the known definite encodings + for e in self.known_definite_encodings: + if self._usable(e, tried): + yield e + + # Did the document originally start with a byte-order mark + # that indicated its encoding? + if self._usable(self.sniffed_encoding, tried): + yield self.sniffed_encoding + + # Sniffing the byte-order mark did nothing; try the user + # encodings. + for e in self.user_encodings: + if self._usable(e, tried): + yield e + + # Look within the document for an XML or HTML encoding + # declaration. + if self.declared_encoding is None: + self.declared_encoding = self.find_declared_encoding( + self.markup, self.is_html) + if self._usable(self.declared_encoding, tried): + yield self.declared_encoding + + # Use third-party character set detection to guess at the + # encoding. + if self.chardet_encoding is None: + self.chardet_encoding = chardet_dammit(self.markup) + if self._usable(self.chardet_encoding, tried): + yield self.chardet_encoding + + # As a last-ditch effort, try utf-8 and windows-1252. + for e in ('utf-8', 'windows-1252'): + if self._usable(e, tried): + yield e + + @classmethod + def strip_byte_order_mark(cls, data): + """If a byte-order mark is present, strip it and return the encoding it implies. + + :param data: Some markup. + :return: A 2-tuple (modified data, implied encoding) + """ + encoding = None + if isinstance(data, str): + # Unicode data cannot have a byte-order mark. + return data, encoding + if (len(data) >= 4) and (data[:2] == b'\xfe\xff') \ + and (data[2:4] != '\x00\x00'): + encoding = 'utf-16be' + data = data[2:] + elif (len(data) >= 4) and (data[:2] == b'\xff\xfe') \ + and (data[2:4] != '\x00\x00'): + encoding = 'utf-16le' + data = data[2:] + elif data[:3] == b'\xef\xbb\xbf': + encoding = 'utf-8' + data = data[3:] + elif data[:4] == b'\x00\x00\xfe\xff': + encoding = 'utf-32be' + data = data[4:] + elif data[:4] == b'\xff\xfe\x00\x00': + encoding = 'utf-32le' + data = data[4:] + return data, encoding + + @classmethod + def find_declared_encoding(cls, markup, is_html=False, search_entire_document=False): + """Given a document, tries to find its declared encoding. + + An XML encoding is declared at the beginning of the document. + + An HTML encoding is declared in a <meta> tag, hopefully near the + beginning of the document. + + :param markup: Some markup. + :param is_html: If True, this markup is considered to be HTML. Otherwise + it's assumed to be XML. + :param search_entire_document: Since an encoding is supposed to declared near the beginning + of the document, most of the time it's only necessary to search a few kilobytes of data. + Set this to True to force this method to search the entire document. + """ + if search_entire_document: + xml_endpos = html_endpos = len(markup) + else: + xml_endpos = 1024 + html_endpos = max(2048, int(len(markup) * 0.05)) + + if isinstance(markup, bytes): + res = encoding_res[bytes] + else: + res = encoding_res[str] + + xml_re = res['xml'] + html_re = res['html'] + declared_encoding = None + declared_encoding_match = xml_re.search(markup, endpos=xml_endpos) + if not declared_encoding_match and is_html: + declared_encoding_match = html_re.search(markup, endpos=html_endpos) + if declared_encoding_match is not None: + declared_encoding = declared_encoding_match.groups()[0] + if declared_encoding: + if isinstance(declared_encoding, bytes): + declared_encoding = declared_encoding.decode('ascii', 'replace') + return declared_encoding.lower() + return None + +class UnicodeDammit: + """A class for detecting the encoding of a *ML document and + converting it to a Unicode string. If the source encoding is + windows-1252, can replace MS smart quotes with their HTML or XML + equivalents.""" + + # This dictionary maps commonly seen values for "charset" in HTML + # meta tags to the corresponding Python codec names. It only covers + # values that aren't in Python's aliases and can't be determined + # by the heuristics in find_codec. + CHARSET_ALIASES = {"macintosh": "mac-roman", + "x-sjis": "shift-jis"} + + ENCODINGS_WITH_SMART_QUOTES = [ + "windows-1252", + "iso-8859-1", + "iso-8859-2", + ] + + def __init__(self, markup, known_definite_encodings=[], + smart_quotes_to=None, is_html=False, exclude_encodings=[], + user_encodings=None, override_encodings=None + ): + """Constructor. + + :param markup: A bytestring representing markup in an unknown encoding. + + :param known_definite_encodings: When determining the encoding + of `markup`, these encodings will be tried first, in + order. In HTML terms, this corresponds to the "known + definite encoding" step defined here: + https://html.spec.whatwg.org/multipage/parsing.html#parsing-with-a-known-character-encoding + + :param user_encodings: These encodings will be tried after the + `known_definite_encodings` have been tried and failed, and + after an attempt to sniff the encoding by looking at a + byte order mark has failed. In HTML terms, this + corresponds to the step "user has explicitly instructed + the user agent to override the document's character + encoding", defined here: + https://html.spec.whatwg.org/multipage/parsing.html#determining-the-character-encoding + + :param override_encodings: A deprecated alias for + known_definite_encodings. Any encodings here will be tried + immediately after the encodings in + known_definite_encodings. + + :param smart_quotes_to: By default, Microsoft smart quotes will, like all other characters, be converted + to Unicode characters. Setting this to 'ascii' will convert them to ASCII quotes instead. + Setting it to 'xml' will convert them to XML entity references, and setting it to 'html' + will convert them to HTML entity references. + :param is_html: If True, this markup is considered to be HTML. Otherwise + it's assumed to be XML. + :param exclude_encodings: These encodings will not be considered, even + if the sniffing code thinks they might make sense. + + """ + self.smart_quotes_to = smart_quotes_to + self.tried_encodings = [] + self.contains_replacement_characters = False + self.is_html = is_html + self.log = logging.getLogger(__name__) + self.detector = EncodingDetector( + markup, known_definite_encodings, is_html, exclude_encodings, + user_encodings, override_encodings + ) + + # Short-circuit if the data is in Unicode to begin with. + if isinstance(markup, str) or markup == '': + self.markup = markup + self.unicode_markup = str(markup) + self.original_encoding = None + return + + # The encoding detector may have stripped a byte-order mark. + # Use the stripped markup from this point on. + self.markup = self.detector.markup + + u = None + for encoding in self.detector.encodings: + markup = self.detector.markup + u = self._convert_from(encoding) + if u is not None: + break + + if not u: + # None of the encodings worked. As an absolute last resort, + # try them again with character replacement. + + for encoding in self.detector.encodings: + if encoding != "ascii": + u = self._convert_from(encoding, "replace") + if u is not None: + self.log.warning( + "Some characters could not be decoded, and were " + "replaced with REPLACEMENT CHARACTER." + ) + self.contains_replacement_characters = True + break + + # If none of that worked, we could at this point force it to + # ASCII, but that would destroy so much data that I think + # giving up is better. + self.unicode_markup = u + if not u: + self.original_encoding = None + + def _sub_ms_char(self, match): + """Changes a MS smart quote character to an XML or HTML + entity, or an ASCII character.""" + orig = match.group(1) + if self.smart_quotes_to == 'ascii': + sub = self.MS_CHARS_TO_ASCII.get(orig).encode() + else: + sub = self.MS_CHARS.get(orig) + if type(sub) == tuple: + if self.smart_quotes_to == 'xml': + sub = '&#x'.encode() + sub[1].encode() + ';'.encode() + else: + sub = '&'.encode() + sub[0].encode() + ';'.encode() + else: + sub = sub.encode() + return sub + + def _convert_from(self, proposed, errors="strict"): + """Attempt to convert the markup to the proposed encoding. + + :param proposed: The name of a character encoding. + """ + proposed = self.find_codec(proposed) + if not proposed or (proposed, errors) in self.tried_encodings: + return None + self.tried_encodings.append((proposed, errors)) + markup = self.markup + # Convert smart quotes to HTML if coming from an encoding + # that might have them. + if (self.smart_quotes_to is not None + and proposed in self.ENCODINGS_WITH_SMART_QUOTES): + smart_quotes_re = b"([\x80-\x9f])" + smart_quotes_compiled = re.compile(smart_quotes_re) + markup = smart_quotes_compiled.sub(self._sub_ms_char, markup) + + try: + #print("Trying to convert document to %s (errors=%s)" % ( + # proposed, errors)) + u = self._to_unicode(markup, proposed, errors) + self.markup = u + self.original_encoding = proposed + except Exception as e: + #print("That didn't work!") + #print(e) + return None + #print("Correct encoding: %s" % proposed) + return self.markup + + def _to_unicode(self, data, encoding, errors="strict"): + """Given a string and its encoding, decodes the string into Unicode. + + :param encoding: The name of an encoding. + """ + return str(data, encoding, errors) + + @property + def declared_html_encoding(self): + """If the markup is an HTML document, returns the encoding declared _within_ + the document. + """ + if not self.is_html: + return None + return self.detector.declared_encoding + + def find_codec(self, charset): + """Convert the name of a character set to a codec name. + + :param charset: The name of a character set. + :return: The name of a codec. + """ + value = (self._codec(self.CHARSET_ALIASES.get(charset, charset)) + or (charset and self._codec(charset.replace("-", ""))) + or (charset and self._codec(charset.replace("-", "_"))) + or (charset and charset.lower()) + or charset + ) + if value: + return value.lower() + return None + + def _codec(self, charset): + if not charset: + return charset + codec = None + try: + codecs.lookup(charset) + codec = charset + except (LookupError, ValueError): + pass + return codec + + + # A partial mapping of ISO-Latin-1 to HTML entities/XML numeric entities. + MS_CHARS = {b'\x80': ('euro', '20AC'), + b'\x81': ' ', + b'\x82': ('sbquo', '201A'), + b'\x83': ('fnof', '192'), + b'\x84': ('bdquo', '201E'), + b'\x85': ('hellip', '2026'), + b'\x86': ('dagger', '2020'), + b'\x87': ('Dagger', '2021'), + b'\x88': ('circ', '2C6'), + b'\x89': ('permil', '2030'), + b'\x8A': ('Scaron', '160'), + b'\x8B': ('lsaquo', '2039'), + b'\x8C': ('OElig', '152'), + b'\x8D': '?', + b'\x8E': ('#x17D', '17D'), + b'\x8F': '?', + b'\x90': '?', + b'\x91': ('lsquo', '2018'), + b'\x92': ('rsquo', '2019'), + b'\x93': ('ldquo', '201C'), + b'\x94': ('rdquo', '201D'), + b'\x95': ('bull', '2022'), + b'\x96': ('ndash', '2013'), + b'\x97': ('mdash', '2014'), + b'\x98': ('tilde', '2DC'), + b'\x99': ('trade', '2122'), + b'\x9a': ('scaron', '161'), + b'\x9b': ('rsaquo', '203A'), + b'\x9c': ('oelig', '153'), + b'\x9d': '?', + b'\x9e': ('#x17E', '17E'), + b'\x9f': ('Yuml', ''),} + + # A parochial partial mapping of ISO-Latin-1 to ASCII. Contains + # horrors like stripping diacritical marks to turn á into a, but also + # contains non-horrors like turning “ into ". + MS_CHARS_TO_ASCII = { + b'\x80' : 'EUR', + b'\x81' : ' ', + b'\x82' : ',', + b'\x83' : 'f', + b'\x84' : ',,', + b'\x85' : '...', + b'\x86' : '+', + b'\x87' : '++', + b'\x88' : '^', + b'\x89' : '%', + b'\x8a' : 'S', + b'\x8b' : '<', + b'\x8c' : 'OE', + b'\x8d' : '?', + b'\x8e' : 'Z', + b'\x8f' : '?', + b'\x90' : '?', + b'\x91' : "'", + b'\x92' : "'", + b'\x93' : '"', + b'\x94' : '"', + b'\x95' : '*', + b'\x96' : '-', + b'\x97' : '--', + b'\x98' : '~', + b'\x99' : '(TM)', + b'\x9a' : 's', + b'\x9b' : '>', + b'\x9c' : 'oe', + b'\x9d' : '?', + b'\x9e' : 'z', + b'\x9f' : 'Y', + b'\xa0' : ' ', + b'\xa1' : '!', + b'\xa2' : 'c', + b'\xa3' : 'GBP', + b'\xa4' : '$', #This approximation is especially parochial--this is the + #generic currency symbol. + b'\xa5' : 'YEN', + b'\xa6' : '|', + b'\xa7' : 'S', + b'\xa8' : '..', + b'\xa9' : '', + b'\xaa' : '(th)', + b'\xab' : '<<', + b'\xac' : '!', + b'\xad' : ' ', + b'\xae' : '(R)', + b'\xaf' : '-', + b'\xb0' : 'o', + b'\xb1' : '+-', + b'\xb2' : '2', + b'\xb3' : '3', + b'\xb4' : ("'", 'acute'), + b'\xb5' : 'u', + b'\xb6' : 'P', + b'\xb7' : '*', + b'\xb8' : ',', + b'\xb9' : '1', + b'\xba' : '(th)', + b'\xbb' : '>>', + b'\xbc' : '1/4', + b'\xbd' : '1/2', + b'\xbe' : '3/4', + b'\xbf' : '?', + b'\xc0' : 'A', + b'\xc1' : 'A', + b'\xc2' : 'A', + b'\xc3' : 'A', + b'\xc4' : 'A', + b'\xc5' : 'A', + b'\xc6' : 'AE', + b'\xc7' : 'C', + b'\xc8' : 'E', + b'\xc9' : 'E', + b'\xca' : 'E', + b'\xcb' : 'E', + b'\xcc' : 'I', + b'\xcd' : 'I', + b'\xce' : 'I', + b'\xcf' : 'I', + b'\xd0' : 'D', + b'\xd1' : 'N', + b'\xd2' : 'O', + b'\xd3' : 'O', + b'\xd4' : 'O', + b'\xd5' : 'O', + b'\xd6' : 'O', + b'\xd7' : '*', + b'\xd8' : 'O', + b'\xd9' : 'U', + b'\xda' : 'U', + b'\xdb' : 'U', + b'\xdc' : 'U', + b'\xdd' : 'Y', + b'\xde' : 'b', + b'\xdf' : 'B', + b'\xe0' : 'a', + b'\xe1' : 'a', + b'\xe2' : 'a', + b'\xe3' : 'a', + b'\xe4' : 'a', + b'\xe5' : 'a', + b'\xe6' : 'ae', + b'\xe7' : 'c', + b'\xe8' : 'e', + b'\xe9' : 'e', + b'\xea' : 'e', + b'\xeb' : 'e', + b'\xec' : 'i', + b'\xed' : 'i', + b'\xee' : 'i', + b'\xef' : 'i', + b'\xf0' : 'o', + b'\xf1' : 'n', + b'\xf2' : 'o', + b'\xf3' : 'o', + b'\xf4' : 'o', + b'\xf5' : 'o', + b'\xf6' : 'o', + b'\xf7' : '/', + b'\xf8' : 'o', + b'\xf9' : 'u', + b'\xfa' : 'u', + b'\xfb' : 'u', + b'\xfc' : 'u', + b'\xfd' : 'y', + b'\xfe' : 'b', + b'\xff' : 'y', + } + + # A map used when removing rogue Windows-1252/ISO-8859-1 + # characters in otherwise UTF-8 documents. + # + # Note that \x81, \x8d, \x8f, \x90, and \x9d are undefined in + # Windows-1252. + WINDOWS_1252_TO_UTF8 = { + 0x80 : b'\xe2\x82\xac', # € + 0x82 : b'\xe2\x80\x9a', # ‚ + 0x83 : b'\xc6\x92', # Æ’ + 0x84 : b'\xe2\x80\x9e', # „ + 0x85 : b'\xe2\x80\xa6', # … + 0x86 : b'\xe2\x80\xa0', # † + 0x87 : b'\xe2\x80\xa1', # ‡ + 0x88 : b'\xcb\x86', # ˆ + 0x89 : b'\xe2\x80\xb0', # ‰ + 0x8a : b'\xc5\xa0', # Å  + 0x8b : b'\xe2\x80\xb9', # ‹ + 0x8c : b'\xc5\x92', # Å’ + 0x8e : b'\xc5\xbd', # Ž + 0x91 : b'\xe2\x80\x98', # ‘ + 0x92 : b'\xe2\x80\x99', # ’ + 0x93 : b'\xe2\x80\x9c', # “ + 0x94 : b'\xe2\x80\x9d', # †+ 0x95 : b'\xe2\x80\xa2', # • + 0x96 : b'\xe2\x80\x93', # – + 0x97 : b'\xe2\x80\x94', # — + 0x98 : b'\xcb\x9c', # Ëœ + 0x99 : b'\xe2\x84\xa2', # â„¢ + 0x9a : b'\xc5\xa1', # Å¡ + 0x9b : b'\xe2\x80\xba', # › + 0x9c : b'\xc5\x93', # Å“ + 0x9e : b'\xc5\xbe', # ž + 0x9f : b'\xc5\xb8', # Ÿ + 0xa0 : b'\xc2\xa0', #   + 0xa1 : b'\xc2\xa1', # ¡ + 0xa2 : b'\xc2\xa2', # ¢ + 0xa3 : b'\xc2\xa3', # £ + 0xa4 : b'\xc2\xa4', # ¤ + 0xa5 : b'\xc2\xa5', # Â¥ + 0xa6 : b'\xc2\xa6', # ¦ + 0xa7 : b'\xc2\xa7', # § + 0xa8 : b'\xc2\xa8', # ¨ + 0xa9 : b'\xc2\xa9', # © + 0xaa : b'\xc2\xaa', # ª + 0xab : b'\xc2\xab', # « + 0xac : b'\xc2\xac', # ¬ + 0xad : b'\xc2\xad', # ­ + 0xae : b'\xc2\xae', # ® + 0xaf : b'\xc2\xaf', # ¯ + 0xb0 : b'\xc2\xb0', # ° + 0xb1 : b'\xc2\xb1', # ± + 0xb2 : b'\xc2\xb2', # ² + 0xb3 : b'\xc2\xb3', # ³ + 0xb4 : b'\xc2\xb4', # ´ + 0xb5 : b'\xc2\xb5', # µ + 0xb6 : b'\xc2\xb6', # ¶ + 0xb7 : b'\xc2\xb7', # · + 0xb8 : b'\xc2\xb8', # ¸ + 0xb9 : b'\xc2\xb9', # ¹ + 0xba : b'\xc2\xba', # º + 0xbb : b'\xc2\xbb', # » + 0xbc : b'\xc2\xbc', # ¼ + 0xbd : b'\xc2\xbd', # ½ + 0xbe : b'\xc2\xbe', # ¾ + 0xbf : b'\xc2\xbf', # ¿ + 0xc0 : b'\xc3\x80', # À + 0xc1 : b'\xc3\x81', # à + 0xc2 : b'\xc3\x82', #  + 0xc3 : b'\xc3\x83', # à + 0xc4 : b'\xc3\x84', # Ä + 0xc5 : b'\xc3\x85', # Ã… + 0xc6 : b'\xc3\x86', # Æ + 0xc7 : b'\xc3\x87', # Ç + 0xc8 : b'\xc3\x88', # È + 0xc9 : b'\xc3\x89', # É + 0xca : b'\xc3\x8a', # Ê + 0xcb : b'\xc3\x8b', # Ë + 0xcc : b'\xc3\x8c', # ÃŒ + 0xcd : b'\xc3\x8d', # à + 0xce : b'\xc3\x8e', # ÃŽ + 0xcf : b'\xc3\x8f', # à + 0xd0 : b'\xc3\x90', # à + 0xd1 : b'\xc3\x91', # Ñ + 0xd2 : b'\xc3\x92', # Ã’ + 0xd3 : b'\xc3\x93', # Ó + 0xd4 : b'\xc3\x94', # Ô + 0xd5 : b'\xc3\x95', # Õ + 0xd6 : b'\xc3\x96', # Ö + 0xd7 : b'\xc3\x97', # × + 0xd8 : b'\xc3\x98', # Ø + 0xd9 : b'\xc3\x99', # Ù + 0xda : b'\xc3\x9a', # Ú + 0xdb : b'\xc3\x9b', # Û + 0xdc : b'\xc3\x9c', # Ü + 0xdd : b'\xc3\x9d', # à + 0xde : b'\xc3\x9e', # Þ + 0xdf : b'\xc3\x9f', # ß + 0xe0 : b'\xc3\xa0', # à + 0xe1 : b'\xa1', # á + 0xe2 : b'\xc3\xa2', # â + 0xe3 : b'\xc3\xa3', # ã + 0xe4 : b'\xc3\xa4', # ä + 0xe5 : b'\xc3\xa5', # Ã¥ + 0xe6 : b'\xc3\xa6', # æ + 0xe7 : b'\xc3\xa7', # ç + 0xe8 : b'\xc3\xa8', # è + 0xe9 : b'\xc3\xa9', # é + 0xea : b'\xc3\xaa', # ê + 0xeb : b'\xc3\xab', # ë + 0xec : b'\xc3\xac', # ì + 0xed : b'\xc3\xad', # í + 0xee : b'\xc3\xae', # î + 0xef : b'\xc3\xaf', # ï + 0xf0 : b'\xc3\xb0', # ð + 0xf1 : b'\xc3\xb1', # ñ + 0xf2 : b'\xc3\xb2', # ò + 0xf3 : b'\xc3\xb3', # ó + 0xf4 : b'\xc3\xb4', # ô + 0xf5 : b'\xc3\xb5', # õ + 0xf6 : b'\xc3\xb6', # ö + 0xf7 : b'\xc3\xb7', # ÷ + 0xf8 : b'\xc3\xb8', # ø + 0xf9 : b'\xc3\xb9', # ù + 0xfa : b'\xc3\xba', # ú + 0xfb : b'\xc3\xbb', # û + 0xfc : b'\xc3\xbc', # ü + 0xfd : b'\xc3\xbd', # ý + 0xfe : b'\xc3\xbe', # þ + } + + MULTIBYTE_MARKERS_AND_SIZES = [ + (0xc2, 0xdf, 2), # 2-byte characters start with a byte C2-DF + (0xe0, 0xef, 3), # 3-byte characters start with E0-EF + (0xf0, 0xf4, 4), # 4-byte characters start with F0-F4 + ] + + FIRST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[0][0] + LAST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[-1][1] + + @classmethod + def detwingle(cls, in_bytes, main_encoding="utf8", + embedded_encoding="windows-1252"): + """Fix characters from one encoding embedded in some other encoding. + + Currently the only situation supported is Windows-1252 (or its + subset ISO-8859-1), embedded in UTF-8. + + :param in_bytes: A bytestring that you suspect contains + characters from multiple encodings. Note that this _must_ + be a bytestring. If you've already converted the document + to Unicode, you're too late. + :param main_encoding: The primary encoding of `in_bytes`. + :param embedded_encoding: The encoding that was used to embed characters + in the main document. + :return: A bytestring in which `embedded_encoding` + characters have been converted to their `main_encoding` + equivalents. + """ + if embedded_encoding.replace('_', '-').lower() not in ( + 'windows-1252', 'windows_1252'): + raise NotImplementedError( + "Windows-1252 and ISO-8859-1 are the only currently supported " + "embedded encodings.") + + if main_encoding.lower() not in ('utf8', 'utf-8'): + raise NotImplementedError( + "UTF-8 is the only currently supported main encoding.") + + byte_chunks = [] + + chunk_start = 0 + pos = 0 + while pos < len(in_bytes): + byte = in_bytes[pos] + if not isinstance(byte, int): + # Python 2.x + byte = ord(byte) + if (byte >= cls.FIRST_MULTIBYTE_MARKER + and byte <= cls.LAST_MULTIBYTE_MARKER): + # This is the start of a UTF-8 multibyte character. Skip + # to the end. + for start, end, size in cls.MULTIBYTE_MARKERS_AND_SIZES: + if byte >= start and byte <= end: + pos += size + break + elif byte >= 0x80 and byte in cls.WINDOWS_1252_TO_UTF8: + # We found a Windows-1252 character! + # Save the string up to this point as a chunk. + byte_chunks.append(in_bytes[chunk_start:pos]) + + # Now translate the Windows-1252 character into UTF-8 + # and add it as another, one-byte chunk. + byte_chunks.append(cls.WINDOWS_1252_TO_UTF8[byte]) + pos += 1 + chunk_start = pos + else: + # Go on to the next character. + pos += 1 + if chunk_start == 0: + # The string is unchanged. + return in_bytes + else: + # Store the final chunk. + byte_chunks.append(in_bytes[chunk_start:]) + return b''.join(byte_chunks) + diff --git a/python/lib/python3.11/site-packages/bs4/diagnose.py b/python/lib/python3.11/site-packages/bs4/diagnose.py new file mode 100644 index 0000000..e079772 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/diagnose.py @@ -0,0 +1,233 @@ +"""Diagnostic functions, mainly for use when doing tech support.""" + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +import cProfile +from io import BytesIO +from html.parser import HTMLParser +import bs4 +from bs4 import BeautifulSoup, __version__ +from bs4.builder import builder_registry + +import os +import pstats +import random +import tempfile +import time +import traceback +import sys +import cProfile + +def diagnose(data): + """Diagnostic suite for isolating common problems. + + :param data: A string containing markup that needs to be explained. + :return: None; diagnostics are printed to standard output. + """ + print(("Diagnostic running on Beautiful Soup %s" % __version__)) + print(("Python version %s" % sys.version)) + + basic_parsers = ["html.parser", "html5lib", "lxml"] + for name in basic_parsers: + for builder in builder_registry.builders: + if name in builder.features: + break + else: + basic_parsers.remove(name) + print(( + "I noticed that %s is not installed. Installing it may help." % + name)) + + if 'lxml' in basic_parsers: + basic_parsers.append("lxml-xml") + try: + from lxml import etree + print(("Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION)))) + except ImportError as e: + print( + "lxml is not installed or couldn't be imported.") + + + if 'html5lib' in basic_parsers: + try: + import html5lib + print(("Found html5lib version %s" % html5lib.__version__)) + except ImportError as e: + print( + "html5lib is not installed or couldn't be imported.") + + if hasattr(data, 'read'): + data = data.read() + + for parser in basic_parsers: + print(("Trying to parse your markup with %s" % parser)) + success = False + try: + soup = BeautifulSoup(data, features=parser) + success = True + except Exception as e: + print(("%s could not parse the markup." % parser)) + traceback.print_exc() + if success: + print(("Here's what %s did with the markup:" % parser)) + print((soup.prettify())) + + print(("-" * 80)) + +def lxml_trace(data, html=True, **kwargs): + """Print out the lxml events that occur during parsing. + + This lets you see how lxml parses a document when no Beautiful + Soup code is running. You can use this to determine whether + an lxml-specific problem is in Beautiful Soup's lxml tree builders + or in lxml itself. + + :param data: Some markup. + :param html: If True, markup will be parsed with lxml's HTML parser. + if False, lxml's XML parser will be used. + """ + from lxml import etree + recover = kwargs.pop('recover', True) + if isinstance(data, str): + data = data.encode("utf8") + reader = BytesIO(data) + for event, element in etree.iterparse( + reader, html=html, recover=recover, **kwargs + ): + print(("%s, %4s, %s" % (event, element.tag, element.text))) + +class AnnouncingParser(HTMLParser): + """Subclass of HTMLParser that announces parse events, without doing + anything else. + + You can use this to get a picture of how html.parser sees a given + document. The easiest way to do this is to call `htmlparser_trace`. + """ + + def _p(self, s): + print(s) + + def handle_starttag(self, name, attrs): + self._p("%s START" % name) + + def handle_endtag(self, name): + self._p("%s END" % name) + + def handle_data(self, data): + self._p("%s DATA" % data) + + def handle_charref(self, name): + self._p("%s CHARREF" % name) + + def handle_entityref(self, name): + self._p("%s ENTITYREF" % name) + + def handle_comment(self, data): + self._p("%s COMMENT" % data) + + def handle_decl(self, data): + self._p("%s DECL" % data) + + def unknown_decl(self, data): + self._p("%s UNKNOWN-DECL" % data) + + def handle_pi(self, data): + self._p("%s PI" % data) + +def htmlparser_trace(data): + """Print out the HTMLParser events that occur during parsing. + + This lets you see how HTMLParser parses a document when no + Beautiful Soup code is running. + + :param data: Some markup. + """ + parser = AnnouncingParser() + parser.feed(data) + +_vowels = "aeiou" +_consonants = "bcdfghjklmnpqrstvwxyz" + +def rword(length=5): + "Generate a random word-like string." + s = '' + for i in range(length): + if i % 2 == 0: + t = _consonants + else: + t = _vowels + s += random.choice(t) + return s + +def rsentence(length=4): + "Generate a random sentence-like string." + return " ".join(rword(random.randint(4,9)) for i in range(length)) + +def rdoc(num_elements=1000): + """Randomly generate an invalid HTML document.""" + tag_names = ['p', 'div', 'span', 'i', 'b', 'script', 'table'] + elements = [] + for i in range(num_elements): + choice = random.randint(0,3) + if choice == 0: + # New tag. + tag_name = random.choice(tag_names) + elements.append("<%s>" % tag_name) + elif choice == 1: + elements.append(rsentence(random.randint(1,4))) + elif choice == 2: + # Close a tag. + tag_name = random.choice(tag_names) + elements.append("</%s>" % tag_name) + return "<html>" + "\n".join(elements) + "</html>" + +def benchmark_parsers(num_elements=100000): + """Very basic head-to-head performance benchmark.""" + print(("Comparative parser benchmark on Beautiful Soup %s" % __version__)) + data = rdoc(num_elements) + print(("Generated a large invalid HTML document (%d bytes)." % len(data))) + + for parser in ["lxml", ["lxml", "html"], "html5lib", "html.parser"]: + success = False + try: + a = time.time() + soup = BeautifulSoup(data, parser) + b = time.time() + success = True + except Exception as e: + print(("%s could not parse the markup." % parser)) + traceback.print_exc() + if success: + print(("BS4+%s parsed the markup in %.2fs." % (parser, b-a))) + + from lxml import etree + a = time.time() + etree.HTML(data) + b = time.time() + print(("Raw lxml parsed the markup in %.2fs." % (b-a))) + + import html5lib + parser = html5lib.HTMLParser() + a = time.time() + parser.parse(data) + b = time.time() + print(("Raw html5lib parsed the markup in %.2fs." % (b-a))) + +def profile(num_elements=100000, parser="lxml"): + """Use Python's profiler on a randomly generated document.""" + filehandle = tempfile.NamedTemporaryFile() + filename = filehandle.name + + data = rdoc(num_elements) + vars = dict(bs4=bs4, data=data, parser=parser) + cProfile.runctx('bs4.BeautifulSoup(data, parser)' , vars, vars, filename) + + stats = pstats.Stats(filename) + # stats.strip_dirs() + stats.sort_stats("cumulative") + stats.print_stats('_html5lib|bs4', 50) + +# If this file is run as a script, standard input is diagnosed. +if __name__ == '__main__': + diagnose(sys.stdin.read()) diff --git a/python/lib/python3.11/site-packages/bs4/element.py b/python/lib/python3.11/site-packages/bs4/element.py new file mode 100644 index 0000000..9c73957 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/element.py @@ -0,0 +1,2430 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +try: + from collections.abc import Callable # Python 3.6 +except ImportError as e: + from collections import Callable +import re +import sys +import warnings + +from bs4.css import CSS +from bs4.formatter import ( + Formatter, + HTMLFormatter, + XMLFormatter, +) + +DEFAULT_OUTPUT_ENCODING = "utf-8" + +nonwhitespace_re = re.compile(r"\S+") + +# NOTE: This isn't used as of 4.7.0. I'm leaving it for a little bit on +# the off chance someone imported it for their own use. +whitespace_re = re.compile(r"\s+") + +def _alias(attr): + """Alias one attribute name to another for backward compatibility""" + @property + def alias(self): + return getattr(self, attr) + + @alias.setter + def alias(self): + return setattr(self, attr) + return alias + + +# These encodings are recognized by Python (so PageElement.encode +# could theoretically support them) but XML and HTML don't recognize +# them (so they should not show up in an XML or HTML document as that +# document's encoding). +# +# If an XML document is encoded in one of these encodings, no encoding +# will be mentioned in the XML declaration. If an HTML document is +# encoded in one of these encodings, and the HTML document has a +# <meta> tag that mentions an encoding, the encoding will be given as +# the empty string. +# +# Source: +# https://docs.python.org/3/library/codecs.html#python-specific-encodings +PYTHON_SPECIFIC_ENCODINGS = set([ + "idna", + "mbcs", + "oem", + "palmos", + "punycode", + "raw_unicode_escape", + "undefined", + "unicode_escape", + "raw-unicode-escape", + "unicode-escape", + "string-escape", + "string_escape", +]) + + +class NamespacedAttribute(str): + """A namespaced string (e.g. 'xml:lang') that remembers the namespace + ('xml') and the name ('lang') that were used to create it. + """ + + def __new__(cls, prefix, name=None, namespace=None): + if not name: + # This is the default namespace. Its name "has no value" + # per https://www.w3.org/TR/xml-names/#defaulting + name = None + + if not name: + obj = str.__new__(cls, prefix) + elif not prefix: + # Not really namespaced. + obj = str.__new__(cls, name) + else: + obj = str.__new__(cls, prefix + ":" + name) + obj.prefix = prefix + obj.name = name + obj.namespace = namespace + return obj + +class AttributeValueWithCharsetSubstitution(str): + """A stand-in object for a character encoding specified in HTML.""" + +class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution): + """A generic stand-in for the value of a meta tag's 'charset' attribute. + + When Beautiful Soup parses the markup '<meta charset="utf8">', the + value of the 'charset' attribute will be one of these objects. + """ + + def __new__(cls, original_value): + obj = str.__new__(cls, original_value) + obj.original_value = original_value + return obj + + def encode(self, encoding): + """When an HTML document is being encoded to a given encoding, the + value of a meta tag's 'charset' is the name of the encoding. + """ + if encoding in PYTHON_SPECIFIC_ENCODINGS: + return '' + return encoding + + +class ContentMetaAttributeValue(AttributeValueWithCharsetSubstitution): + """A generic stand-in for the value of a meta tag's 'content' attribute. + + When Beautiful Soup parses the markup: + <meta http-equiv="content-type" content="text/html; charset=utf8"> + + The value of the 'content' attribute will be one of these objects. + """ + + CHARSET_RE = re.compile(r"((^|;)\s*charset=)([^;]*)", re.M) + + def __new__(cls, original_value): + match = cls.CHARSET_RE.search(original_value) + if match is None: + # No substitution necessary. + return str.__new__(str, original_value) + + obj = str.__new__(cls, original_value) + obj.original_value = original_value + return obj + + def encode(self, encoding): + if encoding in PYTHON_SPECIFIC_ENCODINGS: + return '' + def rewrite(match): + return match.group(1) + encoding + return self.CHARSET_RE.sub(rewrite, self.original_value) + + +class PageElement(object): + """Contains the navigational information for some part of the page: + that is, its current location in the parse tree. + + NavigableString, Tag, etc. are all subclasses of PageElement. + """ + + # In general, we can't tell just by looking at an element whether + # it's contained in an XML document or an HTML document. But for + # Tags (q.v.) we can store this information at parse time. + known_xml = None + + def setup(self, parent=None, previous_element=None, next_element=None, + previous_sibling=None, next_sibling=None): + """Sets up the initial relations between this element and + other elements. + + :param parent: The parent of this element. + + :param previous_element: The element parsed immediately before + this one. + + :param next_element: The element parsed immediately before + this one. + + :param previous_sibling: The most recently encountered element + on the same level of the parse tree as this one. + + :param previous_sibling: The next element to be encountered + on the same level of the parse tree as this one. + """ + self.parent = parent + + self.previous_element = previous_element + if previous_element is not None: + self.previous_element.next_element = self + + self.next_element = next_element + if self.next_element is not None: + self.next_element.previous_element = self + + self.next_sibling = next_sibling + if self.next_sibling is not None: + self.next_sibling.previous_sibling = self + + if (previous_sibling is None + and self.parent is not None and self.parent.contents): + previous_sibling = self.parent.contents[-1] + + self.previous_sibling = previous_sibling + if previous_sibling is not None: + self.previous_sibling.next_sibling = self + + def format_string(self, s, formatter): + """Format the given string using the given formatter. + + :param s: A string. + :param formatter: A Formatter object, or a string naming one of the standard formatters. + """ + if formatter is None: + return s + if not isinstance(formatter, Formatter): + formatter = self.formatter_for_name(formatter) + output = formatter.substitute(s) + return output + + def formatter_for_name(self, formatter): + """Look up or create a Formatter for the given identifier, + if necessary. + + :param formatter: Can be a Formatter object (used as-is), a + function (used as the entity substitution hook for an + XMLFormatter or HTMLFormatter), or a string (used to look + up an XMLFormatter or HTMLFormatter in the appropriate + registry. + """ + if isinstance(formatter, Formatter): + return formatter + if self._is_xml: + c = XMLFormatter + else: + c = HTMLFormatter + if isinstance(formatter, Callable): + return c(entity_substitution=formatter) + return c.REGISTRY[formatter] + + @property + def _is_xml(self): + """Is this element part of an XML tree or an HTML tree? + + This is used in formatter_for_name, when deciding whether an + XMLFormatter or HTMLFormatter is more appropriate. It can be + inefficient, but it should be called very rarely. + """ + if self.known_xml is not None: + # Most of the time we will have determined this when the + # document is parsed. + return self.known_xml + + # Otherwise, it's likely that this element was created by + # direct invocation of the constructor from within the user's + # Python code. + if self.parent is None: + # This is the top-level object. It should have .known_xml set + # from tree creation. If not, take a guess--BS is usually + # used on HTML markup. + return getattr(self, 'is_xml', False) + return self.parent._is_xml + + nextSibling = _alias("next_sibling") # BS3 + previousSibling = _alias("previous_sibling") # BS3 + + default = object() + def _all_strings(self, strip=False, types=default): + """Yield all strings of certain classes, possibly stripping them. + + This is implemented differently in Tag and NavigableString. + """ + raise NotImplementedError() + + @property + def stripped_strings(self): + """Yield all strings in this PageElement, stripping them first. + + :yield: A sequence of stripped strings. + """ + for string in self._all_strings(True): + yield string + + def get_text(self, separator="", strip=False, + types=default): + """Get all child strings of this PageElement, concatenated using the + given separator. + + :param separator: Strings will be concatenated using this separator. + + :param strip: If True, strings will be stripped before being + concatenated. + + :param types: A tuple of NavigableString subclasses. Any + strings of a subclass not found in this list will be + ignored. Although there are exceptions, the default + behavior in most cases is to consider only NavigableString + and CData objects. That means no comments, processing + instructions, etc. + + :return: A string. + """ + return separator.join([s for s in self._all_strings( + strip, types=types)]) + getText = get_text + text = property(get_text) + + def replace_with(self, *args): + """Replace this PageElement with one or more PageElements, keeping the + rest of the tree the same. + + :param args: One or more PageElements. + :return: `self`, no longer part of the tree. + """ + if self.parent is None: + raise ValueError( + "Cannot replace one element with another when the " + "element to be replaced is not part of a tree.") + if len(args) == 1 and args[0] is self: + return + if any(x is self.parent for x in args): + raise ValueError("Cannot replace a Tag with its parent.") + old_parent = self.parent + my_index = self.parent.index(self) + self.extract(_self_index=my_index) + for idx, replace_with in enumerate(args, start=my_index): + old_parent.insert(idx, replace_with) + return self + replaceWith = replace_with # BS3 + + def unwrap(self): + """Replace this PageElement with its contents. + + :return: `self`, no longer part of the tree. + """ + my_parent = self.parent + if self.parent is None: + raise ValueError( + "Cannot replace an element with its contents when that" + "element is not part of a tree.") + my_index = self.parent.index(self) + self.extract(_self_index=my_index) + for child in reversed(self.contents[:]): + my_parent.insert(my_index, child) + return self + replace_with_children = unwrap + replaceWithChildren = unwrap # BS3 + + def wrap(self, wrap_inside): + """Wrap this PageElement inside another one. + + :param wrap_inside: A PageElement. + :return: `wrap_inside`, occupying the position in the tree that used + to be occupied by `self`, and with `self` inside it. + """ + me = self.replace_with(wrap_inside) + wrap_inside.append(me) + return wrap_inside + + def extract(self, _self_index=None): + """Destructively rips this element out of the tree. + + :param _self_index: The location of this element in its parent's + .contents, if known. Passing this in allows for a performance + optimization. + + :return: `self`, no longer part of the tree. + """ + if self.parent is not None: + if _self_index is None: + _self_index = self.parent.index(self) + del self.parent.contents[_self_index] + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + last_child = self._last_descendant() + next_element = last_child.next_element + + if (self.previous_element is not None and + self.previous_element is not next_element): + self.previous_element.next_element = next_element + if next_element is not None and next_element is not self.previous_element: + next_element.previous_element = self.previous_element + self.previous_element = None + last_child.next_element = None + + self.parent = None + if (self.previous_sibling is not None + and self.previous_sibling is not self.next_sibling): + self.previous_sibling.next_sibling = self.next_sibling + if (self.next_sibling is not None + and self.next_sibling is not self.previous_sibling): + self.next_sibling.previous_sibling = self.previous_sibling + self.previous_sibling = self.next_sibling = None + return self + + def _last_descendant(self, is_initialized=True, accept_self=True): + """Finds the last element beneath this object to be parsed. + + :param is_initialized: Has `setup` been called on this PageElement + yet? + :param accept_self: Is `self` an acceptable answer to the question? + """ + if is_initialized and self.next_sibling is not None: + last_child = self.next_sibling.previous_element + else: + last_child = self + while isinstance(last_child, Tag) and last_child.contents: + last_child = last_child.contents[-1] + if not accept_self and last_child is self: + last_child = None + return last_child + # BS3: Not part of the API! + _lastRecursiveChild = _last_descendant + + def insert(self, position, new_child): + """Insert a new PageElement in the list of this PageElement's children. + + This works the same way as `list.insert`. + + :param position: The numeric position that should be occupied + in `self.children` by the new PageElement. + :param new_child: A PageElement. + """ + if new_child is None: + raise ValueError("Cannot insert None into a tag.") + if new_child is self: + raise ValueError("Cannot insert a tag into itself.") + if (isinstance(new_child, str) + and not isinstance(new_child, NavigableString)): + new_child = NavigableString(new_child) + + from bs4 import BeautifulSoup + if isinstance(new_child, BeautifulSoup): + # We don't want to end up with a situation where one BeautifulSoup + # object contains another. Insert the children one at a time. + for subchild in list(new_child.contents): + self.insert(position, subchild) + position += 1 + return + position = min(position, len(self.contents)) + if hasattr(new_child, 'parent') and new_child.parent is not None: + # We're 'inserting' an element that's already one + # of this object's children. + if new_child.parent is self: + current_index = self.index(new_child) + if current_index < position: + # We're moving this element further down the list + # of this object's children. That means that when + # we extract this element, our target index will + # jump down one. + position -= 1 + new_child.extract() + + new_child.parent = self + previous_child = None + if position == 0: + new_child.previous_sibling = None + new_child.previous_element = self + else: + previous_child = self.contents[position - 1] + new_child.previous_sibling = previous_child + new_child.previous_sibling.next_sibling = new_child + new_child.previous_element = previous_child._last_descendant(False) + if new_child.previous_element is not None: + new_child.previous_element.next_element = new_child + + new_childs_last_element = new_child._last_descendant(False) + + if position >= len(self.contents): + new_child.next_sibling = None + + parent = self + parents_next_sibling = None + while parents_next_sibling is None and parent is not None: + parents_next_sibling = parent.next_sibling + parent = parent.parent + if parents_next_sibling is not None: + # We found the element that comes next in the document. + break + if parents_next_sibling is not None: + new_childs_last_element.next_element = parents_next_sibling + else: + # The last element of this tag is the last element in + # the document. + new_childs_last_element.next_element = None + else: + next_child = self.contents[position] + new_child.next_sibling = next_child + if new_child.next_sibling is not None: + new_child.next_sibling.previous_sibling = new_child + new_childs_last_element.next_element = next_child + + if new_childs_last_element.next_element is not None: + new_childs_last_element.next_element.previous_element = new_childs_last_element + self.contents.insert(position, new_child) + + def append(self, tag): + """Appends the given PageElement to the contents of this one. + + :param tag: A PageElement. + """ + self.insert(len(self.contents), tag) + + def extend(self, tags): + """Appends the given PageElements to this one's contents. + + :param tags: A list of PageElements. If a single Tag is + provided instead, this PageElement's contents will be extended + with that Tag's contents. + """ + if isinstance(tags, Tag): + tags = tags.contents + if isinstance(tags, list): + # Moving items around the tree may change their position in + # the original list. Make a list that won't change. + tags = list(tags) + for tag in tags: + self.append(tag) + + def insert_before(self, *args): + """Makes the given element(s) the immediate predecessor of this one. + + All the elements will have the same parent, and the given elements + will be immediately before this one. + + :param args: One or more PageElements. + """ + parent = self.parent + if parent is None: + raise ValueError( + "Element has no parent, so 'before' has no meaning.") + if any(x is self for x in args): + raise ValueError("Can't insert an element before itself.") + for predecessor in args: + # Extract first so that the index won't be screwed up if they + # are siblings. + if isinstance(predecessor, PageElement): + predecessor.extract() + index = parent.index(self) + parent.insert(index, predecessor) + + def insert_after(self, *args): + """Makes the given element(s) the immediate successor of this one. + + The elements will have the same parent, and the given elements + will be immediately after this one. + + :param args: One or more PageElements. + """ + # Do all error checking before modifying the tree. + parent = self.parent + if parent is None: + raise ValueError( + "Element has no parent, so 'after' has no meaning.") + if any(x is self for x in args): + raise ValueError("Can't insert an element after itself.") + + offset = 0 + for successor in args: + # Extract first so that the index won't be screwed up if they + # are siblings. + if isinstance(successor, PageElement): + successor.extract() + index = parent.index(self) + parent.insert(index+1+offset, successor) + offset += 1 + + def find_next(self, name=None, attrs={}, string=None, **kwargs): + """Find the first PageElement that matches the given criteria and + appears later in the document than this PageElement. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_all_next, name, attrs, string, **kwargs) + findNext = find_next # BS3 + + def find_all_next(self, name=None, attrs={}, string=None, limit=None, + **kwargs): + """Find all PageElements that match the given criteria and appear + later in the document than this PageElement. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet containing PageElements. + """ + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all(name, attrs, string, limit, self.next_elements, + _stacklevel=_stacklevel+1, **kwargs) + findAllNext = find_all_next # BS3 + + def find_next_sibling(self, name=None, attrs={}, string=None, **kwargs): + """Find the closest sibling to this PageElement that matches the + given criteria and appears later in the document. + + All find_* methods take a common set of arguments. See the + online documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_next_siblings, name, attrs, string, + **kwargs) + findNextSibling = find_next_sibling # BS3 + + def find_next_siblings(self, name=None, attrs={}, string=None, limit=None, + **kwargs): + """Find all siblings of this PageElement that match the given criteria + and appear later in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all( + name, attrs, string, limit, + self.next_siblings, _stacklevel=_stacklevel+1, **kwargs + ) + findNextSiblings = find_next_siblings # BS3 + fetchNextSiblings = find_next_siblings # BS2 + + def find_previous(self, name=None, attrs={}, string=None, **kwargs): + """Look backwards in the document from this PageElement and find the + first PageElement that matches the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one( + self.find_all_previous, name, attrs, string, **kwargs) + findPrevious = find_previous # BS3 + + def find_all_previous(self, name=None, attrs={}, string=None, limit=None, + **kwargs): + """Look backwards in the document from this PageElement and find all + PageElements that match the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all( + name, attrs, string, limit, self.previous_elements, + _stacklevel=_stacklevel+1, **kwargs + ) + findAllPrevious = find_all_previous # BS3 + fetchPrevious = find_all_previous # BS2 + + def find_previous_sibling(self, name=None, attrs={}, string=None, **kwargs): + """Returns the closest sibling to this PageElement that matches the + given criteria and appears earlier in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_previous_siblings, name, attrs, string, + **kwargs) + findPreviousSibling = find_previous_sibling # BS3 + + def find_previous_siblings(self, name=None, attrs={}, string=None, + limit=None, **kwargs): + """Returns all siblings to this PageElement that match the + given criteria and appear earlier in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all( + name, attrs, string, limit, + self.previous_siblings, _stacklevel=_stacklevel+1, **kwargs + ) + findPreviousSiblings = find_previous_siblings # BS3 + fetchPreviousSiblings = find_previous_siblings # BS2 + + def find_parent(self, name=None, attrs={}, **kwargs): + """Find the closest parent of this PageElement that matches the given + criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :kwargs: A dictionary of filters on attribute values. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + # NOTE: We can't use _find_one because findParents takes a different + # set of arguments. + r = None + l = self.find_parents(name, attrs, 1, _stacklevel=3, **kwargs) + if l: + r = l[0] + return r + findParent = find_parent # BS3 + + def find_parents(self, name=None, attrs={}, limit=None, **kwargs): + """Find all parents of this PageElement that match the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all(name, attrs, None, limit, self.parents, + _stacklevel=_stacklevel+1, **kwargs) + findParents = find_parents # BS3 + fetchParents = find_parents # BS2 + + @property + def next(self): + """The PageElement, if any, that was parsed just after this one. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self.next_element + + @property + def previous(self): + """The PageElement, if any, that was parsed just before this one. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self.previous_element + + #These methods do the real heavy lifting. + + def _find_one(self, method, name, attrs, string, **kwargs): + r = None + l = method(name, attrs, string, 1, _stacklevel=4, **kwargs) + if l: + r = l[0] + return r + + def _find_all(self, name, attrs, string, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + _stacklevel = kwargs.pop('_stacklevel', 3) + + if string is None and 'text' in kwargs: + string = kwargs.pop('text') + warnings.warn( + "The 'text' argument to find()-type methods is deprecated. Use 'string' instead.", + DeprecationWarning, stacklevel=_stacklevel + ) + + if isinstance(name, SoupStrainer): + strainer = name + else: + strainer = SoupStrainer(name, attrs, string, **kwargs) + + if string is None and not limit and not attrs and not kwargs: + if name is True or name is None: + # Optimization to find all tags. + result = (element for element in generator + if isinstance(element, Tag)) + return ResultSet(strainer, result) + elif isinstance(name, str): + # Optimization to find all tags with a given name. + if name.count(':') == 1: + # This is a name with a prefix. If this is a namespace-aware document, + # we need to match the local name against tag.name. If not, + # we need to match the fully-qualified name against tag.name. + prefix, local_name = name.split(':', 1) + else: + prefix = None + local_name = name + result = (element for element in generator + if isinstance(element, Tag) + and ( + element.name == name + ) or ( + element.name == local_name + and (prefix is None or element.prefix == prefix) + ) + ) + return ResultSet(strainer, result) + results = ResultSet(strainer) + while True: + try: + i = next(generator) + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These generators can be used to navigate starting from both + #NavigableStrings and Tags. + @property + def next_elements(self): + """All PageElements that were parsed after this one. + + :yield: A sequence of PageElements. + """ + i = self.next_element + while i is not None: + yield i + i = i.next_element + + @property + def next_siblings(self): + """All PageElements that are siblings of this one but were parsed + later. + + :yield: A sequence of PageElements. + """ + i = self.next_sibling + while i is not None: + yield i + i = i.next_sibling + + @property + def previous_elements(self): + """All PageElements that were parsed before this one. + + :yield: A sequence of PageElements. + """ + i = self.previous_element + while i is not None: + yield i + i = i.previous_element + + @property + def previous_siblings(self): + """All PageElements that are siblings of this one but were parsed + earlier. + + :yield: A sequence of PageElements. + """ + i = self.previous_sibling + while i is not None: + yield i + i = i.previous_sibling + + @property + def parents(self): + """All PageElements that are parents of this PageElement. + + :yield: A sequence of PageElements. + """ + i = self.parent + while i is not None: + yield i + i = i.parent + + @property + def decomposed(self): + """Check whether a PageElement has been decomposed. + + :rtype: bool + """ + return getattr(self, '_decomposed', False) or False + + # Old non-property versions of the generators, for backwards + # compatibility with BS3. + def nextGenerator(self): + return self.next_elements + + def nextSiblingGenerator(self): + return self.next_siblings + + def previousGenerator(self): + return self.previous_elements + + def previousSiblingGenerator(self): + return self.previous_siblings + + def parentGenerator(self): + return self.parents + + +class NavigableString(str, PageElement): + """A Python Unicode string that is part of a parse tree. + + When Beautiful Soup parses the markup <b>penguin</b>, it will + create a NavigableString for the string "penguin". + """ + + PREFIX = '' + SUFFIX = '' + + def __new__(cls, value): + """Create a new NavigableString. + + When unpickling a NavigableString, this method is called with + the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be + passed in to the superclass's __new__ or the superclass won't know + how to handle non-ASCII characters. + """ + if isinstance(value, str): + u = str.__new__(cls, value) + else: + u = str.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) + u.setup() + return u + + def __deepcopy__(self, memo, recursive=False): + """A copy of a NavigableString has the same contents and class + as the original, but it is not connected to the parse tree. + + :param recursive: This parameter is ignored; it's only defined + so that NavigableString.__deepcopy__ implements the same + signature as Tag.__deepcopy__. + """ + return type(self)(self) + + def __copy__(self): + """A copy of a NavigableString can only be a deep copy, because + only one PageElement can occupy a given place in a parse tree. + """ + return self.__deepcopy__({}) + + def __getnewargs__(self): + return (str(self),) + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError( + "'%s' object has no attribute '%s'" % ( + self.__class__.__name__, attr)) + + def output_ready(self, formatter="minimal"): + """Run the string through the provided formatter. + + :param formatter: A Formatter object, or a string naming one of the standard formatters. + """ + output = self.format_string(self, formatter) + return self.PREFIX + output + self.SUFFIX + + @property + def name(self): + """Since a NavigableString is not a Tag, it has no .name. + + This property is implemented so that code like this doesn't crash + when run on a mixture of Tag and NavigableString objects: + [x.name for x in tag.children] + """ + return None + + @name.setter + def name(self, name): + """Prevent NavigableString.name from ever being set.""" + raise AttributeError("A NavigableString cannot be given a name.") + + def _all_strings(self, strip=False, types=PageElement.default): + """Yield all strings of certain classes, possibly stripping them. + + This makes it easy for NavigableString to implement methods + like get_text() as conveniences, creating a consistent + text-extraction API across all PageElements. + + :param strip: If True, all strings will be stripped before being + yielded. + + :param types: A tuple of NavigableString subclasses. If this + NavigableString isn't one of those subclasses, the + sequence will be empty. By default, the subclasses + considered are NavigableString and CData objects. That + means no comments, processing instructions, etc. + + :yield: A sequence that either contains this string, or is empty. + + """ + if types is self.default: + # This is kept in Tag because it's full of subclasses of + # this class, which aren't defined until later in the file. + types = Tag.DEFAULT_INTERESTING_STRING_TYPES + + # Do nothing if the caller is looking for specific types of + # string, and we're of a different type. + # + # We check specific types instead of using isinstance(self, + # types) because all of these classes subclass + # NavigableString. Anyone who's using this feature probably + # wants generic NavigableStrings but not other stuff. + my_type = type(self) + if types is not None: + if isinstance(types, type): + # Looking for a single type. + if my_type is not types: + return + elif my_type not in types: + # Looking for one of a list of types. + return + + value = self + if strip: + value = value.strip() + if len(value) > 0: + yield value + strings = property(_all_strings) + +class PreformattedString(NavigableString): + """A NavigableString not subject to the normal formatting rules. + + This is an abstract class used for special kinds of strings such + as comments (the Comment class) and CDATA blocks (the CData + class). + """ + + PREFIX = '' + SUFFIX = '' + + def output_ready(self, formatter=None): + """Make this string ready for output by adding any subclass-specific + prefix or suffix. + + :param formatter: A Formatter object, or a string naming one + of the standard formatters. The string will be passed into the + Formatter, but only to trigger any side effects: the return + value is ignored. + + :return: The string, with any subclass-specific prefix and + suffix added on. + """ + if formatter is not None: + ignore = self.format_string(self, formatter) + return self.PREFIX + self + self.SUFFIX + +class CData(PreformattedString): + """A CDATA block.""" + PREFIX = '<![CDATA[' + SUFFIX = ']]>' + +class ProcessingInstruction(PreformattedString): + """A SGML processing instruction.""" + + PREFIX = '<?' + SUFFIX = '>' + +class XMLProcessingInstruction(ProcessingInstruction): + """An XML processing instruction.""" + PREFIX = '<?' + SUFFIX = '?>' + +class Comment(PreformattedString): + """An HTML or XML comment.""" + PREFIX = '<!--' + SUFFIX = '-->' + + +class Declaration(PreformattedString): + """An XML declaration.""" + PREFIX = '<?' + SUFFIX = '?>' + + +class Doctype(PreformattedString): + """A document type declaration.""" + @classmethod + def for_name_and_ids(cls, name, pub_id, system_id): + """Generate an appropriate document type declaration for a given + public ID and system ID. + + :param name: The name of the document's root element, e.g. 'html'. + :param pub_id: The Formal Public Identifier for this document type, + e.g. '-//W3C//DTD XHTML 1.1//EN' + :param system_id: The system identifier for this document type, + e.g. 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + + :return: A Doctype. + """ + value = name or '' + if pub_id is not None: + value += ' PUBLIC "%s"' % pub_id + if system_id is not None: + value += ' "%s"' % system_id + elif system_id is not None: + value += ' SYSTEM "%s"' % system_id + + return Doctype(value) + + PREFIX = '<!DOCTYPE ' + SUFFIX = '>\n' + + +class Stylesheet(NavigableString): + """A NavigableString representing an stylesheet (probably + CSS). + + Used to distinguish embedded stylesheets from textual content. + """ + pass + + +class Script(NavigableString): + """A NavigableString representing an executable script (probably + Javascript). + + Used to distinguish executable code from textual content. + """ + pass + + +class TemplateString(NavigableString): + """A NavigableString representing a string found inside an HTML + template embedded in a larger document. + + Used to distinguish such strings from the main body of the document. + """ + pass + + +class RubyTextString(NavigableString): + """A NavigableString representing the contents of the <rt> HTML + element. + + https://dev.w3.org/html5/spec-LC/text-level-semantics.html#the-rt-element + + Can be used to distinguish such strings from the strings they're + annotating. + """ + pass + + +class RubyParenthesisString(NavigableString): + """A NavigableString representing the contents of the <rp> HTML + element. + + https://dev.w3.org/html5/spec-LC/text-level-semantics.html#the-rp-element + """ + pass + + +class Tag(PageElement): + """Represents an HTML or XML tag that is part of a parse tree, along + with its attributes and contents. + + When Beautiful Soup parses the markup <b>penguin</b>, it will + create a Tag object representing the <b> tag. + """ + + def __init__(self, parser=None, builder=None, name=None, namespace=None, + prefix=None, attrs=None, parent=None, previous=None, + is_xml=None, sourceline=None, sourcepos=None, + can_be_empty_element=None, cdata_list_attributes=None, + preserve_whitespace_tags=None, + interesting_string_types=None, + namespaces=None + ): + """Basic constructor. + + :param parser: A BeautifulSoup object. + :param builder: A TreeBuilder. + :param name: The name of the tag. + :param namespace: The URI of this Tag's XML namespace, if any. + :param prefix: The prefix for this Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values. + :param parent: The PageElement to use as this Tag's parent. + :param previous: The PageElement that was parsed immediately before + this tag. + :param is_xml: If True, this is an XML tag. Otherwise, this is an + HTML tag. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param can_be_empty_element: If True, this tag should be + represented as <tag/>. If False, this tag should be represented + as <tag></tag>. + :param cdata_list_attributes: A list of attributes whose values should + be treated as CDATA if they ever show up on this tag. + :param preserve_whitespace_tags: A list of tag names whose contents + should have their whitespace preserved. + :param interesting_string_types: This is a NavigableString + subclass or a tuple of them. When iterating over this + Tag's strings in methods like Tag.strings or Tag.get_text, + these are the types of strings that are interesting enough + to be considered. The default is to consider + NavigableString and CData the only interesting string + subtypes. + :param namespaces: A dictionary mapping currently active + namespace prefixes to URIs. This can be used later to + construct CSS selectors. + """ + if parser is None: + self.parser_class = None + else: + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected. + self.parser_class = parser.__class__ + if name is None: + raise ValueError("No value provided for new tag's name.") + self.name = name + self.namespace = namespace + self._namespaces = namespaces or {} + self.prefix = prefix + if ((not builder or builder.store_line_numbers) + and (sourceline is not None or sourcepos is not None)): + self.sourceline = sourceline + self.sourcepos = sourcepos + if attrs is None: + attrs = {} + elif attrs: + if builder is not None and builder.cdata_list_attributes: + attrs = builder._replace_cdata_list_attribute_values( + self.name, attrs) + else: + attrs = dict(attrs) + else: + attrs = dict(attrs) + + # If possible, determine ahead of time whether this tag is an + # XML tag. + if builder: + self.known_xml = builder.is_xml + else: + self.known_xml = is_xml + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + + if builder is None: + # In the absence of a TreeBuilder, use whatever values were + # passed in here. They're probably None, unless this is a copy of some + # other tag. + self.can_be_empty_element = can_be_empty_element + self.cdata_list_attributes = cdata_list_attributes + self.preserve_whitespace_tags = preserve_whitespace_tags + self.interesting_string_types = interesting_string_types + else: + # Set up any substitutions for this tag, such as the charset in a META tag. + builder.set_up_substitutions(self) + + # Ask the TreeBuilder whether this tag might be an empty-element tag. + self.can_be_empty_element = builder.can_be_empty_element(name) + + # Keep track of the list of attributes of this tag that + # might need to be treated as a list. + # + # For performance reasons, we store the whole data structure + # rather than asking the question of every tag. Asking would + # require building a new data structure every time, and + # (unlike can_be_empty_element), we almost never need + # to check this. + self.cdata_list_attributes = builder.cdata_list_attributes + + # Keep track of the names that might cause this tag to be treated as a + # whitespace-preserved tag. + self.preserve_whitespace_tags = builder.preserve_whitespace_tags + + if self.name in builder.string_containers: + # This sort of tag uses a special string container + # subclass for most of its strings. When we ask the + self.interesting_string_types = builder.string_containers[self.name] + else: + self.interesting_string_types = self.DEFAULT_INTERESTING_STRING_TYPES + + parserClass = _alias("parser_class") # BS3 + + def __deepcopy__(self, memo, recursive=True): + """A deepcopy of a Tag is a new Tag, unconnected to the parse tree. + Its contents are a copy of the old Tag's contents. + """ + clone = self._clone() + + if recursive: + # Clone this tag's descendants recursively, but without + # making any recursive function calls. + tag_stack = [clone] + for event, element in self._event_stream(self.descendants): + if event is Tag.END_ELEMENT_EVENT: + # Stop appending incoming Tags to the Tag that was + # just closed. + tag_stack.pop() + else: + descendant_clone = element.__deepcopy__( + memo, recursive=False + ) + # Add to its parent's .contents + tag_stack[-1].append(descendant_clone) + + if event is Tag.START_ELEMENT_EVENT: + # Add the Tag itself to the stack so that its + # children will be .appended to it. + tag_stack.append(descendant_clone) + return clone + + def __copy__(self): + """A copy of a Tag must always be a deep copy, because a Tag's + children can only have one parent at a time. + """ + return self.__deepcopy__({}) + + def _clone(self): + """Create a new Tag just like this one, but with no + contents and unattached to any parse tree. + + This is the first step in the deepcopy process. + """ + clone = type(self)( + None, self.builder, self.name, self.namespace, + self.prefix, self.attrs, is_xml=self._is_xml, + sourceline=self.sourceline, sourcepos=self.sourcepos, + can_be_empty_element=self.can_be_empty_element, + cdata_list_attributes=self.cdata_list_attributes, + preserve_whitespace_tags=self.preserve_whitespace_tags, + interesting_string_types=self.interesting_string_types + ) + for attr in ('can_be_empty_element', 'hidden'): + setattr(clone, attr, getattr(self, attr)) + return clone + + @property + def is_empty_element(self): + """Is this tag an empty-element tag? (aka a self-closing tag) + + A tag that has contents is never an empty-element tag. + + A tag that has no contents may or may not be an empty-element + tag. It depends on the builder used to create the tag. If the + builder has a designated list of empty-element tags, then only + a tag whose name shows up in that list is considered an + empty-element tag. + + If the builder has no designated list of empty-element tags, + then any tag with no contents is an empty-element tag. + """ + return len(self.contents) == 0 and self.can_be_empty_element + isSelfClosing = is_empty_element # BS3 + + @property + def string(self): + """Convenience property to get the single string within this + PageElement. + + TODO It might make sense to have NavigableString.string return + itself. + + :return: If this element has a single string child, return + value is that string. If this element has one child tag, + return value is the 'string' attribute of the child tag, + recursively. If this element is itself a string, has no + children, or has more than one child, return value is None. + """ + if len(self.contents) != 1: + return None + child = self.contents[0] + if isinstance(child, NavigableString): + return child + return child.string + + @string.setter + def string(self, string): + """Replace this PageElement's contents with `string`.""" + self.clear() + self.append(string.__class__(string)) + + DEFAULT_INTERESTING_STRING_TYPES = (NavigableString, CData) + def _all_strings(self, strip=False, types=PageElement.default): + """Yield all strings of certain classes, possibly stripping them. + + :param strip: If True, all strings will be stripped before being + yielded. + + :param types: A tuple of NavigableString subclasses. Any strings of + a subclass not found in this list will be ignored. By + default, the subclasses considered are the ones found in + self.interesting_string_types. If that's not specified, + only NavigableString and CData objects will be + considered. That means no comments, processing + instructions, etc. + + :yield: A sequence of strings. + + """ + if types is self.default: + types = self.interesting_string_types + + for descendant in self.descendants: + if (types is None and not isinstance(descendant, NavigableString)): + continue + descendant_type = type(descendant) + if isinstance(types, type): + if descendant_type is not types: + # We're not interested in strings of this type. + continue + elif types is not None and descendant_type not in types: + # We're not interested in strings of this type. + continue + if strip: + descendant = descendant.strip() + if len(descendant) == 0: + continue + yield descendant + strings = property(_all_strings) + + def decompose(self): + """Recursively destroys this PageElement and its children. + + This element will be removed from the tree and wiped out; so + will everything beneath it. + + The behavior of a decomposed PageElement is undefined and you + should never use one for anything, but if you need to _check_ + whether an element has been decomposed, you can use the + `decomposed` property. + """ + self.extract() + i = self + while i is not None: + n = i.next_element + i.__dict__.clear() + i.contents = [] + i._decomposed = True + i = n + + def clear(self, decompose=False): + """Wipe out all children of this PageElement by calling extract() + on them. + + :param decompose: If this is True, decompose() (a more + destructive method) will be called instead of extract(). + """ + if decompose: + for element in self.contents[:]: + if isinstance(element, Tag): + element.decompose() + else: + element.extract() + else: + for element in self.contents[:]: + element.extract() + + def smooth(self): + """Smooth out this element's children by consolidating consecutive + strings. + + This makes pretty-printed output look more natural following a + lot of operations that modified the tree. + """ + # Mark the first position of every pair of children that need + # to be consolidated. Do this rather than making a copy of + # self.contents, since in most cases very few strings will be + # affected. + marked = [] + for i, a in enumerate(self.contents): + if isinstance(a, Tag): + # Recursively smooth children. + a.smooth() + if i == len(self.contents)-1: + # This is the last item in .contents, and it's not a + # tag. There's no chance it needs any work. + continue + b = self.contents[i+1] + if (isinstance(a, NavigableString) + and isinstance(b, NavigableString) + and not isinstance(a, PreformattedString) + and not isinstance(b, PreformattedString) + ): + marked.append(i) + + # Go over the marked positions in reverse order, so that + # removing items from .contents won't affect the remaining + # positions. + for i in reversed(marked): + a = self.contents[i] + b = self.contents[i+1] + b.extract() + n = NavigableString(a+b) + a.replace_with(n) + + def index(self, element): + """Find the index of a child by identity, not value. + + Avoids issues with tag.contents.index(element) getting the + index of equal elements. + + :param element: Look for this PageElement in `self.contents`. + """ + for i, child in enumerate(self.contents): + if child is element: + return i + raise ValueError("Tag.index: element not in tag") + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self.attrs.get(key, default) + + def get_attribute_list(self, key, default=None): + """The same as get(), but always returns a list. + + :param key: The attribute to look for. + :param default: Use this value if the attribute is not present + on this PageElement. + :return: A list of values, probably containing only a single + value. + """ + value = self.get(key, default) + if not isinstance(value, list): + value = [value] + return value + + def has_attr(self, key): + """Does this PageElement have an attribute with the given name?""" + return key in self.attrs + + def __hash__(self): + return str(self).__hash__() + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the Tag, + and throws an exception if it's not there.""" + return self.attrs[key] + + def __iter__(self): + "Iterating over a Tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a Tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __bool__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self.attrs[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + self.attrs.pop(key, None) + + def __call__(self, *args, **kwargs): + """Calling a Tag like a function is the same as calling its + find_all() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return self.find_all(*args, **kwargs) + + def __getattr__(self, tag): + """Calling tag.subtag is the same as calling tag.find(name="subtag")""" + #print("Getattr %s.%s" % (self.__class__, tag)) + if len(tag) > 3 and tag.endswith('Tag'): + # BS3: soup.aTag -> "soup.find("a") + tag_name = tag[:-3] + warnings.warn( + '.%(name)sTag is deprecated, use .find("%(name)s") instead. If you really were looking for a tag called %(name)sTag, use .find("%(name)sTag")' % dict( + name=tag_name + ), + DeprecationWarning, stacklevel=2 + ) + return self.find(tag_name) + # We special case contents to avoid recursion. + elif not tag.startswith("__") and not tag == "contents": + return self.find(tag) + raise AttributeError( + "'%s' object has no attribute '%s'" % (self.__class__, tag)) + + def __eq__(self, other): + """Returns true iff this Tag has the same name, the same attributes, + and the same contents (recursively) as `other`.""" + if self is other: + return True + if (not hasattr(other, 'name') or + not hasattr(other, 'attrs') or + not hasattr(other, 'contents') or + self.name != other.name or + self.attrs != other.attrs or + len(self) != len(other)): + return False + for i, my_child in enumerate(self.contents): + if my_child != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this Tag is not identical to `other`, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding="unicode-escape"): + """Renders this PageElement as a string. + + :param encoding: The encoding to use (Python 2 only). + TODO: This is now ignored and a warning should be issued + if a value is provided. + :return: A (Unicode) string. + """ + # "The return value must be a string object", i.e. Unicode + return self.decode() + + def __unicode__(self): + """Renders this PageElement as a Unicode string.""" + return self.decode() + + __str__ = __repr__ = __unicode__ + + def encode(self, encoding=DEFAULT_OUTPUT_ENCODING, + indent_level=None, formatter="minimal", + errors="xmlcharrefreplace"): + """Render a bytestring representation of this PageElement and its + contents. + + :param encoding: The destination encoding. + :param indent_level: Each line of the rendering will be + indented this many levels. (The formatter decides what a + 'level' means in terms of spaces or other characters + output.) Used internally in recursive calls while + pretty-printing. + :param formatter: A Formatter object, or a string naming one of + the standard formatters. + :param errors: An error handling strategy such as + 'xmlcharrefreplace'. This value is passed along into + encode() and its value should be one of the constants + defined by Python. + :return: A bytestring. + + """ + # Turn the data structure into Unicode, then encode the + # Unicode. + u = self.decode(indent_level, encoding, formatter) + return u.encode(encoding, errors) + + def decode(self, indent_level=None, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal", + iterator=None): + pieces = [] + # First off, turn a non-Formatter `formatter` into a Formatter + # object. This will stop the lookup from happening over and + # over again. + if not isinstance(formatter, Formatter): + formatter = self.formatter_for_name(formatter) + + if indent_level is True: + indent_level = 0 + + # The currently active tag that put us into string literal + # mode. Until this element is closed, children will be treated + # as string literals and not pretty-printed. String literal + # mode is turned on immediately after this tag begins, and + # turned off immediately before it's closed. This means there + # will be whitespace before and after the tag itself. + string_literal_tag = None + + for event, element in self._event_stream(iterator): + if event in (Tag.START_ELEMENT_EVENT, Tag.EMPTY_ELEMENT_EVENT): + piece = element._format_tag( + eventual_encoding, formatter, opening=True + ) + elif event is Tag.END_ELEMENT_EVENT: + piece = element._format_tag( + eventual_encoding, formatter, opening=False + ) + if indent_level is not None: + indent_level -= 1 + else: + piece = element.output_ready(formatter) + + # Now we need to apply the 'prettiness' -- extra + # whitespace before and/or after this tag. This can get + # complicated because certain tags, like <pre> and + # <script>, can't be prettified, since adding whitespace would + # change the meaning of the content. + + # The default behavior is to add whitespace before and + # after an element when string literal mode is off, and to + # leave things as they are when string literal mode is on. + if string_literal_tag: + indent_before = indent_after = False + else: + indent_before = indent_after = True + + # The only time the behavior is more complex than that is + # when we encounter an opening or closing tag that might + # put us into or out of string literal mode. + if (event is Tag.START_ELEMENT_EVENT + and not string_literal_tag + and not element._should_pretty_print()): + # We are about to enter string literal mode. Add + # whitespace before this tag, but not after. We + # will stay in string literal mode until this tag + # is closed. + indent_before = True + indent_after = False + string_literal_tag = element + elif (event is Tag.END_ELEMENT_EVENT + and element is string_literal_tag): + # We are about to exit string literal mode by closing + # the tag that sent us into that mode. Add whitespace + # after this tag, but not before. + indent_before = False + indent_after = True + string_literal_tag = None + + # Now we know whether to add whitespace before and/or + # after this element. + if indent_level is not None: + if (indent_before or indent_after): + if isinstance(element, NavigableString): + piece = piece.strip() + if piece: + piece = self._indent_string( + piece, indent_level, formatter, + indent_before, indent_after + ) + if event == Tag.START_ELEMENT_EVENT: + indent_level += 1 + pieces.append(piece) + return "".join(pieces) + + # Names for the different events yielded by _event_stream + START_ELEMENT_EVENT = object() + END_ELEMENT_EVENT = object() + EMPTY_ELEMENT_EVENT = object() + STRING_ELEMENT_EVENT = object() + + def _event_stream(self, iterator=None): + """Yield a sequence of events that can be used to reconstruct the DOM + for this element. + + This lets us recreate the nested structure of this element + (e.g. when formatting it as a string) without using recursive + method calls. + + This is similar in concept to the SAX API, but it's a simpler + interface designed for internal use. The events are different + from SAX and the arguments associated with the events are Tags + and other Beautiful Soup objects. + + :param iterator: An alternate iterator to use when traversing + the tree. + """ + tag_stack = [] + + iterator = iterator or self.self_and_descendants + + for c in iterator: + # If the parent of the element we're about to yield is not + # the tag currently on the stack, it means that the tag on + # the stack closed before this element appeared. + while tag_stack and c.parent != tag_stack[-1]: + now_closed_tag = tag_stack.pop() + yield Tag.END_ELEMENT_EVENT, now_closed_tag + + if isinstance(c, Tag): + if c.is_empty_element: + yield Tag.EMPTY_ELEMENT_EVENT, c + else: + yield Tag.START_ELEMENT_EVENT, c + tag_stack.append(c) + continue + else: + yield Tag.STRING_ELEMENT_EVENT, c + + while tag_stack: + now_closed_tag = tag_stack.pop() + yield Tag.END_ELEMENT_EVENT, now_closed_tag + + def _indent_string(self, s, indent_level, formatter, + indent_before, indent_after): + """Add indentation whitespace before and/or after a string. + + :param s: The string to amend with whitespace. + :param indent_level: The indentation level; affects how much + whitespace goes before the string. + :param indent_before: Whether or not to add whitespace + before the string. + :param indent_after: Whether or not to add whitespace + (a newline) after the string. + """ + space_before = '' + if indent_before and indent_level: + space_before = (formatter.indent * indent_level) + + space_after = '' + if indent_after: + space_after = "\n" + + return space_before + s + space_after + + def _format_tag(self, eventual_encoding, formatter, opening): + # A tag starts with the < character (see below). + + # Then the / character, if this is a closing tag. + closing_slash = '' + if not opening: + closing_slash = '/' + + # Then an optional namespace prefix. + prefix = '' + if self.prefix: + prefix = self.prefix + ":" + + # Then a list of attribute values, if this is an opening tag. + attribute_string = '' + if opening: + attributes = formatter.attributes(self) + attrs = [] + for key, val in attributes: + if val is None: + decoded = key + else: + if isinstance(val, list) or isinstance(val, tuple): + val = ' '.join(val) + elif not isinstance(val, str): + val = str(val) + elif ( + isinstance(val, AttributeValueWithCharsetSubstitution) + and eventual_encoding is not None + ): + val = val.encode(eventual_encoding) + + text = formatter.attribute_value(val) + decoded = ( + str(key) + '=' + + formatter.quoted_attribute_value(text)) + attrs.append(decoded) + if attrs: + attribute_string = ' ' + ' '.join(attrs) + + # Then an optional closing slash (for a void element in an + # XML document). + void_element_closing_slash = '' + if self.is_empty_element: + void_element_closing_slash = formatter.void_element_close_prefix or '' + + # Put it all together. + return '<' + closing_slash + prefix + self.name + attribute_string + void_element_closing_slash + '>' + + def _should_pretty_print(self, indent_level=1): + """Should this tag be pretty-printed? + + Most of them should, but some (such as <pre> in HTML + documents) should not. + """ + return ( + indent_level is not None + and ( + not self.preserve_whitespace_tags + or self.name not in self.preserve_whitespace_tags + ) + ) + + def prettify(self, encoding=None, formatter="minimal"): + """Pretty-print this PageElement as a string. + + :param encoding: The eventual encoding of the string. If this is None, + a Unicode string will be returned. + :param formatter: A Formatter object, or a string naming one of + the standard formatters. + :return: A Unicode string (if encoding==None) or a bytestring + (otherwise). + """ + if encoding is None: + return self.decode(True, formatter=formatter) + else: + return self.encode(encoding, True, formatter=formatter) + + def decode_contents(self, indent_level=None, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal"): + """Renders the contents of this tag as a Unicode string. + + :param indent_level: Each line of the rendering will be + indented this many levels. (The formatter decides what a + 'level' means in terms of spaces or other characters + output.) Used internally in recursive calls while + pretty-printing. + + :param eventual_encoding: The tag is destined to be + encoded into this encoding. decode_contents() is _not_ + responsible for performing that encoding. This information + is passed in so that it can be substituted in if the + document contains a <META> tag that mentions the document's + encoding. + + :param formatter: A Formatter object, or a string naming one of + the standard Formatters. + + """ + return self.decode(indent_level, eventual_encoding, formatter, + iterator=self.descendants) + + def encode_contents( + self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal"): + """Renders the contents of this PageElement as a bytestring. + + :param indent_level: Each line of the rendering will be + indented this many levels. (The formatter decides what a + 'level' means in terms of spaces or other characters + output.) Used internally in recursive calls while + pretty-printing. + + :param eventual_encoding: The bytestring will be in this encoding. + + :param formatter: A Formatter object, or a string naming one of + the standard Formatters. + + :return: A bytestring. + """ + contents = self.decode_contents(indent_level, encoding, formatter) + return contents.encode(encoding) + + # Old method for BS3 compatibility + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Deprecated method for BS3 compatibility.""" + if not prettyPrint: + indentLevel = None + return self.encode_contents( + indent_level=indentLevel, encoding=encoding) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, string=None, + **kwargs): + """Look in the children of this PageElement and find the first + PageElement that matches the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param recursive: If this is True, find() will perform a + recursive search of this PageElement's children. Otherwise, + only the direct children will be considered. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + r = None + l = self.find_all(name, attrs, recursive, string, 1, _stacklevel=3, + **kwargs) + if l: + r = l[0] + return r + findChild = find #BS2 + + def find_all(self, name=None, attrs={}, recursive=True, string=None, + limit=None, **kwargs): + """Look in the children of this PageElement and find all + PageElements that match the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param recursive: If this is True, find_all() will perform a + recursive search of this PageElement's children. Otherwise, + only the direct children will be considered. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + generator = self.descendants + if not recursive: + generator = self.children + _stacklevel = kwargs.pop('_stacklevel', 2) + return self._find_all(name, attrs, string, limit, generator, + _stacklevel=_stacklevel+1, **kwargs) + findAll = find_all # BS3 + findChildren = find_all # BS2 + + #Generator methods + @property + def children(self): + """Iterate over all direct children of this PageElement. + + :yield: A sequence of PageElements. + """ + # return iter() to make the purpose of the method clear + return iter(self.contents) # XXX This seems to be untested. + + @property + def self_and_descendants(self): + """Iterate over this PageElement and its children in a + breadth-first sequence. + + :yield: A sequence of PageElements. + """ + if not self.hidden: + yield self + for i in self.descendants: + yield i + + @property + def descendants(self): + """Iterate over all children of this PageElement in a + breadth-first sequence. + + :yield: A sequence of PageElements. + """ + if not len(self.contents): + return + stopNode = self._last_descendant().next_element + current = self.contents[0] + while current is not stopNode: + yield current + current = current.next_element + + # CSS selector code + def select_one(self, selector, namespaces=None, **kwargs): + """Perform a CSS selection operation on the current element. + + :param selector: A CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will use the prefixes it encountered while + parsing the document. + + :param kwargs: Keyword arguments to be passed into Soup Sieve's + soupsieve.select() method. + + :return: A Tag. + :rtype: bs4.element.Tag + """ + return self.css.select_one(selector, namespaces, **kwargs) + + def select(self, selector, namespaces=None, limit=None, **kwargs): + """Perform a CSS selection operation on the current element. + + This uses the SoupSieve library. + + :param selector: A string containing a CSS selector. + + :param namespaces: A dictionary mapping namespace prefixes + used in the CSS selector to namespace URIs. By default, + Beautiful Soup will use the prefixes it encountered while + parsing the document. + + :param limit: After finding this number of results, stop looking. + + :param kwargs: Keyword arguments to be passed into SoupSieve's + soupsieve.select() method. + + :return: A ResultSet of Tags. + :rtype: bs4.element.ResultSet + """ + return self.css.select(selector, namespaces, limit, **kwargs) + + @property + def css(self): + """Return an interface to the CSS selector API.""" + return CSS(self) + + # Old names for backwards compatibility + def childGenerator(self): + """Deprecated generator.""" + return self.children + + def recursiveChildGenerator(self): + """Deprecated generator.""" + return self.descendants + + def has_key(self, key): + """Deprecated method. This was kind of misleading because has_key() + (attributes) was different from __in__ (contents). + + has_key() is gone in Python 3, anyway. + """ + warnings.warn( + 'has_key is deprecated. Use has_attr(key) instead.', + DeprecationWarning, stacklevel=2 + ) + return self.has_attr(key) + +# Next, a couple classes to represent queries and their results. +class SoupStrainer(object): + """Encapsulates a number of ways of matching a markup element (tag or + string). + + This is primarily used to underpin the find_* methods, but you can + create one yourself and pass it in as `parse_only` to the + `BeautifulSoup` constructor, to parse a subset of a large + document. + """ + + def __init__(self, name=None, attrs={}, string=None, **kwargs): + """Constructor. + + The SoupStrainer constructor takes the same arguments passed + into the find_* methods. See the online documentation for + detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param string: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + """ + if string is None and 'text' in kwargs: + string = kwargs.pop('text') + warnings.warn( + "The 'text' argument to the SoupStrainer constructor is deprecated. Use 'string' instead.", + DeprecationWarning, stacklevel=2 + ) + + self.name = self._normalize_search_value(name) + if not isinstance(attrs, dict): + # Treat a non-dict value for attrs as a search for the 'class' + # attribute. + kwargs['class'] = attrs + attrs = None + + if 'class_' in kwargs: + # Treat class_="foo" as a search for the 'class' + # attribute, overriding any non-dict value for attrs. + kwargs['class'] = kwargs['class_'] + del kwargs['class_'] + + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + normalized_attrs = {} + for key, value in list(attrs.items()): + normalized_attrs[key] = self._normalize_search_value(value) + + self.attrs = normalized_attrs + self.string = self._normalize_search_value(string) + + # DEPRECATED but just in case someone is checking this. + self.text = self.string + + def _normalize_search_value(self, value): + # Leave it alone if it's a Unicode string, a callable, a + # regular expression, a boolean, or None. + if (isinstance(value, str) or isinstance(value, Callable) or hasattr(value, 'match') + or isinstance(value, bool) or value is None): + return value + + # If it's a bytestring, convert it to Unicode, treating it as UTF-8. + if isinstance(value, bytes): + return value.decode("utf8") + + # If it's listlike, convert it into a list of strings. + if hasattr(value, '__iter__'): + new_value = [] + for v in value: + if (hasattr(v, '__iter__') and not isinstance(v, bytes) + and not isinstance(v, str)): + # This is almost certainly the user's mistake. In the + # interests of avoiding infinite loops, we'll let + # it through as-is rather than doing a recursive call. + new_value.append(v) + else: + new_value.append(self._normalize_search_value(v)) + return new_value + + # Otherwise, convert it into a Unicode string. + # The unicode(str()) thing is so this will do the same thing on Python 2 + # and Python 3. + return str(str(value)) + + def __str__(self): + """A human-readable representation of this SoupStrainer.""" + if self.string: + return self.string + else: + return "%s|%s" % (self.name, self.attrs) + + def search_tag(self, markup_name=None, markup_attrs={}): + """Check whether a Tag with the given name and attributes would + match this SoupStrainer. + + Used prospectively to decide whether to even bother creating a Tag + object. + + :param markup_name: A tag name as found in some markup. + :param markup_attrs: A dictionary of attributes as found in some markup. + + :return: True if the prospective tag would match this SoupStrainer; + False otherwise. + """ + found = None + markup = None + if isinstance(markup_name, Tag): + markup = markup_name + markup_attrs = markup + + if isinstance(self.name, str): + # Optimization for a very common case where the user is + # searching for a tag with one specific name, and we're + # looking at a tag with a different name. + if markup and not markup.prefix and self.name != markup.name: + return False + + call_function_with_tag_data = ( + isinstance(self.name, Callable) + and not isinstance(markup_name, Tag)) + + if ((not self.name) + or call_function_with_tag_data + or (markup and self._matches(markup, self.name)) + or (not markup and self._matches(markup_name, self.name))): + if call_function_with_tag_data: + match = self.name(markup_name, markup_attrs) + else: + match = True + markup_attr_map = None + for attr, match_against in list(self.attrs.items()): + if not markup_attr_map: + if hasattr(markup_attrs, 'get'): + markup_attr_map = markup_attrs + else: + markup_attr_map = {} + for k, v in markup_attrs: + markup_attr_map[k] = v + attr_value = markup_attr_map.get(attr) + if not self._matches(attr_value, match_against): + match = False + break + if match: + if markup: + found = markup + else: + found = markup_name + if found and self.string and not self._matches(found.string, self.string): + found = None + return found + + # For BS3 compatibility. + searchTag = search_tag + + def search(self, markup): + """Find all items in `markup` that match this SoupStrainer. + + Used by the core _find_all() method, which is ultimately + called by all find_* methods. + + :param markup: A PageElement or a list of them. + """ + # print('looking for %s in %s' % (self, markup)) + found = None + # If given a list of items, scan it for a text element that + # matches. + if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, str)): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.string or self.name or self.attrs: + found = self.search_tag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isinstance(markup, str): + if not self.name and not self.attrs and self._matches(markup, self.string): + found = markup + else: + raise Exception( + "I don't know how to match against a %s" % markup.__class__) + return found + + def _matches(self, markup, match_against, already_tried=None): + # print(u"Matching %s against %s" % (markup, match_against)) + result = False + if isinstance(markup, list) or isinstance(markup, tuple): + # This should only happen when searching a multi-valued attribute + # like 'class'. + for item in markup: + if self._matches(item, match_against): + return True + # We didn't match any particular value of the multivalue + # attribute, but maybe we match the attribute value when + # considered as a string. + if self._matches(' '.join(markup), match_against): + return True + return False + + if match_against is True: + # True matches any non-None value. + return markup is not None + + if isinstance(match_against, Callable): + return match_against(markup) + + # Custom callables take the tag as an argument, but all + # other ways of matching match the tag name as a string. + original_markup = markup + if isinstance(markup, Tag): + markup = markup.name + + # Ensure that `markup` is either a Unicode string, or None. + markup = self._normalize_search_value(markup) + + if markup is None: + # None matches None, False, an empty string, an empty list, and so on. + return not match_against + + if (hasattr(match_against, '__iter__') + and not isinstance(match_against, str)): + # We're asked to match against an iterable of items. + # The markup must be match at least one item in the + # iterable. We'll try each one in turn. + # + # To avoid infinite recursion we need to keep track of + # items we've already seen. + if not already_tried: + already_tried = set() + for item in match_against: + if item.__hash__: + key = item + else: + key = id(item) + if key in already_tried: + continue + else: + already_tried.add(key) + if self._matches(original_markup, item, already_tried): + return True + else: + return False + + # Beyond this point we might need to run the test twice: once against + # the tag's name and once against its prefixed name. + match = False + + if not match and isinstance(match_against, str): + # Exact string match + match = markup == match_against + + if not match and hasattr(match_against, 'search'): + # Regexp match + return match_against.search(markup) + + if (not match + and isinstance(original_markup, Tag) + and original_markup.prefix): + # Try the whole thing again with the prefixed tag name. + return self._matches( + original_markup.prefix + ':' + original_markup.name, match_against + ) + + return match + + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + def __init__(self, source, result=()): + """Constructor. + + :param source: A SoupStrainer. + :param result: A list of PageElements. + """ + super(ResultSet, self).__init__(result) + self.source = source + + def __getattr__(self, key): + """Raise a helpful exception to explain a common code fix.""" + raise AttributeError( + "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key + ) diff --git a/python/lib/python3.11/site-packages/bs4/formatter.py b/python/lib/python3.11/site-packages/bs4/formatter.py new file mode 100644 index 0000000..c821318 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/formatter.py @@ -0,0 +1,185 @@ +from bs4.dammit import EntitySubstitution + +class Formatter(EntitySubstitution): + """Describes a strategy to use when outputting a parse tree to a string. + + Some parts of this strategy come from the distinction between + HTML4, HTML5, and XML. Others are configurable by the user. + + Formatters are passed in as the `formatter` argument to methods + like `PageElement.encode`. Most people won't need to think about + formatters, and most people who need to think about them can pass + in one of these predefined strings as `formatter` rather than + making a new Formatter object: + + For HTML documents: + * 'html' - HTML entity substitution for generic HTML documents. (default) + * 'html5' - HTML entity substitution for HTML5 documents, as + well as some optimizations in the way tags are rendered. + * 'minimal' - Only make the substitutions necessary to guarantee + valid HTML. + * None - Do not perform any substitution. This will be faster + but may result in invalid markup. + + For XML documents: + * 'html' - Entity substitution for XHTML documents. + * 'minimal' - Only make the substitutions necessary to guarantee + valid XML. (default) + * None - Do not perform any substitution. This will be faster + but may result in invalid markup. + """ + # Registries of XML and HTML formatters. + XML_FORMATTERS = {} + HTML_FORMATTERS = {} + + HTML = 'html' + XML = 'xml' + + HTML_DEFAULTS = dict( + cdata_containing_tags=set(["script", "style"]), + ) + + def _default(self, language, value, kwarg): + if value is not None: + return value + if language == self.XML: + return set() + return self.HTML_DEFAULTS[kwarg] + + def __init__( + self, language=None, entity_substitution=None, + void_element_close_prefix='/', cdata_containing_tags=None, + empty_attributes_are_booleans=False, indent=1, + ): + """Constructor. + + :param language: This should be Formatter.XML if you are formatting + XML markup and Formatter.HTML if you are formatting HTML markup. + + :param entity_substitution: A function to call to replace special + characters with XML/HTML entities. For examples, see + bs4.dammit.EntitySubstitution.substitute_html and substitute_xml. + :param void_element_close_prefix: By default, void elements + are represented as <tag/> (XML rules) rather than <tag> + (HTML rules). To get <tag>, pass in the empty string. + :param cdata_containing_tags: The list of tags that are defined + as containing CDATA in this dialect. For example, in HTML, + <script> and <style> tags are defined as containing CDATA, + and their contents should not be formatted. + :param blank_attributes_are_booleans: Render attributes whose value + is the empty string as HTML-style boolean attributes. + (Attributes whose value is None are always rendered this way.) + + :param indent: If indent is a non-negative integer or string, + then the contents of elements will be indented + appropriately when pretty-printing. An indent level of 0, + negative, or "" will only insert newlines. Using a + positive integer indent indents that many spaces per + level. If indent is a string (such as "\t"), that string + is used to indent each level. The default behavior to + indent one space per level. + """ + self.language = language + self.entity_substitution = entity_substitution + self.void_element_close_prefix = void_element_close_prefix + self.cdata_containing_tags = self._default( + language, cdata_containing_tags, 'cdata_containing_tags' + ) + self.empty_attributes_are_booleans=empty_attributes_are_booleans + if indent is None: + indent = 0 + if isinstance(indent, int): + if indent < 0: + indent = 0 + indent = ' ' * indent + elif isinstance(indent, str): + indent = indent + else: + indent = ' ' + self.indent = indent + + def substitute(self, ns): + """Process a string that needs to undergo entity substitution. + This may be a string encountered in an attribute value or as + text. + + :param ns: A string. + :return: A string with certain characters replaced by named + or numeric entities. + """ + if not self.entity_substitution: + return ns + from .element import NavigableString + if (isinstance(ns, NavigableString) + and ns.parent is not None + and ns.parent.name in self.cdata_containing_tags): + # Do nothing. + return ns + # Substitute. + return self.entity_substitution(ns) + + def attribute_value(self, value): + """Process the value of an attribute. + + :param ns: A string. + :return: A string with certain characters replaced by named + or numeric entities. + """ + return self.substitute(value) + + def attributes(self, tag): + """Reorder a tag's attributes however you want. + + By default, attributes are sorted alphabetically. This makes + behavior consistent between Python 2 and Python 3, and preserves + backwards compatibility with older versions of Beautiful Soup. + + If `empty_boolean_attributes` is True, then attributes whose + values are set to the empty string will be treated as boolean + attributes. + """ + if tag.attrs is None: + return [] + return sorted( + (k, (None if self.empty_attributes_are_booleans and v == '' else v)) + for k, v in list(tag.attrs.items()) + ) + +class HTMLFormatter(Formatter): + """A generic Formatter for HTML.""" + REGISTRY = {} + def __init__(self, *args, **kwargs): + super(HTMLFormatter, self).__init__(self.HTML, *args, **kwargs) + + +class XMLFormatter(Formatter): + """A generic Formatter for XML.""" + REGISTRY = {} + def __init__(self, *args, **kwargs): + super(XMLFormatter, self).__init__(self.XML, *args, **kwargs) + + +# Set up aliases for the default formatters. +HTMLFormatter.REGISTRY['html'] = HTMLFormatter( + entity_substitution=EntitySubstitution.substitute_html +) +HTMLFormatter.REGISTRY["html5"] = HTMLFormatter( + entity_substitution=EntitySubstitution.substitute_html, + void_element_close_prefix=None, + empty_attributes_are_booleans=True, +) +HTMLFormatter.REGISTRY["minimal"] = HTMLFormatter( + entity_substitution=EntitySubstitution.substitute_xml +) +HTMLFormatter.REGISTRY[None] = HTMLFormatter( + entity_substitution=None +) +XMLFormatter.REGISTRY["html"] = XMLFormatter( + entity_substitution=EntitySubstitution.substitute_html +) +XMLFormatter.REGISTRY["minimal"] = XMLFormatter( + entity_substitution=EntitySubstitution.substitute_xml +) +XMLFormatter.REGISTRY[None] = Formatter( + Formatter(Formatter.XML, entity_substitution=None) +) diff --git a/python/lib/python3.11/site-packages/bs4/tests/__init__.py b/python/lib/python3.11/site-packages/bs4/tests/__init__.py new file mode 100644 index 0000000..dbb1593 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/tests/__init__.py @@ -0,0 +1,1177 @@ +# encoding: utf-8 +"""Helper classes for tests.""" + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +import pickle +import copy +import functools +import warnings +import pytest +from bs4 import BeautifulSoup +from bs4.element import ( + CharsetMetaAttributeValue, + Comment, + ContentMetaAttributeValue, + Doctype, + PYTHON_SPECIFIC_ENCODINGS, + SoupStrainer, + Script, + Stylesheet, + Tag +) + +from bs4.builder import ( + DetectsXMLParsedAsHTML, + HTMLParserTreeBuilder, + XMLParsedAsHTMLWarning, +) +default_builder = HTMLParserTreeBuilder + +# Some tests depend on specific third-party libraries. We use +# @pytest.mark.skipIf on the following conditionals to skip them +# if the libraries are not installed. +try: + from soupsieve import SelectorSyntaxError + SOUP_SIEVE_PRESENT = True +except ImportError: + SOUP_SIEVE_PRESENT = False + +try: + import html5lib + HTML5LIB_PRESENT = True +except ImportError: + HTML5LIB_PRESENT = False + +try: + import lxml.etree + LXML_PRESENT = True + LXML_VERSION = lxml.etree.LXML_VERSION +except ImportError: + LXML_PRESENT = False + LXML_VERSION = (0,) + +BAD_DOCUMENT = """A bare string +<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd"> +<!DOCTYPE xsl:stylesheet PUBLIC "htmlent.dtd"> +<div><![CDATA[A CDATA section where it doesn't belong]]></div> +<div><svg><![CDATA[HTML5 does allow CDATA sections in SVG]]></svg></div> +<div>A <meta> tag</div> +<div>A <br> tag that supposedly has contents.</br></div> +<div>AT&T</div> +<div><textarea>Within a textarea, markup like <b> tags and <&<& should be treated as literal</textarea></div> +<div><script>if (i < 2) { alert("<b>Markup within script tags should be treated as literal.</b>"); }</script></div> +<div>This numeric entity is missing the final semicolon: <x t="piñata"></div> +<div><a href="http://example.com/</a> that attribute value never got closed</div> +<div><a href="foo</a>, </a><a href="bar">that attribute value was closed by the subsequent tag</a></div> +<! This document starts with a bogus declaration ><div>a</div> +<div>This document contains <!an incomplete declaration <div>(do you see it?)</div> +<div>This document ends with <!an incomplete declaration +<div><a style={height:21px;}>That attribute value was bogus</a></div> +<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">The doctype is invalid because it contains extra whitespace +<div><table><td nowrap>That boolean attribute had no value</td></table></div> +<div>Here's a nonexistent entity: &#foo; (do you see it?)</div> +<div>This document ends before the entity finishes: > +<div><p>Paragraphs shouldn't contain block display elements, but this one does: <dl><dt>you see?</dt></p> +<b b="20" a="1" b="10" a="2" a="3" a="4">Multiple values for the same attribute.</b> +<div><table><tr><td>Here's a table</td></tr></table></div> +<div><table id="1"><tr><td>Here's a nested table:<table id="2"><tr><td>foo</td></tr></table></td></div> +<div>This tag contains nothing but whitespace: <b> </b></div> +<div><blockquote><p><b>This p tag is cut off by</blockquote></p>the end of the blockquote tag</div> +<div><table><div>This table contains bare markup</div></table></div> +<div><div id="1">\n <a href="link1">This link is never closed.\n</div>\n<div id="2">\n <div id="3">\n <a href="link2">This link is closed.</a>\n </div>\n</div></div> +<div>This document contains a <!DOCTYPE surprise>surprise doctype</div> +<div><a><B><Cd><EFG>Mixed case tags are folded to lowercase</efg></CD></b></A></div> +<div><our\u2603>Tag name contains Unicode characters</our\u2603></div> +<div><a \u2603="snowman">Attribute name contains Unicode characters</a></div> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +""" + + +class SoupTest(object): + + @property + def default_builder(self): + return default_builder + + def soup(self, markup, **kwargs): + """Build a Beautiful Soup object from markup.""" + builder = kwargs.pop('builder', self.default_builder) + return BeautifulSoup(markup, builder=builder, **kwargs) + + def document_for(self, markup, **kwargs): + """Turn an HTML fragment into a document. + + The details depend on the builder. + """ + return self.default_builder(**kwargs).test_fragment_to_document(markup) + + def assert_soup(self, to_parse, compare_parsed_to=None): + """Parse some markup using Beautiful Soup and verify that + the output markup is as expected. + """ + builder = self.default_builder + obj = BeautifulSoup(to_parse, builder=builder) + if compare_parsed_to is None: + compare_parsed_to = to_parse + + # Verify that the documents come out the same. + assert obj.decode() == self.document_for(compare_parsed_to) + + # Also run some checks on the BeautifulSoup object itself: + + # Verify that every tag that was opened was eventually closed. + + # There are no tags in the open tag counter. + assert all(v==0 for v in list(obj.open_tag_counter.values())) + + # The only tag in the tag stack is the one for the root + # document. + assert [obj.ROOT_TAG_NAME] == [x.name for x in obj.tagStack] + + assertSoupEquals = assert_soup + + def assertConnectedness(self, element): + """Ensure that next_element and previous_element are properly + set for all descendants of the given element. + """ + earlier = None + for e in element.descendants: + if earlier: + assert e == earlier.next_element + assert earlier == e.previous_element + earlier = e + + def linkage_validator(self, el, _recursive_call=False): + """Ensure proper linkage throughout the document.""" + descendant = None + # Document element should have no previous element or previous sibling. + # It also shouldn't have a next sibling. + if el.parent is None: + assert el.previous_element is None,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_element, None + ) + assert el.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_sibling, None + ) + assert el.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_sibling, None + ) + + idx = 0 + child = None + last_child = None + last_idx = len(el.contents) - 1 + for child in el.contents: + descendant = None + + # Parent should link next element to their first child + # That child should have no previous sibling + if idx == 0: + if el.parent is not None: + assert el.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_element, child + ) + assert child.previous_element is el,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + child, child.previous_element, el + ) + assert child.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED: {}".format( + child, child.previous_sibling, None + ) + + # If not the first child, previous index should link as sibling to this index + # Previous element should match the last index or the last bubbled up descendant + else: + assert child.previous_sibling is el.contents[idx - 1],\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED {}".format( + child, child.previous_sibling, el.contents[idx - 1] + ) + assert el.contents[idx - 1].next_sibling is child,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + el.contents[idx - 1], el.contents[idx - 1].next_sibling, child + ) + + if last_child is not None: + assert child.previous_element is last_child,\ + "Bad previous_element\nNODE: {}\nPREV {}\nEXPECTED {}\nCONTENTS {}".format( + child, child.previous_element, last_child, child.parent.contents + ) + assert last_child.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + last_child, last_child.next_element, child + ) + + if isinstance(child, Tag) and child.contents: + descendant = self.linkage_validator(child, True) + # A bubbled up descendant should have no next siblings + assert descendant.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + descendant, descendant.next_sibling, None + ) + + # Mark last child as either the bubbled up descendant or the current child + if descendant is not None: + last_child = descendant + else: + last_child = child + + # If last child, there are non next siblings + if idx == last_idx: + assert child.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_sibling, None + ) + idx += 1 + + child = descendant if descendant is not None else child + if child is None: + child = el + + if not _recursive_call and child is not None: + target = el + while True: + if target is None: + assert child.next_element is None, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, None + ) + break + elif target.next_sibling is not None: + assert child.next_element is target.next_sibling, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, target.next_sibling + ) + break + target = target.parent + + # We are done, so nothing to return + return None + else: + # Return the child to the recursive caller + return child + + def assert_selects(self, tags, should_match): + """Make sure that the given tags have the correct text. + + This is used in tests that define a bunch of tags, each + containing a single string, and then select certain strings by + some mechanism. + """ + assert [tag.string for tag in tags] == should_match + + def assert_selects_ids(self, tags, should_match): + """Make sure that the given tags have the correct IDs. + + This is used in tests that define a bunch of tags, each + containing a single string, and then select certain strings by + some mechanism. + """ + assert [tag['id'] for tag in tags] == should_match + + +class TreeBuilderSmokeTest(object): + # Tests that are common to HTML and XML tree builders. + + @pytest.mark.parametrize( + "multi_valued_attributes", + [None, {}, dict(b=['class']), {'*': ['notclass']}] + ) + def test_attribute_not_multi_valued(self, multi_valued_attributes): + markup = '<html xmlns="http://www.w3.org/1999/xhtml"><a class="a b c"></html>' + soup = self.soup(markup, multi_valued_attributes=multi_valued_attributes) + assert soup.a['class'] == 'a b c' + + @pytest.mark.parametrize( + "multi_valued_attributes", [dict(a=['class']), {'*': ['class']}] + ) + def test_attribute_multi_valued(self, multi_valued_attributes): + markup = '<a class="a b c">' + soup = self.soup( + markup, multi_valued_attributes=multi_valued_attributes + ) + assert soup.a['class'] == ['a', 'b', 'c'] + + def test_invalid_doctype(self): + markup = '<![if word]>content<![endif]>' + markup = '<!DOCTYPE html]ff>' + soup = self.soup(markup) + +class HTMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + + """A basic test of a treebuilder's competence. + + Any HTML treebuilder, present or future, should be able to pass + these tests. With invalid markup, there's room for interpretation, + and different parsers can handle it differently. But with the + markup in these tests, there's not much room for interpretation. + """ + + def test_empty_element_tags(self): + """Verify that all HTML4 and HTML5 empty element (aka void element) tags + are handled correctly. + """ + for name in [ + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', + 'spacer', 'frame' + ]: + soup = self.soup("") + new_tag = soup.new_tag(name) + assert new_tag.is_empty_element == True + + def test_special_string_containers(self): + soup = self.soup( + "<style>Some CSS</style><script>Some Javascript</script>" + ) + assert isinstance(soup.style.string, Stylesheet) + assert isinstance(soup.script.string, Script) + + soup = self.soup( + "<style><!--Some CSS--></style>" + ) + assert isinstance(soup.style.string, Stylesheet) + # The contents of the style tag resemble an HTML comment, but + # it's not treated as a comment. + assert soup.style.string == "<!--Some CSS-->" + assert isinstance(soup.style.string, Stylesheet) + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("<a><b>foo</a>") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + assert loaded.__class__ == BeautifulSoup + assert loaded.decode() == tree.decode() + + def assertDoctypeHandled(self, doctype_fragment): + """Assert that a given doctype string is handled correctly.""" + doctype_str, soup = self._document_with_doctype(doctype_fragment) + + # Make sure a Doctype object was created. + doctype = soup.contents[0] + assert doctype.__class__ == Doctype + assert doctype == doctype_fragment + assert soup.encode("utf8")[:len(doctype_str)] == doctype_str + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + assert soup.p.contents[0] == 'foo' + + def _document_with_doctype(self, doctype_fragment, doctype_string="DOCTYPE"): + """Generate and parse a document with the given doctype.""" + doctype = '<!%s %s>' % (doctype_string, doctype_fragment) + markup = doctype + '\n<p>foo</p>' + soup = self.soup(markup) + return doctype.encode("utf8"), soup + + def test_normal_doctypes(self): + """Make sure normal, everyday HTML doctypes are handled correctly.""" + self.assertDoctypeHandled("html") + self.assertDoctypeHandled( + 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"') + + def test_empty_doctype(self): + soup = self.soup("<!DOCTYPE>") + doctype = soup.contents[0] + assert "" == doctype.strip() + + def test_mixed_case_doctype(self): + # A lowercase or mixed-case doctype becomes a Doctype. + for doctype_fragment in ("doctype", "DocType"): + doctype_str, soup = self._document_with_doctype( + "html", doctype_fragment + ) + + # Make sure a Doctype object was created and that the DOCTYPE + # is uppercase. + doctype = soup.contents[0] + assert doctype.__class__ == Doctype + assert doctype == "html" + assert soup.encode("utf8")[:len(doctype_str)] == b"<!DOCTYPE html>" + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + assert soup.p.contents[0] == 'foo' + + def test_public_doctype_with_url(self): + doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' + self.assertDoctypeHandled(doctype) + + def test_system_doctype(self): + self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"') + + def test_namespaced_system_doctype(self): + # We can handle a namespaced doctype with a system ID. + self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"') + + def test_namespaced_public_doctype(self): + # Test a namespaced doctype with a public id. + self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"') + + def test_real_xhtml_document(self): + """A real XHTML document should come out more or less the same as it went in.""" + markup = b"""<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head><title>Hello. +Goodbye. +""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.encode("utf-8").replace(b"\n", b"") == markup.replace(b"\n", b"") + + # No warning was issued about parsing an XML document as HTML, + # because XHTML is both. + assert w == [] + + + def test_namespaced_html(self): + # When a namespaced XML document is parsed as HTML it should + # be treated as HTML with weird tag names. + markup = b"""content""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + + assert 2 == len(soup.find_all("ns1:foo")) + + # n.b. no "you're parsing XML as HTML" warning was given + # because there was no XML declaration. + assert [] == w + + def test_detect_xml_parsed_as_html(self): + # A warning is issued when parsing an XML document as HTML, + # but basic stuff should still work. + markup = b"""string""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.tag.string == 'string' + [warning] = w + assert isinstance(warning.message, XMLParsedAsHTMLWarning) + assert str(warning.message) == XMLParsedAsHTMLWarning.MESSAGE + + # NOTE: the warning is not issued if the document appears to + # be XHTML (tested with test_real_xhtml_document in the + # superclass) or if there is no XML declaration (tested with + # test_namespaced_html in the superclass). + + def test_processing_instruction(self): + # We test both Unicode and bytestring to verify that + # process_markup correctly sets processing_instruction_class + # even when the markup is already Unicode and there is no + # need to process anything. + markup = """""" + soup = self.soup(markup) + assert markup == soup.decode() + + markup = b"""""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_deepcopy(self): + """Make sure you can copy the tree builder. + + This is important because the builder is part of a + BeautifulSoup object, and we want to be able to copy that. + """ + copy.deepcopy(self.default_builder) + + def test_p_tag_is_never_empty_element(self): + """A

      tag is never designated as an empty-element tag. + + Even if the markup shows it as an empty-element tag, it + shouldn't be presented that way. + """ + soup = self.soup("

      ") + assert not soup.p.is_empty_element + assert str(soup.p) == "

      " + + def test_unclosed_tags_get_closed(self): + """A tag that's not closed by the end of the document should be closed. + + This applies to all tags except empty-element tags. + """ + self.assert_soup("

      ", "

      ") + self.assert_soup("", "") + + self.assert_soup("
      ", "
      ") + + def test_br_is_always_empty_element_tag(self): + """A
      tag is designated as an empty-element tag. + + Some parsers treat

      as one
      tag, some parsers as + two tags, but it should always be an empty-element tag. + """ + soup = self.soup("

      ") + assert soup.br.is_empty_element + assert str(soup.br) == "
      " + + def test_nested_formatting_elements(self): + self.assert_soup("") + + def test_double_head(self): + html = ''' + + +Ordinary HEAD element test + + + +Hello, world! + + +''' + soup = self.soup(html) + assert "text/javascript" == soup.find('script')['type'] + + def test_comment(self): + # Comments are represented as Comment objects. + markup = "

      foobaz

      " + self.assert_soup(markup) + + soup = self.soup(markup) + comment = soup.find(string="foobar") + assert comment.__class__ == Comment + + # The comment is properly integrated into the tree. + foo = soup.find(string="foo") + assert comment == foo.next_element + baz = soup.find(string="baz") + assert comment == baz.previous_element + + def test_preserved_whitespace_in_pre_and_textarea(self): + """Whitespace must be preserved in
       and \n"
      +        self.assert_soup(pre_markup)
      +        self.assert_soup(textarea_markup)
      +
      +        soup = self.soup(pre_markup)
      +        assert soup.pre.prettify() == pre_markup
      +
      +        soup = self.soup(textarea_markup)
      +        assert soup.textarea.prettify() == textarea_markup
      +
      +        soup = self.soup("")
      +        assert soup.textarea.prettify() == "\n"
      +
      +    def test_nested_inline_elements(self):
      +        """Inline elements can be nested indefinitely."""
      +        b_tag = "Inside a B tag"
      +        self.assert_soup(b_tag)
      +
      +        nested_b_tag = "

      A nested tag

      " + self.assert_soup(nested_b_tag) + + double_nested_b_tag = "

      A doubly nested tag

      " + self.assert_soup(nested_b_tag) + + def test_nested_block_level_elements(self): + """Block elements can be nested.""" + soup = self.soup('

      Foo

      ') + blockquote = soup.blockquote + assert blockquote.p.b.string == 'Foo' + assert blockquote.b.string == 'Foo' + + def test_correctly_nested_tables(self): + """One table can go inside another one.""" + markup = ('' + '' + "') + + self.assert_soup( + markup, + '
      Here's another table:" + '' + '' + '
      foo
      Here\'s another table:' + '
      foo
      ' + '
      ') + + self.assert_soup( + "" + "" + "
      Foo
      Bar
      Baz
      ") + + def test_multivalued_attribute_with_whitespace(self): + # Whitespace separating the values of a multi-valued attribute + # should be ignored. + + markup = '
      ' + soup = self.soup(markup) + assert ['foo', 'bar'] == soup.div['class'] + + # If you search by the literal name of the class it's like the whitespace + # wasn't there. + assert soup.div == soup.find('div', class_="foo bar") + + def test_deeply_nested_multivalued_attribute(self): + # html5lib can set the attributes of the same tag many times + # as it rearranges the tree. This has caused problems with + # multivalued attributes. + markup = '
      ' + soup = self.soup(markup) + assert ["css"] == soup.div.div['class'] + + def test_multivalued_attribute_on_html(self): + # html5lib uses a different API to set the attributes ot the + # tag. This has caused problems with multivalued + # attributes. + markup = '' + soup = self.soup(markup) + assert ["a", "b"] == soup.html['class'] + + def test_angle_brackets_in_attribute_values_are_escaped(self): + self.assert_soup('', '') + + def test_strings_resembling_character_entity_references(self): + # "&T" and "&p" look like incomplete character entities, but they are + # not. + self.assert_soup( + "

      • AT&T is in the s&p 500

      ", + "

      \u2022 AT&T is in the s&p 500

      " + ) + + def test_apos_entity(self): + self.assert_soup( + "

      Bob's Bar

      ", + "

      Bob's Bar

      ", + ) + + def test_entities_in_foreign_document_encoding(self): + # “ and ” are invalid numeric entities referencing + # Windows-1252 characters. - references a character common + # to Windows-1252 and Unicode, and ☃ references a + # character only found in Unicode. + # + # All of these entities should be converted to Unicode + # characters. + markup = "

      “Hello” -☃

      " + soup = self.soup(markup) + assert "“Hello†-☃" == soup.p.string + + def test_entities_in_attributes_converted_to_unicode(self): + expect = '

      ' + self.assert_soup('

      ', expect) + self.assert_soup('

      ', expect) + self.assert_soup('

      ', expect) + self.assert_soup('

      ', expect) + + def test_entities_in_text_converted_to_unicode(self): + expect = '

      pi\N{LATIN SMALL LETTER N WITH TILDE}ata

      ' + self.assert_soup("

      piñata

      ", expect) + self.assert_soup("

      piñata

      ", expect) + self.assert_soup("

      piñata

      ", expect) + self.assert_soup("

      piñata

      ", expect) + + def test_quot_entity_converted_to_quotation_mark(self): + self.assert_soup("

      I said "good day!"

      ", + '

      I said "good day!"

      ') + + def test_out_of_range_entity(self): + expect = "\N{REPLACEMENT CHARACTER}" + self.assert_soup("�", expect) + self.assert_soup("�", expect) + self.assert_soup("�", expect) + + def test_multipart_strings(self): + "Mostly to prevent a recurrence of a bug in the html5lib treebuilder." + soup = self.soup("

      \nfoo

      ") + assert "p" == soup.h2.string.next_element.name + assert "p" == soup.p.name + self.assertConnectedness(soup) + + def test_empty_element_tags(self): + """Verify consistent handling of empty-element tags, + no matter how they come in through the markup. + """ + self.assert_soup('


      ', "


      ") + self.assert_soup('


      ', "


      ") + + def test_head_tag_between_head_and_body(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + foo + +""" + soup = self.soup(content) + assert soup.html.body is not None + self.assertConnectedness(soup) + + def test_multiple_copies_of_a_tag(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + + + + +""" + soup = self.soup(content) + self.assertConnectedness(soup.article) + + def test_basic_namespaces(self): + """Parsers don't need to *understand* namespaces, but at the + very least they should not choke on namespaces or lose + data.""" + + markup = b'4' + soup = self.soup(markup) + assert markup == soup.encode() + html = soup.html + assert 'http://www.w3.org/1999/xhtml' == soup.html['xmlns'] + assert 'http://www.w3.org/1998/Math/MathML' == soup.html['xmlns:mathml'] + assert 'http://www.w3.org/2000/svg' == soup.html['xmlns:svg'] + + def test_multivalued_attribute_value_becomes_list(self): + markup = b'' + soup = self.soup(markup) + assert ['foo', 'bar'] == soup.a['class'] + + # + # Generally speaking, tests below this point are more tests of + # Beautiful Soup than tests of the tree builders. But parsers are + # weird, so we run these tests separately for every tree builder + # to detect any differences between them. + # + + def test_can_parse_unicode_document(self): + # A seemingly innocuous document... but it's in Unicode! And + # it contains characters that can't be represented in the + # encoding found in the declaration! The horror! + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.body.string + + def test_soupstrainer(self): + """Parsers should be able to work with SoupStrainers.""" + strainer = SoupStrainer("b") + soup = self.soup("A bold statement", + parse_only=strainer) + assert soup.decode() == "bold" + + def test_single_quote_attribute_values_become_double_quotes(self): + self.assert_soup("", + '') + + def test_attribute_values_with_nested_quotes_are_left_alone(self): + text = """a""" + self.assert_soup(text) + + def test_attribute_values_with_double_nested_quotes_get_quoted(self): + text = """a""" + soup = self.soup(text) + soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"' + self.assert_soup( + soup.foo.decode(), + """a""") + + def test_ampersand_in_attribute_value_gets_escaped(self): + self.assert_soup('', + '') + + self.assert_soup( + 'foo', + 'foo') + + def test_escaped_ampersand_in_attribute_value_is_left_alone(self): + self.assert_soup('') + + def test_entities_in_strings_converted_during_parsing(self): + # Both XML and HTML entities are converted to Unicode characters + # during parsing. + text = "

      <<sacré bleu!>>

      " + expected = "

      <<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

      " + self.assert_soup(text, expected) + + def test_smart_quotes_converted_on_the_way_in(self): + # Microsoft smart quotes are converted to Unicode characters during + # parsing. + quote = b"

      \x91Foo\x92

      " + soup = self.soup(quote) + assert soup.p.string == "\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}" + + def test_non_breaking_spaces_converted_on_the_way_in(self): + soup = self.soup("  ") + assert soup.a.string == "\N{NO-BREAK SPACE}" * 2 + + def test_entities_converted_on_the_way_out(self): + text = "

      <<sacré bleu!>>

      " + expected = "

      <<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

      ".encode("utf-8") + soup = self.soup(text) + assert soup.p.encode("utf-8") == expected + + def test_real_iso_8859_document(self): + # Smoke test of interrelated functionality, using an + # easy-to-understand document. + + # Here it is in Unicode. Note that it claims to be in ISO-8859-1. + unicode_html = '

      Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!

      ' + + # That's because we're going to encode it into ISO-8859-1, + # and use that to test. + iso_latin_html = unicode_html.encode("iso-8859-1") + + # Parse the ISO-8859-1 HTML. + soup = self.soup(iso_latin_html) + + # Encode it to UTF-8. + result = soup.encode("utf-8") + + # What do we expect the result to look like? Well, it would + # look like unicode_html, except that the META tag would say + # UTF-8 instead of ISO-8859-1. + expected = unicode_html.replace("ISO-8859-1", "utf-8") + + # And, of course, it would be in UTF-8, not Unicode. + expected = expected.encode("utf-8") + + # Ta-da! + assert result == expected + + def test_real_shift_jis_document(self): + # Smoke test to make sure the parser can handle a document in + # Shift-JIS encoding, without choking. + shift_jis_html = ( + b'
      '
      +            b'\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
      +            b'\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
      +            b'\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B'
      +            b'
      ') + unicode_html = shift_jis_html.decode("shift-jis") + soup = self.soup(unicode_html) + + # Make sure the parse tree is correctly encoded to various + # encodings. + assert soup.encode("utf-8") == unicode_html.encode("utf-8") + assert soup.encode("euc_jp") == unicode_html.encode("euc_jp") + + def test_real_hebrew_document(self): + # A real-world test to make sure we can convert ISO-8859-9 (a + # Hebrew encoding) to UTF-8. + hebrew_document = b'Hebrew (ISO 8859-8) in Visual Directionality

      Hebrew (ISO 8859-8) in Visual Directionality

      \xed\xe5\xec\xf9' + soup = self.soup( + hebrew_document, from_encoding="iso8859-8") + # Some tree builders call it iso8859-8, others call it iso-8859-9. + # That's not a difference we really care about. + assert soup.original_encoding in ('iso8859-8', 'iso-8859-8') + assert soup.encode('utf-8') == ( + hebrew_document.decode("iso8859-8").encode("utf-8") + ) + + def test_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', {'http-equiv': 'Content-type'}) + content = parsed_meta['content'] + assert 'text/html; charset=x-sjis' == content + + # But that value is actually a ContentMetaAttributeValue object. + assert isinstance(content, ContentMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert 'text/html; charset=utf8' == content.encode("utf8") + + # For the rest of the story, see TestSubstitutions in + # test_tree.py. + + def test_html5_style_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', id="encoding") + charset = parsed_meta['charset'] + assert 'x-sjis' == charset + + # But that value is actually a CharsetMetaAttributeValue object. + assert isinstance(charset, CharsetMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert 'utf8' == charset.encode("utf8") + + def test_python_specific_encodings_not_used_in_charset(self): + # You can encode an HTML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. Instead, the document will appear to + # have no encoding. + for markup in [ + b'' + b'' + ]: + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'meta charset=""' in encoded + assert encoding.encode("ascii") not in encoded + + def test_tag_with_no_attributes_can_have_attributes_added(self): + data = self.soup("text") + data.a['foo'] = 'bar' + assert 'text' == data.a.decode() + + def test_closing_tag_with_no_opening_tag(self): + # Without BeautifulSoup.open_tag_counter, the tag will + # cause _popToTag to be called over and over again as we look + # for a tag that wasn't there. The result is that 'text2' + # will show up outside the body of the document. + soup = self.soup("

      text1

      text2
      ") + assert "

      text1

      text2
      " == soup.body.decode() + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class XMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + assert loaded.__class__ == BeautifulSoup + assert loaded.decode() == tree.decode() + + def test_docstring_generated(self): + soup = self.soup("") + assert soup.encode() == b'\n' + + def test_xml_declaration(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_python_specific_encodings_not_used_in_xml_declaration(self): + # You can encode an XML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. + markup = b"""\n""" + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'' in encoded + assert encoding.encode("ascii") not in encoded + + def test_processing_instruction(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_real_xhtml_document(self): + """A real XHTML document should come out *exactly* the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_nested_namespaces(self): + doc = b""" + + + + + +""" + soup = self.soup(doc) + assert doc == soup.encode() + + def test_formatter_processes_script_tag_for_xml_documents(self): + doc = """ + +""" + soup = BeautifulSoup(doc, "lxml-xml") + # lxml would have stripped this while parsing, but we can add + # it later. + soup.script.string = 'console.log("< < hey > > ");' + encoded = soup.encode() + assert b"< < hey > >" in encoded + + def test_can_parse_unicode_document(self): + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.root.string + + def test_can_parse_unicode_document_begining_with_bom(self): + markup = '\N{BYTE ORDER MARK}Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.root.string + + def test_popping_namespaced_tag(self): + markup = 'b2012-07-02T20:33:42Zcd' + soup = self.soup(markup) + assert str(soup.rss) == markup + + def test_docstring_includes_correct_encoding(self): + soup = self.soup("") + assert soup.encode("latin1") == b'\n' + + def test_large_xml_document(self): + """A large XML document should come out the same as it went in.""" + markup = (b'\n' + + b'0' * (2**12) + + b'') + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_tags_are_empty_element_if_and_only_if_they_are_empty(self): + self.assert_soup("

      ", "

      ") + self.assert_soup("

      foo

      ") + + def test_namespaces_are_preserved(self): + markup = 'This tag is in the a namespaceThis tag is in the b namespace' + soup = self.soup(markup) + root = soup.root + assert "http://example.com/" == root['xmlns:a'] + assert "http://example.net/" == root['xmlns:b'] + + def test_closing_namespaced_tag(self): + markup = '

      20010504

      ' + soup = self.soup(markup) + assert str(soup.p) == markup + + def test_namespaced_attributes(self): + markup = '' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_namespaced_attributes_xml_namespace(self): + markup = 'bar' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_find_by_prefixed_name(self): + doc = """ +foo + bar + baz + +""" + soup = self.soup(doc) + + # There are three tags. + assert 3 == len(soup.find_all('tag')) + + # But two of them are ns1:tag and one of them is ns2:tag. + assert 2 == len(soup.find_all('ns1:tag')) + assert 1 == len(soup.find_all('ns2:tag')) + + assert 1, len(soup.find_all('ns2:tag', key='value')) + assert 3, len(soup.find_all(['ns1:tag', 'ns2:tag'])) + + def test_copy_tag_preserves_namespace(self): + xml = """ +""" + + soup = self.soup(xml) + tag = soup.document + duplicate = copy.copy(tag) + + # The two tags have the same namespace prefix. + assert tag.prefix == duplicate.prefix + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest): + """Smoke test for a tree builder that supports HTML5.""" + + def test_real_xhtml_document(self): + # Since XHTML is not HTML5, HTML5 parsers are not tested to handle + # XHTML documents in any particular way. + pass + + def test_html_tags_have_namespace(self): + markup = "" + soup = self.soup(markup) + assert "http://www.w3.org/1999/xhtml" == soup.a.namespace + + def test_svg_tags_have_namespace(self): + markup = '' + soup = self.soup(markup) + namespace = "http://www.w3.org/2000/svg" + assert namespace == soup.svg.namespace + assert namespace == soup.circle.namespace + + + def test_mathml_tags_have_namespace(self): + markup = '5' + soup = self.soup(markup) + namespace = 'http://www.w3.org/1998/Math/MathML' + assert namespace == soup.math.namespace + assert namespace == soup.msqrt.namespace + + def test_xml_declaration_becomes_comment(self): + markup = '' + soup = self.soup(markup) + assert isinstance(soup.contents[0], Comment) + assert soup.contents[0] == '?xml version="1.0" encoding="utf-8"?' + assert "html" == soup.contents[0].next_element.name diff --git a/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase b/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase new file mode 100644 index 0000000..b34be8b --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase @@ -0,0 +1 @@ +ÿ

      \ No newline at end of file diff --git a/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase b/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase new file mode 100644 index 0000000000000000000000000000000000000000..0fe66dd23fe94a8e451dfb1a84da38ed0984c1f9 GIT binary patch literal 19469 zcmeHP%}&BV5UwW1c<}1c&|0d-m{hN9YYZMVF=z-E6E3Azz?Aa07`*ugp1gb37w}np z1J6Ey_J;^Y+hVrDb~+?vcLObSXLo15`M%w!71Cc4g4b8Y>@_=7*S$g~EsGkt2Bn={ zt2=1kXi~B5P|KmamD`Rb<;p=_zIm%4C&qy-Vu088oOsuGz>Kq!-D0_0%~Ls_F?gfesF!B~xlP=*UCbCH?n*-O%0 z!Q*F>?46hl=N3}p9^s$pfQ;#K?C}VRg&?#Cu4Gl`M+NhN`Lsc{A^94o$;0t3y>S870B{5&zz9DFt<}-BMx(8V;~9 zu^`3{e->4K<9oQkG(Mym>pheEPdQ^GK5fr%nc+{ydd)pa{!emW8I*DurdQ@~y8Kk4 zgV7-WU60=nl>ER&`8c&A8JzU^4}@gt+g^h^gT@rwKLtV<2l@NX63OYId;^?(0~P60 z?9W6QN1A0E6WR+_CBVe3&|S@XJ2R{CP{xr=dJz@rVH;L3n4Q9zrUy|Y_Y}rG!O4js mqyYzMPzM!p)C@wIG(#Cwq{BE*384&|DuI`yvfSgo2>k@d3|T1v literal 0 HcmV?d00001 diff --git a/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase b/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase new file mode 100644 index 0000000..367106c --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase @@ -0,0 +1,2 @@ + +' + "clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896", + + # b'ñ' + "clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224", + + #
      , some ^@ characters, some tags. + "clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744", + + # Nested table + "crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08" + ] + ) + def test_html5lib_parse_errors(self, filename): + markup = self.__markup(filename) + print(BeautifulSoup(markup, 'html5lib').encode()) + + def __markup(self, filename): + if not filename.endswith(self.TESTCASE_SUFFIX): + filename += self.TESTCASE_SUFFIX + this_dir = os.path.split(__file__)[0] + path = os.path.join(this_dir, 'fuzz', filename) + return open(path, 'rb').read() diff --git a/python/lib/python3.11/site-packages/bs4/tests/test_html5lib.py b/python/lib/python3.11/site-packages/bs4/tests/test_html5lib.py new file mode 100644 index 0000000..4197720 --- /dev/null +++ b/python/lib/python3.11/site-packages/bs4/tests/test_html5lib.py @@ -0,0 +1,224 @@ +"""Tests to ensure that the html5lib tree builder generates good trees.""" + +import pytest +import warnings + +from bs4 import BeautifulSoup +from bs4.element import SoupStrainer +from . import ( + HTML5LIB_PRESENT, + HTML5TreeBuilderSmokeTest, + SoupTest, +) + +@pytest.mark.skipif( + not HTML5LIB_PRESENT, + reason="html5lib seems not to be present, not testing its tree builder." +) +class TestHTML5LibBuilder(SoupTest, HTML5TreeBuilderSmokeTest): + """See ``HTML5TreeBuilderSmokeTest``.""" + + @property + def default_builder(self): + from bs4.builder import HTML5TreeBuilder + return HTML5TreeBuilder + + def test_soupstrainer(self): + # The html5lib tree builder does not support SoupStrainers. + strainer = SoupStrainer("b") + markup = "

      A bold statement.

      " + with warnings.catch_warnings(record=True) as w: + soup = BeautifulSoup(markup, "html5lib", parse_only=strainer) + assert soup.decode() == self.document_for(markup) + + [warning] = w + assert warning.filename == __file__ + assert "the html5lib tree builder doesn't support parse_only" in str(warning.message) + + def test_correctly_nested_tables(self): + """html5lib inserts tags where other parsers don't.""" + markup = ('
      ' + '' + "') + + self.assert_soup( + markup, + '
      Here's another table:" + '' + '' + '
      foo
      Here\'s another table:' + '
      foo
      ' + '
      ') + + self.assert_soup( + "" + "" + "
      Foo
      Bar
      Baz
      ") + + def test_xml_declaration_followed_by_doctype(self): + markup = ''' + + + + + +

      foo

      + +''' + soup = self.soup(markup) + # Verify that we can reach the

      tag; this means the tree is connected. + assert b"

      foo

      " == soup.p.encode() + + def test_reparented_markup(self): + markup = '

      foo

      \n

      bar

      ' + soup = self.soup(markup) + assert "

      foo

      \n

      bar

      " == soup.body.decode() + assert 2 == len(soup.find_all('p')) + + + def test_reparented_markup_ends_with_whitespace(self): + markup = '

      foo

      \n

      bar

      \n' + soup = self.soup(markup) + assert "

      foo

      \n

      bar

      \n" == soup.body.decode() + assert 2 == len(soup.find_all('p')) + + def test_reparented_markup_containing_identical_whitespace_nodes(self): + """Verify that we keep the two whitespace nodes in this + document distinct when reparenting the adjacent tags. + """ + markup = '
      ' + soup = self.soup(markup) + space1, space2 = soup.find_all(string=' ') + tbody1, tbody2 = soup.find_all('tbody') + assert space1.next_element is tbody1 + assert tbody2.next_element is space2 + + def test_reparented_markup_containing_children(self): + markup = '' + soup = self.soup(markup) + noscript = soup.noscript + assert "target" == noscript.next_element + target = soup.find(string='target') + + # The 'aftermath' string was duplicated; we want the second one. + final_aftermath = soup.find_all(string='aftermath')[-1] + + # The

      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%0Dm@T-FcS~Or)cOuu&MtZNsacF}?Cf}|4 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

  • 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 z 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